@stainlessdev/xray-emitter 0.2.0 → 0.3.1-dev.3f4598d

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-2HW4AEKB.cjs → chunk-55YD27PV.cjs} +28 -28
  3. package/dist/chunk-55YD27PV.cjs.map +1 -0
  4. package/dist/{chunk-YVMMCTXW.js → chunk-7KT6EPVZ.js} +1 -1
  5. package/dist/{chunk-YVMMCTXW.js.map → chunk-7KT6EPVZ.js.map} +1 -1
  6. package/dist/{chunk-GNSXLLEC.cjs → chunk-CPHFCOA5.cjs} +9 -9
  7. package/dist/{chunk-GNSXLLEC.cjs.map → chunk-CPHFCOA5.cjs.map} +1 -1
  8. package/dist/{chunk-JKW6E4L3.cjs → chunk-DNBARLGB.cjs} +1 -1
  9. package/dist/{chunk-JKW6E4L3.cjs.map → chunk-DNBARLGB.cjs.map} +1 -1
  10. package/dist/{chunk-ZP5OEA4I.js → chunk-DV3MVQBB.js} +4 -4
  11. package/dist/chunk-DV3MVQBB.js.map +1 -0
  12. package/dist/{chunk-WTHVUHGI.js → chunk-FGXXKIF7.js} +4 -4
  13. package/dist/chunk-FGXXKIF7.js.map +1 -0
  14. package/dist/{chunk-TSCMZ5TV.js → chunk-GYXI3DWB.js} +35 -3
  15. package/dist/chunk-GYXI3DWB.js.map +1 -0
  16. package/dist/{chunk-6UH43LVD.js → chunk-NTIUR3OC.js} +2 -2
  17. package/dist/{chunk-DBI3HXNR.cjs → chunk-SUVCVINA.cjs} +47 -47
  18. package/dist/chunk-SUVCVINA.cjs.map +1 -0
  19. package/dist/{chunk-XO6YWDFL.cjs → chunk-UJWD5CFA.cjs} +53 -21
  20. package/dist/chunk-UJWD5CFA.cjs.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":["/home/runner/work/xray-emitter-js/xray-emitter-js/dist/chunk-SUVCVINA.cjs","../src/fetch/emitter.ts","../src/fetch/adapter.ts"],"names":["createEmitter"],"mappings":"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","file":"/home/runner/work/xray-emitter-js/xray-emitter-js/dist/chunk-SUVCVINA.cjs","sourcesContent":[null,"// 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"]}
@@ -6,7 +6,7 @@
6
6
 
7
7
 
8
8
 
9
- var _chunkJKW6E4L3cjs = require('./chunk-JKW6E4L3.cjs');
9
+ var _chunkDNBARLGBcjs = require('./chunk-DNBARLGB.cjs');
10
10
 
11
11
  // src/core/route.ts
12
12
  function normalizeRoutePattern(route) {
@@ -301,7 +301,7 @@ function encodeBasicAuth(username, password) {
301
301
  if (!bytes) {
302
302
  return void 0;
303
303
  }
304
- const encoded = _chunkJKW6E4L3cjs.encodeBase64.call(void 0, bytes);
304
+ const encoded = _chunkDNBARLGBcjs.encodeBase64.call(void 0, bytes);
305
305
  if (!encoded) {
306
306
  return void 0;
307
307
  }
@@ -680,6 +680,7 @@ var AttributeKeyResponseBody = "http.response.body";
680
680
  var AttributeKeyResponseBodyEncoding = "http.response.body.encoding";
681
681
  var AttributeKeyResponseBodyTruncated = "http.response.body.truncated";
682
682
  var AttributeKeySpanDrop = "stainlessxray.internal.drop";
683
+ var AttributeKeyTenantID = "stainlessxray.tenant.id";
683
684
 
684
685
  // src/core/attributes.ts
685
686
  function setHeaderAttributes(span, headers, prefix) {
@@ -897,6 +898,9 @@ function setRouteAttribute(span, route) {
897
898
  function setUserIdAttribute(span, userId) {
898
899
  span.setAttribute(_incubating.ATTR_USER_ID, userId);
899
900
  }
901
+ function setTenantIdAttribute(span, tenantId) {
902
+ span.setAttribute(AttributeKeyTenantID, tenantId);
903
+ }
900
904
  function setRequestIdAttribute(span, requestId) {
901
905
  span.setAttribute(AttributeKeyRequestID, requestId);
902
906
  }
@@ -1022,7 +1026,7 @@ function createEmitter(config, exporter) {
1022
1026
  "exporter is required (use @stainlessdev/xray-node or @stainlessdev/xray-fetch)"
1023
1027
  );
1024
1028
  }
1025
- _chunkJKW6E4L3cjs.logWithLevel.call(void 0, resolved.logger, "info", resolved.logLevel, "xray: emitter configured", {
1029
+ _chunkDNBARLGBcjs.logWithLevel.call(void 0, resolved.logger, "info", resolved.logLevel, "xray: emitter configured", {
1026
1030
  serviceName: resolved.serviceName,
1027
1031
  environment: resolved.environment,
1028
1032
  version: resolved.version,
@@ -1053,8 +1057,29 @@ function startRequest(config, tracer, req) {
1053
1057
  requestId: _nullishCoalesce(explicitRequestId, () => ( "")),
1054
1058
  traceId: _optionalChain([span, 'optionalAccess', _17 => _17.spanContext, 'call', _18 => _18(), 'access', _19 => _19.traceId]),
1055
1059
  spanId: _optionalChain([span, 'optionalAccess', _20 => _20.spanContext, 'call', _21 => _21(), 'access', _22 => _22.spanId]),
1060
+ setActor: (tenantId, userId) => {
1061
+ const state2 = _chunkDNBARLGBcjs.getContextState.call(void 0, context);
1062
+ if (!state2) {
1063
+ return;
1064
+ }
1065
+ state2.tenantId = tenantId;
1066
+ state2.userId = userId || void 0;
1067
+ if (span) {
1068
+ try {
1069
+ setTenantIdAttribute(span, tenantId);
1070
+ if (userId) {
1071
+ setUserIdAttribute(span, userId);
1072
+ }
1073
+ } catch (err) {
1074
+ _chunkDNBARLGBcjs.logWithLevel.call(void 0, config.logger, "error", config.logLevel, "xray: setActor failed", {
1075
+ error: err instanceof Error ? err.message : String(err)
1076
+ });
1077
+ }
1078
+ }
1079
+ },
1080
+ // Deprecated compatibility alias; prefer setActor(tenantId, userId).
1056
1081
  setUserId: (id) => {
1057
- const state2 = _chunkJKW6E4L3cjs.getContextState.call(void 0, context);
1082
+ const state2 = _chunkDNBARLGBcjs.getContextState.call(void 0, context);
1058
1083
  if (!state2) {
1059
1084
  return;
1060
1085
  }
@@ -1062,19 +1087,22 @@ function startRequest(config, tracer, req) {
1062
1087
  if (span && id) {
1063
1088
  try {
1064
1089
  setUserIdAttribute(span, id);
1065
- } catch (e6) {
1090
+ } catch (err) {
1091
+ _chunkDNBARLGBcjs.logWithLevel.call(void 0, config.logger, "error", config.logLevel, "xray: setUserId failed", {
1092
+ error: err instanceof Error ? err.message : String(err)
1093
+ });
1066
1094
  }
1067
1095
  }
1068
1096
  },
1069
1097
  setSessionId: (id) => {
1070
- const state2 = _chunkJKW6E4L3cjs.getContextState.call(void 0, context);
1098
+ const state2 = _chunkDNBARLGBcjs.getContextState.call(void 0, context);
1071
1099
  if (!state2) {
1072
1100
  return;
1073
1101
  }
1074
1102
  state2.sessionId = id;
1075
1103
  },
1076
1104
  setAttribute: (key, value) => {
1077
- const state2 = _chunkJKW6E4L3cjs.getContextState.call(void 0, context);
1105
+ const state2 = _chunkDNBARLGBcjs.getContextState.call(void 0, context);
1078
1106
  if (!state2) {
1079
1107
  return;
1080
1108
  }
@@ -1082,12 +1110,12 @@ function startRequest(config, tracer, req) {
1082
1110
  if (span) {
1083
1111
  try {
1084
1112
  span.setAttribute(key, value);
1085
- } catch (e7) {
1113
+ } catch (e6) {
1086
1114
  }
1087
1115
  }
1088
1116
  },
1089
1117
  addEvent: (name, attributes) => {
1090
- const state2 = _chunkJKW6E4L3cjs.getContextState.call(void 0, context);
1118
+ const state2 = _chunkDNBARLGBcjs.getContextState.call(void 0, context);
1091
1119
  if (!state2) {
1092
1120
  return;
1093
1121
  }
@@ -1095,12 +1123,12 @@ function startRequest(config, tracer, req) {
1095
1123
  if (span) {
1096
1124
  try {
1097
1125
  span.addEvent(name, attributes);
1098
- } catch (e8) {
1126
+ } catch (e7) {
1099
1127
  }
1100
1128
  }
1101
1129
  },
1102
1130
  setError: (err) => {
1103
- const state2 = _chunkJKW6E4L3cjs.getContextState.call(void 0, context);
1131
+ const state2 = _chunkDNBARLGBcjs.getContextState.call(void 0, context);
1104
1132
  if (!state2) {
1105
1133
  return;
1106
1134
  }
@@ -1108,7 +1136,7 @@ function startRequest(config, tracer, req) {
1108
1136
  if (span) {
1109
1137
  try {
1110
1138
  spanStatusFromError(span, err);
1111
- } catch (e9) {
1139
+ } catch (e8) {
1112
1140
  }
1113
1141
  }
1114
1142
  }
@@ -1121,11 +1149,11 @@ function startRequest(config, tracer, req) {
1121
1149
  attributes: {},
1122
1150
  events: []
1123
1151
  };
1124
- _chunkJKW6E4L3cjs.bindContext.call(void 0, context, state);
1152
+ _chunkDNBARLGBcjs.bindContext.call(void 0, context, state);
1125
1153
  return context;
1126
1154
  }
1127
1155
  function endRequest(config, ctx, res, err) {
1128
- const state = _chunkJKW6E4L3cjs.getContextState.call(void 0, ctx);
1156
+ const state = _chunkDNBARLGBcjs.getContextState.call(void 0, ctx);
1129
1157
  const endTimeMs = Number.isFinite(res.endTimeMs) ? res.endTimeMs : Date.now();
1130
1158
  res.endTimeMs = endTimeMs;
1131
1159
  if (!state) {
@@ -1153,7 +1181,7 @@ function endRequest(config, ctx, res, err) {
1153
1181
  const capture = resolveCapture(config.capture, state.captureOverride);
1154
1182
  const redaction = resolveRedaction(config.redaction, state.redactionOverride);
1155
1183
  const route = request.route;
1156
- const url = _chunkJKW6E4L3cjs.sanitizeLogString.call(void 0, request.url);
1184
+ const url = _chunkDNBARLGBcjs.sanitizeLogString.call(void 0, request.url);
1157
1185
  const log = {
1158
1186
  requestId: resolvedRequestId,
1159
1187
  traceId: _optionalChain([state, 'access', _23 => _23.span, 'optionalAccess', _24 => _24.spanContext, 'call', _25 => _25(), 'access', _26 => _26.traceId]),
@@ -1164,10 +1192,11 @@ function endRequest(config, ctx, res, err) {
1164
1192
  route,
1165
1193
  statusCode: res.statusCode,
1166
1194
  durationMs: Math.max(0, endTimeMs - request.startTimeMs),
1167
- requestHeaders: capture.requestHeaders ? _chunkJKW6E4L3cjs.sanitizeHeaderValues.call(void 0, request.headers) : void 0,
1168
- responseHeaders: capture.responseHeaders ? _chunkJKW6E4L3cjs.sanitizeHeaderValues.call(void 0, res.headers) : void 0,
1195
+ requestHeaders: capture.requestHeaders ? _chunkDNBARLGBcjs.sanitizeHeaderValues.call(void 0, request.headers) : void 0,
1196
+ responseHeaders: capture.responseHeaders ? _chunkDNBARLGBcjs.sanitizeHeaderValues.call(void 0, res.headers) : void 0,
1169
1197
  requestBody: capture.requestBody === "none" ? void 0 : request.body,
1170
1198
  responseBody: capture.responseBody === "none" ? void 0 : res.body,
1199
+ tenantId: _nullishCoalesce(state.tenantId, () => ( void 0)),
1171
1200
  userId: _nullishCoalesce(state.userId, () => ( void 0)),
1172
1201
  sessionId: _nullishCoalesce(state.sessionId, () => ( void 0)),
1173
1202
  error: buildError(_nullishCoalesce(err, () => ( state.error))),
@@ -1217,6 +1246,9 @@ function endRequest(config, ctx, res, err) {
1217
1246
  setResponseBodyAttributes(span, redacted.responseBody);
1218
1247
  setResponseBodySizeAttribute(span, redacted.responseBody.bytes);
1219
1248
  }
1249
+ if (state.tenantId != null) {
1250
+ setTenantIdAttribute(span, state.tenantId);
1251
+ }
1220
1252
  if (state.userId) {
1221
1253
  setUserIdAttribute(span, state.userId);
1222
1254
  }
@@ -1225,7 +1257,7 @@ function endRequest(config, ctx, res, err) {
1225
1257
  }
1226
1258
  span.end();
1227
1259
  } catch (spanErr) {
1228
- _chunkJKW6E4L3cjs.logWithLevel.call(void 0, config.logger, "warn", config.logLevel, "xray: span finalize failed", {
1260
+ _chunkDNBARLGBcjs.logWithLevel.call(void 0, config.logger, "warn", config.logLevel, "xray: span finalize failed", {
1229
1261
  error: spanErr instanceof Error ? spanErr.message : String(spanErr)
1230
1262
  });
1231
1263
  }
@@ -1241,7 +1273,7 @@ function resolveFinalRequestId(config, explicitRequestId, responseHeaders) {
1241
1273
  if (headerValue) {
1242
1274
  return headerValue;
1243
1275
  }
1244
- return _chunkJKW6E4L3cjs.generateRequestId.call(void 0, );
1276
+ return _chunkDNBARLGBcjs.generateRequestId.call(void 0, );
1245
1277
  }
1246
1278
  function resolveHeaderRequestId(headerName, headers) {
1247
1279
  if (!headers) {
@@ -1326,7 +1358,7 @@ function safePath(url) {
1326
1358
  try {
1327
1359
  const parsed = new URL(url);
1328
1360
  return parsed.pathname || "/";
1329
- } catch (e10) {
1361
+ } catch (e9) {
1330
1362
  const rawPath = url.split("?")[0] || "/";
1331
1363
  return rawPath || "/";
1332
1364
  }
@@ -1337,4 +1369,4 @@ function safePath(url) {
1337
1369
 
1338
1370
 
1339
1371
  exports.XrayConfigError = XrayConfigError; exports.normalizeConfig = normalizeConfig; exports.createEmitter = createEmitter;
1340
- //# sourceMappingURL=chunk-XO6YWDFL.cjs.map
1372
+ //# sourceMappingURL=chunk-UJWD5CFA.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/xray-emitter-js/xray-emitter-js/dist/chunk-UJWD5CFA.cjs","../src/core/route.ts","../src/core/config.ts","../src/core/header_redaction.ts","../src/core/redaction.ts","../src/core/attributes.ts","../src/core/attrkey.ts","../src/core/otel.ts","../src/core/emitter.ts"],"names":["resolvedRequestId"],"mappings":"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","file":"/home/runner/work/xray-emitter-js/xray-emitter-js/dist/chunk-UJWD5CFA.cjs","sourcesContent":[null,"export function normalizeRoutePattern(route: string): string {\n if (!route) {\n return '/';\n }\n\n const cleaned = stripQueryAndFragment(route).trim();\n if (!cleaned) {\n return '/';\n }\n\n const withoutMethod = stripMethodPrefix(cleaned);\n const leading = withoutMethod.startsWith('/') ? withoutMethod : `/${withoutMethod}`;\n const segments = leading.split('/').filter(Boolean);\n if (segments.length === 0) {\n return '/';\n }\n\n const normalized = segments.map(normalizeRouteSegment).join('/');\n return `/${normalized}`;\n}\n\nfunction stripMethodPrefix(value: string): string {\n if (!/^[A-Z]+\\s+\\//.test(value)) {\n return value;\n }\n const spaceIndex = value.search(/\\s+/);\n if (spaceIndex < 0) {\n return value;\n }\n return value.slice(spaceIndex).trim();\n}\n\nfunction stripQueryAndFragment(value: string): string {\n const hashIndex = value.indexOf('#');\n const beforeHash = hashIndex >= 0 ? value.slice(0, hashIndex) : value;\n const queryIndex = beforeHash.indexOf('?');\n return queryIndex >= 0 ? beforeHash.slice(0, queryIndex) : beforeHash;\n}\n\nfunction normalizeRouteSegment(segment: string): string {\n if (segment === '*') {\n return '{wildcard}';\n }\n\n const param = extractRouteParam(segment);\n if (param) {\n return `{${param}}`;\n }\n\n return segment;\n}\n\nfunction extractRouteParam(segment: string): string | null {\n if (!segment) {\n return null;\n }\n\n if (segment.startsWith('[') && segment.endsWith(']')) {\n return normalizeNextParam(segment);\n }\n\n if (segment.startsWith('{') && segment.endsWith('}')) {\n const inner = segment.slice(1, -1);\n const trimmed = stripParamDecorators(inner);\n return extractParamName(trimmed);\n }\n\n if (segment.startsWith(':') || segment.startsWith('$')) {\n return extractParamName(segment.slice(1));\n }\n\n return null;\n}\n\nfunction normalizeNextParam(segment: string): string | null {\n let inner = segment.slice(1, -1);\n if (inner.startsWith('[') && inner.endsWith(']')) {\n inner = inner.slice(1, -1);\n }\n if (inner.startsWith('...')) {\n inner = inner.slice(3);\n }\n return extractParamName(inner);\n}\n\nfunction stripParamDecorators(value: string): string {\n let trimmed = value.trim();\n if (!trimmed) {\n return trimmed;\n }\n if (trimmed.endsWith('...')) {\n trimmed = trimmed.slice(0, -3);\n }\n return trimmed.replace(/[?*+]+$/, '');\n}\n\nfunction extractParamName(value: string): string | null {\n if (!value) {\n return null;\n }\n const match = value.match(/^[A-Za-z0-9_-]+/);\n return match?.[0] ?? null;\n}\n","import { encodeBase64 } from './encoding';\nimport { normalizeRoutePattern } from './route';\nimport type { Logger, LogLevel } from './types';\n\n/**\n * Exporter settings used by the OTLP trace exporter.\n */\nexport interface ExporterConfig {\n /**\n * OTLP trace endpoint URL. `/v1/traces` is appended if missing.\n */\n endpointUrl: string;\n /**\n * Additional OTLP exporter headers (for example `Authorization`).\n */\n headers?: Record<string, string>;\n /**\n * Export timeout in milliseconds.\n */\n timeoutMs: number;\n /**\n * Span processor mode.\n *\n * Use `batch` (default) for lower overhead in long-lived services.\n * Use `simple` to export each span immediately (useful for tests and\n * short-lived runtimes).\n */\n spanProcessor: 'simple' | 'batch';\n}\n\n/**\n * Request/response capture settings.\n */\nexport interface CaptureConfig {\n /**\n * Include sanitized request headers in logs/spans.\n */\n requestHeaders: boolean;\n /**\n * Include sanitized response headers in logs/spans.\n */\n responseHeaders: boolean;\n /**\n * Request body capture mode.\n *\n * `none` disables capture, `text` records UTF-8 text, and `base64` preserves\n * binary payloads safely.\n */\n requestBody: 'none' | 'text' | 'base64';\n /**\n * Response body capture mode.\n *\n * `none` disables capture, `text` records UTF-8 text, and `base64` preserves\n * binary payloads safely.\n */\n responseBody: 'none' | 'text' | 'base64';\n /**\n * Maximum captured bytes per request/response body before truncation.\n */\n maxBodyBytes: number;\n}\n\n/**\n * Redaction settings for logs and captured payloads.\n */\nexport interface RedactionConfig {\n /**\n * Header names to redact (case-insensitive).\n */\n headers: string[];\n /**\n * Query parameter names to redact (case-insensitive).\n */\n queryParams: string[];\n /**\n * JSON paths to redact in captured JSON bodies.\n */\n bodyJsonPaths: string[];\n /**\n * Replacement value used for redacted data.\n */\n replacement: string;\n}\n\n/**\n * Request ID extraction and propagation settings.\n */\nexport interface RequestIdConfig {\n /**\n * Response header name to read request IDs from. This is normalized to\n * lowercase during configuration.\n */\n header: string;\n}\n\n/**\n * Route normalization settings.\n */\nexport interface RouteConfig {\n /**\n * When true, normalize route patterns before emitting logs.\n */\n normalize: boolean;\n /**\n * Optional custom normalizer. Defaults to X-ray's built-in normalizer.\n */\n normalizer?: (path: string) => string;\n}\n\n/**\n * Core emitter configuration.\n */\nexport interface XrayConfig {\n /**\n * Logical service name for all emitted request logs.\n */\n serviceName: string;\n /**\n * Optional deployment environment label.\n */\n environment?: string;\n /**\n * Optional service version label.\n */\n version?: string;\n /**\n * Logger for internal X-ray diagnostics.\n */\n logger?: Logger;\n /**\n * Minimum log level for internal diagnostics.\n */\n logLevel?: LogLevel;\n /**\n * OTLP endpoint URL. Falls back to `STAINLESS_XRAY_ENDPOINT_URL`.\n */\n endpointUrl?: string;\n /**\n * Exporter overrides.\n */\n exporter?: Partial<ExporterConfig>;\n /**\n * Capture overrides.\n */\n capture?: Partial<CaptureConfig>;\n /**\n * Redaction overrides.\n */\n redaction?: Partial<RedactionConfig>;\n /**\n * Request ID resolution settings. The header is read from response headers at\n * the end of the request.\n */\n requestId?: Partial<RequestIdConfig>;\n /**\n * Route normalization overrides.\n */\n route?: Partial<RouteConfig>;\n}\n\n/**\n * Runtime config accepted by framework/node/fetch entrypoints.\n */\nexport type XrayRuntimeConfig = Omit<XrayConfig, 'exporter'> & {\n exporter?: Partial<ExporterConfig> & {\n /**\n * Custom exporter instance. When provided, endpoint/header options are ignored.\n */\n instance?: import('@opentelemetry/sdk-trace-base').SpanExporter;\n };\n};\n\n/**\n * Fully-resolved configuration returned by `normalizeConfig`.\n */\nexport interface ResolvedXrayConfig {\n serviceName: string;\n environment?: string;\n version?: string;\n logger: Logger;\n logLevel: LogLevel;\n exporter: ExporterConfig;\n capture: CaptureConfig;\n redaction: RedactionConfig;\n requestId: RequestIdConfig;\n route: RouteConfig;\n}\n\nconst defaultCapture: CaptureConfig = {\n requestHeaders: true,\n responseHeaders: true,\n requestBody: 'text',\n responseBody: 'text',\n maxBodyBytes: 65536,\n};\n\nconst defaultRedaction: RedactionConfig = {\n headers: ['authorization', 'cookie', 'set-cookie', 'x-api-key'],\n queryParams: [],\n bodyJsonPaths: [],\n replacement: '[REDACTED]',\n};\n\nconst defaultRequestId: RequestIdConfig = {\n header: 'request-id',\n};\n\nconst defaultRoute: RouteConfig = {\n normalize: true,\n normalizer: normalizeRoutePattern,\n};\n\nconst defaultExporterBase: Omit<ExporterConfig, 'endpointUrl'> = {\n headers: {},\n timeoutMs: 30000,\n spanProcessor: 'batch',\n};\n\nexport class XrayConfigError extends Error {\n code: 'INVALID_CONFIG' | 'INVALID_REDACTION';\n\n constructor(code: XrayConfigError['code'], message: string) {\n super(message);\n this.code = code;\n }\n}\n\n/**\n * Normalize and validate user configuration.\n *\n * Applies defaults, validates required fields, and resolves environment\n * fallbacks such as `STAINLESS_XRAY_ENDPOINT_URL`.\n */\nexport function normalizeConfig(config: XrayConfig): ResolvedXrayConfig {\n if (!config || !config.serviceName || !config.serviceName.trim()) {\n throw new XrayConfigError('INVALID_CONFIG', 'serviceName is required');\n }\n\n const logger = config.logger ?? console;\n const logLevel = config.logLevel ?? 'warn';\n\n const capture = normalizeCapture(config.capture);\n const redaction = normalizeRedaction(config.redaction);\n const requestId = normalizeRequestId(config.requestId);\n const route = normalizeRoute(config.route);\n const exporter = normalizeExporter(config.endpointUrl, config.exporter);\n\n return {\n serviceName: config.serviceName.trim(),\n environment: config.environment?.trim() || undefined,\n version: config.version?.trim() || undefined,\n logger,\n logLevel,\n exporter,\n capture,\n redaction,\n requestId,\n route,\n };\n}\n\nfunction normalizeCapture(cfg?: Partial<CaptureConfig>): CaptureConfig {\n const capture: CaptureConfig = {\n ...defaultCapture,\n ...cfg,\n };\n\n if (!['none', 'text', 'base64'].includes(capture.requestBody)) {\n throw new XrayConfigError(\n 'INVALID_CONFIG',\n 'capture.requestBody must be none, text, or base64',\n );\n }\n if (!['none', 'text', 'base64'].includes(capture.responseBody)) {\n throw new XrayConfigError(\n 'INVALID_CONFIG',\n 'capture.responseBody must be none, text, or base64',\n );\n }\n if (!Number.isFinite(capture.maxBodyBytes) || capture.maxBodyBytes < 0) {\n throw new XrayConfigError('INVALID_CONFIG', 'capture.maxBodyBytes must be >= 0');\n }\n\n return capture;\n}\n\nfunction normalizeRedaction(cfg?: Partial<RedactionConfig>): RedactionConfig {\n const redaction: RedactionConfig = {\n ...defaultRedaction,\n ...cfg,\n };\n\n redaction.headers = normalizeStringList(redaction.headers);\n redaction.queryParams = normalizeStringList(redaction.queryParams);\n redaction.bodyJsonPaths = normalizeStringList(redaction.bodyJsonPaths);\n redaction.replacement = redaction.replacement || defaultRedaction.replacement;\n\n if (!redaction.replacement) {\n throw new XrayConfigError('INVALID_REDACTION', 'redaction.replacement must be non-empty');\n }\n\n return redaction;\n}\n\nfunction normalizeRequestId(cfg?: Partial<RequestIdConfig>): RequestIdConfig {\n const requestId: RequestIdConfig = {\n ...defaultRequestId,\n ...cfg,\n };\n\n requestId.header = requestId.header.trim().toLowerCase();\n if (!requestId.header) {\n throw new XrayConfigError('INVALID_CONFIG', 'requestId.header must be non-empty');\n }\n\n return requestId;\n}\n\nfunction normalizeRoute(cfg?: Partial<RouteConfig>): RouteConfig {\n const route: RouteConfig = {\n ...defaultRoute,\n ...cfg,\n };\n\n if (route.normalize && !route.normalizer) {\n route.normalizer = normalizeRoutePattern;\n }\n\n return route;\n}\n\nfunction normalizeExporter(\n endpointUrl: string | undefined,\n cfg?: Partial<ExporterConfig>,\n): ExporterConfig {\n const resolvedEndpoint = normalizeExporterEndpoint(cfg?.endpointUrl ?? endpointUrl);\n const rawHeaders = cfg?.headers ?? defaultExporterBase.headers ?? {};\n const parsed = applyEndpointAuth(resolvedEndpoint, rawHeaders);\n const exporter: ExporterConfig = {\n endpointUrl: parsed.endpointUrl,\n headers: parsed.headers,\n timeoutMs: cfg?.timeoutMs ?? defaultExporterBase.timeoutMs,\n spanProcessor: cfg?.spanProcessor ?? defaultExporterBase.spanProcessor,\n };\n\n return exporter;\n}\n\nfunction normalizeExporterEndpoint(endpointUrl: string | undefined): string {\n const envUrl =\n typeof process !== 'undefined' ? process.env?.['STAINLESS_XRAY_ENDPOINT_URL'] : undefined;\n const resolved = endpointUrl ?? envUrl;\n if (!resolved || !resolved.trim()) {\n throw new XrayConfigError(\n 'INVALID_CONFIG',\n 'endpointUrl is required (set endpointUrl or STAINLESS_XRAY_ENDPOINT_URL)',\n );\n }\n const trimmed = resolved.trim();\n const withoutTrailingSlash = trimmed.endsWith('/') ? trimmed.slice(0, -1) : trimmed;\n if (withoutTrailingSlash.endsWith('/v1/traces')) {\n return withoutTrailingSlash;\n }\n return `${withoutTrailingSlash}/v1/traces`;\n}\n\nfunction normalizeStringList(values: string[] | undefined): string[] {\n if (!values) {\n return [];\n }\n return values.map((entry) => entry.trim()).filter(Boolean);\n}\n\nconst textEncoder = typeof TextEncoder !== 'undefined' ? new TextEncoder() : null;\nconst maybeBuffer = (\n globalThis as typeof globalThis & {\n Buffer?: { from(data: string, encoding?: string): Uint8Array };\n }\n).Buffer;\n\nfunction applyEndpointAuth(\n endpointUrl: string,\n headers: Record<string, string> | undefined,\n): { endpointUrl: string; headers: Record<string, string> } {\n const resolvedHeaders = headers ?? {};\n let url: URL;\n try {\n url = new URL(endpointUrl);\n } catch {\n return { endpointUrl, headers: resolvedHeaders };\n }\n\n const username = decodeUserInfo(url.username);\n const password = decodeUserInfo(url.password);\n if (!username && !password) {\n return { endpointUrl, headers: resolvedHeaders };\n }\n\n url.username = '';\n url.password = '';\n const sanitizedUrl = url.toString();\n\n if (hasAuthorizationHeader(resolvedHeaders)) {\n return { endpointUrl: sanitizedUrl, headers: resolvedHeaders };\n }\n\n const authorization = encodeBasicAuth(username, password);\n if (!authorization) {\n return { endpointUrl: sanitizedUrl, headers: resolvedHeaders };\n }\n\n return {\n endpointUrl: sanitizedUrl,\n headers: {\n ...resolvedHeaders,\n Authorization: authorization,\n },\n };\n}\n\nfunction decodeUserInfo(value: string): string {\n if (!value) {\n return value;\n }\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n}\n\nfunction hasAuthorizationHeader(headers: Record<string, string>): boolean {\n return Object.keys(headers).some((key) => key.toLowerCase() === 'authorization');\n}\n\nfunction encodeBasicAuth(username: string, password: string): string | undefined {\n const raw = `${username}:${password}`;\n let bytes: Uint8Array | undefined;\n if (textEncoder) {\n bytes = textEncoder.encode(raw);\n } else if (maybeBuffer) {\n bytes = maybeBuffer.from(raw, 'utf8');\n }\n if (!bytes) {\n return undefined;\n }\n const encoded = encodeBase64(bytes);\n if (!encoded) {\n return undefined;\n }\n return `Basic ${encoded}`;\n}\n","const headerNameCompactor = /[-_.]/g;\nconst headerTokenSplitter = /[-_.]/;\n\ntype HeaderRedactionMatcher = {\n exactSensitive: Set<string>;\n keywordTokens: Set<string>;\n keywordCompacted: string[];\n};\n\nconst defaultHeaderMatcher = newHeaderRedactionMatcher(\n defaultSensitiveHeaderNames(),\n defaultSensitiveKeywords(),\n);\n\nexport function authSchemePrefix(value: string): string {\n if (!value) {\n return '';\n }\n\n const lower = value.toLowerCase();\n if (lower.startsWith('basic')) {\n return value.slice(0, 'basic'.length);\n }\n if (lower.startsWith('bearer')) {\n return value.slice(0, 'bearer'.length);\n }\n if (lower.startsWith('digest')) {\n return value.slice(0, 'digest'.length);\n }\n if (lower.startsWith('negotiate')) {\n return value.slice(0, 'negotiate'.length);\n }\n return '';\n}\n\nexport function redactCookieValue(value: string, replacement: string): string {\n if (!value) {\n return replacement;\n }\n\n const parts = value.split(';');\n const redacted: string[] = [];\n\n for (const part of parts) {\n const segment = part.trim();\n if (!segment) {\n redacted.push(replacement);\n continue;\n }\n const idx = segment.indexOf('=');\n if (idx <= 0) {\n redacted.push(replacement);\n continue;\n }\n const name = segment.slice(0, idx);\n if (!name) {\n redacted.push(replacement);\n continue;\n }\n redacted.push(`${name}=${replacement}`);\n }\n\n return redacted.join('; ');\n}\n\nexport function redactSetCookieValue(value: string, replacement: string): string {\n if (!value) {\n return replacement;\n }\n\n const parts = value.split(';');\n const first = parts.shift() ?? '';\n const idx = first.indexOf('=');\n if (idx <= 0) {\n return replacement;\n }\n const name = first.slice(0, idx);\n if (!name) {\n return replacement;\n }\n\n const redacted = `${name}=${replacement}`;\n if (parts.length === 0) {\n return redacted;\n }\n return `${redacted};${parts.join(';')}`;\n}\n\nexport function isSensitiveHeaderName(key: string): boolean {\n return isSensitiveNormalized(defaultHeaderMatcher, normalizeHeaderName(key));\n}\n\nfunction addSensitiveHeaderNames(target: Set<string>, headers: string[]): void {\n for (const header of headers) {\n const normalized = normalizeHeaderName(header);\n if (normalized) {\n target.add(normalized);\n }\n }\n}\n\nfunction buildKeywordSets(keywords: string[]): { compacted: string[]; tokens: Set<string> } {\n const tokens = new Set<string>();\n const compacted = new Set<string>();\n\n for (const keyword of keywords) {\n const normalized = normalizeHeaderName(keyword);\n if (!normalized) {\n continue;\n }\n const compactedKeyword = compactNormalizedHeaderName(normalized);\n if (compactedKeyword) {\n compacted.add(compactedKeyword);\n }\n if (!normalized.includes('-') && !normalized.includes('_') && !normalized.includes('.')) {\n tokens.add(normalized);\n }\n }\n\n return {\n compacted: Array.from(compacted).sort(),\n tokens,\n };\n}\n\nfunction compactNormalizedHeaderName(normalized: string): string {\n if (!normalized) {\n return '';\n }\n return normalized.replace(headerNameCompactor, '');\n}\n\nfunction defaultSensitiveHeaderNames(): string[] {\n return [\n 'authorization',\n 'cookie',\n 'proxy-authenticate',\n 'proxy-authorization',\n 'set-cookie',\n 'www-authenticate',\n ];\n}\n\nfunction defaultSensitiveKeywords(): string[] {\n return [\n 'api-key',\n 'api_key',\n 'apikey',\n 'auth',\n 'authenticate',\n 'authorization',\n 'credential',\n 'password',\n 'passwd',\n 'private-key',\n 'private_key',\n 'privatekey',\n 'secret',\n 'session',\n 'sessionid',\n 'signature',\n 'token',\n ];\n}\n\nfunction headerNameTokens(name: string): string[] {\n if (!name) {\n return [];\n }\n return name.split(headerTokenSplitter).filter(Boolean);\n}\n\nfunction hasKeywordToken(tokens: string[], keywordTokens: Set<string>): boolean {\n for (const token of tokens) {\n if (keywordTokens.has(token)) {\n return true;\n }\n }\n return false;\n}\n\nfunction isExactMatch(normalized: string, exactSensitive: Set<string>): boolean {\n return exactSensitive.has(normalized);\n}\n\nfunction isSensitiveNormalized(matcher: HeaderRedactionMatcher, normalized: string): boolean {\n if (!normalized) {\n return false;\n }\n if (isExactMatch(normalized, matcher.exactSensitive)) {\n return true;\n }\n if (hasKeywordToken(headerNameTokens(normalized), matcher.keywordTokens)) {\n return true;\n }\n return matchesCompacted(normalized, matcher.keywordCompacted);\n}\n\nfunction matchesCompacted(normalized: string, keywordCompacted: string[]): boolean {\n if (keywordCompacted.length === 0) {\n return false;\n }\n const compacted = compactNormalizedHeaderName(normalized);\n if (!compacted) {\n return false;\n }\n return keywordCompacted.some((keyword) => compacted.includes(keyword));\n}\n\nfunction newHeaderRedactionMatcher(names: string[], keywords: string[]): HeaderRedactionMatcher {\n const exactSensitive = new Set<string>();\n addSensitiveHeaderNames(exactSensitive, names);\n const { compacted, tokens } = buildKeywordSets(keywords);\n return {\n exactSensitive,\n keywordCompacted: compacted,\n keywordTokens: tokens,\n };\n}\n\nfunction normalizeHeaderName(name: string): string {\n return name.trim().toLowerCase();\n}\n","import type { CapturedBody, RequestLog } from './types';\nimport { authSchemePrefix, redactCookieValue, redactSetCookieValue } from './header_redaction';\n\nexport function applyRedaction(\n config: {\n headers: string[];\n queryParams: string[];\n bodyJsonPaths: string[];\n replacement: string;\n },\n log: RequestLog,\n): RequestLog {\n const redacted = { ...log };\n\n if (redacted.requestHeaders) {\n redacted.requestHeaders = redactHeaders(redacted.requestHeaders, config);\n }\n if (redacted.responseHeaders) {\n redacted.responseHeaders = redactHeaders(redacted.responseHeaders, config);\n }\n\n redacted.url = redactUrl(redacted.url, config);\n\n if (redacted.requestBody) {\n redacted.requestBody = redactBody(redacted.requestBody, redacted.requestHeaders, config);\n }\n if (redacted.responseBody) {\n redacted.responseBody = redactBody(redacted.responseBody, redacted.responseHeaders, config);\n }\n\n return redacted;\n}\n\nexport function redactHeaders(\n headers: Record<string, string | string[]>,\n config: { headers: string[]; replacement: string },\n): Record<string, string | string[]> {\n const list = new Set(config.headers.map((name) => name.toLowerCase()));\n const result: Record<string, string | string[]> = {};\n\n for (const [name, value] of Object.entries(headers)) {\n const lower = name.toLowerCase();\n if (!list.has(lower)) {\n result[name] = value;\n continue;\n }\n\n const redactValue = (entry: string) => redactHeaderValue(lower, entry, config.replacement);\n if (Array.isArray(value)) {\n result[name] = value.map(redactValue);\n } else {\n result[name] = redactValue(value);\n }\n }\n\n return result;\n}\n\nfunction redactHeaderValue(name: string, value: string, replacement: string): string {\n switch (name) {\n case 'authorization':\n case 'proxy-authorization': {\n const scheme = authSchemePrefix(value);\n if (!scheme) {\n return replacement;\n }\n return `${scheme} ${replacement}`;\n }\n case 'cookie':\n return redactCookieValue(value, replacement);\n case 'set-cookie':\n return redactSetCookieValue(value, replacement);\n default:\n return replacement;\n }\n}\n\nfunction redactUrl(value: string, config: { queryParams: string[]; replacement: string }): string {\n if (!value || config.queryParams.length === 0) {\n return value;\n }\n\n try {\n const parsed = new URL(value);\n const params = parsed.searchParams;\n if (!params || params.size === 0) {\n return value;\n }\n\n const redact = new Set(config.queryParams.map((key) => key.toLowerCase()));\n const next = new URLSearchParams();\n params.forEach((val, key) => {\n if (redact.has(key.toLowerCase())) {\n next.append(key, config.replacement);\n } else {\n next.append(key, val);\n }\n });\n parsed.search = next.toString();\n return parsed.toString();\n } catch {\n return value;\n }\n}\n\nfunction redactBody(\n body: CapturedBody,\n headers: Record<string, string | string[]> | undefined,\n config: { bodyJsonPaths: string[]; replacement: string },\n): CapturedBody {\n if (config.bodyJsonPaths.length === 0) {\n return body;\n }\n if (!body.value || body.encoding !== 'utf8') {\n return body;\n }\n if (!isJsonContentType(headers)) {\n return body;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(body.value);\n } catch {\n return body;\n }\n\n for (const path of config.bodyJsonPaths) {\n const segments = parseJsonPath(path);\n if (!segments) {\n continue;\n }\n redactJsonPath(parsed, segments, config.replacement);\n }\n\n const next = { ...body };\n next.value = JSON.stringify(parsed);\n return next;\n}\n\nfunction isJsonContentType(headers?: Record<string, string | string[]>): boolean {\n if (!headers) {\n return false;\n }\n const contentType = headers['content-type'] || headers['Content-Type'];\n const value = Array.isArray(contentType) ? contentType[0] : contentType;\n if (!value) {\n return false;\n }\n const normalized = value.split(';')[0];\n if (!normalized) {\n return false;\n }\n const trimmed = normalized.trim().toLowerCase();\n return trimmed === 'application/json' || trimmed.endsWith('+json');\n}\n\ntype JsonPathSegment = string | number;\n\nfunction parseJsonPath(path: string): JsonPathSegment[] | null {\n const trimmed = path.trim();\n if (!trimmed) {\n return null;\n }\n\n const normalized = trimmed.startsWith('$.') ? trimmed.slice(2) : trimmed;\n if (!normalized) {\n return null;\n }\n\n const segments: JsonPathSegment[] = [];\n const parts = normalized.split('.');\n for (const part of parts) {\n if (!part) {\n continue;\n }\n let cursor = part;\n const bracketIndex = cursor.indexOf('[');\n if (bracketIndex === -1) {\n segments.push(cursor);\n continue;\n }\n\n const name = cursor.slice(0, bracketIndex);\n if (name) {\n segments.push(name);\n }\n cursor = cursor.slice(bracketIndex);\n const matches = cursor.match(/\\[(\\d+)\\]/g);\n if (!matches) {\n continue;\n }\n for (const match of matches) {\n const indexValue = match.slice(1, -1);\n const index = Number.parseInt(indexValue, 10);\n if (Number.isFinite(index)) {\n segments.push(index);\n }\n }\n }\n\n return segments.length > 0 ? segments : null;\n}\n\nfunction redactJsonPath(value: unknown, segments: JsonPathSegment[], replacement: string): void {\n if (!value || segments.length === 0) {\n return;\n }\n\n let current: unknown = value;\n for (let i = 0; i < segments.length; i += 1) {\n const segment = segments[i];\n if (segment === undefined) {\n return;\n }\n const isLast = i === segments.length - 1;\n\n if (typeof segment === 'number') {\n if (!Array.isArray(current) || segment < 0 || segment >= current.length) {\n return;\n }\n if (isLast) {\n current[segment] = replacement;\n return;\n }\n current = current[segment];\n continue;\n }\n\n if (!current || typeof current !== 'object') {\n return;\n }\n const record = current as Record<string, unknown>;\n if (!(segment in record)) {\n return;\n }\n if (isLast) {\n record[segment] = replacement;\n return;\n }\n current = record[segment];\n }\n}\n","import type { Span } from '@opentelemetry/api';\nimport {\n ATTR_CLIENT_ADDRESS,\n ATTR_HTTP_REQUEST_BODY_SIZE,\n ATTR_HTTP_REQUEST_METHOD,\n ATTR_HTTP_RESPONSE_BODY_SIZE,\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_HTTP_ROUTE,\n ATTR_URL_FULL,\n ATTR_URL_PATH,\n ATTR_USER_ID,\n} from '@opentelemetry/semantic-conventions/incubating';\nimport type { CapturedBody } from './types';\nimport {\n AttributeKeyRequestBody,\n AttributeKeyRequestBodyEncoding,\n AttributeKeyRequestBodyTruncated,\n AttributeKeyRequestID,\n AttributeKeyResponseBody,\n AttributeKeyResponseBodyEncoding,\n AttributeKeyResponseBodyTruncated,\n AttributeKeyTenantID,\n} from './attrkey';\n\nexport function setHeaderAttributes(\n span: Span,\n headers: Record<string, string | string[]> | undefined,\n prefix: string,\n): void {\n if (!headers) {\n return;\n }\n const keys = Object.keys(headers).sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()));\n for (const key of keys) {\n const values = headers[key];\n if (!values || (Array.isArray(values) && values.length === 0)) {\n continue;\n }\n span.setAttribute(prefix + key.toLowerCase(), Array.isArray(values) ? values : [values]);\n }\n}\n\nexport function setRequestAttributes(\n span: Span,\n request: {\n method: string;\n url?: string;\n headers?: Record<string, string | string[]>;\n remoteAddress?: string;\n redactionReplacement?: string;\n },\n urlFull: string | undefined,\n): void {\n span.setAttribute(ATTR_HTTP_REQUEST_METHOD, request.method);\n const effectiveUrl = urlFull ?? request.url;\n if (effectiveUrl) {\n span.setAttribute(ATTR_URL_FULL, effectiveUrl);\n const path = extractPath(effectiveUrl);\n if (path) {\n span.setAttribute(ATTR_URL_PATH, path);\n }\n }\n const clientAddress = clientAddressForRequest(\n request.headers,\n request.remoteAddress,\n request.redactionReplacement,\n );\n if (clientAddress) {\n span.setAttribute(ATTR_CLIENT_ADDRESS, clientAddress);\n }\n}\n\nfunction extractPath(url: string): string | undefined {\n try {\n return new URL(url).pathname;\n } catch {\n // If not a full URL, try to extract path directly\n const match = url.match(/^[^?#]*/);\n return match?.[0] || undefined;\n }\n}\n\nfunction clientAddressForRequest(\n headers?: Record<string, string | string[]>,\n remoteAddress?: string,\n redactionReplacement?: string,\n): string | undefined {\n const forwarded = forwardedClientAddress(\n headerValues(headers, 'forwarded'),\n redactionReplacement,\n );\n if (forwarded) {\n return forwarded;\n }\n const xForwarded = xForwardedForClientAddress(\n headerValues(headers, 'x-forwarded-for'),\n redactionReplacement,\n );\n if (xForwarded) {\n return xForwarded;\n }\n const xRealIp = xRealIpClientAddress(headerValues(headers, 'x-real-ip'), redactionReplacement);\n if (xRealIp) {\n return xRealIp;\n }\n if (!remoteAddress) {\n return undefined;\n }\n return remoteAddrHost(remoteAddress);\n}\n\nfunction forwardedClientAddress(\n values: string[],\n redactionReplacement?: string,\n): string | undefined {\n for (const value of values) {\n if (!value) {\n continue;\n }\n const entries = value.split(',');\n for (const entry of entries) {\n const params = entry.split(';');\n for (const param of params) {\n const [rawKey, ...rest] = param.split('=');\n if (!rawKey) {\n continue;\n }\n if (rawKey.trim().toLowerCase() !== 'for') {\n continue;\n }\n const rawValue = rest.join('=').trim();\n const normalized = normalizeKnownAddress(rawValue, redactionReplacement);\n if (normalized) {\n return normalized;\n }\n }\n }\n }\n return undefined;\n}\n\nfunction xForwardedForClientAddress(\n values: string[],\n redactionReplacement?: string,\n): string | undefined {\n for (const value of values) {\n if (!value) {\n continue;\n }\n const entries = value.split(',');\n for (const entry of entries) {\n const normalized = normalizeKnownAddress(entry, redactionReplacement);\n if (normalized) {\n return normalized;\n }\n }\n }\n return undefined;\n}\n\nfunction xRealIpClientAddress(values: string[], redactionReplacement?: string): string | undefined {\n for (const value of values) {\n if (!value) {\n continue;\n }\n const normalized = normalizeKnownAddress(value, redactionReplacement);\n if (normalized) {\n return normalized;\n }\n }\n return undefined;\n}\n\nfunction normalizeKnownAddress(value: string, redactionReplacement?: string): string | undefined {\n const normalized = normalizeAddress(value, redactionReplacement);\n if (!normalized) {\n return undefined;\n }\n if (normalized.toLowerCase() === 'unknown') {\n return undefined;\n }\n return normalized;\n}\n\nfunction normalizeAddress(value: string, redactionReplacement?: string): string | undefined {\n if (!value) {\n return undefined;\n }\n let trimmed = value.trim();\n if (!trimmed) {\n return undefined;\n }\n if (redactionReplacement && trimmed === redactionReplacement) {\n return undefined;\n }\n if (trimmed.startsWith('\"') && trimmed.endsWith('\"') && trimmed.length > 1) {\n trimmed = trimmed.slice(1, -1).trim();\n }\n if (!trimmed) {\n return undefined;\n }\n if (trimmed.startsWith('[')) {\n const end = trimmed.indexOf(']');\n if (end !== -1) {\n return trimmed.slice(1, end);\n }\n }\n // If there's exactly one colon, treat it as host:port. More than one likely means IPv6.\n const colonCount = (trimmed.match(/:/g) ?? []).length;\n if (colonCount === 1) {\n const host = trimmed.split(':')[0];\n return host || undefined;\n }\n return trimmed;\n}\n\nfunction remoteAddrHost(value: string): string | undefined {\n return normalizeAddress(value);\n}\n\nfunction headerValues(\n headers: Record<string, string | string[]> | undefined,\n name: string,\n): string[] {\n if (!headers) {\n return [];\n }\n const target = name.toLowerCase();\n const values: string[] = [];\n for (const [key, value] of Object.entries(headers)) {\n if (key.toLowerCase() !== target) {\n continue;\n }\n if (Array.isArray(value)) {\n values.push(...value);\n } else {\n values.push(value);\n }\n }\n return values;\n}\n\nexport function setRequestBodyAttributes(span: Span, body: CapturedBody): void {\n if (!body.value) {\n return;\n }\n span.setAttribute(AttributeKeyRequestBody, body.value);\n span.setAttribute(AttributeKeyRequestBodyEncoding, body.encoding);\n if (body.truncated) {\n span.setAttribute(AttributeKeyRequestBodyTruncated, true);\n }\n}\n\nexport function setRequestBodySizeAttribute(span: Span, size: number): void {\n span.setAttribute(ATTR_HTTP_REQUEST_BODY_SIZE, size);\n}\n\nexport function setResponseBodyAttributes(span: Span, body: CapturedBody): void {\n if (!body.value) {\n return;\n }\n span.setAttribute(AttributeKeyResponseBody, body.value);\n span.setAttribute(AttributeKeyResponseBodyEncoding, body.encoding);\n if (body.truncated) {\n span.setAttribute(AttributeKeyResponseBodyTruncated, true);\n }\n}\n\nexport function setResponseBodySizeAttribute(span: Span, size: number): void {\n span.setAttribute(ATTR_HTTP_RESPONSE_BODY_SIZE, size);\n}\n\nexport function setResponseStatusAttribute(span: Span, statusCode: number): void {\n span.setAttribute(ATTR_HTTP_RESPONSE_STATUS_CODE, statusCode);\n}\n\nexport function setRouteAttribute(span: Span, route: string | undefined): void {\n if (route) {\n span.setAttribute(ATTR_HTTP_ROUTE, route);\n }\n}\n\nexport function setUserIdAttribute(span: Span, userId: string): void {\n span.setAttribute(ATTR_USER_ID, userId);\n}\n\nexport function setTenantIdAttribute(span: Span, tenantId: string): void {\n span.setAttribute(AttributeKeyTenantID, tenantId);\n}\n\nexport function setRequestIdAttribute(span: Span, requestId: string): void {\n span.setAttribute(AttributeKeyRequestID, requestId);\n}\n","export const AttributeKeyPrefixRequestHeader = 'http.request.header.';\nexport const AttributeKeyPrefixResponseHeader = 'http.response.header.';\nexport const AttributeKeyRequestBody = 'http.request.body';\nexport const AttributeKeyRequestBodyEncoding = 'http.request.body.encoding';\nexport const AttributeKeyRequestBodyTruncated = 'http.request.body.truncated';\nexport const AttributeKeyRequestID = 'http.request.id';\nexport const AttributeKeyResponseBody = 'http.response.body';\nexport const AttributeKeyResponseBodyEncoding = 'http.response.body.encoding';\nexport const AttributeKeyResponseBodyTruncated = 'http.response.body.truncated';\nexport const AttributeKeySpanDrop = 'stainlessxray.internal.drop';\nexport const AttributeKeyTenantID = 'stainlessxray.tenant.id';\nexport const AttributeKeyXrayCaptureErrorCode = 'xray.capture_error_code';\nexport const AttributeKeyXrayErrorThrown = 'xray.error_thrown';\nexport const AttributeKeyXrayHeadersTruncated = 'xray.headers_truncated';\nexport const AttributeKeyXrayInvalidResponse = 'xray.invalid_response';\nexport const AttributeKeyXrayRequestBodyCaptureFailed = 'xray.request_body_capture_failed';\nexport const AttributeKeyXrayRequestBodyTruncated = 'xray.request_body_truncated';\nexport const AttributeKeyXrayResponseBodyCaptureFailed = 'xray.response_body_capture_failed';\nexport const AttributeKeyXrayResponseBodyTruncated = 'xray.response_body_truncated';\n","import {\n diag,\n ROOT_CONTEXT,\n SpanKind,\n SpanStatusCode,\n type Context,\n type Span,\n type Tracer,\n} from '@opentelemetry/api';\nimport {\n AlwaysOnSampler,\n BasicTracerProvider,\n BatchSpanProcessor,\n type ReadableSpan,\n SimpleSpanProcessor,\n type Span as SDKSpan,\n type SpanExporter,\n type SpanProcessor,\n} from '@opentelemetry/sdk-trace-base';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport {\n ATTR_SERVICE_NAME,\n ATTR_TELEMETRY_SDK_LANGUAGE,\n ATTR_TELEMETRY_SDK_NAME,\n ATTR_TELEMETRY_SDK_VERSION,\n} from '@opentelemetry/semantic-conventions';\nimport { AttributeKeySpanDrop } from './attrkey';\nimport type { ResolvedXrayConfig } from './config';\n\nconst defaultAttributeCountLimit = 128;\n\nexport interface TracerProviderLike {\n forceFlush: () => Promise<void>;\n getTracer: (name: string, version?: string) => Tracer;\n shutdown: () => Promise<void>;\n}\n\nexport function createTracerProvider(\n config: ResolvedXrayConfig,\n exporter: SpanExporter,\n): TracerProviderLike {\n if (config.exporter.endpointUrl.startsWith('http://')) {\n diag.warn('xray: OTLP endpoint uses plaintext HTTP');\n }\n\n const attributeValueLengthLimit = Math.max(1, Math.ceil((config.capture.maxBodyBytes * 4) / 3));\n\n const resource = resourceFromAttributes({\n [ATTR_SERVICE_NAME]: config.serviceName,\n [ATTR_TELEMETRY_SDK_LANGUAGE]: isNodeRuntime() ? 'nodejs' : 'webjs',\n [ATTR_TELEMETRY_SDK_NAME]: 'stainless-xray',\n [ATTR_TELEMETRY_SDK_VERSION]: sdkVersion(),\n });\n\n const spanProcessor = createSpanProcessor(config.exporter.spanProcessor, exporter);\n const dropProcessor = new DropFilterSpanProcessor(spanProcessor);\n\n const provider = new BasicTracerProvider({\n forceFlushTimeoutMillis: 30_000,\n generalLimits: {\n attributeCountLimit: defaultAttributeCountLimit,\n attributeValueLengthLimit,\n },\n resource,\n sampler: new AlwaysOnSampler(),\n spanLimits: {\n attributeCountLimit: defaultAttributeCountLimit,\n attributePerEventCountLimit: defaultAttributeCountLimit,\n attributePerLinkCountLimit: defaultAttributeCountLimit,\n attributeValueLengthLimit,\n eventCountLimit: defaultAttributeCountLimit,\n linkCountLimit: defaultAttributeCountLimit,\n },\n spanProcessors: [dropProcessor],\n });\n\n return provider;\n}\n\nexport function tracerFromProvider(provider: TracerProviderLike): Tracer {\n return provider.getTracer('stainless-xray');\n}\n\nexport function spanFromTracer(tracer: Pick<Tracer, 'startSpan'>, name: string): Span {\n return tracer.startSpan(name, { kind: SpanKind.SERVER }, ROOT_CONTEXT);\n}\n\nexport function spanStatusFromError(span: Span, err: unknown): void {\n if (err instanceof Error) {\n span.recordException(err);\n } else if (typeof err === 'string') {\n span.recordException(err);\n } else {\n span.recordException({ message: String(err) });\n }\n span.setStatus({ code: SpanStatusCode.ERROR });\n}\n\nclass DropFilterSpanProcessor implements SpanProcessor {\n private readonly next: SpanProcessor;\n\n constructor(next: SpanProcessor) {\n this.next = next;\n }\n\n forceFlush(): Promise<void> {\n return this.next.forceFlush();\n }\n\n onEnd(span: ReadableSpan): void {\n if (span.attributes[AttributeKeySpanDrop] === true) {\n return;\n }\n this.next.onEnd(span);\n }\n\n onStart(span: SDKSpan, parentContext: Context): void {\n this.next.onStart(span, parentContext);\n }\n\n shutdown(): Promise<void> {\n return this.next.shutdown();\n }\n}\n\nfunction createSpanProcessor(mode: 'simple' | 'batch', exporter: SpanExporter): SpanProcessor {\n if (mode === 'simple') {\n return new SimpleSpanProcessor(exporter);\n }\n\n return new BatchSpanProcessor(exporter, {\n maxQueueSize: 2048,\n maxExportBatchSize: 512,\n scheduledDelayMillis: 5_000,\n exportTimeoutMillis: 30_000,\n });\n}\n\nfunction sdkVersion(): string {\n if (typeof __XRAY_VERSION__ !== 'undefined') {\n return __XRAY_VERSION__;\n }\n return 'unknown';\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","import type { SpanExporter } from '@opentelemetry/sdk-trace-base';\nimport type { XrayConfig, ResolvedXrayConfig, CaptureConfig, RedactionConfig } from './config';\nimport { XrayConfigError, normalizeConfig } from './config';\nimport { logWithLevel } from './logger';\nimport { applyRedaction, redactHeaders } from './redaction';\nimport { makeCapturedBody, sanitizeHeaderValues, sanitizeLogString } from './request_log';\nimport {\n setHeaderAttributes,\n setRequestAttributes,\n setRequestBodyAttributes,\n setRequestBodySizeAttribute,\n setRequestIdAttribute,\n setResponseBodyAttributes,\n setResponseBodySizeAttribute,\n setResponseStatusAttribute,\n setRouteAttribute,\n setTenantIdAttribute,\n setUserIdAttribute,\n} from './attributes';\nimport {\n createTracerProvider,\n spanFromTracer,\n spanStatusFromError,\n tracerFromProvider,\n} from './otel';\nimport { normalizeRoutePattern } from './route';\nimport { generateRequestId } from './uuid';\nimport { bindContext, getContextState, type RequestState } from './state';\nimport type {\n AttributeValue,\n NormalizedRequest,\n NormalizedResponse,\n RequestLog,\n XrayContext,\n XrayEmitter,\n} from './types';\n\n/**\n * Create a runtime-agnostic X-ray emitter with a provided SpanExporter.\n *\n * Most applications should use a runtime adapter (`/node`, `/fetch`,\n * or framework-specific entrypoints) unless they need custom transport logic.\n */\nexport function createEmitter(config: XrayConfig, exporter: SpanExporter): XrayEmitter {\n const resolved = normalizeConfig(config);\n if (!exporter) {\n throw new XrayConfigError(\n 'INVALID_CONFIG',\n 'exporter is required (use @stainlessdev/xray-node or @stainlessdev/xray-fetch)',\n );\n }\n logWithLevel(resolved.logger, 'info', resolved.logLevel, 'xray: emitter configured', {\n serviceName: resolved.serviceName,\n environment: resolved.environment,\n version: resolved.version,\n exporterEndpoint: resolved.exporter.endpointUrl,\n spanProcessor: resolved.exporter.spanProcessor,\n });\n const tracerProvider = createTracerProvider(resolved, exporter);\n const tracer = tracerFromProvider(tracerProvider);\n\n const emitter: XrayEmitter = {\n config: resolved,\n startRequest: (req) => startRequest(resolved, tracer, req),\n endRequest: (ctx, res, err) => endRequest(resolved, ctx, res, err),\n flush: () => tracerProvider.forceFlush(),\n shutdown: () => tracerProvider.shutdown(),\n };\n\n return emitter;\n}\n\nfunction startRequest(\n config: ResolvedXrayConfig,\n tracer: ReturnType<typeof tracerFromProvider>,\n req: NormalizedRequest,\n): XrayContext {\n const startTimeMs = Number.isFinite(req.startTimeMs) ? req.startTimeMs : Date.now();\n req.startTimeMs = startTimeMs;\n\n const explicitRequestId = normalizeRequestIdCandidate(req.requestId);\n req.requestId = explicitRequestId;\n\n if (req.route && config.route.normalize) {\n req.route = config.route.normalizer\n ? config.route.normalizer(req.route)\n : normalizeRoutePattern(req.route);\n }\n\n const span = spanFromTracer(tracer, spanNameFromRequest(req));\n const context: XrayContext = {\n requestId: explicitRequestId ?? '',\n traceId: span?.spanContext().traceId,\n spanId: span?.spanContext().spanId,\n setActor: (tenantId, userId) => {\n const state = getContextState(context);\n if (!state) {\n return;\n }\n state.tenantId = tenantId;\n state.userId = userId || undefined;\n if (span) {\n try {\n setTenantIdAttribute(span, tenantId);\n if (userId) {\n setUserIdAttribute(span, userId);\n }\n } catch (err) {\n logWithLevel(config.logger, 'error', config.logLevel, 'xray: setActor failed', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n },\n // Deprecated compatibility alias; prefer setActor(tenantId, userId).\n setUserId: (id) => {\n const state = getContextState(context);\n if (!state) {\n return;\n }\n state.userId = id;\n if (span && id) {\n try {\n setUserIdAttribute(span, id);\n } catch (err) {\n logWithLevel(config.logger, 'error', config.logLevel, 'xray: setUserId failed', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n },\n setSessionId: (id) => {\n const state = getContextState(context);\n if (!state) {\n return;\n }\n state.sessionId = id;\n },\n setAttribute: (key, value) => {\n const state = getContextState(context);\n if (!state) {\n return;\n }\n state.attributes[key] = value;\n if (span) {\n try {\n span.setAttribute(key, value as AttributeValue);\n } catch {\n // Ignore span attribute errors.\n }\n }\n },\n addEvent: (name, attributes) => {\n const state = getContextState(context);\n if (!state) {\n return;\n }\n state.events.push({ name, attributes });\n if (span) {\n try {\n span.addEvent(name, attributes as Record<string, AttributeValue> | undefined);\n } catch {\n // Ignore span event errors.\n }\n }\n },\n setError: (err) => {\n const state = getContextState(context);\n if (!state) {\n return;\n }\n state.error = err;\n if (span) {\n try {\n spanStatusFromError(span, err);\n } catch {\n // Ignore span errors.\n }\n }\n },\n };\n\n const state: RequestState = {\n request: req,\n config,\n span,\n context,\n attributes: {},\n events: [],\n };\n\n bindContext(context, state);\n return context;\n}\n\nfunction endRequest(\n config: ResolvedXrayConfig,\n ctx: XrayContext,\n res: NormalizedResponse,\n err?: unknown,\n): RequestLog {\n const state = getContextState(ctx);\n const endTimeMs = Number.isFinite(res.endTimeMs) ? res.endTimeMs : Date.now();\n res.endTimeMs = endTimeMs;\n\n if (!state) {\n const resolvedRequestId = resolveFinalRequestId(config, ctx.requestId, res.headers);\n ctx.requestId = resolvedRequestId;\n const fallbackLog: RequestLog = {\n requestId: resolvedRequestId,\n serviceName: config.serviceName,\n method: res.statusCode ? 'UNKNOWN' : 'UNKNOWN',\n url: '',\n durationMs: 0,\n statusCode: res.statusCode,\n timestamp: new Date(endTimeMs).toISOString(),\n };\n return fallbackLog;\n }\n\n const request = state.request;\n const resolvedRequestId = resolveFinalRequestId(\n config,\n request.requestId || ctx.requestId,\n res.headers,\n );\n request.requestId = resolvedRequestId;\n ctx.requestId = resolvedRequestId;\n const capture = resolveCapture(config.capture, state.captureOverride);\n const redaction = resolveRedaction(config.redaction, state.redactionOverride);\n\n const route = request.route;\n const url = sanitizeLogString(request.url);\n const log: RequestLog = {\n requestId: resolvedRequestId,\n traceId: state.span?.spanContext().traceId,\n spanId: state.span?.spanContext().spanId,\n serviceName: config.serviceName,\n method: request.method,\n url: url,\n route: route,\n statusCode: res.statusCode,\n durationMs: Math.max(0, endTimeMs - request.startTimeMs),\n requestHeaders: capture.requestHeaders ? sanitizeHeaderValues(request.headers) : undefined,\n responseHeaders: capture.responseHeaders ? sanitizeHeaderValues(res.headers) : undefined,\n requestBody: capture.requestBody === 'none' ? undefined : request.body,\n responseBody: capture.responseBody === 'none' ? undefined : res.body,\n tenantId: state.tenantId ?? undefined,\n userId: state.userId ?? undefined,\n sessionId: state.sessionId ?? undefined,\n error: buildError(err ?? state.error),\n attributes: Object.keys(state.attributes).length > 0 ? { ...state.attributes } : undefined,\n timestamp: new Date(endTimeMs).toISOString(),\n };\n\n const redacted = applyRedaction(redaction, log);\n if (redacted.route && config.route.normalize) {\n const normalized = config.route.normalizer\n ? config.route.normalizer(redacted.route)\n : normalizeRoutePattern(redacted.route);\n redacted.route = normalized;\n }\n const span = state.span;\n if (span) {\n try {\n const clientAddressHeaders = redactHeaders(request.headers, redaction);\n setRequestAttributes(\n span,\n {\n ...request,\n headers: clientAddressHeaders,\n redactionReplacement: redaction.replacement,\n },\n redacted.url,\n );\n setRequestIdAttribute(span, redacted.requestId);\n span.setAttribute('service.name', config.serviceName);\n if (redacted.statusCode != null) {\n setResponseStatusAttribute(span, redacted.statusCode);\n }\n if (redacted.route) {\n setRouteAttribute(span, redacted.route);\n span.updateName(`${request.method} ${redacted.route}`);\n } else {\n span.updateName(spanNameFromRequest(request));\n }\n if (redacted.requestHeaders) {\n setHeaderAttributes(span, redacted.requestHeaders, 'http.request.header.');\n }\n if (redacted.responseHeaders) {\n setHeaderAttributes(span, redacted.responseHeaders, 'http.response.header.');\n }\n if (redacted.requestBody) {\n setRequestBodyAttributes(span, redacted.requestBody);\n setRequestBodySizeAttribute(span, redacted.requestBody.bytes);\n }\n if (redacted.responseBody) {\n setResponseBodyAttributes(span, redacted.responseBody);\n setResponseBodySizeAttribute(span, redacted.responseBody.bytes);\n }\n if (state.tenantId != null) {\n setTenantIdAttribute(span, state.tenantId);\n }\n if (state.userId) {\n setUserIdAttribute(span, state.userId);\n }\n if (err ?? state.error) {\n spanStatusFromError(span, err ?? state.error);\n }\n span.end();\n } catch (spanErr) {\n logWithLevel(config.logger, 'warn', config.logLevel, 'xray: span finalize failed', {\n error: spanErr instanceof Error ? spanErr.message : String(spanErr),\n });\n }\n }\n\n return redacted;\n}\n\nfunction resolveFinalRequestId(\n config: ResolvedXrayConfig,\n explicitRequestId: string | undefined,\n responseHeaders?: Record<string, string | string[]>,\n): string {\n const explicit = normalizeRequestIdCandidate(explicitRequestId);\n if (explicit) {\n return explicit;\n }\n const headerValue = resolveHeaderRequestId(config.requestId.header, responseHeaders);\n if (headerValue) {\n return headerValue;\n }\n return generateRequestId();\n}\n\nfunction resolveHeaderRequestId(\n headerName: string,\n headers?: Record<string, string | string[]>,\n): string | undefined {\n if (!headers) {\n return undefined;\n }\n const target = headerName.toLowerCase();\n for (const [name, value] of Object.entries(headers)) {\n if (name.toLowerCase() !== target) {\n continue;\n }\n const entry = Array.isArray(value) ? value[0] : value;\n const normalized = normalizeRequestIdCandidate(entry);\n if (normalized) {\n return normalized;\n }\n }\n return undefined;\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 resolveCapture(base: CaptureConfig, override?: Partial<CaptureConfig>): CaptureConfig {\n if (!override) {\n return base;\n }\n return {\n ...base,\n ...override,\n };\n}\n\nfunction resolveRedaction(\n base: RedactionConfig,\n override?: Partial<RedactionConfig>,\n): RedactionConfig {\n const merged: RedactionConfig = {\n ...base,\n ...override,\n };\n\n merged.headers = normalizeLowercaseList(merged.headers);\n merged.queryParams = normalizeLowercaseList(merged.queryParams);\n merged.bodyJsonPaths = normalizeList(merged.bodyJsonPaths);\n merged.replacement = merged.replacement || base.replacement;\n\n return merged;\n}\n\nfunction normalizeLowercaseList(values: string[] | undefined): string[] {\n if (!values) {\n return [];\n }\n return values.map((entry) => entry.trim().toLowerCase()).filter(Boolean);\n}\n\nfunction normalizeList(values: string[] | undefined): string[] {\n if (!values) {\n return [];\n }\n return values.map((entry) => entry.trim()).filter(Boolean);\n}\n\nfunction buildError(err?: unknown): RequestLog['error'] {\n if (!err) {\n return undefined;\n }\n if (err instanceof Error) {\n return {\n message: err.message || 'Error',\n type: err.name || 'Error',\n stack: err.stack,\n };\n }\n return {\n message: String(err),\n };\n}\n\nfunction spanNameFromRequest(req: NormalizedRequest): string {\n const method = req.method || 'GET';\n if (req.route) {\n return `${method} ${req.route}`;\n }\n const path = safePath(req.url);\n return `${method} ${path}`;\n}\n\nfunction safePath(url: string): string {\n try {\n const parsed = new URL(url);\n return parsed.pathname || '/';\n } catch {\n const rawPath = url.split('?')[0] || '/';\n return rawPath || '/';\n }\n}\n\nexport function captureBody(\n bytes: Uint8Array | undefined,\n totalBytes: number,\n truncated: boolean,\n mode: 'text' | 'base64' | 'none',\n): ReturnType<typeof makeCapturedBody> {\n if (mode === 'none') {\n return undefined;\n }\n return makeCapturedBody(bytes, totalBytes, truncated, mode === 'text' ? 'text' : 'base64');\n}\n\nexport function captureResponseBody(\n bytes: Uint8Array | undefined,\n totalBytes: number,\n truncated: boolean,\n mode: 'text' | 'base64' | 'none',\n): ReturnType<typeof makeCapturedBody> {\n if (mode === 'none') {\n return undefined;\n }\n return makeCapturedBody(bytes, totalBytes, truncated, mode === 'text' ? 'text' : 'base64');\n}\n"]}
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 _chunkSUVCVINAcjs = require('./chunk-SUVCVINA.cjs');
4
+ require('./chunk-UJWD5CFA.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 = _chunkSUVCVINAcjs.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 = _chunkSUVCVINAcjs.createEmitter; exports.createEffectMiddleware = createEffectMiddleware; exports.createEmitter = createEmitter2; exports.currentXrayContext = currentXrayContext; exports.getXrayContext = getXrayContext;
186
186
  //# sourceMappingURL=effect.cjs.map