@stainlessdev/xray-emitter 0.1.0-dev.2c5bc4c → 0.1.0-dev.7eabc37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/README.md +1 -2
  2. package/dist/{chunk-DBI3HXNR.cjs → chunk-22W6MSR2.cjs} +47 -47
  3. package/dist/chunk-22W6MSR2.cjs.map +1 -0
  4. package/dist/{chunk-XO6YWDFL.cjs → chunk-3LDFK62Q.cjs} +47 -21
  5. package/dist/chunk-3LDFK62Q.cjs.map +1 -0
  6. package/dist/{chunk-YVMMCTXW.js → chunk-7KT6EPVZ.js} +1 -1
  7. package/dist/{chunk-YVMMCTXW.js.map → chunk-7KT6EPVZ.js.map} +1 -1
  8. package/dist/{chunk-2HW4AEKB.cjs → chunk-BVAENKYE.cjs} +28 -28
  9. package/dist/chunk-BVAENKYE.cjs.map +1 -0
  10. package/dist/{chunk-GNSXLLEC.cjs → chunk-CPHFCOA5.cjs} +9 -9
  11. package/dist/{chunk-GNSXLLEC.cjs.map → chunk-CPHFCOA5.cjs.map} +1 -1
  12. package/dist/{chunk-TSCMZ5TV.js → chunk-DKHGODGO.js} +28 -2
  13. package/dist/chunk-DKHGODGO.js.map +1 -0
  14. package/dist/{chunk-JKW6E4L3.cjs → chunk-DNBARLGB.cjs} +1 -1
  15. package/dist/{chunk-JKW6E4L3.cjs.map → chunk-DNBARLGB.cjs.map} +1 -1
  16. package/dist/{chunk-ZP5OEA4I.js → chunk-LJYBYC7N.js} +4 -4
  17. package/dist/chunk-LJYBYC7N.js.map +1 -0
  18. package/dist/{chunk-6UH43LVD.js → chunk-NTIUR3OC.js} +2 -2
  19. package/dist/{chunk-WTHVUHGI.js → chunk-ZCC372UX.js} +4 -4
  20. package/dist/chunk-ZCC372UX.js.map +1 -0
  21. package/dist/effect.cjs +19 -19
  22. package/dist/effect.cjs.map +1 -1
  23. package/dist/effect.d.cts +30 -3
  24. package/dist/effect.d.ts +30 -3
  25. package/dist/effect.js +4 -4
  26. package/dist/effect.js.map +1 -1
  27. package/dist/emitter-Bi_m_w5h.d.cts +10 -0
  28. package/dist/emitter-Dy7bRGTq.d.ts +10 -0
  29. package/dist/express.cjs +7 -7
  30. package/dist/express.cjs.map +1 -1
  31. package/dist/express.d.cts +9 -2
  32. package/dist/express.d.ts +9 -2
  33. package/dist/express.js +4 -4
  34. package/dist/express.js.map +1 -1
  35. package/dist/fastify.cjs +10 -10
  36. package/dist/fastify.cjs.map +1 -1
  37. package/dist/fastify.d.cts +9 -2
  38. package/dist/fastify.d.ts +9 -2
  39. package/dist/fastify.js +4 -4
  40. package/dist/fastify.js.map +1 -1
  41. package/dist/fetch.cjs +5 -5
  42. package/dist/fetch.d.cts +39 -2
  43. package/dist/fetch.d.ts +39 -2
  44. package/dist/fetch.js +4 -4
  45. package/dist/hono.cjs +9 -9
  46. package/dist/hono.cjs.map +1 -1
  47. package/dist/hono.d.cts +15 -3
  48. package/dist/hono.d.ts +15 -3
  49. package/dist/hono.js +4 -4
  50. package/dist/hono.js.map +1 -1
  51. package/dist/index.cjs +3 -3
  52. package/dist/index.d.cts +8 -2
  53. package/dist/index.d.ts +8 -2
  54. package/dist/index.js +2 -2
  55. package/dist/internal.cjs +3 -3
  56. package/dist/internal.d.cts +1 -1
  57. package/dist/internal.d.ts +1 -1
  58. package/dist/internal.js +2 -2
  59. package/dist/next.cjs +7 -7
  60. package/dist/next.cjs.map +1 -1
  61. package/dist/next.d.cts +9 -3
  62. package/dist/next.d.ts +9 -3
  63. package/dist/next.js +4 -4
  64. package/dist/next.js.map +1 -1
  65. package/dist/node.cjs +5 -5
  66. package/dist/node.d.cts +42 -1
  67. package/dist/node.d.ts +42 -1
  68. package/dist/node.js +4 -4
  69. package/dist/remix.cjs +7 -7
  70. package/dist/remix.cjs.map +1 -1
  71. package/dist/remix.d.cts +10 -3
  72. package/dist/remix.d.ts +10 -3
  73. package/dist/remix.js +4 -4
  74. package/dist/remix.js.map +1 -1
  75. package/dist/types-BrKvhHbn.d.cts +446 -0
  76. package/dist/types-BrKvhHbn.d.ts +446 -0
  77. package/package.json +1 -1
  78. package/dist/chunk-2HW4AEKB.cjs.map +0 -1
  79. package/dist/chunk-DBI3HXNR.cjs.map +0 -1
  80. package/dist/chunk-TSCMZ5TV.js.map +0 -1
  81. package/dist/chunk-WTHVUHGI.js.map +0 -1
  82. package/dist/chunk-XO6YWDFL.cjs.map +0 -1
  83. package/dist/chunk-ZP5OEA4I.js.map +0 -1
  84. package/dist/emitter-BqfrGIod.d.cts +0 -5
  85. package/dist/emitter-CScYhwGA.d.ts +0 -5
  86. package/dist/types-Z1nirh-F.d.cts +0 -149
  87. package/dist/types-Z1nirh-F.d.ts +0 -149
  88. /package/dist/{chunk-6UH43LVD.js.map → chunk-NTIUR3OC.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/fetch/emitter.ts","../src/fetch/adapter.ts"],"sourcesContent":["// Use the bare package import so that Node.js resolves to the Node build (http\n// transport) while bundlers (webpack, vite, wrangler/esbuild) follow the\n// package.json \"browser\" field and resolve to the browser build automatically.\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto';\nimport {\n createEmitter as createCoreEmitter,\n normalizeConfig,\n type XrayRuntimeConfig,\n} from '../core/index';\n\n/**\n * Create a fetch/edge runtime emitter using OTLP HTTP transport by default.\n *\n * Pass `config.exporter.instance` to provide a custom `SpanExporter`.\n */\nexport function createEmitter(config: XrayRuntimeConfig) {\n const resolved = normalizeConfig(config);\n const exporter =\n config.exporter?.instance ??\n new OTLPTraceExporter({\n url: resolved.exporter.endpointUrl,\n headers: resolved.exporter.headers ?? {},\n timeoutMillis: resolved.exporter.timeoutMs,\n });\n\n return createCoreEmitter(config, exporter);\n}\n","import type {\n CaptureConfig,\n NormalizedRequest,\n RedactionConfig,\n RequestLog,\n XrayContext,\n XrayEmitter,\n} from '../core/index';\nimport {\n LimitedBuffer,\n bindContextToObject,\n getXrayContextFromObject,\n headerValuesFromFetchHeaders,\n isWebsocketUpgradeFetch,\n logWithLevel,\n makeCapturedBody,\n setCaptureOverride,\n setContextRequestId,\n setContextRoute,\n setRedactionOverride,\n generateRequestId,\n} from '../core/internal';\n\nexport interface WrapOptions {\n /**\n * Explicit route pattern for this handler (for example `/users/:id`).\n */\n route?: string;\n /**\n * Explicit request ID. Skips header lookup/generation when provided.\n */\n requestId?: string;\n /**\n * Per-handler capture overrides.\n */\n capture?: Partial<CaptureConfig>;\n /**\n * Per-handler redaction overrides.\n */\n redaction?: Partial<RedactionConfig>;\n /**\n * Hook called after request context is created.\n */\n onRequest?: (ctx: XrayContext) => void;\n /**\n * Hook called after the request has been finalized and logged.\n */\n onResponse?: (ctx: XrayContext, log: RequestLog) => void;\n /**\n * Hook called when request handling fails.\n */\n onError?: (ctx: XrayContext, err: unknown) => void;\n}\n\n/**\n * Wrap a fetch-style handler with X-ray instrumentation.\n *\n * This variant may replace the request/response objects to safely capture\n * bodies and inject a request ID response header when needed.\n */\nexport function wrapFetch(\n handler: (req: Request) => Response | Promise<Response>,\n xray: XrayEmitter,\n options?: WrapOptions,\n): (req: Request) => Promise<Response> {\n return async (req: Request) => {\n const normalizedRequest: NormalizedRequest = {\n method: req.method,\n url: req.url,\n route: options?.route,\n headers: headerValuesFromFetchHeaders(req.headers),\n requestId: options?.requestId,\n startTimeMs: Date.now(),\n };\n\n const ctx = xray.startRequest(normalizedRequest);\n bindContextToObject(req, ctx);\n\n if (options?.requestId) {\n setContextRequestId(ctx, options.requestId);\n }\n if (options?.route) {\n setContextRoute(ctx, options.route);\n }\n if (options?.capture) {\n setCaptureOverride(ctx, options.capture);\n }\n if (options?.redaction) {\n setRedactionOverride(ctx, options.redaction);\n }\n\n if (options?.onRequest) {\n try {\n options.onRequest(ctx);\n } catch (err) {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: onRequest failed', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n const capture = options?.capture\n ? { ...xray.config.capture, ...options.capture }\n : xray.config.capture;\n const requestCapture =\n capture.requestBody === 'none' ? null : wrapRequestBody(req, capture.maxBodyBytes);\n const requestForHandler = requestCapture?.request ?? req;\n if (requestForHandler !== req) {\n bindContextToObject(requestForHandler, ctx);\n }\n\n let response: Response;\n try {\n response = await handler(requestForHandler);\n } catch (err) {\n const log = xray.endRequest(\n ctx,\n {\n statusCode: undefined,\n headers: undefined,\n body: undefined,\n endTimeMs: Date.now(),\n },\n err,\n );\n if (options?.onError) {\n try {\n options.onError(ctx, err);\n } catch (errInner) {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: onError failed', {\n error: errInner instanceof Error ? errInner.message : String(errInner),\n });\n }\n }\n if (options?.onResponse) {\n try {\n options.onResponse(ctx, log);\n } catch (errInner) {\n logWithLevel(\n xray.config.logger,\n 'warn',\n xray.config.logLevel,\n 'xray: onResponse failed',\n {\n error: errInner instanceof Error ? errInner.message : String(errInner),\n },\n );\n }\n }\n throw err;\n }\n\n if (!(response instanceof Response)) {\n const log = xray.endRequest(ctx, {\n statusCode: undefined,\n headers: undefined,\n body: undefined,\n endTimeMs: Date.now(),\n });\n if (options?.onResponse) {\n try {\n options.onResponse(ctx, log);\n } catch (err) {\n logWithLevel(\n xray.config.logger,\n 'warn',\n xray.config.logLevel,\n 'xray: onResponse failed',\n {\n error: err instanceof Error ? err.message : String(err),\n },\n );\n }\n }\n return response;\n }\n\n const responseHeaders = new Headers(response.headers);\n ensureResponseRequestIdHeaders(responseHeaders, ctx, xray);\n const statusCode = response.status;\n const isUpgrade = isWebsocketUpgradeFetch(statusCode, req.headers, responseHeaders);\n\n if (!response.body || isUpgrade || capture.responseBody === 'none') {\n const log = finalizeResponse(\n ctx,\n xray,\n normalizedRequest,\n capture,\n requestCapture?.capture ?? null,\n responseHeaders,\n statusCode,\n null,\n );\n if (options?.onResponse) {\n try {\n options.onResponse(ctx, log);\n } catch (err) {\n logWithLevel(\n xray.config.logger,\n 'warn',\n xray.config.logLevel,\n 'xray: onResponse failed',\n {\n error: err instanceof Error ? err.message : String(err),\n },\n );\n }\n }\n return new Response(response.body, {\n headers: responseHeaders,\n status: response.status,\n statusText: response.statusText,\n });\n }\n\n const responseCapture = new LimitedBuffer(capture.maxBodyBytes);\n let finished = false;\n const finalize = () => {\n if (finished) {\n return;\n }\n finished = true;\n const log = finalizeResponse(\n ctx,\n xray,\n normalizedRequest,\n capture,\n requestCapture?.capture ?? null,\n responseHeaders,\n statusCode,\n responseCapture,\n );\n if (options?.onResponse) {\n try {\n options.onResponse(ctx, log);\n } catch (err) {\n logWithLevel(\n xray.config.logger,\n 'warn',\n xray.config.logLevel,\n 'xray: onResponse failed',\n {\n error: err instanceof Error ? err.message : String(err),\n },\n );\n }\n }\n };\n\n const wrappedBody = wrapReadableStream(response.body, responseCapture, finalize, () => {\n finalize();\n });\n\n return new Response(wrappedBody, {\n headers: responseHeaders,\n status: response.status,\n statusText: response.statusText,\n });\n };\n}\n\n/**\n * Wrap a fetch-style handler while preserving original request/response objects\n * whenever possible.\n *\n * If a missing request ID header must be injected and response headers are\n * immutable, this wrapper may still replace the response object.\n */\nexport function wrapFetchPreserve(\n handler: (req: Request) => Response | Promise<Response>,\n xray: XrayEmitter,\n options?: WrapOptions,\n): (req: Request) => Promise<Response> {\n return async (req: Request) => {\n const normalizedRequest: NormalizedRequest = {\n method: req.method,\n url: req.url,\n route: options?.route,\n headers: headerValuesFromFetchHeaders(req.headers),\n requestId: options?.requestId,\n startTimeMs: Date.now(),\n };\n\n const ctx = xray.startRequest(normalizedRequest);\n bindContextToObject(req, ctx);\n\n if (options?.requestId) {\n setContextRequestId(ctx, options.requestId);\n }\n if (options?.route) {\n setContextRoute(ctx, options.route);\n }\n if (options?.capture) {\n setCaptureOverride(ctx, options.capture);\n }\n if (options?.redaction) {\n setRedactionOverride(ctx, options.redaction);\n }\n\n if (options?.onRequest) {\n try {\n options.onRequest(ctx);\n } catch (err) {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: onRequest failed', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n const capture = options?.capture\n ? { ...xray.config.capture, ...options.capture }\n : xray.config.capture;\n const requestCapturePromise =\n capture.requestBody === 'none'\n ? Promise.resolve(null)\n : captureRequestClone(req, capture.maxBodyBytes, xray);\n\n let response: Response;\n try {\n response = await handler(req);\n } catch (err) {\n const log = xray.endRequest(\n ctx,\n {\n statusCode: undefined,\n headers: undefined,\n body: undefined,\n endTimeMs: Date.now(),\n },\n err,\n );\n if (options?.onError) {\n try {\n options.onError(ctx, err);\n } catch (errInner) {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: onError failed', {\n error: errInner instanceof Error ? errInner.message : String(errInner),\n });\n }\n }\n if (options?.onResponse) {\n try {\n options.onResponse(ctx, log);\n } catch (errInner) {\n logWithLevel(\n xray.config.logger,\n 'warn',\n xray.config.logLevel,\n 'xray: onResponse failed',\n {\n error: errInner instanceof Error ? errInner.message : String(errInner),\n },\n );\n }\n }\n throw err;\n }\n\n if (!(response instanceof Response)) {\n const log = xray.endRequest(ctx, {\n statusCode: undefined,\n headers: undefined,\n body: undefined,\n endTimeMs: Date.now(),\n });\n if (options?.onResponse) {\n try {\n options.onResponse(ctx, log);\n } catch (err) {\n logWithLevel(\n xray.config.logger,\n 'warn',\n xray.config.logLevel,\n 'xray: onResponse failed',\n {\n error: err instanceof Error ? err.message : String(err),\n },\n );\n }\n }\n return response;\n }\n\n const responseHeaders = new Headers(response.headers);\n const ensured = ensureResponseRequestIdHeaders(responseHeaders, ctx, xray);\n if (ensured.set) {\n const headerName = canonicalHeaderName(xray.config.requestId.header);\n try {\n response.headers.set(headerName, ensured.value ?? '');\n } catch {\n response = new Response(response.body, {\n headers: responseHeaders,\n status: response.status,\n statusText: response.statusText,\n });\n }\n }\n const statusCode = response.status;\n const isUpgrade = isWebsocketUpgradeFetch(statusCode, req.headers, responseHeaders);\n const responseCapturePromise =\n !response.body || isUpgrade || capture.responseBody === 'none'\n ? Promise.resolve(null)\n : captureResponseClone(response, capture.maxBodyBytes, xray);\n\n void (async () => {\n const [requestCapture, responseCapture] = await Promise.all([\n requestCapturePromise,\n responseCapturePromise,\n ]);\n const log = finalizeResponse(\n ctx,\n xray,\n normalizedRequest,\n capture,\n requestCapture,\n responseHeaders,\n statusCode,\n responseCapture,\n );\n if (options?.onResponse) {\n try {\n options.onResponse(ctx, log);\n } catch (err) {\n logWithLevel(\n xray.config.logger,\n 'warn',\n xray.config.logLevel,\n 'xray: onResponse failed',\n {\n error: err instanceof Error ? err.message : String(err),\n },\n );\n }\n }\n })().catch((err) => {\n logWithLevel(\n xray.config.logger,\n 'warn',\n xray.config.logLevel,\n 'xray: response capture failed',\n {\n error: err instanceof Error ? err.message : String(err),\n },\n );\n });\n\n return response;\n };\n}\n\n/**\n * Retrieve the `XrayContext` bound to a fetch `Request`.\n */\nexport function getXrayContext(req: Request): XrayContext | undefined {\n return getXrayContextFromObject(req);\n}\n\ntype RequestCapture = {\n buffer: LimitedBuffer;\n read: boolean;\n};\n\nfunction wrapRequestBody(\n request: Request,\n limit: number,\n): { capture: RequestCapture | null; request: Request } {\n if (limit <= 0 || !request.body || request.bodyUsed) {\n return { capture: null, request };\n }\n\n const originalBody = request.body;\n const capture: RequestCapture = {\n buffer: new LimitedBuffer(limit),\n read: false,\n };\n\n let controller: ReadableStreamDefaultController<Uint8Array> | null = null;\n let started = false;\n let reader: ReadableStreamDefaultReader<Uint8Array> | null = null;\n\n const wrappedStream = new ReadableStream<Uint8Array>({\n start(c) {\n controller = c;\n },\n async cancel(reason) {\n if (!started) {\n return;\n }\n try {\n await reader?.cancel(reason);\n } finally {\n // Ignore cancellation.\n }\n },\n });\n\n const startPump = () => {\n if (started) {\n return;\n }\n started = true;\n reader = originalBody.getReader();\n void (async () => {\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n controller?.close();\n return;\n }\n if (value) {\n capture.read = true;\n capture.buffer.write(value);\n controller?.enqueue(value);\n }\n }\n } catch (err) {\n controller?.error(err);\n }\n })();\n };\n\n const originalGetReader = wrappedStream.getReader.bind(wrappedStream);\n (wrappedStream as unknown as { getReader: typeof wrappedStream.getReader }).getReader = (\n ...args: unknown[]\n ) => {\n startPump();\n // @ts-expect-error - preserve built-in `getReader` overloads\n return originalGetReader(...args);\n };\n\n const init: RequestInit & { duplex?: 'half' } = {\n body: wrappedStream,\n cache: request.cache,\n credentials: request.credentials,\n headers: request.headers,\n integrity: request.integrity,\n keepalive: request.keepalive,\n method: request.method,\n mode: request.mode,\n redirect: request.redirect,\n referrer: request.referrer,\n referrerPolicy: request.referrerPolicy,\n signal: request.signal,\n };\n if (isNodeRuntime()) {\n init.duplex = 'half';\n }\n\n const wrappedRequest = new Request(request.url, init);\n return { capture, request: wrappedRequest };\n}\n\nasync function captureRequestClone(\n request: Request,\n limit: number,\n xray: XrayEmitter,\n): Promise<LimitedBuffer | null> {\n if (limit <= 0 || !request.body || request.bodyUsed) {\n return null;\n }\n let clone: Request;\n try {\n clone = request.clone();\n } catch {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: request clone failed');\n return null;\n }\n\n const buffer = new LimitedBuffer(limit);\n await readStreamToBuffer(clone.body, buffer);\n return buffer;\n}\n\nasync function captureResponseClone(\n response: Response,\n limit: number,\n xray: XrayEmitter,\n): Promise<LimitedBuffer | null> {\n if (limit <= 0 || !response.body || response.bodyUsed) {\n return null;\n }\n let clone: Response;\n try {\n clone = response.clone();\n } catch {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: response clone failed');\n return null;\n }\n\n const buffer = new LimitedBuffer(limit);\n await readStreamToBuffer(clone.body, buffer);\n return buffer;\n}\n\nasync function readStreamToBuffer(\n stream: ReadableStream<Uint8Array> | null,\n buffer: LimitedBuffer,\n): Promise<void> {\n if (!stream) {\n return;\n }\n\n const reader = stream.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n return;\n }\n if (value) {\n buffer.write(value);\n }\n }\n } finally {\n try {\n reader.releaseLock();\n } catch {\n // Ignore release failures; reader may already be closed.\n }\n }\n}\n\nfunction wrapReadableStream(\n stream: ReadableStream<Uint8Array>,\n capture: LimitedBuffer,\n onFinish: () => void,\n onError?: (err: unknown) => void,\n): ReadableStream<Uint8Array> {\n const reader = stream.getReader();\n\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n try {\n const { done, value } = await reader.read();\n if (done) {\n controller.close();\n onFinish();\n try {\n reader.releaseLock();\n } catch {\n // Ignore release failures; reader may already be closed.\n }\n return;\n }\n if (value) {\n capture.write(value);\n controller.enqueue(value);\n }\n } catch (err) {\n controller.error(err);\n onError?.(err);\n onFinish();\n try {\n reader.releaseLock();\n } catch {\n // Ignore release failures; reader may already be closed.\n }\n }\n },\n async cancel(reason) {\n try {\n await reader.cancel(reason);\n } finally {\n onFinish();\n try {\n reader.releaseLock();\n } catch {\n // Ignore release failures; reader may already be closed.\n }\n }\n },\n });\n}\n\nfunction finalizeResponse(\n ctx: XrayContext,\n xray: XrayEmitter,\n normalizedRequest: NormalizedRequest,\n capture: CaptureConfig,\n requestCapture: RequestCapture | LimitedBuffer | null,\n responseHeaders: Headers,\n statusCode: number,\n responseCapture: LimitedBuffer | null,\n): RequestLog {\n if (requestCapture) {\n const buffer = requestCapture instanceof LimitedBuffer ? requestCapture : requestCapture.buffer;\n const read = requestCapture instanceof LimitedBuffer ? true : requestCapture.read;\n if (read) {\n normalizedRequest.body = makeCapturedBody(\n buffer.bytes(),\n buffer.totalBytes(),\n buffer.truncated(),\n capture.requestBody === 'text' ? 'text' : 'base64',\n );\n }\n }\n\n const responseBody = responseCapture\n ? makeCapturedBody(\n responseCapture.bytes(),\n responseCapture.totalBytes(),\n responseCapture.truncated(),\n capture.responseBody === 'text' ? 'text' : 'base64',\n )\n : undefined;\n\n return xray.endRequest(ctx, {\n statusCode,\n headers: headerValuesFromFetchHeaders(responseHeaders),\n body: responseBody,\n endTimeMs: Date.now(),\n });\n}\n\nfunction ensureResponseRequestIdHeaders(\n headers: Headers,\n ctx: XrayContext,\n xray: XrayEmitter,\n): { value?: string; set: boolean } {\n const headerName = xray.config.requestId.header;\n const existing = normalizeRequestIdCandidate(headers.get(headerName) ?? undefined);\n if (existing) {\n return { value: existing, set: false };\n }\n\n const explicit = normalizeRequestIdCandidate(ctx.requestId);\n if (explicit) {\n headers.set(canonicalHeaderName(headerName), explicit);\n return { value: explicit, set: true };\n }\n\n const generated = generateRequestId();\n headers.set(canonicalHeaderName(headerName), generated);\n setContextRequestId(ctx, generated);\n return { value: generated, set: true };\n}\n\nfunction isNodeRuntime(): boolean {\n const maybeProcess = (\n globalThis as typeof globalThis & {\n process?: { versions?: { node?: string } };\n }\n ).process;\n return !!maybeProcess?.versions?.node;\n}\n\nfunction normalizeRequestIdCandidate(value: string | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed ? trimmed : undefined;\n}\n\nfunction canonicalHeaderName(headerName: string): string {\n return headerName\n .split('-')\n .filter(Boolean)\n .map((part) => (part ? part[0]!.toUpperCase() + part.slice(1) : part))\n .join('-');\n}\n"],"mappings":"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","names":["createEmitter"]}
@@ -2,7 +2,7 @@ import {
2
2
  bindObject,
3
3
  getContextFromObject,
4
4
  getContextState
5
- } from "./chunk-YVMMCTXW.js";
5
+ } from "./chunk-7KT6EPVZ.js";
6
6
 
7
7
  // src/core/limited_buffer.ts
8
8
  var LimitedBuffer = class {
@@ -278,4 +278,4 @@ export {
278
278
  setCaptureOverride,
279
279
  setRedactionOverride
280
280
  };
281
- //# sourceMappingURL=chunk-6UH43LVD.js.map
281
+ //# sourceMappingURL=chunk-NTIUR3OC.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createEmitter,
3
3
  normalizeConfig
4
- } from "./chunk-TSCMZ5TV.js";
4
+ } from "./chunk-DKHGODGO.js";
5
5
  import {
6
6
  LimitedBuffer,
7
7
  bindContextToObject,
@@ -12,12 +12,12 @@ import {
12
12
  setContextRequestId,
13
13
  setContextRoute,
14
14
  setRedactionOverride
15
- } from "./chunk-6UH43LVD.js";
15
+ } from "./chunk-NTIUR3OC.js";
16
16
  import {
17
17
  generateRequestId,
18
18
  logWithLevel,
19
19
  makeCapturedBody
20
- } from "./chunk-YVMMCTXW.js";
20
+ } from "./chunk-7KT6EPVZ.js";
21
21
 
22
22
  // src/node/emitter.ts
23
23
  import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-proto";
@@ -631,4 +631,4 @@ export {
631
631
  wrapHttpHandler,
632
632
  getXrayContext
633
633
  };
634
- //# sourceMappingURL=chunk-WTHVUHGI.js.map
634
+ //# sourceMappingURL=chunk-ZCC372UX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/node/emitter.ts","../src/node/adapter.ts"],"sourcesContent":["import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto';\nimport {\n createEmitter as createCoreEmitter,\n normalizeConfig,\n type XrayRuntimeConfig,\n} from '../core/index';\n\n/**\n * Create a Node runtime emitter using OTLP HTTP transport by default.\n *\n * Pass `config.exporter.instance` to provide a custom `SpanExporter`.\n */\nexport function createEmitter(config: XrayRuntimeConfig) {\n const resolved = normalizeConfig(config);\n const exporter =\n config.exporter?.instance ??\n new OTLPTraceExporter({\n url: resolved.exporter.endpointUrl,\n headers: resolved.exporter.headers ?? {},\n timeoutMillis: resolved.exporter.timeoutMs,\n });\n\n return createCoreEmitter(config, exporter);\n}\n","import type { IncomingMessage, ServerResponse } from 'node:http';\nimport { TLSSocket } from 'node:tls';\nimport type {\n CaptureConfig,\n NormalizedRequest,\n NormalizedResponse,\n RedactionConfig,\n RequestLog,\n XrayContext,\n XrayEmitter,\n} from '../core/index';\nimport {\n LimitedBuffer,\n bindContextToObject,\n getXrayContextFromObject,\n headerValuesFromNodeHeaders,\n isWebsocketUpgrade,\n logWithLevel,\n makeCapturedBody,\n setCaptureOverride,\n setContextRequestId,\n setContextRoute,\n setRedactionOverride,\n generateRequestId,\n} from '../core/internal';\n\n/**\n * Handler signature for `node:http` request listeners.\n */\nexport type NodeHttpHandler = (req: IncomingMessage, res: ServerResponse) => void | Promise<void>;\n\n/**\n * Per-handler overrides for `wrapHttpHandler`.\n */\nexport interface WrapOptions {\n /**\n * Explicit route pattern for this handler (for example `/users/:id`).\n */\n route?: string;\n /**\n * Explicit request ID. Skips header lookup/generation when provided.\n */\n requestId?: string;\n /**\n * Per-handler capture overrides.\n */\n capture?: Partial<CaptureConfig>;\n /**\n * Per-handler redaction overrides.\n */\n redaction?: Partial<RedactionConfig>;\n /**\n * Hook called after request context is created.\n */\n onRequest?: (ctx: XrayContext) => void;\n /**\n * Hook called after the request has been finalized and logged.\n */\n onResponse?: (ctx: XrayContext, log: RequestLog) => void;\n /**\n * Hook called when request handling fails.\n */\n onError?: (ctx: XrayContext, err: unknown) => void;\n}\n\n/**\n * Wrap a `node:http` request handler with X-ray instrumentation.\n *\n * The wrapper binds `XrayContext` to both `req` and `res`, captures configured\n * request/response metadata, and ensures a response request ID header is set.\n */\nexport function wrapHttpHandler(\n handler: NodeHttpHandler,\n xray: XrayEmitter,\n options?: WrapOptions,\n): NodeHttpHandler {\n return (req, res) => {\n const normalizedRequest: NormalizedRequest = {\n method: req.method ?? 'GET',\n url: fullUrl(req),\n route: options?.route,\n headers: headerValuesFromNodeHeaders(\n req.headers as Record<string, string | string[] | number | undefined>,\n ),\n requestId: options?.requestId,\n remoteAddress: req.socket?.remoteAddress,\n startTimeMs: Date.now(),\n };\n\n trackExpressParams(req);\n\n const ctx = xray.startRequest(normalizedRequest);\n bindContextToObject(req, ctx);\n bindContextToObject(res, ctx);\n\n if (options?.requestId) {\n setContextRequestId(ctx, options.requestId);\n }\n if (options?.route) {\n setContextRoute(ctx, options.route);\n }\n if (options?.capture) {\n setCaptureOverride(ctx, options.capture);\n }\n if (options?.redaction) {\n setRedactionOverride(ctx, options.redaction);\n }\n\n if (options?.onRequest) {\n try {\n options.onRequest(ctx);\n } catch (err) {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: onRequest failed', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n const capture = options?.capture\n ? { ...xray.config.capture, ...options.capture }\n : xray.config.capture;\n\n const requestCapture =\n capture.requestBody === 'none' ? null : wrapRequestBody(req, capture.maxBodyBytes);\n const recorder = new ResponseRecorder(\n capture.responseBody !== 'none',\n capture.maxBodyBytes,\n (response) => {\n ensureResponseRequestId(response, ctx, xray);\n },\n );\n recorder.wrap(res);\n\n let finished = false;\n let capturedError: unknown;\n let onErrorCalled = false;\n\n const finish = () => {\n if (finished) {\n return;\n }\n finished = true;\n if (!normalizedRequest.route) {\n const route = resolveExpressRoute(req);\n if (route) {\n normalizedRequest.route = route;\n }\n }\n\n if (requestCapture && requestCapture.read) {\n normalizedRequest.body = makeCapturedBody(\n requestCapture.buffer.bytes(),\n requestCapture.buffer.totalBytes(),\n requestCapture.buffer.truncated(),\n capture.requestBody === 'text' ? 'text' : 'base64',\n );\n }\n\n const responseHeaders = recorder.headersSnapshot(res.getHeaders());\n const recordedStatus = recorder.statusCode() ?? res.statusCode;\n const statusCode = capturedError && !recorder.hasWrittenHeader() ? 500 : recordedStatus;\n const isUpgrade = isWebsocketUpgrade(\n statusCode ?? 0,\n normalizedRequest.headers,\n responseHeaders,\n );\n\n const responseBody =\n recorder.bodyCaptured() && !isUpgrade\n ? makeCapturedBody(\n recorder.body(),\n recorder.totalBytes(),\n recorder.truncated(),\n capture.responseBody === 'text' ? 'text' : 'base64',\n )\n : undefined;\n\n const normalizedResponse: NormalizedResponse = {\n statusCode: statusCode ?? undefined,\n headers: responseHeaders,\n body: responseBody,\n endTimeMs: Date.now(),\n };\n\n const log = xray.endRequest(ctx, normalizedResponse, capturedError);\n\n if (capturedError && options?.onError && !onErrorCalled) {\n onErrorCalled = true;\n try {\n options.onError(ctx, capturedError);\n } catch (err) {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: onError failed', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n if (options?.onResponse) {\n try {\n options.onResponse(ctx, log);\n } catch (err) {\n logWithLevel(\n xray.config.logger,\n 'warn',\n xray.config.logLevel,\n 'xray: onResponse failed',\n {\n error: err instanceof Error ? err.message : String(err),\n },\n );\n }\n }\n };\n\n res.once('finish', finish);\n res.once('close', finish);\n\n try {\n const result = handler(req, res);\n if (result && typeof (result as Promise<void>).catch === 'function') {\n void (result as Promise<void>).catch((err) => {\n capturedError = err;\n if (options?.onError && !onErrorCalled) {\n onErrorCalled = true;\n try {\n options.onError(ctx, err);\n } catch (errInner) {\n logWithLevel(\n xray.config.logger,\n 'warn',\n xray.config.logLevel,\n 'xray: onError failed',\n {\n error: errInner instanceof Error ? errInner.message : String(errInner),\n },\n );\n }\n }\n });\n }\n } catch (err) {\n capturedError = err;\n if (options?.onError && !onErrorCalled) {\n onErrorCalled = true;\n try {\n options.onError(ctx, err);\n } catch (errInner) {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: onError failed', {\n error: errInner instanceof Error ? errInner.message : String(errInner),\n });\n }\n }\n throw err;\n }\n };\n}\n\n/**\n * Retrieve the `XrayContext` bound to a Node `IncomingMessage`.\n */\nexport function getXrayContext(req: IncomingMessage): XrayContext | undefined {\n return getXrayContextFromObject(req);\n}\n\ntype RequestCapture = {\n buffer: LimitedBuffer;\n read: boolean;\n userConsuming: boolean;\n};\n\nfunction wrapRequestBody(req: IncomingMessage, limit: number): RequestCapture | null {\n if (limit <= 0) {\n return null;\n }\n if (!hasRequestBody(req)) {\n return null;\n }\n\n const capture: RequestCapture = {\n buffer: new LimitedBuffer(limit),\n read: false,\n userConsuming: false,\n };\n\n const originalPush = req.push;\n req.push = function push(chunk: unknown, encoding?: BufferEncoding): boolean {\n if (chunk != null) {\n recordChunk(capture, chunk, encoding);\n }\n return originalPush.call(req, chunk as any, encoding as any);\n } as typeof req.push;\n\n const originalEmit = req.emit;\n req.emit = function emit(event: string, ...args: unknown[]): boolean {\n if (event === 'data' && capture.userConsuming && args[0] != null) {\n capture.read = true;\n }\n if (event === 'end' && capture.userConsuming) {\n capture.read = true;\n }\n return originalEmit.call(req, event, ...args);\n } as typeof req.emit;\n\n const originalOn = req.on;\n req.on = function on(event: string, listener: (...args: any[]) => void): any {\n if (event === 'data' || event === 'readable') {\n capture.userConsuming = true;\n }\n return originalOn.call(req, event, listener);\n } as typeof req.on;\n\n const originalOnce = req.once;\n req.once = function once(event: string, listener: (...args: any[]) => void): any {\n if (event === 'data' || event === 'readable') {\n capture.userConsuming = true;\n }\n return originalOnce.call(req, event, listener);\n } as typeof req.once;\n\n const originalAddListener = req.addListener;\n req.addListener = function addListener(event: string, listener: (...args: any[]) => void): any {\n if (event === 'data' || event === 'readable') {\n capture.userConsuming = true;\n }\n return originalAddListener.call(req, event, listener);\n } as typeof req.addListener;\n\n const originalPipe = req.pipe;\n req.pipe = function pipe(destination: unknown, options?: unknown): unknown {\n capture.userConsuming = true;\n return originalPipe.call(req, destination as any, options as any);\n } as typeof req.pipe;\n\n const originalRead = req.read;\n req.read = function read(size?: number): any {\n capture.userConsuming = true;\n const chunk = originalRead.call(req, size as any) as unknown;\n const readableFlowing = (req as IncomingMessage & { readableFlowing?: boolean | null })\n .readableFlowing;\n const hasDataListeners =\n typeof req.listenerCount === 'function' && req.listenerCount('data') > 0;\n if (!hasDataListeners && readableFlowing !== true && chunk != null) {\n capture.read = true;\n }\n return chunk as any;\n } as typeof req.read;\n\n return capture;\n}\n\nfunction hasRequestBody(req: IncomingMessage): boolean {\n if (req.headers['content-length'] != null) {\n return true;\n }\n if (req.headers['transfer-encoding'] != null) {\n return true;\n }\n return false;\n}\n\nfunction recordChunk(capture: RequestCapture, chunk: unknown, encoding?: BufferEncoding): void {\n const bytes = toBytes(chunk, encoding);\n if (!bytes) {\n return;\n }\n capture.buffer.write(bytes);\n}\n\nfunction toBytes(chunk: unknown, encoding?: BufferEncoding): Uint8Array | null {\n if (chunk == null) {\n return null;\n }\n if (typeof chunk === 'string') {\n return Buffer.from(chunk, encoding);\n }\n if (chunk instanceof Uint8Array) {\n return chunk;\n }\n if (chunk instanceof ArrayBuffer) {\n return new Uint8Array(chunk);\n }\n return null;\n}\n\nclass ResponseRecorder {\n private readonly buffer: LimitedBuffer | null;\n private headerSnapshot?: Record<string, string | string[] | number | undefined>;\n private status?: number;\n private wroteHeader = false;\n private bytes = 0;\n private readonly onHeader?: (res: ServerResponse) => void;\n\n constructor(captureBody: boolean, maxBodySize: number, onHeader?: (res: ServerResponse) => void) {\n this.buffer = captureBody ? new LimitedBuffer(maxBodySize) : null;\n this.onHeader = onHeader;\n }\n\n body(): Uint8Array {\n return this.buffer?.bytes() ?? new Uint8Array();\n }\n\n totalBytes(): number {\n return this.buffer?.totalBytes() ?? 0;\n }\n\n bodyCaptured(): boolean {\n return !!this.buffer && this.buffer.totalBytes() > 0;\n }\n\n bytesWritten(): number {\n return this.bytes;\n }\n\n hasWrittenHeader(): boolean {\n return this.wroteHeader;\n }\n\n headersSnapshot(\n defaultHeaders: Record<string, string | string[] | number | undefined>,\n ): Record<string, string | string[]> {\n if (this.headerSnapshot) {\n return headerValuesFromNodeHeaders(this.headerSnapshot);\n }\n return headerValuesFromNodeHeaders(defaultHeaders);\n }\n\n statusCode(): number | undefined {\n return this.status;\n }\n\n truncated(): boolean {\n return this.buffer?.truncated() ?? false;\n }\n\n wrap(res: ServerResponse): void {\n const originalWriteHead = res.writeHead;\n res.writeHead = ((statusCode: number, ...args: any[]) => {\n if (!this.wroteHeader) {\n this.applyWriteHeadHeaders(res, args);\n }\n this.recordHeader(res, statusCode);\n return (originalWriteHead as any).call(res, statusCode, ...args);\n }) as typeof res.writeHead;\n\n const originalWrite = res.write;\n res.write = ((chunk: unknown, encoding?: BufferEncoding, cb?: (err?: Error | null) => void) => {\n this.recordHeader(res, res.statusCode ?? 200);\n this.recordWrite(chunk, encoding);\n return originalWrite.call(res, chunk as any, encoding as any, cb as any);\n }) as typeof res.write;\n\n const originalEnd = res.end;\n res.end = ((chunk?: unknown, encoding?: BufferEncoding, cb?: () => void) => {\n this.recordHeader(res, res.statusCode ?? 200);\n if (chunk) {\n this.recordWrite(chunk, encoding);\n }\n return originalEnd.call(res, chunk as any, encoding as any, cb as any);\n }) as typeof res.end;\n\n if (typeof res.flushHeaders === 'function') {\n const originalFlush = res.flushHeaders;\n res.flushHeaders = (() => {\n this.recordHeader(res, res.statusCode ?? 200);\n return originalFlush.call(res);\n }) as typeof res.flushHeaders;\n }\n }\n\n private recordHeader(res: ServerResponse, statusCode: number): void {\n if (this.wroteHeader) {\n return;\n }\n this.onHeader?.(res);\n this.wroteHeader = true;\n this.status = statusCode;\n this.headerSnapshot = { ...res.getHeaders() } as Record<\n string,\n string | string[] | number | undefined\n >;\n }\n\n private applyWriteHeadHeaders(res: ServerResponse, args: any[]): void {\n if (args.length === 0) {\n return;\n }\n const headersArg = typeof args[0] === 'string' ? args[1] : args[0];\n if (!headersArg) {\n return;\n }\n if (Array.isArray(headersArg)) {\n if (headersArg.length === 0) {\n return;\n }\n if (typeof headersArg[0] === 'string') {\n for (let i = 0; i < headersArg.length - 1; i += 2) {\n const name = headersArg[i];\n const value = headersArg[i + 1];\n if (typeof name === 'string' && value !== undefined && value !== null) {\n res.setHeader(name, value as any);\n }\n }\n return;\n }\n for (const entry of headersArg) {\n if (!Array.isArray(entry)) {\n continue;\n }\n const [name, value] = entry;\n if (typeof name === 'string' && value !== undefined && value !== null) {\n res.setHeader(name, value as any);\n }\n }\n return;\n }\n if (typeof headersArg === 'object') {\n for (const [name, value] of Object.entries(headersArg as Record<string, unknown>)) {\n if (value !== undefined && value !== null) {\n res.setHeader(name, value as any);\n }\n }\n }\n }\n\n private recordWrite(chunk: unknown, encoding?: BufferEncoding): void {\n const bytes = toBytes(chunk, encoding);\n if (!bytes) {\n return;\n }\n this.bytes += bytes.length;\n if (this.buffer) {\n this.buffer.write(bytes);\n }\n }\n}\n\nfunction ensureResponseRequestId(res: ServerResponse, ctx: XrayContext, xray: XrayEmitter): void {\n const headerName = xray.config.requestId.header;\n const existing = headerValueFromNode(res.getHeader(headerName));\n if (existing) {\n return;\n }\n\n const explicit = normalizeRequestIdCandidate(ctx.requestId);\n if (explicit) {\n res.setHeader(canonicalHeaderName(headerName), explicit);\n return;\n }\n\n const generated = generateRequestId();\n res.setHeader(canonicalHeaderName(headerName), generated);\n setContextRequestId(ctx, generated);\n}\n\nfunction fullUrl(req: IncomingMessage): string {\n const requestUrl = resolveRequestUrl(req);\n if (!requestUrl) {\n return '';\n }\n if (requestUrl.startsWith('http://') || requestUrl.startsWith('https://')) {\n return requestUrl;\n }\n\n const host = req.headers['host'];\n if (!host || typeof host !== 'string') {\n return requestUrl;\n }\n const scheme = req.socket instanceof TLSSocket ? 'https' : 'http';\n return `${scheme}://${host}${requestUrl}`;\n}\n\nfunction resolveRequestUrl(req: IncomingMessage): string {\n const requestUrl = req.url ?? '';\n if (requestUrl.startsWith('http://') || requestUrl.startsWith('https://')) {\n return requestUrl;\n }\n\n const expressReq = req as IncomingMessage & { originalUrl?: unknown };\n if (typeof expressReq.originalUrl === 'string' && expressReq.originalUrl.length > 0) {\n return expressReq.originalUrl;\n }\n return requestUrl;\n}\n\nfunction headerValueFromNode(value: unknown): string | undefined {\n if (value == null) {\n return undefined;\n }\n if (Array.isArray(value)) {\n return normalizeRequestIdCandidate(value[0]);\n }\n return normalizeRequestIdCandidate(`${value}`);\n}\n\nfunction normalizeRequestIdCandidate(value: string | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed ? trimmed : undefined;\n}\n\nfunction canonicalHeaderName(headerName: string): string {\n return headerName\n .split('-')\n .filter(Boolean)\n .map((part) => (part ? part[0]!.toUpperCase() + part.slice(1) : part))\n .join('-');\n}\n\ntype ExpressRoutePath = string | string[] | RegExp;\n\ntype ExpressRouteParams = Record<string, string | string[]>;\n\nconst expressParamsHistory = new WeakMap<IncomingMessage, ExpressRouteParams[]>();\n\nfunction trackExpressParams(req: IncomingMessage): void {\n if (expressParamsHistory.has(req)) {\n return;\n }\n const anyReq = req as IncomingMessage & { app?: unknown };\n if (typeof anyReq.app !== 'function') {\n return;\n }\n\n const history: ExpressRouteParams[] = [];\n expressParamsHistory.set(req, history);\n\n const descriptor = Object.getOwnPropertyDescriptor(req, 'params');\n if (descriptor && !descriptor.configurable) {\n if (descriptor.value && typeof descriptor.value === 'object') {\n history.push({ ...(descriptor.value as ExpressRouteParams) });\n }\n return;\n }\n\n let current = (\n descriptor && 'value' in descriptor\n ? (descriptor.value as ExpressRouteParams | undefined)\n : undefined\n ) as ExpressRouteParams | undefined;\n if (current && typeof current === 'object') {\n history.push({ ...current });\n }\n\n Object.defineProperty(req, 'params', {\n configurable: true,\n enumerable: descriptor?.enumerable ?? true,\n get() {\n return current;\n },\n set(value) {\n current = value as ExpressRouteParams | undefined;\n if (value && typeof value === 'object') {\n history.push({ ...(value as ExpressRouteParams) });\n }\n },\n });\n}\n\nfunction resolveExpressRoute(req: IncomingMessage): string | undefined {\n const anyReq = req as IncomingMessage & {\n baseUrl?: string;\n params?: ExpressRouteParams;\n route?: { path?: ExpressRoutePath };\n };\n const routePath = extractExpressRoutePath(anyReq.route?.path);\n const baseUrl = anyReq.baseUrl ?? '';\n if (!routePath && !baseUrl) {\n return undefined;\n }\n\n const params = collectExpressParams(req, anyReq.params);\n const resolvedBaseUrl = replaceBaseUrlParams(baseUrl, params, routePath);\n return joinExpressRoute(resolvedBaseUrl, routePath);\n}\n\nfunction extractExpressRoutePath(path?: ExpressRoutePath): string | undefined {\n if (typeof path === 'string') {\n return path;\n }\n if (Array.isArray(path)) {\n for (const entry of path) {\n if (typeof entry === 'string') {\n return entry;\n }\n }\n }\n return undefined;\n}\n\nfunction collectExpressParams(\n req: IncomingMessage,\n fallback?: ExpressRouteParams,\n): ExpressRouteParams {\n const history = expressParamsHistory.get(req);\n if (!history || history.length === 0) {\n return fallback ?? {};\n }\n\n const merged: ExpressRouteParams = {};\n for (const snapshot of history) {\n for (const [key, value] of Object.entries(snapshot)) {\n if (!(key in merged)) {\n merged[key] = value;\n }\n }\n }\n if (fallback) {\n for (const [key, value] of Object.entries(fallback)) {\n if (!(key in merged)) {\n merged[key] = value;\n }\n }\n }\n return merged;\n}\n\nfunction replaceBaseUrlParams(\n baseUrl: string,\n params: ExpressRouteParams,\n routePath?: string,\n): string {\n if (!baseUrl) {\n return baseUrl;\n }\n const entries = Object.entries(params);\n if (entries.length === 0) {\n return baseUrl;\n }\n\n const excluded = new Set(routePath ? extractExpressParamNames(routePath) : []);\n const replacements = entries\n .filter(([name]) => !excluded.has(name))\n .map(([name, value]) => ({ name, value: Array.isArray(value) ? value[0] : value }))\n .filter((entry): entry is { name: string; value: string } => !!entry.value);\n\n if (replacements.length === 0) {\n return baseUrl;\n }\n\n const used = new Set<string>();\n const encodedCache = new Map<string, string>();\n const segments = baseUrl.split('/');\n const updated = segments.map((segment) => {\n if (!segment) {\n return segment;\n }\n for (const { name, value } of replacements) {\n if (used.has(name)) {\n continue;\n }\n const encodedValue = encodedCache.get(value) ?? encodeURIComponent(value);\n encodedCache.set(value, encodedValue);\n if (segment === value || segment === encodedValue) {\n used.add(name);\n return `:${name}`;\n }\n }\n return segment;\n });\n\n return updated.join('/');\n}\n\nfunction extractExpressParamNames(path: string): string[] {\n const names: string[] = [];\n const paramPattern = /:([A-Za-z0-9_]+)(?:\\([^)]*\\))?[?*+]?/g;\n for (const match of path.matchAll(paramPattern)) {\n const name = match[1];\n if (name) {\n names.push(name);\n }\n }\n return names;\n}\n\nfunction joinExpressRoute(baseUrl: string, routePath?: string): string {\n const base = baseUrl ? ensureLeadingSlash(baseUrl) : '';\n const route = routePath ? ensureLeadingSlash(routePath) : '';\n if (!base) {\n return route || '/';\n }\n if (!route || route === '/') {\n return base;\n }\n const trimmedBase = base.endsWith('/') ? base.slice(0, -1) : base;\n return `${trimmedBase}${route}`;\n}\n\nfunction ensureLeadingSlash(path: string): string {\n if (!path) {\n return '/';\n }\n return path.startsWith('/') ? path : `/${path}`;\n}\n"],"mappings":"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","names":["createEmitter"]}
package/dist/effect.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
2
 
3
- var _chunkDBI3HXNRcjs = require('./chunk-DBI3HXNR.cjs');
4
- require('./chunk-XO6YWDFL.cjs');
3
+ var _chunk22W6MSR2cjs = require('./chunk-22W6MSR2.cjs');
4
+ require('./chunk-3LDFK62Q.cjs');
5
5
 
6
6
 
7
7
 
@@ -9,17 +9,17 @@ require('./chunk-XO6YWDFL.cjs');
9
9
 
10
10
 
11
11
 
12
- var _chunkGNSXLLECcjs = require('./chunk-GNSXLLEC.cjs');
12
+ var _chunkCPHFCOA5cjs = require('./chunk-CPHFCOA5.cjs');
13
13
 
14
14
 
15
15
 
16
- var _chunkJKW6E4L3cjs = require('./chunk-JKW6E4L3.cjs');
16
+ var _chunkDNBARLGBcjs = require('./chunk-DNBARLGB.cjs');
17
17
 
18
18
  // src/effect/effect.ts
19
19
  var _effect = require('effect');
20
20
  var _platform = require('@effect/platform');
21
21
  function createEmitter2(config, options) {
22
- const emitter = _chunkDBI3HXNRcjs.createEmitter.call(void 0, config);
22
+ const emitter = _chunk22W6MSR2cjs.createEmitter.call(void 0, config);
23
23
  const middleware = createEffectMiddleware(emitter, options);
24
24
  middleware.flush = emitter.flush;
25
25
  middleware.shutdown = emitter.shutdown;
@@ -41,7 +41,7 @@ function createEffectMiddleware(xray, options) {
41
41
  const maxBytes = xray.config.capture.maxBodyBytes;
42
42
  const truncated = bytes.length > maxBytes;
43
43
  const slice = truncated ? bytes.slice(0, maxBytes) : bytes;
44
- requestBody = _chunkJKW6E4L3cjs.makeCapturedBody.call(void 0, slice, bytes.length, truncated, captureReqBody);
44
+ requestBody = _chunkDNBARLGBcjs.makeCapturedBody.call(void 0, slice, bytes.length, truncated, captureReqBody);
45
45
  }
46
46
  }
47
47
  const normalizedRequest = {
@@ -55,24 +55,24 @@ function createEffectMiddleware(xray, options) {
55
55
  startTimeMs: Date.now()
56
56
  };
57
57
  const ctx = xray.startRequest(normalizedRequest);
58
- _chunkGNSXLLECcjs.bindContextToObject.call(void 0, request, ctx);
58
+ _chunkCPHFCOA5cjs.bindContextToObject.call(void 0, request, ctx);
59
59
  if (_optionalChain([options, 'optionalAccess', _3 => _3.requestId])) {
60
- _chunkGNSXLLECcjs.setContextRequestId.call(void 0, ctx, options.requestId);
60
+ _chunkCPHFCOA5cjs.setContextRequestId.call(void 0, ctx, options.requestId);
61
61
  }
62
62
  if (route) {
63
- _chunkGNSXLLECcjs.setContextRoute.call(void 0, ctx, route);
63
+ _chunkCPHFCOA5cjs.setContextRoute.call(void 0, ctx, route);
64
64
  }
65
65
  if (_optionalChain([options, 'optionalAccess', _4 => _4.capture])) {
66
- _chunkGNSXLLECcjs.setCaptureOverride.call(void 0, ctx, options.capture);
66
+ _chunkCPHFCOA5cjs.setCaptureOverride.call(void 0, ctx, options.capture);
67
67
  }
68
68
  if (_optionalChain([options, 'optionalAccess', _5 => _5.redaction])) {
69
- _chunkGNSXLLECcjs.setRedactionOverride.call(void 0, ctx, options.redaction);
69
+ _chunkCPHFCOA5cjs.setRedactionOverride.call(void 0, ctx, options.redaction);
70
70
  }
71
71
  if (_optionalChain([options, 'optionalAccess', _6 => _6.onRequest])) {
72
72
  try {
73
73
  options.onRequest(ctx);
74
74
  } catch (err) {
75
- _chunkJKW6E4L3cjs.logWithLevel.call(void 0, xray.config.logger, "warn", xray.config.logLevel, "xray: onRequest failed", {
75
+ _chunkDNBARLGBcjs.logWithLevel.call(void 0, xray.config.logger, "warn", xray.config.logLevel, "xray: onRequest failed", {
76
76
  error: err instanceof Error ? err.message : String(err)
77
77
  });
78
78
  }
@@ -91,7 +91,7 @@ function createEffectMiddleware(xray, options) {
91
91
  try {
92
92
  options.onResponse(ctx, log2);
93
93
  } catch (err) {
94
- _chunkJKW6E4L3cjs.logWithLevel.call(void 0,
94
+ _chunkDNBARLGBcjs.logWithLevel.call(void 0,
95
95
  xray.config.logger,
96
96
  "warn",
97
97
  xray.config.logLevel,
@@ -118,7 +118,7 @@ function createEffectMiddleware(xray, options) {
118
118
  try {
119
119
  options.onError(ctx, error);
120
120
  } catch (errInner) {
121
- _chunkJKW6E4L3cjs.logWithLevel.call(void 0, xray.config.logger, "warn", xray.config.logLevel, "xray: onError failed", {
121
+ _chunkDNBARLGBcjs.logWithLevel.call(void 0, xray.config.logger, "warn", xray.config.logLevel, "xray: onError failed", {
122
122
  error: errInner instanceof Error ? errInner.message : String(errInner)
123
123
  });
124
124
  }
@@ -127,7 +127,7 @@ function createEffectMiddleware(xray, options) {
127
127
  try {
128
128
  options.onResponse(ctx, log);
129
129
  } catch (errInner) {
130
- _chunkJKW6E4L3cjs.logWithLevel.call(void 0,
130
+ _chunkDNBARLGBcjs.logWithLevel.call(void 0,
131
131
  xray.config.logger,
132
132
  "warn",
133
133
  xray.config.logLevel,
@@ -142,9 +142,9 @@ function createEffectMiddleware(xray, options) {
142
142
  }));
143
143
  }
144
144
  function getXrayContext(request) {
145
- return _chunkGNSXLLECcjs.getXrayContextFromObject.call(void 0, request);
145
+ return _chunkCPHFCOA5cjs.getXrayContextFromObject.call(void 0, request);
146
146
  }
147
- var currentXrayContext = _effect.Effect.map(_platform.HttpServerRequest.HttpServerRequest, (request) => _chunkGNSXLLECcjs.getXrayContextFromObject.call(void 0, request));
147
+ var currentXrayContext = _effect.Effect.map(_platform.HttpServerRequest.HttpServerRequest, (request) => _chunkCPHFCOA5cjs.getXrayContextFromObject.call(void 0, request));
148
148
  function effectHeadersToRecord(headers) {
149
149
  const result = {};
150
150
  for (const [key, value] of Object.entries(headers)) {
@@ -172,7 +172,7 @@ function captureResponseBody(xray, response) {
172
172
  const maxBytes = xray.config.capture.maxBodyBytes;
173
173
  const truncated = body.body.length > maxBytes;
174
174
  const slice = truncated ? body.body.slice(0, maxBytes) : body.body;
175
- return _chunkJKW6E4L3cjs.makeCapturedBody.call(void 0, slice, body.body.length, truncated, mode);
175
+ return _chunkDNBARLGBcjs.makeCapturedBody.call(void 0, slice, body.body.length, truncated, mode);
176
176
  }
177
177
  return void 0;
178
178
  }
@@ -182,5 +182,5 @@ function captureResponseBody(xray, response) {
182
182
 
183
183
 
184
184
 
185
- exports.createCoreEmitter = _chunkDBI3HXNRcjs.createEmitter; exports.createEffectMiddleware = createEffectMiddleware; exports.createEmitter = createEmitter2; exports.currentXrayContext = currentXrayContext; exports.getXrayContext = getXrayContext;
185
+ exports.createCoreEmitter = _chunk22W6MSR2cjs.createEmitter; exports.createEffectMiddleware = createEffectMiddleware; exports.createEmitter = createEmitter2; exports.currentXrayContext = currentXrayContext; exports.getXrayContext = getXrayContext;
186
186
  //# sourceMappingURL=effect.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/xray-emitter-js/xray-emitter-js/dist/effect.cjs","../src/effect/effect.ts"],"names":["createEmitter","log"],"mappings":"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","file":"/home/runner/work/xray-emitter-js/xray-emitter-js/dist/effect.cjs","sourcesContent":[null,"import { Cause, Effect, Exit, Option } from 'effect';\nimport { Headers, HttpApp, HttpRouter, HttpServerError, HttpServerRequest } from '@effect/platform';\nimport type {\n CaptureConfig,\n NormalizedRequest,\n RedactionConfig,\n RequestLog,\n XrayContext,\n XrayEmitter,\n XrayRuntimeConfig,\n} from '../core/index';\nimport { createEmitter as createFetchEmitter } from '../fetch/fetch';\nimport {\n bindContextToObject,\n getXrayContextFromObject,\n logWithLevel,\n makeCapturedBody,\n setCaptureOverride,\n setContextRequestId,\n setContextRoute,\n setRedactionOverride,\n} from '../core/internal';\n\nexport { createEmitter as createCoreEmitter } from '../fetch/fetch';\nexport type {\n CaptureConfig,\n RedactionConfig,\n RequestLog,\n XrayConfig,\n XrayContext,\n XrayEmitter,\n XrayRuntimeConfig,\n} from '../core/index';\n\nexport interface WrapOptions {\n route?: string;\n requestId?: string;\n capture?: Partial<CaptureConfig>;\n redaction?: Partial<RedactionConfig>;\n onRequest?: (ctx: XrayContext) => void;\n onResponse?: (ctx: XrayContext, log: RequestLog) => void;\n onError?: (ctx: XrayContext, err: unknown) => void;\n}\n\ntype EffectMiddleware = <E, R>(httpApp: HttpApp.Default<E, R>) => HttpApp.Default<E, R>;\n\ntype EffectEmitter = EffectMiddleware & {\n flush: XrayEmitter['flush'];\n shutdown: XrayEmitter['shutdown'];\n};\n\nexport function createEmitter(config: XrayRuntimeConfig, options?: WrapOptions): EffectEmitter {\n const emitter = createFetchEmitter(config);\n const middleware = createEffectMiddleware(emitter, options) as EffectEmitter;\n middleware.flush = emitter.flush;\n middleware.shutdown = emitter.shutdown;\n return middleware;\n}\n\nexport function createEffectMiddleware(xray: XrayEmitter, options?: WrapOptions): EffectMiddleware {\n return (<E, R>(httpApp: HttpApp.Default<E, R>): HttpApp.Default<E, R> =>\n Effect.gen(function* () {\n const request = yield* HttpServerRequest.HttpServerRequest;\n\n const headers = effectHeadersToRecord(request.headers);\n const url = buildFullUrl(request.originalUrl, headers);\n\n // Try to read the route pattern from HttpRouter.RouteContext (available\n // when the middleware is applied via HttpRouter.use).\n const routeCtxOption = yield* Effect.serviceOption(HttpRouter.RouteContext);\n const route = Option.isSome(routeCtxOption)\n ? String(routeCtxOption.value.route.path)\n : options?.route;\n\n // Capture request body if configured.\n const captureReqBody = xray.config.capture.requestBody;\n let requestBody: NormalizedRequest['body'];\n if (captureReqBody && captureReqBody !== 'none') {\n const textResult = yield* Effect.either(request.text);\n if (textResult._tag === 'Right') {\n const bytes = new TextEncoder().encode(textResult.right);\n const maxBytes = xray.config.capture.maxBodyBytes;\n const truncated = bytes.length > maxBytes;\n const slice = truncated ? bytes.slice(0, maxBytes) : bytes;\n requestBody = makeCapturedBody(slice, bytes.length, truncated, captureReqBody);\n }\n }\n\n const normalizedRequest: NormalizedRequest = {\n method: request.method,\n url,\n route,\n headers,\n body: requestBody,\n requestId: options?.requestId,\n remoteAddress:\n request.remoteAddress._tag === 'Some' ? request.remoteAddress.value : undefined,\n startTimeMs: Date.now(),\n };\n\n const ctx = xray.startRequest(normalizedRequest);\n bindContextToObject(request, ctx);\n\n if (options?.requestId) {\n setContextRequestId(ctx, options.requestId);\n }\n if (route) {\n setContextRoute(ctx, route);\n }\n if (options?.capture) {\n setCaptureOverride(ctx, options.capture);\n }\n if (options?.redaction) {\n setRedactionOverride(ctx, options.redaction);\n }\n\n if (options?.onRequest) {\n try {\n options.onRequest(ctx);\n } catch (err) {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: onRequest failed', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n const exit = yield* Effect.exit(httpApp);\n\n if (Exit.isSuccess(exit)) {\n const response = exit.value;\n const responseHeaders = effectHeadersToRecord(response.headers);\n\n const log = xray.endRequest(ctx, {\n statusCode: response.status,\n headers: responseHeaders,\n body: captureResponseBody(xray, response),\n endTimeMs: Date.now(),\n });\n\n if (options?.onResponse) {\n try {\n options.onResponse(ctx, log);\n } catch (err) {\n logWithLevel(\n xray.config.logger,\n 'warn',\n xray.config.logLevel,\n 'xray: onResponse failed',\n { error: err instanceof Error ? err.message : String(err) },\n );\n }\n }\n\n return response;\n }\n\n const error = Cause.squash(exit.cause);\n\n // Resolve the HTTP response that the platform would send for this error\n // (e.g. 404 for RouteNotFound, 500 for unhandled). This mirrors what\n // HttpApp.toWebHandler does internally via causeResponse.\n const [errorResponse] = yield* HttpServerError.causeResponse(exit.cause);\n\n const log = xray.endRequest(\n ctx,\n {\n statusCode: errorResponse.status,\n headers: effectHeadersToRecord(errorResponse.headers),\n body: undefined,\n endTimeMs: Date.now(),\n },\n error,\n );\n\n if (options?.onError) {\n try {\n options.onError(ctx, error);\n } catch (errInner) {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: onError failed', {\n error: errInner instanceof Error ? errInner.message : String(errInner),\n });\n }\n }\n\n if (options?.onResponse) {\n try {\n options.onResponse(ctx, log);\n } catch (errInner) {\n logWithLevel(\n xray.config.logger,\n 'warn',\n xray.config.logLevel,\n 'xray: onResponse failed',\n {\n error: errInner instanceof Error ? errInner.message : String(errInner),\n },\n );\n }\n }\n\n return yield* Effect.failCause(exit.cause);\n })) as EffectMiddleware;\n}\n\n/**\n * Retrieve the XrayContext bound to a request object.\n */\nexport function getXrayContext(\n request: HttpServerRequest.HttpServerRequest,\n): XrayContext | undefined {\n return getXrayContextFromObject(request);\n}\n\n/**\n * Effect that retrieves the XrayContext from the current HttpServerRequest in scope.\n */\nexport const currentXrayContext: Effect.Effect<\n XrayContext | undefined,\n never,\n HttpServerRequest.HttpServerRequest\n> = Effect.map(HttpServerRequest.HttpServerRequest, (request) => getXrayContextFromObject(request));\n\nfunction effectHeadersToRecord(headers: Headers.Headers): Record<string, string | string[]> {\n const result: Record<string, string | string[]> = {};\n for (const [key, value] of Object.entries(headers)) {\n if (typeof value === 'string') {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction buildFullUrl(url: string, headers: Record<string, string | string[]>): string {\n if (url.startsWith('http://') || url.startsWith('https://')) {\n return url;\n }\n const host = headers['host'];\n if (!host || typeof host !== 'string') {\n return url;\n }\n return `http://${host}${url}`;\n}\n\nfunction captureResponseBody(\n xray: XrayEmitter,\n response: { body: { _tag: string; body?: unknown; contentLength?: number } },\n): ReturnType<typeof makeCapturedBody> {\n const mode = xray.config.capture.responseBody;\n if (!mode || mode === 'none') return undefined;\n\n const body = response.body;\n if (body._tag === 'Uint8Array' && body.body instanceof Uint8Array) {\n const maxBytes = xray.config.capture.maxBodyBytes;\n const truncated = body.body.length > maxBytes;\n const slice = truncated ? body.body.slice(0, maxBytes) : body.body;\n return makeCapturedBody(slice, body.body.length, truncated, mode);\n }\n return undefined;\n}\n"]}
1
+ {"version":3,"sources":["/home/runner/work/xray-emitter-js/xray-emitter-js/dist/effect.cjs","../src/effect/effect.ts"],"names":["createEmitter","log"],"mappings":"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","file":"/home/runner/work/xray-emitter-js/xray-emitter-js/dist/effect.cjs","sourcesContent":[null,"import { Cause, Effect, Exit, Option } from 'effect';\nimport { Headers, HttpApp, HttpRouter, HttpServerError, HttpServerRequest } from '@effect/platform';\nimport type {\n CaptureConfig,\n NormalizedRequest,\n RedactionConfig,\n RequestLog,\n XrayContext,\n XrayEmitter,\n XrayRuntimeConfig,\n} from '../core/index';\nimport { createEmitter as createFetchEmitter } from '../fetch/fetch';\nimport {\n bindContextToObject,\n getXrayContextFromObject,\n logWithLevel,\n makeCapturedBody,\n setCaptureOverride,\n setContextRequestId,\n setContextRoute,\n setRedactionOverride,\n} from '../core/internal';\n\nexport { createEmitter as createCoreEmitter } from '../fetch/fetch';\nexport type {\n CaptureConfig,\n RedactionConfig,\n RequestLog,\n XrayConfig,\n XrayContext,\n XrayEmitter,\n XrayRuntimeConfig,\n} from '../core/index';\n\nexport interface WrapOptions {\n /**\n * Explicit route pattern for this handler (for example `/users/:id`).\n */\n route?: string;\n /**\n * Explicit request ID. Skips header lookup/generation when provided.\n */\n requestId?: string;\n /**\n * Per-handler capture overrides.\n */\n capture?: Partial<CaptureConfig>;\n /**\n * Per-handler redaction overrides.\n */\n redaction?: Partial<RedactionConfig>;\n /**\n * Hook called after request context is created.\n */\n onRequest?: (ctx: XrayContext) => void;\n /**\n * Hook called after the request has been finalized and logged.\n */\n onResponse?: (ctx: XrayContext, log: RequestLog) => void;\n /**\n * Hook called when request handling fails.\n */\n onError?: (ctx: XrayContext, err: unknown) => void;\n}\n\ntype EffectMiddleware = <E, R>(httpApp: HttpApp.Default<E, R>) => HttpApp.Default<E, R>;\n\ntype EffectEmitter = EffectMiddleware & {\n flush: XrayEmitter['flush'];\n shutdown: XrayEmitter['shutdown'];\n};\n\n/**\n * Create Effect middleware and expose `flush()`/`shutdown()`.\n */\nexport function createEmitter(config: XrayRuntimeConfig, options?: WrapOptions): EffectEmitter {\n const emitter = createFetchEmitter(config);\n const middleware = createEffectMiddleware(emitter, options) as EffectEmitter;\n middleware.flush = emitter.flush;\n middleware.shutdown = emitter.shutdown;\n return middleware;\n}\n\n/**\n * Create Effect middleware from an existing core `XrayEmitter`.\n */\nexport function createEffectMiddleware(xray: XrayEmitter, options?: WrapOptions): EffectMiddleware {\n return (<E, R>(httpApp: HttpApp.Default<E, R>): HttpApp.Default<E, R> =>\n Effect.gen(function* () {\n const request = yield* HttpServerRequest.HttpServerRequest;\n\n const headers = effectHeadersToRecord(request.headers);\n const url = buildFullUrl(request.originalUrl, headers);\n\n // Try to read the route pattern from HttpRouter.RouteContext (available\n // when the middleware is applied via HttpRouter.use).\n const routeCtxOption = yield* Effect.serviceOption(HttpRouter.RouteContext);\n const route = Option.isSome(routeCtxOption)\n ? String(routeCtxOption.value.route.path)\n : options?.route;\n\n // Capture request body if configured.\n const captureReqBody = xray.config.capture.requestBody;\n let requestBody: NormalizedRequest['body'];\n if (captureReqBody && captureReqBody !== 'none') {\n const textResult = yield* Effect.either(request.text);\n if (textResult._tag === 'Right') {\n const bytes = new TextEncoder().encode(textResult.right);\n const maxBytes = xray.config.capture.maxBodyBytes;\n const truncated = bytes.length > maxBytes;\n const slice = truncated ? bytes.slice(0, maxBytes) : bytes;\n requestBody = makeCapturedBody(slice, bytes.length, truncated, captureReqBody);\n }\n }\n\n const normalizedRequest: NormalizedRequest = {\n method: request.method,\n url,\n route,\n headers,\n body: requestBody,\n requestId: options?.requestId,\n remoteAddress:\n request.remoteAddress._tag === 'Some' ? request.remoteAddress.value : undefined,\n startTimeMs: Date.now(),\n };\n\n const ctx = xray.startRequest(normalizedRequest);\n bindContextToObject(request, ctx);\n\n if (options?.requestId) {\n setContextRequestId(ctx, options.requestId);\n }\n if (route) {\n setContextRoute(ctx, route);\n }\n if (options?.capture) {\n setCaptureOverride(ctx, options.capture);\n }\n if (options?.redaction) {\n setRedactionOverride(ctx, options.redaction);\n }\n\n if (options?.onRequest) {\n try {\n options.onRequest(ctx);\n } catch (err) {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: onRequest failed', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n const exit = yield* Effect.exit(httpApp);\n\n if (Exit.isSuccess(exit)) {\n const response = exit.value;\n const responseHeaders = effectHeadersToRecord(response.headers);\n\n const log = xray.endRequest(ctx, {\n statusCode: response.status,\n headers: responseHeaders,\n body: captureResponseBody(xray, response),\n endTimeMs: Date.now(),\n });\n\n if (options?.onResponse) {\n try {\n options.onResponse(ctx, log);\n } catch (err) {\n logWithLevel(\n xray.config.logger,\n 'warn',\n xray.config.logLevel,\n 'xray: onResponse failed',\n { error: err instanceof Error ? err.message : String(err) },\n );\n }\n }\n\n return response;\n }\n\n const error = Cause.squash(exit.cause);\n\n // Resolve the HTTP response that the platform would send for this error\n // (e.g. 404 for RouteNotFound, 500 for unhandled). This mirrors what\n // HttpApp.toWebHandler does internally via causeResponse.\n const [errorResponse] = yield* HttpServerError.causeResponse(exit.cause);\n\n const log = xray.endRequest(\n ctx,\n {\n statusCode: errorResponse.status,\n headers: effectHeadersToRecord(errorResponse.headers),\n body: undefined,\n endTimeMs: Date.now(),\n },\n error,\n );\n\n if (options?.onError) {\n try {\n options.onError(ctx, error);\n } catch (errInner) {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: onError failed', {\n error: errInner instanceof Error ? errInner.message : String(errInner),\n });\n }\n }\n\n if (options?.onResponse) {\n try {\n options.onResponse(ctx, log);\n } catch (errInner) {\n logWithLevel(\n xray.config.logger,\n 'warn',\n xray.config.logLevel,\n 'xray: onResponse failed',\n {\n error: errInner instanceof Error ? errInner.message : String(errInner),\n },\n );\n }\n }\n\n return yield* Effect.failCause(exit.cause);\n })) as EffectMiddleware;\n}\n\n/**\n * Retrieve the XrayContext bound to a request object.\n */\nexport function getXrayContext(\n request: HttpServerRequest.HttpServerRequest,\n): XrayContext | undefined {\n return getXrayContextFromObject(request);\n}\n\n/**\n * Effect that retrieves the XrayContext from the current HttpServerRequest in scope.\n */\nexport const currentXrayContext: Effect.Effect<\n XrayContext | undefined,\n never,\n HttpServerRequest.HttpServerRequest\n> = Effect.map(HttpServerRequest.HttpServerRequest, (request) => getXrayContextFromObject(request));\n\nfunction effectHeadersToRecord(headers: Headers.Headers): Record<string, string | string[]> {\n const result: Record<string, string | string[]> = {};\n for (const [key, value] of Object.entries(headers)) {\n if (typeof value === 'string') {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction buildFullUrl(url: string, headers: Record<string, string | string[]>): string {\n if (url.startsWith('http://') || url.startsWith('https://')) {\n return url;\n }\n const host = headers['host'];\n if (!host || typeof host !== 'string') {\n return url;\n }\n return `http://${host}${url}`;\n}\n\nfunction captureResponseBody(\n xray: XrayEmitter,\n response: { body: { _tag: string; body?: unknown; contentLength?: number } },\n): ReturnType<typeof makeCapturedBody> {\n const mode = xray.config.capture.responseBody;\n if (!mode || mode === 'none') return undefined;\n\n const body = response.body;\n if (body._tag === 'Uint8Array' && body.body instanceof Uint8Array) {\n const maxBytes = xray.config.capture.maxBodyBytes;\n const truncated = body.body.length > maxBytes;\n const slice = truncated ? body.body.slice(0, maxBytes) : body.body;\n return makeCapturedBody(slice, body.body.length, truncated, mode);\n }\n return undefined;\n}\n"]}
package/dist/effect.d.cts CHANGED
@@ -1,17 +1,38 @@
1
1
  import { Effect } from 'effect';
2
2
  import { HttpApp, HttpServerRequest } from '@effect/platform';
3
- import { e as CaptureConfig, f as RedactionConfig, d as XrayContext, R as RequestLog, j as XrayRuntimeConfig, a as XrayEmitter } from './types-Z1nirh-F.cjs';
4
- export { X as XrayConfig } from './types-Z1nirh-F.cjs';
5
- export { c as createCoreEmitter } from './emitter-BqfrGIod.cjs';
3
+ import { e as CaptureConfig, f as RedactionConfig, d as XrayContext, R as RequestLog, j as XrayRuntimeConfig, a as XrayEmitter } from './types-BrKvhHbn.cjs';
4
+ export { X as XrayConfig } from './types-BrKvhHbn.cjs';
5
+ export { c as createCoreEmitter } from './emitter-Bi_m_w5h.cjs';
6
6
  import '@opentelemetry/sdk-trace-base';
7
7
 
8
8
  interface WrapOptions {
9
+ /**
10
+ * Explicit route pattern for this handler (for example `/users/:id`).
11
+ */
9
12
  route?: string;
13
+ /**
14
+ * Explicit request ID. Skips header lookup/generation when provided.
15
+ */
10
16
  requestId?: string;
17
+ /**
18
+ * Per-handler capture overrides.
19
+ */
11
20
  capture?: Partial<CaptureConfig>;
21
+ /**
22
+ * Per-handler redaction overrides.
23
+ */
12
24
  redaction?: Partial<RedactionConfig>;
25
+ /**
26
+ * Hook called after request context is created.
27
+ */
13
28
  onRequest?: (ctx: XrayContext) => void;
29
+ /**
30
+ * Hook called after the request has been finalized and logged.
31
+ */
14
32
  onResponse?: (ctx: XrayContext, log: RequestLog) => void;
33
+ /**
34
+ * Hook called when request handling fails.
35
+ */
15
36
  onError?: (ctx: XrayContext, err: unknown) => void;
16
37
  }
17
38
  type EffectMiddleware = <E, R>(httpApp: HttpApp.Default<E, R>) => HttpApp.Default<E, R>;
@@ -19,7 +40,13 @@ type EffectEmitter = EffectMiddleware & {
19
40
  flush: XrayEmitter['flush'];
20
41
  shutdown: XrayEmitter['shutdown'];
21
42
  };
43
+ /**
44
+ * Create Effect middleware and expose `flush()`/`shutdown()`.
45
+ */
22
46
  declare function createEmitter(config: XrayRuntimeConfig, options?: WrapOptions): EffectEmitter;
47
+ /**
48
+ * Create Effect middleware from an existing core `XrayEmitter`.
49
+ */
23
50
  declare function createEffectMiddleware(xray: XrayEmitter, options?: WrapOptions): EffectMiddleware;
24
51
  /**
25
52
  * Retrieve the XrayContext bound to a request object.
package/dist/effect.d.ts CHANGED
@@ -1,17 +1,38 @@
1
1
  import { Effect } from 'effect';
2
2
  import { HttpApp, HttpServerRequest } from '@effect/platform';
3
- import { e as CaptureConfig, f as RedactionConfig, d as XrayContext, R as RequestLog, j as XrayRuntimeConfig, a as XrayEmitter } from './types-Z1nirh-F.js';
4
- export { X as XrayConfig } from './types-Z1nirh-F.js';
5
- export { c as createCoreEmitter } from './emitter-CScYhwGA.js';
3
+ import { e as CaptureConfig, f as RedactionConfig, d as XrayContext, R as RequestLog, j as XrayRuntimeConfig, a as XrayEmitter } from './types-BrKvhHbn.js';
4
+ export { X as XrayConfig } from './types-BrKvhHbn.js';
5
+ export { c as createCoreEmitter } from './emitter-Dy7bRGTq.js';
6
6
  import '@opentelemetry/sdk-trace-base';
7
7
 
8
8
  interface WrapOptions {
9
+ /**
10
+ * Explicit route pattern for this handler (for example `/users/:id`).
11
+ */
9
12
  route?: string;
13
+ /**
14
+ * Explicit request ID. Skips header lookup/generation when provided.
15
+ */
10
16
  requestId?: string;
17
+ /**
18
+ * Per-handler capture overrides.
19
+ */
11
20
  capture?: Partial<CaptureConfig>;
21
+ /**
22
+ * Per-handler redaction overrides.
23
+ */
12
24
  redaction?: Partial<RedactionConfig>;
25
+ /**
26
+ * Hook called after request context is created.
27
+ */
13
28
  onRequest?: (ctx: XrayContext) => void;
29
+ /**
30
+ * Hook called after the request has been finalized and logged.
31
+ */
14
32
  onResponse?: (ctx: XrayContext, log: RequestLog) => void;
33
+ /**
34
+ * Hook called when request handling fails.
35
+ */
15
36
  onError?: (ctx: XrayContext, err: unknown) => void;
16
37
  }
17
38
  type EffectMiddleware = <E, R>(httpApp: HttpApp.Default<E, R>) => HttpApp.Default<E, R>;
@@ -19,7 +40,13 @@ type EffectEmitter = EffectMiddleware & {
19
40
  flush: XrayEmitter['flush'];
20
41
  shutdown: XrayEmitter['shutdown'];
21
42
  };
43
+ /**
44
+ * Create Effect middleware and expose `flush()`/`shutdown()`.
45
+ */
22
46
  declare function createEmitter(config: XrayRuntimeConfig, options?: WrapOptions): EffectEmitter;
47
+ /**
48
+ * Create Effect middleware from an existing core `XrayEmitter`.
49
+ */
23
50
  declare function createEffectMiddleware(xray: XrayEmitter, options?: WrapOptions): EffectMiddleware;
24
51
  /**
25
52
  * Retrieve the XrayContext bound to a request object.
package/dist/effect.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createEmitter
3
- } from "./chunk-ZP5OEA4I.js";
4
- import "./chunk-TSCMZ5TV.js";
3
+ } from "./chunk-LJYBYC7N.js";
4
+ import "./chunk-DKHGODGO.js";
5
5
  import {
6
6
  bindContextToObject,
7
7
  getXrayContextFromObject,
@@ -9,11 +9,11 @@ import {
9
9
  setContextRequestId,
10
10
  setContextRoute,
11
11
  setRedactionOverride
12
- } from "./chunk-6UH43LVD.js";
12
+ } from "./chunk-NTIUR3OC.js";
13
13
  import {
14
14
  logWithLevel,
15
15
  makeCapturedBody
16
- } from "./chunk-YVMMCTXW.js";
16
+ } from "./chunk-7KT6EPVZ.js";
17
17
 
18
18
  // src/effect/effect.ts
19
19
  import { Cause, Effect, Exit, Option } from "effect";
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/effect/effect.ts"],"sourcesContent":["import { Cause, Effect, Exit, Option } from 'effect';\nimport { Headers, HttpApp, HttpRouter, HttpServerError, HttpServerRequest } from '@effect/platform';\nimport type {\n CaptureConfig,\n NormalizedRequest,\n RedactionConfig,\n RequestLog,\n XrayContext,\n XrayEmitter,\n XrayRuntimeConfig,\n} from '../core/index';\nimport { createEmitter as createFetchEmitter } from '../fetch/fetch';\nimport {\n bindContextToObject,\n getXrayContextFromObject,\n logWithLevel,\n makeCapturedBody,\n setCaptureOverride,\n setContextRequestId,\n setContextRoute,\n setRedactionOverride,\n} from '../core/internal';\n\nexport { createEmitter as createCoreEmitter } from '../fetch/fetch';\nexport type {\n CaptureConfig,\n RedactionConfig,\n RequestLog,\n XrayConfig,\n XrayContext,\n XrayEmitter,\n XrayRuntimeConfig,\n} from '../core/index';\n\nexport interface WrapOptions {\n route?: string;\n requestId?: string;\n capture?: Partial<CaptureConfig>;\n redaction?: Partial<RedactionConfig>;\n onRequest?: (ctx: XrayContext) => void;\n onResponse?: (ctx: XrayContext, log: RequestLog) => void;\n onError?: (ctx: XrayContext, err: unknown) => void;\n}\n\ntype EffectMiddleware = <E, R>(httpApp: HttpApp.Default<E, R>) => HttpApp.Default<E, R>;\n\ntype EffectEmitter = EffectMiddleware & {\n flush: XrayEmitter['flush'];\n shutdown: XrayEmitter['shutdown'];\n};\n\nexport function createEmitter(config: XrayRuntimeConfig, options?: WrapOptions): EffectEmitter {\n const emitter = createFetchEmitter(config);\n const middleware = createEffectMiddleware(emitter, options) as EffectEmitter;\n middleware.flush = emitter.flush;\n middleware.shutdown = emitter.shutdown;\n return middleware;\n}\n\nexport function createEffectMiddleware(xray: XrayEmitter, options?: WrapOptions): EffectMiddleware {\n return (<E, R>(httpApp: HttpApp.Default<E, R>): HttpApp.Default<E, R> =>\n Effect.gen(function* () {\n const request = yield* HttpServerRequest.HttpServerRequest;\n\n const headers = effectHeadersToRecord(request.headers);\n const url = buildFullUrl(request.originalUrl, headers);\n\n // Try to read the route pattern from HttpRouter.RouteContext (available\n // when the middleware is applied via HttpRouter.use).\n const routeCtxOption = yield* Effect.serviceOption(HttpRouter.RouteContext);\n const route = Option.isSome(routeCtxOption)\n ? String(routeCtxOption.value.route.path)\n : options?.route;\n\n // Capture request body if configured.\n const captureReqBody = xray.config.capture.requestBody;\n let requestBody: NormalizedRequest['body'];\n if (captureReqBody && captureReqBody !== 'none') {\n const textResult = yield* Effect.either(request.text);\n if (textResult._tag === 'Right') {\n const bytes = new TextEncoder().encode(textResult.right);\n const maxBytes = xray.config.capture.maxBodyBytes;\n const truncated = bytes.length > maxBytes;\n const slice = truncated ? bytes.slice(0, maxBytes) : bytes;\n requestBody = makeCapturedBody(slice, bytes.length, truncated, captureReqBody);\n }\n }\n\n const normalizedRequest: NormalizedRequest = {\n method: request.method,\n url,\n route,\n headers,\n body: requestBody,\n requestId: options?.requestId,\n remoteAddress:\n request.remoteAddress._tag === 'Some' ? request.remoteAddress.value : undefined,\n startTimeMs: Date.now(),\n };\n\n const ctx = xray.startRequest(normalizedRequest);\n bindContextToObject(request, ctx);\n\n if (options?.requestId) {\n setContextRequestId(ctx, options.requestId);\n }\n if (route) {\n setContextRoute(ctx, route);\n }\n if (options?.capture) {\n setCaptureOverride(ctx, options.capture);\n }\n if (options?.redaction) {\n setRedactionOverride(ctx, options.redaction);\n }\n\n if (options?.onRequest) {\n try {\n options.onRequest(ctx);\n } catch (err) {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: onRequest failed', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n const exit = yield* Effect.exit(httpApp);\n\n if (Exit.isSuccess(exit)) {\n const response = exit.value;\n const responseHeaders = effectHeadersToRecord(response.headers);\n\n const log = xray.endRequest(ctx, {\n statusCode: response.status,\n headers: responseHeaders,\n body: captureResponseBody(xray, response),\n endTimeMs: Date.now(),\n });\n\n if (options?.onResponse) {\n try {\n options.onResponse(ctx, log);\n } catch (err) {\n logWithLevel(\n xray.config.logger,\n 'warn',\n xray.config.logLevel,\n 'xray: onResponse failed',\n { error: err instanceof Error ? err.message : String(err) },\n );\n }\n }\n\n return response;\n }\n\n const error = Cause.squash(exit.cause);\n\n // Resolve the HTTP response that the platform would send for this error\n // (e.g. 404 for RouteNotFound, 500 for unhandled). This mirrors what\n // HttpApp.toWebHandler does internally via causeResponse.\n const [errorResponse] = yield* HttpServerError.causeResponse(exit.cause);\n\n const log = xray.endRequest(\n ctx,\n {\n statusCode: errorResponse.status,\n headers: effectHeadersToRecord(errorResponse.headers),\n body: undefined,\n endTimeMs: Date.now(),\n },\n error,\n );\n\n if (options?.onError) {\n try {\n options.onError(ctx, error);\n } catch (errInner) {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: onError failed', {\n error: errInner instanceof Error ? errInner.message : String(errInner),\n });\n }\n }\n\n if (options?.onResponse) {\n try {\n options.onResponse(ctx, log);\n } catch (errInner) {\n logWithLevel(\n xray.config.logger,\n 'warn',\n xray.config.logLevel,\n 'xray: onResponse failed',\n {\n error: errInner instanceof Error ? errInner.message : String(errInner),\n },\n );\n }\n }\n\n return yield* Effect.failCause(exit.cause);\n })) as EffectMiddleware;\n}\n\n/**\n * Retrieve the XrayContext bound to a request object.\n */\nexport function getXrayContext(\n request: HttpServerRequest.HttpServerRequest,\n): XrayContext | undefined {\n return getXrayContextFromObject(request);\n}\n\n/**\n * Effect that retrieves the XrayContext from the current HttpServerRequest in scope.\n */\nexport const currentXrayContext: Effect.Effect<\n XrayContext | undefined,\n never,\n HttpServerRequest.HttpServerRequest\n> = Effect.map(HttpServerRequest.HttpServerRequest, (request) => getXrayContextFromObject(request));\n\nfunction effectHeadersToRecord(headers: Headers.Headers): Record<string, string | string[]> {\n const result: Record<string, string | string[]> = {};\n for (const [key, value] of Object.entries(headers)) {\n if (typeof value === 'string') {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction buildFullUrl(url: string, headers: Record<string, string | string[]>): string {\n if (url.startsWith('http://') || url.startsWith('https://')) {\n return url;\n }\n const host = headers['host'];\n if (!host || typeof host !== 'string') {\n return url;\n }\n return `http://${host}${url}`;\n}\n\nfunction captureResponseBody(\n xray: XrayEmitter,\n response: { body: { _tag: string; body?: unknown; contentLength?: number } },\n): ReturnType<typeof makeCapturedBody> {\n const mode = xray.config.capture.responseBody;\n if (!mode || mode === 'none') return undefined;\n\n const body = response.body;\n if (body._tag === 'Uint8Array' && body.body instanceof Uint8Array) {\n const maxBytes = xray.config.capture.maxBodyBytes;\n const truncated = body.body.length > maxBytes;\n const slice = truncated ? body.body.slice(0, maxBytes) : body.body;\n return makeCapturedBody(slice, body.body.length, truncated, mode);\n }\n return undefined;\n}\n"],"mappings":"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","names":["createEmitter","log"]}
1
+ {"version":3,"sources":["../src/effect/effect.ts"],"sourcesContent":["import { Cause, Effect, Exit, Option } from 'effect';\nimport { Headers, HttpApp, HttpRouter, HttpServerError, HttpServerRequest } from '@effect/platform';\nimport type {\n CaptureConfig,\n NormalizedRequest,\n RedactionConfig,\n RequestLog,\n XrayContext,\n XrayEmitter,\n XrayRuntimeConfig,\n} from '../core/index';\nimport { createEmitter as createFetchEmitter } from '../fetch/fetch';\nimport {\n bindContextToObject,\n getXrayContextFromObject,\n logWithLevel,\n makeCapturedBody,\n setCaptureOverride,\n setContextRequestId,\n setContextRoute,\n setRedactionOverride,\n} from '../core/internal';\n\nexport { createEmitter as createCoreEmitter } from '../fetch/fetch';\nexport type {\n CaptureConfig,\n RedactionConfig,\n RequestLog,\n XrayConfig,\n XrayContext,\n XrayEmitter,\n XrayRuntimeConfig,\n} from '../core/index';\n\nexport interface WrapOptions {\n /**\n * Explicit route pattern for this handler (for example `/users/:id`).\n */\n route?: string;\n /**\n * Explicit request ID. Skips header lookup/generation when provided.\n */\n requestId?: string;\n /**\n * Per-handler capture overrides.\n */\n capture?: Partial<CaptureConfig>;\n /**\n * Per-handler redaction overrides.\n */\n redaction?: Partial<RedactionConfig>;\n /**\n * Hook called after request context is created.\n */\n onRequest?: (ctx: XrayContext) => void;\n /**\n * Hook called after the request has been finalized and logged.\n */\n onResponse?: (ctx: XrayContext, log: RequestLog) => void;\n /**\n * Hook called when request handling fails.\n */\n onError?: (ctx: XrayContext, err: unknown) => void;\n}\n\ntype EffectMiddleware = <E, R>(httpApp: HttpApp.Default<E, R>) => HttpApp.Default<E, R>;\n\ntype EffectEmitter = EffectMiddleware & {\n flush: XrayEmitter['flush'];\n shutdown: XrayEmitter['shutdown'];\n};\n\n/**\n * Create Effect middleware and expose `flush()`/`shutdown()`.\n */\nexport function createEmitter(config: XrayRuntimeConfig, options?: WrapOptions): EffectEmitter {\n const emitter = createFetchEmitter(config);\n const middleware = createEffectMiddleware(emitter, options) as EffectEmitter;\n middleware.flush = emitter.flush;\n middleware.shutdown = emitter.shutdown;\n return middleware;\n}\n\n/**\n * Create Effect middleware from an existing core `XrayEmitter`.\n */\nexport function createEffectMiddleware(xray: XrayEmitter, options?: WrapOptions): EffectMiddleware {\n return (<E, R>(httpApp: HttpApp.Default<E, R>): HttpApp.Default<E, R> =>\n Effect.gen(function* () {\n const request = yield* HttpServerRequest.HttpServerRequest;\n\n const headers = effectHeadersToRecord(request.headers);\n const url = buildFullUrl(request.originalUrl, headers);\n\n // Try to read the route pattern from HttpRouter.RouteContext (available\n // when the middleware is applied via HttpRouter.use).\n const routeCtxOption = yield* Effect.serviceOption(HttpRouter.RouteContext);\n const route = Option.isSome(routeCtxOption)\n ? String(routeCtxOption.value.route.path)\n : options?.route;\n\n // Capture request body if configured.\n const captureReqBody = xray.config.capture.requestBody;\n let requestBody: NormalizedRequest['body'];\n if (captureReqBody && captureReqBody !== 'none') {\n const textResult = yield* Effect.either(request.text);\n if (textResult._tag === 'Right') {\n const bytes = new TextEncoder().encode(textResult.right);\n const maxBytes = xray.config.capture.maxBodyBytes;\n const truncated = bytes.length > maxBytes;\n const slice = truncated ? bytes.slice(0, maxBytes) : bytes;\n requestBody = makeCapturedBody(slice, bytes.length, truncated, captureReqBody);\n }\n }\n\n const normalizedRequest: NormalizedRequest = {\n method: request.method,\n url,\n route,\n headers,\n body: requestBody,\n requestId: options?.requestId,\n remoteAddress:\n request.remoteAddress._tag === 'Some' ? request.remoteAddress.value : undefined,\n startTimeMs: Date.now(),\n };\n\n const ctx = xray.startRequest(normalizedRequest);\n bindContextToObject(request, ctx);\n\n if (options?.requestId) {\n setContextRequestId(ctx, options.requestId);\n }\n if (route) {\n setContextRoute(ctx, route);\n }\n if (options?.capture) {\n setCaptureOverride(ctx, options.capture);\n }\n if (options?.redaction) {\n setRedactionOverride(ctx, options.redaction);\n }\n\n if (options?.onRequest) {\n try {\n options.onRequest(ctx);\n } catch (err) {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: onRequest failed', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n const exit = yield* Effect.exit(httpApp);\n\n if (Exit.isSuccess(exit)) {\n const response = exit.value;\n const responseHeaders = effectHeadersToRecord(response.headers);\n\n const log = xray.endRequest(ctx, {\n statusCode: response.status,\n headers: responseHeaders,\n body: captureResponseBody(xray, response),\n endTimeMs: Date.now(),\n });\n\n if (options?.onResponse) {\n try {\n options.onResponse(ctx, log);\n } catch (err) {\n logWithLevel(\n xray.config.logger,\n 'warn',\n xray.config.logLevel,\n 'xray: onResponse failed',\n { error: err instanceof Error ? err.message : String(err) },\n );\n }\n }\n\n return response;\n }\n\n const error = Cause.squash(exit.cause);\n\n // Resolve the HTTP response that the platform would send for this error\n // (e.g. 404 for RouteNotFound, 500 for unhandled). This mirrors what\n // HttpApp.toWebHandler does internally via causeResponse.\n const [errorResponse] = yield* HttpServerError.causeResponse(exit.cause);\n\n const log = xray.endRequest(\n ctx,\n {\n statusCode: errorResponse.status,\n headers: effectHeadersToRecord(errorResponse.headers),\n body: undefined,\n endTimeMs: Date.now(),\n },\n error,\n );\n\n if (options?.onError) {\n try {\n options.onError(ctx, error);\n } catch (errInner) {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: onError failed', {\n error: errInner instanceof Error ? errInner.message : String(errInner),\n });\n }\n }\n\n if (options?.onResponse) {\n try {\n options.onResponse(ctx, log);\n } catch (errInner) {\n logWithLevel(\n xray.config.logger,\n 'warn',\n xray.config.logLevel,\n 'xray: onResponse failed',\n {\n error: errInner instanceof Error ? errInner.message : String(errInner),\n },\n );\n }\n }\n\n return yield* Effect.failCause(exit.cause);\n })) as EffectMiddleware;\n}\n\n/**\n * Retrieve the XrayContext bound to a request object.\n */\nexport function getXrayContext(\n request: HttpServerRequest.HttpServerRequest,\n): XrayContext | undefined {\n return getXrayContextFromObject(request);\n}\n\n/**\n * Effect that retrieves the XrayContext from the current HttpServerRequest in scope.\n */\nexport const currentXrayContext: Effect.Effect<\n XrayContext | undefined,\n never,\n HttpServerRequest.HttpServerRequest\n> = Effect.map(HttpServerRequest.HttpServerRequest, (request) => getXrayContextFromObject(request));\n\nfunction effectHeadersToRecord(headers: Headers.Headers): Record<string, string | string[]> {\n const result: Record<string, string | string[]> = {};\n for (const [key, value] of Object.entries(headers)) {\n if (typeof value === 'string') {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction buildFullUrl(url: string, headers: Record<string, string | string[]>): string {\n if (url.startsWith('http://') || url.startsWith('https://')) {\n return url;\n }\n const host = headers['host'];\n if (!host || typeof host !== 'string') {\n return url;\n }\n return `http://${host}${url}`;\n}\n\nfunction captureResponseBody(\n xray: XrayEmitter,\n response: { body: { _tag: string; body?: unknown; contentLength?: number } },\n): ReturnType<typeof makeCapturedBody> {\n const mode = xray.config.capture.responseBody;\n if (!mode || mode === 'none') return undefined;\n\n const body = response.body;\n if (body._tag === 'Uint8Array' && body.body instanceof Uint8Array) {\n const maxBytes = xray.config.capture.maxBodyBytes;\n const truncated = body.body.length > maxBytes;\n const slice = truncated ? body.body.slice(0, maxBytes) : body.body;\n return makeCapturedBody(slice, body.body.length, truncated, mode);\n }\n return undefined;\n}\n"],"mappings":"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","names":["createEmitter","log"]}