{"version":3,"file":"index.mjs","names":[],"sources":["../../../src/adapters/fetch/fetchRequestHandler.ts"],"sourcesContent":["/**\n * If you're making an adapter for tRPC and looking at this file for reference, you should import types and functions from `@trpc/server` and `@trpc/server/http`\n *\n * @example\n * ```ts\n * import type { AnyTRPCRouter } from '@trpc/server'\n * import type { HTTPBaseHandlerOptions } from '@trpc/server/http'\n * ```\n */\n// @trpc/server\n\nimport type { AnyRouter } from '../../@trpc/server';\nimport type { ResolveHTTPRequestOptionsContextFn } from '../../@trpc/server/http';\nimport { resolveResponse } from '../../@trpc/server/http';\nimport type { FetchHandlerRequestOptions } from './types';\n\nconst trimSlashes = (path: string): string => {\n  path = path.startsWith('/') ? path.slice(1) : path;\n  path = path.endsWith('/') ? path.slice(0, -1) : path;\n\n  return path;\n};\n\nexport async function fetchRequestHandler<TRouter extends AnyRouter>(\n  opts: FetchHandlerRequestOptions<TRouter>,\n): Promise<Response> {\n  const resHeaders = new Headers();\n\n  const createContext: ResolveHTTPRequestOptionsContextFn<TRouter> = async (\n    innerOpts,\n  ) => {\n    return opts.createContext?.({ req: opts.req, resHeaders, ...innerOpts });\n  };\n\n  const url = new URL(opts.req.url);\n\n  const pathname = trimSlashes(url.pathname);\n  const endpoint = trimSlashes(opts.endpoint);\n  const path = trimSlashes(pathname.slice(endpoint.length));\n\n  return await resolveResponse({\n    ...opts,\n    req: opts.req,\n    createContext,\n    path,\n    error: null,\n    onError(o) {\n      opts?.onError?.({ ...o, req: opts.req });\n    },\n    responseMeta(data) {\n      const meta = opts.responseMeta?.(data);\n\n      if (meta?.headers) {\n        if (meta.headers instanceof Headers) {\n          for (const [key, value] of meta.headers.entries()) {\n            resHeaders.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                resHeaders.append(key, v);\n              }\n            } else if (typeof value === 'string') {\n              resHeaders.set(key, value);\n            }\n          }\n        }\n      }\n\n      return {\n        headers: resHeaders,\n        status: meta?.status,\n      };\n    },\n  });\n}\n"],"mappings":";;;AAgBA,MAAM,eAAe,SAAyB;CAC5C,OAAO,KAAK,WAAW,GAAG,IAAI,KAAK,MAAM,CAAC,IAAI;CAC9C,OAAO,KAAK,SAAS,GAAG,IAAI,KAAK,MAAM,GAAG,EAAE,IAAI;CAEhD,OAAO;AACT;AAEA,eAAsB,oBACpB,MACmB;CACnB,MAAM,aAAa,IAAI,QAAQ;CAE/B,MAAM,gBAA6D,OACjE,cACG;;EACH,QAAA,sBAAO,KAAK,mBAAA,QAAA,wBAAA,KAAA,IAAA,KAAA,IAAA,oBAAA,KAAA,MAAA,eAAA;GAAkB,KAAK,KAAK;GAAK;EAAe,GAAA,SAAU,CAAC;CACzE;CAEA,MAAM,MAAM,IAAI,IAAI,KAAK,IAAI,GAAG;CAEhC,MAAM,WAAW,YAAY,IAAI,QAAQ;CACzC,MAAM,WAAW,YAAY,KAAK,QAAQ;CAC1C,MAAM,OAAO,YAAY,SAAS,MAAM,SAAS,MAAM,CAAC;CAExD,OAAO,MAAM,gBAAA,eAAA,eAAA,CAAA,GACR,IAAA,GAAA,CAAA,GAAA;EACH,KAAK,KAAK;EACV;EACA;EACA,OAAO;EACP,QAAQ,GAAG;;GACT,SAAA,QAAA,SAAA,KAAA,MAAA,gBAAA,KAAM,aAAA,QAAA,kBAAA,KAAA,KAAA,cAAA,KAAA,MAAA,eAAA,eAAA,CAAA,GAAe,CAAA,GAAA,CAAA,GAAA,EAAG,KAAK,KAAK,IAAA,CAAI,CAAC;EACzC;EACA,aAAa,MAAM;;GACjB,MAAM,QAAA,qBAAO,KAAK,kBAAA,QAAA,uBAAA,KAAA,IAAA,KAAA,IAAA,mBAAA,KAAA,MAAe,IAAI;GAErC,IAAA,SAAA,QAAA,SAAA,KAAA,IAAA,KAAA,IAAI,KAAM,SAAS;IACjB,IAAI,KAAK,mBAAmB,SAC1B,KAAK,MAAM,CAAC,KAAK,UAAU,KAAK,QAAQ,QAAQ,GAC9C,WAAW,OAAO,KAAK,KAAK;;;;;IAM9B,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,OAAO,GACpD,IAAI,MAAM,QAAQ,KAAK,GACrB,KAAK,MAAM,KAAK,OACd,WAAW,OAAO,KAAK,CAAC;SAErB,IAAI,OAAO,UAAU,UAC1B,WAAW,IAAI,KAAK,KAAK;GAIjC;GAEA,OAAO;IACL,SAAS;IACT,QAAA,SAAA,QAAA,SAAA,KAAA,IAAA,KAAA,IAAQ,KAAM;GAChB;EACF;CACF,CAAA,CAAC;AACH"}