@stainlessdev/xray-core 0.4.0 → 0.5.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/dist/index.js CHANGED
@@ -118,11 +118,9 @@ var defaultRoute = {
118
118
  normalize: true,
119
119
  normalizer: normalizeRoutePattern
120
120
  };
121
- var DEFAULT_ENDPOINT_URL = "http://localhost:4318";
122
121
  var defaultExporterBase = {
123
- endpointUrl: DEFAULT_ENDPOINT_URL,
124
122
  headers: {},
125
- timeoutMs: 5e3,
123
+ timeoutMs: 3e4,
126
124
  spanProcessor: "batch"
127
125
  };
128
126
  var XrayConfigError = class extends Error {
@@ -217,7 +215,6 @@ function normalizeExporter(endpointUrl, cfg) {
217
215
  const rawHeaders = cfg?.headers ?? defaultExporterBase.headers ?? {};
218
216
  const parsed = applyEndpointAuth(resolvedEndpoint, rawHeaders);
219
217
  const exporter = {
220
- ...defaultExporterBase,
221
218
  endpointUrl: parsed.endpointUrl,
222
219
  headers: parsed.headers,
223
220
  timeoutMs: cfg?.timeoutMs ?? defaultExporterBase.timeoutMs,
@@ -227,7 +224,13 @@ function normalizeExporter(endpointUrl, cfg) {
227
224
  }
228
225
  function normalizeExporterEndpoint(endpointUrl) {
229
226
  const envUrl = typeof process !== "undefined" ? process.env?.["STAINLESS_XRAY_ENDPOINT_URL"] : void 0;
230
- const resolved = endpointUrl ?? envUrl ?? DEFAULT_ENDPOINT_URL;
227
+ const resolved = endpointUrl ?? envUrl;
228
+ if (!resolved || !resolved.trim()) {
229
+ throw new XrayConfigError(
230
+ "INVALID_CONFIG",
231
+ "endpointUrl is required (set endpointUrl or STAINLESS_XRAY_ENDPOINT_URL)"
232
+ );
233
+ }
231
234
  const trimmed = resolved.trim();
232
235
  const withoutTrailingSlash = trimmed.endsWith("/") ? trimmed.slice(0, -1) : trimmed;
233
236
  if (withoutTrailingSlash.endsWith("/v1/traces")) {
@@ -655,6 +658,18 @@ function redactJsonPath(value, segments, replacement) {
655
658
  }
656
659
  }
657
660
 
661
+ // src/attributes.ts
662
+ import {
663
+ ATTR_HTTP_REQUEST_BODY_SIZE,
664
+ ATTR_HTTP_REQUEST_METHOD,
665
+ ATTR_HTTP_RESPONSE_BODY_SIZE,
666
+ ATTR_HTTP_RESPONSE_STATUS_CODE,
667
+ ATTR_HTTP_ROUTE,
668
+ ATTR_URL_FULL,
669
+ ATTR_URL_PATH,
670
+ ATTR_USER_ID
671
+ } from "@opentelemetry/semantic-conventions/incubating";
672
+
658
673
  // src/attrkey.ts
659
674
  var AttributeKeyRequestBody = "http.request.body";
660
675
  var AttributeKeyRequestBodyEncoding = "http.request.body.encoding";
@@ -666,14 +681,6 @@ var AttributeKeyResponseBodyTruncated = "http.response.body.truncated";
666
681
  var AttributeKeySpanDrop = "stainlessxray.internal.drop";
667
682
 
668
683
  // src/attributes.ts
669
- var attributeKeyEndUserId = "enduser.id";
670
- var attributeKeyHttpRequestBodySize = "http.request.body.size";
671
- var attributeKeyHttpRequestMethod = "http.request.method";
672
- var attributeKeyHttpResponseBodySize = "http.response.body.size";
673
- var attributeKeyHttpResponseStatusCode = "http.response.status_code";
674
- var attributeKeyHttpRoute = "http.route";
675
- var attributeKeyUrlPath = "url.path";
676
- var attributeKeyUrlFull = "url.full";
677
684
  function setHeaderAttributes(span, headers, prefix) {
678
685
  if (!headers) {
679
686
  return;
@@ -688,12 +695,12 @@ function setHeaderAttributes(span, headers, prefix) {
688
695
  }
689
696
  }
690
697
  function setRequestAttributes(span, method, urlFull) {
691
- span.setAttribute(attributeKeyHttpRequestMethod, method);
698
+ span.setAttribute(ATTR_HTTP_REQUEST_METHOD, method);
692
699
  if (urlFull) {
693
- span.setAttribute(attributeKeyUrlFull, urlFull);
700
+ span.setAttribute(ATTR_URL_FULL, urlFull);
694
701
  const path = extractPath(urlFull);
695
702
  if (path) {
696
- span.setAttribute(attributeKeyUrlPath, path);
703
+ span.setAttribute(ATTR_URL_PATH, path);
697
704
  }
698
705
  }
699
706
  }
@@ -716,7 +723,7 @@ function setRequestBodyAttributes(span, body) {
716
723
  }
717
724
  }
718
725
  function setRequestBodySizeAttribute(span, size) {
719
- span.setAttribute(attributeKeyHttpRequestBodySize, size);
726
+ span.setAttribute(ATTR_HTTP_REQUEST_BODY_SIZE, size);
720
727
  }
721
728
  function setResponseBodyAttributes(span, body) {
722
729
  if (!body.value) {
@@ -729,18 +736,18 @@ function setResponseBodyAttributes(span, body) {
729
736
  }
730
737
  }
731
738
  function setResponseBodySizeAttribute(span, size) {
732
- span.setAttribute(attributeKeyHttpResponseBodySize, size);
739
+ span.setAttribute(ATTR_HTTP_RESPONSE_BODY_SIZE, size);
733
740
  }
734
741
  function setResponseStatusAttribute(span, statusCode) {
735
- span.setAttribute(attributeKeyHttpResponseStatusCode, statusCode);
742
+ span.setAttribute(ATTR_HTTP_RESPONSE_STATUS_CODE, statusCode);
736
743
  }
737
744
  function setRouteAttribute(span, route) {
738
745
  if (route) {
739
- span.setAttribute(attributeKeyHttpRoute, route);
746
+ span.setAttribute(ATTR_HTTP_ROUTE, route);
740
747
  }
741
748
  }
742
749
  function setUserIdAttribute(span, userId) {
743
- span.setAttribute(attributeKeyEndUserId, userId);
750
+ span.setAttribute(ATTR_USER_ID, userId);
744
751
  }
745
752
  function setRequestIdAttribute(span, requestId) {
746
753
  span.setAttribute(AttributeKeyRequestID, requestId);
@@ -753,7 +760,6 @@ import {
753
760
  SpanKind,
754
761
  SpanStatusCode
755
762
  } from "@opentelemetry/api";
756
- import { ExportResultCode } from "@opentelemetry/core";
757
763
  import {
758
764
  AlwaysOnSampler,
759
765
  BasicTracerProvider,
@@ -767,9 +773,8 @@ import {
767
773
  ATTR_TELEMETRY_SDK_NAME,
768
774
  ATTR_TELEMETRY_SDK_VERSION
769
775
  } from "@opentelemetry/semantic-conventions";
770
- import { JsonTraceSerializer, ProtobufTraceSerializer } from "@opentelemetry/otlp-transformer";
771
776
  var defaultAttributeCountLimit = 128;
772
- function createTracerProvider(config) {
777
+ function createTracerProvider(config, exporter) {
773
778
  if (config.exporter.endpointUrl.startsWith("http://")) {
774
779
  diag.warn("xray: OTLP endpoint uses plaintext HTTP");
775
780
  }
@@ -780,13 +785,6 @@ function createTracerProvider(config) {
780
785
  [ATTR_TELEMETRY_SDK_NAME]: "stainless-xray",
781
786
  [ATTR_TELEMETRY_SDK_VERSION]: sdkVersion()
782
787
  });
783
- const exporter = new FetchSpanExporter({
784
- endpointUrl: config.exporter.endpointUrl,
785
- headers: config.exporter.headers ?? {},
786
- timeoutMillis: config.exporter.timeoutMs,
787
- logger: config.logger,
788
- logLevel: config.logLevel
789
- });
790
788
  const spanProcessor = createSpanProcessor(config.exporter.spanProcessor, exporter);
791
789
  const dropProcessor = new DropFilterSpanProcessor(spanProcessor);
792
790
  const provider = new BasicTracerProvider({
@@ -845,77 +843,6 @@ var DropFilterSpanProcessor = class {
845
843
  return this.next.shutdown();
846
844
  }
847
845
  };
848
- var FetchSpanExporter = class {
849
- constructor(options) {
850
- this.endpointUrl = options.endpointUrl;
851
- this.headers = { ...options.headers };
852
- this.timeoutMillis = options.timeoutMillis;
853
- this.isShutdown = false;
854
- this.logger = options.logger;
855
- this.logLevel = options.logLevel;
856
- const protobufSerializer = ProtobufTraceSerializer && typeof ProtobufTraceSerializer.serializeRequest === "function" ? ProtobufTraceSerializer : null;
857
- this.serializer = protobufSerializer ?? JsonTraceSerializer;
858
- this.contentType = protobufSerializer ? "application/x-protobuf" : "application/json";
859
- }
860
- export(spans, resultCallback) {
861
- if (this.isShutdown) {
862
- resultCallback({ code: ExportResultCode.FAILED });
863
- return;
864
- }
865
- const payload = this.serializer.serializeRequest(spans);
866
- if (!payload) {
867
- logWithLevel(this.logger, "warn", this.logLevel, "xray: OTLP export failed", {
868
- error: "OTLP export failed: empty payload"
869
- });
870
- resultCallback({
871
- code: ExportResultCode.FAILED,
872
- error: new Error("OTLP export failed: empty payload")
873
- });
874
- return;
875
- }
876
- const headers = {
877
- ...this.headers,
878
- "Content-Type": this.contentType
879
- };
880
- const controller = typeof AbortController !== "undefined" ? new AbortController() : null;
881
- let timeout;
882
- if (controller) {
883
- timeout = setTimeout(() => controller.abort(), this.timeoutMillis);
884
- }
885
- const doExport = async () => {
886
- const response = await fetch(this.endpointUrl, {
887
- method: "POST",
888
- headers,
889
- body: payload,
890
- signal: controller?.signal
891
- });
892
- if (!response.ok) {
893
- throw new Error(`OTLP export failed: ${response.status}`);
894
- }
895
- };
896
- doExport().then(() => {
897
- if (timeout) {
898
- clearTimeout(timeout);
899
- }
900
- resultCallback({ code: ExportResultCode.SUCCESS });
901
- }).catch((err) => {
902
- if (timeout) {
903
- clearTimeout(timeout);
904
- }
905
- logWithLevel(this.logger, "warn", this.logLevel, "xray: OTLP export failed", {
906
- error: err instanceof Error ? err.message : String(err)
907
- });
908
- diag.error("OTLP export failed", err);
909
- resultCallback({ code: ExportResultCode.FAILED, error: err });
910
- });
911
- }
912
- async forceFlush() {
913
- return;
914
- }
915
- async shutdown() {
916
- this.isShutdown = true;
917
- }
918
- };
919
846
  function createSpanProcessor(mode, exporter) {
920
847
  if (mode === "simple") {
921
848
  return new SimpleSpanProcessor(exporter);
@@ -929,7 +856,7 @@ function createSpanProcessor(mode, exporter) {
929
856
  }
930
857
  function sdkVersion() {
931
858
  if (true) {
932
- return "0.3.1";
859
+ return "0.4.0";
933
860
  }
934
861
  return "unknown";
935
862
  }
@@ -958,8 +885,14 @@ function uuidv7() {
958
885
  }
959
886
 
960
887
  // src/emitter.ts
961
- function createEmitter(config) {
888
+ function createEmitter(config, exporter) {
962
889
  const resolved = normalizeConfig(config);
890
+ if (!exporter) {
891
+ throw new XrayConfigError(
892
+ "INVALID_CONFIG",
893
+ "exporter is required (use @stainlessdev/xray-node or @stainlessdev/xray-fetch)"
894
+ );
895
+ }
963
896
  logWithLevel(resolved.logger, "info", resolved.logLevel, "xray: emitter configured", {
964
897
  serviceName: resolved.serviceName,
965
898
  environment: resolved.environment,
@@ -967,7 +900,7 @@ function createEmitter(config) {
967
900
  exporterEndpoint: resolved.exporter.endpointUrl,
968
901
  spanProcessor: resolved.exporter.spanProcessor
969
902
  });
970
- const tracerProvider = createTracerProvider(resolved);
903
+ const tracerProvider = createTracerProvider(resolved, exporter);
971
904
  const tracer = tracerFromProvider(tracerProvider);
972
905
  return {
973
906
  config: resolved,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/route.ts","../src/config.ts","../src/header_redaction.ts","../src/redaction.ts","../src/attrkey.ts","../src/attributes.ts","../src/otel.ts","../src/uuid.ts","../src/emitter.ts"],"sourcesContent":["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\nexport interface ExporterConfig {\n endpointUrl: string;\n headers?: Record<string, string>;\n timeoutMs: number;\n spanProcessor: 'simple' | 'batch';\n}\n\nexport interface CaptureConfig {\n requestHeaders: boolean;\n responseHeaders: boolean;\n requestBody: 'none' | 'text' | 'base64';\n responseBody: 'none' | 'text' | 'base64';\n maxBodyBytes: number;\n}\n\nexport interface RedactionConfig {\n headers: string[];\n queryParams: string[];\n bodyJsonPaths: string[];\n replacement: string;\n}\n\nexport interface RequestIdConfig {\n header: string;\n generate: boolean;\n}\n\nexport interface RouteConfig {\n normalize: boolean;\n normalizer?: (path: string) => string;\n}\n\nexport interface XrayConfig {\n serviceName: string;\n environment?: string;\n version?: string;\n logger?: Logger;\n logLevel?: LogLevel;\n endpointUrl?: string;\n exporter?: Partial<ExporterConfig>;\n capture?: Partial<CaptureConfig>;\n redaction?: Partial<RedactionConfig>;\n requestId?: Partial<RequestIdConfig>;\n route?: Partial<RouteConfig>;\n}\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: 'none',\n responseBody: 'none',\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: 'x-request-id',\n generate: true,\n};\n\nconst defaultRoute: RouteConfig = {\n normalize: true,\n normalizer: normalizeRoutePattern,\n};\n\nconst DEFAULT_ENDPOINT_URL = 'http://localhost:4318';\n\nconst defaultExporterBase: ExporterConfig = {\n endpointUrl: DEFAULT_ENDPOINT_URL,\n headers: {},\n timeoutMs: 5000,\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\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 ...defaultExporterBase,\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 ?? DEFAULT_ENDPOINT_URL;\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\nfunction 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","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 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 type { Span } from '@opentelemetry/api';\nimport type { CapturedBody } from './types';\nimport {\n AttributeKeyRequestBody,\n AttributeKeyRequestBodyEncoding,\n AttributeKeyRequestBodyTruncated,\n AttributeKeyRequestID,\n AttributeKeyResponseBody,\n AttributeKeyResponseBodyEncoding,\n AttributeKeyResponseBodyTruncated,\n} from './attrkey';\n\nconst attributeKeyEndUserId = 'enduser.id';\nconst attributeKeyHttpRequestBodySize = 'http.request.body.size';\nconst attributeKeyHttpRequestMethod = 'http.request.method';\nconst attributeKeyHttpResponseBodySize = 'http.response.body.size';\nconst attributeKeyHttpResponseStatusCode = 'http.response.status_code';\nconst attributeKeyHttpRoute = 'http.route';\nconst attributeKeyUrlPath = 'url.path';\nconst attributeKeyUrlFull = 'url.full';\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 method: string,\n urlFull: string | undefined,\n): void {\n span.setAttribute(attributeKeyHttpRequestMethod, method);\n if (urlFull) {\n span.setAttribute(attributeKeyUrlFull, urlFull);\n const path = extractPath(urlFull);\n if (path) {\n span.setAttribute(attributeKeyUrlPath, path);\n }\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\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(attributeKeyHttpRequestBodySize, 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(attributeKeyHttpResponseBodySize, size);\n}\n\nexport function setResponseStatusAttribute(span: Span, statusCode: number): void {\n span.setAttribute(attributeKeyHttpResponseStatusCode, statusCode);\n}\n\nexport function setRouteAttribute(span: Span, route: string | undefined): void {\n if (route) {\n span.setAttribute(attributeKeyHttpRoute, route);\n }\n}\n\nexport function setUserIdAttribute(span: Span, userId: string): void {\n span.setAttribute(attributeKeyEndUserId, userId);\n}\n\nexport function setRequestIdAttribute(span: Span, requestId: string): void {\n span.setAttribute(AttributeKeyRequestID, requestId);\n}\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 { ExportResultCode, type ExportResult } from '@opentelemetry/core';\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 { JsonTraceSerializer, ProtobufTraceSerializer } from '@opentelemetry/otlp-transformer';\nimport { AttributeKeySpanDrop } from './attrkey';\nimport type { ResolvedXrayConfig } from './config';\nimport { logWithLevel } from './logger';\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(config: ResolvedXrayConfig): 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 exporter = new FetchSpanExporter({\n endpointUrl: config.exporter.endpointUrl,\n headers: config.exporter.headers ?? {},\n timeoutMillis: config.exporter.timeoutMs,\n logger: config.logger,\n logLevel: config.logLevel,\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\nclass FetchSpanExporter implements SpanExporter {\n private readonly endpointUrl: string;\n private readonly headers: Record<string, string>;\n private readonly timeoutMillis: number;\n private isShutdown: boolean;\n private readonly logger: ResolvedXrayConfig['logger'];\n private readonly logLevel: ResolvedXrayConfig['logLevel'];\n private readonly serializer: {\n serializeRequest: (spans: ReadableSpan[]) => Uint8Array | undefined;\n };\n private readonly contentType: string;\n\n constructor(options: {\n endpointUrl: string;\n headers: Record<string, string>;\n timeoutMillis: number;\n logger: ResolvedXrayConfig['logger'];\n logLevel: ResolvedXrayConfig['logLevel'];\n }) {\n this.endpointUrl = options.endpointUrl;\n this.headers = { ...options.headers };\n this.timeoutMillis = options.timeoutMillis;\n this.isShutdown = false;\n this.logger = options.logger;\n this.logLevel = options.logLevel;\n const protobufSerializer =\n ProtobufTraceSerializer && typeof ProtobufTraceSerializer.serializeRequest === 'function'\n ? ProtobufTraceSerializer\n : null;\n this.serializer = protobufSerializer ?? JsonTraceSerializer;\n this.contentType = protobufSerializer ? 'application/x-protobuf' : 'application/json';\n }\n\n export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void {\n if (this.isShutdown) {\n resultCallback({ code: ExportResultCode.FAILED });\n return;\n }\n\n const payload = this.serializer.serializeRequest(spans);\n if (!payload) {\n logWithLevel(this.logger, 'warn', this.logLevel, 'xray: OTLP export failed', {\n error: 'OTLP export failed: empty payload',\n });\n resultCallback({\n code: ExportResultCode.FAILED,\n error: new Error('OTLP export failed: empty payload'),\n });\n return;\n }\n const headers = {\n ...this.headers,\n 'Content-Type': this.contentType,\n };\n\n const controller = typeof AbortController !== 'undefined' ? new AbortController() : null;\n let timeout: ReturnType<typeof setTimeout> | undefined;\n if (controller) {\n timeout = setTimeout(() => controller.abort(), this.timeoutMillis);\n }\n\n const doExport = async (): Promise<void> => {\n const response = await fetch(this.endpointUrl, {\n method: 'POST',\n headers,\n body: payload as unknown as BodyInit,\n signal: controller?.signal,\n });\n\n if (!response.ok) {\n throw new Error(`OTLP export failed: ${response.status}`);\n }\n };\n\n doExport()\n .then(() => {\n if (timeout) {\n clearTimeout(timeout);\n }\n resultCallback({ code: ExportResultCode.SUCCESS });\n })\n .catch((err) => {\n if (timeout) {\n clearTimeout(timeout);\n }\n logWithLevel(this.logger, 'warn', this.logLevel, 'xray: OTLP export failed', {\n error: err instanceof Error ? err.message : String(err),\n });\n diag.error('OTLP export failed', err);\n resultCallback({ code: ExportResultCode.FAILED, error: err });\n });\n }\n\n async forceFlush(): Promise<void> {\n return;\n }\n\n async shutdown(): Promise<void> {\n this.isShutdown = true;\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","/**\n * Generates a UUIDv7 string.\n * Uses crypto.getRandomValues which is available in all modern JS runtimes\n * (browsers, Node.js 15+, Deno, Bun, Cloudflare Workers, Vercel Edge, etc.)\n */\nexport function uuidv7(): string {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n\n // Encode timestamp in first 48 bits\n const timestamp = BigInt(Date.now());\n bytes[0] = Number((timestamp >> 40n) & 0xffn);\n bytes[1] = Number((timestamp >> 32n) & 0xffn);\n bytes[2] = Number((timestamp >> 24n) & 0xffn);\n bytes[3] = Number((timestamp >> 16n) & 0xffn);\n bytes[4] = Number((timestamp >> 8n) & 0xffn);\n bytes[5] = Number(timestamp & 0xffn);\n\n // Set version (7) and variant (RFC 4122)\n const byte6 = bytes[6] ?? 0;\n const byte8 = bytes[8] ?? 0;\n bytes[6] = (byte6 & 0x0f) | 0x70;\n bytes[8] = (byte8 & 0x3f) | 0x80;\n\n // Format as UUID string\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, '0'));\n return `${hex.slice(0, 4).join('')}-${hex.slice(4, 6).join('')}-${hex.slice(6, 8).join('')}-${hex.slice(8, 10).join('')}-${hex.slice(10).join('')}`;\n}\n","import type { XrayConfig, ResolvedXrayConfig, CaptureConfig, RedactionConfig } from './config';\nimport { normalizeConfig } from './config';\nimport { logWithLevel } from './logger';\nimport { applyRedaction } 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 setUserIdAttribute,\n} from './attributes';\nimport {\n createTracerProvider,\n spanFromTracer,\n spanStatusFromError,\n tracerFromProvider,\n} from './otel';\nimport { normalizeRoutePattern } from './route';\nimport { uuidv7 } 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\nexport function createEmitter(config: XrayConfig): XrayEmitter {\n const resolved = normalizeConfig(config);\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);\n const tracer = tracerFromProvider(tracerProvider);\n\n return {\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\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 requestId = resolveRequestId(config, req.requestId, req.headers);\n req.requestId = requestId;\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,\n traceId: span?.spanContext().traceId,\n spanId: span?.spanContext().spanId,\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 {\n // Ignore span attribute errors.\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 fallbackLog: RequestLog = {\n requestId: ctx.requestId,\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 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: request.requestId ?? ctx.requestId,\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 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 setRequestAttributes(span, request.method, redacted.url);\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.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 resolveRequestId(\n config: ResolvedXrayConfig,\n requestId: string | undefined,\n headers: Record<string, string | string[]>,\n): string {\n if (requestId) {\n return requestId;\n }\n const headerName = config.requestId.header.toLowerCase();\n const headerValue = headers[headerName];\n if (headerValue) {\n const value = Array.isArray(headerValue) ? headerValue[0] : headerValue;\n if (value && value.trim()) {\n return value.trim();\n }\n }\n if (!config.requestId.generate) {\n return uuidv7();\n }\n return uuidv7();\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"],"mappings":"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","names":["state"]}
1
+ {"version":3,"sources":["../src/route.ts","../src/config.ts","../src/header_redaction.ts","../src/redaction.ts","../src/attributes.ts","../src/attrkey.ts","../src/otel.ts","../src/uuid.ts","../src/emitter.ts"],"sourcesContent":["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\nexport interface ExporterConfig {\n endpointUrl: string;\n headers?: Record<string, string>;\n timeoutMs: number;\n spanProcessor: 'simple' | 'batch';\n}\n\nexport interface CaptureConfig {\n requestHeaders: boolean;\n responseHeaders: boolean;\n requestBody: 'none' | 'text' | 'base64';\n responseBody: 'none' | 'text' | 'base64';\n maxBodyBytes: number;\n}\n\nexport interface RedactionConfig {\n headers: string[];\n queryParams: string[];\n bodyJsonPaths: string[];\n replacement: string;\n}\n\nexport interface RequestIdConfig {\n header: string;\n generate: boolean;\n}\n\nexport interface RouteConfig {\n normalize: boolean;\n normalizer?: (path: string) => string;\n}\n\nexport interface XrayConfig {\n serviceName: string;\n environment?: string;\n version?: string;\n logger?: Logger;\n logLevel?: LogLevel;\n endpointUrl?: string;\n exporter?: Partial<ExporterConfig>;\n capture?: Partial<CaptureConfig>;\n redaction?: Partial<RedactionConfig>;\n requestId?: Partial<RequestIdConfig>;\n route?: Partial<RouteConfig>;\n}\n\nexport type XrayRuntimeConfig = Omit<XrayConfig, 'exporter'> & {\n exporter?: Partial<ExporterConfig> & {\n instance?: import('@opentelemetry/sdk-trace-base').SpanExporter;\n };\n};\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: 'none',\n responseBody: 'none',\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: 'x-request-id',\n generate: true,\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\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\nfunction 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_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} 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 method: string,\n urlFull: string | undefined,\n): void {\n span.setAttribute(ATTR_HTTP_REQUEST_METHOD, method);\n if (urlFull) {\n span.setAttribute(ATTR_URL_FULL, urlFull);\n const path = extractPath(urlFull);\n if (path) {\n span.setAttribute(ATTR_URL_PATH, path);\n }\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\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 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 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","/**\n * Generates a UUIDv7 string.\n * Uses crypto.getRandomValues which is available in all modern JS runtimes\n * (browsers, Node.js 15+, Deno, Bun, Cloudflare Workers, Vercel Edge, etc.)\n */\nexport function uuidv7(): string {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n\n // Encode timestamp in first 48 bits\n const timestamp = BigInt(Date.now());\n bytes[0] = Number((timestamp >> 40n) & 0xffn);\n bytes[1] = Number((timestamp >> 32n) & 0xffn);\n bytes[2] = Number((timestamp >> 24n) & 0xffn);\n bytes[3] = Number((timestamp >> 16n) & 0xffn);\n bytes[4] = Number((timestamp >> 8n) & 0xffn);\n bytes[5] = Number(timestamp & 0xffn);\n\n // Set version (7) and variant (RFC 4122)\n const byte6 = bytes[6] ?? 0;\n const byte8 = bytes[8] ?? 0;\n bytes[6] = (byte6 & 0x0f) | 0x70;\n bytes[8] = (byte8 & 0x3f) | 0x80;\n\n // Format as UUID string\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, '0'));\n return `${hex.slice(0, 4).join('')}-${hex.slice(4, 6).join('')}-${hex.slice(6, 8).join('')}-${hex.slice(8, 10).join('')}-${hex.slice(10).join('')}`;\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 } 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 setUserIdAttribute,\n} from './attributes';\nimport {\n createTracerProvider,\n spanFromTracer,\n spanStatusFromError,\n tracerFromProvider,\n} from './otel';\nimport { normalizeRoutePattern } from './route';\nimport { uuidv7 } 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\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 return {\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\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 requestId = resolveRequestId(config, req.requestId, req.headers);\n req.requestId = requestId;\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,\n traceId: span?.spanContext().traceId,\n spanId: span?.spanContext().spanId,\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 {\n // Ignore span attribute errors.\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 fallbackLog: RequestLog = {\n requestId: ctx.requestId,\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 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: request.requestId ?? ctx.requestId,\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 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 setRequestAttributes(span, request.method, redacted.url);\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.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 resolveRequestId(\n config: ResolvedXrayConfig,\n requestId: string | undefined,\n headers: Record<string, string | string[]>,\n): string {\n if (requestId) {\n return requestId;\n }\n const headerName = config.requestId.header.toLowerCase();\n const headerValue = headers[headerName];\n if (headerValue) {\n const value = Array.isArray(headerValue) ? headerValue[0] : headerValue;\n if (value && value.trim()) {\n return value.trim();\n }\n }\n if (!config.requestId.generate) {\n return uuidv7();\n }\n return uuidv7();\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"],"mappings":"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","names":["state"]}
@@ -1,4 +1,5 @@
1
- import { C as CapturedBody, b as Logger, L as LogLevel, d as XrayContext, e as CaptureConfig, f as RedactionConfig } from './types-f9NNWwCi.cjs';
1
+ import { C as CapturedBody, b as Logger, L as LogLevel, d as XrayContext, e as CaptureConfig, f as RedactionConfig } from './types-BA4cE85r.cjs';
2
+ import '@opentelemetry/sdk-trace-base';
2
3
 
3
4
  declare function makeCapturedBody(bytes: Uint8Array | undefined, totalBytes: number, truncated: boolean, mode: 'text' | 'base64'): CapturedBody | undefined;
4
5
 
@@ -1,4 +1,5 @@
1
- import { C as CapturedBody, b as Logger, L as LogLevel, d as XrayContext, e as CaptureConfig, f as RedactionConfig } from './types-f9NNWwCi.js';
1
+ import { C as CapturedBody, b as Logger, L as LogLevel, d as XrayContext, e as CaptureConfig, f as RedactionConfig } from './types-BA4cE85r.js';
2
+ import '@opentelemetry/sdk-trace-base';
2
3
 
3
4
  declare function makeCapturedBody(bytes: Uint8Array | undefined, totalBytes: number, truncated: boolean, mode: 'text' | 'base64'): CapturedBody | undefined;
4
5