@orpc/server
Version:
<div align="center"> <image align="center" src="https://orpc.unnoq.com/logo.webp" width=280 alt="oRPC logo" /> </div>
66 lines (62 loc) • 2.18 kB
JavaScript
import { toORPCError } from '@orpc/client';
import { StandardRPCJsonSerializer } from '@orpc/client/standard';
import { stringifyJSON } from '@orpc/shared';
import { getEventMeta, HibernationEventIterator } from '@orpc/standard-server';
export { HibernationEventIterator } from '@orpc/standard-server';
import { MessageType } from '@orpc/standard-server-peer';
function encodeHibernationRPCEvent(id, payload, options = {}) {
const { event = "message", ...rest } = options;
const serializer = new StandardRPCJsonSerializer(rest);
const data = event === "error" ? toORPCError(payload).toJSON() : payload;
const [json, meta] = serializer.serialize(data);
return stringifyJSON({
i: id,
t: MessageType.EVENT_ITERATOR,
p: {
e: event,
d: { json, meta: meta.length > 0 ? meta : void 0 },
m: getEventMeta(payload)
}
});
}
class HibernationPlugin {
CONTEXT_SYMBOL = Symbol("ORPC_HIBERNATION_CONTEXT");
order = 2e6;
// make sure execute after the batch plugin
init(options, _router) {
options.interceptors ??= [];
options.clientInterceptors ??= [];
options.interceptors.unshift(async (options2) => {
const hibernationContext = {};
const result = await options2.next({
...options2,
context: {
...options2.context,
[this.CONTEXT_SYMBOL]: hibernationContext
}
});
if (!result.matched || !hibernationContext.iterator) {
return result;
}
return {
...result,
response: {
...result.response,
body: hibernationContext.iterator
}
};
});
options.clientInterceptors.unshift(async (options2) => {
const hibernationContext = options2.context[this.CONTEXT_SYMBOL];
if (!hibernationContext) {
throw new TypeError("[HibernationPlugin] Hibernation context has been corrupted or modified by another plugin or interceptor");
}
const output = await options2.next();
if (output instanceof HibernationEventIterator) {
hibernationContext.iterator = output;
}
return output;
});
}
}
export { HibernationPlugin, encodeHibernationRPCEvent };