bitfab 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-4Z5FCOMO.js";
9
+ } from "./chunk-SPJPNJEW.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-CS565CIX.js.map
20
+ //# sourceMappingURL=http-UU27W3YQ.js.map
@@ -6,7 +6,7 @@ import {
6
6
  flushTraces,
7
7
  parseRetryAfterMs,
8
8
  serializePayloadBody
9
- } from "./chunk-WBV4YW7X.js";
9
+ } from "./chunk-4OCHRRLT.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-RQXNGCUQ.js.map
19
+ //# sourceMappingURL=http-X6ZM4GT4.js.map
package/dist/index.cjs CHANGED
@@ -51,7 +51,7 @@ var __version__, __packageName__;
51
51
  var init_version_generated = __esm({
52
52
  "src/version.generated.ts"() {
53
53
  "use strict";
54
- __version__ = "0.51.0";
54
+ __version__ = "0.52.1";
55
55
  __packageName__ = "bitfab";
56
56
  }
57
57
  });
@@ -543,6 +543,69 @@ var init_serializePayload = __esm({
543
543
  }
544
544
  });
545
545
 
546
+ // src/traceMetadata.ts
547
+ function recordCallerTraceMetadata(traceId, metadata) {
548
+ if (typeof traceId !== "string" || traceId === "") {
549
+ return;
550
+ }
551
+ if (typeof metadata !== "object" || metadata === null) {
552
+ return;
553
+ }
554
+ if (Object.keys(metadata).length === 0) {
555
+ return;
556
+ }
557
+ callerMetadata.set(traceId, { ...callerMetadata.get(traceId), ...metadata });
558
+ }
559
+ function callerTraceMetadata(traceId) {
560
+ const recorded = callerMetadata.get(traceId);
561
+ return recorded ? { ...recorded } : void 0;
562
+ }
563
+ function forgetTraceMetadata(traceId) {
564
+ callerMetadata.delete(traceId);
565
+ derivedMetadata.delete(traceId);
566
+ }
567
+ function mergeCallerMetadataIntoTracePayload(payload) {
568
+ const externalTrace = payload.externalTrace;
569
+ if (typeof externalTrace !== "object" || externalTrace === null) {
570
+ return payload;
571
+ }
572
+ const external = externalTrace;
573
+ const traceId = typeof payload.id === "string" && payload.id !== "" ? payload.id : external.id;
574
+ if (typeof traceId !== "string" || traceId === "") {
575
+ return payload;
576
+ }
577
+ const caller = callerMetadata.get(traceId);
578
+ if (!caller) {
579
+ return payload;
580
+ }
581
+ const derived = derivedMetadata.get(traceId) ?? {};
582
+ const exported = external.metadata;
583
+ if (typeof exported === "object" && exported !== null) {
584
+ Object.assign(derived, exported);
585
+ }
586
+ derivedMetadata.set(traceId, derived);
587
+ const shadowed = Object.keys(derived).filter((key) => key in caller && caller[key] !== derived[key]).sort();
588
+ if (shadowed.length > 0) {
589
+ warnOnce(
590
+ `trace-metadata-shadowed:${shadowed.join(",")}`,
591
+ `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.`
592
+ );
593
+ }
594
+ return {
595
+ ...payload,
596
+ externalTrace: { ...external, metadata: { ...derived, ...caller } }
597
+ };
598
+ }
599
+ var callerMetadata, derivedMetadata;
600
+ var init_traceMetadata = __esm({
601
+ "src/traceMetadata.ts"() {
602
+ "use strict";
603
+ init_warnOnce();
604
+ callerMetadata = /* @__PURE__ */ new Map();
605
+ derivedMetadata = /* @__PURE__ */ new Map();
606
+ }
607
+ });
608
+
546
609
  // src/transportTypes.ts
547
610
  var DeliveryError;
548
611
  var init_transportTypes = __esm({
@@ -1361,6 +1424,7 @@ var init_http = __esm({
1361
1424
  init_errors();
1362
1425
  init_replayContext();
1363
1426
  init_serializePayload();
1427
+ init_traceMetadata();
1364
1428
  init_transport();
1365
1429
  init_transportTypes();
1366
1430
  init_unrefTimer();
@@ -1824,7 +1888,8 @@ var init_http = __esm({
1824
1888
  * {@link HttpClient.sendExternalSpan}; replay confirms persistence with the
1825
1889
  * server-authoritative barrier in `replay.ts`, not by awaiting this call.
1826
1890
  */
1827
- sendExternalTrace(payload) {
1891
+ sendExternalTrace(rawPayload) {
1892
+ const payload = mergeCallerMetadataIntoTracePayload(rawPayload);
1828
1893
  this.getTraceTransport()?.submit(
1829
1894
  "external_trace",
1830
1895
  {
@@ -3325,7 +3390,8 @@ __export(index_exports, {
3325
3390
  module.exports = __toCommonJS(index_exports);
3326
3391
 
3327
3392
  // src/assertions.ts
3328
- function expectationsPath(traceId, suffix = "") {
3393
+ var ASSERTIONS_PATH = "/api/sdk/traces/assertions";
3394
+ function traceAssertionsPath(traceId, suffix = "") {
3329
3395
  return `/api/sdk/traces/${encodeURIComponent(traceId)}/assertions${suffix}`;
3330
3396
  }
3331
3397
  var TracesClient = class {
@@ -3333,18 +3399,29 @@ var TracesClient = class {
3333
3399
  this.httpClient = httpClient;
3334
3400
  }
3335
3401
  async getAssertions(traceId) {
3336
- return this.httpClient.get(expectationsPath(traceId));
3402
+ return this.httpClient.get(
3403
+ traceAssertionsPath(traceId)
3404
+ );
3337
3405
  }
3338
3406
  async saveAssertions(params) {
3339
- const response = await this.httpClient.request(expectationsPath(params.traceId), {
3340
- assertions: params.assertions,
3407
+ return this.saveAssertionsAll({
3408
+ updates: [{ traceId: params.traceId, assertions: params.assertions }],
3409
+ source: params.source
3410
+ });
3411
+ }
3412
+ async saveAssertionsAll(params) {
3413
+ if (params.updates.length === 0) {
3414
+ return [];
3415
+ }
3416
+ const response = await this.httpClient.request(ASSERTIONS_PATH, {
3417
+ updates: params.updates,
3341
3418
  source: params.source ?? "agent"
3342
3419
  });
3343
3420
  return response.assertions;
3344
3421
  }
3345
3422
  async archiveAssertions(params) {
3346
3423
  const response = await this.httpClient.request(
3347
- expectationsPath(params.traceId, "/archive"),
3424
+ traceAssertionsPath(params.traceId, "/archive"),
3348
3425
  { assertionIds: params.assertionIds }
3349
3426
  );
3350
3427
  return response.archived;
@@ -5697,6 +5774,7 @@ function runWithSeedContext(ctx, fn) {
5697
5774
 
5698
5775
  // src/client.ts
5699
5776
  init_serialize();
5777
+ init_traceMetadata();
5700
5778
 
5701
5779
  // src/tracing.ts
5702
5780
  init_constants();
@@ -6377,8 +6455,7 @@ function getCurrentTrace() {
6377
6455
  if (typeof metadata !== "object" || metadata === null) {
6378
6456
  return;
6379
6457
  }
6380
- const traceState = getOrCreateTraceState();
6381
- traceState.metadata = { ...traceState.metadata, ...metadata };
6458
+ recordCallerTraceMetadata(traceId, metadata);
6382
6459
  } catch {
6383
6460
  }
6384
6461
  },
@@ -7371,7 +7448,7 @@ var Bitfab = class {
7371
7448
  endedAt,
7372
7449
  sessionId: traceState?.sessionId,
7373
7450
  name: traceState?.name,
7374
- metadata: traceState?.metadata,
7451
+ metadata: callerTraceMetadata(traceId),
7375
7452
  contexts: traceState?.contexts ?? [],
7376
7453
  testRunId: traceState?.testRunId,
7377
7454
  inputSourceTraceId: traceState?.inputSourceTraceId,
@@ -7395,6 +7472,7 @@ var Bitfab = class {
7395
7472
  }
7396
7473
  });
7397
7474
  activeTraceStates.delete(traceId);
7475
+ forgetTraceMetadata(traceId);
7398
7476
  }
7399
7477
  } catch {
7400
7478
  }
@@ -7587,6 +7665,7 @@ var Bitfab = class {
7587
7665
  } catch (setupError) {
7588
7666
  if (registeredTraceId) {
7589
7667
  activeTraceStates.delete(registeredTraceId);
7668
+ forgetTraceMetadata(registeredTraceId);
7590
7669
  }
7591
7670
  if (setupError instanceof MixedTracingError) {
7592
7671
  throw setupError;
@@ -7947,14 +8026,16 @@ var Bitfab = class {
7947
8026
  }
7948
8027
  const traceId = randomUuid();
7949
8028
  const startedAt = nowIsoTimestamp();
8029
+ if (options.metadata !== void 0) {
8030
+ recordCallerTraceMetadata(traceId, options.metadata);
8031
+ }
7950
8032
  activeTraceStates.set(traceId, {
7951
8033
  traceId,
7952
8034
  startedAt,
7953
8035
  contexts: [],
7954
8036
  ingestionType: "seeded",
7955
8037
  ...options.sessionId !== void 0 && { sessionId: options.sessionId },
7956
- ...options.name !== void 0 && { name: options.name },
7957
- ...options.metadata !== void 0 && { metadata: options.metadata }
8038
+ ...options.name !== void 0 && { name: options.name }
7958
8039
  });
7959
8040
  try {
7960
8041
  this.sendWrapperSpan({
@@ -7977,12 +8058,13 @@ var Bitfab = class {
7977
8058
  endedAt: startedAt,
7978
8059
  sessionId: options.sessionId,
7979
8060
  name: options.name,
7980
- metadata: options.metadata,
8061
+ metadata: callerTraceMetadata(traceId),
7981
8062
  contexts: [],
7982
8063
  ingestionType: "seeded"
7983
8064
  });
7984
8065
  } finally {
7985
8066
  activeTraceStates.delete(traceId);
8067
+ forgetTraceMetadata(traceId);
7986
8068
  }
7987
8069
  return traceId;
7988
8070
  }
@@ -8007,14 +8089,16 @@ var Bitfab = class {
8007
8089
  }
8008
8090
  await seedContextReady;
8009
8091
  const traceId = randomUuid();
8092
+ if (options?.metadata !== void 0) {
8093
+ recordCallerTraceMetadata(traceId, options.metadata);
8094
+ }
8010
8095
  activeTraceStates.set(traceId, {
8011
8096
  traceId,
8012
8097
  startedAt: nowIsoTimestamp(),
8013
8098
  contexts: [],
8014
8099
  ingestionType: "seeded",
8015
8100
  ...options?.sessionId !== void 0 && { sessionId: options.sessionId },
8016
- ...options?.name !== void 0 && { name: options.name },
8017
- ...options?.metadata !== void 0 && { metadata: options.metadata }
8101
+ ...options?.name !== void 0 && { name: options.name }
8018
8102
  });
8019
8103
  const args = options?.args ?? [];
8020
8104
  let unrecorded = true;
@@ -8026,6 +8110,7 @@ var Bitfab = class {
8026
8110
  await flushTraces2(3e4);
8027
8111
  } finally {
8028
8112
  unrecorded = activeTraceStates.delete(traceId);
8113
+ forgetTraceMetadata(traceId);
8029
8114
  }
8030
8115
  }
8031
8116
  if (unrecorded) {