Skip to content

Latest commit

 

History

History

README.md

Cap'n Web Adapter for Hono

codecov

Cap'n Web Adapter Middleware for Hono. Enables RPC over WebSocket and HTTP with Cap'n Web.

Installation

npm install @hono/capnweb capnweb hono

Usage

Define your RPC API

import { RpcTarget } from 'capnweb'

export interface PublicApi {
  hello(name: string): string
}

export class MyApiServer extends RpcTarget implements PublicApi {
  hello(name: string) {
    return `Hello, ${name}!`
  }
}

Cloudflare Workers

import { Hono } from 'hono'
import { upgradeWebSocket } from 'hono/cloudflare-workers'
import { newRpcResponse } from '@hono/capnweb'
import { MyApiServer } from './my-api-server'

const app = new Hono()

app.all('/api', (c) => {
  return newRpcResponse(c, new MyApiServer(), {
    upgradeWebSocket,
  })
})

export default app

Node.js

import { serve } from '@hono/node-server'
import { createNodeWebSocket } from '@hono/node-ws'
import { Hono } from 'hono'
import { newRpcResponse } from '@hono/capnweb'
import { MyApiServer } from './my-api-server'

const app = new Hono()

const { injectWebSocket, upgradeWebSocket } = createNodeWebSocket({ app })

app.all('/api', (c) => {
  return newRpcResponse(c, new MyApiServer(), {
    upgradeWebSocket,
  })
})

const server = serve({
  port: 8787,
  fetch: app.fetch,
})

injectWebSocket(server)

Deno

import { Hono } from 'hono'
import { upgradeWebSocket } from 'hono/deno'
import { newRpcResponse } from '@hono/capnweb'
import { MyApiServer } from './my-api-server.ts'

const app = new Hono()

app.all('/api', (c) => {
  return newRpcResponse(c, new MyApiServer(), {
    upgradeWebSocket,
  })
})

export default app

Bun

import { Hono } from 'hono'
import { upgradeWebSocket, websocket } from 'hono/bun'
import { newRpcResponse } from '@hono/capnweb'
import { MyApiServer } from './my-api-server'

const app = new Hono()

app.all('/api', (c) => {
  return newRpcResponse(c, new MyApiServer(), {
    upgradeWebSocket,
  })
})

export default {
  fetch: app.fetch,
  port: 8787,
  websocket,
}

Client

WebSocket RPC

import { newWebSocketRpcSession } from 'capnweb'
import type { PublicApi } from './my-api-server'

using stub = newWebSocketRpcSession<PublicApi>('ws://localhost:8787/api')

console.log(await stub.hello("Cap'n Web"))

HTTP Batch RPC

import { newHttpBatchRpcSession } from 'capnweb'
import type { PublicApi } from './my-api-server'

const stub = newHttpBatchRpcSession<PublicApi>('http://localhost:8787/api')

console.log(await stub.hello("Cap'n Web"))

Author

Yusuke Wada https://github.com/yusukebe

License

MIT