@stainlessdev/xray-fetch 0.6.0 → 0.7.0

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.
package/README.md ADDED
@@ -0,0 +1,80 @@
1
+ # @stainlessdev/xray-fetch
2
+
3
+ Fetch API adapter for Stainless X-ray request logging. Use this in edge runtimes, web workers, or any environment with the Fetch API.
4
+
5
+ ## Install
6
+
7
+ ```sh
8
+ pnpm add @stainlessdev/xray-fetch
9
+ ```
10
+
11
+ ## Basic usage (Fetch handler)
12
+
13
+ ```ts
14
+ import { createEmitter, wrapFetch } from '@stainlessdev/xray-fetch';
15
+
16
+ const xray = createEmitter({
17
+ serviceName: 'my-service',
18
+ endpointUrl: 'http://localhost:4318',
19
+ });
20
+
21
+ const handler = wrapFetch(async (_req) => {
22
+ return new Response('ok', { status: 200 });
23
+ }, xray);
24
+ ```
25
+
26
+ ## Preserve request/response objects
27
+
28
+ If you need to keep the original `Request`/`Response` objects (for framework compatibility), use `wrapFetchPreserve`:
29
+
30
+ ```ts
31
+ import { wrapFetchPreserve } from '@stainlessdev/xray-fetch';
32
+
33
+ const handler = wrapFetchPreserve(async (req) => {
34
+ return new Response(await req.text());
35
+ }, xray);
36
+ ```
37
+
38
+ ## Access the X-ray context
39
+
40
+ ```ts
41
+ import { getXrayContext } from '@stainlessdev/xray-fetch';
42
+
43
+ const handler = wrapFetch(async (req) => {
44
+ const ctx = getXrayContext(req);
45
+ ctx?.setUserId('user-123');
46
+ return new Response('ok');
47
+ }, xray);
48
+ ```
49
+
50
+ ## Request IDs and response headers
51
+
52
+ X-ray will **auto-generate a request ID and inject it into your response headers** under the configured name (`requestId.header`, default `request-id`, emitted as `Request-Id`) if the header is missing. If you set your own request ID first (via `options.requestId` or by setting the response header yourself), X-ray preserves it and does not overwrite the header.
53
+
54
+ ## Configuration
55
+
56
+ `createEmitter(config)` accepts `XrayRuntimeConfig` from `@stainlessdev/xray-core`:
57
+
58
+ - `serviceName` (required)
59
+ - `endpointUrl` (required; falls back to `STAINLESS_XRAY_ENDPOINT_URL` when omitted; explicit `endpointUrl` wins)
60
+ - `environment`, `version`, `logger`, `logLevel`
61
+ - `exporter`: `endpointUrl`, `headers`, `timeoutMs`, `spanProcessor`, `instance` (custom SpanExporter)
62
+ - `capture`: request/response headers and bodies
63
+ - `redaction`: headers/query/body JSON-path redaction
64
+ - `requestId`: header name to read/write
65
+ - `route`: normalization options
66
+
67
+ ## Adapter options (WrapOptions)
68
+
69
+ `wrapFetch(handler, xray, options)` and `wrapFetchPreserve(handler, xray, options)` share:
70
+
71
+ - `route`: override the route name for the request
72
+ - `requestId`: explicit request ID to use (prevents auto-generation)
73
+ - `capture`: per-request capture overrides
74
+ - `redaction`: per-request redaction overrides
75
+ - `onRequest(ctx)`, `onResponse(ctx, log)`, `onError(ctx, err)` hooks
76
+
77
+ ## Notes
78
+
79
+ - Requires a global `fetch` when using the default exporter. If `fetch` is not available, provide `exporter.instance` or use `@stainlessdev/xray-node`.
80
+ - This package depends on OpenTelemetry packages as peer dependencies.
package/dist/index.cjs CHANGED
@@ -57,7 +57,7 @@ function wrapFetch(handler, xray, options) {
57
57
  url: req.url,
58
58
  route: options?.route,
59
59
  headers: (0, import_internal.headerValuesFromFetchHeaders)(req.headers),
60
- requestId: resolveRequestId(options?.requestId, req, xray),
60
+ requestId: options?.requestId,
61
61
  startTimeMs: Date.now()
62
62
  };
63
63
  const ctx = xray.startRequest(normalizedRequest);
@@ -154,6 +154,7 @@ function wrapFetch(handler, xray, options) {
154
154
  return response;
155
155
  }
156
156
  const responseHeaders = new Headers(response.headers);
157
+ ensureResponseRequestIdHeaders(responseHeaders, ctx, xray);
157
158
  const statusCode = response.status;
158
159
  const isUpgrade = (0, import_internal.isWebsocketUpgradeFetch)(statusCode, req.headers, responseHeaders);
159
160
  if (!response.body || isUpgrade || capture.responseBody === "none") {
@@ -238,7 +239,7 @@ function wrapFetchPreserve(handler, xray, options) {
238
239
  url: req.url,
239
240
  route: options?.route,
240
241
  headers: (0, import_internal.headerValuesFromFetchHeaders)(req.headers),
241
- requestId: resolveRequestId(options?.requestId, req, xray),
242
+ requestId: options?.requestId,
242
243
  startTimeMs: Date.now()
243
244
  };
244
245
  const ctx = xray.startRequest(normalizedRequest);
@@ -331,6 +332,19 @@ function wrapFetchPreserve(handler, xray, options) {
331
332
  return response;
332
333
  }
333
334
  const responseHeaders = new Headers(response.headers);
335
+ const ensured = ensureResponseRequestIdHeaders(responseHeaders, ctx, xray);
336
+ if (ensured.set) {
337
+ const headerName = canonicalHeaderName(xray.config.requestId.header);
338
+ try {
339
+ response.headers.set(headerName, ensured.value ?? "");
340
+ } catch {
341
+ response = new Response(response.body, {
342
+ headers: responseHeaders,
343
+ status: response.status,
344
+ statusText: response.statusText
345
+ });
346
+ }
347
+ }
334
348
  const statusCode = response.status;
335
349
  const isUpgrade = (0, import_internal.isWebsocketUpgradeFetch)(statusCode, req.headers, responseHeaders);
336
350
  const responseCapturePromise = !response.body || isUpgrade || capture.responseBody === "none" ? Promise.resolve(null) : captureResponseClone(response, capture.maxBodyBytes, xray);
@@ -577,21 +591,36 @@ function finalizeResponse(ctx, xray, normalizedRequest, capture, requestCapture,
577
591
  endTimeMs: Date.now()
578
592
  });
579
593
  }
580
- function resolveRequestId(explicit, req, xray) {
581
- if (explicit) {
582
- return explicit;
594
+ function ensureResponseRequestIdHeaders(headers, ctx, xray) {
595
+ const headerName = xray.config.requestId.header;
596
+ const existing = normalizeRequestIdCandidate(headers.get(headerName) ?? void 0);
597
+ if (existing) {
598
+ return { value: existing, set: false };
583
599
  }
584
- const headerName = xray.config.requestId.header.toLowerCase();
585
- const value = req.headers.get(headerName);
586
- if (value && value.trim()) {
587
- return value.trim();
600
+ const explicit = normalizeRequestIdCandidate(ctx.requestId);
601
+ if (explicit) {
602
+ headers.set(canonicalHeaderName(headerName), explicit);
603
+ return { value: explicit, set: true };
588
604
  }
589
- return void 0;
605
+ const generated = (0, import_internal.generateRequestId)();
606
+ headers.set(canonicalHeaderName(headerName), generated);
607
+ (0, import_internal.setContextRequestId)(ctx, generated);
608
+ return { value: generated, set: true };
590
609
  }
591
610
  function isNodeRuntime() {
592
611
  const maybeProcess = globalThis.process;
593
612
  return !!maybeProcess?.versions?.node;
594
613
  }
614
+ function normalizeRequestIdCandidate(value) {
615
+ if (!value) {
616
+ return void 0;
617
+ }
618
+ const trimmed = value.trim();
619
+ return trimmed ? trimmed : void 0;
620
+ }
621
+ function canonicalHeaderName(headerName) {
622
+ return headerName.split("-").filter(Boolean).map((part) => part ? part[0].toUpperCase() + part.slice(1) : part).join("-");
623
+ }
595
624
  // Annotate the CommonJS export names for ESM import in node:
596
625
  0 && (module.exports = {
597
626
  createEmitter,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/emitter.ts","../src/adapter.ts"],"sourcesContent":["export { createEmitter } from './emitter';\nexport { wrapFetch, wrapFetchPreserve, getXrayContext } from './adapter';\nexport type { WrapOptions } from './adapter';\n","// Force the browser/worker exporter to avoid Node http resolution in edge runtimes.\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto/build/src/platform/browser/index.js';\nimport {\n createEmitter as createCoreEmitter,\n normalizeConfig,\n type XrayRuntimeConfig,\n} from '@stainlessdev/xray-core';\n\nexport function createEmitter(config: XrayRuntimeConfig) {\n if (!config.exporter?.instance) {\n const hasFetch = typeof globalThis !== 'undefined' && typeof globalThis.fetch === 'function';\n if (!hasFetch) {\n throw new Error(\n 'fetch is required to use the default @stainlessdev/xray-fetch exporter; provide exporter.instance or use @stainlessdev/xray-node instead.',\n );\n }\n }\n\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 '@stainlessdev/xray-core';\nimport {\n LimitedBuffer,\n bindContextToObject,\n getXrayContextFromObject,\n headerValuesFromFetchHeaders,\n isWebsocketUpgradeFetch,\n logWithLevel,\n makeCapturedBody,\n setCaptureOverride,\n setContextRequestId,\n setContextRoute,\n setRedactionOverride,\n} from '@stainlessdev/xray-core/internal';\n\nexport interface WrapOptions {\n route?: string;\n requestId?: string;\n capture?: Partial<CaptureConfig>;\n redaction?: Partial<RedactionConfig>;\n onRequest?: (ctx: XrayContext) => void;\n onResponse?: (ctx: XrayContext, log: RequestLog) => void;\n onError?: (ctx: XrayContext, err: unknown) => void;\n}\n\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: resolveRequestId(options?.requestId, req, xray),\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 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\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: resolveRequestId(options?.requestId, req, xray),\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 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\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 resolveRequestId(\n explicit: string | undefined,\n req: Request,\n xray: XrayEmitter,\n): string | undefined {\n if (explicit) {\n return explicit;\n }\n const headerName = xray.config.requestId.header.toLowerCase();\n const value = req.headers.get(headerName);\n if (value && value.trim()) {\n return value.trim();\n }\n return undefined;\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"],"mappings":"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","names":["createCoreEmitter"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/emitter.ts","../src/adapter.ts"],"sourcesContent":["export { createEmitter } from './emitter';\nexport { wrapFetch, wrapFetchPreserve, getXrayContext } from './adapter';\nexport type { WrapOptions } from './adapter';\n","// Force the browser/worker exporter to avoid Node http resolution in edge runtimes.\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto/build/src/platform/browser/index.js';\nimport {\n createEmitter as createCoreEmitter,\n normalizeConfig,\n type XrayRuntimeConfig,\n} from '@stainlessdev/xray-core';\n\nexport function createEmitter(config: XrayRuntimeConfig) {\n if (!config.exporter?.instance) {\n const hasFetch = typeof globalThis !== 'undefined' && typeof globalThis.fetch === 'function';\n if (!hasFetch) {\n throw new Error(\n 'fetch is required to use the default @stainlessdev/xray-fetch exporter; provide exporter.instance or use @stainlessdev/xray-node instead.',\n );\n }\n }\n\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 '@stainlessdev/xray-core';\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 '@stainlessdev/xray-core/internal';\n\nexport interface WrapOptions {\n route?: string;\n requestId?: string;\n capture?: Partial<CaptureConfig>;\n redaction?: Partial<RedactionConfig>;\n onRequest?: (ctx: XrayContext) => void;\n onResponse?: (ctx: XrayContext, log: RequestLog) => void;\n onError?: (ctx: XrayContext, err: unknown) => void;\n}\n\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\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\nexport function getXrayContext(req: Request): XrayContext | undefined {\n return getXrayContextFromObject(req);\n}\n\ntype RequestCapture = {\n buffer: LimitedBuffer;\n read: boolean;\n};\n\nfunction wrapRequestBody(\n request: Request,\n limit: number,\n): { capture: RequestCapture | null; request: Request } {\n if (limit <= 0 || !request.body || request.bodyUsed) {\n return { capture: null, request };\n }\n\n const originalBody = request.body;\n const capture: RequestCapture = {\n buffer: new LimitedBuffer(limit),\n read: false,\n };\n\n let controller: ReadableStreamDefaultController<Uint8Array> | null = null;\n let started = false;\n let reader: ReadableStreamDefaultReader<Uint8Array> | null = null;\n\n const wrappedStream = new ReadableStream<Uint8Array>({\n start(c) {\n controller = c;\n },\n async cancel(reason) {\n if (!started) {\n return;\n }\n try {\n await reader?.cancel(reason);\n } finally {\n // Ignore cancellation.\n }\n },\n });\n\n const startPump = () => {\n if (started) {\n return;\n }\n started = true;\n reader = originalBody.getReader();\n void (async () => {\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n controller?.close();\n return;\n }\n if (value) {\n capture.read = true;\n capture.buffer.write(value);\n controller?.enqueue(value);\n }\n }\n } catch (err) {\n controller?.error(err);\n }\n })();\n };\n\n const originalGetReader = wrappedStream.getReader.bind(wrappedStream);\n (wrappedStream as unknown as { getReader: typeof wrappedStream.getReader }).getReader = (\n ...args: unknown[]\n ) => {\n startPump();\n // @ts-expect-error - preserve built-in `getReader` overloads\n return originalGetReader(...args);\n };\n\n const init: RequestInit & { duplex?: 'half' } = {\n body: wrappedStream,\n cache: request.cache,\n credentials: request.credentials,\n headers: request.headers,\n integrity: request.integrity,\n keepalive: request.keepalive,\n method: request.method,\n mode: request.mode,\n redirect: request.redirect,\n referrer: request.referrer,\n referrerPolicy: request.referrerPolicy,\n signal: request.signal,\n };\n if (isNodeRuntime()) {\n init.duplex = 'half';\n }\n\n const wrappedRequest = new Request(request.url, init);\n return { capture, request: wrappedRequest };\n}\n\nasync function captureRequestClone(\n request: Request,\n limit: number,\n xray: XrayEmitter,\n): Promise<LimitedBuffer | null> {\n if (limit <= 0 || !request.body || request.bodyUsed) {\n return null;\n }\n let clone: Request;\n try {\n clone = request.clone();\n } catch {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: request clone failed');\n return null;\n }\n\n const buffer = new LimitedBuffer(limit);\n await readStreamToBuffer(clone.body, buffer);\n return buffer;\n}\n\nasync function captureResponseClone(\n response: Response,\n limit: number,\n xray: XrayEmitter,\n): Promise<LimitedBuffer | null> {\n if (limit <= 0 || !response.body || response.bodyUsed) {\n return null;\n }\n let clone: Response;\n try {\n clone = response.clone();\n } catch {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: response clone failed');\n return null;\n }\n\n const buffer = new LimitedBuffer(limit);\n await readStreamToBuffer(clone.body, buffer);\n return buffer;\n}\n\nasync function readStreamToBuffer(\n stream: ReadableStream<Uint8Array> | null,\n buffer: LimitedBuffer,\n): Promise<void> {\n if (!stream) {\n return;\n }\n\n const reader = stream.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n return;\n }\n if (value) {\n buffer.write(value);\n }\n }\n } finally {\n try {\n reader.releaseLock();\n } catch {\n // Ignore release failures; reader may already be closed.\n }\n }\n}\n\nfunction wrapReadableStream(\n stream: ReadableStream<Uint8Array>,\n capture: LimitedBuffer,\n onFinish: () => void,\n onError?: (err: unknown) => void,\n): ReadableStream<Uint8Array> {\n const reader = stream.getReader();\n\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n try {\n const { done, value } = await reader.read();\n if (done) {\n controller.close();\n onFinish();\n try {\n reader.releaseLock();\n } catch {\n // Ignore release failures; reader may already be closed.\n }\n return;\n }\n if (value) {\n capture.write(value);\n controller.enqueue(value);\n }\n } catch (err) {\n controller.error(err);\n onError?.(err);\n onFinish();\n try {\n reader.releaseLock();\n } catch {\n // Ignore release failures; reader may already be closed.\n }\n }\n },\n async cancel(reason) {\n try {\n await reader.cancel(reason);\n } finally {\n onFinish();\n try {\n reader.releaseLock();\n } catch {\n // Ignore release failures; reader may already be closed.\n }\n }\n },\n });\n}\n\nfunction finalizeResponse(\n ctx: XrayContext,\n xray: XrayEmitter,\n normalizedRequest: NormalizedRequest,\n capture: CaptureConfig,\n requestCapture: RequestCapture | LimitedBuffer | null,\n responseHeaders: Headers,\n statusCode: number,\n responseCapture: LimitedBuffer | null,\n): RequestLog {\n if (requestCapture) {\n const buffer = requestCapture instanceof LimitedBuffer ? requestCapture : requestCapture.buffer;\n const read = requestCapture instanceof LimitedBuffer ? true : requestCapture.read;\n if (read) {\n normalizedRequest.body = makeCapturedBody(\n buffer.bytes(),\n buffer.totalBytes(),\n buffer.truncated(),\n capture.requestBody === 'text' ? 'text' : 'base64',\n );\n }\n }\n\n const responseBody = responseCapture\n ? makeCapturedBody(\n responseCapture.bytes(),\n responseCapture.totalBytes(),\n responseCapture.truncated(),\n capture.responseBody === 'text' ? 'text' : 'base64',\n )\n : undefined;\n\n return xray.endRequest(ctx, {\n statusCode,\n headers: headerValuesFromFetchHeaders(responseHeaders),\n body: responseBody,\n endTimeMs: Date.now(),\n });\n}\n\nfunction ensureResponseRequestIdHeaders(\n headers: Headers,\n ctx: XrayContext,\n xray: XrayEmitter,\n): { value?: string; set: boolean } {\n const headerName = xray.config.requestId.header;\n const existing = normalizeRequestIdCandidate(headers.get(headerName) ?? undefined);\n if (existing) {\n return { value: existing, set: false };\n }\n\n const explicit = normalizeRequestIdCandidate(ctx.requestId);\n if (explicit) {\n headers.set(canonicalHeaderName(headerName), explicit);\n return { value: explicit, set: true };\n }\n\n const generated = generateRequestId();\n headers.set(canonicalHeaderName(headerName), generated);\n setContextRequestId(ctx, generated);\n return { value: generated, set: true };\n}\n\nfunction isNodeRuntime(): boolean {\n const maybeProcess = (\n globalThis as typeof globalThis & {\n process?: { versions?: { node?: string } };\n }\n ).process;\n return !!maybeProcess?.versions?.node;\n}\n\nfunction normalizeRequestIdCandidate(value: string | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed ? trimmed : undefined;\n}\n\nfunction canonicalHeaderName(headerName: string): string {\n return headerName\n .split('-')\n .filter(Boolean)\n .map((part) => (part ? part[0]!.toUpperCase() + part.slice(1) : part))\n .join('-');\n}\n"],"mappings":"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","names":["createCoreEmitter"]}
package/dist/index.js CHANGED
@@ -34,7 +34,8 @@ import {
34
34
  setCaptureOverride,
35
35
  setContextRequestId,
36
36
  setContextRoute,
37
- setRedactionOverride
37
+ setRedactionOverride,
38
+ generateRequestId
38
39
  } from "@stainlessdev/xray-core/internal";
39
40
  function wrapFetch(handler, xray, options) {
40
41
  return async (req) => {
@@ -43,7 +44,7 @@ function wrapFetch(handler, xray, options) {
43
44
  url: req.url,
44
45
  route: options?.route,
45
46
  headers: headerValuesFromFetchHeaders(req.headers),
46
- requestId: resolveRequestId(options?.requestId, req, xray),
47
+ requestId: options?.requestId,
47
48
  startTimeMs: Date.now()
48
49
  };
49
50
  const ctx = xray.startRequest(normalizedRequest);
@@ -140,6 +141,7 @@ function wrapFetch(handler, xray, options) {
140
141
  return response;
141
142
  }
142
143
  const responseHeaders = new Headers(response.headers);
144
+ ensureResponseRequestIdHeaders(responseHeaders, ctx, xray);
143
145
  const statusCode = response.status;
144
146
  const isUpgrade = isWebsocketUpgradeFetch(statusCode, req.headers, responseHeaders);
145
147
  if (!response.body || isUpgrade || capture.responseBody === "none") {
@@ -224,7 +226,7 @@ function wrapFetchPreserve(handler, xray, options) {
224
226
  url: req.url,
225
227
  route: options?.route,
226
228
  headers: headerValuesFromFetchHeaders(req.headers),
227
- requestId: resolveRequestId(options?.requestId, req, xray),
229
+ requestId: options?.requestId,
228
230
  startTimeMs: Date.now()
229
231
  };
230
232
  const ctx = xray.startRequest(normalizedRequest);
@@ -317,6 +319,19 @@ function wrapFetchPreserve(handler, xray, options) {
317
319
  return response;
318
320
  }
319
321
  const responseHeaders = new Headers(response.headers);
322
+ const ensured = ensureResponseRequestIdHeaders(responseHeaders, ctx, xray);
323
+ if (ensured.set) {
324
+ const headerName = canonicalHeaderName(xray.config.requestId.header);
325
+ try {
326
+ response.headers.set(headerName, ensured.value ?? "");
327
+ } catch {
328
+ response = new Response(response.body, {
329
+ headers: responseHeaders,
330
+ status: response.status,
331
+ statusText: response.statusText
332
+ });
333
+ }
334
+ }
320
335
  const statusCode = response.status;
321
336
  const isUpgrade = isWebsocketUpgradeFetch(statusCode, req.headers, responseHeaders);
322
337
  const responseCapturePromise = !response.body || isUpgrade || capture.responseBody === "none" ? Promise.resolve(null) : captureResponseClone(response, capture.maxBodyBytes, xray);
@@ -563,21 +578,36 @@ function finalizeResponse(ctx, xray, normalizedRequest, capture, requestCapture,
563
578
  endTimeMs: Date.now()
564
579
  });
565
580
  }
566
- function resolveRequestId(explicit, req, xray) {
567
- if (explicit) {
568
- return explicit;
581
+ function ensureResponseRequestIdHeaders(headers, ctx, xray) {
582
+ const headerName = xray.config.requestId.header;
583
+ const existing = normalizeRequestIdCandidate(headers.get(headerName) ?? void 0);
584
+ if (existing) {
585
+ return { value: existing, set: false };
569
586
  }
570
- const headerName = xray.config.requestId.header.toLowerCase();
571
- const value = req.headers.get(headerName);
572
- if (value && value.trim()) {
573
- return value.trim();
587
+ const explicit = normalizeRequestIdCandidate(ctx.requestId);
588
+ if (explicit) {
589
+ headers.set(canonicalHeaderName(headerName), explicit);
590
+ return { value: explicit, set: true };
574
591
  }
575
- return void 0;
592
+ const generated = generateRequestId();
593
+ headers.set(canonicalHeaderName(headerName), generated);
594
+ setContextRequestId(ctx, generated);
595
+ return { value: generated, set: true };
576
596
  }
577
597
  function isNodeRuntime() {
578
598
  const maybeProcess = globalThis.process;
579
599
  return !!maybeProcess?.versions?.node;
580
600
  }
601
+ function normalizeRequestIdCandidate(value) {
602
+ if (!value) {
603
+ return void 0;
604
+ }
605
+ const trimmed = value.trim();
606
+ return trimmed ? trimmed : void 0;
607
+ }
608
+ function canonicalHeaderName(headerName) {
609
+ return headerName.split("-").filter(Boolean).map((part) => part ? part[0].toUpperCase() + part.slice(1) : part).join("-");
610
+ }
581
611
  export {
582
612
  createEmitter,
583
613
  getXrayContext,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/emitter.ts","../src/adapter.ts"],"sourcesContent":["// Force the browser/worker exporter to avoid Node http resolution in edge runtimes.\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto/build/src/platform/browser/index.js';\nimport {\n createEmitter as createCoreEmitter,\n normalizeConfig,\n type XrayRuntimeConfig,\n} from '@stainlessdev/xray-core';\n\nexport function createEmitter(config: XrayRuntimeConfig) {\n if (!config.exporter?.instance) {\n const hasFetch = typeof globalThis !== 'undefined' && typeof globalThis.fetch === 'function';\n if (!hasFetch) {\n throw new Error(\n 'fetch is required to use the default @stainlessdev/xray-fetch exporter; provide exporter.instance or use @stainlessdev/xray-node instead.',\n );\n }\n }\n\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 '@stainlessdev/xray-core';\nimport {\n LimitedBuffer,\n bindContextToObject,\n getXrayContextFromObject,\n headerValuesFromFetchHeaders,\n isWebsocketUpgradeFetch,\n logWithLevel,\n makeCapturedBody,\n setCaptureOverride,\n setContextRequestId,\n setContextRoute,\n setRedactionOverride,\n} from '@stainlessdev/xray-core/internal';\n\nexport interface WrapOptions {\n route?: string;\n requestId?: string;\n capture?: Partial<CaptureConfig>;\n redaction?: Partial<RedactionConfig>;\n onRequest?: (ctx: XrayContext) => void;\n onResponse?: (ctx: XrayContext, log: RequestLog) => void;\n onError?: (ctx: XrayContext, err: unknown) => void;\n}\n\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: resolveRequestId(options?.requestId, req, xray),\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 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\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: resolveRequestId(options?.requestId, req, xray),\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 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\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 resolveRequestId(\n explicit: string | undefined,\n req: Request,\n xray: XrayEmitter,\n): string | undefined {\n if (explicit) {\n return explicit;\n }\n const headerName = xray.config.requestId.header.toLowerCase();\n const value = req.headers.get(headerName);\n if (value && value.trim()) {\n return value.trim();\n }\n return undefined;\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"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/emitter.ts","../src/adapter.ts"],"sourcesContent":["// Force the browser/worker exporter to avoid Node http resolution in edge runtimes.\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto/build/src/platform/browser/index.js';\nimport {\n createEmitter as createCoreEmitter,\n normalizeConfig,\n type XrayRuntimeConfig,\n} from '@stainlessdev/xray-core';\n\nexport function createEmitter(config: XrayRuntimeConfig) {\n if (!config.exporter?.instance) {\n const hasFetch = typeof globalThis !== 'undefined' && typeof globalThis.fetch === 'function';\n if (!hasFetch) {\n throw new Error(\n 'fetch is required to use the default @stainlessdev/xray-fetch exporter; provide exporter.instance or use @stainlessdev/xray-node instead.',\n );\n }\n }\n\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 '@stainlessdev/xray-core';\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 '@stainlessdev/xray-core/internal';\n\nexport interface WrapOptions {\n route?: string;\n requestId?: string;\n capture?: Partial<CaptureConfig>;\n redaction?: Partial<RedactionConfig>;\n onRequest?: (ctx: XrayContext) => void;\n onResponse?: (ctx: XrayContext, log: RequestLog) => void;\n onError?: (ctx: XrayContext, err: unknown) => void;\n}\n\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\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\nexport function getXrayContext(req: Request): XrayContext | undefined {\n return getXrayContextFromObject(req);\n}\n\ntype RequestCapture = {\n buffer: LimitedBuffer;\n read: boolean;\n};\n\nfunction wrapRequestBody(\n request: Request,\n limit: number,\n): { capture: RequestCapture | null; request: Request } {\n if (limit <= 0 || !request.body || request.bodyUsed) {\n return { capture: null, request };\n }\n\n const originalBody = request.body;\n const capture: RequestCapture = {\n buffer: new LimitedBuffer(limit),\n read: false,\n };\n\n let controller: ReadableStreamDefaultController<Uint8Array> | null = null;\n let started = false;\n let reader: ReadableStreamDefaultReader<Uint8Array> | null = null;\n\n const wrappedStream = new ReadableStream<Uint8Array>({\n start(c) {\n controller = c;\n },\n async cancel(reason) {\n if (!started) {\n return;\n }\n try {\n await reader?.cancel(reason);\n } finally {\n // Ignore cancellation.\n }\n },\n });\n\n const startPump = () => {\n if (started) {\n return;\n }\n started = true;\n reader = originalBody.getReader();\n void (async () => {\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n controller?.close();\n return;\n }\n if (value) {\n capture.read = true;\n capture.buffer.write(value);\n controller?.enqueue(value);\n }\n }\n } catch (err) {\n controller?.error(err);\n }\n })();\n };\n\n const originalGetReader = wrappedStream.getReader.bind(wrappedStream);\n (wrappedStream as unknown as { getReader: typeof wrappedStream.getReader }).getReader = (\n ...args: unknown[]\n ) => {\n startPump();\n // @ts-expect-error - preserve built-in `getReader` overloads\n return originalGetReader(...args);\n };\n\n const init: RequestInit & { duplex?: 'half' } = {\n body: wrappedStream,\n cache: request.cache,\n credentials: request.credentials,\n headers: request.headers,\n integrity: request.integrity,\n keepalive: request.keepalive,\n method: request.method,\n mode: request.mode,\n redirect: request.redirect,\n referrer: request.referrer,\n referrerPolicy: request.referrerPolicy,\n signal: request.signal,\n };\n if (isNodeRuntime()) {\n init.duplex = 'half';\n }\n\n const wrappedRequest = new Request(request.url, init);\n return { capture, request: wrappedRequest };\n}\n\nasync function captureRequestClone(\n request: Request,\n limit: number,\n xray: XrayEmitter,\n): Promise<LimitedBuffer | null> {\n if (limit <= 0 || !request.body || request.bodyUsed) {\n return null;\n }\n let clone: Request;\n try {\n clone = request.clone();\n } catch {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: request clone failed');\n return null;\n }\n\n const buffer = new LimitedBuffer(limit);\n await readStreamToBuffer(clone.body, buffer);\n return buffer;\n}\n\nasync function captureResponseClone(\n response: Response,\n limit: number,\n xray: XrayEmitter,\n): Promise<LimitedBuffer | null> {\n if (limit <= 0 || !response.body || response.bodyUsed) {\n return null;\n }\n let clone: Response;\n try {\n clone = response.clone();\n } catch {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: response clone failed');\n return null;\n }\n\n const buffer = new LimitedBuffer(limit);\n await readStreamToBuffer(clone.body, buffer);\n return buffer;\n}\n\nasync function readStreamToBuffer(\n stream: ReadableStream<Uint8Array> | null,\n buffer: LimitedBuffer,\n): Promise<void> {\n if (!stream) {\n return;\n }\n\n const reader = stream.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n return;\n }\n if (value) {\n buffer.write(value);\n }\n }\n } finally {\n try {\n reader.releaseLock();\n } catch {\n // Ignore release failures; reader may already be closed.\n }\n }\n}\n\nfunction wrapReadableStream(\n stream: ReadableStream<Uint8Array>,\n capture: LimitedBuffer,\n onFinish: () => void,\n onError?: (err: unknown) => void,\n): ReadableStream<Uint8Array> {\n const reader = stream.getReader();\n\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n try {\n const { done, value } = await reader.read();\n if (done) {\n controller.close();\n onFinish();\n try {\n reader.releaseLock();\n } catch {\n // Ignore release failures; reader may already be closed.\n }\n return;\n }\n if (value) {\n capture.write(value);\n controller.enqueue(value);\n }\n } catch (err) {\n controller.error(err);\n onError?.(err);\n onFinish();\n try {\n reader.releaseLock();\n } catch {\n // Ignore release failures; reader may already be closed.\n }\n }\n },\n async cancel(reason) {\n try {\n await reader.cancel(reason);\n } finally {\n onFinish();\n try {\n reader.releaseLock();\n } catch {\n // Ignore release failures; reader may already be closed.\n }\n }\n },\n });\n}\n\nfunction finalizeResponse(\n ctx: XrayContext,\n xray: XrayEmitter,\n normalizedRequest: NormalizedRequest,\n capture: CaptureConfig,\n requestCapture: RequestCapture | LimitedBuffer | null,\n responseHeaders: Headers,\n statusCode: number,\n responseCapture: LimitedBuffer | null,\n): RequestLog {\n if (requestCapture) {\n const buffer = requestCapture instanceof LimitedBuffer ? requestCapture : requestCapture.buffer;\n const read = requestCapture instanceof LimitedBuffer ? true : requestCapture.read;\n if (read) {\n normalizedRequest.body = makeCapturedBody(\n buffer.bytes(),\n buffer.totalBytes(),\n buffer.truncated(),\n capture.requestBody === 'text' ? 'text' : 'base64',\n );\n }\n }\n\n const responseBody = responseCapture\n ? makeCapturedBody(\n responseCapture.bytes(),\n responseCapture.totalBytes(),\n responseCapture.truncated(),\n capture.responseBody === 'text' ? 'text' : 'base64',\n )\n : undefined;\n\n return xray.endRequest(ctx, {\n statusCode,\n headers: headerValuesFromFetchHeaders(responseHeaders),\n body: responseBody,\n endTimeMs: Date.now(),\n });\n}\n\nfunction ensureResponseRequestIdHeaders(\n headers: Headers,\n ctx: XrayContext,\n xray: XrayEmitter,\n): { value?: string; set: boolean } {\n const headerName = xray.config.requestId.header;\n const existing = normalizeRequestIdCandidate(headers.get(headerName) ?? undefined);\n if (existing) {\n return { value: existing, set: false };\n }\n\n const explicit = normalizeRequestIdCandidate(ctx.requestId);\n if (explicit) {\n headers.set(canonicalHeaderName(headerName), explicit);\n return { value: explicit, set: true };\n }\n\n const generated = generateRequestId();\n headers.set(canonicalHeaderName(headerName), generated);\n setContextRequestId(ctx, generated);\n return { value: generated, set: true };\n}\n\nfunction isNodeRuntime(): boolean {\n const maybeProcess = (\n globalThis as typeof globalThis & {\n process?: { versions?: { node?: string } };\n }\n ).process;\n return !!maybeProcess?.versions?.node;\n}\n\nfunction normalizeRequestIdCandidate(value: string | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed ? trimmed : undefined;\n}\n\nfunction canonicalHeaderName(headerName: string): string {\n return headerName\n .split('-')\n .filter(Boolean)\n .map((part) => (part ? part[0]!.toUpperCase() + part.slice(1) : part))\n .join('-');\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stainlessdev/xray-fetch",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "description": "Fetch API adapter for Stainless X-ray request logging",
5
5
  "files": [
6
6
  "dist"
@@ -22,7 +22,7 @@
22
22
  "access": "public"
23
23
  },
24
24
  "dependencies": {
25
- "@stainlessdev/xray-core": "0.6.0"
25
+ "@stainlessdev/xray-core": "0.7.0"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@opentelemetry/api": "^1.9.0",