JSPM

@hono/capnweb

0.1.0
  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 165
  • Score
    100M100P100Q97442F
  • License MIT

Cap'n Web Adapter for Hono

Package Exports

  • @hono/capnweb

Readme

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