UNPKG

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