UNPKG

@trpc/server

Version:

The tRPC server library

1 lines • 128 kB
{"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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"}