@stainlessdev/xray-core 0.7.0 → 0.8.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.cjs CHANGED
@@ -141,8 +141,8 @@ function extractParamName(value) {
141
141
  var defaultCapture = {
142
142
  requestHeaders: true,
143
143
  responseHeaders: true,
144
- requestBody: "none",
145
- responseBody: "none",
144
+ requestBody: "text",
145
+ responseBody: "text",
146
146
  maxBodyBytes: 65536
147
147
  };
148
148
  var defaultRedaction = {
@@ -1061,7 +1061,7 @@ function createSpanProcessor(mode, exporter) {
1061
1061
  }
1062
1062
  function sdkVersion() {
1063
1063
  if (true) {
1064
- return "0.6.0";
1064
+ return "0.7.0";
1065
1065
  }
1066
1066
  return "unknown";
1067
1067
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/encoding.ts","../src/route.ts","../src/config.ts","../src/logger.ts","../src/header_redaction.ts","../src/redaction.ts","../src/request_log.ts","../src/attributes.ts","../src/attrkey.ts","../src/otel.ts","../src/uuid/base48.ts","../src/uuid/base62.ts","../src/uuid/index.ts","../src/state.ts","../src/emitter.ts"],"sourcesContent":["export type {\n AttributeValue,\n CapturedBody,\n LogLevel,\n Logger,\n NormalizedRequest,\n NormalizedResponse,\n RequestLog,\n XrayContext,\n XrayEmitter,\n} from './types';\nexport type {\n CaptureConfig,\n ExporterConfig,\n RedactionConfig,\n RequestIdConfig,\n ResolvedXrayConfig,\n RouteConfig,\n XrayConfig,\n XrayRuntimeConfig,\n} from './config';\nexport { XrayConfigError, normalizeConfig } from './config';\nexport { createEmitter } from './emitter';\n","const utf8Decoder =\n typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { fatal: true }) : null;\nconst utf8DecoderLenient = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8') : null;\nconst maybeBuffer = (\n globalThis as typeof globalThis & {\n Buffer?: { from(data: Uint8Array): { toString(encoding?: string): string } };\n }\n).Buffer;\n\nexport function encodeBase64(bytes: Uint8Array): string {\n if (maybeBuffer) {\n return maybeBuffer.from(bytes).toString('base64');\n }\n let binary = '';\n for (let i = 0; i < bytes.length; i += 1) {\n const byte = bytes[i];\n if (byte === undefined) {\n continue;\n }\n binary += String.fromCharCode(byte);\n }\n if (typeof btoa !== 'undefined') {\n return btoa(binary);\n }\n return '';\n}\n\nexport function isValidUtf8(bytes: Uint8Array): boolean {\n if (!utf8Decoder) {\n return false;\n }\n try {\n utf8Decoder.decode(bytes);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function decodeUtf8(bytes: Uint8Array): string {\n if (utf8DecoderLenient) {\n return utf8DecoderLenient.decode(bytes);\n }\n if (maybeBuffer) {\n return maybeBuffer.from(bytes).toString('utf8');\n }\n return '';\n}\n","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 /**\n * Response header name to read request IDs from. This is normalized to\n * lowercase during configuration.\n */\n header: string;\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 /**\n * Request ID resolution settings. The header is read from response headers at\n * the end of the request.\n */\n requestId?: Partial<RequestIdConfig>;\n 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: 'request-id',\n};\n\nconst defaultRoute: RouteConfig = {\n normalize: true,\n normalizer: normalizeRoutePattern,\n};\n\nconst defaultExporterBase: Omit<ExporterConfig, 'endpointUrl'> = {\n headers: {},\n timeoutMs: 30000,\n spanProcessor: 'batch',\n};\n\nexport class XrayConfigError extends Error {\n code: 'INVALID_CONFIG' | 'INVALID_REDACTION';\n\n constructor(code: XrayConfigError['code'], message: string) {\n super(message);\n this.code = code;\n }\n}\n\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","import type { Logger, LogLevel } from './types';\n\nconst logLevelOrder: Record<LogLevel, number> = {\n debug: 10,\n info: 20,\n warn: 30,\n error: 40,\n};\n\nexport function logWithLevel(\n logger: Logger,\n level: LogLevel,\n threshold: LogLevel,\n message: string,\n fields?: Record<string, unknown>,\n): void {\n if (logLevelOrder[level] < logLevelOrder[threshold]) {\n return;\n }\n\n const fn =\n logger[level] ?? logger.warn ?? logger.info ?? logger.debug ?? logger.error ?? console.log;\n\n try {\n fn.call(logger, message, fields);\n } catch {\n // Logging should never disrupt instrumentation.\n }\n}\n","const headerNameCompactor = /[-_.]/g;\nconst headerTokenSplitter = /[-_.]/;\n\ntype HeaderRedactionMatcher = {\n exactSensitive: Set<string>;\n keywordTokens: Set<string>;\n keywordCompacted: string[];\n};\n\nconst defaultHeaderMatcher = newHeaderRedactionMatcher(\n defaultSensitiveHeaderNames(),\n defaultSensitiveKeywords(),\n);\n\nexport function authSchemePrefix(value: string): string {\n if (!value) {\n return '';\n }\n\n const lower = value.toLowerCase();\n if (lower.startsWith('basic')) {\n return value.slice(0, 'basic'.length);\n }\n if (lower.startsWith('bearer')) {\n return value.slice(0, 'bearer'.length);\n }\n if (lower.startsWith('digest')) {\n return value.slice(0, 'digest'.length);\n }\n if (lower.startsWith('negotiate')) {\n return value.slice(0, 'negotiate'.length);\n }\n return '';\n}\n\nexport function redactCookieValue(value: string, replacement: string): string {\n if (!value) {\n return replacement;\n }\n\n const parts = value.split(';');\n const redacted: string[] = [];\n\n for (const part of parts) {\n const segment = part.trim();\n if (!segment) {\n redacted.push(replacement);\n continue;\n }\n const idx = segment.indexOf('=');\n if (idx <= 0) {\n redacted.push(replacement);\n continue;\n }\n const name = segment.slice(0, idx);\n if (!name) {\n redacted.push(replacement);\n continue;\n }\n redacted.push(`${name}=${replacement}`);\n }\n\n return redacted.join('; ');\n}\n\nexport function redactSetCookieValue(value: string, replacement: string): string {\n if (!value) {\n return replacement;\n }\n\n const parts = value.split(';');\n const first = parts.shift() ?? '';\n const idx = first.indexOf('=');\n if (idx <= 0) {\n return replacement;\n }\n const name = first.slice(0, idx);\n if (!name) {\n return replacement;\n }\n\n const redacted = `${name}=${replacement}`;\n if (parts.length === 0) {\n return redacted;\n }\n return `${redacted};${parts.join(';')}`;\n}\n\nexport function isSensitiveHeaderName(key: string): boolean {\n return isSensitiveNormalized(defaultHeaderMatcher, normalizeHeaderName(key));\n}\n\nfunction addSensitiveHeaderNames(target: Set<string>, headers: string[]): void {\n for (const header of headers) {\n const normalized = normalizeHeaderName(header);\n if (normalized) {\n target.add(normalized);\n }\n }\n}\n\nfunction buildKeywordSets(keywords: string[]): { compacted: string[]; tokens: Set<string> } {\n const tokens = new Set<string>();\n const compacted = new Set<string>();\n\n for (const keyword of keywords) {\n const normalized = normalizeHeaderName(keyword);\n if (!normalized) {\n continue;\n }\n const compactedKeyword = compactNormalizedHeaderName(normalized);\n if (compactedKeyword) {\n compacted.add(compactedKeyword);\n }\n if (!normalized.includes('-') && !normalized.includes('_') && !normalized.includes('.')) {\n tokens.add(normalized);\n }\n }\n\n return {\n compacted: Array.from(compacted).sort(),\n tokens,\n };\n}\n\nfunction compactNormalizedHeaderName(normalized: string): string {\n if (!normalized) {\n return '';\n }\n return normalized.replace(headerNameCompactor, '');\n}\n\nfunction defaultSensitiveHeaderNames(): string[] {\n return [\n 'authorization',\n 'cookie',\n 'proxy-authenticate',\n 'proxy-authorization',\n 'set-cookie',\n 'www-authenticate',\n ];\n}\n\nfunction defaultSensitiveKeywords(): string[] {\n return [\n 'api-key',\n 'api_key',\n 'apikey',\n 'auth',\n 'authenticate',\n 'authorization',\n 'credential',\n 'password',\n 'passwd',\n 'private-key',\n 'private_key',\n 'privatekey',\n 'secret',\n 'session',\n 'sessionid',\n 'signature',\n 'token',\n ];\n}\n\nfunction headerNameTokens(name: string): string[] {\n if (!name) {\n return [];\n }\n return name.split(headerTokenSplitter).filter(Boolean);\n}\n\nfunction hasKeywordToken(tokens: string[], keywordTokens: Set<string>): boolean {\n for (const token of tokens) {\n if (keywordTokens.has(token)) {\n return true;\n }\n }\n return false;\n}\n\nfunction isExactMatch(normalized: string, exactSensitive: Set<string>): boolean {\n return exactSensitive.has(normalized);\n}\n\nfunction isSensitiveNormalized(matcher: HeaderRedactionMatcher, normalized: string): boolean {\n if (!normalized) {\n return false;\n }\n if (isExactMatch(normalized, matcher.exactSensitive)) {\n return true;\n }\n if (hasKeywordToken(headerNameTokens(normalized), matcher.keywordTokens)) {\n return true;\n }\n return matchesCompacted(normalized, matcher.keywordCompacted);\n}\n\nfunction matchesCompacted(normalized: string, keywordCompacted: string[]): boolean {\n if (keywordCompacted.length === 0) {\n return false;\n }\n const compacted = compactNormalizedHeaderName(normalized);\n if (!compacted) {\n return false;\n }\n return keywordCompacted.some((keyword) => compacted.includes(keyword));\n}\n\nfunction newHeaderRedactionMatcher(names: string[], keywords: string[]): HeaderRedactionMatcher {\n const exactSensitive = new Set<string>();\n addSensitiveHeaderNames(exactSensitive, names);\n const { compacted, tokens } = buildKeywordSets(keywords);\n return {\n exactSensitive,\n keywordCompacted: compacted,\n keywordTokens: tokens,\n };\n}\n\nfunction normalizeHeaderName(name: string): string {\n return name.trim().toLowerCase();\n}\n","import type { CapturedBody, RequestLog } from './types';\nimport { authSchemePrefix, redactCookieValue, redactSetCookieValue } from './header_redaction';\n\nexport function applyRedaction(\n config: {\n headers: string[];\n queryParams: string[];\n bodyJsonPaths: string[];\n replacement: string;\n },\n log: RequestLog,\n): RequestLog {\n const redacted = { ...log };\n\n if (redacted.requestHeaders) {\n redacted.requestHeaders = redactHeaders(redacted.requestHeaders, config);\n }\n if (redacted.responseHeaders) {\n redacted.responseHeaders = redactHeaders(redacted.responseHeaders, config);\n }\n\n redacted.url = redactUrl(redacted.url, config);\n\n if (redacted.requestBody) {\n redacted.requestBody = redactBody(redacted.requestBody, redacted.requestHeaders, config);\n }\n if (redacted.responseBody) {\n redacted.responseBody = redactBody(redacted.responseBody, redacted.responseHeaders, config);\n }\n\n return redacted;\n}\n\nexport function redactHeaders(\n headers: Record<string, string | string[]>,\n config: { headers: string[]; replacement: string },\n): Record<string, string | string[]> {\n const list = new Set(config.headers.map((name) => name.toLowerCase()));\n const result: Record<string, string | string[]> = {};\n\n for (const [name, value] of Object.entries(headers)) {\n const lower = name.toLowerCase();\n if (!list.has(lower)) {\n result[name] = value;\n continue;\n }\n\n const redactValue = (entry: string) => redactHeaderValue(lower, entry, config.replacement);\n if (Array.isArray(value)) {\n result[name] = value.map(redactValue);\n } else {\n result[name] = redactValue(value);\n }\n }\n\n return result;\n}\n\nfunction redactHeaderValue(name: string, value: string, replacement: string): string {\n switch (name) {\n case 'authorization':\n case 'proxy-authorization': {\n const scheme = authSchemePrefix(value);\n if (!scheme) {\n return replacement;\n }\n return `${scheme} ${replacement}`;\n }\n case 'cookie':\n return redactCookieValue(value, replacement);\n case 'set-cookie':\n return redactSetCookieValue(value, replacement);\n default:\n return replacement;\n }\n}\n\nfunction redactUrl(value: string, config: { queryParams: string[]; replacement: string }): string {\n if (!value || config.queryParams.length === 0) {\n return value;\n }\n\n try {\n const parsed = new URL(value);\n const params = parsed.searchParams;\n if (!params || params.size === 0) {\n return value;\n }\n\n const redact = new Set(config.queryParams.map((key) => key.toLowerCase()));\n const next = new URLSearchParams();\n params.forEach((val, key) => {\n if (redact.has(key.toLowerCase())) {\n next.append(key, config.replacement);\n } else {\n next.append(key, val);\n }\n });\n parsed.search = next.toString();\n return parsed.toString();\n } catch {\n return value;\n }\n}\n\nfunction redactBody(\n body: CapturedBody,\n headers: Record<string, string | string[]> | undefined,\n config: { bodyJsonPaths: string[]; replacement: string },\n): CapturedBody {\n if (config.bodyJsonPaths.length === 0) {\n return body;\n }\n if (!body.value || body.encoding !== 'utf8') {\n return body;\n }\n if (!isJsonContentType(headers)) {\n return body;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(body.value);\n } catch {\n return body;\n }\n\n for (const path of config.bodyJsonPaths) {\n const segments = parseJsonPath(path);\n if (!segments) {\n continue;\n }\n redactJsonPath(parsed, segments, config.replacement);\n }\n\n const next = { ...body };\n next.value = JSON.stringify(parsed);\n return next;\n}\n\nfunction isJsonContentType(headers?: Record<string, string | string[]>): boolean {\n if (!headers) {\n return false;\n }\n const contentType = headers['content-type'] || headers['Content-Type'];\n const value = Array.isArray(contentType) ? contentType[0] : contentType;\n if (!value) {\n return false;\n }\n const normalized = value.split(';')[0];\n if (!normalized) {\n return false;\n }\n const trimmed = normalized.trim().toLowerCase();\n return trimmed === 'application/json' || trimmed.endsWith('+json');\n}\n\ntype JsonPathSegment = string | number;\n\nfunction parseJsonPath(path: string): JsonPathSegment[] | null {\n const trimmed = path.trim();\n if (!trimmed) {\n return null;\n }\n\n const normalized = trimmed.startsWith('$.') ? trimmed.slice(2) : trimmed;\n if (!normalized) {\n return null;\n }\n\n const segments: JsonPathSegment[] = [];\n const parts = normalized.split('.');\n for (const part of parts) {\n if (!part) {\n continue;\n }\n let cursor = part;\n const bracketIndex = cursor.indexOf('[');\n if (bracketIndex === -1) {\n segments.push(cursor);\n continue;\n }\n\n const name = cursor.slice(0, bracketIndex);\n if (name) {\n segments.push(name);\n }\n cursor = cursor.slice(bracketIndex);\n const matches = cursor.match(/\\[(\\d+)\\]/g);\n if (!matches) {\n continue;\n }\n for (const match of matches) {\n const indexValue = match.slice(1, -1);\n const index = Number.parseInt(indexValue, 10);\n if (Number.isFinite(index)) {\n segments.push(index);\n }\n }\n }\n\n return segments.length > 0 ? segments : null;\n}\n\nfunction redactJsonPath(value: unknown, segments: JsonPathSegment[], replacement: string): void {\n if (!value || segments.length === 0) {\n return;\n }\n\n let current: unknown = value;\n for (let i = 0; i < segments.length; i += 1) {\n const segment = segments[i];\n if (segment === undefined) {\n return;\n }\n const isLast = i === segments.length - 1;\n\n if (typeof segment === 'number') {\n if (!Array.isArray(current) || segment < 0 || segment >= current.length) {\n return;\n }\n if (isLast) {\n current[segment] = replacement;\n return;\n }\n current = current[segment];\n continue;\n }\n\n if (!current || typeof current !== 'object') {\n return;\n }\n const record = current as Record<string, unknown>;\n if (!(segment in record)) {\n return;\n }\n if (isLast) {\n record[segment] = replacement;\n return;\n }\n current = record[segment];\n }\n}\n","import type { CapturedBody } from './types';\nimport { decodeUtf8, encodeBase64, isValidUtf8 } from './encoding';\n\n// eslint-disable-next-line no-control-regex\nconst controlChars = /[\\x00-\\x1F\\x7F]/g;\n\nexport function sanitizeLogString(value: string): string {\n if (!value) {\n return value;\n }\n return value.replace(controlChars, '');\n}\n\nexport function sanitizeHeaderValues(\n headers: Record<string, string | string[]> | undefined,\n): Record<string, string | string[]> | undefined {\n if (!headers) {\n return undefined;\n }\n\n const sanitized: Record<string, string | string[]> = {};\n for (const [key, value] of Object.entries(headers)) {\n const name = sanitizeLogString(key);\n if (Array.isArray(value)) {\n sanitized[name] = value.map((entry) => sanitizeLogString(entry));\n } else {\n sanitized[name] = sanitizeLogString(value);\n }\n }\n return sanitized;\n}\n\nexport function makeCapturedBody(\n bytes: Uint8Array | undefined,\n totalBytes: number,\n truncated: boolean,\n mode: 'text' | 'base64',\n): CapturedBody | undefined {\n if (!bytes) {\n return undefined;\n }\n\n if (mode === 'base64') {\n return {\n bytes: totalBytes,\n encoding: 'base64',\n truncated,\n value: encodeBase64(bytes),\n };\n }\n\n if (isValidUtf8(bytes)) {\n return {\n bytes: totalBytes,\n encoding: 'utf8',\n truncated,\n value: decodeUtf8(bytes),\n };\n }\n\n return {\n bytes: totalBytes,\n encoding: 'base64',\n truncated,\n value: encodeBase64(bytes),\n };\n}\n","import type { Span } from '@opentelemetry/api';\nimport {\n ATTR_CLIENT_ADDRESS,\n ATTR_HTTP_REQUEST_BODY_SIZE,\n ATTR_HTTP_REQUEST_METHOD,\n ATTR_HTTP_RESPONSE_BODY_SIZE,\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_HTTP_ROUTE,\n ATTR_URL_FULL,\n ATTR_URL_PATH,\n ATTR_USER_ID,\n} from '@opentelemetry/semantic-conventions/incubating';\nimport type { CapturedBody } from './types';\nimport {\n AttributeKeyRequestBody,\n AttributeKeyRequestBodyEncoding,\n AttributeKeyRequestBodyTruncated,\n AttributeKeyRequestID,\n AttributeKeyResponseBody,\n AttributeKeyResponseBodyEncoding,\n AttributeKeyResponseBodyTruncated,\n} from './attrkey';\n\nexport function setHeaderAttributes(\n span: Span,\n headers: Record<string, string | string[]> | undefined,\n prefix: string,\n): void {\n if (!headers) {\n return;\n }\n const keys = Object.keys(headers).sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()));\n for (const key of keys) {\n const values = headers[key];\n if (!values || (Array.isArray(values) && values.length === 0)) {\n continue;\n }\n span.setAttribute(prefix + key.toLowerCase(), Array.isArray(values) ? values : [values]);\n }\n}\n\nexport function setRequestAttributes(\n span: Span,\n request: {\n method: string;\n url?: string;\n headers?: Record<string, string | string[]>;\n remoteAddress?: string;\n redactionReplacement?: string;\n },\n urlFull: string | undefined,\n): void {\n span.setAttribute(ATTR_HTTP_REQUEST_METHOD, request.method);\n const effectiveUrl = urlFull ?? request.url;\n if (effectiveUrl) {\n span.setAttribute(ATTR_URL_FULL, effectiveUrl);\n const path = extractPath(effectiveUrl);\n if (path) {\n span.setAttribute(ATTR_URL_PATH, path);\n }\n }\n const clientAddress = clientAddressForRequest(\n request.headers,\n request.remoteAddress,\n request.redactionReplacement,\n );\n if (clientAddress) {\n span.setAttribute(ATTR_CLIENT_ADDRESS, clientAddress);\n }\n}\n\nfunction extractPath(url: string): string | undefined {\n try {\n return new URL(url).pathname;\n } catch {\n // If not a full URL, try to extract path directly\n const match = url.match(/^[^?#]*/);\n return match?.[0] || undefined;\n }\n}\n\nfunction clientAddressForRequest(\n headers?: Record<string, string | string[]>,\n remoteAddress?: string,\n redactionReplacement?: string,\n): string | undefined {\n const forwarded = forwardedClientAddress(\n headerValues(headers, 'forwarded'),\n redactionReplacement,\n );\n if (forwarded) {\n return forwarded;\n }\n const xForwarded = xForwardedForClientAddress(\n headerValues(headers, 'x-forwarded-for'),\n redactionReplacement,\n );\n if (xForwarded) {\n return xForwarded;\n }\n const xRealIp = xRealIpClientAddress(headerValues(headers, 'x-real-ip'), redactionReplacement);\n if (xRealIp) {\n return xRealIp;\n }\n if (!remoteAddress) {\n return undefined;\n }\n return remoteAddrHost(remoteAddress);\n}\n\nfunction forwardedClientAddress(\n values: string[],\n redactionReplacement?: string,\n): string | undefined {\n for (const value of values) {\n if (!value) {\n continue;\n }\n const entries = value.split(',');\n for (const entry of entries) {\n const params = entry.split(';');\n for (const param of params) {\n const [rawKey, ...rest] = param.split('=');\n if (!rawKey) {\n continue;\n }\n if (rawKey.trim().toLowerCase() !== 'for') {\n continue;\n }\n const rawValue = rest.join('=').trim();\n const normalized = normalizeKnownAddress(rawValue, redactionReplacement);\n if (normalized) {\n return normalized;\n }\n }\n }\n }\n return undefined;\n}\n\nfunction xForwardedForClientAddress(\n values: string[],\n redactionReplacement?: string,\n): string | undefined {\n for (const value of values) {\n if (!value) {\n continue;\n }\n const entries = value.split(',');\n for (const entry of entries) {\n const normalized = normalizeKnownAddress(entry, redactionReplacement);\n if (normalized) {\n return normalized;\n }\n }\n }\n return undefined;\n}\n\nfunction xRealIpClientAddress(values: string[], redactionReplacement?: string): string | undefined {\n for (const value of values) {\n if (!value) {\n continue;\n }\n const normalized = normalizeKnownAddress(value, redactionReplacement);\n if (normalized) {\n return normalized;\n }\n }\n return undefined;\n}\n\nfunction normalizeKnownAddress(value: string, redactionReplacement?: string): string | undefined {\n const normalized = normalizeAddress(value, redactionReplacement);\n if (!normalized) {\n return undefined;\n }\n if (normalized.toLowerCase() === 'unknown') {\n return undefined;\n }\n return normalized;\n}\n\nfunction normalizeAddress(value: string, redactionReplacement?: string): string | undefined {\n if (!value) {\n return undefined;\n }\n let trimmed = value.trim();\n if (!trimmed) {\n return undefined;\n }\n if (redactionReplacement && trimmed === redactionReplacement) {\n return undefined;\n }\n if (trimmed.startsWith('\"') && trimmed.endsWith('\"') && trimmed.length > 1) {\n trimmed = trimmed.slice(1, -1).trim();\n }\n if (!trimmed) {\n return undefined;\n }\n if (trimmed.startsWith('[')) {\n const end = trimmed.indexOf(']');\n if (end !== -1) {\n return trimmed.slice(1, end);\n }\n }\n // If there's exactly one colon, treat it as host:port. More than one likely means IPv6.\n const colonCount = (trimmed.match(/:/g) ?? []).length;\n if (colonCount === 1) {\n const host = trimmed.split(':')[0];\n return host || undefined;\n }\n return trimmed;\n}\n\nfunction remoteAddrHost(value: string): string | undefined {\n return normalizeAddress(value);\n}\n\nfunction headerValues(\n headers: Record<string, string | string[]> | undefined,\n name: string,\n): string[] {\n if (!headers) {\n return [];\n }\n const target = name.toLowerCase();\n const values: string[] = [];\n for (const [key, value] of Object.entries(headers)) {\n if (key.toLowerCase() !== target) {\n continue;\n }\n if (Array.isArray(value)) {\n values.push(...value);\n } else {\n values.push(value);\n }\n }\n return values;\n}\n\nexport function setRequestBodyAttributes(span: Span, body: CapturedBody): void {\n if (!body.value) {\n return;\n }\n span.setAttribute(AttributeKeyRequestBody, body.value);\n span.setAttribute(AttributeKeyRequestBodyEncoding, body.encoding);\n if (body.truncated) {\n span.setAttribute(AttributeKeyRequestBodyTruncated, true);\n }\n}\n\nexport function setRequestBodySizeAttribute(span: Span, size: number): void {\n span.setAttribute(ATTR_HTTP_REQUEST_BODY_SIZE, size);\n}\n\nexport function setResponseBodyAttributes(span: Span, body: CapturedBody): void {\n if (!body.value) {\n return;\n }\n span.setAttribute(AttributeKeyResponseBody, body.value);\n span.setAttribute(AttributeKeyResponseBodyEncoding, body.encoding);\n if (body.truncated) {\n span.setAttribute(AttributeKeyResponseBodyTruncated, true);\n }\n}\n\nexport function setResponseBodySizeAttribute(span: Span, size: number): void {\n span.setAttribute(ATTR_HTTP_RESPONSE_BODY_SIZE, size);\n}\n\nexport function setResponseStatusAttribute(span: Span, statusCode: number): void {\n span.setAttribute(ATTR_HTTP_RESPONSE_STATUS_CODE, statusCode);\n}\n\nexport function setRouteAttribute(span: Span, route: string | undefined): void {\n if (route) {\n span.setAttribute(ATTR_HTTP_ROUTE, route);\n }\n}\n\nexport function setUserIdAttribute(span: Span, userId: string): void {\n span.setAttribute(ATTR_USER_ID, userId);\n}\n\nexport function 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 * Base48 encoding with a vowel-free alphabet to reduce the risk of generating\n * profanity-like substrings in time-ordered identifiers while staying compact.\n * Digits that are commonly read as vowels (0, 1, 3, 4) are excluded to avoid\n * leetspeak-style false positives. The alphabet is ordered by ASCII to preserve\n * lexicographic ordering of fixed-length encodings.\n */\nconst base48AlphabetLex = '256789BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz';\nconst base48Zero = base48AlphabetLex.charAt(0);\nconst base48Regex = /^[256789BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz]*$/;\n\nconst maxChunkBytes = 32;\nconst chunkToEncodedLength = new Map<number, number>();\nconst encodedLengthToChunk = new Map<number, number>();\n\nfor (let size = 1; size <= maxChunkBytes; size += 1) {\n const encodedLength = Math.ceil((size * 8) / Math.log2(48));\n chunkToEncodedLength.set(size, encodedLength);\n encodedLengthToChunk.set(encodedLength, size);\n}\n\nconst maxEncodedChunk = chunkToEncodedLength.get(maxChunkBytes)!;\n\nfunction encodeChunk(bytes: Uint8Array, size: number): string {\n let value = 0n;\n for (const byte of bytes) {\n value = (value << 8n) | BigInt(byte);\n }\n\n let encoded = '';\n if (value === 0n) {\n encoded = base48Zero;\n } else {\n while (value > 0n) {\n const mod = value % 48n;\n encoded = base48AlphabetLex[Number(mod)] + encoded;\n value /= 48n;\n }\n }\n\n const targetLength = chunkToEncodedLength.get(size);\n if (!targetLength) {\n throw new Error(`base48: unsupported chunk size ${size}`);\n }\n return encoded.padStart(targetLength, base48Zero);\n}\n\nfunction decodeChunk(value: string, size: number): Uint8Array {\n let n = 0n;\n for (const char of value) {\n const index = base48AlphabetLex.indexOf(char);\n if (index === -1) {\n throw new Error('base48: invalid character');\n }\n n = n * 48n + BigInt(index);\n }\n\n const maxValue = 2n ** BigInt(size * 8) - 1n;\n if (n > maxValue) {\n throw new Error('base48: invalid length');\n }\n\n const buffer = new Uint8Array(size);\n for (let i = size - 1; i >= 0; i -= 1) {\n buffer[i] = Number(n & 0xffn);\n n >>= 8n;\n }\n return buffer;\n}\n\nexport function encodeBase48Lex(buffer: Uint8Array): string {\n if (buffer.length === 0) {\n return '';\n }\n\n let result = '';\n for (let offset = 0; offset < buffer.length; ) {\n const remaining = buffer.length - offset;\n const size = remaining >= maxChunkBytes ? maxChunkBytes : remaining;\n result += encodeChunk(buffer.slice(offset, offset + size), size);\n offset += size;\n }\n return result;\n}\n\nexport function decodeBase48Lex(value: string): Uint8Array {\n if (!value) {\n return new Uint8Array();\n }\n if (!base48Regex.test(value)) {\n throw new Error('base48: invalid string');\n }\n\n let totalBytes = 0;\n for (let offset = 0; offset < value.length; ) {\n const remaining = value.length - offset;\n const chunkLength = remaining >= maxEncodedChunk ? maxEncodedChunk : remaining;\n const size = encodedLengthToChunk.get(chunkLength);\n if (!size) {\n throw new Error('base48: invalid length');\n }\n totalBytes += size;\n offset += chunkLength;\n }\n\n const result = new Uint8Array(totalBytes);\n let cursor = 0;\n for (let offset = 0; offset < value.length; ) {\n const remaining = value.length - offset;\n const chunkLength = remaining >= maxEncodedChunk ? maxEncodedChunk : remaining;\n const size = encodedLengthToChunk.get(chunkLength);\n if (!size) {\n throw new Error('base48: invalid length');\n }\n const chunk = decodeChunk(value.slice(offset, offset + chunkLength), size);\n result.set(chunk, cursor);\n cursor += size;\n offset += chunkLength;\n }\n return result;\n}\n","const base62AlphabetLex = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\nconst base62Zero = base62AlphabetLex.charAt(0);\nconst base62Regex = /^[0-9A-Za-z]*$/;\n\nconst maxChunkBytes = 32;\nconst chunkToEncodedLength = new Map<number, number>();\nconst encodedLengthToChunk = new Map<number, number>();\n\nfor (let size = 1; size <= maxChunkBytes; size += 1) {\n const encodedLength = Math.ceil((size * 8) / Math.log2(62));\n chunkToEncodedLength.set(size, encodedLength);\n encodedLengthToChunk.set(encodedLength, size);\n}\n\nconst maxEncodedChunk = chunkToEncodedLength.get(maxChunkBytes)!;\n\nfunction encodeChunk(bytes: Uint8Array, size: number): string {\n let value = 0n;\n for (const byte of bytes) {\n value = (value << 8n) | BigInt(byte);\n }\n\n let encoded = '';\n if (value === 0n) {\n encoded = base62Zero;\n } else {\n while (value > 0n) {\n const mod = value % 62n;\n encoded = base62AlphabetLex[Number(mod)] + encoded;\n value /= 62n;\n }\n }\n\n const targetLength = chunkToEncodedLength.get(size);\n if (!targetLength) {\n throw new Error(`base62: unsupported chunk size ${size}`);\n }\n return encoded.padStart(targetLength, base62Zero);\n}\n\nfunction decodeChunk(value: string, size: number): Uint8Array {\n let n = 0n;\n for (const char of value) {\n const index = base62AlphabetLex.indexOf(char);\n if (index === -1) {\n throw new Error('base62: invalid character');\n }\n n = n * 62n + BigInt(index);\n }\n\n const maxValue = 2n ** BigInt(size * 8) - 1n;\n if (n > maxValue) {\n throw new Error('base62: invalid length');\n }\n\n const buffer = new Uint8Array(size);\n for (let i = size - 1; i >= 0; i -= 1) {\n buffer[i] = Number(n & 0xffn);\n n >>= 8n;\n }\n return buffer;\n}\n\nexport function encodeBase62Lex(buffer: Uint8Array): string {\n if (buffer.length === 0) {\n return '';\n }\n\n let result = '';\n for (let offset = 0; offset < buffer.length; ) {\n const remaining = buffer.length - offset;\n const size = remaining >= maxChunkBytes ? maxChunkBytes : remaining;\n result += encodeChunk(buffer.slice(offset, offset + size), size);\n offset += size;\n }\n return result;\n}\n\nexport function decodeBase62Lex(value: string): Uint8Array {\n if (!value) {\n return new Uint8Array();\n }\n if (!base62Regex.test(value)) {\n throw new Error('base62: invalid string');\n }\n\n let totalBytes = 0;\n for (let offset = 0; offset < value.length; ) {\n const remaining = value.length - offset;\n const chunkLength = remaining >= maxEncodedChunk ? maxEncodedChunk : remaining;\n const size = encodedLengthToChunk.get(chunkLength);\n if (!size) {\n throw new Error('base62: invalid length');\n }\n totalBytes += size;\n offset += chunkLength;\n }\n\n const result = new Uint8Array(totalBytes);\n let cursor = 0;\n for (let offset = 0; offset < value.length; ) {\n const remaining = value.length - offset;\n const chunkLength = remaining >= maxEncodedChunk ? maxEncodedChunk : remaining;\n const size = encodedLengthToChunk.get(chunkLength);\n if (!size) {\n throw new Error('base62: invalid length');\n }\n const chunk = decodeChunk(value.slice(offset, offset + chunkLength), size);\n result.set(chunk, cursor);\n cursor += size;\n offset += chunkLength;\n }\n return result;\n}\n","import { encodeBase48Lex } from './base48';\nimport { encodeBase62Lex } from './base62';\n\nconst requestIdPrefix = 'req_';\n\nfunction uuidv7Bytes(): Uint8Array {\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 return bytes;\n}\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 = uuidv7Bytes();\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\nexport function uuidv7base62(): string {\n return encodeBase62Lex(uuidv7Bytes());\n}\n\nexport function uuidv7base48(): string {\n return encodeBase48Lex(uuidv7Bytes());\n}\n\nexport function generateRequestId(): string {\n return `${requestIdPrefix}${uuidv7base48()}`;\n}\n","import type { Span } from '@opentelemetry/api';\nimport type { AttributeValue, NormalizedRequest, XrayContext } from './types';\nimport type { CaptureConfig, RedactionConfig, ResolvedXrayConfig } from './config';\n\nexport type RequestState = {\n request: NormalizedRequest;\n config: ResolvedXrayConfig;\n span?: Span;\n context: XrayContext;\n attributes: Record<string, AttributeValue>;\n events: Array<{ name: string; attributes?: Record<string, AttributeValue> }>;\n userId?: string;\n sessionId?: string;\n error?: unknown;\n captureOverride?: Partial<CaptureConfig>;\n redactionOverride?: Partial<RedactionConfig>;\n};\n\nconst contextMap = new WeakMap<XrayContext, RequestState>();\nconst objectMap = new WeakMap<object, RequestState>();\n\nexport function bindContext(ctx: XrayContext, state: RequestState): void {\n contextMap.set(ctx, state);\n}\n\nexport function getContextState(ctx: XrayContext): RequestState | undefined {\n return contextMap.get(ctx);\n}\n\nexport function bindObject(target: object, state: RequestState): void {\n objectMap.set(target, state);\n}\n\nexport function getContextFromObject(target: unknown): XrayContext | undefined {\n const state = getStateFromObject(target);\n return state?.context;\n}\n\nexport function getStateFromObject(target: unknown): RequestState | undefined {\n if (!target || typeof target !== 'object') {\n return undefined;\n }\n if (objectMap.has(target)) {\n return objectMap.get(target);\n }\n\n const fallback = findNestedTarget(target as Record<string, unknown>);\n if (fallback && objectMap.has(fallback)) {\n return objectMap.get(fallback);\n }\n return undefined;\n}\n\nfunction findNestedTarget(obj: Record<string, unknown>): object | null {\n if (obj.raw && typeof obj.raw === 'object') {\n return obj.raw as object;\n }\n if (obj.req && typeof obj.req === 'object') {\n const req = obj.req as Record<string, unknown>;\n if (req.raw && typeof req.raw === 'object') {\n return req.raw as object;\n }\n return req as object;\n }\n if (obj.request && typeof obj.request === 'object') {\n const request = obj.request as Record<string, unknown>;\n if (request.raw && typeof request.raw === 'object') {\n return request.raw as object;\n }\n return request as object;\n }\n return null;\n}\n","import type { SpanExporter } from '@opentelemetry/sdk-trace-base';\nimport type { XrayConfig, ResolvedXrayConfig, CaptureConfig, RedactionConfig } from './config';\nimport { XrayConfigError, normalizeConfig } from './config';\nimport { logWithLevel } from './logger';\nimport { applyRedaction, redactHeaders } from './redaction';\nimport { makeCapturedBody, sanitizeHeaderValues, sanitizeLogString } from './request_log';\nimport {\n setHeaderAttributes,\n setRequestAttributes,\n setRequestBodyAttributes,\n setRequestBodySizeAttribute,\n setRequestIdAttribute,\n setResponseBodyAttributes,\n setResponseBodySizeAttribute,\n setResponseStatusAttribute,\n setRouteAttribute,\n setUserIdAttribute,\n} from './attributes';\nimport {\n createTracerProvider,\n spanFromTracer,\n spanStatusFromError,\n tracerFromProvider,\n} from './otel';\nimport { normalizeRoutePattern } from './route';\nimport { generateRequestId } from './uuid';\nimport { bindContext, getContextState, type RequestState } from './state';\nimport type {\n AttributeValue,\n NormalizedRequest,\n NormalizedResponse,\n RequestLog,\n XrayContext,\n XrayEmitter,\n} from './types';\n\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 explicitRequestId = normalizeRequestIdCandidate(req.requestId);\n req.requestId = explicitRequestId;\n\n if (req.route && config.route.normalize) {\n req.route = config.route.normalizer\n ? config.route.normalizer(req.route)\n : normalizeRoutePattern(req.route);\n }\n\n const span = spanFromTracer(tracer, spanNameFromRequest(req));\n const context: XrayContext = {\n requestId: explicitRequestId ?? '',\n traceId: span?.spanContext().traceId,\n spanId: span?.spanContext().spanId,\n 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 resolvedRequestId = resolveFinalRequestId(config, ctx.requestId, res.headers);\n ctx.requestId = resolvedRequestId;\n const fallbackLog: RequestLog = {\n requestId: resolvedRequestId,\n serviceName: config.serviceName,\n method: res.statusCode ? 'UNKNOWN' : 'UNKNOWN',\n url: '',\n durationMs: 0,\n statusCode: res.statusCode,\n timestamp: new Date(endTimeMs).toISOString(),\n };\n return fallbackLog;\n }\n\n const request = state.request;\n const resolvedRequestId = resolveFinalRequestId(\n config,\n request.requestId || ctx.requestId,\n res.headers,\n );\n request.requestId = resolvedRequestId;\n ctx.requestId = resolvedRequestId;\n const capture = resolveCapture(config.capture, state.captureOverride);\n const redaction = resolveRedaction(config.redaction, state.redactionOverride);\n\n const route = request.route;\n const url = sanitizeLogString(request.url);\n const log: RequestLog = {\n requestId: resolvedRequestId,\n traceId: state.span?.spanContext().traceId,\n spanId: state.span?.spanContext().spanId,\n serviceName: config.serviceName,\n method: request.method,\n url: url,\n route: route,\n statusCode: res.statusCode,\n durationMs: Math.max(0, endTimeMs - request.startTimeMs),\n requestHeaders: capture.requestHeaders ? sanitizeHeaderValues(request.headers) : undefined,\n responseHeaders: capture.responseHeaders ? sanitizeHeaderValues(res.headers) : undefined,\n requestBody: capture.requestBody === 'none' ? undefined : request.body,\n responseBody: capture.responseBody === 'none' ? undefined : res.body,\n userId: state.userId ?? undefined,\n sessionId: state.sessionId ?? undefined,\n error: buildError(err ?? state.error),\n attributes: Object.keys(state.attributes).length > 0 ? { ...state.attributes } : undefined,\n timestamp: new Date(endTimeMs).toISOString(),\n };\n\n const redacted = applyRedaction(redaction, log);\n if (redacted.route && config.route.normalize) {\n const normalized = config.route.normalizer\n ? config.route.normalizer(redacted.route)\n : normalizeRoutePattern(redacted.route);\n redacted.route = normalized;\n }\n const span = state.span;\n if (span) {\n try {\n const clientAddressHeaders = redactHeaders(request.headers, redaction);\n setRequestAttributes(\n span,\n {\n ...request,\n headers: clientAddressHeaders,\n redactionReplacement: redaction.replacement,\n },\n redacted.url,\n );\n setRequestIdAttribute(span, redacted.requestId);\n span.setAttribute('service.name', config.serviceName);\n if (redacted.statusCode != null) {\n setResponseStatusAttribute(span, redacted.statusCode);\n }\n if (redacted.route) {\n setRouteAttribute(span, redacted.route);\n span.updateName(`${request.method} ${redacted.route}`);\n } else {\n span.updateName(spanNameFromRequest(request));\n }\n if (redacted.requestHeaders) {\n setHeaderAttributes(span, redacted.requestHeaders, 'http.request.header.');\n }\n if (redacted.responseHeaders) {\n setHeaderAttributes(span, redacted.responseHeaders, 'http.response.header.');\n }\n if (redacted.requestBody) {\n setRequestBodyAttributes(span, redacted.requestBody);\n setRequestBodySizeAttribute(span, redacted.requestBody.bytes);\n }\n if (redacted.responseBody) {\n setResponseBodyAttributes(span, redacted.responseBody);\n setResponseBodySizeAttribute(span, redacted.responseBody.bytes);\n }\n if (state.userId) {\n setUserIdAttribute(span, state.userId);\n }\n if (err ?? state.error) {\n spanStatusFromError(span, err ?? state.error);\n }\n span.end();\n } catch (spanErr) {\n logWithLevel(config.logger, 'warn', config.logLevel, 'xray: span finalize failed', {\n error: spanErr instanceof Error ? spanErr.message : String(spanErr),\n });\n }\n }\n\n return redacted;\n}\n\nfunction resolveFinalRequestId(\n config: ResolvedXrayConfig,\n explicitRequestId: string | undefined,\n responseHeaders?: Record<string, string | string[]>,\n): string {\n const explicit = normalizeRequestIdCandidate(explicitRequestId);\n if (explicit) {\n return explicit;\n }\n const headerValue = resolveHeaderRequestId(config.requestId.header, responseHeaders);\n if (headerValue) {\n return headerValue;\n }\n return generateRequestId();\n}\n\nfunction resolveHeaderRequestId(\n headerName: string,\n headers?: Record<string, string | string[]>,\n): string | undefined {\n if (!headers) {\n return undefined;\n }\n const target = headerName.toLowerCase();\n for (const [name, value] of Object.entries(headers)) {\n if (name.toLowerCase() !== target) {\n continue;\n }\n const entry = Array.isArray(value) ? value[0] : value;\n const normalized = normalizeRequestIdCandidate(entry);\n if (normalized) {\n return normalized;\n }\n }\n return undefined;\n}\n\nfunction normalizeRequestIdCandidate(value: string | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed ? trimmed : undefined;\n}\n\nfunction resolveCapture(base: CaptureConfig, override?: Partial<CaptureConfig>): CaptureConfig {\n if (!override) {\n return base;\n }\n return {\n ...base,\n ...override,\n };\n}\n\nfunction resolveRedaction(\n base: RedactionConfig,\n override?: Partial<RedactionConfig>,\n): RedactionConfig {\n const merged: RedactionConfig = {\n ...base,\n ...override,\n };\n\n merged.headers = normalizeLowercaseList(merged.headers);\n merged.queryParams = normalizeLowercaseList(merged.queryParams);\n merged.bodyJsonPaths = normalizeList(merged.bodyJsonPaths);\n merged.replacement = merged.replacement || base.replacement;\n\n return merged;\n}\n\nfunction normalizeLowercaseList(values: string[] | undefined): string[] {\n if (!values) {\n return [];\n }\n return values.map((entry) => entry.trim().toLowerCase()).filter(Boolean);\n}\n\nfunction normalizeList(values: string[] | undefined): string[] {\n if (!values) {\n return [];\n }\n return values.map((entry) => entry.trim()).filter(Boolean);\n}\n\nfunction buildError(err?: unknown): RequestLog['error'] {\n if (!err) {\n return undefined;\n }\n if (err instanceof Error) {\n return {\n message: err.message || 'Error',\n type: err.name || 'Error',\n stack: err.stack,\n };\n }\n return {\n message: String(err),\n };\n}\n\nfunction spanNameFromRequest(req: NormalizedRequest): string {\n const method = req.method || 'GET';\n if (req.route) {\n return `${method} ${req.route}`;\n }\n const path = safePath(req.url);\n return `${method} ${path}`;\n}\n\nfunction safePath(url: string): string {\n try {\n const parsed = new URL(url);\n return parsed.pathname || '/';\n } catch {\n const rawPath = url.split('?')[0] || '/';\n return rawPath || '/';\n }\n}\n\nexport function captureBody(\n bytes: Uint8Array | undefined,\n totalBytes: number,\n truncated: boolean,\n mode: 'text' | 'base64' | 'none',\n): ReturnType<typeof makeCapturedBody> {\n if (mode === 'none') {\n return undefined;\n }\n return makeCapturedBody(bytes, totalBytes, truncated, mode === 'text' ? 'text' : 'base64');\n}\n\nexport function captureResponseBody(\n bytes: Uint8Array | undefined,\n totalBytes: number,\n truncated: boolean,\n mode: 'text' | 'base64' | 'none',\n): ReturnType<typeof makeCapturedBody> {\n if (mode === 'none') {\n return undefined;\n }\n return makeCapturedBody(bytes, totalBytes, truncated, mode === 'text' ? 'text' : 'base64');\n}\n"],"mappings":"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","names":["maybeBuffer","maxChunkBytes","chunkToEncodedLength","encodedLengthToChunk","maxEncodedChunk","state","resolvedRequestId"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/encoding.ts","../src/route.ts","../src/config.ts","../src/logger.ts","../src/header_redaction.ts","../src/redaction.ts","../src/request_log.ts","../src/attributes.ts","../src/attrkey.ts","../src/otel.ts","../src/uuid/base48.ts","../src/uuid/base62.ts","../src/uuid/index.ts","../src/state.ts","../src/emitter.ts"],"sourcesContent":["export type {\n AttributeValue,\n CapturedBody,\n LogLevel,\n Logger,\n NormalizedRequest,\n NormalizedResponse,\n RequestLog,\n XrayContext,\n XrayEmitter,\n} from './types';\nexport type {\n CaptureConfig,\n ExporterConfig,\n RedactionConfig,\n RequestIdConfig,\n ResolvedXrayConfig,\n RouteConfig,\n XrayConfig,\n XrayRuntimeConfig,\n} from './config';\nexport { XrayConfigError, normalizeConfig } from './config';\nexport { createEmitter } from './emitter';\n","const utf8Decoder =\n typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { fatal: true }) : null;\nconst utf8DecoderLenient = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8') : null;\nconst maybeBuffer = (\n globalThis as typeof globalThis & {\n Buffer?: { from(data: Uint8Array): { toString(encoding?: string): string } };\n }\n).Buffer;\n\nexport function encodeBase64(bytes: Uint8Array): string {\n if (maybeBuffer) {\n return maybeBuffer.from(bytes).toString('base64');\n }\n let binary = '';\n for (let i = 0; i < bytes.length; i += 1) {\n const byte = bytes[i];\n if (byte === undefined) {\n continue;\n }\n binary += String.fromCharCode(byte);\n }\n if (typeof btoa !== 'undefined') {\n return btoa(binary);\n }\n return '';\n}\n\nexport function isValidUtf8(bytes: Uint8Array): boolean {\n if (!utf8Decoder) {\n return false;\n }\n try {\n utf8Decoder.decode(bytes);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function decodeUtf8(bytes: Uint8Array): string {\n if (utf8DecoderLenient) {\n return utf8DecoderLenient.decode(bytes);\n }\n if (maybeBuffer) {\n return maybeBuffer.from(bytes).toString('utf8');\n }\n return '';\n}\n","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 /**\n * Response header name to read request IDs from. This is normalized to\n * lowercase during configuration.\n */\n header: string;\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 /**\n * Request ID resolution settings. The header is read from response headers at\n * the end of the request.\n */\n requestId?: Partial<RequestIdConfig>;\n 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: 'text',\n responseBody: 'text',\n maxBodyBytes: 65536,\n};\n\nconst defaultRedaction: RedactionConfig = {\n headers: ['authorization', 'cookie', 'set-cookie', 'x-api-key'],\n queryParams: [],\n bodyJsonPaths: [],\n replacement: '[REDACTED]',\n};\n\nconst defaultRequestId: RequestIdConfig = {\n header: 'request-id',\n};\n\nconst defaultRoute: RouteConfig = {\n normalize: true,\n normalizer: normalizeRoutePattern,\n};\n\nconst defaultExporterBase: Omit<ExporterConfig, 'endpointUrl'> = {\n headers: {},\n timeoutMs: 30000,\n spanProcessor: 'batch',\n};\n\nexport class XrayConfigError extends Error {\n code: 'INVALID_CONFIG' | 'INVALID_REDACTION';\n\n constructor(code: XrayConfigError['code'], message: string) {\n super(message);\n this.code = code;\n }\n}\n\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","import type { Logger, LogLevel } from './types';\n\nconst logLevelOrder: Record<LogLevel, number> = {\n debug: 10,\n info: 20,\n warn: 30,\n error: 40,\n};\n\nexport function logWithLevel(\n logger: Logger,\n level: LogLevel,\n threshold: LogLevel,\n message: string,\n fields?: Record<string, unknown>,\n): void {\n if (logLevelOrder[level] < logLevelOrder[threshold]) {\n return;\n }\n\n const fn =\n logger[level] ?? logger.warn ?? logger.info ?? logger.debug ?? logger.error ?? console.log;\n\n try {\n fn.call(logger, message, fields);\n } catch {\n // Logging should never disrupt instrumentation.\n }\n}\n","const headerNameCompactor = /[-_.]/g;\nconst headerTokenSplitter = /[-_.]/;\n\ntype HeaderRedactionMatcher = {\n exactSensitive: Set<string>;\n keywordTokens: Set<string>;\n keywordCompacted: string[];\n};\n\nconst defaultHeaderMatcher = newHeaderRedactionMatcher(\n defaultSensitiveHeaderNames(),\n defaultSensitiveKeywords(),\n);\n\nexport function authSchemePrefix(value: string): string {\n if (!value) {\n return '';\n }\n\n const lower = value.toLowerCase();\n if (lower.startsWith('basic')) {\n return value.slice(0, 'basic'.length);\n }\n if (lower.startsWith('bearer')) {\n return value.slice(0, 'bearer'.length);\n }\n if (lower.startsWith('digest')) {\n return value.slice(0, 'digest'.length);\n }\n if (lower.startsWith('negotiate')) {\n return value.slice(0, 'negotiate'.length);\n }\n return '';\n}\n\nexport function redactCookieValue(value: string, replacement: string): string {\n if (!value) {\n return replacement;\n }\n\n const parts = value.split(';');\n const redacted: string[] = [];\n\n for (const part of parts) {\n const segment = part.trim();\n if (!segment) {\n redacted.push(replacement);\n continue;\n }\n const idx = segment.indexOf('=');\n if (idx <= 0) {\n redacted.push(replacement);\n continue;\n }\n const name = segment.slice(0, idx);\n if (!name) {\n redacted.push(replacement);\n continue;\n }\n redacted.push(`${name}=${replacement}`);\n }\n\n return redacted.join('; ');\n}\n\nexport function redactSetCookieValue(value: string, replacement: string): string {\n if (!value) {\n return replacement;\n }\n\n const parts = value.split(';');\n const first = parts.shift() ?? '';\n const idx = first.indexOf('=');\n if (idx <= 0) {\n return replacement;\n }\n const name = first.slice(0, idx);\n if (!name) {\n return replacement;\n }\n\n const redacted = `${name}=${replacement}`;\n if (parts.length === 0) {\n return redacted;\n }\n return `${redacted};${parts.join(';')}`;\n}\n\nexport function isSensitiveHeaderName(key: string): boolean {\n return isSensitiveNormalized(defaultHeaderMatcher, normalizeHeaderName(key));\n}\n\nfunction addSensitiveHeaderNames(target: Set<string>, headers: string[]): void {\n for (const header of headers) {\n const normalized = normalizeHeaderName(header);\n if (normalized) {\n target.add(normalized);\n }\n }\n}\n\nfunction buildKeywordSets(keywords: string[]): { compacted: string[]; tokens: Set<string> } {\n const tokens = new Set<string>();\n const compacted = new Set<string>();\n\n for (const keyword of keywords) {\n const normalized = normalizeHeaderName(keyword);\n if (!normalized) {\n continue;\n }\n const compactedKeyword = compactNormalizedHeaderName(normalized);\n if (compactedKeyword) {\n compacted.add(compactedKeyword);\n }\n if (!normalized.includes('-') && !normalized.includes('_') && !normalized.includes('.')) {\n tokens.add(normalized);\n }\n }\n\n return {\n compacted: Array.from(compacted).sort(),\n tokens,\n };\n}\n\nfunction compactNormalizedHeaderName(normalized: string): string {\n if (!normalized) {\n return '';\n }\n return normalized.replace(headerNameCompactor, '');\n}\n\nfunction defaultSensitiveHeaderNames(): string[] {\n return [\n 'authorization',\n 'cookie',\n 'proxy-authenticate',\n 'proxy-authorization',\n 'set-cookie',\n 'www-authenticate',\n ];\n}\n\nfunction defaultSensitiveKeywords(): string[] {\n return [\n 'api-key',\n 'api_key',\n 'apikey',\n 'auth',\n 'authenticate',\n 'authorization',\n 'credential',\n 'password',\n 'passwd',\n 'private-key',\n 'private_key',\n 'privatekey',\n 'secret',\n 'session',\n 'sessionid',\n 'signature',\n 'token',\n ];\n}\n\nfunction headerNameTokens(name: string): string[] {\n if (!name) {\n return [];\n }\n return name.split(headerTokenSplitter).filter(Boolean);\n}\n\nfunction hasKeywordToken(tokens: string[], keywordTokens: Set<string>): boolean {\n for (const token of tokens) {\n if (keywordTokens.has(token)) {\n return true;\n }\n }\n return false;\n}\n\nfunction isExactMatch(normalized: string, exactSensitive: Set<string>): boolean {\n return exactSensitive.has(normalized);\n}\n\nfunction isSensitiveNormalized(matcher: HeaderRedactionMatcher, normalized: string): boolean {\n if (!normalized) {\n return false;\n }\n if (isExactMatch(normalized, matcher.exactSensitive)) {\n return true;\n }\n if (hasKeywordToken(headerNameTokens(normalized), matcher.keywordTokens)) {\n return true;\n }\n return matchesCompacted(normalized, matcher.keywordCompacted);\n}\n\nfunction matchesCompacted(normalized: string, keywordCompacted: string[]): boolean {\n if (keywordCompacted.length === 0) {\n return false;\n }\n const compacted = compactNormalizedHeaderName(normalized);\n if (!compacted) {\n return false;\n }\n return keywordCompacted.some((keyword) => compacted.includes(keyword));\n}\n\nfunction newHeaderRedactionMatcher(names: string[], keywords: string[]): HeaderRedactionMatcher {\n const exactSensitive = new Set<string>();\n addSensitiveHeaderNames(exactSensitive, names);\n const { compacted, tokens } = buildKeywordSets(keywords);\n return {\n exactSensitive,\n keywordCompacted: compacted,\n keywordTokens: tokens,\n };\n}\n\nfunction normalizeHeaderName(name: string): string {\n return name.trim().toLowerCase();\n}\n","import type { CapturedBody, RequestLog } from './types';\nimport { authSchemePrefix, redactCookieValue, redactSetCookieValue } from './header_redaction';\n\nexport function applyRedaction(\n config: {\n headers: string[];\n queryParams: string[];\n bodyJsonPaths: string[];\n replacement: string;\n },\n log: RequestLog,\n): RequestLog {\n const redacted = { ...log };\n\n if (redacted.requestHeaders) {\n redacted.requestHeaders = redactHeaders(redacted.requestHeaders, config);\n }\n if (redacted.responseHeaders) {\n redacted.responseHeaders = redactHeaders(redacted.responseHeaders, config);\n }\n\n redacted.url = redactUrl(redacted.url, config);\n\n if (redacted.requestBody) {\n redacted.requestBody = redactBody(redacted.requestBody, redacted.requestHeaders, config);\n }\n if (redacted.responseBody) {\n redacted.responseBody = redactBody(redacted.responseBody, redacted.responseHeaders, config);\n }\n\n return redacted;\n}\n\nexport function redactHeaders(\n headers: Record<string, string | string[]>,\n config: { headers: string[]; replacement: string },\n): Record<string, string | string[]> {\n const list = new Set(config.headers.map((name) => name.toLowerCase()));\n const result: Record<string, string | string[]> = {};\n\n for (const [name, value] of Object.entries(headers)) {\n const lower = name.toLowerCase();\n if (!list.has(lower)) {\n result[name] = value;\n continue;\n }\n\n const redactValue = (entry: string) => redactHeaderValue(lower, entry, config.replacement);\n if (Array.isArray(value)) {\n result[name] = value.map(redactValue);\n } else {\n result[name] = redactValue(value);\n }\n }\n\n return result;\n}\n\nfunction redactHeaderValue(name: string, value: string, replacement: string): string {\n switch (name) {\n case 'authorization':\n case 'proxy-authorization': {\n const scheme = authSchemePrefix(value);\n if (!scheme) {\n return replacement;\n }\n return `${scheme} ${replacement}`;\n }\n case 'cookie':\n return redactCookieValue(value, replacement);\n case 'set-cookie':\n return redactSetCookieValue(value, replacement);\n default:\n return replacement;\n }\n}\n\nfunction redactUrl(value: string, config: { queryParams: string[]; replacement: string }): string {\n if (!value || config.queryParams.length === 0) {\n return value;\n }\n\n try {\n const parsed = new URL(value);\n const params = parsed.searchParams;\n if (!params || params.size === 0) {\n return value;\n }\n\n const redact = new Set(config.queryParams.map((key) => key.toLowerCase()));\n const next = new URLSearchParams();\n params.forEach((val, key) => {\n if (redact.has(key.toLowerCase())) {\n next.append(key, config.replacement);\n } else {\n next.append(key, val);\n }\n });\n parsed.search = next.toString();\n return parsed.toString();\n } catch {\n return value;\n }\n}\n\nfunction redactBody(\n body: CapturedBody,\n headers: Record<string, string | string[]> | undefined,\n config: { bodyJsonPaths: string[]; replacement: string },\n): CapturedBody {\n if (config.bodyJsonPaths.length === 0) {\n return body;\n }\n if (!body.value || body.encoding !== 'utf8') {\n return body;\n }\n if (!isJsonContentType(headers)) {\n return body;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(body.value);\n } catch {\n return body;\n }\n\n for (const path of config.bodyJsonPaths) {\n const segments = parseJsonPath(path);\n if (!segments) {\n continue;\n }\n redactJsonPath(parsed, segments, config.replacement);\n }\n\n const next = { ...body };\n next.value = JSON.stringify(parsed);\n return next;\n}\n\nfunction isJsonContentType(headers?: Record<string, string | string[]>): boolean {\n if (!headers) {\n return false;\n }\n const contentType = headers['content-type'] || headers['Content-Type'];\n const value = Array.isArray(contentType) ? contentType[0] : contentType;\n if (!value) {\n return false;\n }\n const normalized = value.split(';')[0];\n if (!normalized) {\n return false;\n }\n const trimmed = normalized.trim().toLowerCase();\n return trimmed === 'application/json' || trimmed.endsWith('+json');\n}\n\ntype JsonPathSegment = string | number;\n\nfunction parseJsonPath(path: string): JsonPathSegment[] | null {\n const trimmed = path.trim();\n if (!trimmed) {\n return null;\n }\n\n const normalized = trimmed.startsWith('$.') ? trimmed.slice(2) : trimmed;\n if (!normalized) {\n return null;\n }\n\n const segments: JsonPathSegment[] = [];\n const parts = normalized.split('.');\n for (const part of parts) {\n if (!part) {\n continue;\n }\n let cursor = part;\n const bracketIndex = cursor.indexOf('[');\n if (bracketIndex === -1) {\n segments.push(cursor);\n continue;\n }\n\n const name = cursor.slice(0, bracketIndex);\n if (name) {\n segments.push(name);\n }\n cursor = cursor.slice(bracketIndex);\n const matches = cursor.match(/\\[(\\d+)\\]/g);\n if (!matches) {\n continue;\n }\n for (const match of matches) {\n const indexValue = match.slice(1, -1);\n const index = Number.parseInt(indexValue, 10);\n if (Number.isFinite(index)) {\n segments.push(index);\n }\n }\n }\n\n return segments.length > 0 ? segments : null;\n}\n\nfunction redactJsonPath(value: unknown, segments: JsonPathSegment[], replacement: string): void {\n if (!value || segments.length === 0) {\n return;\n }\n\n let current: unknown = value;\n for (let i = 0; i < segments.length; i += 1) {\n const segment = segments[i];\n if (segment === undefined) {\n return;\n }\n const isLast = i === segments.length - 1;\n\n if (typeof segment === 'number') {\n if (!Array.isArray(current) || segment < 0 || segment >= current.length) {\n return;\n }\n if (isLast) {\n current[segment] = replacement;\n return;\n }\n current = current[segment];\n continue;\n }\n\n if (!current || typeof current !== 'object') {\n return;\n }\n const record = current as Record<string, unknown>;\n if (!(segment in record)) {\n return;\n }\n if (isLast) {\n record[segment] = replacement;\n return;\n }\n current = record[segment];\n }\n}\n","import type { CapturedBody } from './types';\nimport { decodeUtf8, encodeBase64, isValidUtf8 } from './encoding';\n\n// eslint-disable-next-line no-control-regex\nconst controlChars = /[\\x00-\\x1F\\x7F]/g;\n\nexport function sanitizeLogString(value: string): string {\n if (!value) {\n return value;\n }\n return value.replace(controlChars, '');\n}\n\nexport function sanitizeHeaderValues(\n headers: Record<string, string | string[]> | undefined,\n): Record<string, string | string[]> | undefined {\n if (!headers) {\n return undefined;\n }\n\n const sanitized: Record<string, string | string[]> = {};\n for (const [key, value] of Object.entries(headers)) {\n const name = sanitizeLogString(key);\n if (Array.isArray(value)) {\n sanitized[name] = value.map((entry) => sanitizeLogString(entry));\n } else {\n sanitized[name] = sanitizeLogString(value);\n }\n }\n return sanitized;\n}\n\nexport function makeCapturedBody(\n bytes: Uint8Array | undefined,\n totalBytes: number,\n truncated: boolean,\n mode: 'text' | 'base64',\n): CapturedBody | undefined {\n if (!bytes) {\n return undefined;\n }\n\n if (mode === 'base64') {\n return {\n bytes: totalBytes,\n encoding: 'base64',\n truncated,\n value: encodeBase64(bytes),\n };\n }\n\n if (isValidUtf8(bytes)) {\n return {\n bytes: totalBytes,\n encoding: 'utf8',\n truncated,\n value: decodeUtf8(bytes),\n };\n }\n\n return {\n bytes: totalBytes,\n encoding: 'base64',\n truncated,\n value: encodeBase64(bytes),\n };\n}\n","import type { Span } from '@opentelemetry/api';\nimport {\n ATTR_CLIENT_ADDRESS,\n ATTR_HTTP_REQUEST_BODY_SIZE,\n ATTR_HTTP_REQUEST_METHOD,\n ATTR_HTTP_RESPONSE_BODY_SIZE,\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_HTTP_ROUTE,\n ATTR_URL_FULL,\n ATTR_URL_PATH,\n ATTR_USER_ID,\n} from '@opentelemetry/semantic-conventions/incubating';\nimport type { CapturedBody } from './types';\nimport {\n AttributeKeyRequestBody,\n AttributeKeyRequestBodyEncoding,\n AttributeKeyRequestBodyTruncated,\n AttributeKeyRequestID,\n AttributeKeyResponseBody,\n AttributeKeyResponseBodyEncoding,\n AttributeKeyResponseBodyTruncated,\n} from './attrkey';\n\nexport function setHeaderAttributes(\n span: Span,\n headers: Record<string, string | string[]> | undefined,\n prefix: string,\n): void {\n if (!headers) {\n return;\n }\n const keys = Object.keys(headers).sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()));\n for (const key of keys) {\n const values = headers[key];\n if (!values || (Array.isArray(values) && values.length === 0)) {\n continue;\n }\n span.setAttribute(prefix + key.toLowerCase(), Array.isArray(values) ? values : [values]);\n }\n}\n\nexport function setRequestAttributes(\n span: Span,\n request: {\n method: string;\n url?: string;\n headers?: Record<string, string | string[]>;\n remoteAddress?: string;\n redactionReplacement?: string;\n },\n urlFull: string | undefined,\n): void {\n span.setAttribute(ATTR_HTTP_REQUEST_METHOD, request.method);\n const effectiveUrl = urlFull ?? request.url;\n if (effectiveUrl) {\n span.setAttribute(ATTR_URL_FULL, effectiveUrl);\n const path = extractPath(effectiveUrl);\n if (path) {\n span.setAttribute(ATTR_URL_PATH, path);\n }\n }\n const clientAddress = clientAddressForRequest(\n request.headers,\n request.remoteAddress,\n request.redactionReplacement,\n );\n if (clientAddress) {\n span.setAttribute(ATTR_CLIENT_ADDRESS, clientAddress);\n }\n}\n\nfunction extractPath(url: string): string | undefined {\n try {\n return new URL(url).pathname;\n } catch {\n // If not a full URL, try to extract path directly\n const match = url.match(/^[^?#]*/);\n return match?.[0] || undefined;\n }\n}\n\nfunction clientAddressForRequest(\n headers?: Record<string, string | string[]>,\n remoteAddress?: string,\n redactionReplacement?: string,\n): string | undefined {\n const forwarded = forwardedClientAddress(\n headerValues(headers, 'forwarded'),\n redactionReplacement,\n );\n if (forwarded) {\n return forwarded;\n }\n const xForwarded = xForwardedForClientAddress(\n headerValues(headers, 'x-forwarded-for'),\n redactionReplacement,\n );\n if (xForwarded) {\n return xForwarded;\n }\n const xRealIp = xRealIpClientAddress(headerValues(headers, 'x-real-ip'), redactionReplacement);\n if (xRealIp) {\n return xRealIp;\n }\n if (!remoteAddress) {\n return undefined;\n }\n return remoteAddrHost(remoteAddress);\n}\n\nfunction forwardedClientAddress(\n values: string[],\n redactionReplacement?: string,\n): string | undefined {\n for (const value of values) {\n if (!value) {\n continue;\n }\n const entries = value.split(',');\n for (const entry of entries) {\n const params = entry.split(';');\n for (const param of params) {\n const [rawKey, ...rest] = param.split('=');\n if (!rawKey) {\n continue;\n }\n if (rawKey.trim().toLowerCase() !== 'for') {\n continue;\n }\n const rawValue = rest.join('=').trim();\n const normalized = normalizeKnownAddress(rawValue, redactionReplacement);\n if (normalized) {\n return normalized;\n }\n }\n }\n }\n return undefined;\n}\n\nfunction xForwardedForClientAddress(\n values: string[],\n redactionReplacement?: string,\n): string | undefined {\n for (const value of values) {\n if (!value) {\n continue;\n }\n const entries = value.split(',');\n for (const entry of entries) {\n const normalized = normalizeKnownAddress(entry, redactionReplacement);\n if (normalized) {\n return normalized;\n }\n }\n }\n return undefined;\n}\n\nfunction xRealIpClientAddress(values: string[], redactionReplacement?: string): string | undefined {\n for (const value of values) {\n if (!value) {\n continue;\n }\n const normalized = normalizeKnownAddress(value, redactionReplacement);\n if (normalized) {\n return normalized;\n }\n }\n return undefined;\n}\n\nfunction normalizeKnownAddress(value: string, redactionReplacement?: string): string | undefined {\n const normalized = normalizeAddress(value, redactionReplacement);\n if (!normalized) {\n return undefined;\n }\n if (normalized.toLowerCase() === 'unknown') {\n return undefined;\n }\n return normalized;\n}\n\nfunction normalizeAddress(value: string, redactionReplacement?: string): string | undefined {\n if (!value) {\n return undefined;\n }\n let trimmed = value.trim();\n if (!trimmed) {\n return undefined;\n }\n if (redactionReplacement && trimmed === redactionReplacement) {\n return undefined;\n }\n if (trimmed.startsWith('\"') && trimmed.endsWith('\"') && trimmed.length > 1) {\n trimmed = trimmed.slice(1, -1).trim();\n }\n if (!trimmed) {\n return undefined;\n }\n if (trimmed.startsWith('[')) {\n const end = trimmed.indexOf(']');\n if (end !== -1) {\n return trimmed.slice(1, end);\n }\n }\n // If there's exactly one colon, treat it as host:port. More than one likely means IPv6.\n const colonCount = (trimmed.match(/:/g) ?? []).length;\n if (colonCount === 1) {\n const host = trimmed.split(':')[0];\n return host || undefined;\n }\n return trimmed;\n}\n\nfunction remoteAddrHost(value: string): string | undefined {\n return normalizeAddress(value);\n}\n\nfunction headerValues(\n headers: Record<string, string | string[]> | undefined,\n name: string,\n): string[] {\n if (!headers) {\n return [];\n }\n const target = name.toLowerCase();\n const values: string[] = [];\n for (const [key, value] of Object.entries(headers)) {\n if (key.toLowerCase() !== target) {\n continue;\n }\n if (Array.isArray(value)) {\n values.push(...value);\n } else {\n values.push(value);\n }\n }\n return values;\n}\n\nexport function setRequestBodyAttributes(span: Span, body: CapturedBody): void {\n if (!body.value) {\n return;\n }\n span.setAttribute(AttributeKeyRequestBody, body.value);\n span.setAttribute(AttributeKeyRequestBodyEncoding, body.encoding);\n if (body.truncated) {\n span.setAttribute(AttributeKeyRequestBodyTruncated, true);\n }\n}\n\nexport function setRequestBodySizeAttribute(span: Span, size: number): void {\n span.setAttribute(ATTR_HTTP_REQUEST_BODY_SIZE, size);\n}\n\nexport function setResponseBodyAttributes(span: Span, body: CapturedBody): void {\n if (!body.value) {\n return;\n }\n span.setAttribute(AttributeKeyResponseBody, body.value);\n span.setAttribute(AttributeKeyResponseBodyEncoding, body.encoding);\n if (body.truncated) {\n span.setAttribute(AttributeKeyResponseBodyTruncated, true);\n }\n}\n\nexport function setResponseBodySizeAttribute(span: Span, size: number): void {\n span.setAttribute(ATTR_HTTP_RESPONSE_BODY_SIZE, size);\n}\n\nexport function setResponseStatusAttribute(span: Span, statusCode: number): void {\n span.setAttribute(ATTR_HTTP_RESPONSE_STATUS_CODE, statusCode);\n}\n\nexport function setRouteAttribute(span: Span, route: string | undefined): void {\n if (route) {\n span.setAttribute(ATTR_HTTP_ROUTE, route);\n }\n}\n\nexport function setUserIdAttribute(span: Span, userId: string): void {\n span.setAttribute(ATTR_USER_ID, userId);\n}\n\nexport function 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 * Base48 encoding with a vowel-free alphabet to reduce the risk of generating\n * profanity-like substrings in time-ordered identifiers while staying compact.\n * Digits that are commonly read as vowels (0, 1, 3, 4) are excluded to avoid\n * leetspeak-style false positives. The alphabet is ordered by ASCII to preserve\n * lexicographic ordering of fixed-length encodings.\n */\nconst base48AlphabetLex = '256789BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz';\nconst base48Zero = base48AlphabetLex.charAt(0);\nconst base48Regex = /^[256789BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz]*$/;\n\nconst maxChunkBytes = 32;\nconst chunkToEncodedLength = new Map<number, number>();\nconst encodedLengthToChunk = new Map<number, number>();\n\nfor (let size = 1; size <= maxChunkBytes; size += 1) {\n const encodedLength = Math.ceil((size * 8) / Math.log2(48));\n chunkToEncodedLength.set(size, encodedLength);\n encodedLengthToChunk.set(encodedLength, size);\n}\n\nconst maxEncodedChunk = chunkToEncodedLength.get(maxChunkBytes)!;\n\nfunction encodeChunk(bytes: Uint8Array, size: number): string {\n let value = 0n;\n for (const byte of bytes) {\n value = (value << 8n) | BigInt(byte);\n }\n\n let encoded = '';\n if (value === 0n) {\n encoded = base48Zero;\n } else {\n while (value > 0n) {\n const mod = value % 48n;\n encoded = base48AlphabetLex[Number(mod)] + encoded;\n value /= 48n;\n }\n }\n\n const targetLength = chunkToEncodedLength.get(size);\n if (!targetLength) {\n throw new Error(`base48: unsupported chunk size ${size}`);\n }\n return encoded.padStart(targetLength, base48Zero);\n}\n\nfunction decodeChunk(value: string, size: number): Uint8Array {\n let n = 0n;\n for (const char of value) {\n const index = base48AlphabetLex.indexOf(char);\n if (index === -1) {\n throw new Error('base48: invalid character');\n }\n n = n * 48n + BigInt(index);\n }\n\n const maxValue = 2n ** BigInt(size * 8) - 1n;\n if (n > maxValue) {\n throw new Error('base48: invalid length');\n }\n\n const buffer = new Uint8Array(size);\n for (let i = size - 1; i >= 0; i -= 1) {\n buffer[i] = Number(n & 0xffn);\n n >>= 8n;\n }\n return buffer;\n}\n\nexport function encodeBase48Lex(buffer: Uint8Array): string {\n if (buffer.length === 0) {\n return '';\n }\n\n let result = '';\n for (let offset = 0; offset < buffer.length; ) {\n const remaining = buffer.length - offset;\n const size = remaining >= maxChunkBytes ? maxChunkBytes : remaining;\n result += encodeChunk(buffer.slice(offset, offset + size), size);\n offset += size;\n }\n return result;\n}\n\nexport function decodeBase48Lex(value: string): Uint8Array {\n if (!value) {\n return new Uint8Array();\n }\n if (!base48Regex.test(value)) {\n throw new Error('base48: invalid string');\n }\n\n let totalBytes = 0;\n for (let offset = 0; offset < value.length; ) {\n const remaining = value.length - offset;\n const chunkLength = remaining >= maxEncodedChunk ? maxEncodedChunk : remaining;\n const size = encodedLengthToChunk.get(chunkLength);\n if (!size) {\n throw new Error('base48: invalid length');\n }\n totalBytes += size;\n offset += chunkLength;\n }\n\n const result = new Uint8Array(totalBytes);\n let cursor = 0;\n for (let offset = 0; offset < value.length; ) {\n const remaining = value.length - offset;\n const chunkLength = remaining >= maxEncodedChunk ? maxEncodedChunk : remaining;\n const size = encodedLengthToChunk.get(chunkLength);\n if (!size) {\n throw new Error('base48: invalid length');\n }\n const chunk = decodeChunk(value.slice(offset, offset + chunkLength), size);\n result.set(chunk, cursor);\n cursor += size;\n offset += chunkLength;\n }\n return result;\n}\n","const base62AlphabetLex = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\nconst base62Zero = base62AlphabetLex.charAt(0);\nconst base62Regex = /^[0-9A-Za-z]*$/;\n\nconst maxChunkBytes = 32;\nconst chunkToEncodedLength = new Map<number, number>();\nconst encodedLengthToChunk = new Map<number, number>();\n\nfor (let size = 1; size <= maxChunkBytes; size += 1) {\n const encodedLength = Math.ceil((size * 8) / Math.log2(62));\n chunkToEncodedLength.set(size, encodedLength);\n encodedLengthToChunk.set(encodedLength, size);\n}\n\nconst maxEncodedChunk = chunkToEncodedLength.get(maxChunkBytes)!;\n\nfunction encodeChunk(bytes: Uint8Array, size: number): string {\n let value = 0n;\n for (const byte of bytes) {\n value = (value << 8n) | BigInt(byte);\n }\n\n let encoded = '';\n if (value === 0n) {\n encoded = base62Zero;\n } else {\n while (value > 0n) {\n const mod = value % 62n;\n encoded = base62AlphabetLex[Number(mod)] + encoded;\n value /= 62n;\n }\n }\n\n const targetLength = chunkToEncodedLength.get(size);\n if (!targetLength) {\n throw new Error(`base62: unsupported chunk size ${size}`);\n }\n return encoded.padStart(targetLength, base62Zero);\n}\n\nfunction decodeChunk(value: string, size: number): Uint8Array {\n let n = 0n;\n for (const char of value) {\n const index = base62AlphabetLex.indexOf(char);\n if (index === -1) {\n throw new Error('base62: invalid character');\n }\n n = n * 62n + BigInt(index);\n }\n\n const maxValue = 2n ** BigInt(size * 8) - 1n;\n if (n > maxValue) {\n throw new Error('base62: invalid length');\n }\n\n const buffer = new Uint8Array(size);\n for (let i = size - 1; i >= 0; i -= 1) {\n buffer[i] = Number(n & 0xffn);\n n >>= 8n;\n }\n return buffer;\n}\n\nexport function encodeBase62Lex(buffer: Uint8Array): string {\n if (buffer.length === 0) {\n return '';\n }\n\n let result = '';\n for (let offset = 0; offset < buffer.length; ) {\n const remaining = buffer.length - offset;\n const size = remaining >= maxChunkBytes ? maxChunkBytes : remaining;\n result += encodeChunk(buffer.slice(offset, offset + size), size);\n offset += size;\n }\n return result;\n}\n\nexport function decodeBase62Lex(value: string): Uint8Array {\n if (!value) {\n return new Uint8Array();\n }\n if (!base62Regex.test(value)) {\n throw new Error('base62: invalid string');\n }\n\n let totalBytes = 0;\n for (let offset = 0; offset < value.length; ) {\n const remaining = value.length - offset;\n const chunkLength = remaining >= maxEncodedChunk ? maxEncodedChunk : remaining;\n const size = encodedLengthToChunk.get(chunkLength);\n if (!size) {\n throw new Error('base62: invalid length');\n }\n totalBytes += size;\n offset += chunkLength;\n }\n\n const result = new Uint8Array(totalBytes);\n let cursor = 0;\n for (let offset = 0; offset < value.length; ) {\n const remaining = value.length - offset;\n const chunkLength = remaining >= maxEncodedChunk ? maxEncodedChunk : remaining;\n const size = encodedLengthToChunk.get(chunkLength);\n if (!size) {\n throw new Error('base62: invalid length');\n }\n const chunk = decodeChunk(value.slice(offset, offset + chunkLength), size);\n result.set(chunk, cursor);\n cursor += size;\n offset += chunkLength;\n }\n return result;\n}\n","import { encodeBase48Lex } from './base48';\nimport { encodeBase62Lex } from './base62';\n\nconst requestIdPrefix = 'req_';\n\nfunction uuidv7Bytes(): Uint8Array {\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 return bytes;\n}\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 = uuidv7Bytes();\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\nexport function uuidv7base62(): string {\n return encodeBase62Lex(uuidv7Bytes());\n}\n\nexport function uuidv7base48(): string {\n return encodeBase48Lex(uuidv7Bytes());\n}\n\nexport function generateRequestId(): string {\n return `${requestIdPrefix}${uuidv7base48()}`;\n}\n","import type { Span } from '@opentelemetry/api';\nimport type { AttributeValue, NormalizedRequest, XrayContext } from './types';\nimport type { CaptureConfig, RedactionConfig, ResolvedXrayConfig } from './config';\n\nexport type RequestState = {\n request: NormalizedRequest;\n config: ResolvedXrayConfig;\n span?: Span;\n context: XrayContext;\n attributes: Record<string, AttributeValue>;\n events: Array<{ name: string; attributes?: Record<string, AttributeValue> }>;\n userId?: string;\n sessionId?: string;\n error?: unknown;\n captureOverride?: Partial<CaptureConfig>;\n redactionOverride?: Partial<RedactionConfig>;\n};\n\nconst contextMap = new WeakMap<XrayContext, RequestState>();\nconst objectMap = new WeakMap<object, RequestState>();\n\nexport function bindContext(ctx: XrayContext, state: RequestState): void {\n contextMap.set(ctx, state);\n}\n\nexport function getContextState(ctx: XrayContext): RequestState | undefined {\n return contextMap.get(ctx);\n}\n\nexport function bindObject(target: object, state: RequestState): void {\n objectMap.set(target, state);\n}\n\nexport function getContextFromObject(target: unknown): XrayContext | undefined {\n const state = getStateFromObject(target);\n return state?.context;\n}\n\nexport function getStateFromObject(target: unknown): RequestState | undefined {\n if (!target || typeof target !== 'object') {\n return undefined;\n }\n if (objectMap.has(target)) {\n return objectMap.get(target);\n }\n\n const fallback = findNestedTarget(target as Record<string, unknown>);\n if (fallback && objectMap.has(fallback)) {\n return objectMap.get(fallback);\n }\n return undefined;\n}\n\nfunction findNestedTarget(obj: Record<string, unknown>): object | null {\n if (obj.raw && typeof obj.raw === 'object') {\n return obj.raw as object;\n }\n if (obj.req && typeof obj.req === 'object') {\n const req = obj.req as Record<string, unknown>;\n if (req.raw && typeof req.raw === 'object') {\n return req.raw as object;\n }\n return req as object;\n }\n if (obj.request && typeof obj.request === 'object') {\n const request = obj.request as Record<string, unknown>;\n if (request.raw && typeof request.raw === 'object') {\n return request.raw as object;\n }\n return request as object;\n }\n return null;\n}\n","import type { SpanExporter } from '@opentelemetry/sdk-trace-base';\nimport type { XrayConfig, ResolvedXrayConfig, CaptureConfig, RedactionConfig } from './config';\nimport { XrayConfigError, normalizeConfig } from './config';\nimport { logWithLevel } from './logger';\nimport { applyRedaction, redactHeaders } from './redaction';\nimport { makeCapturedBody, sanitizeHeaderValues, sanitizeLogString } from './request_log';\nimport {\n setHeaderAttributes,\n setRequestAttributes,\n setRequestBodyAttributes,\n setRequestBodySizeAttribute,\n setRequestIdAttribute,\n setResponseBodyAttributes,\n setResponseBodySizeAttribute,\n setResponseStatusAttribute,\n setRouteAttribute,\n setUserIdAttribute,\n} from './attributes';\nimport {\n createTracerProvider,\n spanFromTracer,\n spanStatusFromError,\n tracerFromProvider,\n} from './otel';\nimport { normalizeRoutePattern } from './route';\nimport { generateRequestId } from './uuid';\nimport { bindContext, getContextState, type RequestState } from './state';\nimport type {\n AttributeValue,\n NormalizedRequest,\n NormalizedResponse,\n RequestLog,\n XrayContext,\n XrayEmitter,\n} from './types';\n\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 explicitRequestId = normalizeRequestIdCandidate(req.requestId);\n req.requestId = explicitRequestId;\n\n if (req.route && config.route.normalize) {\n req.route = config.route.normalizer\n ? config.route.normalizer(req.route)\n : normalizeRoutePattern(req.route);\n }\n\n const span = spanFromTracer(tracer, spanNameFromRequest(req));\n const context: XrayContext = {\n requestId: explicitRequestId ?? '',\n traceId: span?.spanContext().traceId,\n spanId: span?.spanContext().spanId,\n 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 resolvedRequestId = resolveFinalRequestId(config, ctx.requestId, res.headers);\n ctx.requestId = resolvedRequestId;\n const fallbackLog: RequestLog = {\n requestId: resolvedRequestId,\n serviceName: config.serviceName,\n method: res.statusCode ? 'UNKNOWN' : 'UNKNOWN',\n url: '',\n durationMs: 0,\n statusCode: res.statusCode,\n timestamp: new Date(endTimeMs).toISOString(),\n };\n return fallbackLog;\n }\n\n const request = state.request;\n const resolvedRequestId = resolveFinalRequestId(\n config,\n request.requestId || ctx.requestId,\n res.headers,\n );\n request.requestId = resolvedRequestId;\n ctx.requestId = resolvedRequestId;\n const capture = resolveCapture(config.capture, state.captureOverride);\n const redaction = resolveRedaction(config.redaction, state.redactionOverride);\n\n const route = request.route;\n const url = sanitizeLogString(request.url);\n const log: RequestLog = {\n requestId: resolvedRequestId,\n traceId: state.span?.spanContext().traceId,\n spanId: state.span?.spanContext().spanId,\n serviceName: config.serviceName,\n method: request.method,\n url: url,\n route: route,\n statusCode: res.statusCode,\n durationMs: Math.max(0, endTimeMs - request.startTimeMs),\n requestHeaders: capture.requestHeaders ? sanitizeHeaderValues(request.headers) : undefined,\n responseHeaders: capture.responseHeaders ? sanitizeHeaderValues(res.headers) : undefined,\n requestBody: capture.requestBody === 'none' ? undefined : request.body,\n responseBody: capture.responseBody === 'none' ? undefined : res.body,\n userId: state.userId ?? undefined,\n sessionId: state.sessionId ?? undefined,\n error: buildError(err ?? state.error),\n attributes: Object.keys(state.attributes).length > 0 ? { ...state.attributes } : undefined,\n timestamp: new Date(endTimeMs).toISOString(),\n };\n\n const redacted = applyRedaction(redaction, log);\n if (redacted.route && config.route.normalize) {\n const normalized = config.route.normalizer\n ? config.route.normalizer(redacted.route)\n : normalizeRoutePattern(redacted.route);\n redacted.route = normalized;\n }\n const span = state.span;\n if (span) {\n try {\n const clientAddressHeaders = redactHeaders(request.headers, redaction);\n setRequestAttributes(\n span,\n {\n ...request,\n headers: clientAddressHeaders,\n redactionReplacement: redaction.replacement,\n },\n redacted.url,\n );\n setRequestIdAttribute(span, redacted.requestId);\n span.setAttribute('service.name', config.serviceName);\n if (redacted.statusCode != null) {\n setResponseStatusAttribute(span, redacted.statusCode);\n }\n if (redacted.route) {\n setRouteAttribute(span, redacted.route);\n span.updateName(`${request.method} ${redacted.route}`);\n } else {\n span.updateName(spanNameFromRequest(request));\n }\n if (redacted.requestHeaders) {\n setHeaderAttributes(span, redacted.requestHeaders, 'http.request.header.');\n }\n if (redacted.responseHeaders) {\n setHeaderAttributes(span, redacted.responseHeaders, 'http.response.header.');\n }\n if (redacted.requestBody) {\n setRequestBodyAttributes(span, redacted.requestBody);\n setRequestBodySizeAttribute(span, redacted.requestBody.bytes);\n }\n if (redacted.responseBody) {\n setResponseBodyAttributes(span, redacted.responseBody);\n setResponseBodySizeAttribute(span, redacted.responseBody.bytes);\n }\n if (state.userId) {\n setUserIdAttribute(span, state.userId);\n }\n if (err ?? state.error) {\n spanStatusFromError(span, err ?? state.error);\n }\n span.end();\n } catch (spanErr) {\n logWithLevel(config.logger, 'warn', config.logLevel, 'xray: span finalize failed', {\n error: spanErr instanceof Error ? spanErr.message : String(spanErr),\n });\n }\n }\n\n return redacted;\n}\n\nfunction resolveFinalRequestId(\n config: ResolvedXrayConfig,\n explicitRequestId: string | undefined,\n responseHeaders?: Record<string, string | string[]>,\n): string {\n const explicit = normalizeRequestIdCandidate(explicitRequestId);\n if (explicit) {\n return explicit;\n }\n const headerValue = resolveHeaderRequestId(config.requestId.header, responseHeaders);\n if (headerValue) {\n return headerValue;\n }\n return generateRequestId();\n}\n\nfunction resolveHeaderRequestId(\n headerName: string,\n headers?: Record<string, string | string[]>,\n): string | undefined {\n if (!headers) {\n return undefined;\n }\n const target = headerName.toLowerCase();\n for (const [name, value] of Object.entries(headers)) {\n if (name.toLowerCase() !== target) {\n continue;\n }\n const entry = Array.isArray(value) ? value[0] : value;\n const normalized = normalizeRequestIdCandidate(entry);\n if (normalized) {\n return normalized;\n }\n }\n return undefined;\n}\n\nfunction normalizeRequestIdCandidate(value: string | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed ? trimmed : undefined;\n}\n\nfunction resolveCapture(base: CaptureConfig, override?: Partial<CaptureConfig>): CaptureConfig {\n if (!override) {\n return base;\n }\n return {\n ...base,\n ...override,\n };\n}\n\nfunction resolveRedaction(\n base: RedactionConfig,\n override?: Partial<RedactionConfig>,\n): RedactionConfig {\n const merged: RedactionConfig = {\n ...base,\n ...override,\n };\n\n merged.headers = normalizeLowercaseList(merged.headers);\n merged.queryParams = normalizeLowercaseList(merged.queryParams);\n merged.bodyJsonPaths = normalizeList(merged.bodyJsonPaths);\n merged.replacement = merged.replacement || base.replacement;\n\n return merged;\n}\n\nfunction normalizeLowercaseList(values: string[] | undefined): string[] {\n if (!values) {\n return [];\n }\n return values.map((entry) => entry.trim().toLowerCase()).filter(Boolean);\n}\n\nfunction normalizeList(values: string[] | undefined): string[] {\n if (!values) {\n return [];\n }\n return values.map((entry) => entry.trim()).filter(Boolean);\n}\n\nfunction buildError(err?: unknown): RequestLog['error'] {\n if (!err) {\n return undefined;\n }\n if (err instanceof Error) {\n return {\n message: err.message || 'Error',\n type: err.name || 'Error',\n stack: err.stack,\n };\n }\n return {\n message: String(err),\n };\n}\n\nfunction spanNameFromRequest(req: NormalizedRequest): string {\n const method = req.method || 'GET';\n if (req.route) {\n return `${method} ${req.route}`;\n }\n const path = safePath(req.url);\n return `${method} ${path}`;\n}\n\nfunction safePath(url: string): string {\n try {\n const parsed = new URL(url);\n return parsed.pathname || '/';\n } catch {\n const rawPath = url.split('?')[0] || '/';\n return rawPath || '/';\n }\n}\n\nexport function captureBody(\n bytes: Uint8Array | undefined,\n totalBytes: number,\n truncated: boolean,\n mode: 'text' | 'base64' | 'none',\n): ReturnType<typeof makeCapturedBody> {\n if (mode === 'none') {\n return undefined;\n }\n return makeCapturedBody(bytes, totalBytes, truncated, mode === 'text' ? 'text' : 'base64');\n}\n\nexport function captureResponseBody(\n bytes: Uint8Array | undefined,\n totalBytes: number,\n truncated: boolean,\n mode: 'text' | 'base64' | 'none',\n): ReturnType<typeof makeCapturedBody> {\n if (mode === 'none') {\n return undefined;\n }\n return makeCapturedBody(bytes, totalBytes, truncated, mode === 'text' ? 'text' : 'base64');\n}\n"],"mappings":"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","names":["maybeBuffer","maxChunkBytes","chunkToEncodedLength","encodedLengthToChunk","maxEncodedChunk","state","resolvedRequestId"]}
package/dist/index.js CHANGED
@@ -101,8 +101,8 @@ function extractParamName(value) {
101
101
  var defaultCapture = {
102
102
  requestHeaders: true,
103
103
  responseHeaders: true,
104
- requestBody: "none",
105
- responseBody: "none",
104
+ requestBody: "text",
105
+ responseBody: "text",
106
106
  maxBodyBytes: 65536
107
107
  };
108
108
  var defaultRedaction = {
@@ -1004,7 +1004,7 @@ function createSpanProcessor(mode, exporter) {
1004
1004
  }
1005
1005
  function sdkVersion() {
1006
1006
  if (true) {
1007
- return "0.6.0";
1007
+ return "0.7.0";
1008
1008
  }
1009
1009
  return "unknown";
1010
1010
  }
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/attributes.ts","../src/attrkey.ts","../src/otel.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 /**\n * Response header name to read request IDs from. This is normalized to\n * lowercase during configuration.\n */\n header: string;\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 /**\n * Request ID resolution settings. The header is read from response headers at\n * the end of the request.\n */\n requestId?: Partial<RequestIdConfig>;\n 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: 'request-id',\n};\n\nconst defaultRoute: RouteConfig = {\n normalize: true,\n normalizer: normalizeRoutePattern,\n};\n\nconst defaultExporterBase: Omit<ExporterConfig, 'endpointUrl'> = {\n headers: {},\n timeoutMs: 30000,\n spanProcessor: 'batch',\n};\n\nexport class XrayConfigError extends Error {\n code: 'INVALID_CONFIG' | 'INVALID_REDACTION';\n\n constructor(code: XrayConfigError['code'], message: string) {\n super(message);\n this.code = code;\n }\n}\n\nexport function normalizeConfig(config: XrayConfig): ResolvedXrayConfig {\n if (!config || !config.serviceName || !config.serviceName.trim()) {\n throw new XrayConfigError('INVALID_CONFIG', 'serviceName is required');\n }\n\n const logger = config.logger ?? console;\n const logLevel = config.logLevel ?? 'warn';\n\n const capture = normalizeCapture(config.capture);\n const redaction = normalizeRedaction(config.redaction);\n const requestId = normalizeRequestId(config.requestId);\n const route = normalizeRoute(config.route);\n const exporter = normalizeExporter(config.endpointUrl, config.exporter);\n\n return {\n serviceName: config.serviceName.trim(),\n environment: config.environment?.trim() || undefined,\n version: config.version?.trim() || undefined,\n logger,\n logLevel,\n exporter,\n capture,\n redaction,\n requestId,\n route,\n };\n}\n\nfunction normalizeCapture(cfg?: Partial<CaptureConfig>): CaptureConfig {\n const capture: CaptureConfig = {\n ...defaultCapture,\n ...cfg,\n };\n\n if (!['none', 'text', 'base64'].includes(capture.requestBody)) {\n throw new XrayConfigError(\n 'INVALID_CONFIG',\n 'capture.requestBody must be none, text, or base64',\n );\n }\n if (!['none', 'text', 'base64'].includes(capture.responseBody)) {\n throw new XrayConfigError(\n 'INVALID_CONFIG',\n 'capture.responseBody must be none, text, or base64',\n );\n }\n if (!Number.isFinite(capture.maxBodyBytes) || capture.maxBodyBytes < 0) {\n throw new XrayConfigError('INVALID_CONFIG', 'capture.maxBodyBytes must be >= 0');\n }\n\n return capture;\n}\n\nfunction normalizeRedaction(cfg?: Partial<RedactionConfig>): RedactionConfig {\n const redaction: RedactionConfig = {\n ...defaultRedaction,\n ...cfg,\n };\n\n redaction.headers = normalizeStringList(redaction.headers);\n redaction.queryParams = normalizeStringList(redaction.queryParams);\n redaction.bodyJsonPaths = normalizeStringList(redaction.bodyJsonPaths);\n redaction.replacement = redaction.replacement || defaultRedaction.replacement;\n\n if (!redaction.replacement) {\n throw new XrayConfigError('INVALID_REDACTION', 'redaction.replacement must be non-empty');\n }\n\n return redaction;\n}\n\nfunction normalizeRequestId(cfg?: Partial<RequestIdConfig>): RequestIdConfig {\n const requestId: RequestIdConfig = {\n ...defaultRequestId,\n ...cfg,\n };\n\n requestId.header = requestId.header.trim().toLowerCase();\n if (!requestId.header) {\n throw new XrayConfigError('INVALID_CONFIG', 'requestId.header must be non-empty');\n }\n\n return requestId;\n}\n\nfunction normalizeRoute(cfg?: Partial<RouteConfig>): RouteConfig {\n const route: RouteConfig = {\n ...defaultRoute,\n ...cfg,\n };\n\n if (route.normalize && !route.normalizer) {\n route.normalizer = normalizeRoutePattern;\n }\n\n return route;\n}\n\nfunction normalizeExporter(\n endpointUrl: string | undefined,\n cfg?: Partial<ExporterConfig>,\n): ExporterConfig {\n const resolvedEndpoint = normalizeExporterEndpoint(cfg?.endpointUrl ?? endpointUrl);\n const rawHeaders = cfg?.headers ?? defaultExporterBase.headers ?? {};\n const parsed = applyEndpointAuth(resolvedEndpoint, rawHeaders);\n const exporter: ExporterConfig = {\n endpointUrl: parsed.endpointUrl,\n headers: parsed.headers,\n timeoutMs: cfg?.timeoutMs ?? defaultExporterBase.timeoutMs,\n spanProcessor: cfg?.spanProcessor ?? defaultExporterBase.spanProcessor,\n };\n\n return exporter;\n}\n\nfunction normalizeExporterEndpoint(endpointUrl: string | undefined): string {\n const envUrl =\n typeof process !== 'undefined' ? process.env?.['STAINLESS_XRAY_ENDPOINT_URL'] : undefined;\n const resolved = endpointUrl ?? envUrl;\n if (!resolved || !resolved.trim()) {\n throw new XrayConfigError(\n 'INVALID_CONFIG',\n 'endpointUrl is required (set endpointUrl or STAINLESS_XRAY_ENDPOINT_URL)',\n );\n }\n const trimmed = resolved.trim();\n const withoutTrailingSlash = trimmed.endsWith('/') ? trimmed.slice(0, -1) : trimmed;\n if (withoutTrailingSlash.endsWith('/v1/traces')) {\n return withoutTrailingSlash;\n }\n return `${withoutTrailingSlash}/v1/traces`;\n}\n\nfunction normalizeStringList(values: string[] | undefined): string[] {\n if (!values) {\n return [];\n }\n return values.map((entry) => entry.trim()).filter(Boolean);\n}\n\nconst textEncoder = typeof TextEncoder !== 'undefined' ? new TextEncoder() : null;\nconst maybeBuffer = (\n globalThis as typeof globalThis & {\n Buffer?: { from(data: string, encoding?: string): Uint8Array };\n }\n).Buffer;\n\nfunction applyEndpointAuth(\n endpointUrl: string,\n headers: Record<string, string> | undefined,\n): { endpointUrl: string; headers: Record<string, string> } {\n const resolvedHeaders = headers ?? {};\n let url: URL;\n try {\n url = new URL(endpointUrl);\n } catch {\n return { endpointUrl, headers: resolvedHeaders };\n }\n\n const username = decodeUserInfo(url.username);\n const password = decodeUserInfo(url.password);\n if (!username && !password) {\n return { endpointUrl, headers: resolvedHeaders };\n }\n\n url.username = '';\n url.password = '';\n const sanitizedUrl = url.toString();\n\n if (hasAuthorizationHeader(resolvedHeaders)) {\n return { endpointUrl: sanitizedUrl, headers: resolvedHeaders };\n }\n\n const authorization = encodeBasicAuth(username, password);\n if (!authorization) {\n return { endpointUrl: sanitizedUrl, headers: resolvedHeaders };\n }\n\n return {\n endpointUrl: sanitizedUrl,\n headers: {\n ...resolvedHeaders,\n Authorization: authorization,\n },\n };\n}\n\nfunction decodeUserInfo(value: string): string {\n if (!value) {\n return value;\n }\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n}\n\nfunction hasAuthorizationHeader(headers: Record<string, string>): boolean {\n return Object.keys(headers).some((key) => key.toLowerCase() === 'authorization');\n}\n\nfunction encodeBasicAuth(username: string, password: string): string | undefined {\n const raw = `${username}:${password}`;\n let bytes: Uint8Array | undefined;\n if (textEncoder) {\n bytes = textEncoder.encode(raw);\n } else if (maybeBuffer) {\n bytes = maybeBuffer.from(raw, 'utf8');\n }\n if (!bytes) {\n return undefined;\n }\n const encoded = encodeBase64(bytes);\n if (!encoded) {\n return undefined;\n }\n return `Basic ${encoded}`;\n}\n","const headerNameCompactor = /[-_.]/g;\nconst headerTokenSplitter = /[-_.]/;\n\ntype HeaderRedactionMatcher = {\n exactSensitive: Set<string>;\n keywordTokens: Set<string>;\n keywordCompacted: string[];\n};\n\nconst defaultHeaderMatcher = newHeaderRedactionMatcher(\n defaultSensitiveHeaderNames(),\n defaultSensitiveKeywords(),\n);\n\nexport function authSchemePrefix(value: string): string {\n if (!value) {\n return '';\n }\n\n const lower = value.toLowerCase();\n if (lower.startsWith('basic')) {\n return value.slice(0, 'basic'.length);\n }\n if (lower.startsWith('bearer')) {\n return value.slice(0, 'bearer'.length);\n }\n if (lower.startsWith('digest')) {\n return value.slice(0, 'digest'.length);\n }\n if (lower.startsWith('negotiate')) {\n return value.slice(0, 'negotiate'.length);\n }\n return '';\n}\n\nexport function redactCookieValue(value: string, replacement: string): string {\n if (!value) {\n return replacement;\n }\n\n const parts = value.split(';');\n const redacted: string[] = [];\n\n for (const part of parts) {\n const segment = part.trim();\n if (!segment) {\n redacted.push(replacement);\n continue;\n }\n const idx = segment.indexOf('=');\n if (idx <= 0) {\n redacted.push(replacement);\n continue;\n }\n const name = segment.slice(0, idx);\n if (!name) {\n redacted.push(replacement);\n continue;\n }\n redacted.push(`${name}=${replacement}`);\n }\n\n return redacted.join('; ');\n}\n\nexport function redactSetCookieValue(value: string, replacement: string): string {\n if (!value) {\n return replacement;\n }\n\n const parts = value.split(';');\n const first = parts.shift() ?? '';\n const idx = first.indexOf('=');\n if (idx <= 0) {\n return replacement;\n }\n const name = first.slice(0, idx);\n if (!name) {\n return replacement;\n }\n\n const redacted = `${name}=${replacement}`;\n if (parts.length === 0) {\n return redacted;\n }\n return `${redacted};${parts.join(';')}`;\n}\n\nexport function isSensitiveHeaderName(key: string): boolean {\n return isSensitiveNormalized(defaultHeaderMatcher, normalizeHeaderName(key));\n}\n\nfunction addSensitiveHeaderNames(target: Set<string>, headers: string[]): void {\n for (const header of headers) {\n const normalized = normalizeHeaderName(header);\n if (normalized) {\n target.add(normalized);\n }\n }\n}\n\nfunction buildKeywordSets(keywords: string[]): { compacted: string[]; tokens: Set<string> } {\n const tokens = new Set<string>();\n const compacted = new Set<string>();\n\n for (const keyword of keywords) {\n const normalized = normalizeHeaderName(keyword);\n if (!normalized) {\n continue;\n }\n const compactedKeyword = compactNormalizedHeaderName(normalized);\n if (compactedKeyword) {\n compacted.add(compactedKeyword);\n }\n if (!normalized.includes('-') && !normalized.includes('_') && !normalized.includes('.')) {\n tokens.add(normalized);\n }\n }\n\n return {\n compacted: Array.from(compacted).sort(),\n tokens,\n };\n}\n\nfunction compactNormalizedHeaderName(normalized: string): string {\n if (!normalized) {\n return '';\n }\n return normalized.replace(headerNameCompactor, '');\n}\n\nfunction defaultSensitiveHeaderNames(): string[] {\n return [\n 'authorization',\n 'cookie',\n 'proxy-authenticate',\n 'proxy-authorization',\n 'set-cookie',\n 'www-authenticate',\n ];\n}\n\nfunction defaultSensitiveKeywords(): string[] {\n return [\n 'api-key',\n 'api_key',\n 'apikey',\n 'auth',\n 'authenticate',\n 'authorization',\n 'credential',\n 'password',\n 'passwd',\n 'private-key',\n 'private_key',\n 'privatekey',\n 'secret',\n 'session',\n 'sessionid',\n 'signature',\n 'token',\n ];\n}\n\nfunction headerNameTokens(name: string): string[] {\n if (!name) {\n return [];\n }\n return name.split(headerTokenSplitter).filter(Boolean);\n}\n\nfunction hasKeywordToken(tokens: string[], keywordTokens: Set<string>): boolean {\n for (const token of tokens) {\n if (keywordTokens.has(token)) {\n return true;\n }\n }\n return false;\n}\n\nfunction isExactMatch(normalized: string, exactSensitive: Set<string>): boolean {\n return exactSensitive.has(normalized);\n}\n\nfunction isSensitiveNormalized(matcher: HeaderRedactionMatcher, normalized: string): boolean {\n if (!normalized) {\n return false;\n }\n if (isExactMatch(normalized, matcher.exactSensitive)) {\n return true;\n }\n if (hasKeywordToken(headerNameTokens(normalized), matcher.keywordTokens)) {\n return true;\n }\n return matchesCompacted(normalized, matcher.keywordCompacted);\n}\n\nfunction matchesCompacted(normalized: string, keywordCompacted: string[]): boolean {\n if (keywordCompacted.length === 0) {\n return false;\n }\n const compacted = compactNormalizedHeaderName(normalized);\n if (!compacted) {\n return false;\n }\n return keywordCompacted.some((keyword) => compacted.includes(keyword));\n}\n\nfunction newHeaderRedactionMatcher(names: string[], keywords: string[]): HeaderRedactionMatcher {\n const exactSensitive = new Set<string>();\n addSensitiveHeaderNames(exactSensitive, names);\n const { compacted, tokens } = buildKeywordSets(keywords);\n return {\n exactSensitive,\n keywordCompacted: compacted,\n keywordTokens: tokens,\n };\n}\n\nfunction normalizeHeaderName(name: string): string {\n return name.trim().toLowerCase();\n}\n","import type { CapturedBody, RequestLog } from './types';\nimport { authSchemePrefix, redactCookieValue, redactSetCookieValue } from './header_redaction';\n\nexport function applyRedaction(\n config: {\n headers: string[];\n queryParams: string[];\n bodyJsonPaths: string[];\n replacement: string;\n },\n log: RequestLog,\n): RequestLog {\n const redacted = { ...log };\n\n if (redacted.requestHeaders) {\n redacted.requestHeaders = redactHeaders(redacted.requestHeaders, config);\n }\n if (redacted.responseHeaders) {\n redacted.responseHeaders = redactHeaders(redacted.responseHeaders, config);\n }\n\n redacted.url = redactUrl(redacted.url, config);\n\n if (redacted.requestBody) {\n redacted.requestBody = redactBody(redacted.requestBody, redacted.requestHeaders, config);\n }\n if (redacted.responseBody) {\n redacted.responseBody = redactBody(redacted.responseBody, redacted.responseHeaders, config);\n }\n\n return redacted;\n}\n\nexport function redactHeaders(\n headers: Record<string, string | string[]>,\n config: { headers: string[]; replacement: string },\n): Record<string, string | string[]> {\n const list = new Set(config.headers.map((name) => name.toLowerCase()));\n const result: Record<string, string | string[]> = {};\n\n for (const [name, value] of Object.entries(headers)) {\n const lower = name.toLowerCase();\n if (!list.has(lower)) {\n result[name] = value;\n continue;\n }\n\n const redactValue = (entry: string) => redactHeaderValue(lower, entry, config.replacement);\n if (Array.isArray(value)) {\n result[name] = value.map(redactValue);\n } else {\n result[name] = redactValue(value);\n }\n }\n\n return result;\n}\n\nfunction redactHeaderValue(name: string, value: string, replacement: string): string {\n switch (name) {\n case 'authorization':\n case 'proxy-authorization': {\n const scheme = authSchemePrefix(value);\n if (!scheme) {\n return replacement;\n }\n return `${scheme} ${replacement}`;\n }\n case 'cookie':\n return redactCookieValue(value, replacement);\n case 'set-cookie':\n return redactSetCookieValue(value, replacement);\n default:\n return replacement;\n }\n}\n\nfunction redactUrl(value: string, config: { queryParams: string[]; replacement: string }): string {\n if (!value || config.queryParams.length === 0) {\n return value;\n }\n\n try {\n const parsed = new URL(value);\n const params = parsed.searchParams;\n if (!params || params.size === 0) {\n return value;\n }\n\n const redact = new Set(config.queryParams.map((key) => key.toLowerCase()));\n const next = new URLSearchParams();\n params.forEach((val, key) => {\n if (redact.has(key.toLowerCase())) {\n next.append(key, config.replacement);\n } else {\n next.append(key, val);\n }\n });\n parsed.search = next.toString();\n return parsed.toString();\n } catch {\n return value;\n }\n}\n\nfunction redactBody(\n body: CapturedBody,\n headers: Record<string, string | string[]> | undefined,\n config: { bodyJsonPaths: string[]; replacement: string },\n): CapturedBody {\n if (config.bodyJsonPaths.length === 0) {\n return body;\n }\n if (!body.value || body.encoding !== 'utf8') {\n return body;\n }\n if (!isJsonContentType(headers)) {\n return body;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(body.value);\n } catch {\n return body;\n }\n\n for (const path of config.bodyJsonPaths) {\n const segments = parseJsonPath(path);\n if (!segments) {\n continue;\n }\n redactJsonPath(parsed, segments, config.replacement);\n }\n\n const next = { ...body };\n next.value = JSON.stringify(parsed);\n return next;\n}\n\nfunction isJsonContentType(headers?: Record<string, string | string[]>): boolean {\n if (!headers) {\n return false;\n }\n const contentType = headers['content-type'] || headers['Content-Type'];\n const value = Array.isArray(contentType) ? contentType[0] : contentType;\n if (!value) {\n return false;\n }\n const normalized = value.split(';')[0];\n if (!normalized) {\n return false;\n }\n const trimmed = normalized.trim().toLowerCase();\n return trimmed === 'application/json' || trimmed.endsWith('+json');\n}\n\ntype JsonPathSegment = string | number;\n\nfunction parseJsonPath(path: string): JsonPathSegment[] | null {\n const trimmed = path.trim();\n if (!trimmed) {\n return null;\n }\n\n const normalized = trimmed.startsWith('$.') ? trimmed.slice(2) : trimmed;\n if (!normalized) {\n return null;\n }\n\n const segments: JsonPathSegment[] = [];\n const parts = normalized.split('.');\n for (const part of parts) {\n if (!part) {\n continue;\n }\n let cursor = part;\n const bracketIndex = cursor.indexOf('[');\n if (bracketIndex === -1) {\n segments.push(cursor);\n continue;\n }\n\n const name = cursor.slice(0, bracketIndex);\n if (name) {\n segments.push(name);\n }\n cursor = cursor.slice(bracketIndex);\n const matches = cursor.match(/\\[(\\d+)\\]/g);\n if (!matches) {\n continue;\n }\n for (const match of matches) {\n const indexValue = match.slice(1, -1);\n const index = Number.parseInt(indexValue, 10);\n if (Number.isFinite(index)) {\n segments.push(index);\n }\n }\n }\n\n return segments.length > 0 ? segments : null;\n}\n\nfunction redactJsonPath(value: unknown, segments: JsonPathSegment[], replacement: string): void {\n if (!value || segments.length === 0) {\n return;\n }\n\n let current: unknown = value;\n for (let i = 0; i < segments.length; i += 1) {\n const segment = segments[i];\n if (segment === undefined) {\n return;\n }\n const isLast = i === segments.length - 1;\n\n if (typeof segment === 'number') {\n if (!Array.isArray(current) || segment < 0 || segment >= current.length) {\n return;\n }\n if (isLast) {\n current[segment] = replacement;\n return;\n }\n current = current[segment];\n continue;\n }\n\n if (!current || typeof current !== 'object') {\n return;\n }\n const record = current as Record<string, unknown>;\n if (!(segment in record)) {\n return;\n }\n if (isLast) {\n record[segment] = replacement;\n return;\n }\n current = record[segment];\n }\n}\n","import type { Span } from '@opentelemetry/api';\nimport {\n ATTR_CLIENT_ADDRESS,\n ATTR_HTTP_REQUEST_BODY_SIZE,\n ATTR_HTTP_REQUEST_METHOD,\n ATTR_HTTP_RESPONSE_BODY_SIZE,\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_HTTP_ROUTE,\n ATTR_URL_FULL,\n ATTR_URL_PATH,\n ATTR_USER_ID,\n} from '@opentelemetry/semantic-conventions/incubating';\nimport type { CapturedBody } from './types';\nimport {\n AttributeKeyRequestBody,\n AttributeKeyRequestBodyEncoding,\n AttributeKeyRequestBodyTruncated,\n AttributeKeyRequestID,\n AttributeKeyResponseBody,\n AttributeKeyResponseBodyEncoding,\n AttributeKeyResponseBodyTruncated,\n} from './attrkey';\n\nexport function setHeaderAttributes(\n span: Span,\n headers: Record<string, string | string[]> | undefined,\n prefix: string,\n): void {\n if (!headers) {\n return;\n }\n const keys = Object.keys(headers).sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()));\n for (const key of keys) {\n const values = headers[key];\n if (!values || (Array.isArray(values) && values.length === 0)) {\n continue;\n }\n span.setAttribute(prefix + key.toLowerCase(), Array.isArray(values) ? values : [values]);\n }\n}\n\nexport function setRequestAttributes(\n span: Span,\n request: {\n method: string;\n url?: string;\n headers?: Record<string, string | string[]>;\n remoteAddress?: string;\n redactionReplacement?: string;\n },\n urlFull: string | undefined,\n): void {\n span.setAttribute(ATTR_HTTP_REQUEST_METHOD, request.method);\n const effectiveUrl = urlFull ?? request.url;\n if (effectiveUrl) {\n span.setAttribute(ATTR_URL_FULL, effectiveUrl);\n const path = extractPath(effectiveUrl);\n if (path) {\n span.setAttribute(ATTR_URL_PATH, path);\n }\n }\n const clientAddress = clientAddressForRequest(\n request.headers,\n request.remoteAddress,\n request.redactionReplacement,\n );\n if (clientAddress) {\n span.setAttribute(ATTR_CLIENT_ADDRESS, clientAddress);\n }\n}\n\nfunction extractPath(url: string): string | undefined {\n try {\n return new URL(url).pathname;\n } catch {\n // If not a full URL, try to extract path directly\n const match = url.match(/^[^?#]*/);\n return match?.[0] || undefined;\n }\n}\n\nfunction clientAddressForRequest(\n headers?: Record<string, string | string[]>,\n remoteAddress?: string,\n redactionReplacement?: string,\n): string | undefined {\n const forwarded = forwardedClientAddress(\n headerValues(headers, 'forwarded'),\n redactionReplacement,\n );\n if (forwarded) {\n return forwarded;\n }\n const xForwarded = xForwardedForClientAddress(\n headerValues(headers, 'x-forwarded-for'),\n redactionReplacement,\n );\n if (xForwarded) {\n return xForwarded;\n }\n const xRealIp = xRealIpClientAddress(headerValues(headers, 'x-real-ip'), redactionReplacement);\n if (xRealIp) {\n return xRealIp;\n }\n if (!remoteAddress) {\n return undefined;\n }\n return remoteAddrHost(remoteAddress);\n}\n\nfunction forwardedClientAddress(\n values: string[],\n redactionReplacement?: string,\n): string | undefined {\n for (const value of values) {\n if (!value) {\n continue;\n }\n const entries = value.split(',');\n for (const entry of entries) {\n const params = entry.split(';');\n for (const param of params) {\n const [rawKey, ...rest] = param.split('=');\n if (!rawKey) {\n continue;\n }\n if (rawKey.trim().toLowerCase() !== 'for') {\n continue;\n }\n const rawValue = rest.join('=').trim();\n const normalized = normalizeKnownAddress(rawValue, redactionReplacement);\n if (normalized) {\n return normalized;\n }\n }\n }\n }\n return undefined;\n}\n\nfunction xForwardedForClientAddress(\n values: string[],\n redactionReplacement?: string,\n): string | undefined {\n for (const value of values) {\n if (!value) {\n continue;\n }\n const entries = value.split(',');\n for (const entry of entries) {\n const normalized = normalizeKnownAddress(entry, redactionReplacement);\n if (normalized) {\n return normalized;\n }\n }\n }\n return undefined;\n}\n\nfunction xRealIpClientAddress(values: string[], redactionReplacement?: string): string | undefined {\n for (const value of values) {\n if (!value) {\n continue;\n }\n const normalized = normalizeKnownAddress(value, redactionReplacement);\n if (normalized) {\n return normalized;\n }\n }\n return undefined;\n}\n\nfunction normalizeKnownAddress(value: string, redactionReplacement?: string): string | undefined {\n const normalized = normalizeAddress(value, redactionReplacement);\n if (!normalized) {\n return undefined;\n }\n if (normalized.toLowerCase() === 'unknown') {\n return undefined;\n }\n return normalized;\n}\n\nfunction normalizeAddress(value: string, redactionReplacement?: string): string | undefined {\n if (!value) {\n return undefined;\n }\n let trimmed = value.trim();\n if (!trimmed) {\n return undefined;\n }\n if (redactionReplacement && trimmed === redactionReplacement) {\n return undefined;\n }\n if (trimmed.startsWith('\"') && trimmed.endsWith('\"') && trimmed.length > 1) {\n trimmed = trimmed.slice(1, -1).trim();\n }\n if (!trimmed) {\n return undefined;\n }\n if (trimmed.startsWith('[')) {\n const end = trimmed.indexOf(']');\n if (end !== -1) {\n return trimmed.slice(1, end);\n }\n }\n // If there's exactly one colon, treat it as host:port. More than one likely means IPv6.\n const colonCount = (trimmed.match(/:/g) ?? []).length;\n if (colonCount === 1) {\n const host = trimmed.split(':')[0];\n return host || undefined;\n }\n return trimmed;\n}\n\nfunction remoteAddrHost(value: string): string | undefined {\n return normalizeAddress(value);\n}\n\nfunction headerValues(\n headers: Record<string, string | string[]> | undefined,\n name: string,\n): string[] {\n if (!headers) {\n return [];\n }\n const target = name.toLowerCase();\n const values: string[] = [];\n for (const [key, value] of Object.entries(headers)) {\n if (key.toLowerCase() !== target) {\n continue;\n }\n if (Array.isArray(value)) {\n values.push(...value);\n } else {\n values.push(value);\n }\n }\n return values;\n}\n\nexport function setRequestBodyAttributes(span: Span, body: CapturedBody): void {\n if (!body.value) {\n return;\n }\n span.setAttribute(AttributeKeyRequestBody, body.value);\n span.setAttribute(AttributeKeyRequestBodyEncoding, body.encoding);\n if (body.truncated) {\n span.setAttribute(AttributeKeyRequestBodyTruncated, true);\n }\n}\n\nexport function setRequestBodySizeAttribute(span: Span, size: number): void {\n span.setAttribute(ATTR_HTTP_REQUEST_BODY_SIZE, size);\n}\n\nexport function setResponseBodyAttributes(span: Span, body: CapturedBody): void {\n if (!body.value) {\n return;\n }\n span.setAttribute(AttributeKeyResponseBody, body.value);\n span.setAttribute(AttributeKeyResponseBodyEncoding, body.encoding);\n if (body.truncated) {\n span.setAttribute(AttributeKeyResponseBodyTruncated, true);\n }\n}\n\nexport function setResponseBodySizeAttribute(span: Span, size: number): void {\n span.setAttribute(ATTR_HTTP_RESPONSE_BODY_SIZE, size);\n}\n\nexport function setResponseStatusAttribute(span: Span, statusCode: number): void {\n span.setAttribute(ATTR_HTTP_RESPONSE_STATUS_CODE, statusCode);\n}\n\nexport function setRouteAttribute(span: Span, route: string | undefined): void {\n if (route) {\n span.setAttribute(ATTR_HTTP_ROUTE, route);\n }\n}\n\nexport function setUserIdAttribute(span: Span, userId: string): void {\n span.setAttribute(ATTR_USER_ID, userId);\n}\n\nexport function 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","import type { SpanExporter } from '@opentelemetry/sdk-trace-base';\nimport type { XrayConfig, ResolvedXrayConfig, CaptureConfig, RedactionConfig } from './config';\nimport { XrayConfigError, normalizeConfig } from './config';\nimport { logWithLevel } from './logger';\nimport { applyRedaction, redactHeaders } from './redaction';\nimport { makeCapturedBody, sanitizeHeaderValues, sanitizeLogString } from './request_log';\nimport {\n setHeaderAttributes,\n setRequestAttributes,\n setRequestBodyAttributes,\n setRequestBodySizeAttribute,\n setRequestIdAttribute,\n setResponseBodyAttributes,\n setResponseBodySizeAttribute,\n setResponseStatusAttribute,\n setRouteAttribute,\n setUserIdAttribute,\n} from './attributes';\nimport {\n createTracerProvider,\n spanFromTracer,\n spanStatusFromError,\n tracerFromProvider,\n} from './otel';\nimport { normalizeRoutePattern } from './route';\nimport { generateRequestId } from './uuid';\nimport { bindContext, getContextState, type RequestState } from './state';\nimport type {\n AttributeValue,\n NormalizedRequest,\n NormalizedResponse,\n RequestLog,\n XrayContext,\n XrayEmitter,\n} from './types';\n\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 explicitRequestId = normalizeRequestIdCandidate(req.requestId);\n req.requestId = explicitRequestId;\n\n if (req.route && config.route.normalize) {\n req.route = config.route.normalizer\n ? config.route.normalizer(req.route)\n : normalizeRoutePattern(req.route);\n }\n\n const span = spanFromTracer(tracer, spanNameFromRequest(req));\n const context: XrayContext = {\n requestId: explicitRequestId ?? '',\n traceId: span?.spanContext().traceId,\n spanId: span?.spanContext().spanId,\n 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 resolvedRequestId = resolveFinalRequestId(config, ctx.requestId, res.headers);\n ctx.requestId = resolvedRequestId;\n const fallbackLog: RequestLog = {\n requestId: resolvedRequestId,\n serviceName: config.serviceName,\n method: res.statusCode ? 'UNKNOWN' : 'UNKNOWN',\n url: '',\n durationMs: 0,\n statusCode: res.statusCode,\n timestamp: new Date(endTimeMs).toISOString(),\n };\n return fallbackLog;\n }\n\n const request = state.request;\n const resolvedRequestId = resolveFinalRequestId(\n config,\n request.requestId || ctx.requestId,\n res.headers,\n );\n request.requestId = resolvedRequestId;\n ctx.requestId = resolvedRequestId;\n const capture = resolveCapture(config.capture, state.captureOverride);\n const redaction = resolveRedaction(config.redaction, state.redactionOverride);\n\n const route = request.route;\n const url = sanitizeLogString(request.url);\n const log: RequestLog = {\n requestId: resolvedRequestId,\n traceId: state.span?.spanContext().traceId,\n spanId: state.span?.spanContext().spanId,\n serviceName: config.serviceName,\n method: request.method,\n url: url,\n route: route,\n statusCode: res.statusCode,\n durationMs: Math.max(0, endTimeMs - request.startTimeMs),\n requestHeaders: capture.requestHeaders ? sanitizeHeaderValues(request.headers) : undefined,\n responseHeaders: capture.responseHeaders ? sanitizeHeaderValues(res.headers) : undefined,\n requestBody: capture.requestBody === 'none' ? undefined : request.body,\n responseBody: capture.responseBody === 'none' ? undefined : res.body,\n userId: state.userId ?? undefined,\n sessionId: state.sessionId ?? undefined,\n error: buildError(err ?? state.error),\n attributes: Object.keys(state.attributes).length > 0 ? { ...state.attributes } : undefined,\n timestamp: new Date(endTimeMs).toISOString(),\n };\n\n const redacted = applyRedaction(redaction, log);\n if (redacted.route && config.route.normalize) {\n const normalized = config.route.normalizer\n ? config.route.normalizer(redacted.route)\n : normalizeRoutePattern(redacted.route);\n redacted.route = normalized;\n }\n const span = state.span;\n if (span) {\n try {\n const clientAddressHeaders = redactHeaders(request.headers, redaction);\n setRequestAttributes(\n span,\n {\n ...request,\n headers: clientAddressHeaders,\n redactionReplacement: redaction.replacement,\n },\n redacted.url,\n );\n setRequestIdAttribute(span, redacted.requestId);\n span.setAttribute('service.name', config.serviceName);\n if (redacted.statusCode != null) {\n setResponseStatusAttribute(span, redacted.statusCode);\n }\n if (redacted.route) {\n setRouteAttribute(span, redacted.route);\n span.updateName(`${request.method} ${redacted.route}`);\n } else {\n span.updateName(spanNameFromRequest(request));\n }\n if (redacted.requestHeaders) {\n setHeaderAttributes(span, redacted.requestHeaders, 'http.request.header.');\n }\n if (redacted.responseHeaders) {\n setHeaderAttributes(span, redacted.responseHeaders, 'http.response.header.');\n }\n if (redacted.requestBody) {\n setRequestBodyAttributes(span, redacted.requestBody);\n setRequestBodySizeAttribute(span, redacted.requestBody.bytes);\n }\n if (redacted.responseBody) {\n setResponseBodyAttributes(span, redacted.responseBody);\n setResponseBodySizeAttribute(span, redacted.responseBody.bytes);\n }\n if (state.userId) {\n setUserIdAttribute(span, state.userId);\n }\n if (err ?? state.error) {\n spanStatusFromError(span, err ?? state.error);\n }\n span.end();\n } catch (spanErr) {\n logWithLevel(config.logger, 'warn', config.logLevel, 'xray: span finalize failed', {\n error: spanErr instanceof Error ? spanErr.message : String(spanErr),\n });\n }\n }\n\n return redacted;\n}\n\nfunction resolveFinalRequestId(\n config: ResolvedXrayConfig,\n explicitRequestId: string | undefined,\n responseHeaders?: Record<string, string | string[]>,\n): string {\n const explicit = normalizeRequestIdCandidate(explicitRequestId);\n if (explicit) {\n return explicit;\n }\n const headerValue = resolveHeaderRequestId(config.requestId.header, responseHeaders);\n if (headerValue) {\n return headerValue;\n }\n return generateRequestId();\n}\n\nfunction resolveHeaderRequestId(\n headerName: string,\n headers?: Record<string, string | string[]>,\n): string | undefined {\n if (!headers) {\n return undefined;\n }\n const target = headerName.toLowerCase();\n for (const [name, value] of Object.entries(headers)) {\n if (name.toLowerCase() !== target) {\n continue;\n }\n const entry = Array.isArray(value) ? value[0] : value;\n const normalized = normalizeRequestIdCandidate(entry);\n if (normalized) {\n return normalized;\n }\n }\n return undefined;\n}\n\nfunction normalizeRequestIdCandidate(value: string | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed ? trimmed : undefined;\n}\n\nfunction resolveCapture(base: CaptureConfig, override?: Partial<CaptureConfig>): CaptureConfig {\n if (!override) {\n return base;\n }\n return {\n ...base,\n ...override,\n };\n}\n\nfunction resolveRedaction(\n base: RedactionConfig,\n override?: Partial<RedactionConfig>,\n): RedactionConfig {\n const merged: RedactionConfig = {\n ...base,\n ...override,\n };\n\n merged.headers = normalizeLowercaseList(merged.headers);\n merged.queryParams = normalizeLowercaseList(merged.queryParams);\n merged.bodyJsonPaths = normalizeList(merged.bodyJsonPaths);\n merged.replacement = merged.replacement || base.replacement;\n\n return merged;\n}\n\nfunction normalizeLowercaseList(values: string[] | undefined): string[] {\n if (!values) {\n return [];\n }\n return values.map((entry) => entry.trim().toLowerCase()).filter(Boolean);\n}\n\nfunction normalizeList(values: string[] | undefined): string[] {\n if (!values) {\n return [];\n }\n return values.map((entry) => entry.trim()).filter(Boolean);\n}\n\nfunction buildError(err?: unknown): RequestLog['error'] {\n if (!err) {\n return undefined;\n }\n if (err instanceof Error) {\n return {\n message: err.message || 'Error',\n type: err.name || 'Error',\n stack: err.stack,\n };\n }\n return {\n message: String(err),\n };\n}\n\nfunction spanNameFromRequest(req: NormalizedRequest): string {\n const method = req.method || 'GET';\n if (req.route) {\n return `${method} ${req.route}`;\n }\n const path = safePath(req.url);\n return `${method} ${path}`;\n}\n\nfunction safePath(url: string): string {\n try {\n const parsed = new URL(url);\n return parsed.pathname || '/';\n } catch {\n const rawPath = url.split('?')[0] || '/';\n return rawPath || '/';\n }\n}\n\nexport function captureBody(\n bytes: Uint8Array | undefined,\n totalBytes: number,\n truncated: boolean,\n mode: 'text' | 'base64' | 'none',\n): ReturnType<typeof makeCapturedBody> {\n if (mode === 'none') {\n return undefined;\n }\n return makeCapturedBody(bytes, totalBytes, truncated, mode === 'text' ? 'text' : 'base64');\n}\n\nexport function captureResponseBody(\n bytes: Uint8Array | undefined,\n totalBytes: number,\n truncated: boolean,\n mode: 'text' | 'base64' | 'none',\n): ReturnType<typeof makeCapturedBody> {\n if (mode === 'none') {\n return undefined;\n }\n return makeCapturedBody(bytes, totalBytes, truncated, mode === 'text' ? 'text' : 'base64');\n}\n"],"mappings":"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","names":["state","resolvedRequestId"]}
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/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 /**\n * Response header name to read request IDs from. This is normalized to\n * lowercase during configuration.\n */\n header: string;\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 /**\n * Request ID resolution settings. The header is read from response headers at\n * the end of the request.\n */\n requestId?: Partial<RequestIdConfig>;\n 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: 'text',\n responseBody: 'text',\n maxBodyBytes: 65536,\n};\n\nconst defaultRedaction: RedactionConfig = {\n headers: ['authorization', 'cookie', 'set-cookie', 'x-api-key'],\n queryParams: [],\n bodyJsonPaths: [],\n replacement: '[REDACTED]',\n};\n\nconst defaultRequestId: RequestIdConfig = {\n header: 'request-id',\n};\n\nconst defaultRoute: RouteConfig = {\n normalize: true,\n normalizer: normalizeRoutePattern,\n};\n\nconst defaultExporterBase: Omit<ExporterConfig, 'endpointUrl'> = {\n headers: {},\n timeoutMs: 30000,\n spanProcessor: 'batch',\n};\n\nexport class XrayConfigError extends Error {\n code: 'INVALID_CONFIG' | 'INVALID_REDACTION';\n\n constructor(code: XrayConfigError['code'], message: string) {\n super(message);\n this.code = code;\n }\n}\n\nexport function normalizeConfig(config: XrayConfig): ResolvedXrayConfig {\n if (!config || !config.serviceName || !config.serviceName.trim()) {\n throw new XrayConfigError('INVALID_CONFIG', 'serviceName is required');\n }\n\n const logger = config.logger ?? console;\n const logLevel = config.logLevel ?? 'warn';\n\n const capture = normalizeCapture(config.capture);\n const redaction = normalizeRedaction(config.redaction);\n const requestId = normalizeRequestId(config.requestId);\n const route = normalizeRoute(config.route);\n const exporter = normalizeExporter(config.endpointUrl, config.exporter);\n\n return {\n serviceName: config.serviceName.trim(),\n environment: config.environment?.trim() || undefined,\n version: config.version?.trim() || undefined,\n logger,\n logLevel,\n exporter,\n capture,\n redaction,\n requestId,\n route,\n };\n}\n\nfunction normalizeCapture(cfg?: Partial<CaptureConfig>): CaptureConfig {\n const capture: CaptureConfig = {\n ...defaultCapture,\n ...cfg,\n };\n\n if (!['none', 'text', 'base64'].includes(capture.requestBody)) {\n throw new XrayConfigError(\n 'INVALID_CONFIG',\n 'capture.requestBody must be none, text, or base64',\n );\n }\n if (!['none', 'text', 'base64'].includes(capture.responseBody)) {\n throw new XrayConfigError(\n 'INVALID_CONFIG',\n 'capture.responseBody must be none, text, or base64',\n );\n }\n if (!Number.isFinite(capture.maxBodyBytes) || capture.maxBodyBytes < 0) {\n throw new XrayConfigError('INVALID_CONFIG', 'capture.maxBodyBytes must be >= 0');\n }\n\n return capture;\n}\n\nfunction normalizeRedaction(cfg?: Partial<RedactionConfig>): RedactionConfig {\n const redaction: RedactionConfig = {\n ...defaultRedaction,\n ...cfg,\n };\n\n redaction.headers = normalizeStringList(redaction.headers);\n redaction.queryParams = normalizeStringList(redaction.queryParams);\n redaction.bodyJsonPaths = normalizeStringList(redaction.bodyJsonPaths);\n redaction.replacement = redaction.replacement || defaultRedaction.replacement;\n\n if (!redaction.replacement) {\n throw new XrayConfigError('INVALID_REDACTION', 'redaction.replacement must be non-empty');\n }\n\n return redaction;\n}\n\nfunction normalizeRequestId(cfg?: Partial<RequestIdConfig>): RequestIdConfig {\n const requestId: RequestIdConfig = {\n ...defaultRequestId,\n ...cfg,\n };\n\n requestId.header = requestId.header.trim().toLowerCase();\n if (!requestId.header) {\n throw new XrayConfigError('INVALID_CONFIG', 'requestId.header must be non-empty');\n }\n\n return requestId;\n}\n\nfunction normalizeRoute(cfg?: Partial<RouteConfig>): RouteConfig {\n const route: RouteConfig = {\n ...defaultRoute,\n ...cfg,\n };\n\n if (route.normalize && !route.normalizer) {\n route.normalizer = normalizeRoutePattern;\n }\n\n return route;\n}\n\nfunction normalizeExporter(\n endpointUrl: string | undefined,\n cfg?: Partial<ExporterConfig>,\n): ExporterConfig {\n const resolvedEndpoint = normalizeExporterEndpoint(cfg?.endpointUrl ?? endpointUrl);\n const rawHeaders = cfg?.headers ?? defaultExporterBase.headers ?? {};\n const parsed = applyEndpointAuth(resolvedEndpoint, rawHeaders);\n const exporter: ExporterConfig = {\n endpointUrl: parsed.endpointUrl,\n headers: parsed.headers,\n timeoutMs: cfg?.timeoutMs ?? defaultExporterBase.timeoutMs,\n spanProcessor: cfg?.spanProcessor ?? defaultExporterBase.spanProcessor,\n };\n\n return exporter;\n}\n\nfunction normalizeExporterEndpoint(endpointUrl: string | undefined): string {\n const envUrl =\n typeof process !== 'undefined' ? process.env?.['STAINLESS_XRAY_ENDPOINT_URL'] : undefined;\n const resolved = endpointUrl ?? envUrl;\n if (!resolved || !resolved.trim()) {\n throw new XrayConfigError(\n 'INVALID_CONFIG',\n 'endpointUrl is required (set endpointUrl or STAINLESS_XRAY_ENDPOINT_URL)',\n );\n }\n const trimmed = resolved.trim();\n const withoutTrailingSlash = trimmed.endsWith('/') ? trimmed.slice(0, -1) : trimmed;\n if (withoutTrailingSlash.endsWith('/v1/traces')) {\n return withoutTrailingSlash;\n }\n return `${withoutTrailingSlash}/v1/traces`;\n}\n\nfunction normalizeStringList(values: string[] | undefined): string[] {\n if (!values) {\n return [];\n }\n return values.map((entry) => entry.trim()).filter(Boolean);\n}\n\nconst textEncoder = typeof TextEncoder !== 'undefined' ? new TextEncoder() : null;\nconst maybeBuffer = (\n globalThis as typeof globalThis & {\n Buffer?: { from(data: string, encoding?: string): Uint8Array };\n }\n).Buffer;\n\nfunction applyEndpointAuth(\n endpointUrl: string,\n headers: Record<string, string> | undefined,\n): { endpointUrl: string; headers: Record<string, string> } {\n const resolvedHeaders = headers ?? {};\n let url: URL;\n try {\n url = new URL(endpointUrl);\n } catch {\n return { endpointUrl, headers: resolvedHeaders };\n }\n\n const username = decodeUserInfo(url.username);\n const password = decodeUserInfo(url.password);\n if (!username && !password) {\n return { endpointUrl, headers: resolvedHeaders };\n }\n\n url.username = '';\n url.password = '';\n const sanitizedUrl = url.toString();\n\n if (hasAuthorizationHeader(resolvedHeaders)) {\n return { endpointUrl: sanitizedUrl, headers: resolvedHeaders };\n }\n\n const authorization = encodeBasicAuth(username, password);\n if (!authorization) {\n return { endpointUrl: sanitizedUrl, headers: resolvedHeaders };\n }\n\n return {\n endpointUrl: sanitizedUrl,\n headers: {\n ...resolvedHeaders,\n Authorization: authorization,\n },\n };\n}\n\nfunction decodeUserInfo(value: string): string {\n if (!value) {\n return value;\n }\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n}\n\nfunction hasAuthorizationHeader(headers: Record<string, string>): boolean {\n return Object.keys(headers).some((key) => key.toLowerCase() === 'authorization');\n}\n\nfunction encodeBasicAuth(username: string, password: string): string | undefined {\n const raw = `${username}:${password}`;\n let bytes: Uint8Array | undefined;\n if (textEncoder) {\n bytes = textEncoder.encode(raw);\n } else if (maybeBuffer) {\n bytes = maybeBuffer.from(raw, 'utf8');\n }\n if (!bytes) {\n return undefined;\n }\n const encoded = encodeBase64(bytes);\n if (!encoded) {\n return undefined;\n }\n return `Basic ${encoded}`;\n}\n","const headerNameCompactor = /[-_.]/g;\nconst headerTokenSplitter = /[-_.]/;\n\ntype HeaderRedactionMatcher = {\n exactSensitive: Set<string>;\n keywordTokens: Set<string>;\n keywordCompacted: string[];\n};\n\nconst defaultHeaderMatcher = newHeaderRedactionMatcher(\n defaultSensitiveHeaderNames(),\n defaultSensitiveKeywords(),\n);\n\nexport function authSchemePrefix(value: string): string {\n if (!value) {\n return '';\n }\n\n const lower = value.toLowerCase();\n if (lower.startsWith('basic')) {\n return value.slice(0, 'basic'.length);\n }\n if (lower.startsWith('bearer')) {\n return value.slice(0, 'bearer'.length);\n }\n if (lower.startsWith('digest')) {\n return value.slice(0, 'digest'.length);\n }\n if (lower.startsWith('negotiate')) {\n return value.slice(0, 'negotiate'.length);\n }\n return '';\n}\n\nexport function redactCookieValue(value: string, replacement: string): string {\n if (!value) {\n return replacement;\n }\n\n const parts = value.split(';');\n const redacted: string[] = [];\n\n for (const part of parts) {\n const segment = part.trim();\n if (!segment) {\n redacted.push(replacement);\n continue;\n }\n const idx = segment.indexOf('=');\n if (idx <= 0) {\n redacted.push(replacement);\n continue;\n }\n const name = segment.slice(0, idx);\n if (!name) {\n redacted.push(replacement);\n continue;\n }\n redacted.push(`${name}=${replacement}`);\n }\n\n return redacted.join('; ');\n}\n\nexport function redactSetCookieValue(value: string, replacement: string): string {\n if (!value) {\n return replacement;\n }\n\n const parts = value.split(';');\n const first = parts.shift() ?? '';\n const idx = first.indexOf('=');\n if (idx <= 0) {\n return replacement;\n }\n const name = first.slice(0, idx);\n if (!name) {\n return replacement;\n }\n\n const redacted = `${name}=${replacement}`;\n if (parts.length === 0) {\n return redacted;\n }\n return `${redacted};${parts.join(';')}`;\n}\n\nexport function isSensitiveHeaderName(key: string): boolean {\n return isSensitiveNormalized(defaultHeaderMatcher, normalizeHeaderName(key));\n}\n\nfunction addSensitiveHeaderNames(target: Set<string>, headers: string[]): void {\n for (const header of headers) {\n const normalized = normalizeHeaderName(header);\n if (normalized) {\n target.add(normalized);\n }\n }\n}\n\nfunction buildKeywordSets(keywords: string[]): { compacted: string[]; tokens: Set<string> } {\n const tokens = new Set<string>();\n const compacted = new Set<string>();\n\n for (const keyword of keywords) {\n const normalized = normalizeHeaderName(keyword);\n if (!normalized) {\n continue;\n }\n const compactedKeyword = compactNormalizedHeaderName(normalized);\n if (compactedKeyword) {\n compacted.add(compactedKeyword);\n }\n if (!normalized.includes('-') && !normalized.includes('_') && !normalized.includes('.')) {\n tokens.add(normalized);\n }\n }\n\n return {\n compacted: Array.from(compacted).sort(),\n tokens,\n };\n}\n\nfunction compactNormalizedHeaderName(normalized: string): string {\n if (!normalized) {\n return '';\n }\n return normalized.replace(headerNameCompactor, '');\n}\n\nfunction defaultSensitiveHeaderNames(): string[] {\n return [\n 'authorization',\n 'cookie',\n 'proxy-authenticate',\n 'proxy-authorization',\n 'set-cookie',\n 'www-authenticate',\n ];\n}\n\nfunction defaultSensitiveKeywords(): string[] {\n return [\n 'api-key',\n 'api_key',\n 'apikey',\n 'auth',\n 'authenticate',\n 'authorization',\n 'credential',\n 'password',\n 'passwd',\n 'private-key',\n 'private_key',\n 'privatekey',\n 'secret',\n 'session',\n 'sessionid',\n 'signature',\n 'token',\n ];\n}\n\nfunction headerNameTokens(name: string): string[] {\n if (!name) {\n return [];\n }\n return name.split(headerTokenSplitter).filter(Boolean);\n}\n\nfunction hasKeywordToken(tokens: string[], keywordTokens: Set<string>): boolean {\n for (const token of tokens) {\n if (keywordTokens.has(token)) {\n return true;\n }\n }\n return false;\n}\n\nfunction isExactMatch(normalized: string, exactSensitive: Set<string>): boolean {\n return exactSensitive.has(normalized);\n}\n\nfunction isSensitiveNormalized(matcher: HeaderRedactionMatcher, normalized: string): boolean {\n if (!normalized) {\n return false;\n }\n if (isExactMatch(normalized, matcher.exactSensitive)) {\n return true;\n }\n if (hasKeywordToken(headerNameTokens(normalized), matcher.keywordTokens)) {\n return true;\n }\n return matchesCompacted(normalized, matcher.keywordCompacted);\n}\n\nfunction matchesCompacted(normalized: string, keywordCompacted: string[]): boolean {\n if (keywordCompacted.length === 0) {\n return false;\n }\n const compacted = compactNormalizedHeaderName(normalized);\n if (!compacted) {\n return false;\n }\n return keywordCompacted.some((keyword) => compacted.includes(keyword));\n}\n\nfunction newHeaderRedactionMatcher(names: string[], keywords: string[]): HeaderRedactionMatcher {\n const exactSensitive = new Set<string>();\n addSensitiveHeaderNames(exactSensitive, names);\n const { compacted, tokens } = buildKeywordSets(keywords);\n return {\n exactSensitive,\n keywordCompacted: compacted,\n keywordTokens: tokens,\n };\n}\n\nfunction normalizeHeaderName(name: string): string {\n return name.trim().toLowerCase();\n}\n","import type { CapturedBody, RequestLog } from './types';\nimport { authSchemePrefix, redactCookieValue, redactSetCookieValue } from './header_redaction';\n\nexport function applyRedaction(\n config: {\n headers: string[];\n queryParams: string[];\n bodyJsonPaths: string[];\n replacement: string;\n },\n log: RequestLog,\n): RequestLog {\n const redacted = { ...log };\n\n if (redacted.requestHeaders) {\n redacted.requestHeaders = redactHeaders(redacted.requestHeaders, config);\n }\n if (redacted.responseHeaders) {\n redacted.responseHeaders = redactHeaders(redacted.responseHeaders, config);\n }\n\n redacted.url = redactUrl(redacted.url, config);\n\n if (redacted.requestBody) {\n redacted.requestBody = redactBody(redacted.requestBody, redacted.requestHeaders, config);\n }\n if (redacted.responseBody) {\n redacted.responseBody = redactBody(redacted.responseBody, redacted.responseHeaders, config);\n }\n\n return redacted;\n}\n\nexport function redactHeaders(\n headers: Record<string, string | string[]>,\n config: { headers: string[]; replacement: string },\n): Record<string, string | string[]> {\n const list = new Set(config.headers.map((name) => name.toLowerCase()));\n const result: Record<string, string | string[]> = {};\n\n for (const [name, value] of Object.entries(headers)) {\n const lower = name.toLowerCase();\n if (!list.has(lower)) {\n result[name] = value;\n continue;\n }\n\n const redactValue = (entry: string) => redactHeaderValue(lower, entry, config.replacement);\n if (Array.isArray(value)) {\n result[name] = value.map(redactValue);\n } else {\n result[name] = redactValue(value);\n }\n }\n\n return result;\n}\n\nfunction redactHeaderValue(name: string, value: string, replacement: string): string {\n switch (name) {\n case 'authorization':\n case 'proxy-authorization': {\n const scheme = authSchemePrefix(value);\n if (!scheme) {\n return replacement;\n }\n return `${scheme} ${replacement}`;\n }\n case 'cookie':\n return redactCookieValue(value, replacement);\n case 'set-cookie':\n return redactSetCookieValue(value, replacement);\n default:\n return replacement;\n }\n}\n\nfunction redactUrl(value: string, config: { queryParams: string[]; replacement: string }): string {\n if (!value || config.queryParams.length === 0) {\n return value;\n }\n\n try {\n const parsed = new URL(value);\n const params = parsed.searchParams;\n if (!params || params.size === 0) {\n return value;\n }\n\n const redact = new Set(config.queryParams.map((key) => key.toLowerCase()));\n const next = new URLSearchParams();\n params.forEach((val, key) => {\n if (redact.has(key.toLowerCase())) {\n next.append(key, config.replacement);\n } else {\n next.append(key, val);\n }\n });\n parsed.search = next.toString();\n return parsed.toString();\n } catch {\n return value;\n }\n}\n\nfunction redactBody(\n body: CapturedBody,\n headers: Record<string, string | string[]> | undefined,\n config: { bodyJsonPaths: string[]; replacement: string },\n): CapturedBody {\n if (config.bodyJsonPaths.length === 0) {\n return body;\n }\n if (!body.value || body.encoding !== 'utf8') {\n return body;\n }\n if (!isJsonContentType(headers)) {\n return body;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(body.value);\n } catch {\n return body;\n }\n\n for (const path of config.bodyJsonPaths) {\n const segments = parseJsonPath(path);\n if (!segments) {\n continue;\n }\n redactJsonPath(parsed, segments, config.replacement);\n }\n\n const next = { ...body };\n next.value = JSON.stringify(parsed);\n return next;\n}\n\nfunction isJsonContentType(headers?: Record<string, string | string[]>): boolean {\n if (!headers) {\n return false;\n }\n const contentType = headers['content-type'] || headers['Content-Type'];\n const value = Array.isArray(contentType) ? contentType[0] : contentType;\n if (!value) {\n return false;\n }\n const normalized = value.split(';')[0];\n if (!normalized) {\n return false;\n }\n const trimmed = normalized.trim().toLowerCase();\n return trimmed === 'application/json' || trimmed.endsWith('+json');\n}\n\ntype JsonPathSegment = string | number;\n\nfunction parseJsonPath(path: string): JsonPathSegment[] | null {\n const trimmed = path.trim();\n if (!trimmed) {\n return null;\n }\n\n const normalized = trimmed.startsWith('$.') ? trimmed.slice(2) : trimmed;\n if (!normalized) {\n return null;\n }\n\n const segments: JsonPathSegment[] = [];\n const parts = normalized.split('.');\n for (const part of parts) {\n if (!part) {\n continue;\n }\n let cursor = part;\n const bracketIndex = cursor.indexOf('[');\n if (bracketIndex === -1) {\n segments.push(cursor);\n continue;\n }\n\n const name = cursor.slice(0, bracketIndex);\n if (name) {\n segments.push(name);\n }\n cursor = cursor.slice(bracketIndex);\n const matches = cursor.match(/\\[(\\d+)\\]/g);\n if (!matches) {\n continue;\n }\n for (const match of matches) {\n const indexValue = match.slice(1, -1);\n const index = Number.parseInt(indexValue, 10);\n if (Number.isFinite(index)) {\n segments.push(index);\n }\n }\n }\n\n return segments.length > 0 ? segments : null;\n}\n\nfunction redactJsonPath(value: unknown, segments: JsonPathSegment[], replacement: string): void {\n if (!value || segments.length === 0) {\n return;\n }\n\n let current: unknown = value;\n for (let i = 0; i < segments.length; i += 1) {\n const segment = segments[i];\n if (segment === undefined) {\n return;\n }\n const isLast = i === segments.length - 1;\n\n if (typeof segment === 'number') {\n if (!Array.isArray(current) || segment < 0 || segment >= current.length) {\n return;\n }\n if (isLast) {\n current[segment] = replacement;\n return;\n }\n current = current[segment];\n continue;\n }\n\n if (!current || typeof current !== 'object') {\n return;\n }\n const record = current as Record<string, unknown>;\n if (!(segment in record)) {\n return;\n }\n if (isLast) {\n record[segment] = replacement;\n return;\n }\n current = record[segment];\n }\n}\n","import type { Span } from '@opentelemetry/api';\nimport {\n ATTR_CLIENT_ADDRESS,\n ATTR_HTTP_REQUEST_BODY_SIZE,\n ATTR_HTTP_REQUEST_METHOD,\n ATTR_HTTP_RESPONSE_BODY_SIZE,\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n ATTR_HTTP_ROUTE,\n ATTR_URL_FULL,\n ATTR_URL_PATH,\n ATTR_USER_ID,\n} from '@opentelemetry/semantic-conventions/incubating';\nimport type { CapturedBody } from './types';\nimport {\n AttributeKeyRequestBody,\n AttributeKeyRequestBodyEncoding,\n AttributeKeyRequestBodyTruncated,\n AttributeKeyRequestID,\n AttributeKeyResponseBody,\n AttributeKeyResponseBodyEncoding,\n AttributeKeyResponseBodyTruncated,\n} from './attrkey';\n\nexport function setHeaderAttributes(\n span: Span,\n headers: Record<string, string | string[]> | undefined,\n prefix: string,\n): void {\n if (!headers) {\n return;\n }\n const keys = Object.keys(headers).sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()));\n for (const key of keys) {\n const values = headers[key];\n if (!values || (Array.isArray(values) && values.length === 0)) {\n continue;\n }\n span.setAttribute(prefix + key.toLowerCase(), Array.isArray(values) ? values : [values]);\n }\n}\n\nexport function setRequestAttributes(\n span: Span,\n request: {\n method: string;\n url?: string;\n headers?: Record<string, string | string[]>;\n remoteAddress?: string;\n redactionReplacement?: string;\n },\n urlFull: string | undefined,\n): void {\n span.setAttribute(ATTR_HTTP_REQUEST_METHOD, request.method);\n const effectiveUrl = urlFull ?? request.url;\n if (effectiveUrl) {\n span.setAttribute(ATTR_URL_FULL, effectiveUrl);\n const path = extractPath(effectiveUrl);\n if (path) {\n span.setAttribute(ATTR_URL_PATH, path);\n }\n }\n const clientAddress = clientAddressForRequest(\n request.headers,\n request.remoteAddress,\n request.redactionReplacement,\n );\n if (clientAddress) {\n span.setAttribute(ATTR_CLIENT_ADDRESS, clientAddress);\n }\n}\n\nfunction extractPath(url: string): string | undefined {\n try {\n return new URL(url).pathname;\n } catch {\n // If not a full URL, try to extract path directly\n const match = url.match(/^[^?#]*/);\n return match?.[0] || undefined;\n }\n}\n\nfunction clientAddressForRequest(\n headers?: Record<string, string | string[]>,\n remoteAddress?: string,\n redactionReplacement?: string,\n): string | undefined {\n const forwarded = forwardedClientAddress(\n headerValues(headers, 'forwarded'),\n redactionReplacement,\n );\n if (forwarded) {\n return forwarded;\n }\n const xForwarded = xForwardedForClientAddress(\n headerValues(headers, 'x-forwarded-for'),\n redactionReplacement,\n );\n if (xForwarded) {\n return xForwarded;\n }\n const xRealIp = xRealIpClientAddress(headerValues(headers, 'x-real-ip'), redactionReplacement);\n if (xRealIp) {\n return xRealIp;\n }\n if (!remoteAddress) {\n return undefined;\n }\n return remoteAddrHost(remoteAddress);\n}\n\nfunction forwardedClientAddress(\n values: string[],\n redactionReplacement?: string,\n): string | undefined {\n for (const value of values) {\n if (!value) {\n continue;\n }\n const entries = value.split(',');\n for (const entry of entries) {\n const params = entry.split(';');\n for (const param of params) {\n const [rawKey, ...rest] = param.split('=');\n if (!rawKey) {\n continue;\n }\n if (rawKey.trim().toLowerCase() !== 'for') {\n continue;\n }\n const rawValue = rest.join('=').trim();\n const normalized = normalizeKnownAddress(rawValue, redactionReplacement);\n if (normalized) {\n return normalized;\n }\n }\n }\n }\n return undefined;\n}\n\nfunction xForwardedForClientAddress(\n values: string[],\n redactionReplacement?: string,\n): string | undefined {\n for (const value of values) {\n if (!value) {\n continue;\n }\n const entries = value.split(',');\n for (const entry of entries) {\n const normalized = normalizeKnownAddress(entry, redactionReplacement);\n if (normalized) {\n return normalized;\n }\n }\n }\n return undefined;\n}\n\nfunction xRealIpClientAddress(values: string[], redactionReplacement?: string): string | undefined {\n for (const value of values) {\n if (!value) {\n continue;\n }\n const normalized = normalizeKnownAddress(value, redactionReplacement);\n if (normalized) {\n return normalized;\n }\n }\n return undefined;\n}\n\nfunction normalizeKnownAddress(value: string, redactionReplacement?: string): string | undefined {\n const normalized = normalizeAddress(value, redactionReplacement);\n if (!normalized) {\n return undefined;\n }\n if (normalized.toLowerCase() === 'unknown') {\n return undefined;\n }\n return normalized;\n}\n\nfunction normalizeAddress(value: string, redactionReplacement?: string): string | undefined {\n if (!value) {\n return undefined;\n }\n let trimmed = value.trim();\n if (!trimmed) {\n return undefined;\n }\n if (redactionReplacement && trimmed === redactionReplacement) {\n return undefined;\n }\n if (trimmed.startsWith('\"') && trimmed.endsWith('\"') && trimmed.length > 1) {\n trimmed = trimmed.slice(1, -1).trim();\n }\n if (!trimmed) {\n return undefined;\n }\n if (trimmed.startsWith('[')) {\n const end = trimmed.indexOf(']');\n if (end !== -1) {\n return trimmed.slice(1, end);\n }\n }\n // If there's exactly one colon, treat it as host:port. More than one likely means IPv6.\n const colonCount = (trimmed.match(/:/g) ?? []).length;\n if (colonCount === 1) {\n const host = trimmed.split(':')[0];\n return host || undefined;\n }\n return trimmed;\n}\n\nfunction remoteAddrHost(value: string): string | undefined {\n return normalizeAddress(value);\n}\n\nfunction headerValues(\n headers: Record<string, string | string[]> | undefined,\n name: string,\n): string[] {\n if (!headers) {\n return [];\n }\n const target = name.toLowerCase();\n const values: string[] = [];\n for (const [key, value] of Object.entries(headers)) {\n if (key.toLowerCase() !== target) {\n continue;\n }\n if (Array.isArray(value)) {\n values.push(...value);\n } else {\n values.push(value);\n }\n }\n return values;\n}\n\nexport function setRequestBodyAttributes(span: Span, body: CapturedBody): void {\n if (!body.value) {\n return;\n }\n span.setAttribute(AttributeKeyRequestBody, body.value);\n span.setAttribute(AttributeKeyRequestBodyEncoding, body.encoding);\n if (body.truncated) {\n span.setAttribute(AttributeKeyRequestBodyTruncated, true);\n }\n}\n\nexport function setRequestBodySizeAttribute(span: Span, size: number): void {\n span.setAttribute(ATTR_HTTP_REQUEST_BODY_SIZE, size);\n}\n\nexport function setResponseBodyAttributes(span: Span, body: CapturedBody): void {\n if (!body.value) {\n return;\n }\n span.setAttribute(AttributeKeyResponseBody, body.value);\n span.setAttribute(AttributeKeyResponseBodyEncoding, body.encoding);\n if (body.truncated) {\n span.setAttribute(AttributeKeyResponseBodyTruncated, true);\n }\n}\n\nexport function setResponseBodySizeAttribute(span: Span, size: number): void {\n span.setAttribute(ATTR_HTTP_RESPONSE_BODY_SIZE, size);\n}\n\nexport function setResponseStatusAttribute(span: Span, statusCode: number): void {\n span.setAttribute(ATTR_HTTP_RESPONSE_STATUS_CODE, statusCode);\n}\n\nexport function setRouteAttribute(span: Span, route: string | undefined): void {\n if (route) {\n span.setAttribute(ATTR_HTTP_ROUTE, route);\n }\n}\n\nexport function setUserIdAttribute(span: Span, userId: string): void {\n span.setAttribute(ATTR_USER_ID, userId);\n}\n\nexport function 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","import type { SpanExporter } from '@opentelemetry/sdk-trace-base';\nimport type { XrayConfig, ResolvedXrayConfig, CaptureConfig, RedactionConfig } from './config';\nimport { XrayConfigError, normalizeConfig } from './config';\nimport { logWithLevel } from './logger';\nimport { applyRedaction, redactHeaders } from './redaction';\nimport { makeCapturedBody, sanitizeHeaderValues, sanitizeLogString } from './request_log';\nimport {\n setHeaderAttributes,\n setRequestAttributes,\n setRequestBodyAttributes,\n setRequestBodySizeAttribute,\n setRequestIdAttribute,\n setResponseBodyAttributes,\n setResponseBodySizeAttribute,\n setResponseStatusAttribute,\n setRouteAttribute,\n setUserIdAttribute,\n} from './attributes';\nimport {\n createTracerProvider,\n spanFromTracer,\n spanStatusFromError,\n tracerFromProvider,\n} from './otel';\nimport { normalizeRoutePattern } from './route';\nimport { generateRequestId } from './uuid';\nimport { bindContext, getContextState, type RequestState } from './state';\nimport type {\n AttributeValue,\n NormalizedRequest,\n NormalizedResponse,\n RequestLog,\n XrayContext,\n XrayEmitter,\n} from './types';\n\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 explicitRequestId = normalizeRequestIdCandidate(req.requestId);\n req.requestId = explicitRequestId;\n\n if (req.route && config.route.normalize) {\n req.route = config.route.normalizer\n ? config.route.normalizer(req.route)\n : normalizeRoutePattern(req.route);\n }\n\n const span = spanFromTracer(tracer, spanNameFromRequest(req));\n const context: XrayContext = {\n requestId: explicitRequestId ?? '',\n traceId: span?.spanContext().traceId,\n spanId: span?.spanContext().spanId,\n 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 resolvedRequestId = resolveFinalRequestId(config, ctx.requestId, res.headers);\n ctx.requestId = resolvedRequestId;\n const fallbackLog: RequestLog = {\n requestId: resolvedRequestId,\n serviceName: config.serviceName,\n method: res.statusCode ? 'UNKNOWN' : 'UNKNOWN',\n url: '',\n durationMs: 0,\n statusCode: res.statusCode,\n timestamp: new Date(endTimeMs).toISOString(),\n };\n return fallbackLog;\n }\n\n const request = state.request;\n const resolvedRequestId = resolveFinalRequestId(\n config,\n request.requestId || ctx.requestId,\n res.headers,\n );\n request.requestId = resolvedRequestId;\n ctx.requestId = resolvedRequestId;\n const capture = resolveCapture(config.capture, state.captureOverride);\n const redaction = resolveRedaction(config.redaction, state.redactionOverride);\n\n const route = request.route;\n const url = sanitizeLogString(request.url);\n const log: RequestLog = {\n requestId: resolvedRequestId,\n traceId: state.span?.spanContext().traceId,\n spanId: state.span?.spanContext().spanId,\n serviceName: config.serviceName,\n method: request.method,\n url: url,\n route: route,\n statusCode: res.statusCode,\n durationMs: Math.max(0, endTimeMs - request.startTimeMs),\n requestHeaders: capture.requestHeaders ? sanitizeHeaderValues(request.headers) : undefined,\n responseHeaders: capture.responseHeaders ? sanitizeHeaderValues(res.headers) : undefined,\n requestBody: capture.requestBody === 'none' ? undefined : request.body,\n responseBody: capture.responseBody === 'none' ? undefined : res.body,\n userId: state.userId ?? undefined,\n sessionId: state.sessionId ?? undefined,\n error: buildError(err ?? state.error),\n attributes: Object.keys(state.attributes).length > 0 ? { ...state.attributes } : undefined,\n timestamp: new Date(endTimeMs).toISOString(),\n };\n\n const redacted = applyRedaction(redaction, log);\n if (redacted.route && config.route.normalize) {\n const normalized = config.route.normalizer\n ? config.route.normalizer(redacted.route)\n : normalizeRoutePattern(redacted.route);\n redacted.route = normalized;\n }\n const span = state.span;\n if (span) {\n try {\n const clientAddressHeaders = redactHeaders(request.headers, redaction);\n setRequestAttributes(\n span,\n {\n ...request,\n headers: clientAddressHeaders,\n redactionReplacement: redaction.replacement,\n },\n redacted.url,\n );\n setRequestIdAttribute(span, redacted.requestId);\n span.setAttribute('service.name', config.serviceName);\n if (redacted.statusCode != null) {\n setResponseStatusAttribute(span, redacted.statusCode);\n }\n if (redacted.route) {\n setRouteAttribute(span, redacted.route);\n span.updateName(`${request.method} ${redacted.route}`);\n } else {\n span.updateName(spanNameFromRequest(request));\n }\n if (redacted.requestHeaders) {\n setHeaderAttributes(span, redacted.requestHeaders, 'http.request.header.');\n }\n if (redacted.responseHeaders) {\n setHeaderAttributes(span, redacted.responseHeaders, 'http.response.header.');\n }\n if (redacted.requestBody) {\n setRequestBodyAttributes(span, redacted.requestBody);\n setRequestBodySizeAttribute(span, redacted.requestBody.bytes);\n }\n if (redacted.responseBody) {\n setResponseBodyAttributes(span, redacted.responseBody);\n setResponseBodySizeAttribute(span, redacted.responseBody.bytes);\n }\n if (state.userId) {\n setUserIdAttribute(span, state.userId);\n }\n if (err ?? state.error) {\n spanStatusFromError(span, err ?? state.error);\n }\n span.end();\n } catch (spanErr) {\n logWithLevel(config.logger, 'warn', config.logLevel, 'xray: span finalize failed', {\n error: spanErr instanceof Error ? spanErr.message : String(spanErr),\n });\n }\n }\n\n return redacted;\n}\n\nfunction resolveFinalRequestId(\n config: ResolvedXrayConfig,\n explicitRequestId: string | undefined,\n responseHeaders?: Record<string, string | string[]>,\n): string {\n const explicit = normalizeRequestIdCandidate(explicitRequestId);\n if (explicit) {\n return explicit;\n }\n const headerValue = resolveHeaderRequestId(config.requestId.header, responseHeaders);\n if (headerValue) {\n return headerValue;\n }\n return generateRequestId();\n}\n\nfunction resolveHeaderRequestId(\n headerName: string,\n headers?: Record<string, string | string[]>,\n): string | undefined {\n if (!headers) {\n return undefined;\n }\n const target = headerName.toLowerCase();\n for (const [name, value] of Object.entries(headers)) {\n if (name.toLowerCase() !== target) {\n continue;\n }\n const entry = Array.isArray(value) ? value[0] : value;\n const normalized = normalizeRequestIdCandidate(entry);\n if (normalized) {\n return normalized;\n }\n }\n return undefined;\n}\n\nfunction normalizeRequestIdCandidate(value: string | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed ? trimmed : undefined;\n}\n\nfunction resolveCapture(base: CaptureConfig, override?: Partial<CaptureConfig>): CaptureConfig {\n if (!override) {\n return base;\n }\n return {\n ...base,\n ...override,\n };\n}\n\nfunction resolveRedaction(\n base: RedactionConfig,\n override?: Partial<RedactionConfig>,\n): RedactionConfig {\n const merged: RedactionConfig = {\n ...base,\n ...override,\n };\n\n merged.headers = normalizeLowercaseList(merged.headers);\n merged.queryParams = normalizeLowercaseList(merged.queryParams);\n merged.bodyJsonPaths = normalizeList(merged.bodyJsonPaths);\n merged.replacement = merged.replacement || base.replacement;\n\n return merged;\n}\n\nfunction normalizeLowercaseList(values: string[] | undefined): string[] {\n if (!values) {\n return [];\n }\n return values.map((entry) => entry.trim().toLowerCase()).filter(Boolean);\n}\n\nfunction normalizeList(values: string[] | undefined): string[] {\n if (!values) {\n return [];\n }\n return values.map((entry) => entry.trim()).filter(Boolean);\n}\n\nfunction buildError(err?: unknown): RequestLog['error'] {\n if (!err) {\n return undefined;\n }\n if (err instanceof Error) {\n return {\n message: err.message || 'Error',\n type: err.name || 'Error',\n stack: err.stack,\n };\n }\n return {\n message: String(err),\n };\n}\n\nfunction spanNameFromRequest(req: NormalizedRequest): string {\n const method = req.method || 'GET';\n if (req.route) {\n return `${method} ${req.route}`;\n }\n const path = safePath(req.url);\n return `${method} ${path}`;\n}\n\nfunction safePath(url: string): string {\n try {\n const parsed = new URL(url);\n return parsed.pathname || '/';\n } catch {\n const rawPath = url.split('?')[0] || '/';\n return rawPath || '/';\n }\n}\n\nexport function captureBody(\n bytes: Uint8Array | undefined,\n totalBytes: number,\n truncated: boolean,\n mode: 'text' | 'base64' | 'none',\n): ReturnType<typeof makeCapturedBody> {\n if (mode === 'none') {\n return undefined;\n }\n return makeCapturedBody(bytes, totalBytes, truncated, mode === 'text' ? 'text' : 'base64');\n}\n\nexport function captureResponseBody(\n bytes: Uint8Array | undefined,\n totalBytes: number,\n truncated: boolean,\n mode: 'text' | 'base64' | 'none',\n): ReturnType<typeof makeCapturedBody> {\n if (mode === 'none') {\n return undefined;\n }\n return makeCapturedBody(bytes, totalBytes, truncated, mode === 'text' ? 'text' : 'base64');\n}\n"],"mappings":"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","names":["state","resolvedRequestId"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stainlessdev/xray-core",
3
- "version": "0.7.0",
3
+ "version": "0.8.0",
4
4
  "description": "Core instrumentation for Stainless X-ray request logging",
5
5
  "files": [
6
6
  "dist"