UNPKG

@orpc/server

Version:

<div align="center"> <image align="center" src="https://orpc.unnoq.com/logo.webp" width=280 alt="oRPC logo" /> </div>

68 lines (64 loc) 2.09 kB
import { readAsBuffer, resolveMaybeOptionalOptions } from '@orpc/shared'; import { ServerPeer } from '@orpc/standard-server-peer'; import { c as createServerPeerHandleRequestFn } from '../../shared/server.UVMTOWrk.mjs'; import '@orpc/client'; import '@orpc/standard-server'; import '@orpc/contract'; import { b as StandardRPCHandler } from '../../shared/server.CYRYFTxo.mjs'; import '@orpc/client/standard'; import '../../shared/server.DZ5BIITo.mjs'; import '../../shared/server.B_fj3X5m.mjs'; class WebsocketHandler { #peers = /* @__PURE__ */ new WeakMap(); #handler; constructor(standardHandler) { this.#handler = standardHandler; } /** * Upgrades a WebSocket to enable handling * * This attaches the necessary 'message' and 'close' listeners to the WebSocket * * @warning Do not use this method if you're using `.message()` or `.close()` */ upgrade(ws, ...rest) { ws.addEventListener("message", (event) => this.message(ws, event.data, ...rest)); ws.addEventListener("close", () => this.close(ws)); } /** * Handles a single message received from a WebSocket. * * @warning Avoid calling this directly if `.upgrade()` is used. * * @param ws The WebSocket instance * @param data The message payload, usually place in `event.data` */ async message(ws, data, ...rest) { let peer = this.#peers.get(ws); if (!peer) { this.#peers.set(ws, peer = new ServerPeer(ws.send.bind(ws))); } const message = data instanceof Blob ? await readAsBuffer(data) : data; await peer.message( message, createServerPeerHandleRequestFn(this.#handler, resolveMaybeOptionalOptions(rest)) ); } /** * Closes the WebSocket peer and cleans up. * * @warning Avoid calling this directly if `.upgrade()` is used. */ close(ws) { const peer = this.#peers.get(ws); if (peer) { peer.close(); } } } class RPCHandler extends WebsocketHandler { constructor(router, options = {}) { super(new StandardRPCHandler(router, options)); } } export { RPCHandler, WebsocketHandler };