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