@volontariapp/database 3.5.0 → 3.6.0-snap-d038e0e

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 (36) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/outbox/entities/event-queue.entity.d.ts +9 -0
  3. package/dist/outbox/entities/event-queue.entity.d.ts.map +1 -1
  4. package/dist/outbox/entities/event-queue.entity.js +10 -0
  5. package/dist/outbox/entities/event-queue.entity.js.map +1 -1
  6. package/dist/outbox/entities/jobs-outbox.entity.d.ts +1 -0
  7. package/dist/outbox/entities/jobs-outbox.entity.d.ts.map +1 -1
  8. package/dist/outbox/entities/jobs-outbox.entity.js +2 -0
  9. package/dist/outbox/entities/jobs-outbox.entity.js.map +1 -1
  10. package/dist/outbox/entities/outbox.entity.d.ts +1 -0
  11. package/dist/outbox/entities/outbox.entity.d.ts.map +1 -1
  12. package/dist/outbox/entities/outbox.entity.js +1 -0
  13. package/dist/outbox/entities/outbox.entity.js.map +1 -1
  14. package/dist/outbox/index.d.ts +1 -0
  15. package/dist/outbox/index.d.ts.map +1 -1
  16. package/dist/outbox/index.js +1 -0
  17. package/dist/outbox/index.js.map +1 -1
  18. package/dist/outbox/interfaces/outbox.interfaces.d.ts +5 -0
  19. package/dist/outbox/interfaces/outbox.interfaces.d.ts.map +1 -1
  20. package/dist/outbox/utils/capture-traceparent.d.ts +3 -0
  21. package/dist/outbox/utils/capture-traceparent.d.ts.map +1 -0
  22. package/dist/outbox/utils/capture-traceparent.js +10 -0
  23. package/dist/outbox/utils/capture-traceparent.js.map +1 -0
  24. package/dist/outbox/utils/index.d.ts +2 -0
  25. package/dist/outbox/utils/index.d.ts.map +1 -0
  26. package/dist/outbox/utils/index.js +2 -0
  27. package/dist/outbox/utils/index.js.map +1 -0
  28. package/dist/test/outbox/entities/span-context.factory.d.ts +7 -0
  29. package/dist/test/outbox/entities/span-context.factory.d.ts.map +1 -0
  30. package/dist/test/outbox/entities/span-context.factory.js +12 -0
  31. package/dist/test/outbox/entities/span-context.factory.js.map +1 -0
  32. package/dist/test/outbox/entities/traceparent-capture.unit.spec.d.ts +2 -0
  33. package/dist/test/outbox/entities/traceparent-capture.unit.spec.d.ts.map +1 -0
  34. package/dist/test/outbox/entities/traceparent-capture.unit.spec.js +142 -0
  35. package/dist/test/outbox/entities/traceparent-capture.unit.spec.js.map +1 -0
  36. package/package.json +4 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.6.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Capture the active OpenTelemetry context into `traceparent` when an outbox row is created (`EventQueueEntity.createEvent`, `JobsOutboxEntity.createJob`), and carry it in Redis Stream fields / event JSON and in the BullMQ job envelope. Adds `captureTraceparent`, `normalizeTraceparent` and `EventQueueEntity.createFollowUp`, which copies `traceId`, `traceparent` and `correlationId` from the consumed event. `traceparent` is optional on `JobEnvelope` but required on `RedisEventMessage` and `RedisEventStreamFields` (empty string when there is no trace context): code that builds these types must now provide it. Messages already in a stream may lack it at runtime. Without an active span the field stays empty.
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies []:
12
+ - @volontariapp/messaging@2.25.0
13
+
3
14
  ## 3.5.0
4
15
 
5
16
  ### Minor Changes
@@ -2,6 +2,7 @@ import type { EventPayload } from '../types/payload.registry.js';
2
2
  import { OutboxEntity } from './outbox.entity.js';
3
3
  import type { EventType } from '../types/event.type.js';
4
4
  import type { Streams } from '@volontariapp/shared';
5
+ import type { EventTraceContext } from '../interfaces/outbox.interfaces.js';
5
6
  export declare class EventQueueEntity<K extends EventType = EventType, P = EventPayload<K>> extends OutboxEntity<K> {
6
7
  version: number;
7
8
  correlationId: string;
@@ -16,9 +17,17 @@ export declare class EventQueueEntity<K extends EventType = EventType, P = Event
16
17
  emitter: string;
17
18
  emitterId: string;
18
19
  traceId?: string;
20
+ traceparent?: string;
19
21
  correlationId?: string;
20
22
  payload: EventPayload<K>;
21
23
  targetServices: Streams[];
22
24
  }): EventQueueEntity<K>;
25
+ static createFollowUp<K extends EventType = EventType>(source: EventTraceContext, props: {
26
+ type: K;
27
+ emitter: string;
28
+ emitterId: string;
29
+ payload: EventPayload<K>;
30
+ targetServices: Streams[];
31
+ }): EventQueueEntity<K>;
23
32
  }
24
33
  //# sourceMappingURL=event-queue.entity.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"event-queue.entity.d.ts","sourceRoot":"","sources":["../../../src/outbox/entities/event-queue.entity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAIpD,qBAAa,gBAAgB,CAC3B,CAAC,SAAS,SAAS,GAAG,SAAS,EAC/B,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CACnB,SAAQ,YAAY,CAAC,CAAC,CAAC;IACvB,OAAO,EAAG,MAAM,CAAC;IAEjB,aAAa,EAAG,MAAM,CAAC;IAEvB,cAAc,EAAE,OAAO,EAAE,CAAM;IAE/B,OAAO,EAAG;QACR,MAAM,CAAC,EAAE,CAAC,CAAC;QACX,KAAK,EAAE,CAAC,CAAC;KACV,CAAC;IAEF,WAAW,CAAC,EAAE,IAAI,CAAC;IAEnB,MAAM,CAAC,WAAW,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,EAAE,KAAK,EAAE;QACzD,IAAI,EAAE,CAAC,CAAC;QACR,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;QACzB,cAAc,EAAE,OAAO,EAAE,CAAC;KAC3B,GAAG,gBAAgB,CAAC,CAAC,CAAC;CAiBxB"}
1
+ {"version":3,"file":"event-queue.entity.d.ts","sourceRoot":"","sources":["../../../src/outbox/entities/event-queue.entity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAIpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAE5E,qBAAa,gBAAgB,CAC3B,CAAC,SAAS,SAAS,GAAG,SAAS,EAC/B,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CACnB,SAAQ,YAAY,CAAC,CAAC,CAAC;IACvB,OAAO,EAAG,MAAM,CAAC;IAEjB,aAAa,EAAG,MAAM,CAAC;IAEvB,cAAc,EAAE,OAAO,EAAE,CAAM;IAE/B,OAAO,EAAG;QACR,MAAM,CAAC,EAAE,CAAC,CAAC;QACX,KAAK,EAAE,CAAC,CAAC;KACV,CAAC;IAEF,WAAW,CAAC,EAAE,IAAI,CAAC;IAEnB,MAAM,CAAC,WAAW,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,EAAE,KAAK,EAAE;QACzD,IAAI,EAAE,CAAC,CAAC;QACR,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;QACzB,cAAc,EAAE,OAAO,EAAE,CAAC;KAC3B,GAAG,gBAAgB,CAAC,CAAC,CAAC;IAyBvB,MAAM,CAAC,cAAc,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,EACnD,MAAM,EAAE,iBAAiB,EACzB,KAAK,EAAE;QACL,IAAI,EAAE,CAAC,CAAC;QACR,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;QACzB,cAAc,EAAE,OAAO,EAAE,CAAC;KAC3B,GACA,gBAAgB,CAAC,CAAC,CAAC;CAQvB"}
@@ -1,6 +1,7 @@
1
1
  import { OutboxEntity } from './outbox.entity.js';
2
2
  import { randomUUID } from 'crypto';
3
3
  import { OutboxStatus } from '../types/outbox.status.js';
4
+ import { captureTraceparent, normalizeTraceparent } from '../utils/capture-traceparent.js';
4
5
  export class EventQueueEntity extends OutboxEntity {
5
6
  version;
6
7
  correlationId;
@@ -14,6 +15,7 @@ export class EventQueueEntity extends OutboxEntity {
14
15
  entity.emitter = props.emitter;
15
16
  entity.emitterId = props.emitterId;
16
17
  entity.traceId = props.traceId;
18
+ entity.traceparent = normalizeTraceparent(props.traceparent) ?? captureTraceparent();
17
19
  entity.correlationId = props.correlationId ?? randomUUID();
18
20
  entity.payload = { after: props.payload };
19
21
  entity.targetServices = props.targetServices;
@@ -24,5 +26,13 @@ export class EventQueueEntity extends OutboxEntity {
24
26
  entity.updatedAt = new Date();
25
27
  return entity;
26
28
  }
29
+ static createFollowUp(source, props) {
30
+ return EventQueueEntity.createEvent({
31
+ ...props,
32
+ traceId: source.traceId,
33
+ traceparent: source.traceparent,
34
+ correlationId: source.correlationId,
35
+ });
36
+ }
27
37
  }
28
38
  //# sourceMappingURL=event-queue.entity.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"event-queue.entity.js","sourceRoot":"","sources":["../../../src/outbox/entities/event-queue.entity.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,MAAM,OAAO,gBAGX,SAAQ,YAAe;IACvB,OAAO,CAAU;IAEjB,aAAa,CAAU;IAEvB,cAAc,GAAc,EAAE,CAAC;IAE/B,OAAO,CAGL;IAEF,WAAW,CAAQ;IAEnB,MAAM,CAAC,WAAW,CAAkC,KAQnD;QACC,MAAM,MAAM,GAAG,IAAI,gBAAgB,EAAK,CAAC;QACzC,MAAM,CAAC,EAAE,GAAG,UAAU,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACzB,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC/B,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QACnC,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC/B,MAAM,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,IAAI,UAAU,EAAE,CAAC;QAC3D,MAAM,CAAC,OAAO,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QAC1C,MAAM,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;QAC7C,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC;QACrC,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC;QACpB,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;QACnB,MAAM,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAC9B,MAAM,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
1
+ {"version":3,"file":"event-queue.entity.js","sourceRoot":"","sources":["../../../src/outbox/entities/event-queue.entity.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAG3F,MAAM,OAAO,gBAGX,SAAQ,YAAe;IACvB,OAAO,CAAU;IAEjB,aAAa,CAAU;IAEvB,cAAc,GAAc,EAAE,CAAC;IAE/B,OAAO,CAGL;IAEF,WAAW,CAAQ;IAEnB,MAAM,CAAC,WAAW,CAAkC,KASnD;QACC,MAAM,MAAM,GAAG,IAAI,gBAAgB,EAAK,CAAC;QACzC,MAAM,CAAC,EAAE,GAAG,UAAU,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACzB,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC/B,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QACnC,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC/B,MAAM,CAAC,WAAW,GAAG,oBAAoB,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,kBAAkB,EAAE,CAAC;QACrF,MAAM,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,IAAI,UAAU,EAAE,CAAC;QAC3D,MAAM,CAAC,OAAO,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QAC1C,MAAM,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC;QAC7C,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC;QACrC,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC;QACpB,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;QACnB,MAAM,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAC9B,MAAM,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC;IAChB,CAAC;IAQD,MAAM,CAAC,cAAc,CACnB,MAAyB,EACzB,KAMC;QAED,OAAO,gBAAgB,CAAC,WAAW,CAAI;YACrC,GAAG,KAAK;YACR,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,aAAa,EAAE,MAAM,CAAC,aAAa;SACpC,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -10,6 +10,7 @@ export declare class JobsOutboxEntity<K extends JobType = JobType, P = JobPayloa
10
10
  emitter: string;
11
11
  emitterId: string;
12
12
  traceId?: string;
13
+ traceparent?: string;
13
14
  target: string;
14
15
  payload: JobPayload<K>;
15
16
  scheduledAt?: Date;
@@ -1 +1 @@
1
- {"version":3,"file":"jobs-outbox.entity.d.ts","sourceRoot":"","sources":["../../../src/outbox/entities/jobs-outbox.entity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAGpD,qBAAa,gBAAgB,CAC3B,CAAC,SAAS,OAAO,GAAG,OAAO,EAC3B,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CACjB,SAAQ,YAAY,CAAC,CAAC,CAAC;IACvB,MAAM,EAAG,MAAM,CAAC;IAEhB,OAAO,EAAG,CAAC,CAAC;IAEZ,WAAW,CAAC,EAAE,IAAI,CAAC;IAEnB,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,KAAK,EAAE;QACnD,IAAI,EAAE,CAAC,CAAC;QACR,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;QACvB,WAAW,CAAC,EAAE,IAAI,CAAC;KACpB,GAAG,gBAAgB,CAAC,CAAC,CAAC;CAgBxB"}
1
+ {"version":3,"file":"jobs-outbox.entity.d.ts","sourceRoot":"","sources":["../../../src/outbox/entities/jobs-outbox.entity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAIpD,qBAAa,gBAAgB,CAC3B,CAAC,SAAS,OAAO,GAAG,OAAO,EAC3B,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CACjB,SAAQ,YAAY,CAAC,CAAC,CAAC;IACvB,MAAM,EAAG,MAAM,CAAC;IAEhB,OAAO,EAAG,CAAC,CAAC;IAEZ,WAAW,CAAC,EAAE,IAAI,CAAC;IAEnB,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,KAAK,EAAE;QACnD,IAAI,EAAE,CAAC,CAAC;QACR,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;QACvB,WAAW,CAAC,EAAE,IAAI,CAAC;KACpB,GAAG,gBAAgB,CAAC,CAAC,CAAC;CAiBxB"}
@@ -1,6 +1,7 @@
1
1
  import { OutboxEntity } from './outbox.entity.js';
2
2
  import { randomUUID } from 'crypto';
3
3
  import { OutboxStatus } from '../index.js';
4
+ import { captureTraceparent } from '../utils/capture-traceparent.js';
4
5
  export class JobsOutboxEntity extends OutboxEntity {
5
6
  target;
6
7
  payload;
@@ -12,6 +13,7 @@ export class JobsOutboxEntity extends OutboxEntity {
12
13
  entity.emitter = props.emitter;
13
14
  entity.emitterId = props.emitterId;
14
15
  entity.traceId = props.traceId;
16
+ entity.traceparent = props.traceparent ?? captureTraceparent();
15
17
  entity.target = props.target;
16
18
  entity.payload = props.payload;
17
19
  entity.scheduledAt = props.scheduledAt;
@@ -1 +1 @@
1
- {"version":3,"file":"jobs-outbox.entity.js","sourceRoot":"","sources":["../../../src/outbox/entities/jobs-outbox.entity.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,OAAO,gBAGX,SAAQ,YAAe;IACvB,MAAM,CAAU;IAEhB,OAAO,CAAK;IAEZ,WAAW,CAAQ;IAEnB,MAAM,CAAC,SAAS,CAA8B,KAQ7C;QACC,MAAM,MAAM,GAAG,IAAI,gBAAgB,EAAK,CAAC;QACzC,MAAM,CAAC,EAAE,GAAG,UAAU,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACzB,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC/B,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QACnC,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC/B,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC7B,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC/B,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QACvC,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC;QACrC,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC;QACpB,MAAM,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAC9B,MAAM,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
1
+ {"version":3,"file":"jobs-outbox.entity.js","sourceRoot":"","sources":["../../../src/outbox/entities/jobs-outbox.entity.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAErE,MAAM,OAAO,gBAGX,SAAQ,YAAe;IACvB,MAAM,CAAU;IAEhB,OAAO,CAAK;IAEZ,WAAW,CAAQ;IAEnB,MAAM,CAAC,SAAS,CAA8B,KAS7C;QACC,MAAM,MAAM,GAAG,IAAI,gBAAgB,EAAK,CAAC;QACzC,MAAM,CAAC,EAAE,GAAG,UAAU,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACzB,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC/B,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QACnC,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC/B,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,IAAI,kBAAkB,EAAE,CAAC;QAC/D,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC7B,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC/B,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QACvC,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC;QACrC,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC;QACpB,MAAM,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAC9B,MAAM,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
@@ -9,6 +9,7 @@ export declare class OutboxEntity<T extends OutboxType = OutboxType> extends Bas
9
9
  type: T;
10
10
  emitter: string;
11
11
  traceId?: string;
12
+ traceparent?: string;
12
13
  emitterId: string;
13
14
  }
14
15
  //# sourceMappingURL=outbox.entity.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"outbox.entity.d.ts","sourceRoot":"","sources":["../../../src/outbox/entities/outbox.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D,qBAAa,YAAY,CAAC,CAAC,SAAS,UAAU,GAAG,UAAU,CACzD,SAAQ,UACR,YAAW,aAAa,CAAC,CAAC,CAAC;IAE3B,MAAM,EAAG,YAAY,CAAC;IAEtB,QAAQ,EAAG,MAAM,CAAC;IAElB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,IAAI,EAAG,CAAC,CAAC;IAET,OAAO,EAAG,MAAM,CAAC;IAEjB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,SAAS,EAAG,MAAM,CAAC;CACpB"}
1
+ {"version":3,"file":"outbox.entity.d.ts","sourceRoot":"","sources":["../../../src/outbox/entities/outbox.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D,qBAAa,YAAY,CAAC,CAAC,SAAS,UAAU,GAAG,UAAU,CACzD,SAAQ,UACR,YAAW,aAAa,CAAC,CAAC,CAAC;IAE3B,MAAM,EAAG,YAAY,CAAC;IAEtB,QAAQ,EAAG,MAAM,CAAC;IAElB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,IAAI,EAAG,CAAC,CAAC;IAET,OAAO,EAAG,MAAM,CAAC;IAEjB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,SAAS,EAAG,MAAM,CAAC;CACpB"}
@@ -6,6 +6,7 @@ export class OutboxEntity extends BaseEntity {
6
6
  type;
7
7
  emitter;
8
8
  traceId;
9
+ traceparent;
9
10
  emitterId;
10
11
  }
11
12
  //# sourceMappingURL=outbox.entity.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"outbox.entity.js","sourceRoot":"","sources":["../../../src/outbox/entities/outbox.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAKvD,MAAM,OAAO,YACX,SAAQ,UAAU;IAGlB,MAAM,CAAgB;IAEtB,QAAQ,CAAU;IAElB,SAAS,CAAU;IAEnB,IAAI,CAAK;IAET,OAAO,CAAU;IAEjB,OAAO,CAAU;IAEjB,SAAS,CAAU;CACpB"}
1
+ {"version":3,"file":"outbox.entity.js","sourceRoot":"","sources":["../../../src/outbox/entities/outbox.entity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAKvD,MAAM,OAAO,YACX,SAAQ,UAAU;IAGlB,MAAM,CAAgB;IAEtB,QAAQ,CAAU;IAElB,SAAS,CAAU;IAEnB,IAAI,CAAK;IAET,OAAO,CAAU;IAEjB,OAAO,CAAU;IAEjB,WAAW,CAAU;IAErB,SAAS,CAAU;CACpB"}
@@ -6,6 +6,7 @@ export * from './entities/index.js';
6
6
  export * from './interfaces/index.js';
7
7
  export * from './models/index.js';
8
8
  export * from './types/index.js';
9
+ export * from './utils/index.js';
9
10
  export * from './writers/index.js';
10
11
  export * from './dispatchers/index.js';
11
12
  export * from './pushers/index.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/outbox/index.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oCAAoC,CAAC;AACnD,cAAc,4BAA4B,CAAC;AAE3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/outbox/index.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oCAAoC,CAAC;AACnD,cAAc,4BAA4B,CAAC;AAE3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC"}
@@ -6,6 +6,7 @@ export * from './entities/index.js';
6
6
  export * from './interfaces/index.js';
7
7
  export * from './models/index.js';
8
8
  export * from './types/index.js';
9
+ export * from './utils/index.js';
9
10
  export * from './writers/index.js';
10
11
  export * from './dispatchers/index.js';
11
12
  export * from './pushers/index.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/outbox/index.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oCAAoC,CAAC;AACnD,cAAc,4BAA4B,CAAC;AAE3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/outbox/index.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oCAAoC,CAAC;AACnD,cAAc,4BAA4B,CAAC;AAE3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC"}
@@ -1,5 +1,10 @@
1
1
  import type { OutboxStatus } from '../types/outbox.status.js';
2
2
  import type { OutboxType } from '../types/outbox.type.js';
3
+ export interface EventTraceContext {
4
+ correlationId: string;
5
+ traceId?: string;
6
+ traceparent: string;
7
+ }
3
8
  export interface IOutboxEntity<T extends OutboxType> {
4
9
  id: string;
5
10
  status: OutboxStatus;
@@ -1 +1 @@
1
- {"version":3,"file":"outbox.interfaces.d.ts","sourceRoot":"","sources":["../../../src/outbox/interfaces/outbox.interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,UAAU;IACjD,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,CAAC,CAAC;IACR,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AACD,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,UAAU;IAChD,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,CAAC,CAAC;IACR,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB"}
1
+ {"version":3,"file":"outbox.interfaces.d.ts","sourceRoot":"","sources":["../../../src/outbox/interfaces/outbox.interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAO1D,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,UAAU;IACjD,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,CAAC,CAAC;IACR,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AACD,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,UAAU;IAChD,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,CAAC,CAAC;IACR,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB"}
@@ -0,0 +1,3 @@
1
+ export declare function captureTraceparent(): string | undefined;
2
+ export declare function normalizeTraceparent(value: string | null | undefined): string | undefined;
3
+ //# sourceMappingURL=capture-traceparent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture-traceparent.d.ts","sourceRoot":"","sources":["../../../src/outbox/utils/capture-traceparent.ts"],"names":[],"mappings":"AASA,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,SAAS,CAIvD;AAQD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAEzF"}
@@ -0,0 +1,10 @@
1
+ import { context, propagation } from '@opentelemetry/api';
2
+ export function captureTraceparent() {
3
+ const carrier = {};
4
+ propagation.inject(context.active(), carrier);
5
+ return carrier.traceparent;
6
+ }
7
+ export function normalizeTraceparent(value) {
8
+ return value === null || value === undefined || value === '' ? undefined : value;
9
+ }
10
+ //# sourceMappingURL=capture-traceparent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture-traceparent.js","sourceRoot":"","sources":["../../../src/outbox/utils/capture-traceparent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAS1D,MAAM,UAAU,kBAAkB;IAChC,MAAM,OAAO,GAA6B,EAAE,CAAC;IAC7C,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC;IAC9C,OAAO,OAAO,CAAC,WAAW,CAAC;AAC7B,CAAC;AAQD,MAAM,UAAU,oBAAoB,CAAC,KAAgC;IACnE,OAAO,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;AACnF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './capture-traceparent.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/outbox/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './capture-traceparent.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/outbox/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { Context, SpanContext } from '@opentelemetry/api';
2
+ export declare const TRACE_ID_HEX = "0af7651916cd43dd8448eb211c80319c";
3
+ export declare const SPAN_ID_HEX = "b7ad6b7169203331";
4
+ export declare const SAMPLED_TRACEPARENT = "00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01";
5
+ export declare const createSpanContext: (overrides?: Partial<SpanContext>) => SpanContext;
6
+ export declare const createActiveContext: (spanContext?: SpanContext) => Context;
7
+ //# sourceMappingURL=span-context.factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"span-context.factory.d.ts","sourceRoot":"","sources":["../../../../src/test/outbox/entities/span-context.factory.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAE/D,eAAO,MAAM,YAAY,qCAAqC,CAAC;AAC/D,eAAO,MAAM,WAAW,qBAAqB,CAAC;AAC9C,eAAO,MAAM,mBAAmB,4DAAyC,CAAC;AAE1E,eAAO,MAAM,iBAAiB,eAAe,OAAO,CAAC,WAAW,CAAC,KAAQ,WAKvE,CAAC;AAEH,eAAO,MAAM,mBAAmB,iBAAiB,WAAW,KAAyB,OACpC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { ROOT_CONTEXT, TraceFlags, trace } from '@opentelemetry/api';
2
+ export const TRACE_ID_HEX = '0af7651916cd43dd8448eb211c80319c';
3
+ export const SPAN_ID_HEX = 'b7ad6b7169203331';
4
+ export const SAMPLED_TRACEPARENT = `00-${TRACE_ID_HEX}-${SPAN_ID_HEX}-01`;
5
+ export const createSpanContext = (overrides = {}) => ({
6
+ traceId: TRACE_ID_HEX,
7
+ spanId: SPAN_ID_HEX,
8
+ traceFlags: TraceFlags.SAMPLED,
9
+ ...overrides,
10
+ });
11
+ export const createActiveContext = (spanContext = createSpanContext()) => trace.setSpanContext(ROOT_CONTEXT, spanContext);
12
+ //# sourceMappingURL=span-context.factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"span-context.factory.js","sourceRoot":"","sources":["../../../../src/test/outbox/entities/span-context.factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAGrE,MAAM,CAAC,MAAM,YAAY,GAAG,kCAAkC,CAAC;AAC/D,MAAM,CAAC,MAAM,WAAW,GAAG,kBAAkB,CAAC;AAC9C,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,YAAY,IAAI,WAAW,KAAK,CAAC;AAE1E,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,YAAkC,EAAE,EAAe,EAAE,CAAC,CAAC;IACvF,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,WAAW;IACnB,UAAU,EAAE,UAAU,CAAC,OAAO;IAC9B,GAAG,SAAS;CACb,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,cAA2B,iBAAiB,EAAE,EAAW,EAAE,CAC7F,KAAK,CAAC,cAAc,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=traceparent-capture.unit.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traceparent-capture.unit.spec.d.ts","sourceRoot":"","sources":["../../../../src/test/outbox/entities/traceparent-capture.unit.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,142 @@
1
+ import { afterAll, afterEach, beforeAll, describe, expect, it, jest } from '@jest/globals';
2
+ import { ROOT_CONTEXT, context, propagation } from '@opentelemetry/api';
3
+ import { W3CTraceContextPropagator } from '@opentelemetry/core';
4
+ import { captureTraceparent, normalizeTraceparent, } from '../../../outbox/utils/capture-traceparent.js';
5
+ import { EventQueueEntity } from '../../../outbox/entities/event-queue.entity.js';
6
+ import { JobsOutboxEntity } from '../../../outbox/entities/jobs-outbox.entity.js';
7
+ import { SAMPLED_TRACEPARENT, createActiveContext, createSpanContext, } from './span-context.factory.js';
8
+ const EMITTER_ID = '00000000-0000-0000-0000-000000000000';
9
+ const EXPLICIT_TRACEPARENT = '00-11111111111111111111111111111111-2222222222222222-00';
10
+ describe('traceparent capture (Unit)', () => {
11
+ beforeAll(() => {
12
+ propagation.setGlobalPropagator(new W3CTraceContextPropagator());
13
+ });
14
+ afterAll(() => {
15
+ propagation.disable();
16
+ });
17
+ afterEach(() => {
18
+ jest.restoreAllMocks();
19
+ });
20
+ const withActiveSpan = (spanContext = createSpanContext()) => {
21
+ jest.spyOn(context, 'active').mockReturnValue(createActiveContext(spanContext));
22
+ };
23
+ const withoutActiveSpan = () => {
24
+ jest.spyOn(context, 'active').mockReturnValue(ROOT_CONTEXT);
25
+ };
26
+ describe('captureTraceparent', () => {
27
+ it('should serialise the active span as a 55 character W3C traceparent', () => {
28
+ withActiveSpan();
29
+ const traceparent = captureTraceparent();
30
+ expect(traceparent).toBe(SAMPLED_TRACEPARENT);
31
+ expect(traceparent).toHaveLength(55);
32
+ });
33
+ it('should keep the sampled flag of the active span', () => {
34
+ withActiveSpan(createSpanContext({ traceFlags: 0 }));
35
+ const traceparent = captureTraceparent();
36
+ expect(traceparent?.endsWith('-00')).toBe(true);
37
+ });
38
+ it('should return undefined without an active span', () => {
39
+ withoutActiveSpan();
40
+ expect(captureTraceparent()).toBeUndefined();
41
+ });
42
+ it('should return undefined when the active span context is invalid', () => {
43
+ withActiveSpan(createSpanContext({ traceId: '0'.repeat(32), spanId: '0'.repeat(16) }));
44
+ expect(captureTraceparent()).toBeUndefined();
45
+ });
46
+ });
47
+ describe('normalizeTraceparent', () => {
48
+ it('should turn the null read from a nullable column into undefined', () => {
49
+ expect(normalizeTraceparent(null)).toBeUndefined();
50
+ });
51
+ it('should turn the empty string of the stream wire format into undefined', () => {
52
+ expect(normalizeTraceparent('')).toBeUndefined();
53
+ });
54
+ it('should keep undefined and string values unchanged', () => {
55
+ expect(normalizeTraceparent(undefined)).toBeUndefined();
56
+ expect(normalizeTraceparent(SAMPLED_TRACEPARENT)).toBe(SAMPLED_TRACEPARENT);
57
+ });
58
+ });
59
+ describe('EventQueueEntity.createFollowUp', () => {
60
+ const makeProps = () => ({
61
+ type: 'user.badge_awarded',
62
+ emitter: 'post-processor-user',
63
+ emitterId: EMITTER_ID,
64
+ payload: { id: 'user-1' },
65
+ targetServices: [],
66
+ });
67
+ const CORRELATION_ID = '9f8c1a52-3d2e-4b8a-9c11-0d6a7e5b4c33';
68
+ it('should copy traceId, traceparent and correlationId from the source event', () => {
69
+ withoutActiveSpan();
70
+ const source = {
71
+ correlationId: CORRELATION_ID,
72
+ traceId: '0b1c2d3e-4f50-4162-8374-95a6b7c8d9e0',
73
+ traceparent: EXPLICIT_TRACEPARENT,
74
+ };
75
+ const entity = EventQueueEntity.createFollowUp(source, makeProps());
76
+ expect(entity.correlationId).toBe(CORRELATION_ID);
77
+ expect(entity.traceId).toBe(source.traceId);
78
+ expect(entity.traceparent).toBe(EXPLICIT_TRACEPARENT);
79
+ });
80
+ it('should not replace the source traceparent with the active span of the consumer', () => {
81
+ withActiveSpan();
82
+ const entity = EventQueueEntity.createFollowUp({ correlationId: CORRELATION_ID, traceparent: EXPLICIT_TRACEPARENT }, makeProps());
83
+ expect(entity.traceparent).toBe(EXPLICIT_TRACEPARENT);
84
+ });
85
+ it('should store no traceparent when the source message had none', () => {
86
+ withoutActiveSpan();
87
+ const entity = EventQueueEntity.createFollowUp({ correlationId: CORRELATION_ID, traceparent: '' }, makeProps());
88
+ expect(entity.traceparent).toBeUndefined();
89
+ });
90
+ });
91
+ describe('EventQueueEntity.createEvent', () => {
92
+ const makeProps = (traceparent) => ({
93
+ type: 'user.created',
94
+ emitter: 'ms-user',
95
+ emitterId: EMITTER_ID,
96
+ payload: { id: 'user-1' },
97
+ targetServices: [],
98
+ traceparent,
99
+ });
100
+ it('should store the active trace context in traceparent', () => {
101
+ withActiveSpan();
102
+ const entity = EventQueueEntity.createEvent(makeProps());
103
+ expect(entity.traceparent).toBe(SAMPLED_TRACEPARENT);
104
+ });
105
+ it('should leave traceparent undefined without an active span', () => {
106
+ withoutActiveSpan();
107
+ const entity = EventQueueEntity.createEvent(makeProps());
108
+ expect(entity.traceparent).toBeUndefined();
109
+ });
110
+ it('should prefer an explicit traceparent over the active span', () => {
111
+ withActiveSpan();
112
+ const entity = EventQueueEntity.createEvent(makeProps(EXPLICIT_TRACEPARENT));
113
+ expect(entity.traceparent).toBe(EXPLICIT_TRACEPARENT);
114
+ });
115
+ });
116
+ describe('JobsOutboxEntity.createJob', () => {
117
+ const makeProps = (traceparent) => ({
118
+ type: 'user.cleanup',
119
+ emitter: 'ms-user',
120
+ emitterId: EMITTER_ID,
121
+ target: 'worker-user',
122
+ payload: { id: 'user-1' },
123
+ traceparent,
124
+ });
125
+ it('should store the active trace context in traceparent', () => {
126
+ withActiveSpan();
127
+ const entity = JobsOutboxEntity.createJob(makeProps());
128
+ expect(entity.traceparent).toBe(SAMPLED_TRACEPARENT);
129
+ });
130
+ it('should leave traceparent undefined without an active span', () => {
131
+ withoutActiveSpan();
132
+ const entity = JobsOutboxEntity.createJob(makeProps());
133
+ expect(entity.traceparent).toBeUndefined();
134
+ });
135
+ it('should prefer an explicit traceparent over the active span', () => {
136
+ withActiveSpan();
137
+ const entity = JobsOutboxEntity.createJob(makeProps(EXPLICIT_TRACEPARENT));
138
+ expect(entity.traceparent).toBe(EXPLICIT_TRACEPARENT);
139
+ });
140
+ });
141
+ });
142
+ //# sourceMappingURL=traceparent-capture.unit.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traceparent-capture.unit.spec.js","sourceRoot":"","sources":["../../../../src/test/outbox/entities/traceparent-capture.unit.spec.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@volontariapp/database",
3
- "version": "3.5.0",
3
+ "version": "3.6.0-snap-d038e0e",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "provenance": true
@@ -40,11 +40,12 @@
40
40
  "db:down": "docker-compose -f ../../docker-compose.test.yml down"
41
41
  },
42
42
  "dependencies": {
43
+ "@opentelemetry/api": "^1.9.0",
43
44
  "@volontariapp/bridge": "1.0.7",
44
45
  "@volontariapp/config": "3.2.3",
45
46
  "@volontariapp/errors": "0.6.3",
46
47
  "@volontariapp/logger": "0.3.0",
47
- "@volontariapp/messaging": "2.24.0",
48
+ "@volontariapp/messaging": "2.25.0-snap-d038e0e",
48
49
  "@volontariapp/shared": "0.14.0",
49
50
  "class-transformer": "^0.5.1",
50
51
  "class-validator": "^0.14.1",
@@ -53,6 +54,7 @@
53
54
  },
54
55
  "devDependencies": {
55
56
  "@jest/globals": "^30.3.0",
57
+ "@opentelemetry/core": "^2.6.1",
56
58
  "@types/jest": "^30.0.0",
57
59
  "@types/node": "^22.10.7",
58
60
  "@types/pg": "^8",