@orpc/server
Version:
<div align="center"> <image align="center" src="https://orpc.dev/logo.webp" width=280 alt="oRPC logo" /> </div>
56 lines (52 loc) • 2.06 kB
JavaScript
import { postMessagePortMessage, onMessagePortMessage, onMessagePortClose } from '@orpc/client/message-port';
import { value, resolveMaybeOptionalOptions, isObject } from '@orpc/shared';
import { experimental_ServerPeerWithoutCodec, serializeResponseMessage, encodeResponseMessage, deserializeRequestMessage, decodeRequestMessage } 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.Bxx6tqNe.mjs';
import '@orpc/client/standard';
import '../../shared/server.DZ5BIITo.mjs';
import '../../shared/server.Ds4HPpvH.mjs';
class MessagePortHandler {
constructor(standardHandler, options = {}) {
this.standardHandler = standardHandler;
this.transfer = options.experimental_transfer;
}
transfer;
upgrade(port, ...rest) {
const peer = new experimental_ServerPeerWithoutCodec(async (message) => {
const [id, type, payload] = message;
const transfer = await value(this.transfer, message, port);
if (transfer) {
postMessagePortMessage(port, serializeResponseMessage(id, type, payload), transfer);
} else {
postMessagePortMessage(port, await encodeResponseMessage(id, type, payload));
}
});
onMessagePortMessage(port, async (message) => {
const handleFn = createServerPeerHandleRequestFn(this.standardHandler, resolveMaybeOptionalOptions(rest));
if (isObject(message)) {
await peer.message(
deserializeRequestMessage(message),
handleFn
);
} else {
await peer.message(
await decodeRequestMessage(message),
handleFn
);
}
});
onMessagePortClose(port, () => {
peer.close();
});
}
}
class RPCHandler extends MessagePortHandler {
constructor(router, options = {}) {
super(new StandardRPCHandler(router, options), options);
}
}
export { MessagePortHandler, RPCHandler };