@private.me/xbind 3.0.2 → 3.0.3

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 (221) hide show
  1. package/README.md +2366 -204
  2. package/README.md.backup +2121 -0
  3. package/dist-standalone/_deps/mldsa-wasm/dist/mldsa.js +1 -1920
  4. package/dist-standalone/_deps/shared/cjs/errors.js +1 -729
  5. package/dist-standalone/_deps/shared/cjs/index.js +1 -463
  6. package/dist-standalone/_deps/shared/cjs/types.js +1 -315
  7. package/dist-standalone/_deps/shared/errors.js +1 -244
  8. package/dist-standalone/_deps/shared/index.js +1 -72
  9. package/dist-standalone/_deps/shared/types.js +1 -86
  10. package/dist-standalone/_deps/ux-helpers/cjs/errors.js +1 -1
  11. package/dist-standalone/_deps/ux-helpers/cjs/index.js +1 -1
  12. package/dist-standalone/_deps/ux-helpers/cjs/pagination.js +1 -1
  13. package/dist-standalone/_deps/ux-helpers/cjs/progress.js +1 -1
  14. package/dist-standalone/_deps/ux-helpers/cjs/search.js +1 -1
  15. package/dist-standalone/_deps/ux-helpers/cjs/types.js +1 -1
  16. package/dist-standalone/_deps/ux-helpers/errors.js +1 -1
  17. package/dist-standalone/_deps/ux-helpers/index.js +1 -1
  18. package/dist-standalone/_deps/ux-helpers/pagination.js +1 -1
  19. package/dist-standalone/_deps/ux-helpers/progress.js +1 -1
  20. package/dist-standalone/_deps/ux-helpers/search.js +1 -1
  21. package/dist-standalone/_deps/xchange/auto-accept.js +1 -1
  22. package/dist-standalone/_deps/xchange/cjs/auto-accept.js +1 -1
  23. package/dist-standalone/_deps/xchange/cjs/errors.js +1 -1
  24. package/dist-standalone/_deps/xchange/cjs/index.js +1 -1
  25. package/dist-standalone/_deps/xchange/cjs/invite-client.js +1 -1
  26. package/dist-standalone/_deps/xchange/cjs/lazy-init.js +1 -1
  27. package/dist-standalone/_deps/xchange/cjs/trust-integration.js +1 -1
  28. package/dist-standalone/_deps/xchange/cjs/xchange.js +1 -1
  29. package/dist-standalone/_deps/xchange/errors.js +1 -1
  30. package/dist-standalone/_deps/xchange/index.js +1 -1
  31. package/dist-standalone/_deps/xchange/invite-client.js +1 -1
  32. package/dist-standalone/_deps/xchange/lazy-init.js +1 -1
  33. package/dist-standalone/_deps/xchange/trust-integration.js +1 -1
  34. package/dist-standalone/_deps/xchange/xchange.js +1 -1
  35. package/dist-standalone/_deps/xregistry/cjs/discovery.js +1 -1
  36. package/dist-standalone/_deps/xregistry/cjs/errors.js +1 -1
  37. package/dist-standalone/_deps/xregistry/cjs/index.js +1 -1
  38. package/dist-standalone/_deps/xregistry/cjs/registry.js +1 -1
  39. package/dist-standalone/_deps/xregistry/cjs/schema.js +1 -1
  40. package/dist-standalone/_deps/xregistry/cjs/types.js +1 -1
  41. package/dist-standalone/_deps/xregistry/discovery.js +1 -1
  42. package/dist-standalone/_deps/xregistry/errors.js +1 -1
  43. package/dist-standalone/_deps/xregistry/index.js +1 -1
  44. package/dist-standalone/_deps/xregistry/registry.js +1 -1
  45. package/dist-standalone/_deps/xregistry/schema.js +1 -1
  46. package/dist-standalone/_deps/xregistry/types.js +1 -1
  47. package/dist-standalone/agent-call.d.ts +2 -2
  48. package/dist-standalone/agent-call.js +1 -659
  49. package/dist-standalone/agent-sdk.js +1 -328
  50. package/dist-standalone/agent.d.ts +2 -0
  51. package/dist-standalone/agent.js +1 -1800
  52. package/dist-standalone/approval.js +1 -193
  53. package/dist-standalone/async-iterators.d.ts +3 -3
  54. package/dist-standalone/async-iterators.js +1 -382
  55. package/dist-standalone/auth.js +1 -219
  56. package/dist-standalone/auto-accept.js +1 -229
  57. package/dist-standalone/backup-config.js +1 -201
  58. package/dist-standalone/backup.js +1 -326
  59. package/dist-standalone/batch-operations.js +1 -388
  60. package/dist-standalone/cancellation.js +1 -477
  61. package/dist-standalone/checkpoint.js +1 -186
  62. package/dist-standalone/circuit-breaker.js +1 -468
  63. package/dist-standalone/cjs/agent-call.js +1 -701
  64. package/dist-standalone/cjs/agent-sdk.js +1 -332
  65. package/dist-standalone/cjs/agent.js +1 -1837
  66. package/dist-standalone/cjs/approval.js +1 -199
  67. package/dist-standalone/cjs/async-iterators.js +1 -392
  68. package/dist-standalone/cjs/auth.js +1 -225
  69. package/dist-standalone/cjs/auto-accept.js +1 -233
  70. package/dist-standalone/cjs/backup-config.js +1 -207
  71. package/dist-standalone/cjs/backup.js +1 -330
  72. package/dist-standalone/cjs/batch-operations.js +1 -397
  73. package/dist-standalone/cjs/cancellation.js +1 -490
  74. package/dist-standalone/cjs/checkpoint.js +1 -193
  75. package/dist-standalone/cjs/circuit-breaker.js +1 -476
  76. package/dist-standalone/cjs/cli/init.js +1 -492
  77. package/dist-standalone/cjs/config-validation.js +1 -522
  78. package/dist-standalone/cjs/connect.js +1 -312
  79. package/dist-standalone/cjs/connection-pool.js +1 -506
  80. package/dist-standalone/cjs/correlation-id.js +1 -339
  81. package/dist-standalone/cjs/crypto-utils.js +1 -176
  82. package/dist-standalone/cjs/debug-mode.js +1 -534
  83. package/dist-standalone/cjs/did-document.js +1 -101
  84. package/dist-standalone/cjs/did-privateme.js +1 -130
  85. package/dist-standalone/cjs/did-web.js +1 -201
  86. package/dist-standalone/cjs/discovery.js +1 -462
  87. package/dist-standalone/cjs/dual-mode.js +1 -251
  88. package/dist-standalone/cjs/email-templates.js +1 -313
  89. package/dist-standalone/cjs/email-transport.js +1 -239
  90. package/dist-standalone/cjs/envelope.js +1 -538
  91. package/dist-standalone/cjs/errors.js +1 -913
  92. package/dist-standalone/cjs/event-emitter.js +1 -461
  93. package/dist-standalone/cjs/gateway-state.js +1 -55
  94. package/dist-standalone/cjs/gateway-transport.js +1 -120
  95. package/dist-standalone/cjs/graceful-degradation.js +1 -403
  96. package/dist-standalone/cjs/guardrails.js +1 -223
  97. package/dist-standalone/cjs/health-check.js +1 -336
  98. package/dist-standalone/cjs/http-compat.js +1 -272
  99. package/dist-standalone/cjs/http-status-map.js +1 -571
  100. package/dist-standalone/cjs/identity.js +1 -645
  101. package/dist-standalone/cjs/index.js +1 -406
  102. package/dist-standalone/cjs/invitation.js +1 -421
  103. package/dist-standalone/cjs/invite.js +1 -328
  104. package/dist-standalone/cjs/key-agreement.js +1 -335
  105. package/dist-standalone/cjs/lazy-init.js +1 -300
  106. package/dist-standalone/cjs/logger.js +1 -291
  107. package/dist-standalone/cjs/loopback-transport.js +1 -0
  108. package/dist-standalone/cjs/mdns-discovery.js +1 -202
  109. package/dist-standalone/cjs/nonce-store.js +1 -80
  110. package/dist-standalone/cjs/pairing-manager.js +1 -223
  111. package/dist-standalone/cjs/plugin-system.js +1 -264
  112. package/dist-standalone/cjs/plugins/logging.js +1 -168
  113. package/dist-standalone/cjs/plugins/metrics.js +1 -181
  114. package/dist-standalone/cjs/plugins/validation.js +1 -302
  115. package/dist-standalone/cjs/policy.js +1 -320
  116. package/dist-standalone/cjs/progress-callbacks.js +1 -583
  117. package/dist-standalone/cjs/redis-nonce-store.js +1 -76
  118. package/dist-standalone/cjs/registry-middleware.js +1 -50
  119. package/dist-standalone/cjs/retry-strategies.js +1 -544
  120. package/dist-standalone/cjs/retry-transport.js +1 -102
  121. package/dist-standalone/cjs/runtime/browser.js +1 -533
  122. package/dist-standalone/cjs/runtime/edge.js +1 -526
  123. package/dist-standalone/cjs/runtime/react-native.js +1 -394
  124. package/dist-standalone/cjs/security-policy.js +1 -245
  125. package/dist-standalone/cjs/serialization.js +1 -1040
  126. package/dist-standalone/cjs/split-channel.js +1 -225
  127. package/dist-standalone/cjs/subscription-proof.js +1 -230
  128. package/dist-standalone/cjs/succession.js +1 -148
  129. package/dist-standalone/cjs/timeouts.js +1 -412
  130. package/dist-standalone/cjs/trace-context.js +1 -424
  131. package/dist-standalone/cjs/trace-spans.js +1 -495
  132. package/dist-standalone/cjs/transport.js +1 -63
  133. package/dist-standalone/cjs/trust-registry.js +1 -991
  134. package/dist-standalone/cjs/types/error-response.js +1 -56
  135. package/dist-standalone/cjs/vault-auth.js +1 -178
  136. package/dist-standalone/cjs/vault-store-loader.js +1 -194
  137. package/dist-standalone/cjs/verify.js +1 -25
  138. package/dist-standalone/cjs/version-info.js +1 -543
  139. package/dist-standalone/cjs/xfetch.js +1 -340
  140. package/dist-standalone/cli/init.js +1 -455
  141. package/dist-standalone/cli/setup.js +1 -514
  142. package/dist-standalone/cli/types.js +1 -27
  143. package/dist-standalone/cli/xbind.js +1 -148
  144. package/dist-standalone/config-validation.js +1 -513
  145. package/dist-standalone/connect.js +1 -274
  146. package/dist-standalone/connection-pool.js +1 -500
  147. package/dist-standalone/correlation-id.js +1 -326
  148. package/dist-standalone/crypto-utils.d.ts +2 -7
  149. package/dist-standalone/crypto-utils.js +1 -157
  150. package/dist-standalone/debug-mode.js +1 -510
  151. package/dist-standalone/did-document.js +1 -96
  152. package/dist-standalone/did-privateme.js +1 -121
  153. package/dist-standalone/did-web.js +1 -196
  154. package/dist-standalone/discovery.js +1 -458
  155. package/dist-standalone/dual-mode.js +1 -247
  156. package/dist-standalone/email-templates.js +1 -309
  157. package/dist-standalone/email-transport.d.ts +2 -2
  158. package/dist-standalone/email-transport.js +1 -232
  159. package/dist-standalone/envelope.js +1 -525
  160. package/dist-standalone/errors.d.ts +13 -3
  161. package/dist-standalone/errors.js +1 -896
  162. package/dist-standalone/event-emitter.js +1 -456
  163. package/dist-standalone/gateway-state.d.ts +1 -1
  164. package/dist-standalone/gateway-state.js +1 -51
  165. package/dist-standalone/gateway-transport.js +1 -116
  166. package/dist-standalone/graceful-degradation.js +1 -396
  167. package/dist-standalone/guardrails.js +1 -216
  168. package/dist-standalone/health-check.d.ts +5 -1
  169. package/dist-standalone/health-check.js +1 -332
  170. package/dist-standalone/http-compat.d.ts +1 -1
  171. package/dist-standalone/http-compat.js +1 -267
  172. package/dist-standalone/http-status-map.js +1 -561
  173. package/dist-standalone/identity.js +1 -619
  174. package/dist-standalone/index.d.ts +15 -4
  175. package/dist-standalone/index.js +1 -78
  176. package/dist-standalone/invitation.js +1 -415
  177. package/dist-standalone/invite.js +1 -324
  178. package/dist-standalone/key-agreement.js +1 -325
  179. package/dist-standalone/lazy-init.d.ts +11 -6
  180. package/dist-standalone/lazy-init.js +1 -295
  181. package/dist-standalone/logger.js +1 -285
  182. package/dist-standalone/loopback-transport.d.ts +87 -0
  183. package/dist-standalone/loopback-transport.js +1 -0
  184. package/dist-standalone/mdns-discovery.js +1 -195
  185. package/dist-standalone/nonce-store.js +1 -76
  186. package/dist-standalone/pairing-manager.js +1 -219
  187. package/dist-standalone/plugin-system.js +1 -257
  188. package/dist-standalone/plugins/logging.js +1 -163
  189. package/dist-standalone/plugins/metrics.d.ts +4 -4
  190. package/dist-standalone/plugins/metrics.js +1 -176
  191. package/dist-standalone/plugins/validation.js +1 -297
  192. package/dist-standalone/policy.js +1 -315
  193. package/dist-standalone/progress-callbacks.js +1 -576
  194. package/dist-standalone/redis-nonce-store.js +1 -72
  195. package/dist-standalone/registry-middleware.js +1 -47
  196. package/dist-standalone/retry-strategies.js +1 -534
  197. package/dist-standalone/retry-transport.js +1 -98
  198. package/dist-standalone/runtime/browser.js +1 -516
  199. package/dist-standalone/runtime/edge.js +1 -511
  200. package/dist-standalone/runtime/react-native.d.ts +1 -1
  201. package/dist-standalone/runtime/react-native.js +1 -383
  202. package/dist-standalone/security-policy.js +1 -239
  203. package/dist-standalone/serialization.js +1 -1031
  204. package/dist-standalone/split-channel.js +1 -219
  205. package/dist-standalone/subscription-proof.js +1 -224
  206. package/dist-standalone/succession.js +1 -142
  207. package/dist-standalone/timeouts.js +1 -398
  208. package/dist-standalone/trace-context.js +1 -414
  209. package/dist-standalone/trace-spans.js +1 -488
  210. package/dist-standalone/transport.js +1 -59
  211. package/dist-standalone/trust-registry.d.ts +3 -3
  212. package/dist-standalone/trust-registry.js +1 -950
  213. package/dist-standalone/types/error-response.js +1 -52
  214. package/dist-standalone/vault-auth.js +1 -174
  215. package/dist-standalone/vault-store-loader.d.ts +9 -0
  216. package/dist-standalone/vault-store-loader.js +1 -187
  217. package/dist-standalone/verify.js +1 -16
  218. package/dist-standalone/version-info.js +1 -530
  219. package/dist-standalone/xfetch.js +1 -335
  220. package/package.json +1 -1
  221. package/share1.dat +0 -0
@@ -1,414 +1 @@
1
- /**
2
- * @module trace-context
3
- * W3C Trace Context implementation for distributed tracing
4
- *
5
- * Implements the W3C Trace Context specification for distributed tracing across
6
- * xBind agent operations, enabling correlation of requests across service boundaries.
7
- *
8
- * Standard: https://www.w3.org/TR/trace-context/
9
- *
10
- * Headers:
11
- * - `traceparent`: Required header with version, trace-id, parent-id, and trace-flags
12
- * - `tracestate`: Optional vendor-specific state
13
- *
14
- * Format: `{version}-{trace-id}-{parent-id}-{trace-flags}`
15
- * Example: `00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01`
16
- *
17
- * Usage:
18
- * ```typescript
19
- * import { TraceContext } from '@private.me/xbind';
20
- *
21
- * // Create a new trace context
22
- * const ctx = TraceContext.create();
23
- *
24
- * // Attach to request headers
25
- * const headers = new Headers();
26
- * ctx.inject(headers);
27
- *
28
- * // Extract from incoming headers
29
- * const incomingCtx = TraceContext.extract(headers);
30
- *
31
- * // Create child span
32
- * const childCtx = incomingCtx.createChild();
33
- * ```
34
- */
35
- /**
36
- * W3C Trace Context specification constants
37
- */
38
- export const TRACEPARENT_HEADER = 'traceparent';
39
- export const TRACESTATE_HEADER = 'tracestate';
40
- /**
41
- * Trace context version (currently only 00 is supported)
42
- */
43
- export const TRACE_VERSION = '00';
44
- /**
45
- * Trace flags
46
- */
47
- export var TraceFlags;
48
- (function (TraceFlags) {
49
- /** Not sampled */
50
- TraceFlags[TraceFlags["NONE"] = 0] = "NONE";
51
- /** Sampled */
52
- TraceFlags[TraceFlags["SAMPLED"] = 1] = "SAMPLED";
53
- })(TraceFlags || (TraceFlags = {}));
54
- /**
55
- * W3C Trace Context implementation
56
- *
57
- * Represents a single point in a distributed trace with parent-child relationships.
58
- */
59
- export class TraceContext {
60
- /** W3C version (always '00' for now) */
61
- version;
62
- /** Trace ID (32 hex characters, 16 bytes) */
63
- traceId;
64
- /** Parent span ID (16 hex characters, 8 bytes) */
65
- parentId;
66
- /** Trace flags (8-bit field) */
67
- traceFlags;
68
- /** Vendor-specific trace state */
69
- traceState;
70
- /**
71
- * Create a trace context
72
- *
73
- * @param traceId - 32-character hex trace ID
74
- * @param parentId - 16-character hex parent span ID
75
- * @param traceFlags - 8-bit trace flags
76
- * @param traceState - Optional vendor-specific state
77
- */
78
- constructor(traceId, parentId, traceFlags = TraceFlags.SAMPLED, traceState = []) {
79
- if (!validateTraceId(traceId)) {
80
- throw new Error(`Invalid trace ID: ${traceId}. Must be 32 hex characters.`);
81
- }
82
- if (!validateSpanId(parentId)) {
83
- throw new Error(`Invalid parent ID: ${parentId}. Must be 16 hex characters.`);
84
- }
85
- if (traceFlags < 0 || traceFlags > 255) {
86
- throw new Error(`Invalid trace flags: ${traceFlags}. Must be 0-255.`);
87
- }
88
- this.version = TRACE_VERSION;
89
- this.traceId = traceId;
90
- this.parentId = parentId;
91
- this.traceFlags = traceFlags;
92
- this.traceState = traceState;
93
- }
94
- /**
95
- * Create a new root trace context
96
- *
97
- * Generates a new trace ID and parent ID for a new trace.
98
- *
99
- * @param sampled - Whether this trace should be sampled
100
- * @returns New trace context
101
- *
102
- * @example
103
- * ```typescript
104
- * const ctx = TraceContext.create();
105
- * console.log(ctx.traceId); // => "4bf92f3577b34da6a3ce929d0e0e4736"
106
- * ```
107
- */
108
- static create(sampled = true) {
109
- const traceId = generateTraceId();
110
- const parentId = generateSpanId();
111
- const flags = sampled ? TraceFlags.SAMPLED : TraceFlags.NONE;
112
- return new TraceContext(traceId, parentId, flags);
113
- }
114
- /**
115
- * Extract trace context from headers
116
- *
117
- * Parses the traceparent and tracestate headers according to W3C spec.
118
- *
119
- * @param headers - Headers object or plain object
120
- * @returns Trace context if found, null otherwise
121
- *
122
- * @example
123
- * ```typescript
124
- * const headers = new Headers({
125
- * traceparent: '00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01'
126
- * });
127
- * const ctx = TraceContext.extract(headers);
128
- * ```
129
- */
130
- static extract(headers) {
131
- const traceparent = headers instanceof Headers
132
- ? headers.get(TRACEPARENT_HEADER)
133
- : headers[TRACEPARENT_HEADER];
134
- if (!traceparent)
135
- return null;
136
- const spec = parseTraceparent(traceparent);
137
- if (!spec)
138
- return null;
139
- // Extract tracestate
140
- const tracestateValue = headers instanceof Headers
141
- ? headers.get(TRACESTATE_HEADER)
142
- : headers[TRACESTATE_HEADER];
143
- const traceState = tracestateValue ? parseTracestate(tracestateValue) : [];
144
- return new TraceContext(spec.traceId, spec.parentId, spec.traceFlags, traceState);
145
- }
146
- /**
147
- * Inject trace context into headers
148
- *
149
- * Adds traceparent and tracestate headers to the provided headers object.
150
- *
151
- * @param headers - Headers to modify
152
- * @returns Modified headers
153
- *
154
- * @example
155
- * ```typescript
156
- * const ctx = TraceContext.create();
157
- * const headers = new Headers();
158
- * ctx.inject(headers);
159
- * ```
160
- */
161
- inject(headers) {
162
- const traceparent = this.toTraceparent();
163
- if (headers instanceof Headers) {
164
- headers.set(TRACEPARENT_HEADER, traceparent);
165
- if (this.traceState.length > 0) {
166
- headers.set(TRACESTATE_HEADER, this.toTracestate());
167
- }
168
- }
169
- else {
170
- headers[TRACEPARENT_HEADER] = traceparent;
171
- if (this.traceState.length > 0) {
172
- headers[TRACESTATE_HEADER] = this.toTracestate();
173
- }
174
- }
175
- return headers;
176
- }
177
- /**
178
- * Create a child trace context
179
- *
180
- * Generates a new parent ID (span ID) while keeping the same trace ID.
181
- * This represents a new span in the same trace.
182
- *
183
- * @param sampled - Override sampling decision (defaults to parent's decision)
184
- * @returns New child trace context
185
- *
186
- * @example
187
- * ```typescript
188
- * const parent = TraceContext.create();
189
- * const child = parent.createChild();
190
- * console.log(parent.traceId === child.traceId); // => true
191
- * console.log(parent.parentId === child.parentId); // => false
192
- * ```
193
- */
194
- createChild(sampled) {
195
- const newParentId = generateSpanId();
196
- const flags = sampled !== undefined
197
- ? (sampled ? TraceFlags.SAMPLED : TraceFlags.NONE)
198
- : this.traceFlags;
199
- return new TraceContext(this.traceId, newParentId, flags, this.traceState);
200
- }
201
- /**
202
- * Format as traceparent header value
203
- *
204
- * @returns traceparent string
205
- */
206
- toTraceparent() {
207
- const flags = this.traceFlags.toString(16).padStart(2, '0');
208
- return `${this.version}-${this.traceId}-${this.parentId}-${flags}`;
209
- }
210
- /**
211
- * Format as tracestate header value
212
- *
213
- * @returns tracestate string
214
- */
215
- toTracestate() {
216
- return this.traceState
217
- .map(({ key, value }) => `${key}=${value}`)
218
- .join(',');
219
- }
220
- /**
221
- * Check if this trace is sampled
222
- *
223
- * @returns True if sampled
224
- */
225
- isSampled() {
226
- return (this.traceFlags & TraceFlags.SAMPLED) === TraceFlags.SAMPLED;
227
- }
228
- /**
229
- * Add or update tracestate entry
230
- *
231
- * @param key - Vendor key (format: vendor[@system])
232
- * @param value - State value
233
- * @returns New trace context with updated state
234
- *
235
- * @example
236
- * ```typescript
237
- * const ctx = TraceContext.create();
238
- * const updated = ctx.withTracestate('private.me', 'did:key:z6Mk...');
239
- * ```
240
- */
241
- withTracestate(key, value) {
242
- const newState = this.traceState.filter((e) => e.key !== key);
243
- newState.unshift({ key, value });
244
- return new TraceContext(this.traceId, this.parentId, this.traceFlags, newState);
245
- }
246
- /**
247
- * Get tracestate value by key
248
- *
249
- * @param key - Vendor key
250
- * @returns State value or undefined
251
- */
252
- getTracestate(key) {
253
- const entry = this.traceState.find((e) => e.key === key);
254
- return entry?.value;
255
- }
256
- /**
257
- * Convert to plain object
258
- *
259
- * @returns Plain object representation
260
- */
261
- toObject() {
262
- return {
263
- version: this.version,
264
- traceId: this.traceId,
265
- parentId: this.parentId,
266
- traceFlags: this.traceFlags,
267
- traceState: [...this.traceState],
268
- sampled: this.isSampled(),
269
- };
270
- }
271
- }
272
- /**
273
- * Generate a random trace ID (32 hex characters)
274
- *
275
- * @returns 32-character hex string
276
- */
277
- export function generateTraceId() {
278
- return generateRandomHex(32);
279
- }
280
- /**
281
- * Generate a random span ID (16 hex characters)
282
- *
283
- * @returns 16-character hex string
284
- */
285
- export function generateSpanId() {
286
- return generateRandomHex(16);
287
- }
288
- /**
289
- * Validate trace ID format
290
- *
291
- * @param traceId - Trace ID to validate
292
- * @returns True if valid
293
- */
294
- export function validateTraceId(traceId) {
295
- if (typeof traceId !== 'string')
296
- return false;
297
- if (traceId.length !== 32)
298
- return false;
299
- if (!/^[a-f0-9]{32}$/.test(traceId))
300
- return false;
301
- // Trace ID must not be all zeros
302
- if (traceId === '00000000000000000000000000000000')
303
- return false;
304
- return true;
305
- }
306
- /**
307
- * Validate span ID format
308
- *
309
- * @param spanId - Span ID to validate
310
- * @returns True if valid
311
- */
312
- export function validateSpanId(spanId) {
313
- if (typeof spanId !== 'string')
314
- return false;
315
- if (spanId.length !== 16)
316
- return false;
317
- if (!/^[a-f0-9]{16}$/.test(spanId))
318
- return false;
319
- // Span ID must not be all zeros
320
- if (spanId === '0000000000000000')
321
- return false;
322
- return true;
323
- }
324
- /**
325
- * Parse traceparent header value
326
- *
327
- * @param traceparent - Header value
328
- * @returns Parsed components or null if invalid
329
- */
330
- export function parseTraceparent(traceparent) {
331
- if (typeof traceparent !== 'string')
332
- return null;
333
- const parts = traceparent.split('-');
334
- if (parts.length !== 4)
335
- return null;
336
- const [version, traceId, parentId, flagsStr] = parts;
337
- // Version validation
338
- if (version !== '00')
339
- return null;
340
- // Trace ID validation
341
- if (!validateTraceId(traceId ?? ''))
342
- return null;
343
- // Parent ID validation
344
- if (!validateSpanId(parentId ?? ''))
345
- return null;
346
- // Flags validation
347
- if (!flagsStr || flagsStr.length !== 2)
348
- return null;
349
- if (!/^[a-f0-9]{2}$/.test(flagsStr))
350
- return null;
351
- const traceFlags = parseInt(flagsStr, 16);
352
- return {
353
- version: version ?? '00',
354
- traceId: traceId ?? '',
355
- parentId: parentId ?? '',
356
- traceFlags,
357
- };
358
- }
359
- /**
360
- * Parse tracestate header value
361
- *
362
- * @param tracestate - Header value
363
- * @returns Array of key-value pairs
364
- */
365
- export function parseTracestate(tracestate) {
366
- if (!tracestate)
367
- return [];
368
- const entries = [];
369
- const parts = tracestate.split(',');
370
- for (const part of parts) {
371
- const trimmed = part.trim();
372
- const eqIndex = trimmed.indexOf('=');
373
- if (eqIndex === -1)
374
- continue;
375
- const key = trimmed.substring(0, eqIndex).trim();
376
- const value = trimmed.substring(eqIndex + 1).trim();
377
- if (key && value) {
378
- entries.push({ key, value });
379
- }
380
- }
381
- return entries;
382
- }
383
- /**
384
- * Generate random hex string
385
- *
386
- * Uses Web Crypto API in browser, Node.js crypto in Node.
387
- *
388
- * @param length - Number of hex characters to generate
389
- * @returns Random hex string
390
- *
391
- * @internal
392
- */
393
- function generateRandomHex(length) {
394
- const bytes = Math.ceil(length / 2);
395
- // Try Web Crypto API (browser)
396
- if (typeof crypto !== 'undefined' && crypto.getRandomValues) {
397
- const buffer = new Uint8Array(bytes);
398
- crypto.getRandomValues(buffer);
399
- return Array.from(buffer)
400
- .map((b) => b.toString(16).padStart(2, '0'))
401
- .join('')
402
- .substring(0, length);
403
- }
404
- // Try Node.js crypto
405
- try {
406
- const nodeCrypto = require('node:crypto');
407
- return nodeCrypto.randomBytes(bytes).toString('hex').substring(0, length);
408
- }
409
- catch {
410
- // SECURITY: Never fall back to Math.random() in production (OWASP violation)
411
- throw new Error('Cryptographic random generation unavailable. ' +
412
- 'Install crypto polyfill or use environment with crypto support.');
413
- }
414
- }
1
+ export const TRACEPARENT_HEADER="traceparent";export const TRACESTATE_HEADER="tracestate";export const TRACE_VERSION="00";export var TraceFlags;!function(t){t[t.NONE=0]="NONE",t[t.SAMPLED=1]="SAMPLED"}(TraceFlags||(TraceFlags={}));export class TraceContext{version;traceId;parentId;traceFlags;traceState;constructor(t,e,r=TraceFlags.SAMPLED,a=[]){if(!validateTraceId(t))throw new Error(`Invalid trace ID: ${t}. Must be 32 hex characters.`);if(!validateSpanId(e))throw new Error(`Invalid parent ID: ${e}. Must be 16 hex characters.`);if(r<0||r>255)throw new Error(`Invalid trace flags: ${r}. Must be 0-255.`);this.version="00",this.traceId=t,this.parentId=e,this.traceFlags=r,this.traceState=a}static create(t=!0){const e=generateTraceId(),r=generateSpanId(),a=t?TraceFlags.SAMPLED:TraceFlags.NONE;return new TraceContext(e,r,a)}static extract(t){const e=t instanceof Headers?t.get("traceparent"):t.traceparent;if(!e)return null;const r=parseTraceparent(e);if(!r)return null;const a=t instanceof Headers?t.get("tracestate"):t.tracestate,n=a?parseTracestate(a):[];return new TraceContext(r.traceId,r.parentId,r.traceFlags,n)}inject(t){const e=this.toTraceparent();return t instanceof Headers?(t.set("traceparent",e),this.traceState.length>0&&t.set("tracestate",this.toTracestate())):(t.traceparent=e,this.traceState.length>0&&(t.tracestate=this.toTracestate())),t}createChild(t){const e=generateSpanId(),r=void 0!==t?t?TraceFlags.SAMPLED:TraceFlags.NONE:this.traceFlags;return new TraceContext(this.traceId,e,r,this.traceState)}toTraceparent(){const t=this.traceFlags.toString(16).padStart(2,"0");return`${this.version}-${this.traceId}-${this.parentId}-${t}`}toTracestate(){return this.traceState.map(({key:t,value:e})=>`${t}=${e}`).join(",")}isSampled(){return(this.traceFlags&TraceFlags.SAMPLED)===TraceFlags.SAMPLED}withTracestate(t,e){const r=this.traceState.filter(e=>e.key!==t);return r.unshift({key:t,value:e}),new TraceContext(this.traceId,this.parentId,this.traceFlags,r)}getTracestate(t){const e=this.traceState.find(e=>e.key===t);return e?.value}toObject(){return{version:this.version,traceId:this.traceId,parentId:this.parentId,traceFlags:this.traceFlags,traceState:[...this.traceState],sampled:this.isSampled()}}}export function generateTraceId(){return generateRandomHex(32)}export function generateSpanId(){return generateRandomHex(16)}export function validateTraceId(t){return"string"==typeof t&&(32===t.length&&(!!/^[a-f0-9]{32}$/.test(t)&&"00000000000000000000000000000000"!==t))}export function validateSpanId(t){return"string"==typeof t&&(16===t.length&&(!!/^[a-f0-9]{16}$/.test(t)&&"0000000000000000"!==t))}export function parseTraceparent(t){if("string"!=typeof t)return null;const e=t.split("-");if(4!==e.length)return null;const[r,a,n,s]=e;if("00"!==r)return null;if(!validateTraceId(a??""))return null;if(!validateSpanId(n??""))return null;if(!s||2!==s.length)return null;if(!/^[a-f0-9]{2}$/.test(s))return null;return{version:r??"00",traceId:a??"",parentId:n??"",traceFlags:parseInt(s,16)}}export function parseTracestate(t){if(!t)return[];const e=[],r=t.split(",");for(const t of r){const r=t.trim(),a=r.indexOf("=");if(-1===a)continue;const n=r.substring(0,a).trim(),s=r.substring(a+1).trim();n&&s&&e.push({key:n,value:s})}return e}function generateRandomHex(t){const e=Math.ceil(t/2);if("undefined"!=typeof crypto&&crypto.getRandomValues){const r=new Uint8Array(e);return crypto.getRandomValues(r),Array.from(r).map(t=>t.toString(16).padStart(2,"0")).join("").substring(0,t)}try{return require("node:crypto").randomBytes(e).toString("hex").substring(0,t)}catch{throw new Error("Cryptographic random generation unavailable. Install crypto polyfill or use environment with crypto support.")}}