@stainlessdev/xray-emitter 0.1.0-dev.2c5bc4c → 0.1.0-dev.3b8d877

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/README.md +1 -2
  2. package/dist/{chunk-YVMMCTXW.js → chunk-7KT6EPVZ.js} +1 -1
  3. package/dist/{chunk-YVMMCTXW.js.map → chunk-7KT6EPVZ.js.map} +1 -1
  4. package/dist/{chunk-GNSXLLEC.cjs → chunk-CPHFCOA5.cjs} +9 -9
  5. package/dist/{chunk-GNSXLLEC.cjs.map → chunk-CPHFCOA5.cjs.map} +1 -1
  6. package/dist/{chunk-JKW6E4L3.cjs → chunk-DNBARLGB.cjs} +1 -1
  7. package/dist/{chunk-JKW6E4L3.cjs.map → chunk-DNBARLGB.cjs.map} +1 -1
  8. package/dist/{chunk-DBI3HXNR.cjs → chunk-ESBHEKC2.cjs} +47 -47
  9. package/dist/{chunk-DBI3HXNR.cjs.map → chunk-ESBHEKC2.cjs.map} +1 -1
  10. package/dist/{chunk-WTHVUHGI.js → chunk-KU23HQLZ.js} +4 -4
  11. package/dist/{chunk-6UH43LVD.js → chunk-NTIUR3OC.js} +2 -2
  12. package/dist/{chunk-2HW4AEKB.cjs → chunk-OCXEYDDH.cjs} +28 -28
  13. package/dist/{chunk-2HW4AEKB.cjs.map → chunk-OCXEYDDH.cjs.map} +1 -1
  14. package/dist/{chunk-XO6YWDFL.cjs → chunk-Q4MTHPUL.cjs} +47 -21
  15. package/dist/chunk-Q4MTHPUL.cjs.map +1 -0
  16. package/dist/{chunk-TSCMZ5TV.js → chunk-VRRPTE7W.js} +28 -2
  17. package/dist/chunk-VRRPTE7W.js.map +1 -0
  18. package/dist/{chunk-ZP5OEA4I.js → chunk-W75UIHEF.js} +4 -4
  19. package/dist/effect.cjs +19 -19
  20. package/dist/effect.d.cts +3 -3
  21. package/dist/effect.d.ts +3 -3
  22. package/dist/effect.js +4 -4
  23. package/dist/{emitter-BqfrGIod.d.cts → emitter-Cdl6H6vk.d.cts} +1 -1
  24. package/dist/{emitter-CScYhwGA.d.ts → emitter-DnDvQw9i.d.ts} +1 -1
  25. package/dist/express.cjs +7 -7
  26. package/dist/express.d.cts +2 -2
  27. package/dist/express.d.ts +2 -2
  28. package/dist/express.js +4 -4
  29. package/dist/fastify.cjs +10 -10
  30. package/dist/fastify.d.cts +2 -2
  31. package/dist/fastify.d.ts +2 -2
  32. package/dist/fastify.js +4 -4
  33. package/dist/fetch.cjs +5 -5
  34. package/dist/fetch.d.cts +2 -2
  35. package/dist/fetch.d.ts +2 -2
  36. package/dist/fetch.js +4 -4
  37. package/dist/hono.cjs +9 -9
  38. package/dist/hono.d.cts +3 -3
  39. package/dist/hono.d.ts +3 -3
  40. package/dist/hono.js +4 -4
  41. package/dist/index.cjs +3 -3
  42. package/dist/index.d.cts +2 -2
  43. package/dist/index.d.ts +2 -2
  44. package/dist/index.js +2 -2
  45. package/dist/internal.cjs +3 -3
  46. package/dist/internal.d.cts +1 -1
  47. package/dist/internal.d.ts +1 -1
  48. package/dist/internal.js +2 -2
  49. package/dist/next.cjs +7 -7
  50. package/dist/next.d.cts +3 -3
  51. package/dist/next.d.ts +3 -3
  52. package/dist/next.js +4 -4
  53. package/dist/node.cjs +5 -5
  54. package/dist/node.d.cts +1 -1
  55. package/dist/node.d.ts +1 -1
  56. package/dist/node.js +4 -4
  57. package/dist/remix.cjs +7 -7
  58. package/dist/remix.d.cts +3 -3
  59. package/dist/remix.d.ts +3 -3
  60. package/dist/remix.js +4 -4
  61. package/dist/{types-Z1nirh-F.d.cts → types-Diy-KLjz.d.cts} +5 -0
  62. package/dist/{types-Z1nirh-F.d.ts → types-Diy-KLjz.d.ts} +5 -0
  63. package/package.json +1 -1
  64. package/dist/chunk-TSCMZ5TV.js.map +0 -1
  65. package/dist/chunk-XO6YWDFL.cjs.map +0 -1
  66. /package/dist/{chunk-WTHVUHGI.js.map → chunk-KU23HQLZ.js.map} +0 -0
  67. /package/dist/{chunk-6UH43LVD.js.map → chunk-NTIUR3OC.js.map} +0 -0
  68. /package/dist/{chunk-ZP5OEA4I.js.map → chunk-W75UIHEF.js.map} +0 -0
package/README.md CHANGED
@@ -23,7 +23,7 @@ app.use(xray);
23
23
 
24
24
  app.use((req, _res, next) => {
25
25
  const ctx = getXrayContext(req);
26
- ctx?.setUserId('user-123');
26
+ ctx?.setActor('tenant-123', 'user-123');
27
27
  next();
28
28
  });
29
29
 
@@ -32,7 +32,6 @@ app.get('/', (_req, res) => {
32
32
  });
33
33
  ```
34
34
 
35
-
36
35
  ## Supported frameworks
37
36
 
38
37
  | Framework | Import | Docs | Example |
@@ -301,4 +301,4 @@ export {
301
301
  bindObject,
302
302
  getContextFromObject
303
303
  };
304
- //# sourceMappingURL=chunk-YVMMCTXW.js.map
304
+ //# sourceMappingURL=chunk-7KT6EPVZ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../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"],"sourcesContent":["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"],"mappings":"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","names":["maxChunkBytes","chunkToEncodedLength","encodedLengthToChunk","maxEncodedChunk","encodeChunk","maxChunkBytes","encodeChunk"]}
1
+ {"version":3,"sources":["../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"],"sourcesContent":["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"],"mappings":"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","names":["maxChunkBytes","chunkToEncodedLength","encodedLengthToChunk","maxEncodedChunk","encodeChunk","maxChunkBytes","encodeChunk"]}
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- var _chunkJKW6E4L3cjs = require('./chunk-JKW6E4L3.cjs');
5
+ var _chunkDNBARLGBcjs = require('./chunk-DNBARLGB.cjs');
6
6
 
7
7
  // src/core/limited_buffer.ts
8
8
  var LimitedBuffer = class {
@@ -223,17 +223,17 @@ function headerHasTokenFetch(headers, name, token) {
223
223
 
224
224
  // src/core/internal.ts
225
225
  function bindContextToObject(target, ctx) {
226
- const state = _chunkJKW6E4L3cjs.getContextState.call(void 0, ctx);
226
+ const state = _chunkDNBARLGBcjs.getContextState.call(void 0, ctx);
227
227
  if (!state) {
228
228
  return;
229
229
  }
230
- _chunkJKW6E4L3cjs.bindObject.call(void 0, target, state);
230
+ _chunkDNBARLGBcjs.bindObject.call(void 0, target, state);
231
231
  }
232
232
  function getXrayContextFromObject(target) {
233
- return _chunkJKW6E4L3cjs.getContextFromObject.call(void 0, target);
233
+ return _chunkDNBARLGBcjs.getContextFromObject.call(void 0, target);
234
234
  }
235
235
  function setContextRoute(ctx, route) {
236
- const state = _chunkJKW6E4L3cjs.getContextState.call(void 0, ctx);
236
+ const state = _chunkDNBARLGBcjs.getContextState.call(void 0, ctx);
237
237
  if (!state) {
238
238
  return;
239
239
  }
@@ -241,7 +241,7 @@ function setContextRoute(ctx, route) {
241
241
  state.request.route = normalized;
242
242
  }
243
243
  function setContextRequestId(ctx, requestId) {
244
- const state = _chunkJKW6E4L3cjs.getContextState.call(void 0, ctx);
244
+ const state = _chunkDNBARLGBcjs.getContextState.call(void 0, ctx);
245
245
  if (!state) {
246
246
  return;
247
247
  }
@@ -249,14 +249,14 @@ function setContextRequestId(ctx, requestId) {
249
249
  state.context.requestId = requestId;
250
250
  }
251
251
  function setCaptureOverride(ctx, capture) {
252
- const state = _chunkJKW6E4L3cjs.getContextState.call(void 0, ctx);
252
+ const state = _chunkDNBARLGBcjs.getContextState.call(void 0, ctx);
253
253
  if (!state || !capture) {
254
254
  return;
255
255
  }
256
256
  state.captureOverride = capture;
257
257
  }
258
258
  function setRedactionOverride(ctx, redaction) {
259
- const state = _chunkJKW6E4L3cjs.getContextState.call(void 0, ctx);
259
+ const state = _chunkDNBARLGBcjs.getContextState.call(void 0, ctx);
260
260
  if (!state || !redaction) {
261
261
  return;
262
262
  }
@@ -278,4 +278,4 @@ function setRedactionOverride(ctx, redaction) {
278
278
 
279
279
 
280
280
  exports.LimitedBuffer = LimitedBuffer; exports.headerValuesFromNodeHeaders = headerValuesFromNodeHeaders; exports.headerValuesFromFetchHeaders = headerValuesFromFetchHeaders; exports.headerValuesFromFetchHeadersWithLimit = headerValuesFromFetchHeadersWithLimit; exports.headerTokenList = headerTokenList; exports.isWebsocketUpgrade = isWebsocketUpgrade; exports.isWebsocketUpgradeFetch = isWebsocketUpgradeFetch; exports.bindContextToObject = bindContextToObject; exports.getXrayContextFromObject = getXrayContextFromObject; exports.setContextRoute = setContextRoute; exports.setContextRequestId = setContextRequestId; exports.setCaptureOverride = setCaptureOverride; exports.setRedactionOverride = setRedactionOverride;
281
- //# sourceMappingURL=chunk-GNSXLLEC.cjs.map
281
+ //# sourceMappingURL=chunk-CPHFCOA5.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/xray-emitter-js/xray-emitter-js/dist/chunk-GNSXLLEC.cjs","../src/core/limited_buffer.ts","../src/core/headers.ts","../src/core/websocket.ts","../src/core/internal.ts"],"names":[],"mappings":"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","file":"/home/runner/work/xray-emitter-js/xray-emitter-js/dist/chunk-GNSXLLEC.cjs","sourcesContent":[null,"export class LimitedBuffer {\n private buffer: Uint8Array;\n private length: number;\n private readonly limit: number;\n private truncatedFlag: boolean;\n private total: number;\n\n constructor(limit: number) {\n const normalized = Number.isFinite(limit) ? Math.max(0, limit) : 0;\n const initialCap = Math.min(normalized, 32 * 1024);\n this.buffer = new Uint8Array(initialCap);\n this.length = 0;\n this.limit = normalized;\n this.truncatedFlag = false;\n this.total = 0;\n }\n\n bytes(): Uint8Array {\n return this.buffer.slice(0, this.length);\n }\n\n capturedBytes(): number {\n return this.length;\n }\n\n totalBytes(): number {\n return this.total;\n }\n\n truncated(): boolean {\n return this.truncatedFlag;\n }\n\n write(chunk: Uint8Array): void {\n if (!chunk || chunk.length === 0) {\n return;\n }\n\n this.total += chunk.length;\n if (this.limit <= 0) {\n this.truncatedFlag = true;\n return;\n }\n\n const remaining = this.limit - this.length;\n if (remaining <= 0) {\n this.truncatedFlag = true;\n return;\n }\n\n const toCopy = Math.min(remaining, chunk.length);\n this.ensureCapacity(this.length + toCopy);\n this.buffer.set(chunk.subarray(0, toCopy), this.length);\n this.length += toCopy;\n if (toCopy < chunk.length) {\n this.truncatedFlag = true;\n }\n }\n\n private ensureCapacity(size: number): void {\n if (this.buffer.length >= size) {\n return;\n }\n\n let nextSize = this.buffer.length;\n if (nextSize === 0) {\n nextSize = 1;\n }\n while (nextSize < size) {\n nextSize *= 2;\n }\n if (nextSize > this.limit) {\n nextSize = this.limit;\n }\n const next = new Uint8Array(nextSize);\n next.set(this.buffer.subarray(0, this.length));\n this.buffer = next;\n }\n}\n","export type HeaderCapture = {\n headers: Record<string, string | string[]>;\n truncated: boolean;\n};\n\nexport function headerValuesFromNodeHeaders(\n headers: Record<string, string | string[] | number | undefined>,\n): Record<string, string | string[]> {\n const result: Record<string, string | string[]> = {};\n for (const [key, value] of Object.entries(headers)) {\n if (value == null) {\n continue;\n }\n const name = key.trim();\n if (!name) {\n continue;\n }\n if (Array.isArray(value)) {\n const entries = value.map((item) => `${item}`);\n if (entries.length > 0) {\n result[name] = entries.length === 1 ? entries[0]! : entries;\n }\n } else {\n result[name] = `${value}`;\n }\n }\n return Object.keys(result).length === 0 ? {} : result;\n}\n\nexport function headerValuesFromFetchHeaders(headers: Headers): Record<string, string | string[]> {\n return headerValuesFromFetchHeadersWithLimit(headers, Number.POSITIVE_INFINITY).headers;\n}\n\nexport function headerValuesFromFetchHeadersWithLimit(\n headers: Headers,\n maxBytes: number,\n): HeaderCapture {\n const result: Record<string, string | string[]> = {};\n let truncated = false;\n let remaining = Number.isFinite(maxBytes) ? Math.max(0, maxBytes) : Number.POSITIVE_INFINITY;\n const setCookie = getSetCookie(headers);\n if (setCookie) {\n const values = takeHeaderValues('set-cookie', setCookie, remaining);\n remaining = values.remaining;\n if (values.truncated) {\n truncated = true;\n }\n if (values.values.length > 0) {\n result['set-cookie'] = values.values.length === 1 ? values.values[0]! : values.values;\n }\n }\n\n headers.forEach((value, key) => {\n const name = key.trim();\n if (!name) {\n return;\n }\n if (name.toLowerCase() === 'set-cookie' && setCookie) {\n return;\n }\n const values = takeHeaderValues(name, [value], remaining);\n remaining = values.remaining;\n if (values.truncated) {\n truncated = true;\n }\n if (values.values.length > 0) {\n result[name] = values.values.length === 1 ? values.values[0]! : values.values;\n }\n });\n\n return {\n headers: Object.keys(result).length === 0 ? {} : result,\n truncated,\n };\n}\n\nexport function headerTokenList(values: string[] | string | undefined): string[] {\n if (!values) {\n return [];\n }\n if (Array.isArray(values)) {\n return splitTokens(values);\n }\n return splitTokens([values]);\n}\n\nfunction splitTokens(values: string[]): string[] {\n const tokens: string[] = [];\n for (const value of values) {\n if (!value) {\n continue;\n }\n for (const part of value.split(',')) {\n const trimmed = part.trim();\n if (trimmed) {\n tokens.push(trimmed);\n }\n }\n }\n return tokens;\n}\n\nfunction getSetCookie(headers: Headers): string[] | null {\n const maybe = headers as Headers & { getSetCookie?: () => string[] };\n if (typeof maybe.getSetCookie === 'function') {\n const values = maybe.getSetCookie();\n return values.length > 0 ? values : null;\n }\n return null;\n}\n\nfunction takeHeaderValues(\n name: string,\n values: string[],\n remaining: number,\n): { values: string[]; remaining: number; truncated: boolean } {\n if (remaining <= 0) {\n return { remaining: 0, truncated: true, values: [] };\n }\n\n const taken: string[] = [];\n let used = 0;\n for (const value of values) {\n if (!value) {\n continue;\n }\n const size = name.length + value.length;\n if (used + size > remaining) {\n return { remaining: Math.max(0, remaining - used), truncated: true, values: taken };\n }\n used += size;\n taken.push(value);\n }\n\n return { remaining: Math.max(0, remaining - used), truncated: false, values: taken };\n}\n","import { headerTokenList } from './headers';\n\ntype HeaderValues = Record<string, string | string[]>;\n\nexport function isWebsocketUpgrade(\n statusCode: number,\n requestHeaders: HeaderValues | undefined,\n responseHeaders: HeaderValues | undefined,\n): boolean {\n if (statusCode !== 101) {\n return false;\n }\n\n if (headerHasToken(responseHeaders, 'upgrade', 'websocket')) {\n return true;\n }\n return headerHasToken(requestHeaders, 'upgrade', 'websocket');\n}\n\nexport function isWebsocketUpgradeFetch(\n statusCode: number,\n requestHeaders: Headers,\n responseHeaders: Headers,\n): boolean {\n if (statusCode !== 101) {\n return false;\n }\n\n if (headerHasTokenFetch(responseHeaders, 'upgrade', 'websocket')) {\n return true;\n }\n return headerHasTokenFetch(requestHeaders, 'upgrade', 'websocket');\n}\n\nfunction headerHasToken(headers: HeaderValues | undefined, name: string, token: string): boolean {\n if (!headers) {\n return false;\n }\n const values = headers[name] ?? headers[name.toLowerCase()] ?? headers[name.toUpperCase()];\n if (!values) {\n return false;\n }\n const tokens = headerTokenList(values);\n return tokens.some((value) => value.toLowerCase() === token.toLowerCase());\n}\n\nfunction headerHasTokenFetch(headers: Headers, name: string, token: string): boolean {\n const value = headers.get(name);\n if (!value) {\n return false;\n }\n return value.split(',').some((part) => part.trim().toLowerCase() === token.toLowerCase());\n}\n","import type { CaptureConfig, RedactionConfig } from './config';\nimport type { XrayContext } from './types';\nimport { bindObject, getContextFromObject, getContextState } from './state';\n\nexport { LimitedBuffer } from './limited_buffer';\nexport {\n headerValuesFromFetchHeaders,\n headerValuesFromFetchHeadersWithLimit,\n headerValuesFromNodeHeaders,\n headerTokenList,\n} from './headers';\nexport { isWebsocketUpgrade, isWebsocketUpgradeFetch } from './websocket';\nexport { makeCapturedBody } from './request_log';\nexport { logWithLevel } from './logger';\nexport { generateRequestId, uuidv7, uuidv7base48, uuidv7base62 } from './uuid';\n\nexport function bindContextToObject(target: object, ctx: XrayContext): void {\n const state = getContextState(ctx);\n if (!state) {\n return;\n }\n bindObject(target, state);\n}\n\nexport function getXrayContextFromObject(target: unknown): XrayContext | undefined {\n return getContextFromObject(target);\n}\n\nexport function setContextRoute(ctx: XrayContext, route: string): void {\n const state = getContextState(ctx);\n if (!state) {\n return;\n }\n const normalized =\n state.config.route.normalize && state.config.route.normalizer\n ? state.config.route.normalizer(route)\n : route;\n state.request.route = normalized;\n}\n\nexport function setContextRequestId(ctx: XrayContext, requestId: string): void {\n const state = getContextState(ctx);\n if (!state) {\n return;\n }\n state.request.requestId = requestId;\n state.context.requestId = requestId;\n}\n\nexport function setCaptureOverride(\n ctx: XrayContext,\n capture: Partial<CaptureConfig> | undefined,\n): void {\n const state = getContextState(ctx);\n if (!state || !capture) {\n return;\n }\n state.captureOverride = capture;\n}\n\nexport function setRedactionOverride(\n ctx: XrayContext,\n redaction: Partial<RedactionConfig> | undefined,\n): void {\n const state = getContextState(ctx);\n if (!state || !redaction) {\n return;\n }\n state.redactionOverride = redaction;\n}\n"]}
1
+ {"version":3,"sources":["/home/runner/work/xray-emitter-js/xray-emitter-js/dist/chunk-CPHFCOA5.cjs","../src/core/limited_buffer.ts","../src/core/headers.ts","../src/core/websocket.ts","../src/core/internal.ts"],"names":[],"mappings":"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","file":"/home/runner/work/xray-emitter-js/xray-emitter-js/dist/chunk-CPHFCOA5.cjs","sourcesContent":[null,"export class LimitedBuffer {\n private buffer: Uint8Array;\n private length: number;\n private readonly limit: number;\n private truncatedFlag: boolean;\n private total: number;\n\n constructor(limit: number) {\n const normalized = Number.isFinite(limit) ? Math.max(0, limit) : 0;\n const initialCap = Math.min(normalized, 32 * 1024);\n this.buffer = new Uint8Array(initialCap);\n this.length = 0;\n this.limit = normalized;\n this.truncatedFlag = false;\n this.total = 0;\n }\n\n bytes(): Uint8Array {\n return this.buffer.slice(0, this.length);\n }\n\n capturedBytes(): number {\n return this.length;\n }\n\n totalBytes(): number {\n return this.total;\n }\n\n truncated(): boolean {\n return this.truncatedFlag;\n }\n\n write(chunk: Uint8Array): void {\n if (!chunk || chunk.length === 0) {\n return;\n }\n\n this.total += chunk.length;\n if (this.limit <= 0) {\n this.truncatedFlag = true;\n return;\n }\n\n const remaining = this.limit - this.length;\n if (remaining <= 0) {\n this.truncatedFlag = true;\n return;\n }\n\n const toCopy = Math.min(remaining, chunk.length);\n this.ensureCapacity(this.length + toCopy);\n this.buffer.set(chunk.subarray(0, toCopy), this.length);\n this.length += toCopy;\n if (toCopy < chunk.length) {\n this.truncatedFlag = true;\n }\n }\n\n private ensureCapacity(size: number): void {\n if (this.buffer.length >= size) {\n return;\n }\n\n let nextSize = this.buffer.length;\n if (nextSize === 0) {\n nextSize = 1;\n }\n while (nextSize < size) {\n nextSize *= 2;\n }\n if (nextSize > this.limit) {\n nextSize = this.limit;\n }\n const next = new Uint8Array(nextSize);\n next.set(this.buffer.subarray(0, this.length));\n this.buffer = next;\n }\n}\n","export type HeaderCapture = {\n headers: Record<string, string | string[]>;\n truncated: boolean;\n};\n\nexport function headerValuesFromNodeHeaders(\n headers: Record<string, string | string[] | number | undefined>,\n): Record<string, string | string[]> {\n const result: Record<string, string | string[]> = {};\n for (const [key, value] of Object.entries(headers)) {\n if (value == null) {\n continue;\n }\n const name = key.trim();\n if (!name) {\n continue;\n }\n if (Array.isArray(value)) {\n const entries = value.map((item) => `${item}`);\n if (entries.length > 0) {\n result[name] = entries.length === 1 ? entries[0]! : entries;\n }\n } else {\n result[name] = `${value}`;\n }\n }\n return Object.keys(result).length === 0 ? {} : result;\n}\n\nexport function headerValuesFromFetchHeaders(headers: Headers): Record<string, string | string[]> {\n return headerValuesFromFetchHeadersWithLimit(headers, Number.POSITIVE_INFINITY).headers;\n}\n\nexport function headerValuesFromFetchHeadersWithLimit(\n headers: Headers,\n maxBytes: number,\n): HeaderCapture {\n const result: Record<string, string | string[]> = {};\n let truncated = false;\n let remaining = Number.isFinite(maxBytes) ? Math.max(0, maxBytes) : Number.POSITIVE_INFINITY;\n const setCookie = getSetCookie(headers);\n if (setCookie) {\n const values = takeHeaderValues('set-cookie', setCookie, remaining);\n remaining = values.remaining;\n if (values.truncated) {\n truncated = true;\n }\n if (values.values.length > 0) {\n result['set-cookie'] = values.values.length === 1 ? values.values[0]! : values.values;\n }\n }\n\n headers.forEach((value, key) => {\n const name = key.trim();\n if (!name) {\n return;\n }\n if (name.toLowerCase() === 'set-cookie' && setCookie) {\n return;\n }\n const values = takeHeaderValues(name, [value], remaining);\n remaining = values.remaining;\n if (values.truncated) {\n truncated = true;\n }\n if (values.values.length > 0) {\n result[name] = values.values.length === 1 ? values.values[0]! : values.values;\n }\n });\n\n return {\n headers: Object.keys(result).length === 0 ? {} : result,\n truncated,\n };\n}\n\nexport function headerTokenList(values: string[] | string | undefined): string[] {\n if (!values) {\n return [];\n }\n if (Array.isArray(values)) {\n return splitTokens(values);\n }\n return splitTokens([values]);\n}\n\nfunction splitTokens(values: string[]): string[] {\n const tokens: string[] = [];\n for (const value of values) {\n if (!value) {\n continue;\n }\n for (const part of value.split(',')) {\n const trimmed = part.trim();\n if (trimmed) {\n tokens.push(trimmed);\n }\n }\n }\n return tokens;\n}\n\nfunction getSetCookie(headers: Headers): string[] | null {\n const maybe = headers as Headers & { getSetCookie?: () => string[] };\n if (typeof maybe.getSetCookie === 'function') {\n const values = maybe.getSetCookie();\n return values.length > 0 ? values : null;\n }\n return null;\n}\n\nfunction takeHeaderValues(\n name: string,\n values: string[],\n remaining: number,\n): { values: string[]; remaining: number; truncated: boolean } {\n if (remaining <= 0) {\n return { remaining: 0, truncated: true, values: [] };\n }\n\n const taken: string[] = [];\n let used = 0;\n for (const value of values) {\n if (!value) {\n continue;\n }\n const size = name.length + value.length;\n if (used + size > remaining) {\n return { remaining: Math.max(0, remaining - used), truncated: true, values: taken };\n }\n used += size;\n taken.push(value);\n }\n\n return { remaining: Math.max(0, remaining - used), truncated: false, values: taken };\n}\n","import { headerTokenList } from './headers';\n\ntype HeaderValues = Record<string, string | string[]>;\n\nexport function isWebsocketUpgrade(\n statusCode: number,\n requestHeaders: HeaderValues | undefined,\n responseHeaders: HeaderValues | undefined,\n): boolean {\n if (statusCode !== 101) {\n return false;\n }\n\n if (headerHasToken(responseHeaders, 'upgrade', 'websocket')) {\n return true;\n }\n return headerHasToken(requestHeaders, 'upgrade', 'websocket');\n}\n\nexport function isWebsocketUpgradeFetch(\n statusCode: number,\n requestHeaders: Headers,\n responseHeaders: Headers,\n): boolean {\n if (statusCode !== 101) {\n return false;\n }\n\n if (headerHasTokenFetch(responseHeaders, 'upgrade', 'websocket')) {\n return true;\n }\n return headerHasTokenFetch(requestHeaders, 'upgrade', 'websocket');\n}\n\nfunction headerHasToken(headers: HeaderValues | undefined, name: string, token: string): boolean {\n if (!headers) {\n return false;\n }\n const values = headers[name] ?? headers[name.toLowerCase()] ?? headers[name.toUpperCase()];\n if (!values) {\n return false;\n }\n const tokens = headerTokenList(values);\n return tokens.some((value) => value.toLowerCase() === token.toLowerCase());\n}\n\nfunction headerHasTokenFetch(headers: Headers, name: string, token: string): boolean {\n const value = headers.get(name);\n if (!value) {\n return false;\n }\n return value.split(',').some((part) => part.trim().toLowerCase() === token.toLowerCase());\n}\n","import type { CaptureConfig, RedactionConfig } from './config';\nimport type { XrayContext } from './types';\nimport { bindObject, getContextFromObject, getContextState } from './state';\n\nexport { LimitedBuffer } from './limited_buffer';\nexport {\n headerValuesFromFetchHeaders,\n headerValuesFromFetchHeadersWithLimit,\n headerValuesFromNodeHeaders,\n headerTokenList,\n} from './headers';\nexport { isWebsocketUpgrade, isWebsocketUpgradeFetch } from './websocket';\nexport { makeCapturedBody } from './request_log';\nexport { logWithLevel } from './logger';\nexport { generateRequestId, uuidv7, uuidv7base48, uuidv7base62 } from './uuid';\n\nexport function bindContextToObject(target: object, ctx: XrayContext): void {\n const state = getContextState(ctx);\n if (!state) {\n return;\n }\n bindObject(target, state);\n}\n\nexport function getXrayContextFromObject(target: unknown): XrayContext | undefined {\n return getContextFromObject(target);\n}\n\nexport function setContextRoute(ctx: XrayContext, route: string): void {\n const state = getContextState(ctx);\n if (!state) {\n return;\n }\n const normalized =\n state.config.route.normalize && state.config.route.normalizer\n ? state.config.route.normalizer(route)\n : route;\n state.request.route = normalized;\n}\n\nexport function setContextRequestId(ctx: XrayContext, requestId: string): void {\n const state = getContextState(ctx);\n if (!state) {\n return;\n }\n state.request.requestId = requestId;\n state.context.requestId = requestId;\n}\n\nexport function setCaptureOverride(\n ctx: XrayContext,\n capture: Partial<CaptureConfig> | undefined,\n): void {\n const state = getContextState(ctx);\n if (!state || !capture) {\n return;\n }\n state.captureOverride = capture;\n}\n\nexport function setRedactionOverride(\n ctx: XrayContext,\n redaction: Partial<RedactionConfig> | undefined,\n): void {\n const state = getContextState(ctx);\n if (!state || !redaction) {\n return;\n }\n state.redactionOverride = redaction;\n}\n"]}
@@ -301,4 +301,4 @@ function findNestedTarget(obj) {
301
301
 
302
302
 
303
303
  exports.encodeBase64 = encodeBase64; exports.logWithLevel = logWithLevel; exports.sanitizeLogString = sanitizeLogString; exports.sanitizeHeaderValues = sanitizeHeaderValues; exports.makeCapturedBody = makeCapturedBody; exports.uuidv7 = uuidv7; exports.uuidv7base62 = uuidv7base62; exports.uuidv7base48 = uuidv7base48; exports.generateRequestId = generateRequestId; exports.bindContext = bindContext; exports.getContextState = getContextState; exports.bindObject = bindObject; exports.getContextFromObject = getContextFromObject;
304
- //# sourceMappingURL=chunk-JKW6E4L3.cjs.map
304
+ //# sourceMappingURL=chunk-DNBARLGB.cjs.map
@@ -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"]}