{"version":3,"sources":["../../src/production-lifecycle.ts","../../src/nitro/legacy-request.ts","../../src/nitro/legacy-runtime.ts","../../src/nitro/production-runtime.ts"],"sourcesContent":["import type { ResolvedFarmServerConfig } from \"./server-http\";\n\nexport type FarmProductionLifecycleState = \"starting\" | \"ready\" | \"draining\" | \"failed\" | \"closed\";\n\nexport interface FarmProductionLifecycleOptions {\n  server: ResolvedFarmServerConfig;\n  start?: () => void | Promise<void>;\n  close?: (reason: string) => void | Promise<void>;\n}\n\nexport interface FarmResponseCompletionContext {\n  onResponseFinished?: (callback: () => void) => void;\n}\n\nexport interface FarmProductionLifecycle {\n  readonly state: FarmProductionLifecycleState;\n  readonly activeRequests: number;\n  start(): Promise<void>;\n  beginDrain(reason?: string): void;\n  waitForIdle(timeoutMs?: number): Promise<boolean>;\n  close(reason?: string): Promise<void>;\n  forceClose(reason?: string): Promise<void>;\n  handleHealthRequest(request: Request): Promise<Response | null>;\n  runRequest(\n    handler: () => Response | Promise<Response>,\n    context?: FarmResponseCompletionContext,\n  ): Promise<Response>;\n}\n\nexport function createFarmProductionLifecycle(\n  options: FarmProductionLifecycleOptions,\n): FarmProductionLifecycle {\n  let state: FarmProductionLifecycleState = \"starting\";\n  let activeRequests = 0;\n  let startPromise: Promise<void> | undefined;\n  let closePromise: Promise<void> | undefined;\n  let resourceClosePromise: Promise<void> | undefined;\n  let resolveForcedCloseWait!: () => void;\n  const forcedCloseWait = new Promise<void>((resolve) => {\n    resolveForcedCloseWait = resolve;\n  });\n  const idleWaiters = new Set<() => void>();\n\n  const notifyIdle = () => {\n    if (activeRequests !== 0) return;\n    for (const resolve of idleWaiters) resolve();\n    idleWaiters.clear();\n  };\n\n  const start = async () => {\n    if (state === \"ready\") return;\n    if (startPromise) return startPromise;\n    if (state === \"draining\" || state === \"closed\") {\n      throw new Error(\"Farm production runtime is shutting down\");\n    }\n    if (state === \"failed\") {\n      throw new Error(\"Farm production runtime failed to start\");\n    }\n\n    startPromise = Promise.resolve()\n      .then(() => options.start?.())\n      .then(\n        () => {\n          if (state === \"starting\") state = \"ready\";\n        },\n        (error) => {\n          if (state !== \"closed\") state = \"failed\";\n          throw error;\n        },\n      );\n    return startPromise;\n  };\n\n  const beginDrain = (_reason = \"production-server-draining\") => {\n    if (state === \"closed\" || state === \"failed\") return;\n    state = \"draining\";\n  };\n\n  const waitForIdle = async (\n    timeoutMs = options.server.gracefulShutdownTimeout,\n  ): Promise<boolean> => {\n    if (activeRequests === 0) return true;\n\n    return await new Promise<boolean>((resolve) => {\n      let settled = false;\n      const finish = (drained: boolean) => {\n        if (settled) return;\n        settled = true;\n        clearTimeout(timeout);\n        idleWaiters.delete(onIdle);\n        resolve(drained);\n      };\n      const onIdle = () => finish(true);\n      const timeout = setTimeout(() => finish(false), timeoutMs);\n      timeout.unref?.();\n      idleWaiters.add(onIdle);\n    });\n  };\n\n  const closeResources = async (reason: string) => {\n    if (resourceClosePromise) return resourceClosePromise;\n    resourceClosePromise = Promise.resolve()\n      .then(() => options.close?.(reason))\n      .then(\n        () => {\n          state = \"closed\";\n        },\n        (error) => {\n          state = \"closed\";\n          throw error;\n        },\n      );\n    return resourceClosePromise;\n  };\n\n  const close = async (reason = \"production-server-closed\") => {\n    if (resourceClosePromise) return resourceClosePromise;\n    if (closePromise) return closePromise;\n    beginDrain(reason);\n    closePromise = Promise.race([\n      Promise.resolve(startPromise).catch(() => {\n        // Startup may have partially initialized resources. The close hook\n        // still owns their cleanup, while the original start caller keeps the\n        // startup failure.\n      }),\n      forcedCloseWait,\n    ]).then(() => closeResources(reason));\n    return closePromise;\n  };\n\n  const forceClose = async (reason = \"production-server-closed\") => {\n    beginDrain(reason);\n    resolveForcedCloseWait();\n    const forcedClose = closeResources(reason);\n    closePromise ??= forcedClose;\n    return forcedClose;\n  };\n\n  const handleHealthRequest = async (request: Request): Promise<Response | null> => {\n    const health = options.server.health;\n    if (!health.enabled) return null;\n\n    const pathname = new URL(request.url).pathname.replace(/\\/+$/, \"\") || \"/\";\n    const isLiveness = pathname === health.livenessPath;\n    const isReadiness = pathname === health.readinessPath;\n    if (!isLiveness && !isReadiness) return null;\n\n    if (request.method !== \"GET\" && request.method !== \"HEAD\") {\n      return new Response(null, {\n        status: 405,\n        headers: createHealthHeaders({ allow: \"GET, HEAD\" }),\n      });\n    }\n\n    if (isReadiness && state === \"starting\") {\n      try {\n        await start();\n      } catch {\n        // The readiness response below intentionally does not expose startup details.\n      }\n    }\n\n    const healthy = isLiveness ? state !== \"failed\" && state !== \"closed\" : state === \"ready\";\n    const body =\n      request.method === \"HEAD\" ? null : JSON.stringify({ status: healthy ? \"ok\" : \"unavailable\" });\n    return new Response(body, {\n      status: healthy ? 200 : 503,\n      headers: createHealthHeaders(healthy ? undefined : { retryAfter: \"1\" }),\n    });\n  };\n\n  const runRequest = async (\n    handler: () => Response | Promise<Response>,\n    context: FarmResponseCompletionContext = {},\n  ): Promise<Response> => {\n    if (state === \"failed\") return createFailedResponse();\n    if (state === \"draining\" || state === \"closed\") return createDrainingResponse();\n    await start();\n    if (state !== \"ready\") return createDrainingResponse();\n\n    activeRequests++;\n    let finished = false;\n    const finish = () => {\n      if (finished) return;\n      finished = true;\n      activeRequests--;\n      notifyIdle();\n    };\n\n    try {\n      const response = await handler();\n      return trackResponseCompletion(response, finish, context.onResponseFinished);\n    } catch (error) {\n      finish();\n      throw error;\n    }\n  };\n\n  return {\n    get state() {\n      return state;\n    },\n    get activeRequests() {\n      return activeRequests;\n    },\n    start,\n    beginDrain,\n    waitForIdle,\n    close,\n    forceClose,\n    handleHealthRequest,\n    runRequest,\n  };\n}\n\nfunction createHealthHeaders(options: { allow?: string; retryAfter?: string } = {}): Headers {\n  const headers = new Headers({\n    \"cache-control\": \"no-store\",\n    \"content-type\": \"application/json; charset=utf-8\",\n    \"x-content-type-options\": \"nosniff\",\n  });\n  if (options.allow) headers.set(\"allow\", options.allow);\n  if (options.retryAfter) headers.set(\"retry-after\", options.retryAfter);\n  return headers;\n}\n\nfunction createDrainingResponse(): Response {\n  return new Response(\"Service Unavailable\", {\n    status: 503,\n    headers: {\n      \"cache-control\": \"no-store\",\n      connection: \"close\",\n      \"content-type\": \"text/plain; charset=utf-8\",\n      \"retry-after\": \"1\",\n      \"x-content-type-options\": \"nosniff\",\n    },\n  });\n}\n\nfunction createFailedResponse(): Response {\n  return new Response(\"Service Unavailable\", {\n    status: 503,\n    headers: {\n      \"cache-control\": \"no-store\",\n      connection: \"close\",\n      \"content-type\": \"text/plain; charset=utf-8\",\n      \"x-content-type-options\": \"nosniff\",\n    },\n  });\n}\n\nfunction trackResponseCompletion(\n  response: Response,\n  finish: () => void,\n  onResponseFinished?: (callback: () => void) => void,\n): Response {\n  if (onResponseFinished) {\n    try {\n      onResponseFinished(finish);\n      return response;\n    } catch {\n      // Fall through to Web Stream tracking when an adapter rejects registration.\n    }\n  }\n\n  if (!response.body || response.bodyUsed || response.body.locked) {\n    finish();\n    return response;\n  }\n\n  const reader = response.body.getReader();\n  let released = false;\n  const releaseReader = () => {\n    if (released) return;\n    released = true;\n    reader.releaseLock();\n  };\n  const body = new ReadableStream<Uint8Array>({\n    async pull(controller) {\n      try {\n        const result = await reader.read();\n        if (result.done) {\n          releaseReader();\n          finish();\n          controller.close();\n          return;\n        }\n        controller.enqueue(result.value);\n      } catch (error) {\n        releaseReader();\n        finish();\n        controller.error(error);\n      }\n    },\n    cancel(reason) {\n      try {\n        // Cancellation closes the response now; producer cleanup may finish later.\n        return reader.cancel(reason);\n      } finally {\n        releaseReader();\n        finish();\n      }\n    },\n  });\n\n  return new Response(body, {\n    status: response.status,\n    statusText: response.statusText,\n    headers: response.headers,\n  });\n}\n","export async function createFarmLegacyRequest<TEvent extends { method?: string }>(\n  event: TEvent,\n  input: string | URL,\n  headers: HeadersInit,\n  readRawBody: (event: TEvent, encoding: false) => Promise<BodyInit | null | undefined>,\n): Promise<Request> {\n  const method = event.method || \"GET\";\n  const body =\n    method === \"GET\" || method === \"HEAD\"\n      ? undefined\n      : ((await readRawBody(event, false)) ?? undefined);\n\n  return new Request(input, { method, headers, body });\n}\n","const FARM_LEGACY_ERROR_HTML =\n  \"<!DOCTYPE html><html><head><title>Error</title></head><body><h1>Error</h1><p>Internal Server Error</p></body></html>\";\n\nexport function serializeFarmInlineValue(value: unknown): string {\n  return (JSON.stringify(value) ?? \"null\")\n    .replace(/</g, \"\\\\u003c\")\n    .replace(/\\u2028/g, \"\\\\u2028\")\n    .replace(/\\u2029/g, \"\\\\u2029\");\n}\n\nfunction escapeFarmHtmlAttribute(value: string): string {\n  return value\n    .replace(/&/g, \"&amp;\")\n    .replace(/\"/g, \"&quot;\")\n    .replace(/</g, \"&lt;\")\n    .replace(/>/g, \"&gt;\");\n}\n\nexport function renderFarmLegacyHtml(options: {\n  deploymentId: unknown;\n  pageProps: unknown;\n  pathname: unknown;\n  html: string;\n  clientScript: string;\n}): string {\n  return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n  <link rel=\"icon\" href=\"data:,\">\n  <title>Farm.js App</title>\n  <script>\n    window.__FARM_DEPLOYMENT_ID__ = ${serializeFarmInlineValue(options.deploymentId)};\n    window.__FARM_PROPS__ = ${serializeFarmInlineValue(options.pageProps)};\n    window.__FARM_PATH__ = ${serializeFarmInlineValue(options.pathname)};\n  </script>\n</head>\n<body>\n  <div id=\"root\">${options.html}</div>\n  <script type=\"module\" src=\"${escapeFarmHtmlAttribute(options.clientScript)}\"></script>\n</body>\n</html>`;\n}\n\nexport function renderFarmLegacyErrorHtml(): string {\n  return FARM_LEGACY_ERROR_HTML;\n}\n","export { _runWithAfterRequest } from \"../after\";\nexport { farmSecretsMatch } from \"../secret-compare\";\nexport type { FarmServerConfig } from \"../server-http\";\nexport {\n  bufferFarmRequestBody,\n  createFarmNodeRequestAbortSignal,\n  createFarmRequestBodyErrorResponse,\n  matchesFarmIfNoneMatch,\n  readFarmRequestBody,\n  readNodeRequestBody,\n  resolveFarmServerConfig,\n} from \"../server-http\";\nexport { createFarmProductionLifecycle } from \"../production-lifecycle\";\nexport { _runWithCurrentRequest, getCurrentRequest } from \"../server/request\";\nexport { _runWithAPIRequestRuntime } from \"../api/server-context\";\nexport {\n  configureFarmCache,\n  createFarmCacheKey,\n  getFarmDataCache,\n  normalizeRevalidatePath,\n} from \"../cache\";\nexport { createFarmLocaleCookie, getFarmLocaleVaryHeaders } from \"../i18n/resolver\";\nexport {\n  localizeFarmHref,\n  localizeFarmPathname,\n  stripFarmLocaleFromPathname,\n} from \"../i18n/routing\";\nexport { addMetadataImageReference, mergeMetadata, renderMetadataHead } from \"../metadata\";\nexport { createFarmMetadataRouteResponse } from \"../metadata-route\";\nexport {\n  applyProductionMiddlewareHeaders,\n  createProductionMiddlewareRunner,\n} from \"../middleware/production-runtime\";\nexport { _runWithMiddlewareContext, _runWithMiddlewareData } from \"../middleware/server\";\nexport {\n  getFarmRedirectError,\n  isFarmNotFoundError,\n  isFarmRedirectError,\n} from \"../navigation-errors\";\nexport {\n  configureFarmObservability,\n  emitFarmEvent,\n  runWithFarmRequestSpan,\n} from \"../observability\";\nexport {\n  createFarmInstrumentationLifecycle,\n  resolveFarmInstrumentationRuntime,\n} from \"../instrumentation-runtime\";\nexport { resolveFarmRouteContext, withFarmRouteContext } from \"../route-context\";\nexport { _setDefaultFarmThemeConfig, getTheme } from \"../theme/server\";\nexport { applyFarmThemeDocument, createFarmThemeDocumentParts } from \"../theme/server-runtime\";\nexport {\n  createDefaultErrorMarkup,\n  getDefaultErrorStatusText,\n  resolveDefaultErrorStatus,\n} from \"../components/error-page\";\nexport {\n  manageFarmDocumentPreloads,\n  manageFarmHtmlPreloads,\n  manageFarmLinkHeaderPreloads,\n  reportFarmPreloadWarnings,\n} from \"../preload\";\nexport { searchParamsToObject } from \"../search-params\";\nexport { parseRoutePath, matchRoute as matchFarmPageRoute } from \"../utils\";\nexport { compareRouteSpecificity, getRoutePatternSpecificity } from \"../routing/specificity\";\nexport { createFarmLegacyRequest } from \"./legacy-request\";\nexport {\n  renderFarmLegacyErrorHtml,\n  renderFarmLegacyHtml,\n  serializeFarmInlineValue,\n} from \"./legacy-runtime\";\nexport {\n  resolveFarmTrailingSlashRedirect,\n  setFarmTrailingSlashPreference,\n} from \"../trailing-slash\";\nexport { applyFarmBasePath, setFarmBasePath, stripFarmBasePath } from \"../base-path\";\nexport { appendFarmRedirectQuery } from \"../redirect-query\";\n\nexport function appendFarmLinkHeader(headers: Headers, value: string): void {\n  const current = headers.get(\"Link\");\n  if (!current) {\n    headers.set(\"Link\", value);\n    return;\n  }\n  if (current !== value && !current.endsWith(`, ${value}`)) {\n    headers.set(\"Link\", `${current}, ${value}`);\n  }\n}\n"],"mappings":"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","names":[]}