@private.me/xbind 3.0.2 → 3.0.4

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 (222) hide show
  1. package/README.md +2366 -204
  2. package/dist-standalone/_deps/mldsa-wasm/dist/mldsa.js +1 -1920
  3. package/dist-standalone/_deps/shared/cjs/errors.js +1 -729
  4. package/dist-standalone/_deps/shared/cjs/index.js +1 -463
  5. package/dist-standalone/_deps/shared/cjs/types.js +1 -315
  6. package/dist-standalone/_deps/shared/errors.js +1 -244
  7. package/dist-standalone/_deps/shared/index.js +1 -72
  8. package/dist-standalone/_deps/shared/types.js +1 -86
  9. package/dist-standalone/_deps/ux-helpers/cjs/errors.js +1 -1
  10. package/dist-standalone/_deps/ux-helpers/cjs/index.js +1 -1
  11. package/dist-standalone/_deps/ux-helpers/cjs/pagination.js +1 -1
  12. package/dist-standalone/_deps/ux-helpers/cjs/progress.js +1 -1
  13. package/dist-standalone/_deps/ux-helpers/cjs/search.js +1 -1
  14. package/dist-standalone/_deps/ux-helpers/cjs/types.js +1 -1
  15. package/dist-standalone/_deps/ux-helpers/errors.js +1 -1
  16. package/dist-standalone/_deps/ux-helpers/index.js +1 -1
  17. package/dist-standalone/_deps/ux-helpers/pagination.js +1 -1
  18. package/dist-standalone/_deps/ux-helpers/progress.js +1 -1
  19. package/dist-standalone/_deps/ux-helpers/search.js +1 -1
  20. package/dist-standalone/_deps/xchange/auto-accept.js +1 -1
  21. package/dist-standalone/_deps/xchange/cjs/auto-accept.js +1 -1
  22. package/dist-standalone/_deps/xchange/cjs/errors.js +1 -1
  23. package/dist-standalone/_deps/xchange/cjs/index.js +1 -1
  24. package/dist-standalone/_deps/xchange/cjs/invite-client.js +1 -1
  25. package/dist-standalone/_deps/xchange/cjs/lazy-init.js +1 -1
  26. package/dist-standalone/_deps/xchange/cjs/trust-integration.js +1 -1
  27. package/dist-standalone/_deps/xchange/cjs/xchange.js +1 -1
  28. package/dist-standalone/_deps/xchange/errors.js +1 -1
  29. package/dist-standalone/_deps/xchange/index.js +1 -1
  30. package/dist-standalone/_deps/xchange/invite-client.js +1 -1
  31. package/dist-standalone/_deps/xchange/lazy-init.js +1 -1
  32. package/dist-standalone/_deps/xchange/trust-integration.js +1 -1
  33. package/dist-standalone/_deps/xchange/xchange.js +1 -1
  34. package/dist-standalone/_deps/xregistry/cjs/discovery.js +1 -1
  35. package/dist-standalone/_deps/xregistry/cjs/errors.js +1 -1
  36. package/dist-standalone/_deps/xregistry/cjs/index.js +1 -1
  37. package/dist-standalone/_deps/xregistry/cjs/registry.js +1 -1
  38. package/dist-standalone/_deps/xregistry/cjs/schema.js +1 -1
  39. package/dist-standalone/_deps/xregistry/cjs/types.js +1 -1
  40. package/dist-standalone/_deps/xregistry/discovery.js +1 -1
  41. package/dist-standalone/_deps/xregistry/errors.js +1 -1
  42. package/dist-standalone/_deps/xregistry/index.js +1 -1
  43. package/dist-standalone/_deps/xregistry/registry.js +1 -1
  44. package/dist-standalone/_deps/xregistry/schema.js +1 -1
  45. package/dist-standalone/_deps/xregistry/types.js +1 -1
  46. package/dist-standalone/agent-call.d.ts +2 -2
  47. package/dist-standalone/agent-call.js +1 -659
  48. package/dist-standalone/agent-sdk.js +1 -328
  49. package/dist-standalone/agent.d.ts +2 -0
  50. package/dist-standalone/agent.js +1 -1800
  51. package/dist-standalone/approval.js +1 -193
  52. package/dist-standalone/async-iterators.d.ts +3 -3
  53. package/dist-standalone/async-iterators.js +1 -382
  54. package/dist-standalone/auth.js +1 -219
  55. package/dist-standalone/auto-accept.js +1 -229
  56. package/dist-standalone/backup-config.js +1 -201
  57. package/dist-standalone/backup.js +1 -326
  58. package/dist-standalone/batch-operations.js +1 -388
  59. package/dist-standalone/cancellation.js +1 -477
  60. package/dist-standalone/checkpoint.js +1 -186
  61. package/dist-standalone/circuit-breaker.js +1 -468
  62. package/dist-standalone/cjs/agent-call.js +1 -701
  63. package/dist-standalone/cjs/agent-sdk.js +1 -332
  64. package/dist-standalone/cjs/agent.js +1 -1837
  65. package/dist-standalone/cjs/approval.js +1 -199
  66. package/dist-standalone/cjs/async-iterators.js +1 -392
  67. package/dist-standalone/cjs/auth.js +1 -225
  68. package/dist-standalone/cjs/auto-accept.js +1 -233
  69. package/dist-standalone/cjs/backup-config.js +1 -207
  70. package/dist-standalone/cjs/backup.js +1 -330
  71. package/dist-standalone/cjs/batch-operations.js +1 -397
  72. package/dist-standalone/cjs/cancellation.js +1 -490
  73. package/dist-standalone/cjs/checkpoint.js +1 -193
  74. package/dist-standalone/cjs/circuit-breaker.js +1 -476
  75. package/dist-standalone/cjs/cli/init.js +1 -492
  76. package/dist-standalone/cjs/config-validation.js +1 -522
  77. package/dist-standalone/cjs/connect.js +1 -312
  78. package/dist-standalone/cjs/connection-pool.js +1 -506
  79. package/dist-standalone/cjs/correlation-id.js +1 -339
  80. package/dist-standalone/cjs/crypto-utils.js +1 -176
  81. package/dist-standalone/cjs/debug-mode.js +1 -534
  82. package/dist-standalone/cjs/did-document.js +1 -101
  83. package/dist-standalone/cjs/did-privateme.js +1 -130
  84. package/dist-standalone/cjs/did-web.js +1 -201
  85. package/dist-standalone/cjs/discovery.js +1 -462
  86. package/dist-standalone/cjs/dual-mode.js +1 -251
  87. package/dist-standalone/cjs/email-templates.js +1 -313
  88. package/dist-standalone/cjs/email-transport.js +1 -239
  89. package/dist-standalone/cjs/envelope.js +1 -538
  90. package/dist-standalone/cjs/errors.js +1 -913
  91. package/dist-standalone/cjs/event-emitter.js +1 -461
  92. package/dist-standalone/cjs/gateway-state.js +1 -55
  93. package/dist-standalone/cjs/gateway-transport.js +1 -120
  94. package/dist-standalone/cjs/graceful-degradation.js +1 -403
  95. package/dist-standalone/cjs/guardrails.js +1 -223
  96. package/dist-standalone/cjs/health-check.js +1 -336
  97. package/dist-standalone/cjs/http-compat.js +1 -272
  98. package/dist-standalone/cjs/http-status-map.js +1 -571
  99. package/dist-standalone/cjs/identity.js +1 -645
  100. package/dist-standalone/cjs/index.js +1 -406
  101. package/dist-standalone/cjs/invitation.js +1 -421
  102. package/dist-standalone/cjs/invite.js +1 -328
  103. package/dist-standalone/cjs/key-agreement.js +1 -335
  104. package/dist-standalone/cjs/lazy-init.js +1 -300
  105. package/dist-standalone/cjs/logger.js +1 -291
  106. package/dist-standalone/cjs/loopback-transport.js +1 -0
  107. package/dist-standalone/cjs/mdns-discovery.js +1 -202
  108. package/dist-standalone/cjs/nonce-store.js +1 -80
  109. package/dist-standalone/cjs/pairing-manager.js +1 -223
  110. package/dist-standalone/cjs/plugin-system.js +1 -264
  111. package/dist-standalone/cjs/plugins/logging.js +1 -168
  112. package/dist-standalone/cjs/plugins/metrics.js +1 -181
  113. package/dist-standalone/cjs/plugins/validation.js +1 -302
  114. package/dist-standalone/cjs/policy.js +1 -320
  115. package/dist-standalone/cjs/progress-callbacks.js +1 -583
  116. package/dist-standalone/cjs/redis-nonce-store.js +1 -76
  117. package/dist-standalone/cjs/registry-middleware.js +1 -50
  118. package/dist-standalone/cjs/retry-strategies.js +1 -544
  119. package/dist-standalone/cjs/retry-transport.js +1 -102
  120. package/dist-standalone/cjs/runtime/browser.js +1 -533
  121. package/dist-standalone/cjs/runtime/edge.js +1 -526
  122. package/dist-standalone/cjs/runtime/react-native.js +1 -394
  123. package/dist-standalone/cjs/security-policy.js +1 -245
  124. package/dist-standalone/cjs/serialization.js +1 -1040
  125. package/dist-standalone/cjs/split-channel.js +1 -225
  126. package/dist-standalone/cjs/subscription-proof.js +1 -230
  127. package/dist-standalone/cjs/succession.js +1 -148
  128. package/dist-standalone/cjs/timeouts.js +1 -412
  129. package/dist-standalone/cjs/trace-context.js +1 -424
  130. package/dist-standalone/cjs/trace-spans.js +1 -495
  131. package/dist-standalone/cjs/transport.js +1 -63
  132. package/dist-standalone/cjs/trust-registry.js +1 -991
  133. package/dist-standalone/cjs/types/error-response.js +1 -56
  134. package/dist-standalone/cjs/vault-auth.js +1 -178
  135. package/dist-standalone/cjs/vault-store-loader.js +1 -194
  136. package/dist-standalone/cjs/verify.js +1 -25
  137. package/dist-standalone/cjs/version-info.js +1 -543
  138. package/dist-standalone/cjs/xfetch.js +1 -340
  139. package/dist-standalone/cli/init.js +1 -455
  140. package/dist-standalone/cli/setup.js +1 -514
  141. package/dist-standalone/cli/types.js +1 -27
  142. package/dist-standalone/cli/xbind.js +1 -148
  143. package/dist-standalone/config-validation.js +1 -513
  144. package/dist-standalone/connect.js +1 -274
  145. package/dist-standalone/connection-pool.js +1 -500
  146. package/dist-standalone/correlation-id.js +1 -326
  147. package/dist-standalone/crypto-utils.d.ts +2 -7
  148. package/dist-standalone/crypto-utils.js +1 -157
  149. package/dist-standalone/debug-mode.js +1 -510
  150. package/dist-standalone/did-document.js +1 -96
  151. package/dist-standalone/did-privateme.js +1 -121
  152. package/dist-standalone/did-web.js +1 -196
  153. package/dist-standalone/discovery.js +1 -458
  154. package/dist-standalone/dual-mode.js +1 -247
  155. package/dist-standalone/email-templates.js +1 -309
  156. package/dist-standalone/email-transport.d.ts +2 -2
  157. package/dist-standalone/email-transport.js +1 -232
  158. package/dist-standalone/envelope.js +1 -525
  159. package/dist-standalone/errors.d.ts +13 -3
  160. package/dist-standalone/errors.js +1 -896
  161. package/dist-standalone/event-emitter.js +1 -456
  162. package/dist-standalone/gateway-state.d.ts +1 -1
  163. package/dist-standalone/gateway-state.js +1 -51
  164. package/dist-standalone/gateway-transport.js +1 -116
  165. package/dist-standalone/graceful-degradation.js +1 -396
  166. package/dist-standalone/guardrails.js +1 -216
  167. package/dist-standalone/health-check.d.ts +5 -1
  168. package/dist-standalone/health-check.js +1 -332
  169. package/dist-standalone/http-compat.d.ts +1 -1
  170. package/dist-standalone/http-compat.js +1 -267
  171. package/dist-standalone/http-status-map.js +1 -561
  172. package/dist-standalone/identity.js +1 -619
  173. package/dist-standalone/index.d.ts +15 -4
  174. package/dist-standalone/index.js +1 -78
  175. package/dist-standalone/invitation.js +1 -415
  176. package/dist-standalone/invite.js +1 -324
  177. package/dist-standalone/key-agreement.js +1 -325
  178. package/dist-standalone/lazy-init.d.ts +11 -6
  179. package/dist-standalone/lazy-init.js +1 -295
  180. package/dist-standalone/logger.js +1 -285
  181. package/dist-standalone/loopback-transport.d.ts +87 -0
  182. package/dist-standalone/loopback-transport.js +1 -0
  183. package/dist-standalone/mdns-discovery.js +1 -195
  184. package/dist-standalone/nonce-store.js +1 -76
  185. package/dist-standalone/pairing-manager.js +1 -219
  186. package/dist-standalone/plugin-system.js +1 -257
  187. package/dist-standalone/plugins/logging.js +1 -163
  188. package/dist-standalone/plugins/metrics.d.ts +4 -4
  189. package/dist-standalone/plugins/metrics.js +1 -176
  190. package/dist-standalone/plugins/validation.js +1 -297
  191. package/dist-standalone/policy.js +1 -315
  192. package/dist-standalone/progress-callbacks.js +1 -576
  193. package/dist-standalone/redis-nonce-store.js +1 -72
  194. package/dist-standalone/registry-middleware.js +1 -47
  195. package/dist-standalone/retry-strategies.js +1 -534
  196. package/dist-standalone/retry-transport.js +1 -98
  197. package/dist-standalone/runtime/browser.js +1 -516
  198. package/dist-standalone/runtime/edge.js +1 -511
  199. package/dist-standalone/runtime/react-native.d.ts +1 -1
  200. package/dist-standalone/runtime/react-native.js +1 -383
  201. package/dist-standalone/security-policy.js +1 -239
  202. package/dist-standalone/serialization.js +1 -1031
  203. package/dist-standalone/split-channel.d.ts +1 -1
  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.d.ts +1 -1
  211. package/dist-standalone/transport.js +1 -59
  212. package/dist-standalone/trust-registry.d.ts +3 -3
  213. package/dist-standalone/trust-registry.js +1 -950
  214. package/dist-standalone/types/error-response.js +1 -52
  215. package/dist-standalone/vault-auth.js +1 -174
  216. package/dist-standalone/vault-store-loader.d.ts +9 -0
  217. package/dist-standalone/vault-store-loader.js +1 -187
  218. package/dist-standalone/verify.js +1 -16
  219. package/dist-standalone/version-info.js +1 -530
  220. package/dist-standalone/xfetch.js +1 -335
  221. package/package.json +1 -1
  222. 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.")}}