{
  "version": 3,
  "sources": ["../src/index.ts", "../src/core/define.ts", "../src/core/errors.ts", "../src/core/timeout.ts", "../src/checks.ts", "../src/collectors.ts", "../src/core/aggregate.ts", "../src/core/http.ts", "../src/core/runtime.ts", "../src/core/manager.ts", "../src/core/serializers.ts", "../src/http-check.ts"],
  "sourcesContent": ["export * from \"./checks\";\nexport * from \"./collectors\";\nexport * from \"./core/aggregate\";\nexport * from \"./core/define\";\nexport * from \"./core/errors\";\nexport * from \"./core/http\";\nexport * from \"./core/manager\";\nexport * from \"./core/runtime\";\nexport * from \"./core/serializers\";\nexport * from \"./core/timeout\";\nexport * from \"./core/types\";\nexport * from \"./http-check\";\n", "import type {\n  HealthCheckDefinition,\n  MetricCollectorDefinition\n} from \"./types\";\n\nexport function defineHealthCheck<TName extends string> (definition: HealthCheckDefinition<TName>): HealthCheckDefinition<TName> {\n  return { ...definition, kind: \"check\", };\n}\n\nexport function defineMetricCollector<TName extends string> (definition: MetricCollectorDefinition<TName>): MetricCollectorDefinition<TName> {\n  return { ...definition, kind: \"collector\", };\n}\n", "export const HEALTH_ERROR_CODES = {\n  CHECK_THROWN: \"CHECK_THROWN\",\n  CHECK_TIMEOUT: \"CHECK_TIMEOUT\",\n  CHECK_ABORTED: \"CHECK_ABORTED\",\n  HEALTHCHECK_TIMEOUT: \"HEALTHCHECK_TIMEOUT\",\n  HEALTHCHECK_ABORTED: \"HEALTHCHECK_ABORTED\",\n  HEALTHCHECK_DEPENDENCY_UNAVAILABLE: \"HEALTHCHECK_DEPENDENCY_UNAVAILABLE\",\n  HEALTHCHECK_CONTAINER_LIMIT_UNAVAILABLE: \"HEALTHCHECK_CONTAINER_LIMIT_UNAVAILABLE\",\n  HEALTHCHECK_ROUTE_UNAUTHORIZED: \"HEALTHCHECK_ROUTE_UNAUTHORIZED\",\n  HEALTHCHECK_INVALID_CONFIG: \"HEALTHCHECK_INVALID_CONFIG\",\n  HTTP_STATUS_MISMATCH: \"HTTP_STATUS_MISMATCH\",\n  HTTP_BODY_MISMATCH: \"HTTP_BODY_MISMATCH\",\n  TCP_CONNECT_FAILED: \"TCP_CONNECT_FAILED\",\n  DNS_RESOLVE_FAILED: \"DNS_RESOLVE_FAILED\",\n  DATABASE_PING_FAILED: \"DATABASE_PING_FAILED\",\n  PAYLOAD_QUERY_FAILED: \"PAYLOAD_QUERY_FAILED\",\n  RUNTIME_UNSUPPORTED: \"RUNTIME_UNSUPPORTED\",\n  METRIC_UNAVAILABLE: \"METRIC_UNAVAILABLE\",\n} as const;\n\nexport type HealthErrorCode\n  = (typeof HEALTH_ERROR_CODES)[keyof typeof HEALTH_ERROR_CODES];\n", "export function createAbortSignal (\n  timeoutMs: number | undefined,\n  parent?: AbortSignal\n): { signal: AbortSignal, dispose: () => void } {\n  const controller = new AbortController();\n  let timeout: ReturnType<typeof setTimeout> | undefined;\n\n  const abort = (reason?: unknown) => {\n    if (!controller.signal.aborted) {\n      controller.abort(reason);\n    }\n  };\n\n  if (parent) {\n    if (parent.aborted) {\n      abort(parent.reason);\n    } else {\n      parent.addEventListener(\n        \"abort\", () => abort(parent.reason), { once: true, }\n      );\n    }\n  }\n\n  if (typeof timeoutMs === \"number\" && Number.isFinite(timeoutMs) && timeoutMs > 0) {\n    timeout = setTimeout(\n      () => abort(new DOMException(\n        \"Healthcheck timed out.\", \"TimeoutError\"\n      )), timeoutMs\n    );\n  }\n\n  return {\n    signal: controller.signal,\n    dispose () {\n      if (timeout) {\n        clearTimeout(timeout);\n      }\n    },\n  };\n}\n\nexport function sleep (\n  ms: number, signal?: AbortSignal\n): Promise<void> {\n  if (signal?.aborted) {\n    return Promise.reject(signal.reason);\n  }\n\n  return new Promise((\n    resolve, reject\n  ) => {\n    const timeout = setTimeout(\n      resolve, ms\n    );\n\n    signal?.addEventListener(\n      \"abort\", () => {\n        clearTimeout(timeout);\n        reject(signal.reason);\n      }, { once: true, }\n    );\n  });\n}\n", "import { defineHealthCheck } from \"./core/define\";\nimport { HEALTH_ERROR_CODES } from \"./core/errors\";\nimport { sleep } from \"./core/timeout\";\n\nimport type {\n  HealthCheckDefinition,\n  HealthCheckRunResult,\n  HealthMetrics,\n  HealthScope,\n  HealthStatus\n} from \"./core/types\";\n\nfunction thresholdStatus (\n  value: number | null, degraded: number, unhealthy: number, direction: \"above\" | \"below\"\n): HealthStatus {\n  if (value === null) return \"degraded\";\n\n  if (direction === \"above\") {\n    if (value >= unhealthy) return \"unhealthy\";\n    if (value >= degraded) return \"degraded\";\n    return \"ok\";\n  }\n\n  if (value <= unhealthy) return \"unhealthy\";\n  if (value <= degraded) return \"degraded\";\n  return \"ok\";\n}\n\nexport function runtimeInfoCheck (options: {\n  scopes?: readonly HealthScope[]\n  critical?: boolean\n} = {}): HealthCheckDefinition<\"runtime.info\"> {\n  return defineHealthCheck({\n    name: \"runtime.info\",\n    scopes: options.scopes ?? [\"diagnostics\"],\n    critical: options.critical ?? false,\n    run (ctx) {\n      const info = ctx.runtime.getRuntimeInfo();\n\n      return {\n        status: \"ok\",\n        metrics: { uptimeSeconds: ctx.runtime.uptimeSeconds(), },\n        details: { ...info, },\n      };\n    },\n  });\n}\n\nexport function shutdownCheck (options: { scopes?: readonly HealthScope[] } = {}): HealthCheckDefinition<\"shutdown\"> {\n  return defineHealthCheck({\n    name: \"shutdown\",\n    scopes: options.scopes ?? [\n      \"liveness\",\n      \"readiness\"\n    ],\n    critical: true,\n    run (ctx) {\n      const state = ctx.getShutdownState();\n\n      return {\n        status: state.shuttingDown ? \"unhealthy\" : \"ok\",\n        metrics: { shuttingDown: state.shuttingDown, },\n        details: state.reason ? { reason: state.reason, } : undefined,\n      };\n    },\n  });\n}\n\nexport function startupCheck (options: {\n  isStarted: () => boolean | Promise<boolean>\n  scopes?: readonly HealthScope[]\n  timeoutMs?: number\n}): HealthCheckDefinition<\"startup\"> {\n  return defineHealthCheck({\n    name: \"startup\",\n    scopes: options.scopes ?? [\"startup\"],\n    critical: true,\n    timeoutMs: options.timeoutMs,\n    async run () {\n      const started = await options.isStarted();\n\n      return {\n        status: started ? \"ok\" : \"unhealthy\",\n        metrics: { started, },\n      };\n    },\n  });\n}\n\nexport function timerLagCheck (options: {\n  scopes?: readonly HealthScope[]\n  sampleMs?: number\n  thresholds?: { degradedMs: number, unhealthyMs: number }\n  critical?: boolean\n} = {}): HealthCheckDefinition<\"timer.lag\"> {\n  const sampleMs = options.sampleMs ?? 10;\n  const thresholds = options.thresholds ?? { degradedMs: 100, unhealthyMs: 500, };\n\n  return defineHealthCheck({\n    name: \"timer.lag\",\n    scopes: options.scopes ?? [\n      \"liveness\",\n      \"diagnostics\"\n    ],\n    critical: options.critical ?? false,\n    async run (ctx): Promise<HealthCheckRunResult> {\n      const startedAt = ctx.now();\n      await sleep(\n        sampleMs, ctx.signal\n      );\n      const lagMs = Math.max(\n        0, ctx.now() - startedAt - sampleMs\n      );\n\n      return {\n        status: thresholdStatus(\n          lagMs, thresholds.degradedMs, thresholds.unhealthyMs, \"above\"\n        ),\n        metrics: { lagMs, sampleMs, },\n      };\n    },\n  });\n}\n\nexport function memoryCheck (options: {\n  scopes?: readonly HealthScope[]\n  availableRatio?: { degraded: number, unhealthy: number }\n  usedRatio?: { degraded: number, unhealthy: number }\n  critical?: boolean | Partial<Record<HealthScope, boolean>>\n} = {}): HealthCheckDefinition<\"memory\"> {\n  const availableRatio = options.availableRatio ?? { degraded: 0.15, unhealthy: 0.05, };\n  const usedRatio = options.usedRatio;\n\n  return defineHealthCheck({\n    name: \"memory\",\n    scopes: options.scopes ?? [\n      \"readiness\",\n      \"diagnostics\"\n    ],\n    critical: options.critical ?? { readiness: true, diagnostics: false, },\n    async run (ctx): Promise<HealthCheckRunResult> {\n      const snapshot = await ctx.runtime.getMemory?.();\n\n      if (!snapshot) {\n        return {\n          status: \"degraded\",\n          metrics: {} satisfies HealthMetrics,\n          error: {\n            code: HEALTH_ERROR_CODES.METRIC_UNAVAILABLE,\n            message: \"Memory metrics are unavailable.\",\n          },\n        };\n      }\n\n      const statusFromAvailable = thresholdStatus(\n        snapshot.availableRatio, availableRatio.degraded, availableRatio.unhealthy, \"below\"\n      );\n      const statusFromUsed = usedRatio\n        ? thresholdStatus(\n          snapshot.usedRatio, usedRatio.degraded, usedRatio.unhealthy, \"above\"\n        )\n        : \"ok\";\n      const status = statusFromAvailable === \"unhealthy\" || statusFromUsed === \"unhealthy\"\n        ? \"unhealthy\"\n        : statusFromAvailable === \"degraded\" || statusFromUsed === \"degraded\"\n          ? \"degraded\"\n          : \"ok\";\n\n      return {\n        status,\n        metrics: {\n          rssBytes: snapshot.rssBytes,\n          heapTotalBytes: snapshot.heapTotalBytes,\n          heapUsedBytes: snapshot.heapUsedBytes,\n          externalBytes: snapshot.externalBytes,\n          arrayBuffersBytes: snapshot.arrayBuffersBytes,\n          constrainedBytes: snapshot.constrainedBytes,\n          availableBytes: snapshot.availableBytes,\n          totalBytes: snapshot.totalBytes,\n          usedRatio: snapshot.usedRatio,\n          availableRatio: snapshot.availableRatio,\n        } satisfies HealthMetrics,\n        details: { source: snapshot.source, },\n      };\n    },\n  });\n}\n", "import { defineMetricCollector } from \"./core/define\";\n\nimport type {\n  HealthMetric,\n  HealthScope,\n  MetricCollectorDefinition\n} from \"./core/types\";\n\nexport function runtimeMetricsCollector (options: { scopes?: readonly HealthScope[] } = {}): MetricCollectorDefinition<\"runtime.metrics\"> {\n  return defineMetricCollector({\n    name: \"runtime.metrics\",\n    scopes: options.scopes ?? [\"diagnostics\"],\n    collect (ctx) {\n      const runtime = ctx.runtime.getRuntimeInfo();\n      const uptimeSeconds = ctx.runtime.uptimeSeconds();\n      const metrics: HealthMetric[] = [\n        {\n          name: \"runtime.info\",\n          value: 1,\n          type: \"info\",\n          labels: {\n            runtime: runtime.name,\n            version: runtime.version ?? \"unknown\",\n          },\n        },\n        {\n          name: \"service.uptime_seconds\",\n          value: uptimeSeconds,\n          unit: \"seconds\",\n          type: \"gauge\",\n        }\n      ];\n\n      return { metrics, };\n    },\n  });\n}\n", "import type {\n  HealthCheckResult,\n  HealthStatus,\n  HealthSummary\n} from \"./types\";\n\nexport function summarizeChecks (results: readonly HealthCheckResult[]): HealthSummary {\n  return {\n    ok: results.filter((result) => result.status === \"ok\").length,\n    degraded: results.filter((result) => result.status === \"degraded\").length,\n    unhealthy: results.filter((result) => result.status === \"unhealthy\").length,\n    total: results.length,\n    criticalFailed: results.filter((result) => result.critical && result.status !== \"ok\").length,\n    nonCriticalFailed: results.filter((result) => !result.critical && result.status !== \"ok\").length,\n  };\n}\n\nexport function aggregateStatus (results: readonly HealthCheckResult[]): HealthStatus {\n  if (results.some((result) => result.critical && result.status === \"unhealthy\")) {\n    return \"unhealthy\";\n  }\n\n  if (results.some((result) => result.status !== \"ok\")) {\n    return \"degraded\";\n  }\n\n  return \"ok\";\n}\n", "import type {\n  HealthHttpStatusPolicy,\n  HealthStatus\n} from \"./types\";\n\nexport const DEFAULT_HTTP_STATUS_POLICY: HealthHttpStatusPolicy = {\n  ok: 200,\n  degraded: 200,\n  unhealthy: 503,\n};\n\nexport const STRICT_READINESS_HTTP_STATUS_POLICY: HealthHttpStatusPolicy = {\n  ok: 200,\n  degraded: 503,\n  unhealthy: 503,\n};\n\nexport function statusToHttpStatus (\n  status: HealthStatus, policy: HealthHttpStatusPolicy = DEFAULT_HTTP_STATUS_POLICY\n): number {\n  return policy[status];\n}\n", "import type {\n  RuntimeAdapter,\n  RuntimeIdentity,\n  RuntimeMemorySnapshot\n} from \"./types\";\n\ntype ProcessLike = {\n  version?: string\n  versions?: Record<string, string | undefined>\n  platform?: string\n  arch?: string\n  pid?: number\n  uptime?: () => number\n  memoryUsage?: (() => {\n    rss: number\n    heapTotal: number\n    heapUsed: number\n    external: number\n    arrayBuffers?: number\n  }) & { rss?: () => number }\n  constrainedMemory?: () => number\n  availableMemory?: () => number\n};\n\ntype BunLike = {\n  version?: string\n  revision?: string\n};\n\nfunction getProcess (): ProcessLike | undefined {\n  return (globalThis as typeof globalThis & { process?: ProcessLike }).process;\n}\n\nfunction getBun (): BunLike | undefined {\n  return (globalThis as typeof globalThis & { Bun?: BunLike }).Bun;\n}\n\nfunction now (): number {\n  return globalThis.performance?.now?.() ?? Date.now();\n}\n\nfunction finitePositive (value: unknown): number | null {\n  return typeof value === \"number\" && Number.isFinite(value) && value > 0\n    ? value\n    : null;\n}\n\nfunction runtimeInfo (): RuntimeIdentity {\n  const bun = getBun();\n  const processLike = getProcess();\n\n  if (bun) {\n    return {\n      name: \"bun\",\n      version: bun.version,\n      revision: bun.revision,\n      platform: processLike?.platform,\n      arch: processLike?.arch,\n      pid: processLike?.pid,\n    };\n  }\n\n  if (processLike?.versions?.node) {\n    return {\n      name: \"node\",\n      version: processLike.version,\n      platform: processLike.platform,\n      arch: processLike.arch,\n      pid: processLike.pid,\n    };\n  }\n\n  return { name: \"unknown\", };\n}\n\nfunction memorySnapshot (): RuntimeMemorySnapshot {\n  const processLike = getProcess();\n  const memory = processLike?.memoryUsage?.();\n  const constrainedBytes = finitePositive(processLike?.constrainedMemory?.());\n  const availableBytes = finitePositive(processLike?.availableMemory?.());\n  const totalBytes = constrainedBytes;\n  const rssBytes = finitePositive(memory?.rss);\n  const usedRatio = totalBytes && rssBytes ? rssBytes / totalBytes : null;\n  const availableRatio = totalBytes && availableBytes ? availableBytes / totalBytes : null;\n\n  return {\n    rssBytes,\n    heapTotalBytes: finitePositive(memory?.heapTotal),\n    heapUsedBytes: finitePositive(memory?.heapUsed),\n    externalBytes: finitePositive(memory?.external),\n    arrayBuffersBytes: finitePositive(memory?.arrayBuffers),\n    constrainedBytes,\n    availableBytes,\n    totalBytes,\n    usedRatio,\n    availableRatio,\n    source: totalBytes ? \"process\" : memory ? \"process-memory\" : \"none\",\n  };\n}\n\nexport function genericRuntimeAdapter (): RuntimeAdapter {\n  return {\n    name: runtimeInfo().name,\n    now,\n    uptimeSeconds () {\n      return finitePositive(getProcess()?.uptime?.()) ?? null;\n    },\n    getRuntimeInfo: runtimeInfo,\n    getMemory: memorySnapshot,\n  };\n}\n\nexport function autoRuntimeAdapter (): RuntimeAdapter {\n  return genericRuntimeAdapter();\n}\n", "import { aggregateStatus, summarizeChecks } from \"./aggregate\";\nimport { HEALTH_ERROR_CODES } from \"./errors\";\nimport { autoRuntimeAdapter } from \"./runtime\";\nimport { createAbortSignal, sleep } from \"./timeout\";\n\nimport type {\n  HealthCheckDefinition,\n  HealthCheckResult,\n  HealthDataProfile,\n  HealthManager,\n  HealthManagerOptions,\n  HealthMetric,\n  HealthRunContext,\n  HealthRunScope,\n  HealthScope,\n  MetricCollectorDefinition,\n  MetricCollectionResult,\n  RuntimeAdapter\n} from \"./types\";\n\nconst DEFAULT_TIMEOUT_MS = 1_000;\nconst DEFAULT_CONCURRENCY = 8;\nconst DEFAULT_PROFILE: HealthDataProfile = \"summary\";\n\nfunction isScopeMatch (\n  scopes: readonly HealthScope[] | undefined, scope: HealthRunScope\n): boolean {\n  return scope === \"all\" || !scopes || scopes.includes(scope);\n}\n\nfunction isCritical (\n  check: HealthCheckDefinition, scope: HealthRunScope\n): boolean {\n  if (typeof check.critical === \"boolean\") {\n    return check.critical;\n  }\n\n  if (scope !== \"all\" && check.critical?.[scope] !== undefined) {\n    return check.critical[scope] === true;\n  }\n\n  return scope === \"readiness\" || scope === \"startup\";\n}\n\nfunction asError (value: unknown): Error {\n  return value instanceof Error ? value : new Error(String(value));\n}\n\nfunction shouldRetry (\n  status: string, retryOn?: readonly string[]\n): boolean {\n  return (retryOn ?? [\"unhealthy\"]).includes(status);\n}\n\nfunction retryDelay (\n  baseDelay: number, attempt: number, backoff: \"none\" | \"linear\" | \"exponential\" | undefined\n): number {\n  if (backoff === \"exponential\") {\n    return baseDelay * 2 ** Math.max(\n      0, attempt - 1\n    );\n  }\n\n  if (backoff === \"linear\") {\n    return baseDelay * attempt;\n  }\n\n  return baseDelay;\n}\n\nasync function runLimited<T> (\n  items: readonly T[], concurrency: number, task: (item: T) => Promise<void>\n): Promise<void> {\n  let cursor = 0;\n  const workers = Array.from(\n    {\n      length: Math.min(\n        concurrency, items.length\n      ),\n    }, async () => {\n      while (cursor < items.length) {\n        const item = items[cursor];\n        cursor += 1;\n\n        if (item !== undefined) {\n          await task(item);\n        }\n      }\n    }\n  );\n\n  await Promise.all(workers);\n}\n\nexport function createHealthManager (options: HealthManagerOptions): HealthManager {\n  const checks = new Map<string, HealthCheckDefinition>();\n  const collectors = new Map<string, MetricCollectorDefinition>();\n  const disposers: Array<() => void> = [];\n  const runtime: RuntimeAdapter = options.runtime === \"auto\" || !options.runtime\n    ? autoRuntimeAdapter()\n    : options.runtime;\n  const defaults = options.defaults ?? {};\n  const concurrency = defaults.concurrency ?? DEFAULT_CONCURRENCY;\n  let shutdownState: { shuttingDown: boolean, reason?: string } = { shuttingDown: false, };\n\n  for (const check of options.checks ?? []) {\n    checks.set(\n      check.name, check\n    );\n  }\n\n  for (const collector of options.collectors ?? []) {\n    collectors.set(\n      collector.name, collector\n    );\n  }\n\n  const manager: HealthManager = {\n    register (check) {\n      checks.set(\n        check.name, check\n      );\n      return manager;\n    },\n    registerCollector (collector) {\n      collectors.set(\n        collector.name, collector\n      );\n      return manager;\n    },\n    unregister (name) {\n      return checks.delete(name) || collectors.delete(name);\n    },\n    async run (\n      scope, runOptions = {}\n    ) {\n      const observedAt = new Date().toISOString();\n      const startedAt = runtime.now();\n      const profile = runOptions.profile\n        ?? (scope !== \"all\" ? options.profiles?.[scope] : undefined)\n        ?? options.profiles?.default\n        ?? defaults.profile\n        ?? DEFAULT_PROFILE;\n      const selectedChecks = Array.from(checks.values()).filter((check) => isScopeMatch(\n        check.scopes, scope\n      ));\n      const selectedCollectors = Array.from(collectors.values()).filter((collector) => isScopeMatch(\n        collector.scopes, scope\n      ));\n      const results: HealthCheckResult[] = [];\n      const metrics: HealthMetric[] = [];\n      const resources: Record<string, unknown> = {};\n\n      const makeContext = (signal: AbortSignal): HealthRunContext => ({\n        scope,\n        signal,\n        runtime,\n        service: options.service,\n        profile,\n        now: runtime.now,\n        getShutdownState: () => shutdownState,\n        result: (result) => result,\n      });\n\n      async function runCheck (check: HealthCheckDefinition): Promise<HealthCheckResult> {\n        const timeoutMs = check.timeoutMs ?? runOptions.timeoutMs ?? defaults.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n        const maxAttempts = Math.max(\n          0, check.retries?.attempts ?? 0\n        ) + 1;\n        let lastResult: HealthCheckResult | undefined;\n\n        for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\n          const attemptStartedAt = runtime.now();\n          const attemptObservedAt = new Date().toISOString();\n          const { signal, dispose, } = createAbortSignal(\n            timeoutMs, runOptions.signal\n          );\n          let timedOut = false;\n\n          try {\n            const timeoutPromise = new Promise<never>((\n              _, reject\n            ) => {\n              signal.addEventListener(\n                \"abort\", () => {\n                  timedOut = signal.reason instanceof DOMException && signal.reason.name === \"TimeoutError\";\n                  reject(signal.reason);\n                }, { once: true, }\n              );\n            });\n            const runResult = await Promise.race([\n              Promise.resolve(check.run(makeContext(signal))),\n              timeoutPromise\n            ]);\n            const result: HealthCheckResult = {\n              name: check.name,\n              component: check.component,\n              scope,\n              status: runResult.status,\n              critical: isCritical(\n                check, scope\n              ),\n              observedAt: attemptObservedAt,\n              durationMs: runtime.now() - attemptStartedAt,\n              timedOut: false,\n              attempt,\n              metrics: runResult.metrics ?? {},\n              details: runResult.details,\n              error: runResult.error,\n              tags: check.tags,\n            };\n\n            lastResult = result;\n\n            if (attempt < maxAttempts && shouldRetry(\n              result.status, check.retries?.retryOn\n            )) {\n              await sleep(\n                retryDelay(\n                  check.retries?.delayMs ?? 0, attempt, check.retries?.backoff\n                ), runOptions.signal\n              );\n              continue;\n            }\n\n            return result;\n          } catch (errorValue) {\n            const error = asError(errorValue);\n            const aborted = runOptions.signal?.aborted === true && !timedOut;\n            const includeStack = runOptions.includeStacks ?? defaults.includeStack ?? false;\n            lastResult = {\n              name: check.name,\n              component: check.component,\n              scope,\n              status: timedOut && defaults.unhealthyOnTimeout === false ? \"degraded\" : \"unhealthy\",\n              critical: isCritical(\n                check, scope\n              ),\n              observedAt: attemptObservedAt,\n              durationMs: runtime.now() - attemptStartedAt,\n              timedOut,\n              attempt,\n              metrics: {},\n              error: {\n                code: timedOut\n                  ? HEALTH_ERROR_CODES.CHECK_TIMEOUT\n                  : aborted\n                    ? HEALTH_ERROR_CODES.CHECK_ABORTED\n                    : HEALTH_ERROR_CODES.CHECK_THROWN,\n                message: timedOut\n                  ? \"Health check timed out.\"\n                  : aborted\n                    ? \"Health check was aborted.\"\n                    : \"Health check threw an error.\",\n                causeName: error.name,\n                causeMessage: error.message,\n                stack: includeStack ? error.stack : undefined,\n              },\n              tags: check.tags,\n            };\n\n            if (attempt < maxAttempts) {\n              await sleep(\n                retryDelay(\n                  check.retries?.delayMs ?? 0, attempt, check.retries?.backoff\n                ), runOptions.signal\n              );\n              continue;\n            }\n          } finally {\n            dispose();\n          }\n        }\n\n        return lastResult as HealthCheckResult;\n      }\n\n      await runLimited(\n        selectedChecks, concurrency, async (check) => {\n          results.push(await runCheck(check));\n        }\n      );\n\n      await runLimited(\n        selectedCollectors, concurrency, async (collector) => {\n          const { signal, dispose, } = createAbortSignal(\n            collector.timeoutMs ?? defaults.timeoutMs ?? DEFAULT_TIMEOUT_MS, runOptions.signal\n          );\n          try {\n            const collection: MetricCollectionResult = await collector.collect(makeContext(signal));\n            metrics.push(...collection.metrics);\n            Object.assign(\n              resources, collection.resources ?? {}\n            );\n          } catch {\n            metrics.push({\n              name: `collector.${collector.name}.up`,\n              value: 0,\n              unit: \"state\",\n              type: \"gauge\",\n              labels: { collector: collector.name, },\n            });\n          } finally {\n            dispose();\n          }\n        }\n      );\n\n      const summary = summarizeChecks(results);\n\n      return {\n        schemaVersion: \"2.0\",\n        service: options.service,\n        scope,\n        status: aggregateStatus(results),\n        observedAt,\n        durationMs: runtime.now() - startedAt,\n        runtime: runtime.getRuntimeInfo(),\n        environment: options.environment,\n        summary,\n        checks: results.sort((\n          a, b\n        ) => a.name.localeCompare(b.name)),\n        metrics,\n        resources: Object.keys(resources).length > 0 ? resources : undefined,\n      };\n    },\n    setShutdownState (\n      state, reason\n    ) {\n      shutdownState = { shuttingDown: state, reason, };\n    },\n    isShuttingDown () {\n      return shutdownState.shuttingDown;\n    },\n    dispose () {\n      for (const dispose of disposers.splice(0)) {\n        dispose();\n      }\n    },\n  };\n\n  if (runtime.onShutdown) {\n    disposers.push(runtime.onShutdown(\n      [\n        \"SIGTERM\",\n        \"SIGINT\"\n      ], (signal) => manager.setShutdownState(\n        true, signal\n      )\n    ));\n  }\n\n  return manager;\n}\n", "import type {\n  HealthReport,\n  RedactionPolicy\n} from \"./types\";\n\nconst DEFAULT_REDACTION: RedactionPolicy = {\n  redactSecrets: true,\n  redactUrls: \"query\",\n  includeStack: false,\n  includeErrorMessage: false,\n};\n\nconst SECRET_KEY_PATTERN = /token|secret|password|authorization|cookie|api[_-]?key|connection|string/i;\n\nfunction redactUrl (\n  value: string, mode: RedactionPolicy[\"redactUrls\"]\n): string {\n  if (mode === \"none\") return value;\n\n  try {\n    const url = new URL(value);\n    if (mode === \"full\") return \"[redacted-url]\";\n    if (mode === \"origin\") return url.origin;\n    url.search = \"\";\n    url.hash = \"\";\n    return url.toString();\n  } catch {\n    return value;\n  }\n}\n\nfunction sanitizeValue (\n  key: string, value: unknown, policy: RedactionPolicy\n): unknown {\n  if (policy.redactSecrets && SECRET_KEY_PATTERN.test(key)) {\n    return \"[redacted]\";\n  }\n\n  if (typeof value === \"string\") {\n    return redactUrl(\n      value, policy.redactUrls\n    );\n  }\n\n  if (Array.isArray(value)) {\n    return value.map((item) => sanitizeValue(\n      key, item, policy\n    ));\n  }\n\n  if (value && typeof value === \"object\") {\n    return sanitizeObject(\n      value as Record<string, unknown>, policy\n    );\n  }\n\n  return value;\n}\n\nfunction sanitizeObject (\n  value: Record<string, unknown>, policy: RedactionPolicy\n): Record<string, unknown> {\n  const result: Record<string, unknown> = {};\n\n  for (const [\n    key,\n    entry\n  ] of Object.entries(value)) {\n    if (policy.allowedDetailKeys && !policy.allowedDetailKeys.includes(key)) {\n      continue;\n    }\n\n    result[key] = sanitizeValue(\n      key, entry, policy\n    );\n  }\n\n  return result;\n}\n\nexport interface HealthJsonOptions {\n  includeDetails?: boolean\n  redact?: boolean\n  redaction?: Partial<RedactionPolicy>\n}\n\nexport function toHealthJson (\n  report: HealthReport, options: HealthJsonOptions = {}\n): HealthReport {\n  const policy = { ...DEFAULT_REDACTION, ...options.redaction, };\n  const redact = options.redact ?? true;\n  const includeDetails = options.includeDetails ?? false;\n\n  return {\n    ...report,\n    checks: report.checks.map((check) => ({\n      ...check,\n      details: includeDetails && check.details\n        ? (redact\n          ? sanitizeObject(\n            check.details, policy\n          )\n          : check.details)\n        : undefined,\n      error: check.error\n        ? {\n          ...check.error,\n          message: policy.includeErrorMessage ? check.error.message : \"Health check failed.\",\n          causeMessage: policy.includeErrorMessage ? check.error.causeMessage : undefined,\n          stack: policy.includeStack ? check.error.stack : undefined,\n        }\n        : undefined,\n    })),\n    resources: report.resources && redact\n      ? sanitizeObject(\n        report.resources, policy\n      )\n      : report.resources,\n  };\n}\n\nexport function stringifyHealthJson (\n  report: HealthReport, options?: HealthJsonOptions\n): string {\n  return JSON.stringify(toHealthJson(\n    report, options\n  ));\n}\n", "import { defineHealthCheck } from \"./core/define\";\nimport { HEALTH_ERROR_CODES } from \"./core/errors\";\n\nimport type {\n  HealthCheckDefinition,\n  HealthMetrics,\n  HealthScope\n} from \"./core/types\";\n\nexport interface HttpCheckOptions {\n  scopes?: readonly HealthScope[]\n  method?: \"GET\" | \"HEAD\" | \"POST\"\n  headers?: HeadersInit\n  body?: BodyInit | null\n  expectedStatus?: number | readonly number[] | { min: number, max: number }\n  validateBody?: (body: string, response: Response) => boolean | Promise<boolean>\n  timeoutMs?: number\n}\n\nfunction isExpectedStatus (\n  status: number, expected: HttpCheckOptions[\"expectedStatus\"]\n): boolean {\n  if (!expected) return status >= 200 && status <= 399;\n  if (typeof expected === \"number\") return status === expected;\n  if (Array.isArray(expected)) return expected.includes(status);\n  if (!(\"min\" in expected)) return false;\n  return status >= expected.min && status <= expected.max;\n}\n\nexport function httpCheck (\n  name: string, url: string | URL, options: HttpCheckOptions = {}\n): HealthCheckDefinition<string> {\n  return defineHealthCheck({\n    name,\n    component: \"http\",\n    scopes: options.scopes ?? [\"readiness\"],\n    critical: { readiness: true, diagnostics: false, },\n    timeoutMs: options.timeoutMs,\n    async run (ctx) {\n      const startedAt = ctx.now();\n\n      try {\n        const response = await fetch(\n          url, {\n            method: options.method ?? \"GET\",\n            headers: options.headers,\n            body: options.body,\n            signal: ctx.signal,\n          }\n        );\n        const latencyMs = ctx.now() - startedAt;\n        const expected = isExpectedStatus(\n          response.status, options.expectedStatus\n        );\n\n        if (!expected) {\n          return {\n            status: \"unhealthy\",\n            metrics: {\n              latencyMs,\n              statusCode: response.status,\n              responseBytes: null,\n              up: false,\n            } satisfies HealthMetrics,\n            error: {\n              code: HEALTH_ERROR_CODES.HTTP_STATUS_MISMATCH,\n              message: \"HTTP status did not match.\",\n            },\n          };\n        }\n\n        if (options.validateBody) {\n          const body = await response.text();\n          const valid = await options.validateBody(\n            body, response\n          );\n\n          if (!valid) {\n            return {\n              status: \"unhealthy\",\n              metrics: {\n                latencyMs,\n                statusCode: response.status,\n                responseBytes: body.length,\n                up: false,\n              } satisfies HealthMetrics,\n              error: {\n                code: HEALTH_ERROR_CODES.HTTP_BODY_MISMATCH,\n                message: \"HTTP body did not match.\",\n              },\n            };\n          }\n\n          return {\n            status: \"ok\",\n            metrics: {\n              latencyMs,\n              statusCode: response.status,\n              responseBytes: body.length,\n              up: true,\n            } satisfies HealthMetrics,\n          };\n        }\n\n        return {\n          status: \"ok\",\n          metrics: {\n            latencyMs,\n            statusCode: response.status,\n            responseBytes: null,\n            up: true,\n          } satisfies HealthMetrics,\n        };\n      } catch (errorValue) {\n        const error = errorValue instanceof Error ? errorValue : new Error(String(errorValue));\n\n        return {\n          status: \"unhealthy\",\n          metrics: {\n            latencyMs: ctx.now() - startedAt,\n            statusCode: null,\n            responseBytes: null,\n            up: false,\n          } satisfies HealthMetrics,\n          error: {\n            code: HEALTH_ERROR_CODES.HEALTHCHECK_DEPENDENCY_UNAVAILABLE,\n            message: \"HTTP dependency is unavailable.\",\n            causeName: error.name,\n            causeMessage: error.message,\n          },\n        };\n      }\n    },\n  });\n}\n"],
  "mappings": "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",
  "names": ["_a", "_b"]
}
