@nocobase/app-websocket は、ホストとアプリが共有するソケットのインターフェースを定義し、Node の HTTP Server のアップグレードに合わせます。ページの更新には リアルタイムのトピック を優先してください。この層は、ホストや別のプロトコルを実装するときに使います。
役割
| 層 | 役割 |
|---|---|
| WebSocket のアダプター | HTTP のアップグレード、接続のライフサイクル、メッセージの制限、ネイティブの ping/pong |
| リアルタイムのプロトコル | トピックの購読、確認応答、身元とリソースの認可、配信、購読の復旧 |
Node のアダプターは ws を noServer モードで使うため、既存の HTTP サーバーがアップグレードを受け入れるかどうかを決めます。AppWebSocketHandler は Request を受け取り、イベントのハンドラー、拒否の Response、またはリクエストを扱わない場合は空の結果を返します。
接続のインターフェース
AppWebSocket は、url、protocol、readyState、任意の bufferedAmount、send() と close() を公開します。ハンドラーは onOpen、onMessage、onClose、onError を実装し、メッセージは文字列または ArrayBuffer の値です。
ホストは isWebSocketUpgrade() でアップグレードを識別し、createWebSocketUpgradeRequest() でリクエストを変換してから、acceptWebSocketUpgrade() または rejectWebSocketUpgrade() を呼び出します。通常のアプリやプラグインに、別の WebSocket サーバーは必要ありません。
パスとプロキシ
リアルタイムはアプリ内で /ws を使います。外部のパスにはマウントの接頭辞が含まれることがあります。デプロイの接頭辞をハードコードせず、ホストの URL の解決を使ってください。このパスへの通常の HTTP リクエストは、アップグレードが必要であることを示すレスポンスを返します。
リバースプロキシは、アップグレードを転送し、正しい外部のホストとプロトコルを保ち、十分なアイドル時間を許可する必要があります。アプリのアダプターは、オリジンをまたぐブラウザーの接続を拒否します。そのため、オリジンやプロトコルの書き換えが誤っていると、ハンドシェイクが拒否されることがあります。
身元と後片付け
アプリのアダプターは、ハンドシェイク時に身元を解決し、その後の活動とアイドルのチェックでセッションの有効性を再確認します。URL 内のユーザー ID は認証ではありません。独自のアダプターでは、オリジンのチェック、認証、メッセージの制限、ハートビートを自分で担います。
接続が閉じたときやエラーのときは購読とリスナーを解放し、終了時には接続を終わらせます。遅いクライアントのために出力が際限なく溜まらないよう、出力のバッファーに上限を設けてください。ソケットが接続されても確立するのはトランスポートだけで、トピックの認可とメッセージの検証は引き続きプロトコルの責任です。