@bitfab/sdk 0.51.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-RGC7IEOI.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-HLRWCSFF.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-4CLJF2DZ.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-AKFJONE7.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.51.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
  {
@@ -3316,7 +3381,8 @@ __export(index_exports, {
3316
3381
  module.exports = __toCommonJS(index_exports);
3317
3382
 
3318
3383
  // src/assertions.ts
3319
- function expectationsPath(traceId, suffix = "") {
3384
+ var ASSERTIONS_PATH = "/api/sdk/traces/assertions";
3385
+ function traceAssertionsPath(traceId, suffix = "") {
3320
3386
  return `/api/sdk/traces/${encodeURIComponent(traceId)}/assertions${suffix}`;
3321
3387
  }
3322
3388
  var TracesClient = class {
@@ -3324,18 +3390,29 @@ var TracesClient = class {
3324
3390
  this.httpClient = httpClient;
3325
3391
  }
3326
3392
  async getAssertions(traceId) {
3327
- return this.httpClient.get(expectationsPath(traceId));
3393
+ return this.httpClient.get(
3394
+ traceAssertionsPath(traceId)
3395
+ );
3328
3396
  }
3329
3397
  async saveAssertions(params) {
3330
- const response = await this.httpClient.request(expectationsPath(params.traceId), {
3331
- assertions: params.assertions,
3398
+ return this.saveAssertionsAll({
3399
+ updates: [{ traceId: params.traceId, assertions: params.assertions }],
3400
+ source: params.source
3401
+ });
3402
+ }
3403
+ async saveAssertionsAll(params) {
3404
+ if (params.updates.length === 0) {
3405
+ return [];
3406
+ }
3407
+ const response = await this.httpClient.request(ASSERTIONS_PATH, {
3408
+ updates: params.updates,
3332
3409
  source: params.source ?? "agent"
3333
3410
  });
3334
3411
  return response.assertions;
3335
3412
  }
3336
3413
  async archiveAssertions(params) {
3337
3414
  const response = await this.httpClient.request(
3338
- expectationsPath(params.traceId, "/archive"),
3415
+ traceAssertionsPath(params.traceId, "/archive"),
3339
3416
  { assertionIds: params.assertionIds }
3340
3417
  );
3341
3418
  return response.archived;
@@ -5688,6 +5765,7 @@ function runWithSeedContext(ctx, fn) {
5688
5765
 
5689
5766
  // src/client.ts
5690
5767
  init_serialize();
5768
+ init_traceMetadata();
5691
5769
 
5692
5770
  // src/tracing.ts
5693
5771
  init_constants();
@@ -6368,8 +6446,7 @@ function getCurrentTrace() {
6368
6446
  if (typeof metadata !== "object" || metadata === null) {
6369
6447
  return;
6370
6448
  }
6371
- const traceState = getOrCreateTraceState();
6372
- traceState.metadata = { ...traceState.metadata, ...metadata };
6449
+ recordCallerTraceMetadata(traceId, metadata);
6373
6450
  } catch {
6374
6451
  }
6375
6452
  },
@@ -7362,7 +7439,7 @@ var Bitfab = class {
7362
7439
  endedAt,
7363
7440
  sessionId: traceState?.sessionId,
7364
7441
  name: traceState?.name,
7365
- metadata: traceState?.metadata,
7442
+ metadata: callerTraceMetadata(traceId),
7366
7443
  contexts: traceState?.contexts ?? [],
7367
7444
  testRunId: traceState?.testRunId,
7368
7445
  inputSourceTraceId: traceState?.inputSourceTraceId,
@@ -7386,6 +7463,7 @@ var Bitfab = class {
7386
7463
  }
7387
7464
  });
7388
7465
  activeTraceStates.delete(traceId);
7466
+ forgetTraceMetadata(traceId);
7389
7467
  }
7390
7468
  } catch {
7391
7469
  }
@@ -7578,6 +7656,7 @@ var Bitfab = class {
7578
7656
  } catch (setupError) {
7579
7657
  if (registeredTraceId) {
7580
7658
  activeTraceStates.delete(registeredTraceId);
7659
+ forgetTraceMetadata(registeredTraceId);
7581
7660
  }
7582
7661
  if (setupError instanceof MixedTracingError) {
7583
7662
  throw setupError;
@@ -7938,14 +8017,16 @@ var Bitfab = class {
7938
8017
  }
7939
8018
  const traceId = randomUuid();
7940
8019
  const startedAt = nowIsoTimestamp();
8020
+ if (options.metadata !== void 0) {
8021
+ recordCallerTraceMetadata(traceId, options.metadata);
8022
+ }
7941
8023
  activeTraceStates.set(traceId, {
7942
8024
  traceId,
7943
8025
  startedAt,
7944
8026
  contexts: [],
7945
8027
  ingestionType: "seeded",
7946
8028
  ...options.sessionId !== void 0 && { sessionId: options.sessionId },
7947
- ...options.name !== void 0 && { name: options.name },
7948
- ...options.metadata !== void 0 && { metadata: options.metadata }
8029
+ ...options.name !== void 0 && { name: options.name }
7949
8030
  });
7950
8031
  try {
7951
8032
  this.sendWrapperSpan({
@@ -7968,12 +8049,13 @@ var Bitfab = class {
7968
8049
  endedAt: startedAt,
7969
8050
  sessionId: options.sessionId,
7970
8051
  name: options.name,
7971
- metadata: options.metadata,
8052
+ metadata: callerTraceMetadata(traceId),
7972
8053
  contexts: [],
7973
8054
  ingestionType: "seeded"
7974
8055
  });
7975
8056
  } finally {
7976
8057
  activeTraceStates.delete(traceId);
8058
+ forgetTraceMetadata(traceId);
7977
8059
  }
7978
8060
  return traceId;
7979
8061
  }
@@ -7998,14 +8080,16 @@ var Bitfab = class {
7998
8080
  }
7999
8081
  await seedContextReady;
8000
8082
  const traceId = randomUuid();
8083
+ if (options?.metadata !== void 0) {
8084
+ recordCallerTraceMetadata(traceId, options.metadata);
8085
+ }
8001
8086
  activeTraceStates.set(traceId, {
8002
8087
  traceId,
8003
8088
  startedAt: nowIsoTimestamp(),
8004
8089
  contexts: [],
8005
8090
  ingestionType: "seeded",
8006
8091
  ...options?.sessionId !== void 0 && { sessionId: options.sessionId },
8007
- ...options?.name !== void 0 && { name: options.name },
8008
- ...options?.metadata !== void 0 && { metadata: options.metadata }
8092
+ ...options?.name !== void 0 && { name: options.name }
8009
8093
  });
8010
8094
  const args = options?.args ?? [];
8011
8095
  let unrecorded = true;
@@ -8017,6 +8101,7 @@ var Bitfab = class {
8017
8101
  await flushTraces2(3e4);
8018
8102
  } finally {
8019
8103
  unrecorded = activeTraceStates.delete(traceId);
8104
+ forgetTraceMetadata(traceId);
8020
8105
  }
8021
8106
  }
8022
8107
  if (unrecorded) {