Hono v4.1.0 で broadcast するための試行

Hono v4.1.0 がリリースされ、WebSocket helper が追加された


このPRを以前から追っており、手元の創作アプリに実装を持ってきながら使っていたので非常に嬉しい

一方で、昨日ぶつかったこともあり、それがどうにも悔しかったので出社前にあれこれイジっていたら一応動きはした。


現状のヘルパーでは Bun WebSocket が提供する Pub/Sub の利用が難しそうな雰囲気だった。接続した WebSocket 全てにメッセージを送信する (broadcast) ユースケースを想定している。

エッジで Hono を動かしている場合などでは、裏側にRedisなどを建ててそのレイヤーで Pub/Sub するだろうから、現状ブロードキャスト自体が不可能というわけではないと思う。


私の創作アプリでは単独の Hono サーバーを立ち上げて永続化層も持たない雑なチャットアプリを作りたいので、今のところ Bun WebSocket Pub/Sub を利用したい。そのためには Bun.serve() の返値と ws.subscribe() へのアクセスが必要になる


Hono helper を一部使いつつ、Pub/Sub が動くようになったのは以下のコード。公式ドキュメントのままだが。なおRPC機能はまだ試せていないので今夜やってみる

const server = Bun.serve({
  port,
  fetch: app.fetch,
  websocket: {
    open: (ws: ServerWebSocket) => {
      ws.subscribe("robby");
      console.log("WebSocket is connected.");
    },
    message: (
      ws: ServerWebSocket,
      message: string | ArrayBuffer | Uint8Array,
    ) => {
      server.publish(
        "robby",
        JSON.stringify({
          id: "server",
          content: message,
          user: { id: "server" },
        }),
      );
    },
    close: (ws: ServerWebSocket) => {
      ws.unsubscribe("robby");
      console.log("WebSocket is closed.");
    },
  },
});

https://github.com/yoshikouki/engineer-bar/blob/ff2e7a45ba8e05463ca53c179cad6bb656d0c762/src/index.tsx#L80-L106


Bun.serve する方法しか分からず、export default {} ができなくなった。ちょっと悲しい

いいなと思ったら応援しよう!