{"version":3,"sources":["../../../../src/server/web/sandbox/sandbox.ts"],"sourcesContent":["import type { NodejsRequestData, FetchEventResult } from '../types'\nimport type { EdgeFunctionDefinition } from '../../../build/webpack/plugins/middleware-plugin'\nimport type { EdgeRuntime } from 'next/dist/compiled/edge-runtime'\nimport {\n  getModuleContext,\n  requestStore,\n  edgeSandboxNextRequestContext,\n} from './context'\nimport { requestToBodyStream } from '../../body-streams'\nimport type { ServerComponentsHmrCache } from '../../response-cache'\nimport {\n  getBuiltinRequestContext,\n  type BuiltinRequestContextValue,\n} from '../../after/builtin-request-context'\nimport {\n  RouterServerContextSymbol,\n  routerServerGlobal,\n} from '../../lib/router-utils/router-server-context'\nimport type { EdgeHandler } from '../adapter'\n\nexport const ErrorSource = Symbol('SandboxError')\n\nconst FORBIDDEN_HEADERS = [\n  'content-length',\n  'content-encoding',\n  'transfer-encoding',\n]\n\ninterface RunnerFnParams {\n  name: string\n  onError?: (err: unknown) => void\n  onWarning?: (warn: Error) => void\n  paths: string[]\n  request: NodejsRequestData\n  useCache: boolean\n  edgeFunctionEntry: Pick<EdgeFunctionDefinition, 'assets' | 'wasm' | 'env'>\n  distDir: string\n  incrementalCache?: any\n  serverComponentsHmrCache?: ServerComponentsHmrCache\n  clientAssetToken: string\n}\n\ntype RunnerFn = (params: RunnerFnParams) => Promise<FetchEventResult>\n\n/**\n * Decorates the runner function making sure all errors it can produce are\n * tagged with `edge-server` so they can properly be rendered in dev.\n */\nfunction withTaggedErrors(fn: RunnerFn): RunnerFn {\n  if (process.env.NODE_ENV === 'development') {\n    const { getServerError } =\n      require('../../dev/node-stack-frames') as typeof import('../../dev/node-stack-frames')\n\n    return (params) =>\n      fn(params)\n        .then((result) => ({\n          ...result,\n          waitUntil: result?.waitUntil?.catch((error) => {\n            // TODO: used COMPILER_NAMES.edgeServer instead. Verify that it does not increase the runtime size.\n            throw getServerError(error, 'edge-server')\n          }),\n        }))\n        .catch((error) => {\n          // TODO: used COMPILER_NAMES.edgeServer instead\n          throw getServerError(error, 'edge-server')\n        })\n  }\n\n  return fn\n}\n\nexport async function getRuntimeContext(\n  params: Omit<RunnerFnParams, 'request'>\n): Promise<EdgeRuntime<any>> {\n  const { runtime, evaluateInContext } = await getModuleContext({\n    moduleName: params.name,\n    onWarning: params.onWarning ?? (() => {}),\n    onError: params.onError ?? (() => {}),\n    useCache: params.useCache !== false,\n    edgeFunctionEntry: params.edgeFunctionEntry,\n    distDir: params.distDir,\n  })\n\n  if (params.incrementalCache) {\n    runtime.context.globalThis.__incrementalCacheShared = true\n    runtime.context.globalThis.__incrementalCache = params.incrementalCache\n  }\n\n  // expose router server context for access to dev handlers like\n  // logErrorWithOriginalStack\n  ;(runtime.context.globalThis as any as typeof routerServerGlobal)[\n    RouterServerContextSymbol\n  ] = routerServerGlobal[RouterServerContextSymbol]\n\n  if (params.serverComponentsHmrCache) {\n    runtime.context.globalThis.__serverComponentsHmrCache =\n      params.serverComponentsHmrCache\n  }\n\n  if (params.clientAssetToken) {\n    runtime.context.globalThis.NEXT_CLIENT_ASSET_SUFFIX =\n      params.clientAssetToken ? `?dpl=${params.clientAssetToken}` : ''\n  }\n\n  for (const paramPath of params.paths) {\n    evaluateInContext(paramPath)\n  }\n  return runtime\n}\n\nexport const run = withTaggedErrors(async function runWithTaggedErrors(params) {\n  const runtime = await getRuntimeContext(params)\n\n  const edgeFunction: EdgeHandler = (\n    await runtime.context._ENTRIES[`middleware_${params.name}`]\n  ).default\n\n  const cloned = !['HEAD', 'GET'].includes(params.request.method)\n    ? params.request.body?.cloneBodyStream()\n    : undefined\n\n  const KUint8Array = runtime.evaluate('Uint8Array')\n  const urlInstance = new URL(params.request.url)\n\n  params.request.url = urlInstance.toString()\n\n  const headers = new Headers()\n  for (const [key, value] of Object.entries(params.request.headers)) {\n    headers.set(key, value?.toString() ?? '')\n  }\n\n  try {\n    let result: FetchEventResult | undefined = undefined\n    const builtinRequestCtx: BuiltinRequestContextValue = {\n      ...getBuiltinRequestContext(),\n      // FIXME(after):\n      // arguably, this is an abuse of \"@next/request-context\" --\n      // it'd make more sense to simply forward its existing value into the sandbox (in `createModuleContext`)\n      // but here we're using it to just pass in `waitUntil` regardless if we were running in this context or not.\n      waitUntil: params.request.waitUntil,\n    }\n    await edgeSandboxNextRequestContext.run(builtinRequestCtx, () =>\n      requestStore.run({ headers }, async () => {\n        result = await edgeFunction({\n          request: {\n            ...params.request,\n            body:\n              cloned &&\n              requestToBodyStream(runtime.context, KUint8Array, cloned),\n          },\n        })\n        for (const headerName of FORBIDDEN_HEADERS) {\n          result.response.headers.delete(headerName)\n        }\n      })\n    )\n\n    if (!result) throw new Error('Edge function did not return a response')\n    return result\n  } finally {\n    await params.request.body?.finalize()\n  }\n})\n"],"names":["ErrorSource","getRuntimeContext","run","Symbol","FORBIDDEN_HEADERS","withTaggedErrors","fn","process","env","NODE_ENV","getServerError","require","params","then","result","waitUntil","catch","error","runtime","evaluateInContext","getModuleContext","moduleName","name","onWarning","onError","useCache","edgeFunctionEntry","distDir","incrementalCache","context","globalThis","__incrementalCacheShared","__incrementalCache","RouterServerContextSymbol","routerServerGlobal","serverComponentsHmrCache","__serverComponentsHmrCache","clientAssetToken","NEXT_CLIENT_ASSET_SUFFIX","paramPath","paths","runWithTaggedErrors","edgeFunction","_ENTRIES","default","cloned","includes","request","method","body","cloneBodyStream","undefined","KUint8Array","evaluate","urlInstance","URL","url","toString","headers","Headers","key","value","Object","entries","set","builtinRequestCtx","getBuiltinRequestContext","edgeSandboxNextRequestContext","requestStore","requestToBodyStream","headerName","response","delete","Error","finalize"],"mappings":"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","ignoreList":[0]}