@trpc/server
Version:
1 lines • 128 kB
Source Map (JSON)
{"version":3,"file":"resolveResponse-JtMyT9TQ.mjs","names":["isObject","isObject","isObject","isObject","msg","isObject"],"sources":["../src/unstable-core-do-not-import/http/parseConnectionParams.ts","../src/unstable-core-do-not-import/http/contentType.ts","../src/unstable-core-do-not-import/http/abortError.ts","../src/vendor/is-plain-object.ts","../src/vendor/unpromise/unpromise.ts","../src/unstable-core-do-not-import/stream/utils/disposable.ts","../src/unstable-core-do-not-import/stream/utils/timerResource.ts","../src/unstable-core-do-not-import/stream/utils/asyncIterable.ts","../src/unstable-core-do-not-import/stream/utils/createDeferred.ts","../src/unstable-core-do-not-import/stream/utils/mergeAsyncIterables.ts","../src/unstable-core-do-not-import/stream/utils/readableStreamFrom.ts","../src/unstable-core-do-not-import/stream/utils/withPing.ts","../src/unstable-core-do-not-import/stream/jsonl.ts","../src/unstable-core-do-not-import/stream/sse.ts","../src/unstable-core-do-not-import/http/resolveResponse.ts"],"sourcesContent":["import { TRPCError } from '../error/TRPCError';\nimport { isObject } from '../utils';\nimport type { TRPCRequestInfo } from './types';\n\nexport function parseConnectionParamsFromUnknown(\n parsed: unknown,\n): TRPCRequestInfo['connectionParams'] {\n try {\n if (parsed === null) {\n return null;\n }\n if (!isObject(parsed)) {\n throw new Error('Expected object');\n }\n const nonStringValues = Object.entries(parsed).filter(\n ([_key, value]) => typeof value !== 'string',\n );\n\n if (nonStringValues.length > 0) {\n throw new Error(\n `Expected connectionParams to be string values. Got ${nonStringValues\n .map(([key, value]) => `${key}: ${typeof value}`)\n .join(', ')}`,\n );\n }\n return parsed as Record<string, string>;\n } catch (cause) {\n throw new TRPCError({\n code: 'PARSE_ERROR',\n message: 'Invalid connection params shape',\n cause,\n });\n }\n}\nexport function parseConnectionParamsFromString(\n str: string,\n): TRPCRequestInfo['connectionParams'] {\n let parsed: unknown;\n try {\n parsed = JSON.parse(str);\n } catch (cause) {\n throw new TRPCError({\n code: 'PARSE_ERROR',\n message: 'Not JSON-parsable query params',\n cause,\n });\n }\n return parseConnectionParamsFromUnknown(parsed);\n}\n","import { TRPCError } from '../error/TRPCError';\nimport type { ProcedureType } from '../procedure';\nimport { getProcedureAtPath, type AnyRouter } from '../router';\nimport { emptyObject, isObject } from '../utils';\nimport { parseConnectionParamsFromString } from './parseConnectionParams';\nimport type { TRPCAcceptHeader, TRPCRequestInfo } from './types';\n\nexport function getAcceptHeader(headers: Headers): TRPCAcceptHeader | null {\n return (\n (headers.get('trpc-accept') as TRPCAcceptHeader | null) ??\n (headers\n .get('accept')\n ?.split(',')\n .some((t) => t.trim() === 'application/jsonl')\n ? 'application/jsonl'\n : null)\n );\n}\n\ntype GetRequestInfoOptions = {\n path: string;\n req: Request;\n url: URL | null;\n searchParams: URLSearchParams;\n headers: Headers;\n router: AnyRouter;\n maxBatchSize?: number;\n};\n\ntype ContentTypeHandler = {\n isMatch: (opts: Request) => boolean;\n parse: (opts: GetRequestInfoOptions) => Promise<TRPCRequestInfo>;\n};\n\n/**\n * Memoize a function that takes no arguments\n * @internal\n */\nfunction memo<TReturn>(fn: () => Promise<TReturn>) {\n let promise: Promise<TReturn> | null = null;\n const sym = Symbol.for('@trpc/server/http/memo');\n let value: TReturn | typeof sym = sym;\n return {\n /**\n * Lazily read the value\n */\n read: async (): Promise<TReturn> => {\n if (value !== sym) {\n return value;\n }\n\n // dedupes promises and catches errors\n promise ??= fn().catch((cause) => {\n if (cause instanceof TRPCError) {\n throw cause;\n }\n throw new TRPCError({\n code: 'BAD_REQUEST',\n message: cause instanceof Error ? cause.message : 'Invalid input',\n cause,\n });\n });\n\n value = await promise;\n promise = null;\n\n return value;\n },\n /**\n * Get an already stored result\n */\n result: (): TReturn | undefined => {\n return value !== sym ? value : undefined;\n },\n };\n}\n\nconst jsonContentTypeHandler: ContentTypeHandler = {\n isMatch(req) {\n return !!req.headers.get('content-type')?.startsWith('application/json');\n },\n async parse(opts) {\n const { req } = opts;\n const isBatchCall = opts.searchParams.get('batch') === '1';\n const maxBatchSize = opts.maxBatchSize;\n\n const paths = isBatchCall ? opts.path.split(',') : [opts.path];\n if (\n isBatchCall &&\n typeof maxBatchSize === 'number' &&\n paths.length > maxBatchSize\n ) {\n throw new TRPCError({\n code: 'BAD_REQUEST',\n message: `Batch call exceeds maximum size`,\n });\n }\n\n type InputRecord = Record<number, unknown>;\n const getInputs = memo(async (): Promise<InputRecord> => {\n let inputs: unknown = undefined;\n if (req.method === 'GET') {\n const queryInput = opts.searchParams.get('input');\n if (queryInput) {\n inputs = JSON.parse(queryInput);\n }\n } else {\n inputs = await req.json();\n }\n if (inputs === undefined) {\n return emptyObject();\n }\n\n if (!isBatchCall) {\n const result: InputRecord = emptyObject();\n result[0] =\n opts.router._def._config.transformer.input.deserialize(inputs);\n return result;\n }\n\n if (!isObject(inputs)) {\n throw new TRPCError({\n code: 'BAD_REQUEST',\n message: '\"input\" needs to be an object when doing a batch call',\n });\n }\n const acc: InputRecord = emptyObject();\n for (const index of paths.keys()) {\n const input = inputs[index];\n if (input !== undefined) {\n acc[index] =\n opts.router._def._config.transformer.input.deserialize(input);\n }\n }\n\n return acc;\n });\n\n const calls = await Promise.all(\n paths.map(\n async (path, index): Promise<TRPCRequestInfo['calls'][number]> => {\n const procedure = await getProcedureAtPath(opts.router, path);\n return {\n batchIndex: index,\n path,\n procedure,\n getRawInput: async () => {\n const inputs = await getInputs.read();\n let input = inputs[index];\n\n if (procedure?._def.type === 'subscription') {\n const lastEventId =\n opts.headers.get('last-event-id') ??\n opts.searchParams.get('lastEventId') ??\n opts.searchParams.get('Last-Event-Id');\n\n if (lastEventId) {\n if (isObject(input)) {\n input = {\n ...input,\n lastEventId: lastEventId,\n };\n } else {\n input ??= {\n lastEventId: lastEventId,\n };\n }\n }\n }\n return input;\n },\n result: () => {\n return getInputs.result()?.[index];\n },\n };\n },\n ),\n );\n\n const types = new Set(\n calls.map((call) => call.procedure?._def.type).filter(Boolean),\n );\n\n /* istanbul ignore if -- @preserve */\n if (types.size > 1) {\n throw new TRPCError({\n code: 'BAD_REQUEST',\n message: `Cannot mix procedure types in call: ${Array.from(types).join(\n ', ',\n )}`,\n });\n }\n const type: ProcedureType | 'unknown' =\n types.values().next().value ?? 'unknown';\n\n const connectionParamsStr = opts.searchParams.get('connectionParams');\n\n const info: TRPCRequestInfo = {\n isBatchCall,\n accept: getAcceptHeader(req.headers),\n calls,\n type,\n connectionParams:\n connectionParamsStr === null\n ? null\n : parseConnectionParamsFromString(connectionParamsStr),\n signal: req.signal,\n url: opts.url,\n };\n return info;\n },\n};\n\nconst formDataContentTypeHandler: ContentTypeHandler = {\n isMatch(req) {\n return !!req.headers.get('content-type')?.startsWith('multipart/form-data');\n },\n async parse(opts) {\n const { req } = opts;\n if (req.method !== 'POST') {\n throw new TRPCError({\n code: 'METHOD_NOT_SUPPORTED',\n message:\n 'Only POST requests are supported for multipart/form-data requests',\n });\n }\n const getInputs = memo(async () => {\n const fd = await req.formData();\n return fd;\n });\n const procedure = await getProcedureAtPath(opts.router, opts.path);\n return {\n accept: null,\n calls: [\n {\n batchIndex: 0,\n path: opts.path,\n getRawInput: getInputs.read,\n result: getInputs.result,\n procedure,\n },\n ],\n isBatchCall: false,\n type: 'mutation',\n connectionParams: null,\n signal: req.signal,\n url: opts.url,\n };\n },\n};\n\nconst octetStreamContentTypeHandler: ContentTypeHandler = {\n isMatch(req) {\n return !!req.headers\n .get('content-type')\n ?.startsWith('application/octet-stream');\n },\n async parse(opts) {\n const { req } = opts;\n if (req.method !== 'POST') {\n throw new TRPCError({\n code: 'METHOD_NOT_SUPPORTED',\n message:\n 'Only POST requests are supported for application/octet-stream requests',\n });\n }\n const getInputs = memo(async () => {\n return req.body;\n });\n return {\n calls: [\n {\n batchIndex: 0,\n path: opts.path,\n getRawInput: getInputs.read,\n result: getInputs.result,\n procedure: await getProcedureAtPath(opts.router, opts.path),\n },\n ],\n isBatchCall: false,\n accept: null,\n type: 'mutation',\n connectionParams: null,\n signal: req.signal,\n url: opts.url,\n };\n },\n};\n\nconst handlers = [\n jsonContentTypeHandler,\n formDataContentTypeHandler,\n octetStreamContentTypeHandler,\n];\n\nfunction getContentTypeHandler(req: Request): ContentTypeHandler {\n const handler = handlers.find((handler) => handler.isMatch(req));\n if (handler) {\n return handler;\n }\n\n if (!handler && req.method === 'GET') {\n // fallback to JSON for get requests so GET-requests can be opened in browser easily\n return jsonContentTypeHandler;\n }\n\n throw new TRPCError({\n code: 'UNSUPPORTED_MEDIA_TYPE',\n message: req.headers.has('content-type')\n ? `Unsupported content-type \"${req.headers.get('content-type')}`\n : 'Missing content-type header',\n });\n}\n\nexport async function getRequestInfo(\n opts: GetRequestInfoOptions,\n): Promise<TRPCRequestInfo> {\n const handler = getContentTypeHandler(opts.req);\n return await handler.parse(opts);\n}\n","import { isObject } from '../utils';\n\nexport function isAbortError(\n error: unknown,\n): error is DOMException | Error | { name: 'AbortError' } {\n return isObject(error) && error['name'] === 'AbortError';\n}\n\nexport function throwAbortError(message = 'AbortError'): never {\n throw new DOMException(message, 'AbortError');\n}\n","/*!\n * is-plain-object <https://github.com/jonschlinkert/is-plain-object>\n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\nfunction isObject(o: unknown): o is Record<string, unknown> {\n return Object.prototype.toString.call(o) === '[object Object]';\n}\n \nexport function isPlainObject(o: unknown): o is Record<string, unknown> {\n var ctor,prot;\n\n if (isObject(o) === false) return false;\n\n // If has modified constructor\n ctor = o.constructor;\n if (ctor === undefined) return true;\n\n // If has modified prototype\n prot = ctor.prototype;\n if (isObject(prot) === false) return false;\n\n // If constructor does not have an Object-specific method\n if (prot.hasOwnProperty('isPrototypeOf') === false) {\n return false;\n }\n\n // Most likely a plain Object\n return true;\n};\n","/* eslint-disable @typescript-eslint/unbound-method */\n \n \n\nimport type {\n PromiseExecutor,\n PromiseWithResolvers,\n ProxyPromise,\n SubscribedPromise,\n} from \"./types\";\n\n/** Memory safe (weakmapped) cache of the ProxyPromise for each Promise,\n * which is retained for the lifetime of the original Promise.\n */\nconst subscribableCache = new WeakMap<\n PromiseLike<unknown>,\n ProxyPromise<unknown>\n>();\n\n/** A NOOP function allowing a consistent interface for settled\n * SubscribedPromises (settled promises are not subscribed - they resolve\n * immediately). */\nconst NOOP = () => {\n // noop\n};\n\n/**\n * Every `Promise<T>` can be shadowed by a single `ProxyPromise<T>`. It is\n * created once, cached and reused throughout the lifetime of the Promise. Get a\n * Promise's ProxyPromise using `Unpromise.proxy(promise)`.\n *\n * The `ProxyPromise<T>` attaches handlers to the original `Promise<T>`\n * `.then()` and `.catch()` just once. Promises derived from it use a\n * subscription- (and unsubscription-) based mechanism that monitors these\n * handlers.\n *\n * Every time you call `.subscribe()`, `.then()` `.catch()` or `.finally()` on a\n * `ProxyPromise<T>` it returns a `SubscribedPromise<T>` having an additional\n * `unsubscribe()` method. Calling `unsubscribe()` detaches reference chains\n * from the original, potentially long-lived Promise, eliminating memory leaks.\n *\n * This approach can eliminate the memory leaks that otherwise come about from\n * repeated `race()` or `any()` calls invoking `.then()` and `.catch()` multiple\n * times on the same long-lived native Promise (subscriptions which can never be\n * cleaned up).\n *\n * `Unpromise.race(promises)` is a reference implementation of `Promise.race`\n * avoiding memory leaks when using long-lived unsettled Promises.\n *\n * `Unpromise.any(promises)` is a reference implementation of `Promise.any`\n * avoiding memory leaks when using long-lived unsettled Promises.\n *\n * `Unpromise.resolve(promise)` returns an ephemeral `SubscribedPromise<T>` for\n * any given `Promise<T>` facilitating arbitrary async/await patterns. Behind\n * the scenes, `resolve` is implemented simply as\n * `Unpromise.proxy(promise).subscribe()`. Don't forget to call `.unsubscribe()`\n * to tidy up!\n *\n */\nexport class Unpromise<T> implements ProxyPromise<T> {\n /** INSTANCE IMPLEMENTATION */\n\n /** The promise shadowed by this Unpromise<T> */\n protected readonly promise: Promise<T> | PromiseLike<T>;\n\n /** Promises expecting eventual settlement (unless unsubscribed first). This list is deleted\n * after the original promise settles - no further notifications will be issued. */\n protected subscribers: ReadonlyArray<PromiseWithResolvers<T>> | null = [];\n\n /** The Promise's settlement (recorded when it fulfils or rejects). This is consulted when\n * calling .subscribe() .then() .catch() .finally() to see if an immediately-resolving Promise\n * can be returned, and therefore subscription can be bypassed. */\n protected settlement: PromiseSettledResult<T> | null = null;\n\n /** Constructor accepts a normal Promise executor function like `new\n * Unpromise((resolve, reject) => {...})` or accepts a pre-existing Promise\n * like `new Unpromise(existingPromise)`. Adds `.then()` and `.catch()`\n * handlers to the Promise. These handlers pass fulfilment and rejection\n * notifications to downstream subscribers and maintains records of value\n * or error if the Promise ever settles. */\n protected constructor(promise: Promise<T>);\n protected constructor(promise: PromiseLike<T>);\n protected constructor(executor: PromiseExecutor<T>);\n protected constructor(arg: Promise<T> | PromiseLike<T> | PromiseExecutor<T>) {\n // handle either a Promise or a Promise executor function\n if (typeof arg === \"function\") {\n this.promise = new Promise(arg);\n } else {\n this.promise = arg;\n }\n\n // subscribe for eventual fulfilment and rejection\n\n // handle PromiseLike objects (that at least have .then)\n const thenReturn = this.promise.then((value) => {\n // atomically record fulfilment and detach subscriber list\n const { subscribers } = this;\n this.subscribers = null;\n this.settlement = {\n status: \"fulfilled\",\n value,\n };\n // notify fulfilment to subscriber list\n subscribers?.forEach(({ resolve }) => {\n resolve(value);\n });\n });\n\n // handle Promise (that also have a .catch behaviour)\n if (\"catch\" in thenReturn) {\n thenReturn.catch((reason) => {\n // atomically record rejection and detach subscriber list\n const { subscribers } = this;\n this.subscribers = null;\n this.settlement = {\n status: \"rejected\",\n reason,\n };\n // notify rejection to subscriber list\n subscribers?.forEach(({ reject }) => {\n reject(reason);\n });\n });\n }\n }\n\n /** Create a promise that mitigates uncontrolled subscription to a long-lived\n * Promise via .then() and .catch() - otherwise a source of memory leaks.\n *\n * The returned promise has an `unsubscribe()` method which can be called when\n * the Promise is no longer being tracked by application logic, and which\n * ensures that there is no reference chain from the original promise to the\n * new one, and therefore no memory leak.\n *\n * If original promise has not yet settled, this adds a new unique promise\n * that listens to then/catch events, along with an `unsubscribe()` method to\n * detach it.\n *\n * If original promise has settled, then creates a new Promise.resolve() or\n * Promise.reject() and provided unsubscribe is a noop.\n *\n * If you call `unsubscribe()` before the returned Promise has settled, it\n * will never settle.\n */\n subscribe(): SubscribedPromise<T> {\n // in all cases we will combine some promise with its unsubscribe function\n let promise: Promise<T>;\n let unsubscribe: () => void;\n\n const { settlement } = this;\n if (settlement === null) {\n // not yet settled - subscribe new promise. Expect eventual settlement\n if (this.subscribers === null) {\n // invariant - it is not settled, so it must have subscribers\n throw new Error(\"Unpromise settled but still has subscribers\");\n }\n const subscriber = withResolvers<T>();\n this.subscribers = listWithMember(this.subscribers, subscriber);\n promise = subscriber.promise;\n unsubscribe = () => {\n if (this.subscribers !== null) {\n this.subscribers = listWithoutMember(this.subscribers, subscriber);\n }\n };\n } else {\n // settled - don't create subscribed promise. Just resolve or reject\n const { status } = settlement;\n if (status === \"fulfilled\") {\n promise = Promise.resolve(settlement.value);\n } else {\n promise = Promise.reject(settlement.reason);\n }\n unsubscribe = NOOP;\n }\n\n // extend promise signature with the extra method\n return Object.assign(promise, { unsubscribe });\n }\n\n /** STANDARD PROMISE METHODS (but returning a SubscribedPromise) */\n\n then<TResult1 = T, TResult2 = never>(\n onfulfilled?:\n | ((value: T) => TResult1 | PromiseLike<TResult1>)\n | null\n ,\n onrejected?:\n | ((reason: any) => TResult2 | PromiseLike<TResult2>)\n | null\n \n ): SubscribedPromise<TResult1 | TResult2> {\n const subscribed = this.subscribe();\n const { unsubscribe } = subscribed;\n return Object.assign(subscribed.then(onfulfilled, onrejected), {\n unsubscribe,\n });\n }\n\n catch<TResult = never>(\n onrejected?:\n | ((reason: any) => TResult | PromiseLike<TResult>)\n | null\n \n ): SubscribedPromise<T | TResult> {\n const subscribed = this.subscribe();\n const { unsubscribe } = subscribed;\n return Object.assign(subscribed.catch(onrejected), {\n unsubscribe,\n });\n }\n\n finally(onfinally?: (() => void) | null ): SubscribedPromise<T> {\n const subscribed = this.subscribe();\n const { unsubscribe } = subscribed;\n return Object.assign(subscribed.finally(onfinally), {\n unsubscribe,\n });\n }\n\n /** TOSTRING SUPPORT */\n\n readonly [Symbol.toStringTag] = \"Unpromise\";\n\n /** Unpromise STATIC METHODS */\n\n /** Create or Retrieve the proxy Unpromise (a re-used Unpromise for the VM lifetime\n * of the provided Promise reference) */\n static proxy<T>(promise: PromiseLike<T>): ProxyPromise<T> {\n const cached = Unpromise.getSubscribablePromise(promise);\n return typeof cached !== \"undefined\"\n ? cached\n : Unpromise.createSubscribablePromise(promise);\n }\n\n /** Create and store an Unpromise keyed by an original Promise. */\n protected static createSubscribablePromise<T>(promise: PromiseLike<T>) {\n const created = new Unpromise<T>(promise);\n subscribableCache.set(promise, created as Unpromise<unknown>); // resolve promise to unpromise\n subscribableCache.set(created, created as Unpromise<unknown>); // resolve the unpromise to itself\n return created;\n }\n\n /** Retrieve a previously-created Unpromise keyed by an original Promise. */\n protected static getSubscribablePromise<T>(promise: PromiseLike<T>) {\n return subscribableCache.get(promise) as ProxyPromise<T> | undefined;\n }\n\n /** Promise STATIC METHODS */\n\n /** Lookup the Unpromise for this promise, and derive a SubscribedPromise from\n * it (that can be later unsubscribed to eliminate Memory leaks) */\n static resolve<T>(value: T | PromiseLike<T>) {\n const promise: PromiseLike<T> =\n typeof value === \"object\" &&\n value !== null &&\n \"then\" in value &&\n typeof value.then === \"function\"\n ? value\n : Promise.resolve(value);\n return Unpromise.proxy(promise).subscribe() as SubscribedPromise<\n Awaited<T>\n >;\n }\n\n /** Perform Promise.any() via SubscribedPromises, then unsubscribe them.\n * Equivalent to Promise.any but eliminates memory leaks from long-lived\n * promises accumulating .then() and .catch() subscribers. */\n static async any<T extends readonly unknown[] | []>(\n values: T\n ): Promise<Awaited<T[number]>>;\n static async any<T>(\n values: Iterable<T | PromiseLike<T>>\n ): Promise<Awaited<T>> {\n const valuesArray = Array.isArray(values) ? values : [...values];\n const subscribedPromises = valuesArray.map(Unpromise.resolve);\n try {\n return await Promise.any(subscribedPromises);\n } finally {\n subscribedPromises.forEach(({ unsubscribe }) => {\n unsubscribe();\n });\n }\n }\n\n /** Perform Promise.race via SubscribedPromises, then unsubscribe them.\n * Equivalent to Promise.race but eliminates memory leaks from long-lived\n * promises accumulating .then() and .catch() subscribers. */\n static async race<T extends readonly unknown[] | []>(\n values: T\n ): Promise<Awaited<T[number]>>;\n static async race<T>(\n values: Iterable<T | PromiseLike<T>>\n ): Promise<Awaited<T>> {\n const valuesArray = Array.isArray(values) ? values : [...values];\n const subscribedPromises = valuesArray.map(Unpromise.resolve);\n try {\n return await Promise.race(subscribedPromises);\n } finally {\n subscribedPromises.forEach(({ unsubscribe }) => {\n unsubscribe();\n });\n }\n }\n\n /** Create a race of SubscribedPromises that will fulfil to a single winning\n * Promise (in a 1-Tuple). Eliminates memory leaks from long-lived promises\n * accumulating .then() and .catch() subscribers. Allows simple logic to\n * consume the result, like...\n * ```ts\n * const [ winner ] = await Unpromise.race([ promiseA, promiseB ]);\n * if(winner === promiseB){\n * const result = await promiseB;\n * // do the thing\n * }\n * ```\n * */\n static async raceReferences<TPromise extends Promise<unknown>>(\n promises: readonly TPromise[]\n ) {\n // map each promise to an eventual 1-tuple containing itself\n const selfPromises = promises.map(resolveSelfTuple);\n\n // now race them. They will fulfil to a readonly [P] or reject.\n try {\n return await Promise.race(selfPromises);\n } finally {\n for (const promise of selfPromises) {\n // unsubscribe proxy promises when the race is over to mitigate memory leaks\n promise.unsubscribe();\n }\n }\n }\n}\n\n/** Promises a 1-tuple containing the original promise when it resolves. Allows\n * awaiting the eventual Promise ***reference*** (easy to destructure and\n * exactly compare with ===). Avoids resolving to the Promise ***value*** (which\n * may be ambiguous and therefore hard to identify as the winner of a race).\n * You can call unsubscribe on the Promise to mitigate memory leaks.\n * */\nexport function resolveSelfTuple<TPromise extends Promise<unknown>>(\n promise: TPromise\n): SubscribedPromise<readonly [TPromise]> {\n return Unpromise.proxy(promise).then(() => [promise] as const);\n}\n\n/** VENDORED (Future) PROMISE UTILITIES */\n\n/** Reference implementation of https://github.com/tc39/proposal-promise-with-resolvers */\nfunction withResolvers<T>(): PromiseWithResolvers<T> {\n let resolve!: PromiseWithResolvers<T>[\"resolve\"];\n let reject!: PromiseWithResolvers<T>[\"reject\"];\n const promise = new Promise<T>((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n });\n return {\n promise,\n resolve,\n reject,\n };\n}\n\n/** IMMUTABLE LIST OPERATIONS */\n\nfunction listWithMember<T>(arr: readonly T[], member: T): readonly T[] {\n return [...arr, member];\n}\n\nfunction listWithoutIndex<T>(arr: readonly T[], index: number) {\n return [...arr.slice(0, index), ...arr.slice(index + 1)];\n}\n\nfunction listWithoutMember<T>(arr: readonly T[], member: unknown) {\n const index = arr.indexOf(member as T);\n if (index !== -1) {\n return listWithoutIndex(arr, index);\n }\n return arr;\n}\n","// @ts-expect-error - polyfilling symbol\n// eslint-disable-next-line no-restricted-syntax\nSymbol.dispose ??= Symbol();\n\n// @ts-expect-error - polyfilling symbol\n// eslint-disable-next-line no-restricted-syntax\nSymbol.asyncDispose ??= Symbol();\n\n/**\n * Takes a value and a dispose function and returns a new object that implements the Disposable interface.\n * The returned object is the original value augmented with a Symbol.dispose method.\n * @param thing The value to make disposable\n * @param dispose Function to call when disposing the resource\n * @returns The original value with Symbol.dispose method added\n */\nexport function makeResource<T>(thing: T, dispose: () => void): T & Disposable {\n const it = thing as T & Partial<Disposable>;\n\n // eslint-disable-next-line no-restricted-syntax\n const existing = it[Symbol.dispose];\n\n // eslint-disable-next-line no-restricted-syntax\n it[Symbol.dispose] = () => {\n dispose();\n existing?.call(it);\n };\n\n return it as T & Disposable;\n}\n\n/**\n * Takes a value and an async dispose function and returns a new object that implements the AsyncDisposable interface.\n * The returned object is the original value augmented with a Symbol.asyncDispose method.\n * @param thing The value to make async disposable\n * @param dispose Async function to call when disposing the resource\n * @returns The original value with Symbol.asyncDispose method added\n */\nexport function makeAsyncResource<T>(\n thing: T,\n dispose: () => Promise<void>,\n): T & AsyncDisposable {\n const it = thing as T & Partial<AsyncDisposable>;\n\n // eslint-disable-next-line no-restricted-syntax\n const existing = it[Symbol.asyncDispose];\n\n // eslint-disable-next-line no-restricted-syntax\n it[Symbol.asyncDispose] = async () => {\n await dispose();\n await existing?.call(it);\n };\n\n return it as T & AsyncDisposable;\n}\n","import { makeResource } from './disposable';\n\nexport const disposablePromiseTimerResult = Symbol();\n\nexport function timerResource(ms: number) {\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n return makeResource(\n {\n start() {\n if (timer) {\n throw new Error('Timer already started');\n }\n\n const promise = new Promise<typeof disposablePromiseTimerResult>(\n (resolve) => {\n timer = setTimeout(() => resolve(disposablePromiseTimerResult), ms);\n },\n );\n return promise;\n },\n },\n () => {\n if (timer) {\n clearTimeout(timer);\n }\n },\n );\n}\n","import { Unpromise } from '../../../vendor/unpromise';\nimport { throwAbortError } from '../../http/abortError';\nimport { makeAsyncResource } from './disposable';\nimport { disposablePromiseTimerResult, timerResource } from './timerResource';\n\nexport function iteratorResource<TYield, TReturn, TNext>(\n iterable: AsyncIterable<TYield, TReturn, TNext>,\n): AsyncIterator<TYield, TReturn, TNext> & AsyncDisposable {\n const iterator = iterable[Symbol.asyncIterator]();\n\n // @ts-expect-error - this is added in node 24 which we don't officially support yet\n // eslint-disable-next-line no-restricted-syntax\n if (iterator[Symbol.asyncDispose]) {\n return iterator as AsyncIterator<TYield, TReturn, TNext> & AsyncDisposable;\n }\n\n return makeAsyncResource(iterator, async () => {\n await iterator.return?.();\n });\n}\n\n/**\n * Derives a new {@link AsyncGenerator} based of {@link iterable}, that yields its first\n * {@link count} values. Then, a grace period of {@link gracePeriodMs} is started in which further\n * values may still come through. After this period, the generator aborts.\n */\nexport async function* takeWithGrace<T>(\n iterable: AsyncIterable<T>,\n opts: {\n count: number;\n gracePeriodMs: number;\n },\n): AsyncGenerator<T> {\n await using iterator = iteratorResource(iterable);\n\n // declaration outside the loop for garbage collection reasons\n let result: null | IteratorResult<T> | typeof disposablePromiseTimerResult;\n\n using timer = timerResource(opts.gracePeriodMs);\n\n let count = opts.count;\n\n let timerPromise = new Promise<typeof disposablePromiseTimerResult>(() => {\n // never resolves\n });\n\n while (true) {\n result = await Unpromise.race([iterator.next(), timerPromise]);\n if (result === disposablePromiseTimerResult) {\n throwAbortError();\n }\n if (result.done) {\n return result.value;\n }\n yield result.value;\n if (--count === 0) {\n timerPromise = timer.start();\n }\n // free up reference for garbage collection\n result = null;\n }\n}\n","/* eslint-disable @typescript-eslint/no-non-null-assertion */\nexport function createDeferred<TValue = void>() {\n let resolve: (value: TValue) => void;\n let reject: (error: unknown) => void;\n const promise = new Promise<TValue>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n return { promise, resolve: resolve!, reject: reject! };\n}\nexport type Deferred<TValue> = ReturnType<typeof createDeferred<TValue>>;\n","import { createDeferred } from './createDeferred';\nimport { makeAsyncResource } from './disposable';\n\ntype ManagedIteratorResult<TYield, TReturn> =\n | { status: 'yield'; value: TYield }\n | { status: 'return'; value: TReturn }\n | { status: 'error'; error: unknown };\nfunction createManagedIterator<TYield, TReturn>(\n iterable: AsyncIterable<TYield, TReturn>,\n onResult: (result: ManagedIteratorResult<TYield, TReturn>) => void,\n) {\n const iterator = iterable[Symbol.asyncIterator]();\n let state: 'idle' | 'pending' | 'done' = 'idle';\n\n function cleanup() {\n state = 'done';\n onResult = () => {\n // noop\n };\n }\n\n function pull() {\n if (state !== 'idle') {\n return;\n }\n state = 'pending';\n\n const next = iterator.next();\n next\n .then((result) => {\n if (result.done) {\n state = 'done';\n onResult({ status: 'return', value: result.value });\n cleanup();\n return;\n }\n state = 'idle';\n onResult({ status: 'yield', value: result.value });\n })\n .catch((cause) => {\n onResult({ status: 'error', error: cause });\n cleanup();\n });\n }\n\n return {\n pull,\n destroy: async () => {\n cleanup();\n await iterator.return?.();\n },\n };\n}\ntype ManagedIterator<TYield, TReturn> = ReturnType<\n typeof createManagedIterator<TYield, TReturn>\n>;\n\ninterface MergedAsyncIterables<TYield> extends AsyncIterable<\n TYield,\n void,\n unknown\n> {\n add(iterable: AsyncIterable<TYield>): void;\n}\n\n/**\n * Creates a new async iterable that merges multiple async iterables into a single stream.\n * Values from the input iterables are yielded in the order they resolve, similar to Promise.race().\n *\n * New iterables can be added dynamically using the returned {@link MergedAsyncIterables.add} method, even after iteration has started.\n *\n * If any of the input iterables throws an error, that error will be propagated through the merged stream.\n * Other iterables will not continue to be processed.\n *\n * @template TYield The type of values yielded by the input iterables\n */\nexport function mergeAsyncIterables<TYield>(): MergedAsyncIterables<TYield> {\n let state: 'idle' | 'pending' | 'done' = 'idle';\n let flushSignal = createDeferred();\n\n /**\n * used while {@link state} is `idle`\n */\n const iterables: AsyncIterable<TYield, void, unknown>[] = [];\n /**\n * used while {@link state} is `pending`\n */\n const iterators = new Set<ManagedIterator<TYield, void>>();\n\n const buffer: Array<\n [\n iterator: ManagedIterator<TYield, void>,\n result: Exclude<\n ManagedIteratorResult<TYield, void>,\n { status: 'return' }\n >,\n ]\n > = [];\n\n function initIterable(iterable: AsyncIterable<TYield, void, unknown>) {\n if (state !== 'pending') {\n // shouldn't happen\n return;\n }\n const iterator = createManagedIterator(iterable, (result) => {\n if (state !== 'pending') {\n // shouldn't happen\n return;\n }\n switch (result.status) {\n case 'yield':\n buffer.push([iterator, result]);\n break;\n case 'return':\n iterators.delete(iterator);\n break;\n case 'error':\n buffer.push([iterator, result]);\n iterators.delete(iterator);\n break;\n }\n flushSignal.resolve();\n });\n iterators.add(iterator);\n iterator.pull();\n }\n\n return {\n add(iterable: AsyncIterable<TYield, void, unknown>) {\n switch (state) {\n case 'idle':\n iterables.push(iterable);\n break;\n case 'pending':\n initIterable(iterable);\n break;\n case 'done': {\n // shouldn't happen\n break;\n }\n }\n },\n async *[Symbol.asyncIterator]() {\n if (state !== 'idle') {\n throw new Error('Cannot iterate twice');\n }\n state = 'pending';\n\n await using _finally = makeAsyncResource({}, async () => {\n state = 'done';\n\n const errors: unknown[] = [];\n await Promise.all(\n Array.from(iterators.values()).map(async (it) => {\n try {\n await it.destroy();\n } catch (cause) {\n errors.push(cause);\n }\n }),\n );\n buffer.length = 0;\n iterators.clear();\n flushSignal.resolve();\n\n if (errors.length > 0) {\n throw new AggregateError(errors);\n }\n });\n\n while (iterables.length > 0) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n initIterable(iterables.shift()!);\n }\n\n while (iterators.size > 0) {\n await flushSignal.promise;\n\n while (buffer.length > 0) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const [iterator, result] = buffer.shift()!;\n\n switch (result.status) {\n case 'yield':\n yield result.value;\n iterator.pull();\n break;\n case 'error':\n throw result.error;\n }\n }\n flushSignal = createDeferred();\n }\n },\n };\n}\n","/**\n * Creates a ReadableStream from an AsyncIterable.\n *\n * @param iterable - The source AsyncIterable to stream from\n * @returns A ReadableStream that yields values from the AsyncIterable\n */\nexport function readableStreamFrom<TYield>(\n iterable: AsyncIterable<TYield, void>,\n): ReadableStream<TYield> {\n const iterator = iterable[Symbol.asyncIterator]();\n\n return new ReadableStream({\n async cancel() {\n await iterator.return?.();\n },\n\n async pull(controller) {\n const result = await iterator.next();\n\n if (result.done) {\n controller.close();\n return;\n }\n\n controller.enqueue(result.value);\n },\n });\n}\n","import { Unpromise } from '../../../vendor/unpromise';\nimport { iteratorResource } from './asyncIterable';\nimport { disposablePromiseTimerResult, timerResource } from './timerResource';\n\nexport const PING_SYM = Symbol('ping');\n\n/**\n * Derives a new {@link AsyncGenerator} based of {@link iterable}, that yields {@link PING_SYM}\n * whenever no value has been yielded for {@link pingIntervalMs}.\n */\nexport async function* withPing<TValue>(\n iterable: AsyncIterable<TValue>,\n pingIntervalMs: number,\n): AsyncGenerator<TValue | typeof PING_SYM> {\n await using iterator = iteratorResource(iterable);\n\n // declaration outside the loop for garbage collection reasons\n let result:\n null | IteratorResult<TValue> | typeof disposablePromiseTimerResult;\n\n let nextPromise = iterator.next();\n\n while (true) {\n using pingPromise = timerResource(pingIntervalMs);\n\n result = await Unpromise.race([nextPromise, pingPromise.start()]);\n\n if (result === disposablePromiseTimerResult) {\n // cancelled\n\n yield PING_SYM;\n continue;\n }\n\n if (result.done) {\n return result.value;\n }\n\n nextPromise = iterator.next();\n yield result.value;\n\n // free up reference for garbage collection\n result = null;\n }\n}\n","import { isPlainObject } from '@trpc/server/vendor/is-plain-object';\nimport {\n emptyObject,\n isAsyncIterable,\n isFunction,\n isObject,\n run,\n} from '../utils';\nimport { iteratorResource } from './utils/asyncIterable';\nimport type { Deferred } from './utils/createDeferred';\nimport { createDeferred } from './utils/createDeferred';\nimport { makeResource } from './utils/disposable';\nimport { mergeAsyncIterables } from './utils/mergeAsyncIterables';\nimport { readableStreamFrom } from './utils/readableStreamFrom';\nimport { PING_SYM, withPing } from './utils/withPing';\n\n/**\n * A subset of the standard ReadableStream properties needed by tRPC internally.\n * @see ReadableStream from lib.dom.d.ts\n */\nexport type WebReadableStreamEsque = {\n getReader: () => ReadableStreamDefaultReader<Uint8Array>;\n};\n\nexport type NodeJSReadableStreamEsque = {\n on(\n eventName: string | symbol,\n listener: (...args: any[]) => void,\n ): NodeJSReadableStreamEsque;\n};\n\n// ---------- types\nconst CHUNK_VALUE_TYPE_PROMISE = 0;\ntype CHUNK_VALUE_TYPE_PROMISE = typeof CHUNK_VALUE_TYPE_PROMISE;\nconst CHUNK_VALUE_TYPE_ASYNC_ITERABLE = 1;\ntype CHUNK_VALUE_TYPE_ASYNC_ITERABLE = typeof CHUNK_VALUE_TYPE_ASYNC_ITERABLE;\n\nconst PROMISE_STATUS_FULFILLED = 0;\ntype PROMISE_STATUS_FULFILLED = typeof PROMISE_STATUS_FULFILLED;\nconst PROMISE_STATUS_REJECTED = 1;\ntype PROMISE_STATUS_REJECTED = typeof PROMISE_STATUS_REJECTED;\n\nconst ASYNC_ITERABLE_STATUS_RETURN = 0;\ntype ASYNC_ITERABLE_STATUS_RETURN = typeof ASYNC_ITERABLE_STATUS_RETURN;\nconst ASYNC_ITERABLE_STATUS_YIELD = 1;\ntype ASYNC_ITERABLE_STATUS_YIELD = typeof ASYNC_ITERABLE_STATUS_YIELD;\nconst ASYNC_ITERABLE_STATUS_ERROR = 2;\ntype ASYNC_ITERABLE_STATUS_ERROR = typeof ASYNC_ITERABLE_STATUS_ERROR;\n\ntype ChunkDefinitionKey =\n // root should be replaced\n | null\n // at array path\n | number\n // at key path\n | string;\n\ntype ChunkIndex = number & { __chunkIndex: true };\ntype ChunkValueType =\n CHUNK_VALUE_TYPE_PROMISE | CHUNK_VALUE_TYPE_ASYNC_ITERABLE;\ntype ChunkDefinition = [\n key: ChunkDefinitionKey,\n type: ChunkValueType,\n chunkId: ChunkIndex,\n];\ntype EncodedValue = [\n // data\n [unknown] | [],\n // chunk descriptions\n ...ChunkDefinition[],\n];\n\ntype Head = Record<string, EncodedValue>;\ntype PromiseChunk =\n | [\n chunkIndex: ChunkIndex,\n status: PROMISE_STATUS_FULFILLED,\n value: EncodedValue,\n ]\n | [chunkIndex: ChunkIndex, status: PROMISE_STATUS_REJECTED, error: unknown];\ntype IterableChunk =\n | [\n chunkIndex: ChunkIndex,\n status: ASYNC_ITERABLE_STATUS_RETURN,\n value: EncodedValue,\n ]\n | [\n chunkIndex: ChunkIndex,\n status: ASYNC_ITERABLE_STATUS_YIELD,\n value: EncodedValue,\n ]\n | [\n chunkIndex: ChunkIndex,\n status: ASYNC_ITERABLE_STATUS_ERROR,\n error: unknown,\n ];\ntype ChunkData = PromiseChunk | IterableChunk;\ntype PlaceholderValue = 0 & { __placeholder: true };\nexport function isPromise(value: unknown): value is Promise<unknown> {\n return (\n (isObject(value) || isFunction(value)) &&\n typeof value?.['then'] === 'function' &&\n typeof value?.['catch'] === 'function'\n );\n}\n\ntype Serialize = (value: any) => any;\ntype Deserialize = (value: any) => any;\n\ntype PathArray = readonly (string | number)[];\nexport type ProducerOnError = (opts: {\n error: unknown;\n path: PathArray;\n}) => void;\nexport interface JSONLProducerOptions {\n serialize?: Serialize;\n data: Record<string, unknown> | unknown[];\n onError?: ProducerOnError;\n formatError?: (opts: { error: unknown; path: PathArray }) => unknown;\n maxDepth?: number;\n /**\n * Interval in milliseconds to send a ping to the client to keep the connection alive\n * This will be sent as a whitespace character\n * @default undefined\n */\n pingMs?: number;\n}\n\nclass MaxDepthError extends Error {\n constructor(public path: (string | number)[]) {\n super('Max depth reached at path: ' + path.join('.'));\n }\n}\n\nasync function* createBatchStreamProducer(\n opts: JSONLProducerOptions,\n): AsyncIterable<Head | ChunkData | typeof PING_SYM, void> {\n const { data } = opts;\n let counter = 0 as ChunkIndex;\n const placeholder = 0 as PlaceholderValue;\n\n const mergedIterables = mergeAsyncIterables<ChunkData>();\n function registerAsync(\n callback: (idx: ChunkIndex) => AsyncIterable<ChunkData, void>,\n ) {\n const idx = counter++ as ChunkIndex;\n\n const iterable = callback(idx);\n mergedIterables.add(iterable);\n\n return idx;\n }\n\n function encodePromise(promise: Promise<unknown>, path: (string | number)[]) {\n return registerAsync(async function* (idx) {\n const error = checkMaxDepth(path);\n if (error) {\n // Catch any errors from the original promise to ensure they're reported\n promise.catch((cause) => {\n opts.onError?.({ error: cause, path });\n });\n // Replace the promise with a rejected one containing the max depth error\n promise = Promise.reject(error);\n }\n try {\n const next = await promise;\n yield [idx, PROMISE_STATUS_FULFILLED, encode(next, path)];\n } catch (cause) {\n opts.onError?.({ error: cause, path });\n yield [\n idx,\n PROMISE_STATUS_REJECTED,\n opts.formatError?.({ error: cause, path }),\n ];\n }\n });\n }\n function encodeAsyncIterable(\n iterable: AsyncIterable<unknown>,\n path: (string | number)[],\n ) {\n return registerAsync(async function* (idx) {\n const error = checkMaxDepth(path);\n if (error) {\n throw error;\n }\n await using iterator = iteratorResource(iterable);\n\n try {\n while (true) {\n const next = await iterator.next();\n if (next.done) {\n yield [idx, ASYNC_ITERABLE_STATUS_RETURN, encode(next.value, path)];\n break;\n }\n yield [idx, ASYNC_ITERABLE_STATUS_YIELD, encode(next.value, path)];\n }\n } catch (cause) {\n opts.onError?.({ error: cause, path });\n\n yield [\n idx,\n ASYNC_ITERABLE_STATUS_ERROR,\n opts.formatError?.({ error: cause, path }),\n ];\n }\n });\n }\n function checkMaxDepth(path: (string | number)[]) {\n if (opts.maxDepth && path.length > opts.maxDepth) {\n return new MaxDepthError(path);\n }\n return null;\n }\n function encodeAsync(\n value: unknown,\n path: (string | number)[],\n ): null | [type: ChunkValueType, chunkId: ChunkIndex] {\n if (isPromise(value)) {\n return [CHUNK_VALUE_TYPE_PROMISE, encodePromise(value, path)];\n }\n if (isAsyncIterable(value)) {\n if (opts.maxDepth && path.length >= opts.maxDepth) {\n throw new Error('Max depth reached');\n }\n return [\n CHUNK_VALUE_TYPE_ASYNC_ITERABLE,\n encodeAsyncIterable(value, path),\n ];\n }\n return null;\n }\n function encode(value: unknown, path: (string | number)[]): EncodedValue {\n if (value === undefined) {\n return [[]];\n }\n const reg = encodeAsync(value, path);\n if (reg) {\n return [[placeholder], [null, ...reg]];\n }\n\n if (!isPlainObject(value)) {\n return [[value]];\n }\n\n const newObj: Record<string, unknown> = emptyObject();\n const asyncValues: ChunkDefinition[] = [];\n for (const [key, item] of Object.entries(value)) {\n const transformed = encodeAsync(item, [...path, key]);\n if (!transformed) {\n newObj[key] = item;\n continue;\n }\n newObj[key] = placeholder;\n asyncValues.push([key, ...transformed]);\n }\n return [[newObj], ...asyncValues];\n }\n\n const newHead: Head = emptyObject();\n for (const [key, item] of Object.entries(data)) {\n newHead[key] = encode(item, [key]);\n }\n\n yield newHead;\n\n let iterable: AsyncIterable<ChunkData | typeof PING_SYM, void> =\n mergedIterables;\n if (opts.pingMs) {\n iterable = withPing(mergedIterables, opts.pingMs);\n }\n\n for await (const value of iterable) {\n yield value;\n }\n}\n/**\n * JSON Lines stream producer\n * @see https://jsonlines.org/\n */\nexport function jsonlStreamProducer(opts: JSONLProducerOptions) {\n let stream = readableStreamFrom(createBatchStreamProducer(opts));\n\n const { serialize } = opts;\n if (serialize) {\n stream = stream.pipeThrough(\n new TransformStream({\n transform(chunk, controller) {\n if (chunk === PING_SYM) {\n controller.enqueue(PING_SYM);\n } else {\n controller.enqueue(serialize(chunk));\n }\n },\n }),\n );\n }\n\n return stream\n .pipeThrough(\n new TransformStream({\n transform(chunk, controller) {\n if (chunk === PING_SYM) {\n controller.enqueue(' ');\n } else {\n controller.enqueue(JSON.stringify(chunk) + '\\n');\n }\n },\n }),\n )\n .pipeThrough(new TextEncoderStream());\n}\n\nclass AsyncError extends Error {\n constructor(public readonly data: unknown) {\n super('Received error from server');\n }\n}\nexport type ConsumerOnError = (opts: { error: unknown }) => void;\n\nconst nodeJsStreamToReaderEsque = (source: NodeJSReadableStreamEsque) => {\n return {\n getReader() {\n const stream = new ReadableStream<Uint8Array>({\n start(controller) {\n source.on('data', (chunk) => {\n controller.enqueue(chunk);\n });\n source.on('end', () => {\n controller.close();\n });\n source.on('error', (error) => {\n controller.error(error);\n });\n },\n });\n return stream.getReader();\n },\n };\n};\n\nfunction createLineAccumulator(\n from: NodeJSReadableStreamEsque | WebReadableStreamEsque,\n) {\n const reader =\n 'getReader' in from\n ? from.getReader()\n : nodeJsStreamToReaderEsque(from).getReader();\n\n let lineAggregate = '';\n\n return new ReadableStream({\n async pull(controller) {\n const { done, value } = await reader.read();\n\n if (done) {\n controller.close();\n } else {\n controller.enqueue(value);\n }\n },\n cancel() {\n return reader.cancel();\n },\n })\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(\n new TransformStream<string, string>({\n transform(chunk, controller) {\n lineAggregate += chunk;\n const parts = lineAggregate.split('\\n');\n lineAggregate = parts.pop() ?? '';\n for (const part of parts) {\n controller.enqueue(part);\n }\n },\n }),\n );\n}\nfunction createConsumerStream<THead>(\n from: NodeJSReadableStreamEsque | WebReadableStreamEsque,\n) {\n const stream = createLineAccumulator(from);\n\n let sentHead = false;\n return stream.pipeThrough(\n new TransformStream<string, ChunkData | THead>({\n transform(line, controller) {\n if (!sentHead) {\n const head = JSON.parse(line);\n controller.enqueue(head as THead);\n sentHead = true;\n } else {\n const chunk: ChunkData = JSON.parse(line);\n controller.enqueue(chunk);\n }\n },\n }),\n );\n}\n\n/**\n * Creates a handler for managing stream controllers and their lifecycle\n */\nfunction createStreamsManager(abortController: AbortController) {\n const controllerMap = new Map<\n ChunkIndex,\n ReturnType<typeof createStreamController>\n >();\n\n /**\n * Checks if there are no pending controllers or deferred promises\n */\n function isEmpty() {\n return Array.from(controllerMap.values()).every((c) => c.closed);\n }\n\n /**\n * Creates a stream controller\n */\n function createStreamController() {\n let originalController: ReadableStreamDefaultController<ChunkData>;\n const stream = new ReadableStream<ChunkData>({\n start(controller) {\n originalController = controller;\n },\n });\n\n const streamController = {\n enqueue: (v: ChunkData) => originalController.enqueue(v),\n close: () => {\n originalController.close();\n\n clear();\n\n if (isEmpty()) {\n abortController.abort();\n }\n },\n closed: false,\n getReaderResource: () => {\n const reader = stream.getReader();\n\n return makeResource(reader, () => {\n streamController.close();\n reader.releaseLock();\n });\n },\n error: (reason: unknown) => {\n originalController.error(reason);\n\n clear();\n },\n };\n function clear() {\n Object.assign(streamController, {\n closed: true,\n close: () => {\n // noop\n },\n enqueue: () => {\n // noop\n },\n getReaderResource: null,\n error: () => {\n // noop\n },\n });\n }\n\n return streamController;\n }\n\n /**\n * Gets or creates a stream controller\n */\n function getOrCreate(chunkId: ChunkIndex) {\n let c = controllerMap.get(chunkId);\n if (!c) {\n c = createStreamController();\n controllerMap.set(chunkId, c);\n }\n return c;\n }\n\n /**\n * Cancels all pending controllers and rejects deferred promises\n */\n function cancelAll(reason: unknown) {\n for (const controller of controllerMap.values()) {\n controller.error(reason);\n }\n }\n\n /**\n * Closes all pending controllers to preserve buffered data\n */\n function closeAll() {\n for (const controller of controllerMap.values()) {\n controller.close();\n }\n }\n\n return {\n getOrCreate,\n cancelAll,\n closeAll,\n };\n}\n\n/**\n * JSON Lines stream consumer\n * @see https://jsonlines.org/\n */\nexport async function jsonlStreamConsumer<THead>(opts: {\n from: NodeJSReadableStreamEsque | WebReadableStreamEsque;\n deserialize?: Deserialize;\n onError?: ConsumerOnError;\n formatError?: (opts: { error: unknown }) => Error;\n /**\n * This `AbortController` will be triggered when there are no more listeners to the stream.\n */\n abortController: AbortController;\n}) {\n const { deserialize = (v) => v } = opts;\n\n let source = createConsumerStream<Head>(opts.from);\n if (deserialize) {\n source = source.pipeThrough(\n new TransformStream({\n transform(chunk, controller) {\n controller.enqueue(deserialize(chunk));\n },\n }),\n );\n }\n let headDeferred: null | Deferred<THead> = createDeferred();\n\n const streamManager = createStreamsManager(opts.abortController);\n\n function decodeChunkDefinition(value: ChunkDefinition) {\n const [_path, type, chunkId] = value;\n\n const controller = streamManager.getOrCreate(chunkId);\n\n switch (type) {\n case CHUNK_VALUE_TYPE_PROMISE: {\n return run(async () => {\n using reader = controller.getReaderResource();\n\n const { value } = await reader.read();\n const [_chunkId, status, data] = value as PromiseChunk;\n switch (status) {\n case PROMISE_STATUS_FULFILLED:\n return decode(data);\n case PROMISE_STATUS_REJECTED:\n throw opts.formatError?.({ error: data }) ?? new AsyncError(data);\n }\n });\n }\n case CHUNK_VALUE_TYPE_ASYNC_ITERABLE: {\n return run(async function* () {\n using reader = controller.getReaderResource();\n\n while (true) {\n const { value } = await reader.read();\n\n const [_chunkId, status, data] = value as IterableChunk;\n\n switch (status) {\n case ASYNC_ITERABLE_STATUS_YIELD:\n yield decode(data);\n break;\n case ASYNC_ITERABLE_STATUS_RETURN:\n return decode(data);\n case ASYNC_ITERABLE_STATUS_ERROR:\n throw (\n opts.formatError?.({ error: data }) ?? new AsyncError(data)\n );\n }\n }\n });\n }\n }\n }\n\n function decode(value: EncodedValue): unknown {\n const [[data], ...asyncProps] = value;\n\n for (const value of asyncProps) {\n const [key] = value;\n const decoded = decodeChunkDefinition(value);\n\n if (key === null) {\n return decoded;\n }\n\n (data as any)[key] = decoded;\n }\n return data;\n }\n\n const handleClose = () => {\n // If the stream closes before emitting any head data,\n // we need to reject the headDeferred to prevent hanging\n if (headDeferred) {\n headDeferred.reject(new Error('Stream closed before head was received'));\n headDeferred = null;\n }\n // Close stream controllers (not error them)\n // to preserve any buffered chunks\n streamManager.closeAll();\n };\n\n const handleAbort = (reason?: unknown) => {\n headDeferred?.reject(reason);\n headDeferred = null;\n streamManager.cancelAll(reason);\n };\n\n source\n .pipeTo(\n new WritableStream({\n write(chunkOrHead) {\n if (headDeferred) {\n const head = chunkOrHead as Record<number | string, unknown>;\n\n for (const [key, value] of Object.entries(chunkOrHead)) {\n const parsed = decode(value as any);\n head[key] = parsed;\n }\n headDeferred.resolve(head as THead);\n headDeferred = null;\n\n return;\n }\n const chunk = chunkOrHead as ChunkData;\n const [idx] = chunk;\n\n const controller = streamManager.getOrCreate(idx);\n controller.enqueue(chunk);\n },\n close: handleClose,\n abort: handleAbort,\n }),\n )\n .catch((error) => {\n opts.onError?.({ error });\n handleAbort(error);\n });\n\n return [await headDeferred.promise] as const;\n}\n","import { Unpromise } from '../../vendor/unpromise';\nimport { getTRPCErrorFromUnknown } from '../error/TRPCError';\nimport { isAbortError } from '../http/abortError';\nimport type { MaybePromise } from '../types';\nimport { emptyObject, identity, run } from '../utils';\nimport type { EventSourceLike } from './sse.types';\nimport type { inferTrackedOutput } from './tracked';\nimport { isTrackedEnvelope } from './tracked';\nimport { takeWithGrace } from './utils/asyncIterable';\nimport { makeAsyncResource } from './utils/disposable';\nimport { readableStreamFrom } from './utils/readableStreamFrom';\nimport {\n disposablePromiseTimerResult,\n timerResource,\n} from './utils/timerResource';\nimport { PING_SYM, withPing } from './utils/withPing';\n\ntype Serialize = (value: any) => any;\ntype Deserialize = (value: any) => any;\n\n/**\n * @internal\n */\nexport interface SSEPingOptions {\n /**\n * Enable ping comments sent from the server\n * @default false\n */\n enabled: boolean;\n /**\n * Interval in milliseconds\n * @default 1000\n */\n intervalMs?: number;\n}\n\nexport interface SSEClientOptions {\n /**\n * Timeout and reconnect after inactivity in milliseconds\n * @default undefined\n */\n reconnectAfterInactivityMs?: number;\n}\n\nexport interface SSEStreamProducerOptions<TValue = unknown> {\n serialize?: Serialize;\n data: AsyncIterable<TValue>;\n\n maxDepth?: number;\n ping?: SSEPingOptions;\n /**\n * Maximum duration in milliseconds for the request before ending the stream\n * @default undefined\n */\n maxDurationMs?: number;\n /**\n * End the request immediately after data is sent\n * Only useful for serverless runtimes that do not support streaming responses\n * @default false\n */\n emitAndEndImmediately?: boolean;\n formatError?: (opts: { error: unknown }) => unknown;\n /**\n * Client-specific options - these will be sent to the client as part of the first message\n * @default {}\n */\n client?: SSEClientOptions;\n}\n\nconst PING_EVENT = 'ping';\nconst SERIALIZED_ERROR_EVENT = 'serialized-error';\nconst CONNECTED_EVENT = 'connected';\nconst RETURN_EVENT = 'return';\n\ninterface SSEvent {\n id?: string;\n data: unknown;\n comment?: string;\n event?: string;\n}\n/**\n *\n * @see https://html.spec.whatwg.org/multipage/server-sent-events.html\n */\nexport function sseStreamProducer<TValue = unknown>(\n opts: SSEStreamProducerOptions<TValue>,\n) {\n const { serialize = identity } = opts;\n\n const ping: Required<SSEPingOptions> = {\n enabled: opts.ping?.enabled ?? false,\n intervalMs: opts.ping?.intervalMs ?? 1000,\n };\n const client: SSEClientOptions = opts.client ?? {};\n\n if (\n ping.enabled &&\n client.reconnectAfterInactivityMs &&\n ping.intervalMs > client.reconnectAfterInactivityMs\n ) {\n throw new Error(\n `Ping interval must be less than client reconnect interval to prevent unnecessary reconnection - ping.intervalMs: ${ping.intervalMs} client.reconnectAfterInactivityMs: ${client.reconnectAfterInactivityMs}`,\n );\n }\n\n async function* generator(): AsyncIterable<SSEvent, void> {\n yield {\n event: CONNECTED_EVENT,\n data: JSON.stringify(client),\n };\n\n type TIteratorValue = Awaited<TValue> | typeof PING_SYM;\n\n let iterable: AsyncIterable<TValue | typeof PING_SYM> = opts.data;\n\n if (opts.emitAndEndImmediately) {\n iterable = takeWithGrace(iterable, {\n count: 1,\n gracePeriodMs: 1,\n });\n }\n\n if (ping.enabled && ping.intervalMs !== Infinity && ping.intervalMs > 0) {\n iterable = withPing(iterable, ping.intervalMs);\n }\n\n // We need those declarations outside the loop for garbage collection reasons. If they were\n // declared inside, they would not be freed until the next value is present.\n let value: null | TIteratorValue;\n let chunk: null | SSEvent;\n\n for await (value of iterable) {\n if (value === PING_SYM) {\n yield { event: PING_EVENT, data: '' };\n continue;\n }\n\n chunk = isTrackedEnvelope(value)\n ? { id: value[0], data: value[1] }\n : { data: value };\n\n chunk.data = JSON.stringify(serialize(chunk.data));\n\n yield chunk;\n\n // free up references for garbage collection\n value = null;\n chunk = null;\n }\n }\n\n async function* generatorWithErrorHandling(): AsyncIterable<SSEvent, void> {\n try {\n yield* generator();\n\n yield {\n event: RETURN_EVENT,\n data: '',\n };\n } catch (cause) {\n if (isAbortError(cause)) {\n // ignore abort errors, send any other errors\n return;\n }\n // `err` must be caused by `opts.data`, `JSON.stringify` or `serialize`.\n // So, a user error in any case.\n const error = getTRPCErrorFromUnknown(cause);\n const data = opts.formatError?.({ error }) ?? null;\n yield {\n event: SERIALIZED_ERROR_EVENT,\n data: JSON.stringify(serialize(data)),\n };\n }\n }\n\n const stream = readableStreamFrom(generatorWithErrorHandling());\n\n return stream\n .pipeThrough(\n new TransformStream({\n transform(chunk, controller: TransformStreamDefaultController<string>) {\n if ('event' in chunk) {\n controller.enqueue(`event: ${chunk.event}\\n`);\n }\n if ('data' in chunk) {\n controller.enqueue(`data: ${chunk.data}\\n`);\n }\n if ('id' in chunk) {\n controller.enqueue(`id: ${chunk.id}\\n`);\n }\n if ('comment' in chunk) {\n controller.enqueue(`: ${chunk.comment}\\n`);\n }\n controller.enqueue('\\n\\n');\n },\n }),\n )\n .pipeThrough(new TextEncoderStream());\n}\n\ninterface ConsumerStreamResultBase<TConfig extends ConsumerConfig> {\n eventSource: InstanceType<TConfig['EventSource']> | null;\n}\n\ninterface ConsumerStreamResultData<\n TConfig extends ConsumerConfig,\n> extends ConsumerStreamResultBase<TConfig> {\n type: 'data';\n data: inferTrackedOutput<TConfig['data']>;\n}\n\ninterface ConsumerStreamResultError<\n TConfig extends ConsumerConfig,\n> extends ConsumerStreamResultBase<TConfig> {\n type: 'serialized-error';\n error: TConfig['error'];\n}\n\ninterface ConsumerStreamResultConnecting<\n TConfig extends ConsumerConfig,\n> extends ConsumerStreamResultBase<TConfig> {\n type: 'connecting';\n event: EventSourceLike.EventOf<TConfig['EventSource']> | null;\n}\ninterface ConsumerStreamResultTimeout<\n TConfig extends ConsumerConfig,\n> extends ConsumerStreamResultBase<TConfig> {\n type: 'timeout';\n ms: number;\n}\ninterface ConsumerStreamResultPing<\n TConfig extends ConsumerConfig,\n> extends ConsumerStreamResultBase<TConfig> {\n type: 'ping';\n}\n\ninterface ConsumerStreamResultConnected<\n TConfig extends ConsumerConfig,\n> extends ConsumerStreamResultBase<TConfig> {\n type: 'connected';\n options: SSEClientOptions;\n}\n\ntype ConsumerStreamResult<TConfig extends ConsumerConfig> =\n | ConsumerStreamResultData<TConfig>\n | ConsumerStreamResultError<TConfig>\n | ConsumerStreamResultConnecting<TConfig>\n | ConsumerStreamResultTimeout<TConfig>\n | ConsumerStreamResultPing<TConfig>\n | ConsumerStreamResultConnected<TConfig>;\n\nexport interface SSEStreamConsumerOptions<TConfig extends ConsumerConfig> {\n url: () => MaybePromise<string>;\n init: () =>\n | MaybePromise<EventSourceLike.InitDictOf<TConfig['EventSource']>>\n | undefined;\n signal: AbortSignal;\n deserialize?: Deserialize;\n EventSource: TConfig['EventSource'];\n}\n\ninterface ConsumerConfig {\n data: unknown;\n error: unknown;\n EventSource: EventSourceLike.AnyConstructor;\n}\n\nasync function withTimeout<T>(opts: {\n promise: Promise<T>;\n timeoutMs: number;\n onTimeout: () => Promise<NoInfer<T>>;\n}): Promise<T> {\n using timeoutPromise = timerResource(opts.timeoutMs);\n const res = await Unpromise.race([opts.promise, timeoutPromise.start()]);\n\n if (res === disposablePromiseTimerResult) {\n return await opts.onTimeout();\n }\n return res;\n}\n\n/**\n * @see https://html.spec.whatwg.org/multipage/server-sent-events.html\n */\nexport function sseStreamConsumer<TConfig extends ConsumerConfig>(\n opts: SSEStreamConsumerOptions<TConfig>,\n): AsyncIterable<ConsumerStreamResult<TConfig>> {\n const { deserialize = (v) => v } = opts;\n\n let clientOptions: SSEClientOptions = emptyObject();\n\n const signal = opts.signal;\n\n let _es: InstanceType<TConfig['EventSource']> | null = null;\n\n const createStream = () =>\n new ReadableStream<ConsumerStreamResult<TConfig>>({\n async start(controller) {\n const [url, init] = await Promise.all([opts.url(), opts.init()]);\n const eventSource = (_es = new opts.EventSource(\n url,\n init,\n ) as InstanceType<TConfig['EventSource']>);\n\n controller.enqueue({\n type: 'connecting',\n eventSource: _es,\n event: null,\n });\n\n eventSource.addEventListener(CONNECTED_EVENT, (_msg) => {\n const msg = _msg as EventSourceLike.MessageEvent;\n\n const options: SSEClientOptions = JSON.parse(msg.data);\n\n clientOptions = options;\n controller.enqueue({\n type: 'connected',\n options,\n eventSource,\n });\n });\n\n eventSource.addEventListener(SERIALIZED_ERROR_EVENT, (_msg) => {\n const msg = _msg as EventSourceLike.MessageEvent;\n\n controller.enqueue({\n type: 'serialized-error',\n error: deserialize(JSON.parse(msg.data)),\n eventSource,\n });\n });\n eventSource.addEventListener(PING_EVENT, () => {\n controller.enqueue({\n type: 'ping',\n eventSource,\n });\n });\n eventSource.addEventListener(RETURN_EVENT, () => {\n eventSource.close();\n controller.close();\n _es = null;\n });\n eventSource.addEventListener('error', (event) => {\n if (eventSource.readyState === eventSource.CLOSED) {\n controller.error(event);\n } else {\n controller.enqueue({\n type: 'connecting',\n eventSource,\n event,\n });\n }\n });\n eventSource.addEventListener('message', (_msg) => {\n const msg = _msg as EventSourceLike.MessageEvent;\n\n const chunk = deserialize(JSON.parse(msg.data));\n\n const def: SSEvent = {\n data: chunk,\n };\n if (msg.lastEventId) {\n def.id = msg.lastEventId;\n }\n controller.enqueue({\n type: 'data',\n data: def as inferTrackedOutput<TConfig['data']>,\n eventSource,\n });\n });\n\n const onAbort = () => {\n try {\n eventSource.close();\n controller.close();\n } catch {\n // ignore errors in case the controller is already closed\n }\n };\n if (signal.aborted) {\n onAbort();\n } else {\n signal.addEventListener('abort', onAbort);\n }\n },\n cancel() {\n _es?.close();\n },\n });\n\n const getStreamResource = () => {\n let stream = createStream();\n let reader = stream.getReader();\n\n async function dispose() {\n await reader.cancel();\n _es = null;\n }\n\n return makeAsyncResource(\n {\n read() {\n return reader.read();\n },\n async recreate() {\n await dispose();\n\n stream = createStream();\n reader = stream.getReader();\n },\n },\n dispose,\n );\n };\n\n return run(async function* () {\n await using stream = getStreamResource();\n\n while (true) {\n let promise = stream.read();\n\n const timeoutMs = clientOptions.reconnectAfterInactivityMs;\n if (timeoutMs) {\n promise = withTimeout({\n promise,\n timeoutMs,\n onTimeout: async () => {\n const res: Awaited<typeof promise> = {\n value: {\n type: 'timeout',\n ms: timeoutMs,\n eventSource: _es,\n },\n done: false,\n };\n // Close and release old reader\n await stream.recreate();\n\n return res;\n },\n });\n }\n\n const result = await promise;\n\n if (result.done) {\n return result.value;\n }\n yield result.value;\n }\n });\n}\n\nexport const sseHeaders = {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache, no-transform',\n 'X-Accel-Buffering': 'no',\n Connection: 'keep-alive',\n} as const;\n","/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport {\n isObservable,\n observableToAsyncIterable,\n} from '../../observable/observable';\nimport { getErrorShape } from '../error/getErrorShape';\nimport { getTRPCErrorFromUnknown, TRPCError } from '../error/TRPCError';\nimport type { ProcedureType } from '../procedure';\nimport {\n type AnyRouter,\n type inferRouterContext,\n type inferRouterError,\n} from '../router';\nimport type { TRPCResponse } from '../rpc';\nimport { isPromise, jsonlStreamProducer } from '../stream/jsonl';\nimport { sseHeaders, sseStreamProducer } from '../stream/sse';\nimport { transformTRPCResponse } from '../transformer';\nimport {\n abortSignalsAnyPonyfill,\n isAsyncIterable,\n isObject,\n run,\n} from '../utils';\nimport { getAcceptHeader, getRequestInfo } from './contentType';\nimport { getHTTPStatusCode } from './getHTTPStatusCode';\nimport type {\n HTTPBaseHandlerOptions,\n ResolveHTTPRequestOptionsContextFn,\n TRPCRequestInfo,\n} from './types';\n\nfunction errorToAsyncIterable(err: TRPCError): AsyncIterable<never> {\n return run(async function* () {\n throw err;\n });\n}\ntype HTTPMethods =\n 'GET' | 'POST' | 'HEAD' | 'OPTIONS' | 'PUT' | 'DELETE' | 'PATCH';\n\nfunction combinedAbortController(signal: AbortSignal) {\n const controller = new AbortController();\n const combinedSignal = abortSignalsAnyPonyfill([signal, controller.signal]);\n return {\n signal: combinedSignal,\n controller,\n };\n}\n\nconst TYPE_ACCEPTED_METHOD_MAP: Record<ProcedureType, HTTPMethods[]> = {\n mutation: ['POST'],\n query: ['GET'],\n subscription: ['GET'],\n};\nconst TYPE_ACCEPTED_METHOD_MAP_WITH_METHOD_OVERRIDE: Record<\n ProcedureType,\n HTTPMethods[]\n> = {\n // never allow GET to do a mutation\n mutation: ['POST'],\n query: ['GET', 'POST'],\n subscription: ['GET', 'POST'],\n};\n\ninterface ResolveHTTPRequestOptions<\n TRouter extends AnyRouter,\n> extends HTTPBaseHandlerOptions<TRouter, Request> {\n createContext: ResolveHTTPRequestOptionsContextFn<TRouter>;\n req: Request;\n path: string;\n /**\n * If the request had an issue before reaching the handler\n */\n error: TRPCError | null;\n}\n\nfunction initResponse<TRouter extends AnyRouter, TRequest>(initOpts: {\n ctx: inferRouterContext<TRouter> | undefined;\n info: TRPCRequestInfo | undefined;\n responseMeta?: HTTPBaseHandlerOptions<TRouter, TRequest>['responseMeta'];\n untransformedJSON:\n | TRPCResponse<unknown, inferRouterError<TRouter>>\n | TRPCResponse<unknown, inferRouterError<TRouter>>[]\n | null;\n errors: TRPCError[];\n headers: Headers;\n}) {\n const {\n ctx,\n info,\n responseMeta,\n untransformedJSON,\n errors = [],\n headers,\n } = initOpts;\n\n let status = untransformedJSON ? getHTTPStatusCode(untransformedJSON) : 200;\n\n const eagerGeneration = !untransformedJSON;\n const data = eagerGeneration\n ? []\n : Array.isArray(untransformedJSON)\n ? untransformedJSON\n : [untransformedJSON];\n\n const meta =\n responseMeta?.({\n ctx,\n info,\n paths: info?.calls.map((call) => call.path),\n data,\n errors,\n eagerGeneration,\n type:\n info?.calls.find((call) => call.procedure?._def.type)?.procedure?._def\n .type ?? 'unknown',\n }) ?? {};\n\n if (meta.headers) {\n if (meta.headers instanceof Headers) {\n for (const [key, value] of meta.headers.entries()) {\n headers.append(key, value);\n }\n } else {\n /**\n * @deprecated, delete in v12\n */\n for (const [key, value] of Object.entries(meta.headers)) {\n if (Array.isArray(value)) {\n for (const v of value) {\n headers.append(key, v);\n }\n } else if (typeof value === 'string') {\n headers.set(key, value);\n }\n }\n }\n }\n if (meta.status) {\n status = meta.status;\n }\n\n return {\n status,\n };\n}\n\nfunction caughtErrorToData<TRouter extends AnyRouter>(\n cause: unknown,\n errorOpts: {\n opts: Pick<\n ResolveHTTPRequestOptions<TRouter>,\n 'onError' | 'req' | 'router'\n >;\n ctx: inferRouterContext<TRouter> | undefined;\n type: ProcedureType | 'unknown';\n path?: string;\n input?: unknown;\n },\n) {\n const { router, req, onError } = errorOpts.opts;\n const error = getTRPCErrorFromUnknown(cause);\n onError?.({\n error,\n path: errorOpts.path,\n input: errorOpts.input,\n ctx: errorOpts.ctx,\n type: errorOpts.type,\n req,\n });\n const untransformedJSON = {\n error: getErrorShape({\n config: router._def._config,\n error,\n type: errorOpts.type,\n path: errorOpts.path,\n input: errorOpts.input,\n ctx: errorOpts.ctx,\n }),\n };\n const transformedJSON = transformTRPCResponse(\n router._def._config,\n untransformedJSON,\n );\n const body = JSON.stringify(transformedJSON);\n return {\n error,\n untransformedJSON,\n body,\n };\n}\n\n/**\n * Check if a value is a stream-like object\n * - if it's an async iterable\n * - if it's an object with async iterables or promises\n */\nfunction isDataStream(v: unknown) {\n if (!isObject(v)) {\n return false;\n }\n\n if (isAsyncIterable(v)) {\n return true;\n }\n\n return (\n Object.values(v).some(isPromise) || Object.values(v).some(isAsyncIterable)\n );\n}\n\ntype ResultTuple<T> = [undefined, T] | [TRPCError, undefined];\n\nexport async function resolveResponse<TRouter extends AnyRouter>(\n opts: ResolveHTTPRequestOptions<TRouter>,\n): Promise<Response> {\n const { router, req } = opts;\n const headers = new Headers([['vary', 'trpc-accept, accept']]);\n const config = router._def._config;\n\n const url = new URL(req.url);\n\n if (req.method === 'HEAD') {\n // can be used for lambda warmup\n return new Response(null, {\n status: 204,\n });\n }\n\n const allowBatching = opts.allowBatching ?? opts.batching?.enabled ?? true;\n const allowMethodOverride =\n (opts.allowMethodOverride ?? false) && req.method === 'POST';\n\n type $Context = inferRouterContext<TRouter>;\n\n const infoTuple: ResultTuple<TRPCRequestInfo> = await run(async () => {\n try {\n return [\n undefined,\n await getRequestInfo({\n req,\n path: decodeURIComponent(opts.path),\n router,\n searchParams: url.searchParams,\n headers: opts.req.headers,\n url,\n maxBatchSize: opts.maxBatchSize,\n }),\n ];\n } catch (cause) {\n return [getTRPCErrorFromUnknown(cause), undefined];\n }\n });\n\n interface ContextManager {\n valueOrUndefined: () => $Context | undefined;\n value: () => $Context;\n create: (info: TRPCRequestInfo) => Promise<void>;\n }\n const ctxManager: ContextManager = run(() => {\n let result: ResultTuple<$Context> | undefined = undefined;\n return {\n valueOrUndefined: () => {\n if (!result) {\n return undefined;\n }\n return result[1];\n },\n value: () => {\n const [err, ctx] = result!;\n if (err) {\n throw err;\n }\n return ctx;\n },\n create: async (info) => {\n if (result) {\n throw new Error(\n 'This should only be called once - report a bug in tRPC',\n );\n }\n try {\n const ctx = await opts.createContext({\n info,\n });\n result = [undefined, ctx];\n } catch (cause) {\n result = [getTRPCErrorFromUnknown(cause), undefined];\n }\n },\n };\n });\n\n const methodMapper = allowMethodOverride\n ? TYPE_ACCEPTED_METHOD_MAP_WITH_METHOD_OVERRIDE\n : TYPE_ACCEPTED_METHOD_MAP;\n\n /**\n * @deprecated\n */\n const isStreamCall = getAcceptHeader(req.headers) === 'application/jsonl';\n\n const experimentalSSE = config.sse?.enabled ?? true;\n try {\n const [infoError, info] = infoTuple;\n if (infoError) {\n throw infoError;\n }\n if (info.isBatchCall && !allowBatching) {\n throw new TRPCError({\n code: 'BAD_REQUEST',\n message: `Batching is not enabled on the server`,\n });\n }\n /* istanbul ignore if -- @preserve */\n if (isStreamCall && !info.isBatchCall) {\n throw new TRPCError({\n message: `Streaming requests must be batched (you can do a batch of 1)`,\n code: 'BAD_REQUEST',\n });\n }\n await ctxManager.create(info);\n\n interface RPCResultOk {\n data: unknown;\n signal?: AbortSignal;\n }\n type RPCResult = ResultTuple<RPCResultOk>;\n const rpcCalls = info.calls.map(async (call): Promise<RPCResult> => {\n const proc = call.procedure;\n const combinedAbort = combinedAbortController(opts.req.signal);\n try {\n if (opts.error) {\n throw opts.error;\n }\n\n if (!proc) {\n throw new TRPCError({\n code: 'NOT_FOUND',\n message: `No procedure found on path \"${call.path}\"`,\n });\n }\n\n if (!methodMapper[proc._def.type].includes(req.method as HTTPMethods)) {\n throw new TRPCError({\n code: 'METHOD_NOT_SUPPORTED',\n message: `Unsupported ${req.method}-request to ${proc._def.type} procedure at path \"${call.path}\"`,\n });\n }\n\n if (proc._def.type === 'subscription') {\n /* istanbul ignore if -- @preserve */\n if (info.isBatchCall) {\n throw new TRPCError({\n code: 'BAD_REQUEST',\n message: `Cannot batch subscription calls`,\n });\n }\n\n if (config.sse?.maxDurationMs) {\n function cleanup() {\n clearTimeout(timer);\n combinedAbort.signal.removeEventListener('abort', cleanup);\n\n combinedAbort.controller.abort();\n }\n const timer = setTimeout(cleanup, config.sse.maxDurationMs);\n combinedAbort.signal.addEventListener('abort', cleanup);\n }\n }\n const data: unknown = await proc({\n path: call.path,\n getRawInput: call.getRawInput,\n ctx: ctxManager.value(),\n type: proc._def.type,\n signal: combinedAbort.signal,\n batchIndex: call.batchIndex,\n });\n return [\n undefined,\n {\n data,\n signal:\n proc._def.type === 'subscription'\n ? combinedAbort.signal\n : undefined,\n },\n ];\n } catch (cause) {\n const error = getTRPCErrorFromUnknown(cause);\n const input = call.result();\n\n opts.onError?.({\n error,\n path: call.path,\n input,\n ctx: ctxManager.valueOrUndefined(),\n type: call.procedure?._def.type ?? 'unknown',\n req: opts.req,\n });\n\n return [error, undefined];\n }\n });\n\n // ----------- response handlers -----------\n if (!info.isBatchCall) {\n const [call] = info.calls;\n const [error, result] = await rpcCalls[0]!;\n\n switch (info.type) {\n case 'unknown':\n case 'mutation':\n case 'query': {\n // httpLink\n headers.set('content-type', 'application/json');\n\n if (isDataStream(result?.data)) {\n throw new TRPCError({\n code: 'UNSUPPORTED_MEDIA_TYPE',\n message:\n 'Cannot use stream-like response in non-streaming request - use httpBatchStreamLink',\n });\n }\n const res: TRPCResponse<unknown, inferRouterError<TRouter>> = error\n ? {\n error: getErrorShape({\n config,\n ctx: ctxManager.valueOrUndefined(),\n error,\n input: call!.result(),\n path: call!.path,\n type: info.type,\n }),\n }\n : { result: { data: result.data } };\n\n const headResponse = initResponse({\n ctx: ctxManager.valueOrUndefined(),\n info,\n responseMeta: opts.responseMeta,\n errors: error ? [error] : [],\n headers,\n untransformedJSON: [res],\n });\n return new Response(\n JSON.stringify(transformTRPCResponse(config, res)),\n {\n status: headResponse.status,\n headers,\n },\n );\n }\n case 'subscription': {\n // httpSubscriptionLink\n\n const iterable: AsyncIterable<unknown> = run(() => {\n if (error) {\n return errorToAsyncIterable(error);\n }\n if (!experimentalSSE) {\n return errorToAsyncIterable(\n new TRPCError({\n code: 'METHOD_NOT_SUPPORTED',\n message: 'Missing experimental flag \"sseSubscriptions\"',\n }),\n );\n }\n\n if (!isObservable(result.data) && !isAsyncIterable(result.data)) {\n return errorToAsyncIterable(\n new TRPCError({\n message: `Subscription ${\n call!.path\n } did not return an observable or a AsyncGenerator`,\n code: 'INTERNAL_SERVER_ERROR',\n }),\n );\n }\n const dataAsIterable = isObservable(result.data)\n ? observableToAsyncIterable(result.data, opts.req.signal)\n : result.data;\n return dataAsIterable;\n });\n\n const stream = sseStreamProducer({\n ...config.sse,\n data: iterable,\n serialize: (v) => config.transformer.output.serialize(v),\n formatError(errorOpts) {\n const error = getTRPCErrorFromUnknown(errorOpts.error);\n const input = call?.result();\n const path = call?.path;\n const type = call?.procedure?._def.type ?? 'unknown';\n\n opts.onError?.({\n error,\n path,\n input,\n ctx: ctxManager.valueOrUndefined(),\n req: opts.req,\n type,\n });\n\n const shape = getErrorShape({\n config,\n ctx: ctxManager.valueOrUndefined(),\n error,\n input,\n path,\n type,\n });\n\n return shape;\n },\n });\n for (const [key, value] of Object.entries(sseHeaders)) {\n headers.set(key, value);\n }\n\n const headResponse = initResponse({\n ctx: ctxManager.valueOrUndefined(),\n info,\n responseMeta: opts.responseMeta,\n errors: [],\n headers,\n untransformedJSON: null,\n });\n\n const abortSignal = result?.signal;\n let responseBody: ReadableStream<Uint8Array> = stream;\n\n // Fixes: https://github.com/trpc/trpc/issues/7094\n if (abortSignal) {\n const reader = stream.getReader();\n const onAbort = () => void reader.cancel();\n if (abortSignal.aborted) {\n onAbort();\n } else {\n abortSignal.addEventListener('abort', onAbort, { once: true });\n }\n\n responseBody = new ReadableStream({\n async pull(controller) {\n const chunk = await reader.read();\n if (chunk.done) {\n abortSignal.removeEventListener('abort', onAbort);\n controller.close();\n } else {\n controller.enqueue(chunk.value);\n }\n },\n cancel() {\n abortSignal.removeEventListener('abort', onAbort);\n return reader.cancel();\n },\n });\n }\n\n return new Response(responseBody, {\n headers,\n status: headResponse.status,\n });\n }\n }\n }\n\n // batch response handlers\n if (info.accept === 'application/jsonl') {\n // httpBatchStreamLink\n headers.set('content-type', 'application/json');\n headers.set('transfer-encoding', 'chunked');\n const headResponse = initResponse({\n ctx: ctxManager.valueOrUndefined(),\n info,\n responseMeta: opts.responseMeta,\n errors: [],\n headers,\n untransformedJSON: null,\n });\n const stream = jsonlStreamProducer({\n ...config.jsonl,\n /**\n * Example structure for `maxDepth: 4`:\n * {\n * // 1\n * 0: {\n * // 2\n * result: {\n * // 3\n * data: // 4\n * }\n * }\n * }\n */\n maxDepth: Infinity,\n data: rpcCalls.map(async (res, index) => {\n const [error, result] = await res;\n\n const call = info.calls[index];\n\n if (error) {\n return {\n error: getErrorShape({\n config,\n ctx: ctxManager.valueOrUndefined(),\n error,\n input: call!.result(),\n path: call!.path,\n type: call!.procedure?._def.type ?? 'unknown',\n }),\n };\n }\n\n /**\n * Not very pretty, but we need to wrap nested data in promises\n * Our stream producer will only resolve top-level async values or async values that are directly nested in another async value\n */\n const iterable = isObservable(result.data)\n ? observableToAsyncIterable(result.data, opts.req.signal)\n : Promise.resolve(result.data);\n return {\n result: Promise.resolve({\n data: iterable,\n }),\n };\n }),\n serialize: (data) => config.transformer.output.serialize(data),\n onError: (cause) => {\n opts.onError?.({\n error: getTRPCErrorFromUnknown(cause.error),\n path: undefined,\n input: undefined,\n ctx: ctxManager.valueOrUndefined(),\n req: opts.req,\n type: info?.type ?? 'unknown',\n });\n },\n\n formatError(errorOpts) {\n const call = info?.calls[errorOpts.path[0] as any];\n\n const error = getTRPCErrorFromUnknown(errorOpts.error);\n const input = call?.result();\n const path = call?.path;\n const type = call?.procedure?._def.type ?? 'unknown';\n\n // no need to call `onError` here as it will be propagated through the stream itself\n\n const shape = getErrorShape({\n config,\n ctx: ctxManager.valueOrUndefined(),\n error,\n input,\n path,\n type,\n });\n\n return shape;\n },\n });\n\n return new Response(stream, {\n headers,\n status: headResponse.status,\n });\n }\n\n // httpBatchLink\n /**\n * Non-streaming response:\n * - await all responses in parallel, blocking on the slowest one\n * - create headers with known response body\n * - return a complete HTTPResponse\n */\n headers.set('content-type', 'application/json');\n const results: RPCResult[] = (await Promise.all(rpcCalls)).map(\n (res): RPCResult => {\n const [error, result] = res;\n if (error) {\n return res;\n }\n\n if (isDataStream(result.data)) {\n return [\n new TRPCError({\n code: 'UNSUPPORTED_MEDIA_TYPE',\n message:\n 'Cannot use stream-like response in non-streaming request - use httpBatchStreamLink',\n }),\n undefined,\n ];\n }\n return res;\n },\n );\n const resultAsRPCResponse = results.map(\n (\n [error, result],\n index,\n ): TRPCResponse<unknown, inferRouterError<TRouter>> => {\n const call = info.calls[index]!;\n if (error) {\n return {\n error: getErrorShape({\n config,\n ctx: ctxManager.valueOrUndefined(),\n error,\n input: call.result(),\n path: call.path,\n type: call.procedure?._def.type ?? 'unknown',\n }),\n };\n }\n return {\n result: { data: result.data },\n };\n },\n );\n\n const errors = results\n .map(([error]) => error)\n .filter(Boolean) as TRPCError[];\n\n const headResponse = initResponse({\n ctx: ctxManager.valueOrUndefined(),\n info,\n responseMeta: opts.responseMeta,\n untransformedJSON: resultAsRPCResponse,\n errors,\n headers,\n });\n\n return new Response(\n JSON.stringify(transformTRPCResponse(config, resultAsRPCResponse)),\n {\n status: headResponse.status,\n headers,\n },\n );\n } catch (cause) {\n const [_infoError, info] = infoTuple;\n const ctx = ctxManager.valueOrUndefined();\n // we get here if\n // - batching is called when it's not enabled\n // - `createContext()` throws\n // - `router._def._config.transformer.output.serialize()` throws\n // - post body is too large\n // - input deserialization fails\n // - `errorFormatter` return value is malformed\n const { error, untransformedJSON, body } = caughtErrorToData(cause, {\n opts,\n ctx: ctxManager.valueOrUndefined(),\n type: info?.type ?? 'unknown',\n });\n\n const headResponse = initResponse({\n ctx,\n info,\n responseMeta: opts.responseMeta,\n untransformedJSON,\n errors: [error],\n headers,\n });\n\n return new Response(body, {\n status: headResponse.status,\n headers,\n });\n }\n}\n"],"mappings":"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"}