@bitfab/sdk 0.52.0 → 0.52.1

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.
@@ -6,7 +6,7 @@ import {
6
6
  flushTraces,
7
7
  parseRetryAfterMs,
8
8
  serializePayloadBody
9
- } from "./chunk-4EOEBN3M.js";
9
+ } from "./chunk-6DIR65JW.js";
10
10
  import "./chunk-H6LZRFMN.js";
11
11
  export {
12
12
  BitfabError,
@@ -17,4 +17,4 @@ export {
17
17
  parseRetryAfterMs,
18
18
  serializePayloadBody
19
19
  };
20
- //# sourceMappingURL=http-W6SXQA3Q.js.map
20
+ //# sourceMappingURL=http-B2AK43BN.js.map
@@ -6,7 +6,7 @@ import {
6
6
  flushTraces,
7
7
  parseRetryAfterMs,
8
8
  serializePayloadBody
9
- } from "./chunk-KXBXRR4I.js";
9
+ } from "./chunk-UQLT25PG.js";
10
10
  export {
11
11
  BitfabError,
12
12
  HttpClient,
@@ -16,4 +16,4 @@ export {
16
16
  parseRetryAfterMs,
17
17
  serializePayloadBody
18
18
  };
19
- //# sourceMappingURL=http-4A2JEPBD.js.map
19
+ //# sourceMappingURL=http-RI4YCAS2.js.map
package/dist/index.cjs CHANGED
@@ -42,7 +42,7 @@ var __version__, __packageName__;
42
42
  var init_version_generated = __esm({
43
43
  "src/version.generated.ts"() {
44
44
  "use strict";
45
- __version__ = "0.52.0";
45
+ __version__ = "0.52.1";
46
46
  __packageName__ = "@bitfab/sdk";
47
47
  }
48
48
  });
@@ -534,6 +534,69 @@ var init_serializePayload = __esm({
534
534
  }
535
535
  });
536
536
 
537
+ // src/traceMetadata.ts
538
+ function recordCallerTraceMetadata(traceId, metadata) {
539
+ if (typeof traceId !== "string" || traceId === "") {
540
+ return;
541
+ }
542
+ if (typeof metadata !== "object" || metadata === null) {
543
+ return;
544
+ }
545
+ if (Object.keys(metadata).length === 0) {
546
+ return;
547
+ }
548
+ callerMetadata.set(traceId, { ...callerMetadata.get(traceId), ...metadata });
549
+ }
550
+ function callerTraceMetadata(traceId) {
551
+ const recorded = callerMetadata.get(traceId);
552
+ return recorded ? { ...recorded } : void 0;
553
+ }
554
+ function forgetTraceMetadata(traceId) {
555
+ callerMetadata.delete(traceId);
556
+ derivedMetadata.delete(traceId);
557
+ }
558
+ function mergeCallerMetadataIntoTracePayload(payload) {
559
+ const externalTrace = payload.externalTrace;
560
+ if (typeof externalTrace !== "object" || externalTrace === null) {
561
+ return payload;
562
+ }
563
+ const external = externalTrace;
564
+ const traceId = typeof payload.id === "string" && payload.id !== "" ? payload.id : external.id;
565
+ if (typeof traceId !== "string" || traceId === "") {
566
+ return payload;
567
+ }
568
+ const caller = callerMetadata.get(traceId);
569
+ if (!caller) {
570
+ return payload;
571
+ }
572
+ const derived = derivedMetadata.get(traceId) ?? {};
573
+ const exported = external.metadata;
574
+ if (typeof exported === "object" && exported !== null) {
575
+ Object.assign(derived, exported);
576
+ }
577
+ derivedMetadata.set(traceId, derived);
578
+ const shadowed = Object.keys(derived).filter((key) => key in caller && caller[key] !== derived[key]).sort();
579
+ if (shadowed.length > 0) {
580
+ warnOnce(
581
+ `trace-metadata-shadowed:${shadowed.join(",")}`,
582
+ `trace metadata key(s) ${shadowed.join(", ")} were set both by the caller and by an integration's own trace export; the caller's value is the one kept on the trace.`
583
+ );
584
+ }
585
+ return {
586
+ ...payload,
587
+ externalTrace: { ...external, metadata: { ...derived, ...caller } }
588
+ };
589
+ }
590
+ var callerMetadata, derivedMetadata;
591
+ var init_traceMetadata = __esm({
592
+ "src/traceMetadata.ts"() {
593
+ "use strict";
594
+ init_warnOnce();
595
+ callerMetadata = /* @__PURE__ */ new Map();
596
+ derivedMetadata = /* @__PURE__ */ new Map();
597
+ }
598
+ });
599
+
537
600
  // src/transportTypes.ts
538
601
  var DeliveryError;
539
602
  var init_transportTypes = __esm({
@@ -1352,6 +1415,7 @@ var init_http = __esm({
1352
1415
  init_errors();
1353
1416
  init_replayContext();
1354
1417
  init_serializePayload();
1418
+ init_traceMetadata();
1355
1419
  init_transport();
1356
1420
  init_transportTypes();
1357
1421
  init_unrefTimer();
@@ -1815,7 +1879,8 @@ var init_http = __esm({
1815
1879
  * {@link HttpClient.sendExternalSpan}; replay confirms persistence with the
1816
1880
  * server-authoritative barrier in `replay.ts`, not by awaiting this call.
1817
1881
  */
1818
- sendExternalTrace(payload) {
1882
+ sendExternalTrace(rawPayload) {
1883
+ const payload = mergeCallerMetadataIntoTracePayload(rawPayload);
1819
1884
  this.getTraceTransport()?.submit(
1820
1885
  "external_trace",
1821
1886
  {
@@ -5700,6 +5765,7 @@ function runWithSeedContext(ctx, fn) {
5700
5765
 
5701
5766
  // src/client.ts
5702
5767
  init_serialize();
5768
+ init_traceMetadata();
5703
5769
 
5704
5770
  // src/tracing.ts
5705
5771
  init_constants();
@@ -6380,8 +6446,7 @@ function getCurrentTrace() {
6380
6446
  if (typeof metadata !== "object" || metadata === null) {
6381
6447
  return;
6382
6448
  }
6383
- const traceState = getOrCreateTraceState();
6384
- traceState.metadata = { ...traceState.metadata, ...metadata };
6449
+ recordCallerTraceMetadata(traceId, metadata);
6385
6450
  } catch {
6386
6451
  }
6387
6452
  },
@@ -7374,7 +7439,7 @@ var Bitfab = class {
7374
7439
  endedAt,
7375
7440
  sessionId: traceState?.sessionId,
7376
7441
  name: traceState?.name,
7377
- metadata: traceState?.metadata,
7442
+ metadata: callerTraceMetadata(traceId),
7378
7443
  contexts: traceState?.contexts ?? [],
7379
7444
  testRunId: traceState?.testRunId,
7380
7445
  inputSourceTraceId: traceState?.inputSourceTraceId,
@@ -7398,6 +7463,7 @@ var Bitfab = class {
7398
7463
  }
7399
7464
  });
7400
7465
  activeTraceStates.delete(traceId);
7466
+ forgetTraceMetadata(traceId);
7401
7467
  }
7402
7468
  } catch {
7403
7469
  }
@@ -7590,6 +7656,7 @@ var Bitfab = class {
7590
7656
  } catch (setupError) {
7591
7657
  if (registeredTraceId) {
7592
7658
  activeTraceStates.delete(registeredTraceId);
7659
+ forgetTraceMetadata(registeredTraceId);
7593
7660
  }
7594
7661
  if (setupError instanceof MixedTracingError) {
7595
7662
  throw setupError;
@@ -7950,14 +8017,16 @@ var Bitfab = class {
7950
8017
  }
7951
8018
  const traceId = randomUuid();
7952
8019
  const startedAt = nowIsoTimestamp();
8020
+ if (options.metadata !== void 0) {
8021
+ recordCallerTraceMetadata(traceId, options.metadata);
8022
+ }
7953
8023
  activeTraceStates.set(traceId, {
7954
8024
  traceId,
7955
8025
  startedAt,
7956
8026
  contexts: [],
7957
8027
  ingestionType: "seeded",
7958
8028
  ...options.sessionId !== void 0 && { sessionId: options.sessionId },
7959
- ...options.name !== void 0 && { name: options.name },
7960
- ...options.metadata !== void 0 && { metadata: options.metadata }
8029
+ ...options.name !== void 0 && { name: options.name }
7961
8030
  });
7962
8031
  try {
7963
8032
  this.sendWrapperSpan({
@@ -7980,12 +8049,13 @@ var Bitfab = class {
7980
8049
  endedAt: startedAt,
7981
8050
  sessionId: options.sessionId,
7982
8051
  name: options.name,
7983
- metadata: options.metadata,
8052
+ metadata: callerTraceMetadata(traceId),
7984
8053
  contexts: [],
7985
8054
  ingestionType: "seeded"
7986
8055
  });
7987
8056
  } finally {
7988
8057
  activeTraceStates.delete(traceId);
8058
+ forgetTraceMetadata(traceId);
7989
8059
  }
7990
8060
  return traceId;
7991
8061
  }
@@ -8010,14 +8080,16 @@ var Bitfab = class {
8010
8080
  }
8011
8081
  await seedContextReady;
8012
8082
  const traceId = randomUuid();
8083
+ if (options?.metadata !== void 0) {
8084
+ recordCallerTraceMetadata(traceId, options.metadata);
8085
+ }
8013
8086
  activeTraceStates.set(traceId, {
8014
8087
  traceId,
8015
8088
  startedAt: nowIsoTimestamp(),
8016
8089
  contexts: [],
8017
8090
  ingestionType: "seeded",
8018
8091
  ...options?.sessionId !== void 0 && { sessionId: options.sessionId },
8019
- ...options?.name !== void 0 && { name: options.name },
8020
- ...options?.metadata !== void 0 && { metadata: options.metadata }
8092
+ ...options?.name !== void 0 && { name: options.name }
8021
8093
  });
8022
8094
  const args = options?.args ?? [];
8023
8095
  let unrecorded = true;
@@ -8029,6 +8101,7 @@ var Bitfab = class {
8029
8101
  await flushTraces2(3e4);
8030
8102
  } finally {
8031
8103
  unrecorded = activeTraceStates.delete(traceId);
8104
+ forgetTraceMetadata(traceId);
8032
8105
  }
8033
8106
  }
8034
8107
  if (unrecorded) {