UNPKG

@orpc/client

Version:

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

88 lines (83 loc) 2.91 kB
import { value, isObject } from '@orpc/shared'; import { experimental_ClientPeerWithoutCodec, serializeRequestMessage, encodeRequestMessage, deserializeResponseMessage, decodeResponseMessage } from '@orpc/standard-server-peer'; import { c as StandardRPCLink } from '../../shared/client.CRfRve1v.mjs'; import '@orpc/standard-server'; import '../../shared/client.BwSYEMrK.mjs'; import '@orpc/standard-server-fetch'; import '../../shared/client.BLtwTQUg.mjs'; function postMessagePortMessage(port, data, transfer) { if (transfer) { port.postMessage(data, transfer); } else { port.postMessage(data); } } function onMessagePortMessage(port, callback) { if ("addEventListener" in port) { port.addEventListener("message", (event) => { callback(event.data); }); } else if ("on" in port) { port.on("message", (event) => { callback(event?.data); }); } else if ("onMessage" in port) { port.onMessage.addListener((data) => { callback(data); }); } else { throw new Error("Cannot find a addEventListener/on/onMessage method on the port"); } } function onMessagePortClose(port, callback) { if ("addEventListener" in port) { port.addEventListener("close", async () => { callback(); }); } else if ("on" in port) { port.on("close", async () => { callback(); }); } else if ("onDisconnect" in port) { port.onDisconnect.addListener(() => { callback(); }); } else { throw new Error("Cannot find a addEventListener/on/onDisconnect method on the port"); } } class LinkMessagePortClient { peer; constructor(options) { this.peer = new experimental_ClientPeerWithoutCodec(async (message) => { const [id, type, payload] = message; const transfer = await value(options.experimental_transfer, message, options.port); if (transfer) { postMessagePortMessage(options.port, serializeRequestMessage(id, type, payload), transfer); } else { postMessagePortMessage(options.port, await encodeRequestMessage(id, type, payload)); } }); onMessagePortMessage(options.port, async (message) => { if (isObject(message)) { await this.peer.message(deserializeResponseMessage(message)); } else { await this.peer.message(await decodeResponseMessage(message)); } }); onMessagePortClose(options.port, () => { this.peer.close(); }); } async call(request, _options, _path, _input) { const response = await this.peer.request(request); return { ...response, body: () => Promise.resolve(response.body) }; } } class RPCLink extends StandardRPCLink { constructor(options) { const linkClient = new LinkMessagePortClient(options); super(linkClient, { ...options, url: "http://orpc" }); } } export { LinkMessagePortClient, RPCLink, onMessagePortClose, onMessagePortMessage, postMessagePortMessage };