@stainlessdev/xray-emitter 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -2
- package/dist/{chunk-2HW4AEKB.cjs → chunk-55YD27PV.cjs} +28 -28
- package/dist/chunk-55YD27PV.cjs.map +1 -0
- package/dist/{chunk-YVMMCTXW.js → chunk-7KT6EPVZ.js} +1 -1
- package/dist/{chunk-YVMMCTXW.js.map → chunk-7KT6EPVZ.js.map} +1 -1
- package/dist/{chunk-GNSXLLEC.cjs → chunk-CPHFCOA5.cjs} +9 -9
- package/dist/{chunk-GNSXLLEC.cjs.map → chunk-CPHFCOA5.cjs.map} +1 -1
- package/dist/{chunk-JKW6E4L3.cjs → chunk-DNBARLGB.cjs} +1 -1
- package/dist/{chunk-JKW6E4L3.cjs.map → chunk-DNBARLGB.cjs.map} +1 -1
- package/dist/{chunk-ZP5OEA4I.js → chunk-DV3MVQBB.js} +4 -4
- package/dist/chunk-DV3MVQBB.js.map +1 -0
- package/dist/{chunk-WTHVUHGI.js → chunk-FGXXKIF7.js} +4 -4
- package/dist/chunk-FGXXKIF7.js.map +1 -0
- package/dist/{chunk-TSCMZ5TV.js → chunk-GYXI3DWB.js} +35 -3
- package/dist/chunk-GYXI3DWB.js.map +1 -0
- package/dist/{chunk-6UH43LVD.js → chunk-NTIUR3OC.js} +2 -2
- package/dist/{chunk-DBI3HXNR.cjs → chunk-SUVCVINA.cjs} +47 -47
- package/dist/chunk-SUVCVINA.cjs.map +1 -0
- package/dist/{chunk-XO6YWDFL.cjs → chunk-UJWD5CFA.cjs} +53 -21
- package/dist/chunk-UJWD5CFA.cjs.map +1 -0
- package/dist/effect.cjs +19 -19
- package/dist/effect.cjs.map +1 -1
- package/dist/effect.d.cts +30 -3
- package/dist/effect.d.ts +30 -3
- package/dist/effect.js +4 -4
- package/dist/effect.js.map +1 -1
- package/dist/emitter-Bi_m_w5h.d.cts +10 -0
- package/dist/emitter-Dy7bRGTq.d.ts +10 -0
- package/dist/express.cjs +7 -7
- package/dist/express.cjs.map +1 -1
- package/dist/express.d.cts +9 -2
- package/dist/express.d.ts +9 -2
- package/dist/express.js +4 -4
- package/dist/express.js.map +1 -1
- package/dist/fastify.cjs +10 -10
- package/dist/fastify.cjs.map +1 -1
- package/dist/fastify.d.cts +9 -2
- package/dist/fastify.d.ts +9 -2
- package/dist/fastify.js +4 -4
- package/dist/fastify.js.map +1 -1
- package/dist/fetch.cjs +5 -5
- package/dist/fetch.d.cts +39 -2
- package/dist/fetch.d.ts +39 -2
- package/dist/fetch.js +4 -4
- package/dist/hono.cjs +9 -9
- package/dist/hono.cjs.map +1 -1
- package/dist/hono.d.cts +15 -3
- package/dist/hono.d.ts +15 -3
- package/dist/hono.js +4 -4
- package/dist/hono.js.map +1 -1
- package/dist/index.cjs +3 -3
- package/dist/index.d.cts +8 -2
- package/dist/index.d.ts +8 -2
- package/dist/index.js +2 -2
- package/dist/internal.cjs +3 -3
- package/dist/internal.d.cts +1 -1
- package/dist/internal.d.ts +1 -1
- package/dist/internal.js +2 -2
- package/dist/next.cjs +7 -7
- package/dist/next.cjs.map +1 -1
- package/dist/next.d.cts +9 -3
- package/dist/next.d.ts +9 -3
- package/dist/next.js +4 -4
- package/dist/next.js.map +1 -1
- package/dist/node.cjs +5 -5
- package/dist/node.d.cts +42 -1
- package/dist/node.d.ts +42 -1
- package/dist/node.js +4 -4
- package/dist/remix.cjs +7 -7
- package/dist/remix.cjs.map +1 -1
- package/dist/remix.d.cts +10 -3
- package/dist/remix.d.ts +10 -3
- package/dist/remix.js +4 -4
- package/dist/remix.js.map +1 -1
- package/dist/types-BrKvhHbn.d.cts +446 -0
- package/dist/types-BrKvhHbn.d.ts +446 -0
- package/package.json +1 -1
- package/dist/chunk-2HW4AEKB.cjs.map +0 -1
- package/dist/chunk-DBI3HXNR.cjs.map +0 -1
- package/dist/chunk-TSCMZ5TV.js.map +0 -1
- package/dist/chunk-WTHVUHGI.js.map +0 -1
- package/dist/chunk-XO6YWDFL.cjs.map +0 -1
- package/dist/chunk-ZP5OEA4I.js.map +0 -1
- package/dist/emitter-BqfrGIod.d.cts +0 -5
- package/dist/emitter-CScYhwGA.d.ts +0 -5
- package/dist/types-Z1nirh-F.d.cts +0 -149
- package/dist/types-Z1nirh-F.d.ts +0 -149
- /package/dist/{chunk-6UH43LVD.js.map → chunk-NTIUR3OC.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/xray-emitter-js/xray-emitter-js/dist/chunk-JKW6E4L3.cjs","../src/core/logger.ts","../src/core/encoding.ts","../src/core/request_log.ts","../src/core/uuid/base48.ts","../src/core/uuid/base62.ts","../src/core/uuid/index.ts","../src/core/state.ts"],"names":["maxChunkBytes"],"mappings":"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","file":"/home/runner/work/xray-emitter-js/xray-emitter-js/dist/chunk-JKW6E4L3.cjs","sourcesContent":[null,"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 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","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","/**\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"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/xray-emitter-js/xray-emitter-js/dist/chunk-DNBARLGB.cjs","../src/core/logger.ts","../src/core/encoding.ts","../src/core/request_log.ts","../src/core/uuid/base48.ts","../src/core/uuid/base62.ts","../src/core/uuid/index.ts","../src/core/state.ts"],"names":["maxChunkBytes"],"mappings":"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","file":"/home/runner/work/xray-emitter-js/xray-emitter-js/dist/chunk-DNBARLGB.cjs","sourcesContent":[null,"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 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","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","/**\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 tenantId?: string;\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"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createEmitter,
|
|
3
3
|
normalizeConfig
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-GYXI3DWB.js";
|
|
5
5
|
import {
|
|
6
6
|
LimitedBuffer,
|
|
7
7
|
bindContextToObject,
|
|
@@ -12,12 +12,12 @@ import {
|
|
|
12
12
|
setContextRequestId,
|
|
13
13
|
setContextRoute,
|
|
14
14
|
setRedactionOverride
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-NTIUR3OC.js";
|
|
16
16
|
import {
|
|
17
17
|
generateRequestId,
|
|
18
18
|
logWithLevel,
|
|
19
19
|
makeCapturedBody
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-7KT6EPVZ.js";
|
|
21
21
|
|
|
22
22
|
// src/fetch/emitter.ts
|
|
23
23
|
import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-proto";
|
|
@@ -610,4 +610,4 @@ export {
|
|
|
610
610
|
wrapFetchPreserve,
|
|
611
611
|
getXrayContext
|
|
612
612
|
};
|
|
613
|
-
//# sourceMappingURL=chunk-
|
|
613
|
+
//# sourceMappingURL=chunk-DV3MVQBB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/fetch/emitter.ts","../src/fetch/adapter.ts"],"sourcesContent":["// Use the bare package import so that Node.js resolves to the Node build (http\n// transport) while bundlers (webpack, vite, wrangler/esbuild) follow the\n// package.json \"browser\" field and resolve to the browser build automatically.\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto';\nimport {\n createEmitter as createCoreEmitter,\n normalizeConfig,\n type XrayRuntimeConfig,\n} from '../core/index';\n\n/**\n * Create a fetch/edge runtime emitter using OTLP HTTP transport by default.\n *\n * Pass `config.exporter.instance` to provide a custom `SpanExporter`.\n */\nexport function createEmitter(config: XrayRuntimeConfig) {\n const resolved = normalizeConfig(config);\n const exporter =\n config.exporter?.instance ??\n new OTLPTraceExporter({\n url: resolved.exporter.endpointUrl,\n headers: resolved.exporter.headers ?? {},\n timeoutMillis: resolved.exporter.timeoutMs,\n });\n\n return createCoreEmitter(config, exporter);\n}\n","import type {\n CaptureConfig,\n NormalizedRequest,\n RedactionConfig,\n RequestLog,\n XrayContext,\n XrayEmitter,\n} from '../core/index';\nimport {\n LimitedBuffer,\n bindContextToObject,\n getXrayContextFromObject,\n headerValuesFromFetchHeaders,\n isWebsocketUpgradeFetch,\n logWithLevel,\n makeCapturedBody,\n setCaptureOverride,\n setContextRequestId,\n setContextRoute,\n setRedactionOverride,\n generateRequestId,\n} from '../core/internal';\n\nexport interface WrapOptions {\n /**\n * Explicit route pattern for this handler (for example `/users/:id`).\n */\n route?: string;\n /**\n * Explicit request ID. Skips header lookup/generation when provided.\n */\n requestId?: string;\n /**\n * Per-handler capture overrides.\n */\n capture?: Partial<CaptureConfig>;\n /**\n * Per-handler redaction overrides.\n */\n redaction?: Partial<RedactionConfig>;\n /**\n * Hook called after request context is created.\n */\n onRequest?: (ctx: XrayContext) => void;\n /**\n * Hook called after the request has been finalized and logged.\n */\n onResponse?: (ctx: XrayContext, log: RequestLog) => void;\n /**\n * Hook called when request handling fails.\n */\n onError?: (ctx: XrayContext, err: unknown) => void;\n}\n\n/**\n * Wrap a fetch-style handler with X-ray instrumentation.\n *\n * This variant may replace the request/response objects to safely capture\n * bodies and inject a request ID response header when needed.\n */\nexport function wrapFetch(\n handler: (req: Request) => Response | Promise<Response>,\n xray: XrayEmitter,\n options?: WrapOptions,\n): (req: Request) => Promise<Response> {\n return async (req: Request) => {\n const normalizedRequest: NormalizedRequest = {\n method: req.method,\n url: req.url,\n route: options?.route,\n headers: headerValuesFromFetchHeaders(req.headers),\n requestId: options?.requestId,\n startTimeMs: Date.now(),\n };\n\n const ctx = xray.startRequest(normalizedRequest);\n bindContextToObject(req, ctx);\n\n if (options?.requestId) {\n setContextRequestId(ctx, options.requestId);\n }\n if (options?.route) {\n setContextRoute(ctx, options.route);\n }\n if (options?.capture) {\n setCaptureOverride(ctx, options.capture);\n }\n if (options?.redaction) {\n setRedactionOverride(ctx, options.redaction);\n }\n\n if (options?.onRequest) {\n try {\n options.onRequest(ctx);\n } catch (err) {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: onRequest failed', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n const capture = options?.capture\n ? { ...xray.config.capture, ...options.capture }\n : xray.config.capture;\n const requestCapture =\n capture.requestBody === 'none' ? null : wrapRequestBody(req, capture.maxBodyBytes);\n const requestForHandler = requestCapture?.request ?? req;\n if (requestForHandler !== req) {\n bindContextToObject(requestForHandler, ctx);\n }\n\n let response: Response;\n try {\n response = await handler(requestForHandler);\n } catch (err) {\n const log = xray.endRequest(\n ctx,\n {\n statusCode: undefined,\n headers: undefined,\n body: undefined,\n endTimeMs: Date.now(),\n },\n err,\n );\n if (options?.onError) {\n try {\n options.onError(ctx, err);\n } catch (errInner) {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: onError failed', {\n error: errInner instanceof Error ? errInner.message : String(errInner),\n });\n }\n }\n if (options?.onResponse) {\n try {\n options.onResponse(ctx, log);\n } catch (errInner) {\n logWithLevel(\n xray.config.logger,\n 'warn',\n xray.config.logLevel,\n 'xray: onResponse failed',\n {\n error: errInner instanceof Error ? errInner.message : String(errInner),\n },\n );\n }\n }\n throw err;\n }\n\n if (!(response instanceof Response)) {\n const log = xray.endRequest(ctx, {\n statusCode: undefined,\n headers: undefined,\n body: undefined,\n endTimeMs: Date.now(),\n });\n if (options?.onResponse) {\n try {\n options.onResponse(ctx, log);\n } catch (err) {\n logWithLevel(\n xray.config.logger,\n 'warn',\n xray.config.logLevel,\n 'xray: onResponse failed',\n {\n error: err instanceof Error ? err.message : String(err),\n },\n );\n }\n }\n return response;\n }\n\n const responseHeaders = new Headers(response.headers);\n ensureResponseRequestIdHeaders(responseHeaders, ctx, xray);\n const statusCode = response.status;\n const isUpgrade = isWebsocketUpgradeFetch(statusCode, req.headers, responseHeaders);\n\n if (!response.body || isUpgrade || capture.responseBody === 'none') {\n const log = finalizeResponse(\n ctx,\n xray,\n normalizedRequest,\n capture,\n requestCapture?.capture ?? null,\n responseHeaders,\n statusCode,\n null,\n );\n if (options?.onResponse) {\n try {\n options.onResponse(ctx, log);\n } catch (err) {\n logWithLevel(\n xray.config.logger,\n 'warn',\n xray.config.logLevel,\n 'xray: onResponse failed',\n {\n error: err instanceof Error ? err.message : String(err),\n },\n );\n }\n }\n return new Response(response.body, {\n headers: responseHeaders,\n status: response.status,\n statusText: response.statusText,\n });\n }\n\n const responseCapture = new LimitedBuffer(capture.maxBodyBytes);\n let finished = false;\n const finalize = () => {\n if (finished) {\n return;\n }\n finished = true;\n const log = finalizeResponse(\n ctx,\n xray,\n normalizedRequest,\n capture,\n requestCapture?.capture ?? null,\n responseHeaders,\n statusCode,\n responseCapture,\n );\n if (options?.onResponse) {\n try {\n options.onResponse(ctx, log);\n } catch (err) {\n logWithLevel(\n xray.config.logger,\n 'warn',\n xray.config.logLevel,\n 'xray: onResponse failed',\n {\n error: err instanceof Error ? err.message : String(err),\n },\n );\n }\n }\n };\n\n const wrappedBody = wrapReadableStream(response.body, responseCapture, finalize, () => {\n finalize();\n });\n\n return new Response(wrappedBody, {\n headers: responseHeaders,\n status: response.status,\n statusText: response.statusText,\n });\n };\n}\n\n/**\n * Wrap a fetch-style handler while preserving original request/response objects\n * whenever possible.\n *\n * If a missing request ID header must be injected and response headers are\n * immutable, this wrapper may still replace the response object.\n */\nexport function wrapFetchPreserve(\n handler: (req: Request) => Response | Promise<Response>,\n xray: XrayEmitter,\n options?: WrapOptions,\n): (req: Request) => Promise<Response> {\n return async (req: Request) => {\n const normalizedRequest: NormalizedRequest = {\n method: req.method,\n url: req.url,\n route: options?.route,\n headers: headerValuesFromFetchHeaders(req.headers),\n requestId: options?.requestId,\n startTimeMs: Date.now(),\n };\n\n const ctx = xray.startRequest(normalizedRequest);\n bindContextToObject(req, ctx);\n\n if (options?.requestId) {\n setContextRequestId(ctx, options.requestId);\n }\n if (options?.route) {\n setContextRoute(ctx, options.route);\n }\n if (options?.capture) {\n setCaptureOverride(ctx, options.capture);\n }\n if (options?.redaction) {\n setRedactionOverride(ctx, options.redaction);\n }\n\n if (options?.onRequest) {\n try {\n options.onRequest(ctx);\n } catch (err) {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: onRequest failed', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n const capture = options?.capture\n ? { ...xray.config.capture, ...options.capture }\n : xray.config.capture;\n const requestCapturePromise =\n capture.requestBody === 'none'\n ? Promise.resolve(null)\n : captureRequestClone(req, capture.maxBodyBytes, xray);\n\n let response: Response;\n try {\n response = await handler(req);\n } catch (err) {\n const log = xray.endRequest(\n ctx,\n {\n statusCode: undefined,\n headers: undefined,\n body: undefined,\n endTimeMs: Date.now(),\n },\n err,\n );\n if (options?.onError) {\n try {\n options.onError(ctx, err);\n } catch (errInner) {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: onError failed', {\n error: errInner instanceof Error ? errInner.message : String(errInner),\n });\n }\n }\n if (options?.onResponse) {\n try {\n options.onResponse(ctx, log);\n } catch (errInner) {\n logWithLevel(\n xray.config.logger,\n 'warn',\n xray.config.logLevel,\n 'xray: onResponse failed',\n {\n error: errInner instanceof Error ? errInner.message : String(errInner),\n },\n );\n }\n }\n throw err;\n }\n\n if (!(response instanceof Response)) {\n const log = xray.endRequest(ctx, {\n statusCode: undefined,\n headers: undefined,\n body: undefined,\n endTimeMs: Date.now(),\n });\n if (options?.onResponse) {\n try {\n options.onResponse(ctx, log);\n } catch (err) {\n logWithLevel(\n xray.config.logger,\n 'warn',\n xray.config.logLevel,\n 'xray: onResponse failed',\n {\n error: err instanceof Error ? err.message : String(err),\n },\n );\n }\n }\n return response;\n }\n\n const responseHeaders = new Headers(response.headers);\n const ensured = ensureResponseRequestIdHeaders(responseHeaders, ctx, xray);\n if (ensured.set) {\n const headerName = canonicalHeaderName(xray.config.requestId.header);\n try {\n response.headers.set(headerName, ensured.value ?? '');\n } catch {\n response = new Response(response.body, {\n headers: responseHeaders,\n status: response.status,\n statusText: response.statusText,\n });\n }\n }\n const statusCode = response.status;\n const isUpgrade = isWebsocketUpgradeFetch(statusCode, req.headers, responseHeaders);\n const responseCapturePromise =\n !response.body || isUpgrade || capture.responseBody === 'none'\n ? Promise.resolve(null)\n : captureResponseClone(response, capture.maxBodyBytes, xray);\n\n void (async () => {\n const [requestCapture, responseCapture] = await Promise.all([\n requestCapturePromise,\n responseCapturePromise,\n ]);\n const log = finalizeResponse(\n ctx,\n xray,\n normalizedRequest,\n capture,\n requestCapture,\n responseHeaders,\n statusCode,\n responseCapture,\n );\n if (options?.onResponse) {\n try {\n options.onResponse(ctx, log);\n } catch (err) {\n logWithLevel(\n xray.config.logger,\n 'warn',\n xray.config.logLevel,\n 'xray: onResponse failed',\n {\n error: err instanceof Error ? err.message : String(err),\n },\n );\n }\n }\n })().catch((err) => {\n logWithLevel(\n xray.config.logger,\n 'warn',\n xray.config.logLevel,\n 'xray: response capture failed',\n {\n error: err instanceof Error ? err.message : String(err),\n },\n );\n });\n\n return response;\n };\n}\n\n/**\n * Retrieve the `XrayContext` bound to a fetch `Request`.\n */\nexport function getXrayContext(req: Request): XrayContext | undefined {\n return getXrayContextFromObject(req);\n}\n\ntype RequestCapture = {\n buffer: LimitedBuffer;\n read: boolean;\n};\n\nfunction wrapRequestBody(\n request: Request,\n limit: number,\n): { capture: RequestCapture | null; request: Request } {\n if (limit <= 0 || !request.body || request.bodyUsed) {\n return { capture: null, request };\n }\n\n const originalBody = request.body;\n const capture: RequestCapture = {\n buffer: new LimitedBuffer(limit),\n read: false,\n };\n\n let controller: ReadableStreamDefaultController<Uint8Array> | null = null;\n let started = false;\n let reader: ReadableStreamDefaultReader<Uint8Array> | null = null;\n\n const wrappedStream = new ReadableStream<Uint8Array>({\n start(c) {\n controller = c;\n },\n async cancel(reason) {\n if (!started) {\n return;\n }\n try {\n await reader?.cancel(reason);\n } finally {\n // Ignore cancellation.\n }\n },\n });\n\n const startPump = () => {\n if (started) {\n return;\n }\n started = true;\n reader = originalBody.getReader();\n void (async () => {\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n controller?.close();\n return;\n }\n if (value) {\n capture.read = true;\n capture.buffer.write(value);\n controller?.enqueue(value);\n }\n }\n } catch (err) {\n controller?.error(err);\n }\n })();\n };\n\n const originalGetReader = wrappedStream.getReader.bind(wrappedStream);\n (wrappedStream as unknown as { getReader: typeof wrappedStream.getReader }).getReader = (\n ...args: unknown[]\n ) => {\n startPump();\n // @ts-expect-error - preserve built-in `getReader` overloads\n return originalGetReader(...args);\n };\n\n const init: RequestInit & { duplex?: 'half' } = {\n body: wrappedStream,\n cache: request.cache,\n credentials: request.credentials,\n headers: request.headers,\n integrity: request.integrity,\n keepalive: request.keepalive,\n method: request.method,\n mode: request.mode,\n redirect: request.redirect,\n referrer: request.referrer,\n referrerPolicy: request.referrerPolicy,\n signal: request.signal,\n };\n if (isNodeRuntime()) {\n init.duplex = 'half';\n }\n\n const wrappedRequest = new Request(request.url, init);\n return { capture, request: wrappedRequest };\n}\n\nasync function captureRequestClone(\n request: Request,\n limit: number,\n xray: XrayEmitter,\n): Promise<LimitedBuffer | null> {\n if (limit <= 0 || !request.body || request.bodyUsed) {\n return null;\n }\n let clone: Request;\n try {\n clone = request.clone();\n } catch {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: request clone failed');\n return null;\n }\n\n const buffer = new LimitedBuffer(limit);\n await readStreamToBuffer(clone.body, buffer);\n return buffer;\n}\n\nasync function captureResponseClone(\n response: Response,\n limit: number,\n xray: XrayEmitter,\n): Promise<LimitedBuffer | null> {\n if (limit <= 0 || !response.body || response.bodyUsed) {\n return null;\n }\n let clone: Response;\n try {\n clone = response.clone();\n } catch {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: response clone failed');\n return null;\n }\n\n const buffer = new LimitedBuffer(limit);\n await readStreamToBuffer(clone.body, buffer);\n return buffer;\n}\n\nasync function readStreamToBuffer(\n stream: ReadableStream<Uint8Array> | null,\n buffer: LimitedBuffer,\n): Promise<void> {\n if (!stream) {\n return;\n }\n\n const reader = stream.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n return;\n }\n if (value) {\n buffer.write(value);\n }\n }\n } finally {\n try {\n reader.releaseLock();\n } catch {\n // Ignore release failures; reader may already be closed.\n }\n }\n}\n\nfunction wrapReadableStream(\n stream: ReadableStream<Uint8Array>,\n capture: LimitedBuffer,\n onFinish: () => void,\n onError?: (err: unknown) => void,\n): ReadableStream<Uint8Array> {\n const reader = stream.getReader();\n\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n try {\n const { done, value } = await reader.read();\n if (done) {\n controller.close();\n onFinish();\n try {\n reader.releaseLock();\n } catch {\n // Ignore release failures; reader may already be closed.\n }\n return;\n }\n if (value) {\n capture.write(value);\n controller.enqueue(value);\n }\n } catch (err) {\n controller.error(err);\n onError?.(err);\n onFinish();\n try {\n reader.releaseLock();\n } catch {\n // Ignore release failures; reader may already be closed.\n }\n }\n },\n async cancel(reason) {\n try {\n await reader.cancel(reason);\n } finally {\n onFinish();\n try {\n reader.releaseLock();\n } catch {\n // Ignore release failures; reader may already be closed.\n }\n }\n },\n });\n}\n\nfunction finalizeResponse(\n ctx: XrayContext,\n xray: XrayEmitter,\n normalizedRequest: NormalizedRequest,\n capture: CaptureConfig,\n requestCapture: RequestCapture | LimitedBuffer | null,\n responseHeaders: Headers,\n statusCode: number,\n responseCapture: LimitedBuffer | null,\n): RequestLog {\n if (requestCapture) {\n const buffer = requestCapture instanceof LimitedBuffer ? requestCapture : requestCapture.buffer;\n const read = requestCapture instanceof LimitedBuffer ? true : requestCapture.read;\n if (read) {\n normalizedRequest.body = makeCapturedBody(\n buffer.bytes(),\n buffer.totalBytes(),\n buffer.truncated(),\n capture.requestBody === 'text' ? 'text' : 'base64',\n );\n }\n }\n\n const responseBody = responseCapture\n ? makeCapturedBody(\n responseCapture.bytes(),\n responseCapture.totalBytes(),\n responseCapture.truncated(),\n capture.responseBody === 'text' ? 'text' : 'base64',\n )\n : undefined;\n\n return xray.endRequest(ctx, {\n statusCode,\n headers: headerValuesFromFetchHeaders(responseHeaders),\n body: responseBody,\n endTimeMs: Date.now(),\n });\n}\n\nfunction ensureResponseRequestIdHeaders(\n headers: Headers,\n ctx: XrayContext,\n xray: XrayEmitter,\n): { value?: string; set: boolean } {\n const headerName = xray.config.requestId.header;\n const existing = normalizeRequestIdCandidate(headers.get(headerName) ?? undefined);\n if (existing) {\n return { value: existing, set: false };\n }\n\n const explicit = normalizeRequestIdCandidate(ctx.requestId);\n if (explicit) {\n headers.set(canonicalHeaderName(headerName), explicit);\n return { value: explicit, set: true };\n }\n\n const generated = generateRequestId();\n headers.set(canonicalHeaderName(headerName), generated);\n setContextRequestId(ctx, generated);\n return { value: generated, set: true };\n}\n\nfunction isNodeRuntime(): boolean {\n const maybeProcess = (\n globalThis as typeof globalThis & {\n process?: { versions?: { node?: string } };\n }\n ).process;\n return !!maybeProcess?.versions?.node;\n}\n\nfunction normalizeRequestIdCandidate(value: string | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed ? trimmed : undefined;\n}\n\nfunction canonicalHeaderName(headerName: string): string {\n return headerName\n .split('-')\n .filter(Boolean)\n .map((part) => (part ? part[0]!.toUpperCase() + part.slice(1) : part))\n .join('-');\n}\n"],"mappings":"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","names":["createEmitter"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createEmitter,
|
|
3
3
|
normalizeConfig
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-GYXI3DWB.js";
|
|
5
5
|
import {
|
|
6
6
|
LimitedBuffer,
|
|
7
7
|
bindContextToObject,
|
|
@@ -12,12 +12,12 @@ import {
|
|
|
12
12
|
setContextRequestId,
|
|
13
13
|
setContextRoute,
|
|
14
14
|
setRedactionOverride
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-NTIUR3OC.js";
|
|
16
16
|
import {
|
|
17
17
|
generateRequestId,
|
|
18
18
|
logWithLevel,
|
|
19
19
|
makeCapturedBody
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-7KT6EPVZ.js";
|
|
21
21
|
|
|
22
22
|
// src/node/emitter.ts
|
|
23
23
|
import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-proto";
|
|
@@ -631,4 +631,4 @@ export {
|
|
|
631
631
|
wrapHttpHandler,
|
|
632
632
|
getXrayContext
|
|
633
633
|
};
|
|
634
|
-
//# sourceMappingURL=chunk-
|
|
634
|
+
//# sourceMappingURL=chunk-FGXXKIF7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/node/emitter.ts","../src/node/adapter.ts"],"sourcesContent":["import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto';\nimport {\n createEmitter as createCoreEmitter,\n normalizeConfig,\n type XrayRuntimeConfig,\n} from '../core/index';\n\n/**\n * Create a Node runtime emitter using OTLP HTTP transport by default.\n *\n * Pass `config.exporter.instance` to provide a custom `SpanExporter`.\n */\nexport function createEmitter(config: XrayRuntimeConfig) {\n const resolved = normalizeConfig(config);\n const exporter =\n config.exporter?.instance ??\n new OTLPTraceExporter({\n url: resolved.exporter.endpointUrl,\n headers: resolved.exporter.headers ?? {},\n timeoutMillis: resolved.exporter.timeoutMs,\n });\n\n return createCoreEmitter(config, exporter);\n}\n","import type { IncomingMessage, ServerResponse } from 'node:http';\nimport { TLSSocket } from 'node:tls';\nimport type {\n CaptureConfig,\n NormalizedRequest,\n NormalizedResponse,\n RedactionConfig,\n RequestLog,\n XrayContext,\n XrayEmitter,\n} from '../core/index';\nimport {\n LimitedBuffer,\n bindContextToObject,\n getXrayContextFromObject,\n headerValuesFromNodeHeaders,\n isWebsocketUpgrade,\n logWithLevel,\n makeCapturedBody,\n setCaptureOverride,\n setContextRequestId,\n setContextRoute,\n setRedactionOverride,\n generateRequestId,\n} from '../core/internal';\n\n/**\n * Handler signature for `node:http` request listeners.\n */\nexport type NodeHttpHandler = (req: IncomingMessage, res: ServerResponse) => void | Promise<void>;\n\n/**\n * Per-handler overrides for `wrapHttpHandler`.\n */\nexport interface WrapOptions {\n /**\n * Explicit route pattern for this handler (for example `/users/:id`).\n */\n route?: string;\n /**\n * Explicit request ID. Skips header lookup/generation when provided.\n */\n requestId?: string;\n /**\n * Per-handler capture overrides.\n */\n capture?: Partial<CaptureConfig>;\n /**\n * Per-handler redaction overrides.\n */\n redaction?: Partial<RedactionConfig>;\n /**\n * Hook called after request context is created.\n */\n onRequest?: (ctx: XrayContext) => void;\n /**\n * Hook called after the request has been finalized and logged.\n */\n onResponse?: (ctx: XrayContext, log: RequestLog) => void;\n /**\n * Hook called when request handling fails.\n */\n onError?: (ctx: XrayContext, err: unknown) => void;\n}\n\n/**\n * Wrap a `node:http` request handler with X-ray instrumentation.\n *\n * The wrapper binds `XrayContext` to both `req` and `res`, captures configured\n * request/response metadata, and ensures a response request ID header is set.\n */\nexport function wrapHttpHandler(\n handler: NodeHttpHandler,\n xray: XrayEmitter,\n options?: WrapOptions,\n): NodeHttpHandler {\n return (req, res) => {\n const normalizedRequest: NormalizedRequest = {\n method: req.method ?? 'GET',\n url: fullUrl(req),\n route: options?.route,\n headers: headerValuesFromNodeHeaders(\n req.headers as Record<string, string | string[] | number | undefined>,\n ),\n requestId: options?.requestId,\n remoteAddress: req.socket?.remoteAddress,\n startTimeMs: Date.now(),\n };\n\n trackExpressParams(req);\n\n const ctx = xray.startRequest(normalizedRequest);\n bindContextToObject(req, ctx);\n bindContextToObject(res, ctx);\n\n if (options?.requestId) {\n setContextRequestId(ctx, options.requestId);\n }\n if (options?.route) {\n setContextRoute(ctx, options.route);\n }\n if (options?.capture) {\n setCaptureOverride(ctx, options.capture);\n }\n if (options?.redaction) {\n setRedactionOverride(ctx, options.redaction);\n }\n\n if (options?.onRequest) {\n try {\n options.onRequest(ctx);\n } catch (err) {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: onRequest failed', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n const capture = options?.capture\n ? { ...xray.config.capture, ...options.capture }\n : xray.config.capture;\n\n const requestCapture =\n capture.requestBody === 'none' ? null : wrapRequestBody(req, capture.maxBodyBytes);\n const recorder = new ResponseRecorder(\n capture.responseBody !== 'none',\n capture.maxBodyBytes,\n (response) => {\n ensureResponseRequestId(response, ctx, xray);\n },\n );\n recorder.wrap(res);\n\n let finished = false;\n let capturedError: unknown;\n let onErrorCalled = false;\n\n const finish = () => {\n if (finished) {\n return;\n }\n finished = true;\n if (!normalizedRequest.route) {\n const route = resolveExpressRoute(req);\n if (route) {\n normalizedRequest.route = route;\n }\n }\n\n if (requestCapture && requestCapture.read) {\n normalizedRequest.body = makeCapturedBody(\n requestCapture.buffer.bytes(),\n requestCapture.buffer.totalBytes(),\n requestCapture.buffer.truncated(),\n capture.requestBody === 'text' ? 'text' : 'base64',\n );\n }\n\n const responseHeaders = recorder.headersSnapshot(res.getHeaders());\n const recordedStatus = recorder.statusCode() ?? res.statusCode;\n const statusCode = capturedError && !recorder.hasWrittenHeader() ? 500 : recordedStatus;\n const isUpgrade = isWebsocketUpgrade(\n statusCode ?? 0,\n normalizedRequest.headers,\n responseHeaders,\n );\n\n const responseBody =\n recorder.bodyCaptured() && !isUpgrade\n ? makeCapturedBody(\n recorder.body(),\n recorder.totalBytes(),\n recorder.truncated(),\n capture.responseBody === 'text' ? 'text' : 'base64',\n )\n : undefined;\n\n const normalizedResponse: NormalizedResponse = {\n statusCode: statusCode ?? undefined,\n headers: responseHeaders,\n body: responseBody,\n endTimeMs: Date.now(),\n };\n\n const log = xray.endRequest(ctx, normalizedResponse, capturedError);\n\n if (capturedError && options?.onError && !onErrorCalled) {\n onErrorCalled = true;\n try {\n options.onError(ctx, capturedError);\n } catch (err) {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: onError failed', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n if (options?.onResponse) {\n try {\n options.onResponse(ctx, log);\n } catch (err) {\n logWithLevel(\n xray.config.logger,\n 'warn',\n xray.config.logLevel,\n 'xray: onResponse failed',\n {\n error: err instanceof Error ? err.message : String(err),\n },\n );\n }\n }\n };\n\n res.once('finish', finish);\n res.once('close', finish);\n\n try {\n const result = handler(req, res);\n if (result && typeof (result as Promise<void>).catch === 'function') {\n void (result as Promise<void>).catch((err) => {\n capturedError = err;\n if (options?.onError && !onErrorCalled) {\n onErrorCalled = true;\n try {\n options.onError(ctx, err);\n } catch (errInner) {\n logWithLevel(\n xray.config.logger,\n 'warn',\n xray.config.logLevel,\n 'xray: onError failed',\n {\n error: errInner instanceof Error ? errInner.message : String(errInner),\n },\n );\n }\n }\n });\n }\n } catch (err) {\n capturedError = err;\n if (options?.onError && !onErrorCalled) {\n onErrorCalled = true;\n try {\n options.onError(ctx, err);\n } catch (errInner) {\n logWithLevel(xray.config.logger, 'warn', xray.config.logLevel, 'xray: onError failed', {\n error: errInner instanceof Error ? errInner.message : String(errInner),\n });\n }\n }\n throw err;\n }\n };\n}\n\n/**\n * Retrieve the `XrayContext` bound to a Node `IncomingMessage`.\n */\nexport function getXrayContext(req: IncomingMessage): XrayContext | undefined {\n return getXrayContextFromObject(req);\n}\n\ntype RequestCapture = {\n buffer: LimitedBuffer;\n read: boolean;\n userConsuming: boolean;\n};\n\nfunction wrapRequestBody(req: IncomingMessage, limit: number): RequestCapture | null {\n if (limit <= 0) {\n return null;\n }\n if (!hasRequestBody(req)) {\n return null;\n }\n\n const capture: RequestCapture = {\n buffer: new LimitedBuffer(limit),\n read: false,\n userConsuming: false,\n };\n\n const originalPush = req.push;\n req.push = function push(chunk: unknown, encoding?: BufferEncoding): boolean {\n if (chunk != null) {\n recordChunk(capture, chunk, encoding);\n }\n return originalPush.call(req, chunk as any, encoding as any);\n } as typeof req.push;\n\n const originalEmit = req.emit;\n req.emit = function emit(event: string, ...args: unknown[]): boolean {\n if (event === 'data' && capture.userConsuming && args[0] != null) {\n capture.read = true;\n }\n if (event === 'end' && capture.userConsuming) {\n capture.read = true;\n }\n return originalEmit.call(req, event, ...args);\n } as typeof req.emit;\n\n const originalOn = req.on;\n req.on = function on(event: string, listener: (...args: any[]) => void): any {\n if (event === 'data' || event === 'readable') {\n capture.userConsuming = true;\n }\n return originalOn.call(req, event, listener);\n } as typeof req.on;\n\n const originalOnce = req.once;\n req.once = function once(event: string, listener: (...args: any[]) => void): any {\n if (event === 'data' || event === 'readable') {\n capture.userConsuming = true;\n }\n return originalOnce.call(req, event, listener);\n } as typeof req.once;\n\n const originalAddListener = req.addListener;\n req.addListener = function addListener(event: string, listener: (...args: any[]) => void): any {\n if (event === 'data' || event === 'readable') {\n capture.userConsuming = true;\n }\n return originalAddListener.call(req, event, listener);\n } as typeof req.addListener;\n\n const originalPipe = req.pipe;\n req.pipe = function pipe(destination: unknown, options?: unknown): unknown {\n capture.userConsuming = true;\n return originalPipe.call(req, destination as any, options as any);\n } as typeof req.pipe;\n\n const originalRead = req.read;\n req.read = function read(size?: number): any {\n capture.userConsuming = true;\n const chunk = originalRead.call(req, size as any) as unknown;\n const readableFlowing = (req as IncomingMessage & { readableFlowing?: boolean | null })\n .readableFlowing;\n const hasDataListeners =\n typeof req.listenerCount === 'function' && req.listenerCount('data') > 0;\n if (!hasDataListeners && readableFlowing !== true && chunk != null) {\n capture.read = true;\n }\n return chunk as any;\n } as typeof req.read;\n\n return capture;\n}\n\nfunction hasRequestBody(req: IncomingMessage): boolean {\n if (req.headers['content-length'] != null) {\n return true;\n }\n if (req.headers['transfer-encoding'] != null) {\n return true;\n }\n return false;\n}\n\nfunction recordChunk(capture: RequestCapture, chunk: unknown, encoding?: BufferEncoding): void {\n const bytes = toBytes(chunk, encoding);\n if (!bytes) {\n return;\n }\n capture.buffer.write(bytes);\n}\n\nfunction toBytes(chunk: unknown, encoding?: BufferEncoding): Uint8Array | null {\n if (chunk == null) {\n return null;\n }\n if (typeof chunk === 'string') {\n return Buffer.from(chunk, encoding);\n }\n if (chunk instanceof Uint8Array) {\n return chunk;\n }\n if (chunk instanceof ArrayBuffer) {\n return new Uint8Array(chunk);\n }\n return null;\n}\n\nclass ResponseRecorder {\n private readonly buffer: LimitedBuffer | null;\n private headerSnapshot?: Record<string, string | string[] | number | undefined>;\n private status?: number;\n private wroteHeader = false;\n private bytes = 0;\n private readonly onHeader?: (res: ServerResponse) => void;\n\n constructor(captureBody: boolean, maxBodySize: number, onHeader?: (res: ServerResponse) => void) {\n this.buffer = captureBody ? new LimitedBuffer(maxBodySize) : null;\n this.onHeader = onHeader;\n }\n\n body(): Uint8Array {\n return this.buffer?.bytes() ?? new Uint8Array();\n }\n\n totalBytes(): number {\n return this.buffer?.totalBytes() ?? 0;\n }\n\n bodyCaptured(): boolean {\n return !!this.buffer && this.buffer.totalBytes() > 0;\n }\n\n bytesWritten(): number {\n return this.bytes;\n }\n\n hasWrittenHeader(): boolean {\n return this.wroteHeader;\n }\n\n headersSnapshot(\n defaultHeaders: Record<string, string | string[] | number | undefined>,\n ): Record<string, string | string[]> {\n if (this.headerSnapshot) {\n return headerValuesFromNodeHeaders(this.headerSnapshot);\n }\n return headerValuesFromNodeHeaders(defaultHeaders);\n }\n\n statusCode(): number | undefined {\n return this.status;\n }\n\n truncated(): boolean {\n return this.buffer?.truncated() ?? false;\n }\n\n wrap(res: ServerResponse): void {\n const originalWriteHead = res.writeHead;\n res.writeHead = ((statusCode: number, ...args: any[]) => {\n if (!this.wroteHeader) {\n this.applyWriteHeadHeaders(res, args);\n }\n this.recordHeader(res, statusCode);\n return (originalWriteHead as any).call(res, statusCode, ...args);\n }) as typeof res.writeHead;\n\n const originalWrite = res.write;\n res.write = ((chunk: unknown, encoding?: BufferEncoding, cb?: (err?: Error | null) => void) => {\n this.recordHeader(res, res.statusCode ?? 200);\n this.recordWrite(chunk, encoding);\n return originalWrite.call(res, chunk as any, encoding as any, cb as any);\n }) as typeof res.write;\n\n const originalEnd = res.end;\n res.end = ((chunk?: unknown, encoding?: BufferEncoding, cb?: () => void) => {\n this.recordHeader(res, res.statusCode ?? 200);\n if (chunk) {\n this.recordWrite(chunk, encoding);\n }\n return originalEnd.call(res, chunk as any, encoding as any, cb as any);\n }) as typeof res.end;\n\n if (typeof res.flushHeaders === 'function') {\n const originalFlush = res.flushHeaders;\n res.flushHeaders = (() => {\n this.recordHeader(res, res.statusCode ?? 200);\n return originalFlush.call(res);\n }) as typeof res.flushHeaders;\n }\n }\n\n private recordHeader(res: ServerResponse, statusCode: number): void {\n if (this.wroteHeader) {\n return;\n }\n this.onHeader?.(res);\n this.wroteHeader = true;\n this.status = statusCode;\n this.headerSnapshot = { ...res.getHeaders() } as Record<\n string,\n string | string[] | number | undefined\n >;\n }\n\n private applyWriteHeadHeaders(res: ServerResponse, args: any[]): void {\n if (args.length === 0) {\n return;\n }\n const headersArg = typeof args[0] === 'string' ? args[1] : args[0];\n if (!headersArg) {\n return;\n }\n if (Array.isArray(headersArg)) {\n if (headersArg.length === 0) {\n return;\n }\n if (typeof headersArg[0] === 'string') {\n for (let i = 0; i < headersArg.length - 1; i += 2) {\n const name = headersArg[i];\n const value = headersArg[i + 1];\n if (typeof name === 'string' && value !== undefined && value !== null) {\n res.setHeader(name, value as any);\n }\n }\n return;\n }\n for (const entry of headersArg) {\n if (!Array.isArray(entry)) {\n continue;\n }\n const [name, value] = entry;\n if (typeof name === 'string' && value !== undefined && value !== null) {\n res.setHeader(name, value as any);\n }\n }\n return;\n }\n if (typeof headersArg === 'object') {\n for (const [name, value] of Object.entries(headersArg as Record<string, unknown>)) {\n if (value !== undefined && value !== null) {\n res.setHeader(name, value as any);\n }\n }\n }\n }\n\n private recordWrite(chunk: unknown, encoding?: BufferEncoding): void {\n const bytes = toBytes(chunk, encoding);\n if (!bytes) {\n return;\n }\n this.bytes += bytes.length;\n if (this.buffer) {\n this.buffer.write(bytes);\n }\n }\n}\n\nfunction ensureResponseRequestId(res: ServerResponse, ctx: XrayContext, xray: XrayEmitter): void {\n const headerName = xray.config.requestId.header;\n const existing = headerValueFromNode(res.getHeader(headerName));\n if (existing) {\n return;\n }\n\n const explicit = normalizeRequestIdCandidate(ctx.requestId);\n if (explicit) {\n res.setHeader(canonicalHeaderName(headerName), explicit);\n return;\n }\n\n const generated = generateRequestId();\n res.setHeader(canonicalHeaderName(headerName), generated);\n setContextRequestId(ctx, generated);\n}\n\nfunction fullUrl(req: IncomingMessage): string {\n const requestUrl = resolveRequestUrl(req);\n if (!requestUrl) {\n return '';\n }\n if (requestUrl.startsWith('http://') || requestUrl.startsWith('https://')) {\n return requestUrl;\n }\n\n const host = req.headers['host'];\n if (!host || typeof host !== 'string') {\n return requestUrl;\n }\n const scheme = req.socket instanceof TLSSocket ? 'https' : 'http';\n return `${scheme}://${host}${requestUrl}`;\n}\n\nfunction resolveRequestUrl(req: IncomingMessage): string {\n const requestUrl = req.url ?? '';\n if (requestUrl.startsWith('http://') || requestUrl.startsWith('https://')) {\n return requestUrl;\n }\n\n const expressReq = req as IncomingMessage & { originalUrl?: unknown };\n if (typeof expressReq.originalUrl === 'string' && expressReq.originalUrl.length > 0) {\n return expressReq.originalUrl;\n }\n return requestUrl;\n}\n\nfunction headerValueFromNode(value: unknown): string | undefined {\n if (value == null) {\n return undefined;\n }\n if (Array.isArray(value)) {\n return normalizeRequestIdCandidate(value[0]);\n }\n return normalizeRequestIdCandidate(`${value}`);\n}\n\nfunction normalizeRequestIdCandidate(value: string | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed ? trimmed : undefined;\n}\n\nfunction canonicalHeaderName(headerName: string): string {\n return headerName\n .split('-')\n .filter(Boolean)\n .map((part) => (part ? part[0]!.toUpperCase() + part.slice(1) : part))\n .join('-');\n}\n\ntype ExpressRoutePath = string | string[] | RegExp;\n\ntype ExpressRouteParams = Record<string, string | string[]>;\n\nconst expressParamsHistory = new WeakMap<IncomingMessage, ExpressRouteParams[]>();\n\nfunction trackExpressParams(req: IncomingMessage): void {\n if (expressParamsHistory.has(req)) {\n return;\n }\n const anyReq = req as IncomingMessage & { app?: unknown };\n if (typeof anyReq.app !== 'function') {\n return;\n }\n\n const history: ExpressRouteParams[] = [];\n expressParamsHistory.set(req, history);\n\n const descriptor = Object.getOwnPropertyDescriptor(req, 'params');\n if (descriptor && !descriptor.configurable) {\n if (descriptor.value && typeof descriptor.value === 'object') {\n history.push({ ...(descriptor.value as ExpressRouteParams) });\n }\n return;\n }\n\n let current = (\n descriptor && 'value' in descriptor\n ? (descriptor.value as ExpressRouteParams | undefined)\n : undefined\n ) as ExpressRouteParams | undefined;\n if (current && typeof current === 'object') {\n history.push({ ...current });\n }\n\n Object.defineProperty(req, 'params', {\n configurable: true,\n enumerable: descriptor?.enumerable ?? true,\n get() {\n return current;\n },\n set(value) {\n current = value as ExpressRouteParams | undefined;\n if (value && typeof value === 'object') {\n history.push({ ...(value as ExpressRouteParams) });\n }\n },\n });\n}\n\nfunction resolveExpressRoute(req: IncomingMessage): string | undefined {\n const anyReq = req as IncomingMessage & {\n baseUrl?: string;\n params?: ExpressRouteParams;\n route?: { path?: ExpressRoutePath };\n };\n const routePath = extractExpressRoutePath(anyReq.route?.path);\n const baseUrl = anyReq.baseUrl ?? '';\n if (!routePath && !baseUrl) {\n return undefined;\n }\n\n const params = collectExpressParams(req, anyReq.params);\n const resolvedBaseUrl = replaceBaseUrlParams(baseUrl, params, routePath);\n return joinExpressRoute(resolvedBaseUrl, routePath);\n}\n\nfunction extractExpressRoutePath(path?: ExpressRoutePath): string | undefined {\n if (typeof path === 'string') {\n return path;\n }\n if (Array.isArray(path)) {\n for (const entry of path) {\n if (typeof entry === 'string') {\n return entry;\n }\n }\n }\n return undefined;\n}\n\nfunction collectExpressParams(\n req: IncomingMessage,\n fallback?: ExpressRouteParams,\n): ExpressRouteParams {\n const history = expressParamsHistory.get(req);\n if (!history || history.length === 0) {\n return fallback ?? {};\n }\n\n const merged: ExpressRouteParams = {};\n for (const snapshot of history) {\n for (const [key, value] of Object.entries(snapshot)) {\n if (!(key in merged)) {\n merged[key] = value;\n }\n }\n }\n if (fallback) {\n for (const [key, value] of Object.entries(fallback)) {\n if (!(key in merged)) {\n merged[key] = value;\n }\n }\n }\n return merged;\n}\n\nfunction replaceBaseUrlParams(\n baseUrl: string,\n params: ExpressRouteParams,\n routePath?: string,\n): string {\n if (!baseUrl) {\n return baseUrl;\n }\n const entries = Object.entries(params);\n if (entries.length === 0) {\n return baseUrl;\n }\n\n const excluded = new Set(routePath ? extractExpressParamNames(routePath) : []);\n const replacements = entries\n .filter(([name]) => !excluded.has(name))\n .map(([name, value]) => ({ name, value: Array.isArray(value) ? value[0] : value }))\n .filter((entry): entry is { name: string; value: string } => !!entry.value);\n\n if (replacements.length === 0) {\n return baseUrl;\n }\n\n const used = new Set<string>();\n const encodedCache = new Map<string, string>();\n const segments = baseUrl.split('/');\n const updated = segments.map((segment) => {\n if (!segment) {\n return segment;\n }\n for (const { name, value } of replacements) {\n if (used.has(name)) {\n continue;\n }\n const encodedValue = encodedCache.get(value) ?? encodeURIComponent(value);\n encodedCache.set(value, encodedValue);\n if (segment === value || segment === encodedValue) {\n used.add(name);\n return `:${name}`;\n }\n }\n return segment;\n });\n\n return updated.join('/');\n}\n\nfunction extractExpressParamNames(path: string): string[] {\n const names: string[] = [];\n const paramPattern = /:([A-Za-z0-9_]+)(?:\\([^)]*\\))?[?*+]?/g;\n for (const match of path.matchAll(paramPattern)) {\n const name = match[1];\n if (name) {\n names.push(name);\n }\n }\n return names;\n}\n\nfunction joinExpressRoute(baseUrl: string, routePath?: string): string {\n const base = baseUrl ? ensureLeadingSlash(baseUrl) : '';\n const route = routePath ? ensureLeadingSlash(routePath) : '';\n if (!base) {\n return route || '/';\n }\n if (!route || route === '/') {\n return base;\n }\n const trimmedBase = base.endsWith('/') ? base.slice(0, -1) : base;\n return `${trimmedBase}${route}`;\n}\n\nfunction ensureLeadingSlash(path: string): string {\n if (!path) {\n return '/';\n }\n return path.startsWith('/') ? path : `/${path}`;\n}\n"],"mappings":"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","names":["createEmitter"]}
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
logWithLevel,
|
|
7
7
|
sanitizeHeaderValues,
|
|
8
8
|
sanitizeLogString
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-7KT6EPVZ.js";
|
|
10
10
|
|
|
11
11
|
// src/core/route.ts
|
|
12
12
|
function normalizeRoutePattern(route) {
|
|
@@ -680,6 +680,7 @@ var AttributeKeyResponseBody = "http.response.body";
|
|
|
680
680
|
var AttributeKeyResponseBodyEncoding = "http.response.body.encoding";
|
|
681
681
|
var AttributeKeyResponseBodyTruncated = "http.response.body.truncated";
|
|
682
682
|
var AttributeKeySpanDrop = "stainlessxray.internal.drop";
|
|
683
|
+
var AttributeKeyTenantID = "stainlessxray.tenant.id";
|
|
683
684
|
|
|
684
685
|
// src/core/attributes.ts
|
|
685
686
|
function setHeaderAttributes(span, headers, prefix) {
|
|
@@ -897,6 +898,9 @@ function setRouteAttribute(span, route) {
|
|
|
897
898
|
function setUserIdAttribute(span, userId) {
|
|
898
899
|
span.setAttribute(ATTR_USER_ID, userId);
|
|
899
900
|
}
|
|
901
|
+
function setTenantIdAttribute(span, tenantId) {
|
|
902
|
+
span.setAttribute(AttributeKeyTenantID, tenantId);
|
|
903
|
+
}
|
|
900
904
|
function setRequestIdAttribute(span, requestId) {
|
|
901
905
|
span.setAttribute(AttributeKeyRequestID, requestId);
|
|
902
906
|
}
|
|
@@ -1053,6 +1057,27 @@ function startRequest(config, tracer, req) {
|
|
|
1053
1057
|
requestId: explicitRequestId ?? "",
|
|
1054
1058
|
traceId: span?.spanContext().traceId,
|
|
1055
1059
|
spanId: span?.spanContext().spanId,
|
|
1060
|
+
setActor: (tenantId, userId) => {
|
|
1061
|
+
const state2 = getContextState(context);
|
|
1062
|
+
if (!state2) {
|
|
1063
|
+
return;
|
|
1064
|
+
}
|
|
1065
|
+
state2.tenantId = tenantId;
|
|
1066
|
+
state2.userId = userId || void 0;
|
|
1067
|
+
if (span) {
|
|
1068
|
+
try {
|
|
1069
|
+
setTenantIdAttribute(span, tenantId);
|
|
1070
|
+
if (userId) {
|
|
1071
|
+
setUserIdAttribute(span, userId);
|
|
1072
|
+
}
|
|
1073
|
+
} catch (err) {
|
|
1074
|
+
logWithLevel(config.logger, "error", config.logLevel, "xray: setActor failed", {
|
|
1075
|
+
error: err instanceof Error ? err.message : String(err)
|
|
1076
|
+
});
|
|
1077
|
+
}
|
|
1078
|
+
}
|
|
1079
|
+
},
|
|
1080
|
+
// Deprecated compatibility alias; prefer setActor(tenantId, userId).
|
|
1056
1081
|
setUserId: (id) => {
|
|
1057
1082
|
const state2 = getContextState(context);
|
|
1058
1083
|
if (!state2) {
|
|
@@ -1062,7 +1087,10 @@ function startRequest(config, tracer, req) {
|
|
|
1062
1087
|
if (span && id) {
|
|
1063
1088
|
try {
|
|
1064
1089
|
setUserIdAttribute(span, id);
|
|
1065
|
-
} catch {
|
|
1090
|
+
} catch (err) {
|
|
1091
|
+
logWithLevel(config.logger, "error", config.logLevel, "xray: setUserId failed", {
|
|
1092
|
+
error: err instanceof Error ? err.message : String(err)
|
|
1093
|
+
});
|
|
1066
1094
|
}
|
|
1067
1095
|
}
|
|
1068
1096
|
},
|
|
@@ -1168,6 +1196,7 @@ function endRequest(config, ctx, res, err) {
|
|
|
1168
1196
|
responseHeaders: capture.responseHeaders ? sanitizeHeaderValues(res.headers) : void 0,
|
|
1169
1197
|
requestBody: capture.requestBody === "none" ? void 0 : request.body,
|
|
1170
1198
|
responseBody: capture.responseBody === "none" ? void 0 : res.body,
|
|
1199
|
+
tenantId: state.tenantId ?? void 0,
|
|
1171
1200
|
userId: state.userId ?? void 0,
|
|
1172
1201
|
sessionId: state.sessionId ?? void 0,
|
|
1173
1202
|
error: buildError(err ?? state.error),
|
|
@@ -1217,6 +1246,9 @@ function endRequest(config, ctx, res, err) {
|
|
|
1217
1246
|
setResponseBodyAttributes(span, redacted.responseBody);
|
|
1218
1247
|
setResponseBodySizeAttribute(span, redacted.responseBody.bytes);
|
|
1219
1248
|
}
|
|
1249
|
+
if (state.tenantId != null) {
|
|
1250
|
+
setTenantIdAttribute(span, state.tenantId);
|
|
1251
|
+
}
|
|
1220
1252
|
if (state.userId) {
|
|
1221
1253
|
setUserIdAttribute(span, state.userId);
|
|
1222
1254
|
}
|
|
@@ -1337,4 +1369,4 @@ export {
|
|
|
1337
1369
|
normalizeConfig,
|
|
1338
1370
|
createEmitter
|
|
1339
1371
|
};
|
|
1340
|
-
//# sourceMappingURL=chunk-
|
|
1372
|
+
//# sourceMappingURL=chunk-GYXI3DWB.js.map
|