@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
JavaScript
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 };