{"version":3,"file":"index.mjs","names":["createReactRouterRequestHandler"],"sources":["../src/binaryTypes.ts","../src/adapters/host.ts","../src/adapters/api-gateway-v1.ts","../src/adapters/api-gateway-v2.ts","../src/adapters/application-load-balancer.ts","../src/adapters/function-url-streaming.ts","../src/server.ts"],"sourcesContent":["// TODO: check if we can replace this with https://www.npmjs.com/package/mime-types\n\n/**\n * Common binary MIME types\n * @see https://github.com/architect/functions/blob/45254fc1936a1794c185aac07e9889b241a2e5c6/src/http/helpers/binary-types.js\n */\nconst binaryTypes = [\n  \"application/octet-stream\",\n  // Docs\n  \"application/epub+zip\",\n  \"application/msword\",\n  \"application/pdf\",\n  \"application/rtf\",\n  \"application/vnd.amazon.ebook\",\n  \"application/vnd.ms-excel\",\n  \"application/vnd.ms-powerpoint\",\n  \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n  \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n  \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n  // Fonts\n  \"font/otf\",\n  \"font/woff\",\n  \"font/woff2\",\n  // Images\n  \"image/avif\",\n  \"image/bmp\",\n  \"image/gif\",\n  \"image/jpeg\",\n  \"image/png\",\n  \"image/tiff\",\n  \"image/vnd.microsoft.icon\",\n  \"image/webp\",\n  // Audio\n  \"audio/3gpp\",\n  \"audio/aac\",\n  \"audio/basic\",\n  \"audio/mpeg\",\n  \"audio/ogg\",\n  \"audio/wav\",\n  \"audio/webm\",\n  \"audio/x-aiff\",\n  \"audio/x-midi\",\n  \"audio/x-wav\",\n  // Video\n  \"video/3gpp\",\n  \"video/mp2t\",\n  \"video/mpeg\",\n  \"video/ogg\",\n  \"video/quicktime\",\n  \"video/webm\",\n  \"video/x-msvideo\",\n  // Archives\n  \"application/java-archive\",\n  \"application/vnd.apple.installer+xml\",\n  \"application/x-7z-compressed\",\n  \"application/x-apple-diskimage\",\n  \"application/x-bzip\",\n  \"application/x-bzip2\",\n  \"application/x-gzip\",\n  \"application/x-java-archive\",\n  \"application/x-rar-compressed\",\n  \"application/x-tar\",\n  \"application/x-zip\",\n  \"application/zip\",\n];\n\nexport function isBinaryType(contentType: string | null | undefined): boolean {\n  if (!contentType) {\n    return false;\n  }\n  const [test] = contentType.split(\";\");\n  return binaryTypes.includes(test);\n}\n","/**\n * Resolves the host used to build the `Request` URL from a raw host value\n * (e.g. an API Gateway request-context domain name, or a `Host`/forwarded\n * header).\n *\n * React Router derives the host for its built-in cross-origin (CSRF) check on\n * action requests from `new URL(request.url).host`, so the host constructed\n * here must be trustworthy and well-formed. Invalid characters are stripped and\n * the port is validated to avoid constructing a malformed URL (or leaking a\n * spoofed host) from a garbled header value.\n *\n * Mirrors the hardening done by the upstream `@react-router/architect` adapter.\n */\nexport function resolveHost(rawHost: string | undefined | null): string {\n  const [rawHostname = \"\", portStr] = (rawHost ?? \"\").split(\":\");\n  const hostname = rawHostname.split(/[\\\\/?#@]/)[0] || \"localhost\";\n  const hostPort = Number.parseInt(portStr ?? \"\", 10);\n  const port = Number.isSafeInteger(hostPort) ? hostPort : undefined;\n  return `${hostname}${port ? `:${port}` : \"\"}`;\n}\n","import { readableStreamToString } from \"@react-router/node\";\nimport type { APIGatewayProxyEvent, APIGatewayProxyEventHeaders, APIGatewayProxyResult } from \"aws-lambda\";\nimport { URLSearchParams } from \"url\";\n\nimport { isBinaryType } from \"../binaryTypes\";\nimport { resolveHost } from \"./host\";\nimport type { GetHostFunction, ReactRouterAdapter } from \"./index\";\n\nfunction createReactRouterRequestAPIGatewayV1(\n  event: APIGatewayProxyEvent,\n  getHost?: GetHostFunction<APIGatewayProxyEvent>,\n): Request {\n  const rawHost = getHost?.(event) ?? event.requestContext.domainName;\n  const host = resolveHost(rawHost);\n  const scheme = event.headers[\"x-forwarded-proto\"] || \"http\";\n\n  const rawQueryString = new URLSearchParams(event.queryStringParameters as Record<string, string>).toString();\n  const search = rawQueryString.length > 0 ? `?${rawQueryString}` : \"\";\n  const url = new URL(event.path + search, `${scheme}://${host}`);\n\n  const isFormData = event.headers[\"content-type\"]?.includes(\"multipart/form-data\");\n  // Note: No current way to abort these for AWS, but our router expects\n  // requests to contain a signal, so it can detect aborted requests\n  const controller = new AbortController();\n\n  return new Request(url.href, {\n    method: event.requestContext.httpMethod,\n    headers: createReactRouterHeadersAPIGatewayV1(event.headers),\n    signal: controller.signal,\n    body:\n      event.body && event.isBase64Encoded\n        ? isFormData\n          ? Buffer.from(event.body, \"base64\")\n          : Buffer.from(event.body, \"base64\").toString()\n        : event.body || undefined,\n  });\n}\n\nfunction createReactRouterHeadersAPIGatewayV1(requestHeaders: APIGatewayProxyEventHeaders): Headers {\n  const headers = new Headers();\n\n  for (const [header, value] of Object.entries(requestHeaders)) {\n    if (value) {\n      headers.append(header, value);\n    }\n  }\n\n  return headers;\n}\n\nasync function sendReactRouterResponseAPIGatewayV1(nodeResponse: Response): Promise<APIGatewayProxyResult> {\n  const contentType = nodeResponse.headers.get(\"Content-Type\");\n  const isBase64Encoded = isBinaryType(contentType);\n  let body: string | undefined;\n\n  if (nodeResponse.body) {\n    if (isBase64Encoded) {\n      body = await readableStreamToString(nodeResponse.body, \"base64\");\n    } else {\n      body = await nodeResponse.text();\n    }\n  }\n\n  return {\n    statusCode: nodeResponse.status,\n    headers: Object.fromEntries(nodeResponse.headers.entries()),\n    body: body || \"\",\n    isBase64Encoded,\n  };\n}\n\nexport type ApiGatewayV1Adapter = ReactRouterAdapter<APIGatewayProxyEvent, APIGatewayProxyResult>;\n\nexport const apiGatewayV1Adapter: ApiGatewayV1Adapter = {\n  wrapHandler: (handler) => (e) => handler(e),\n  createReactRouterRequest: createReactRouterRequestAPIGatewayV1,\n  sendReactRouterResponse: sendReactRouterResponseAPIGatewayV1,\n};\n","import { readableStreamToString } from \"@react-router/node\";\nimport type {\n  APIGatewayProxyEventHeaders,\n  APIGatewayProxyEventV2,\n  APIGatewayProxyStructuredResultV2,\n} from \"aws-lambda\";\n\nimport { isBinaryType } from \"../binaryTypes\";\nimport { resolveHost } from \"./host\";\nimport type { GetHostFunction, ReactRouterAdapter } from \"./index\";\n\nexport function createReactRouterRequestAPIGateywayV2(\n  event: APIGatewayProxyEventV2,\n  getHost?: GetHostFunction<APIGatewayProxyEventV2>,\n): Request {\n  const rawHost = getHost?.(event) ?? event.requestContext.domainName;\n  const host = resolveHost(rawHost);\n  const search = event.rawQueryString.length ? `?${event.rawQueryString}` : \"\";\n  const scheme = event.headers[\"x-forwarded-proto\"] || \"http\";\n\n  const url = new URL(event.rawPath + search, `${scheme}://${host}`);\n  const isFormData = event.headers[\"content-type\"]?.includes(\"multipart/form-data\");\n  // Note: No current way to abort these for AWS, but our router expects\n  // requests to contain a signal, so it can detect aborted requests\n  const controller = new AbortController();\n\n  return new Request(url.href, {\n    method: event.requestContext.http.method,\n    headers: createReactRouterHeadersAPIGatewayV2(event.headers, event.cookies),\n    signal: controller.signal,\n    body:\n      event.body && event.isBase64Encoded\n        ? isFormData\n          ? Buffer.from(event.body, \"base64\")\n          : Buffer.from(event.body, \"base64\").toString()\n        : event.body,\n  });\n}\n\nfunction createReactRouterHeadersAPIGatewayV2(\n  requestHeaders: APIGatewayProxyEventHeaders,\n  requestCookies?: string[],\n): Headers {\n  const headers = new Headers();\n\n  for (const [header, value] of Object.entries(requestHeaders)) {\n    if (value) {\n      headers.append(header, value);\n    }\n  }\n\n  if (requestCookies) {\n    headers.append(\"Cookie\", requestCookies.join(\"; \"));\n  }\n\n  return headers;\n}\n\nexport function extractAPIGatewayV2ResponseMetadata(nodeResponse: Response): {\n  statusCode: number;\n  headers: Record<string, string>;\n  cookies: string[];\n} {\n  // AWS API Gateway will send back set-cookies outside of response headers.\n  const cookies = nodeResponse.headers.getSetCookie();\n  if (cookies.length) {\n    nodeResponse.headers.delete(\"Set-Cookie\");\n  }\n\n  return {\n    statusCode: nodeResponse.status,\n    headers: Object.fromEntries(nodeResponse.headers.entries()),\n    cookies,\n  };\n}\n\nasync function sendReactRouterResponseAPIGatewayV2(nodeResponse: Response): Promise<APIGatewayProxyStructuredResultV2> {\n  const result: APIGatewayProxyStructuredResultV2 = extractAPIGatewayV2ResponseMetadata(nodeResponse);\n\n  const contentType = nodeResponse.headers.get(\"Content-Type\");\n\n  result.isBase64Encoded = isBinaryType(contentType);\n\n  if (nodeResponse.body) {\n    if (result.isBase64Encoded) {\n      result.body = await readableStreamToString(nodeResponse.body, \"base64\");\n    } else {\n      result.body = await nodeResponse.text();\n    }\n  }\n\n  return result;\n}\n\nexport type ApiGatewayV2Adapter = ReactRouterAdapter<APIGatewayProxyEventV2, APIGatewayProxyStructuredResultV2>;\n\nexport const apiGatewayV2Adapter: ApiGatewayV2Adapter = {\n  wrapHandler: (handler) => (e) => handler(e),\n  createReactRouterRequest: createReactRouterRequestAPIGateywayV2,\n  sendReactRouterResponse: sendReactRouterResponseAPIGatewayV2,\n};\n","import { readableStreamToString } from \"@react-router/node\";\nimport type { ALBEvent, ALBEventHeaders, ALBResult } from \"aws-lambda\";\nimport { URLSearchParams } from \"url\";\n\nimport { isBinaryType } from \"../binaryTypes\";\nimport { resolveHost } from \"./host\";\nimport type { GetHostFunction, ReactRouterAdapter } from \"./index\";\n\nfunction createReactRouterRequestALB(event: ALBEvent, getHost?: GetHostFunction<ALBEvent>): Request {\n  const headers = event?.headers || {};\n  const host = resolveHost(getHost?.(event) ?? headers.host ?? headers.Host);\n  const scheme = headers[\"x-forwarded-proto\"] || \"http\";\n\n  const rawQueryString = new URLSearchParams(event.queryStringParameters as Record<string, string>).toString();\n  const search = rawQueryString.length > 0 ? `?${rawQueryString}` : \"\";\n  const url = new URL(event.path + search, `${scheme}://${host}`);\n\n  const isFormData = headers[\"content-type\"]?.includes(\"multipart/form-data\");\n\n  // Note: No current way to abort these for AWS, but our router expects\n  // requests to contain a signal, so it can detect aborted requests\n  const controller = new AbortController();\n\n  return new Request(url.href, {\n    method: event.httpMethod,\n    headers: createReactRouterHeadersALB(headers),\n    signal: controller.signal,\n    body:\n      event.body && event.isBase64Encoded\n        ? isFormData\n          ? Buffer.from(event.body, \"base64\")\n          : Buffer.from(event.body, \"base64\").toString()\n        : event.body || undefined,\n  });\n}\n\nfunction createReactRouterHeadersALB(requestHeaders: ALBEventHeaders): Headers {\n  const headers = new Headers();\n\n  for (const [header, value] of Object.entries(requestHeaders)) {\n    if (value) {\n      headers.append(header, value);\n    }\n  }\n\n  return headers;\n}\n\nasync function sendReactRouterResponseALB(nodeResponse: Response): Promise<ALBResult> {\n  const contentType = nodeResponse.headers.get(\"Content-Type\");\n  const isBase64Encoded = isBinaryType(contentType);\n  let body: string | undefined;\n\n  if (nodeResponse.body) {\n    if (isBase64Encoded) {\n      body = await readableStreamToString(nodeResponse.body, \"base64\");\n    } else {\n      body = await nodeResponse.text();\n    }\n  }\n\n  return {\n    statusCode: nodeResponse.status,\n    headers: Object.fromEntries(nodeResponse.headers.entries()),\n    body: body || \"\",\n    isBase64Encoded,\n  };\n}\n\nexport type ApplicationLoadBalancerAdapter = ReactRouterAdapter<ALBEvent, ALBResult>;\n\nexport const applicationLoadBalancerAdapter: ApplicationLoadBalancerAdapter = {\n  wrapHandler: (handler) => (e) => handler(e),\n  createReactRouterRequest: createReactRouterRequestALB,\n  sendReactRouterResponse: sendReactRouterResponseALB,\n};\n","import { writeReadableStreamToWritable } from \"@react-router/node\";\nimport type { LambdaFunctionURLEvent } from \"aws-lambda\";\nimport type { StreamifyHandler } from \"aws-lambda/handler\";\n\nimport { createReactRouterRequestAPIGateywayV2, extractAPIGatewayV2ResponseMetadata } from \"./api-gateway-v2\";\nimport type { ReactRouterAdapter } from \"./index\";\n\nconst emptyStream = () =>\n  new ReadableStream({\n    start(controller) {\n      controller.enqueue(\"\");\n      controller.close();\n    },\n  });\n\nconst sendReactRouterResponseFunctionUrlStreaming = async (\n  response: Response,\n  responseStream: awslambda.HttpResponseStream,\n) => {\n  const metadata = extractAPIGatewayV2ResponseMetadata(response);\n\n  let body = response.body;\n  if (!body) {\n    // Function URL needs a write to happen on the stream, otherwise it won't send headers.\n    // See https://github.com/fastify/aws-lambda-fastify/issues/154#issuecomment-2614521719\n    body = emptyStream();\n  }\n\n  const httpResponseStream = awslambda.HttpResponseStream.from(responseStream, metadata);\n\n  await writeReadableStreamToWritable(body, httpResponseStream);\n};\n\nexport type FunctionUrlStreamingAdapter = ReactRouterAdapter<\n  LambdaFunctionURLEvent,\n  void,\n  awslambda.HttpResponseStream,\n  StreamifyHandler<LambdaFunctionURLEvent, void>\n>;\n\nexport const functionUrlStreamingAdapter: FunctionUrlStreamingAdapter = {\n  wrapHandler: awslambda.streamifyResponse,\n  createReactRouterRequest: createReactRouterRequestAPIGateywayV2,\n  sendReactRouterResponse: sendReactRouterResponseFunctionUrlStreaming,\n};\n","import type {\n  ALBEvent,\n  ALBHandler,\n  APIGatewayProxyEvent,\n  APIGatewayProxyEventV2,\n  APIGatewayProxyHandler,\n  APIGatewayProxyHandlerV2,\n  LambdaFunctionURLEvent,\n  LambdaFunctionURLHandler,\n} from \"aws-lambda\";\nimport type { StreamifyHandler } from \"aws-lambda/handler\";\nimport {\n  createRequestHandler as createReactRouterRequestHandler,\n  type RouterContextProvider,\n  type ServerBuild,\n} from \"react-router\";\n\nimport type { GetHostFunction, ReactRouterAdapter } from \"./adapters\";\nimport { apiGatewayV1Adapter } from \"./adapters/api-gateway-v1\";\nimport { apiGatewayV2Adapter } from \"./adapters/api-gateway-v2\";\nimport { applicationLoadBalancerAdapter } from \"./adapters/application-load-balancer\";\nimport { functionUrlStreamingAdapter } from \"./adapters/function-url-streaming\";\n\ntype MaybePromise<T> = T | Promise<T>;\n\n/**\n * A function that returns the value to use as `context` in route `loader` and\n * `action` functions.\n *\n * You can think of this as an escape hatch that allows you to pass\n * environment/platform-specific values through to your loader/action.\n */\nexport type GetLoadContextFunction<E> = (event: E) => MaybePromise<RouterContextProvider>;\n\nexport type CreateRequestHandlerArgs<T> = {\n  build: ServerBuild;\n  getLoadContext?: GetLoadContextFunction<T>;\n  mode?: string;\n  /**\n   * Override how the host for the request URL is derived from the Lambda event.\n   *\n   * React Router uses the request URL host (`new URL(request.url).host`) for its\n   * built-in cross-origin (CSRF) check on action requests, comparing it against\n   * the incoming `Origin` header. The returned value is sanitized (invalid\n   * characters stripped, port validated) before use.\n   *\n   * Return `undefined`/`null` to fall back to the default: the AWS-provided,\n   * non-spoofable request-context domain name (`event.requestContext.domainName`)\n   * for API Gateway v1/v2 and Lambda Function URLs, and the `Host` header for\n   * ALB (which has no request-context domain name).\n   *\n   * Use this when the default host is not the host the browser sees. Two common\n   * cases:\n   *\n   * - To trust a forwarded header (e.g. `x-forwarded-host`) instead of the\n   *   request-context domain name — only safe if your proxy infrastructure sets\n   *   it and strips any incoming value:\n   *\n   *   ```ts\n   *   createAPIGatewayV2RequestHandler({\n   *     build,\n   *     getHost: (event) => event.headers[\"x-forwarded-host\"],\n   *   });\n   *   ```\n   *\n   * - A Lambda Function URL behind CloudFront: `event.requestContext.domainName`\n   *   is always the internal `*.lambda-url` host, and CloudFront does not forward\n   *   the viewer host by default. Forward it yourself (e.g. a CloudFront Function\n   *   copying the viewer `Host` into a custom header) and read that header here:\n   *\n   *   ```ts\n   *   createFunctionURLRequestHandler({\n   *     build,\n   *     getHost: (event) => event.headers[\"x-viewer-host\"],\n   *   });\n   *   ```\n   */\n  getHost?: GetHostFunction<T>;\n};\n\n/**\n * Returns a request handler for AWS API Gateway V1\n *\n */\n/**\n * Returns a request handler for AWS API Gateway V1 events.\n *\n * @param options - The handler options, including the React Router server build,\n *   optional getLoadContext function, and mode string.\n * @returns An AWS API Gateway V1 handler compatible with APIGatewayProxyHandler.\n */\nexport function createAPIGatewayV1RequestHandler(\n  options: CreateRequestHandlerArgs<APIGatewayProxyEvent>,\n): APIGatewayProxyHandler {\n  return createRequestHandlerForAdapter(apiGatewayV1Adapter, options);\n}\n\n/**\n * Returns a request handler for AWS API Gateway V2 events.\n *\n * @param options - The handler options, including the React Router server build,\n *   optional getLoadContext function, and mode string.\n * @returns An AWS API Gateway V2 handler compatible with APIGatewayProxyHandlerV2.\n */\nexport function createAPIGatewayV2RequestHandler(\n  options: CreateRequestHandlerArgs<APIGatewayProxyEventV2>,\n): APIGatewayProxyHandlerV2 {\n  return createRequestHandlerForAdapter(apiGatewayV2Adapter, options);\n}\n\n/**\n * Returns a request handler for AWS Application Load Balancer events.\n *\n * @param options - The handler options, including the React Router server build,\n *   optional getLoadContext function, and mode string.\n * @returns An AWS ALB handler compatible with ALBHandler.\n */\nexport function createALBRequestHandler(options: CreateRequestHandlerArgs<ALBEvent>): ALBHandler {\n  return createRequestHandlerForAdapter(applicationLoadBalancerAdapter, options);\n}\n\n/**\n * Returns a request handler for AWS Lambda Function URL events (invoke mode BUFFERED).\n *\n * @param options - The handler options, including the React Router server build,\n *   optional getLoadContext function, and mode string.\n * @returns An AWS Lambda Function URL handler compatible with Lambda Function URLs with InvokeMode BUFFERED.\n */\nexport function createFunctionURLRequestHandler(\n  options: CreateRequestHandlerArgs<LambdaFunctionURLEvent>,\n): LambdaFunctionURLHandler {\n  return createRequestHandlerForAdapter(apiGatewayV2Adapter, options);\n}\n\n/**\n * Returns a request handler for AWS Lambda Function URL events (invoke mode RESPONSE_STREAM).\n *\n * @param options - The handler options, including the React Router server build,\n *   optional getLoadContext function, and mode string.\n * @returns A streaming AWS Lambda Function URL handler compatible with Lambda Function URLs with InvokeMode RESPONSE_STREAM.\n */\nexport function createFunctionURLStreamingRequestHandler(\n  options: CreateRequestHandlerArgs<LambdaFunctionURLEvent>,\n): StreamifyHandler<LambdaFunctionURLEvent, void> {\n  return createRequestHandlerForAdapter(functionUrlStreamingAdapter, options);\n}\n\nfunction createRequestHandlerForAdapter<E, Ret, Res, H>(\n  awsAdapter: ReactRouterAdapter<E, Ret, Res, H>,\n  { build, getLoadContext, mode = process.env.NODE_ENV, getHost }: CreateRequestHandlerArgs<E>,\n) {\n  const handleRequest = createReactRouterRequestHandler(build, mode);\n\n  return awsAdapter.wrapHandler(async (event, res) => {\n    let request: Request;\n\n    try {\n      request = awsAdapter.createReactRouterRequest(event, getHost);\n    } catch (e: unknown) {\n      return await awsAdapter.sendReactRouterResponse(\n        new Response(`Bad Request: ${e instanceof Error ? e.message : e}`, { status: 400 }),\n        res,\n      );\n    }\n\n    const loadContext = await getLoadContext?.(event);\n\n    const response = await handleRequest(request, loadContext);\n\n    return await awsAdapter.sendReactRouterResponse(response, res);\n  });\n}\n"],"mappings":"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"}