@nestjs-transactional/outbox 1.0.0-alpha.5 → 1.0.0
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.
- package/README.md +152 -332
- package/dist/api/failed-event-publications.js.map +1 -1
- package/dist/api/incomplete-event-publications.js +1 -2
- package/dist/api/incomplete-event-publications.js.map +1 -1
- package/dist/decorators/outbox-events-handler.decorator.d.ts +1 -1
- package/dist/decorators/outbox-events-handler.decorator.js.map +1 -1
- package/dist/dispatcher/data-source-outbox-publisher.d.ts +2 -3
- package/dist/dispatcher/data-source-outbox-publisher.js +2 -3
- package/dist/dispatcher/data-source-outbox-publisher.js.map +1 -1
- package/dist/dispatcher/event-publication-processor.d.ts +19 -2
- package/dist/dispatcher/event-publication-processor.js +40 -3
- package/dist/dispatcher/event-publication-processor.js.map +1 -1
- package/dist/dispatcher/outbox-event-publisher.d.ts +1 -1
- package/dist/dispatcher/outbox-event-publisher.js +2 -2
- package/dist/dispatcher/outbox-event-publisher.js.map +1 -1
- package/dist/dispatcher/processor-options.d.ts +13 -1
- package/dist/dispatcher/processor-options.js +4 -1
- package/dist/dispatcher/processor-options.js.map +1 -1
- package/dist/externalization/event-externalizer.d.ts +2 -2
- package/dist/externalization/externalization-registry.js.map +1 -1
- package/dist/externalization/externalized.decorator.d.ts +3 -4
- package/dist/externalization/externalized.decorator.js +2 -3
- package/dist/externalization/externalized.decorator.js.map +1 -1
- package/dist/externalization/types.d.ts +2 -2
- package/dist/index.d.ts +3 -0
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/module/outbox-processing.module.d.ts +18 -2
- package/dist/module/outbox-processing.module.js +28 -8
- package/dist/module/outbox-processing.module.js.map +1 -1
- package/dist/module/outbox.module.d.ts +8 -0
- package/dist/module/outbox.module.js +61 -7
- package/dist/module/outbox.module.js.map +1 -1
- package/dist/recovery/outbox-retry-scheduler.d.ts +68 -0
- package/dist/recovery/outbox-retry-scheduler.js +163 -0
- package/dist/recovery/outbox-retry-scheduler.js.map +1 -0
- package/dist/recovery/staleness-monitor.d.ts +10 -2
- package/dist/recovery/staleness-monitor.js +28 -3
- package/dist/recovery/staleness-monitor.js.map +1 -1
- package/dist/registry/event-publication-registry.d.ts +1 -1
- package/dist/registry/event-publication-registry.js +1 -1
- package/dist/registry/event-publication-registry.js.map +1 -1
- package/dist/registry/listener-registry.d.ts +2 -2
- package/dist/registry/listener-registry.js +2 -2
- package/dist/registry/multi-ds-listener-registrar.d.ts +10 -4
- package/dist/registry/multi-ds-listener-registrar.js +1 -1
- package/dist/registry/multi-ds-listener-registrar.js.map +1 -1
- package/dist/registry/outbox-listener-scanner.d.ts +1 -1
- package/dist/registry/outbox-listener-scanner.js +1 -1
- package/dist/registry/outbox-listener-scanner.js.map +1 -1
- package/dist/repository/event-publication-repository.d.ts +25 -5
- package/dist/repository/event-publication-repository.js.map +1 -1
- package/dist/serialization/event-type-resolver.d.ts +1 -1
- package/dist/serialization/event-type-resolver.js +1 -1
- package/dist/serialization/json-event-serializer.js.map +1 -1
- package/dist/shutdown/drain.d.ts +32 -0
- package/dist/shutdown/drain.js +56 -0
- package/dist/shutdown/drain.js.map +1 -0
- package/dist/testing/in-memory-repository.js +1 -2
- package/dist/testing/in-memory-repository.js.map +1 -1
- package/dist/testing/published-events.js +4 -1
- package/dist/testing/published-events.js.map +1 -1
- package/dist/tokens/token-utils.js.map +1 -1
- package/dist/types/resubmission-options.d.ts +0 -4
- package/dist/types/resubmission-options.js +0 -9
- package/dist/types/resubmission-options.js.map +1 -1
- package/dist/types/retry-config.d.ts +51 -0
- package/dist/types/retry-config.js +16 -0
- package/dist/types/retry-config.js.map +1 -0
- package/dist/types/staleness-config.d.ts +8 -0
- package/dist/types/staleness-config.js +2 -0
- package/dist/types/staleness-config.js.map +1 -1
- package/package.json +17 -6
|
@@ -22,8 +22,8 @@ export interface RegisteredOutboxListener {
|
|
|
22
22
|
* keyed by both the listener id (for targeted dispatch / resume) and
|
|
23
23
|
* the event class name (for fan-out when a new event is published).
|
|
24
24
|
*
|
|
25
|
-
* Populated at application bootstrap by the scanner
|
|
26
|
-
*
|
|
25
|
+
* Populated at application bootstrap by the scanner. Stateless
|
|
26
|
+
* beyond the two index maps.
|
|
27
27
|
*/
|
|
28
28
|
export declare class OutboxListenerRegistry {
|
|
29
29
|
private readonly listenersByEventType;
|
|
@@ -16,8 +16,8 @@ const errors_1 = require("../types/errors");
|
|
|
16
16
|
* keyed by both the listener id (for targeted dispatch / resume) and
|
|
17
17
|
* the event class name (for fan-out when a new event is published).
|
|
18
18
|
*
|
|
19
|
-
* Populated at application bootstrap by the scanner
|
|
20
|
-
*
|
|
19
|
+
* Populated at application bootstrap by the scanner. Stateless
|
|
20
|
+
* beyond the two index maps.
|
|
21
21
|
*/
|
|
22
22
|
let OutboxListenerRegistry = class OutboxListenerRegistry {
|
|
23
23
|
listenersByEventType = new Map();
|
|
@@ -19,15 +19,22 @@ import { type OutboxDataSourceNames } from '../dispatcher/outbox-event-publisher
|
|
|
19
19
|
* source-level clarity.
|
|
20
20
|
*/
|
|
21
21
|
export declare const OUTBOX_LISTENER_REGISTRAR_TOKEN: unique symbol;
|
|
22
|
-
/**
|
|
23
|
-
|
|
22
|
+
/**
|
|
23
|
+
* Shape of an entry registered through the structural registrar port.
|
|
24
|
+
*
|
|
25
|
+
* Exported because it is the parameter type of the public
|
|
26
|
+
* {@link MultiDsOutboxListenerRegistrar.register} — without it a consumer
|
|
27
|
+
* cannot name what that method takes. Flagged by api-extractor's
|
|
28
|
+
* `ae-forgotten-export`.
|
|
29
|
+
*/
|
|
30
|
+
export interface RegistrarListenerEntry {
|
|
24
31
|
readonly id: string;
|
|
25
32
|
readonly eventType: string;
|
|
26
33
|
readonly invoke: (event: unknown) => Promise<void>;
|
|
27
34
|
}
|
|
28
35
|
/**
|
|
29
36
|
* Multi-dataSource implementation of the cqrs package's
|
|
30
|
-
* `OutboxListenerRegistrar` structural port
|
|
37
|
+
* `OutboxListenerRegistrar` structural port.
|
|
31
38
|
*
|
|
32
39
|
* Walks every per-dataSource {@link EventTypeRegistry} to resolve
|
|
33
40
|
* which dataSource owns each incoming listener's event class, then
|
|
@@ -74,5 +81,4 @@ export declare class MultiDsOutboxListenerRegistrar {
|
|
|
74
81
|
*/
|
|
75
82
|
private collectEventTypeRegistries;
|
|
76
83
|
}
|
|
77
|
-
export {};
|
|
78
84
|
//# sourceMappingURL=multi-ds-listener-registrar.d.ts.map
|
|
@@ -40,7 +40,7 @@ const token_utils_1 = require("../tokens/token-utils");
|
|
|
40
40
|
exports.OUTBOX_LISTENER_REGISTRAR_TOKEN = Symbol.for('@nestjs-transactional/cqrs/outbox-listener-registrar');
|
|
41
41
|
/**
|
|
42
42
|
* Multi-dataSource implementation of the cqrs package's
|
|
43
|
-
* `OutboxListenerRegistrar` structural port
|
|
43
|
+
* `OutboxListenerRegistrar` structural port.
|
|
44
44
|
*
|
|
45
45
|
* Walks every per-dataSource {@link EventTypeRegistry} to resolve
|
|
46
46
|
* which dataSource owns each incoming listener's event class, then
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multi-ds-listener-registrar.js","sourceRoot":"","sources":["../../src/registry/multi-ds-listener-registrar.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAA4D;AAC5D,uCAAyC;AAEzC,iFAG8C;AAE9C,8EAAwF;AACxF,
|
|
1
|
+
{"version":3,"file":"multi-ds-listener-registrar.js","sourceRoot":"","sources":["../../src/registry/multi-ds-listener-registrar.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAA4D;AAC5D,uCAAyC;AAEzC,iFAG8C;AAE9C,8EAAwF;AACxF,uDAAkG;AAIlG;;;;;;;;;;;;;;;;;GAiBG;AACU,QAAA,+BAA+B,GAAG,MAAM,CAAC,GAAG,CACvD,sDAAsD,CACvD,CAAC;AAgBF;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEI,IAAM,8BAA8B,sCAApC,MAAM,8BAA8B;IAItB;IAEA;IALF,MAAM,GAAG,IAAI,eAAM,CAAC,gCAA8B,CAAC,IAAI,CAAC,CAAC;IAE1E,YACmB,SAAoB,EAEpB,eAAsC;QAFtC,cAAS,GAAT,SAAS,CAAW;QAEpB,oBAAe,GAAf,eAAe,CAAuB;IACtD,CAAC;IAEJ;;;;;OAKG;IACH,QAAQ,CAAC,QAAgC;QACvC,MAAM,mBAAmB,GAAG,IAAI,CAAC,0BAA0B,EAAE,CAAC;QAC9D,MAAM,UAAU,GAAG,IAAA,sDAAgC,EAAC,QAAQ,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;QAE7F,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CACjC,IAAA,4CAA8B,EAAC,UAAU,CAAC,EAC1C,EAAE,MAAM,EAAE,KAAK,EAAE,CAClB,CAAC;QACF,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAE5B,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,uBAAuB,QAAQ,CAAC,EAAE,gBAAgB,QAAQ,CAAC,SAAS,mBAAmB,UAAU,GAAG,CACrG,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACK,0BAA0B;QAChC,MAAM,UAAU,GAAG,IAAI,GAAG,EAA6B,CAAC;QACxD,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC;YACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CACjC,IAAA,uCAAyB,EAAC,UAAU,CAAC,EACrC,EAAE,MAAM,EAAE,KAAK,EAAE,CAClB,CAAC;YACF,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;CACF,CAAA;AAhDY,wEAA8B;yCAA9B,8BAA8B;IAD1C,IAAA,mBAAU,GAAE;IAMR,WAAA,IAAA,eAAM,EAAC,iDAAwB,CAAC,CAAA;qCADL,gBAAS;GAJ5B,8BAA8B,CAgD1C"}
|
|
@@ -9,7 +9,7 @@ import { type OutboxDataSourceNames } from '../dispatcher/outbox-event-publisher
|
|
|
9
9
|
* the per-dataSource {@link OutboxListenerRegistry} that owns each
|
|
10
10
|
* decorated event class.
|
|
11
11
|
*
|
|
12
|
-
* **Per-dataSource routing
|
|
12
|
+
* **Per-dataSource routing.** Multi-`OutboxModule.forRoot`
|
|
13
13
|
* deployments register events to per-DS `EventTypeRegistry`
|
|
14
14
|
* instances via `OutboxModule.forFeature(events, { dataSource })`.
|
|
15
15
|
* The scanner walks every per-DS `EventTypeRegistry`, resolves which
|
|
@@ -30,7 +30,7 @@ const errors_1 = require("../types/errors");
|
|
|
30
30
|
* the per-dataSource {@link OutboxListenerRegistry} that owns each
|
|
31
31
|
* decorated event class.
|
|
32
32
|
*
|
|
33
|
-
* **Per-dataSource routing
|
|
33
|
+
* **Per-dataSource routing.** Multi-`OutboxModule.forRoot`
|
|
34
34
|
* deployments register events to per-DS `EventTypeRegistry`
|
|
35
35
|
* instances via `OutboxModule.forFeature(events, { dataSource })`.
|
|
36
36
|
* The scanner walks every per-DS `EventTypeRegistry`, resolves which
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outbox-listener-scanner.js","sourceRoot":"","sources":["../../src/registry/outbox-listener-scanner.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"outbox-listener-scanner.js","sourceRoot":"","sources":["../../src/registry/outbox-listener-scanner.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAiNA,8CAEC;AAnND,2CAA0F;AAC1F,uCAA2D;AAC3D,qDAAiF;AAEjF,mGAA+F;AAC/F,iFAG8C;AAE9C,8EAAwF;AACxF,uDAAkG;AAClG,4CAA8C;AAM9C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEI,IAAM,qBAAqB,6BAA3B,MAAM,qBAAqB;IAIb;IACA;IAEA;IACA;IAPF,MAAM,GAAG,IAAI,eAAM,CAAC,uBAAqB,CAAC,IAAI,CAAC,CAAC;IAEjE,YACmB,SAA2B,EAC3B,SAAoB,EAEpB,eAAsC,EACtC,kBAAsC;QAJtC,cAAS,GAAT,SAAS,CAAkB;QAC3B,cAAS,GAAT,SAAS,CAAW;QAEpB,oBAAe,GAAf,eAAe,CAAuB;QACtC,uBAAkB,GAAlB,kBAAkB,CAAoB;IACtD,CAAC;IAEJ,YAAY;QACV,MAAM,mBAAmB,GAAG,IAAI,CAAC,0BAA0B,EAAE,CAAC;QAC9D,MAAM,kBAAkB,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;QAE5D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;QAEhD,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;YAChC,IACE,OAAO,CAAC,QAAQ,KAAK,IAAI;gBACzB,OAAO,OAAO,CAAC,QAAQ,KAAK,UAAU;gBACtC,OAAO,CAAC,QAAQ,KAAK,IAAI;gBACzB,OAAO,CAAC,QAAQ,KAAK,SAAS,EAC9B,CAAC;gBACD,SAAS;YACX,CAAC;YAED,MAAM,QAAQ,GAAG,IAAA,gEAA8B,EAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAClE,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,SAAS;YACX,CAAC;YAED,MAAM,SAAS,GAAI,OAAO,CAAC,QAA8B,CAAC,IAAI,IAAI,WAAW,CAAC;YAC9E,MAAM,QAAQ,GAAW,OAAO,CAAC,QAAkB,CAAC;YACpD,MAAM,SAAS,GAAI,QAAoC,CAAC,MAAM,CAAC;YAC/D,IAAI,OAAO,SAAS,KAAK,UAAU,EAAE,CAAC;gBACpC,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,2BAA2B,SAAS,+CAA+C,CACpF,CAAC;gBACF,SAAS;YACX,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,CAAC,wBAAwB,CAC9C,SAAS,EACT,QAAQ,CAAC,UAAU,EACnB,mBAAmB,CACpB,CAAC;YACF,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACpD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,4DAA4D;gBAC5D,2DAA2D;gBAC3D,iDAAiD;gBACjD,MAAM,IAAI,oBAAW,CACnB,2BAA2B,SAAS,6CAA6C;oBAC/E,eAAe,UAAU,oDAAoD,CAChF,CAAC;YACJ,CAAC;YAED,MAAM,WAAW,GAAI,SAAkC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvE,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC;YACxC,MAAM,EAAE,cAAc,EAAE,GAAG,QAAQ,CAAC;YAEpC,MAAM,MAAM,GAAG,KAAK,EAAE,KAAc,EAAiB,EAAE;gBACrD,IAAI,cAAc,EAAE,CAAC;oBACnB,MAAM,OAAO,CAAC,GAAG,CAAC,EAAE,WAAW,EAAE,sBAAe,CAAC,YAAY,EAAE,EAAE,KAAK,IAAI,EAAE;wBAC1E,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC;oBAC3B,CAAC,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC;gBAC3B,CAAC;YACH,CAAC,CAAC;YAEF,MAAM,MAAM,GAAG,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC;YAExD,KAAK,MAAM,SAAS,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;gBAC5C,MAAM,UAAU,GAAG,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBACxD,QAAQ,CAAC,QAAQ,CAAC;oBAChB,EAAE,EAAE,UAAU;oBACd,SAAS,EAAE,SAAS,CAAC,IAAI;oBACzB,MAAM;iBACP,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACK,wBAAwB,CAC9B,SAAiB,EACjB,UAA2B,EAC3B,mBAA2D;QAE3D,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAkB,CAAC;QACrD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,UAAU,GAAG,IAAA,sDAAgC,EAAC,SAAS,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;YACzF,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/D,IAAI,iBAAiB,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAG,CAAC,GAAG,kBAAkB,CAAC;iBACtC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,KAAK,SAAS,OAAO,UAAU,GAAG,CAAC;iBACpE,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,MAAM,IAAI,oBAAW,CACnB,2BAA2B,SAAS,wCAAwC,SAAS,IAAI;gBACvF,2DAA2D;gBAC3D,oFAAoF;gBACpF,8DAA8D;gBAC9D,4EAA4E,CAC/E,CAAC;QACJ,CAAC;QACD,6DAA6D;QAC7D,8DAA8D;QAC9D,oEAAoE;QACpE,OAAO,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAE,CAAC;IACpC,CAAC;IAEO,0BAA0B;QAChC,MAAM,UAAU,GAAG,IAAI,GAAG,EAA6B,CAAC;QACxD,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC;YACrD,UAAU,CAAC,GAAG,CACZ,UAAU,EACV,IAAI,CAAC,SAAS,CAAC,GAAG,CAAoB,IAAA,uCAAyB,EAAC,UAAU,CAAC,EAAE;gBAC3E,MAAM,EAAE,KAAK;aACd,CAAC,CACH,CAAC;QACJ,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;IAEO,yBAAyB;QAC/B,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkC,CAAC;QAC7D,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC;YACrD,UAAU,CAAC,GAAG,CACZ,UAAU,EACV,IAAI,CAAC,SAAS,CAAC,GAAG,CAAyB,IAAA,4CAA8B,EAAC,UAAU,CAAC,EAAE;gBACrF,MAAM,EAAE,KAAK;aACd,CAAC,CACH,CAAC;QACJ,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;CACF,CAAA;AAlJY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,mBAAU,GAAE;IAOR,WAAA,IAAA,eAAM,EAAC,iDAAwB,CAAC,CAAA;qCAFL,uBAAgB;QAChB,gBAAS,UAGA,yBAAkB;GAR9C,qBAAqB,CAkJjC;AAED;;;;;GAKG;AACH,SAAgB,iBAAiB,CAAC,MAAc,EAAE,SAAe;IAC/D,OAAO,GAAG,MAAM,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;AACvC,CAAC"}
|
|
@@ -64,15 +64,35 @@ export interface EventPublicationRepository {
|
|
|
64
64
|
* Atomically claim a publication: transition `PUBLISHED` or
|
|
65
65
|
* `RESUBMITTED` → `PROCESSING` (and increment `completionAttempts`)
|
|
66
66
|
* iff the current status is one of those. Returns `true` when the
|
|
67
|
-
* claim succeeded, `false` otherwise
|
|
68
|
-
*
|
|
67
|
+
* claim succeeded, `false` otherwise.
|
|
68
|
+
*
|
|
69
|
+
* **This method carries the SPI's whole concurrency guarantee.** It is
|
|
70
|
+
* what prevents double-processing across workers, so the status check
|
|
71
|
+
* and the transition MUST be one indivisible operation — a conditional
|
|
72
|
+
* `UPDATE ... WHERE status IN (...)` reporting affected-row count, a
|
|
73
|
+
* `findOneAndUpdate` with the status in the filter, or an equivalent
|
|
74
|
+
* compare-and-set. A read-then-write implementation is incorrect: two
|
|
75
|
+
* workers would both observe `PUBLISHED` and both dispatch.
|
|
76
|
+
*
|
|
77
|
+
* See DD-025.
|
|
69
78
|
*/
|
|
70
79
|
tryClaim(id: string): Promise<boolean>;
|
|
71
80
|
/**
|
|
72
81
|
* Find publications ready for processing (status `PUBLISHED` or
|
|
73
|
-
* `RESUBMITTED`)
|
|
74
|
-
*
|
|
75
|
-
*
|
|
82
|
+
* `RESUBMITTED`), oldest first.
|
|
83
|
+
*
|
|
84
|
+
* Deliberately NOT exclusive: implementations need not lock rows or
|
|
85
|
+
* hand out disjoint sets, and concurrent workers may receive
|
|
86
|
+
* overlapping results. Correctness comes from {@link tryClaim} — a
|
|
87
|
+
* worker that loses the claim skips the publication without invoking
|
|
88
|
+
* its listener, so overlap costs a wasted read, never a duplicate
|
|
89
|
+
* dispatch.
|
|
90
|
+
*
|
|
91
|
+
* Row-locking implementations (`SELECT ... FOR UPDATE SKIP LOCKED`)
|
|
92
|
+
* are permitted but not expected, and neither shipped implementation
|
|
93
|
+
* uses one: a pessimistic lock has to be held by a transaction that
|
|
94
|
+
* spans the listener invocation, which is unsafe for long-running
|
|
95
|
+
* listeners. See DD-025.
|
|
76
96
|
*/
|
|
77
97
|
findReadyForProcessing(limit: number): Promise<EventPublication[]>;
|
|
78
98
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-publication-repository.js","sourceRoot":"","sources":["../../src/repository/event-publication-repository.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"event-publication-repository.js","sourceRoot":"","sources":["../../src/repository/event-publication-repository.ts"],"names":[],"mappings":";;;AAiJA,kEAAkE;AACrD,QAAA,4BAA4B,GAAG,MAAM,CAAC,8BAA8B,CAAC,CAAC"}
|
|
@@ -6,7 +6,7 @@ import type { EventTypeRegistry } from './event-type-registry';
|
|
|
6
6
|
* the event-type — otherwise throws {@link OutboxError} with an
|
|
7
7
|
* actionable message.
|
|
8
8
|
*
|
|
9
|
-
* Single source of truth shared by three consumers
|
|
9
|
+
* Single source of truth shared by three consumers:
|
|
10
10
|
*
|
|
11
11
|
* - {@link OutboxEventPublisher.resolveDataSource} — smart-facade
|
|
12
12
|
* publisher routes events to the dataSource that registered them.
|
|
@@ -9,7 +9,7 @@ const errors_1 = require("../types/errors");
|
|
|
9
9
|
* the event-type — otherwise throws {@link OutboxError} with an
|
|
10
10
|
* actionable message.
|
|
11
11
|
*
|
|
12
|
-
* Single source of truth shared by three consumers
|
|
12
|
+
* Single source of truth shared by three consumers:
|
|
13
13
|
*
|
|
14
14
|
* - {@link OutboxEventPublisher.resolveDataSource} — smart-facade
|
|
15
15
|
* publisher routes events to the dataSource that registered them.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-event-serializer.js","sourceRoot":"","sources":["../../src/serialization/json-event-serializer.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAE5C,4CAA2E;AAG3E,+DAA0D;AAE1D;;;;;;;;;;GAUG;AAEI,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IACD;IAA7B,YAA6B,QAA2B;QAA3B,aAAQ,GAAR,QAAQ,CAAmB;IAAG,CAAC;IAE5D,SAAS,CAAC,KAAc;QACtB,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACxC,MAAM,IAAI,2BAAkB,CAAC,gCAAgC,OAAO,KAAK,EAAE,CAAC,CAAC;QAC/E,CAAC;QACD,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,2BAAkB,
|
|
1
|
+
{"version":3,"file":"json-event-serializer.js","sourceRoot":"","sources":["../../src/serialization/json-event-serializer.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAE5C,4CAA2E;AAG3E,+DAA0D;AAE1D;;;;;;;;;;GAUG;AAEI,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IACD;IAA7B,YAA6B,QAA2B;QAA3B,aAAQ,GAAR,QAAQ,CAAmB;IAAG,CAAC;IAE5D,SAAS,CAAC,KAAc;QACtB,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACxC,MAAM,IAAI,2BAAkB,CAAC,gCAAgC,OAAO,KAAK,EAAE,CAAC,CAAC;QAC/E,CAAC;QACD,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,2BAAkB,CAAC,8BAA+B,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACvF,CAAC;IACH,CAAC;IAED,WAAW,CAAC,UAAkB,EAAE,SAAiB;QAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAEhD,IAAI,IAAa,CAAC;QAClB,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,6BAAoB,CAC5B,gCAAgC,SAAS,MAAO,GAAa,CAAC,OAAO,EAAE,CACxE,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,SAAS,GAAW,UAAU,CAAC,SAAmB,CAAC;QACzD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAW,EAAE,IAAI,CAAC,CAAC;IACjE,CAAC;CACF,CAAA;AAjCY,kDAAmB;8BAAnB,mBAAmB;IAD/B,IAAA,mBAAU,GAAE;qCAE4B,uCAAiB;GAD7C,mBAAmB,CAiC/B"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default drain budget for the outbox background workers, in
|
|
3
|
+
* milliseconds.
|
|
4
|
+
*
|
|
5
|
+
* Sized against platform grace periods rather than against any
|
|
6
|
+
* particular listener: Kubernetes' `terminationGracePeriodSeconds`
|
|
7
|
+
* defaults to 30s, and the rest of the shutdown path (closing the
|
|
8
|
+
* connection pool, flushing logs) needs room after the drain. 10s
|
|
9
|
+
* leaves that margin.
|
|
10
|
+
*/
|
|
11
|
+
export declare const DEFAULT_DRAIN_TIMEOUT_MS = 10000;
|
|
12
|
+
/**
|
|
13
|
+
* Await `inFlight`, giving up after `timeoutMs`.
|
|
14
|
+
*
|
|
15
|
+
* Resolves `true` when the work finished within the budget and `false`
|
|
16
|
+
* when the budget ran out first. A `timeoutMs` of `0` means "do not
|
|
17
|
+
* wait at all" and reports `false` without awaiting anything.
|
|
18
|
+
*
|
|
19
|
+
* The abandoned work is NOT cancelled — there is no safe way to
|
|
20
|
+
* interrupt a half-finished listener invocation or SQL statement. The
|
|
21
|
+
* caller's contract is weaker and deliberately so: shutdown proceeds,
|
|
22
|
+
* and whatever was left mid-flight is recovered on the next boot by
|
|
23
|
+
* the staleness monitor / startup recovery. Blocking shutdown
|
|
24
|
+
* indefinitely on user code would be the worse failure — a deployment
|
|
25
|
+
* that never completes.
|
|
26
|
+
*
|
|
27
|
+
* Never rejects: both the processor's `processBatch` and the monitor's
|
|
28
|
+
* `checkStaleness` already swallow their own failures, and a drain that
|
|
29
|
+
* threw would turn an orderly shutdown into an unhandled rejection.
|
|
30
|
+
*/
|
|
31
|
+
export declare function drainWithTimeout(inFlight: Promise<unknown>, timeoutMs: number): Promise<boolean>;
|
|
32
|
+
//# sourceMappingURL=drain.d.ts.map
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_DRAIN_TIMEOUT_MS = void 0;
|
|
4
|
+
exports.drainWithTimeout = drainWithTimeout;
|
|
5
|
+
/**
|
|
6
|
+
* Default drain budget for the outbox background workers, in
|
|
7
|
+
* milliseconds.
|
|
8
|
+
*
|
|
9
|
+
* Sized against platform grace periods rather than against any
|
|
10
|
+
* particular listener: Kubernetes' `terminationGracePeriodSeconds`
|
|
11
|
+
* defaults to 30s, and the rest of the shutdown path (closing the
|
|
12
|
+
* connection pool, flushing logs) needs room after the drain. 10s
|
|
13
|
+
* leaves that margin.
|
|
14
|
+
*/
|
|
15
|
+
exports.DEFAULT_DRAIN_TIMEOUT_MS = 10_000;
|
|
16
|
+
/**
|
|
17
|
+
* Await `inFlight`, giving up after `timeoutMs`.
|
|
18
|
+
*
|
|
19
|
+
* Resolves `true` when the work finished within the budget and `false`
|
|
20
|
+
* when the budget ran out first. A `timeoutMs` of `0` means "do not
|
|
21
|
+
* wait at all" and reports `false` without awaiting anything.
|
|
22
|
+
*
|
|
23
|
+
* The abandoned work is NOT cancelled — there is no safe way to
|
|
24
|
+
* interrupt a half-finished listener invocation or SQL statement. The
|
|
25
|
+
* caller's contract is weaker and deliberately so: shutdown proceeds,
|
|
26
|
+
* and whatever was left mid-flight is recovered on the next boot by
|
|
27
|
+
* the staleness monitor / startup recovery. Blocking shutdown
|
|
28
|
+
* indefinitely on user code would be the worse failure — a deployment
|
|
29
|
+
* that never completes.
|
|
30
|
+
*
|
|
31
|
+
* Never rejects: both the processor's `processBatch` and the monitor's
|
|
32
|
+
* `checkStaleness` already swallow their own failures, and a drain that
|
|
33
|
+
* threw would turn an orderly shutdown into an unhandled rejection.
|
|
34
|
+
*/
|
|
35
|
+
async function drainWithTimeout(inFlight, timeoutMs) {
|
|
36
|
+
if (timeoutMs <= 0) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
let timer;
|
|
40
|
+
const expired = new Promise((resolve) => {
|
|
41
|
+
timer = setTimeout(() => resolve(false), timeoutMs);
|
|
42
|
+
// Do not hold the event loop open purely to police the deadline —
|
|
43
|
+
// if everything else has finished, the process should be free to
|
|
44
|
+
// exit.
|
|
45
|
+
timer.unref?.();
|
|
46
|
+
});
|
|
47
|
+
try {
|
|
48
|
+
return await Promise.race([inFlight.then(() => true), expired]);
|
|
49
|
+
}
|
|
50
|
+
finally {
|
|
51
|
+
if (timer !== undefined) {
|
|
52
|
+
clearTimeout(timer);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=drain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drain.js","sourceRoot":"","sources":["../../src/shutdown/drain.ts"],"names":[],"mappings":";;;AA+BA,4CAwBC;AAvDD;;;;;;;;;GASG;AACU,QAAA,wBAAwB,GAAG,MAAM,CAAC;AAE/C;;;;;;;;;;;;;;;;;;GAkBG;AACI,KAAK,UAAU,gBAAgB,CACpC,QAA0B,EAC1B,SAAiB;IAEjB,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,KAAiC,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAQ,CAAC,OAAO,EAAE,EAAE;QAC7C,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC;QACpD,kEAAkE;QAClE,iEAAiE;QACjE,QAAQ;QACR,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IAClE,CAAC;YAAS,CAAC;QACT,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -110,8 +110,7 @@ let InMemoryEventPublicationRepository = class InMemoryEventPublicationRepositor
|
|
|
110
110
|
}
|
|
111
111
|
async findReadyForProcessing(limit) {
|
|
112
112
|
return Array.from(this.publications.values())
|
|
113
|
-
.filter((p) => p.status === publication_status_1.PublicationStatus.PUBLISHED ||
|
|
114
|
-
p.status === publication_status_1.PublicationStatus.RESUBMITTED)
|
|
113
|
+
.filter((p) => p.status === publication_status_1.PublicationStatus.PUBLISHED || p.status === publication_status_1.PublicationStatus.RESUBMITTED)
|
|
115
114
|
.slice(0, limit);
|
|
116
115
|
}
|
|
117
116
|
async findStale(beforeDate, statuses) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"in-memory-repository.js","sourceRoot":"","sources":["../../src/testing/in-memory-repository.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA;;;;;GAKG;AACH,6CAAyC;AAEzC,2CAAsD;AACtD,qDAA8F;AAQ9F,4CAA2D;AAE3D,oEAAgE;
|
|
1
|
+
{"version":3,"file":"in-memory-repository.js","sourceRoot":"","sources":["../../src/testing/in-memory-repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -91,7 +91,10 @@ class PublishedEventsView {
|
|
|
91
91
|
const predicate = argCount > 1
|
|
92
92
|
? (event) => fnOrGetter(event) === expected
|
|
93
93
|
: fnOrGetter;
|
|
94
|
-
return new PublishedEventsView(this.fetchAll, this.serializer, this.eventType, [
|
|
94
|
+
return new PublishedEventsView(this.fetchAll, this.serializer, this.eventType, [
|
|
95
|
+
...this.predicates,
|
|
96
|
+
predicate,
|
|
97
|
+
]);
|
|
95
98
|
}
|
|
96
99
|
/** Number of matching events. Materialises the view. */
|
|
97
100
|
async count() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"published-events.js","sourceRoot":"","sources":["../../src/testing/published-events.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA+D;AAE/D,6FAGoD;AACpD,wEAA2F;AAG3F;;;;;;;;;;;GAWG;AAEI,IAAM,eAAe,GAArB,MAAM,eAAe;IAGP;IAEA;IAJnB,YAEmB,UAAsC,EAEtC,UAA2B;QAF3B,eAAU,GAAV,UAAU,CAA4B;QAEtC,eAAU,GAAV,UAAU,CAAiB;IAC3C,CAAC;IAEJ;;;;;OAKG;IACH,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"published-events.js","sourceRoot":"","sources":["../../src/testing/published-events.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-utils.js","sourceRoot":"","sources":["../../src/tokens/token-utils.ts"],"names":[],"mappings":";;AAmBA,
|
|
1
|
+
{"version":3,"file":"token-utils.js","sourceRoot":"","sources":["../../src/tokens/token-utils.ts"],"names":[],"mappings":";;AAmBA,0DAEC;AAQD,8DAEC;AAMD,4EAIC;AAOD,8EAIC;AAQD,wEAIC;AAKD,0EAIC;AAOD,gFAIC;AAQD,8DAEC;AASD,sEAIC;AA3GD,qDAAsE;AAEtE;;;;;;;;;;GAUG;AAEH;;;;GAIG;AACH,SAAgB,uBAAuB,CAAC,aAAqB,+BAAwB;IACnF,OAAO,GAAG,UAAU,sBAAsB,CAAC;AAC7C,CAAC;AAED;;;;;GAKG;AACH,SAAgB,yBAAyB,CAAC,aAAqB,+BAAwB;IACrF,OAAO,GAAG,UAAU,mBAAmB,CAAC;AAC1C,CAAC;AAED;;;GAGG;AACH,SAAgB,gCAAgC,CAC9C,aAAqB,+BAAwB;IAE7C,OAAO,GAAG,UAAU,0BAA0B,CAAC;AACjD,CAAC;AAED;;;;GAIG;AACH,SAAgB,iCAAiC,CAC/C,aAAqB,+BAAwB;IAE7C,OAAO,GAAG,UAAU,2BAA2B,CAAC;AAClD,CAAC;AAED;;;;;GAKG;AACH,SAAgB,8BAA8B,CAC5C,aAAqB,+BAAwB;IAE7C,OAAO,GAAG,UAAU,wBAAwB,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,SAAgB,+BAA+B,CAC7C,aAAqB,+BAAwB;IAE7C,OAAO,GAAG,UAAU,yBAAyB,CAAC;AAChD,CAAC;AAED;;;;GAIG;AACH,SAAgB,kCAAkC,CAChD,aAAqB,+BAAwB;IAE7C,OAAO,GAAG,UAAU,4BAA4B,CAAC;AACnD,CAAC;AAED;;;;;GAKG;AACH,SAAgB,yBAAyB,CAAC,aAAqB,+BAAwB;IACrF,OAAO,GAAG,UAAU,mBAAmB,CAAC;AAC1C,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,6BAA6B,CAC3C,aAAqB,+BAAwB;IAE7C,OAAO,GAAG,UAAU,uBAAuB,CAAC;AAC9C,CAAC"}
|
|
@@ -11,25 +11,21 @@ export type ResubmissionFilter = (publication: EventPublication) => boolean;
|
|
|
11
11
|
* ```ts
|
|
12
12
|
* ResubmissionOptions.defaults()
|
|
13
13
|
* .withBatchSize(50)
|
|
14
|
-
* .withMaxInFlight(5)
|
|
15
14
|
* .withMinAge(10_000)
|
|
16
15
|
* .withMaxAttempts(3);
|
|
17
16
|
* ```
|
|
18
17
|
*/
|
|
19
18
|
export declare class ResubmissionOptions {
|
|
20
19
|
private _batchSize;
|
|
21
|
-
private _maxInFlight;
|
|
22
20
|
private _minAge;
|
|
23
21
|
private _maxCompletionAttempts;
|
|
24
22
|
private _filter;
|
|
25
23
|
static defaults(): ResubmissionOptions;
|
|
26
24
|
withBatchSize(size: number): this;
|
|
27
|
-
withMaxInFlight(n: number): this;
|
|
28
25
|
withMinAge(ms: number): this;
|
|
29
26
|
withMaxAttempts(n: number): this;
|
|
30
27
|
withFilter(filter: ResubmissionFilter): this;
|
|
31
28
|
get batchSize(): number;
|
|
32
|
-
get maxInFlight(): number;
|
|
33
29
|
get minAge(): number;
|
|
34
30
|
get maxCompletionAttempts(): number | null;
|
|
35
31
|
get filter(): ResubmissionFilter | null;
|
|
@@ -8,14 +8,12 @@ exports.ResubmissionOptions = void 0;
|
|
|
8
8
|
* ```ts
|
|
9
9
|
* ResubmissionOptions.defaults()
|
|
10
10
|
* .withBatchSize(50)
|
|
11
|
-
* .withMaxInFlight(5)
|
|
12
11
|
* .withMinAge(10_000)
|
|
13
12
|
* .withMaxAttempts(3);
|
|
14
13
|
* ```
|
|
15
14
|
*/
|
|
16
15
|
class ResubmissionOptions {
|
|
17
16
|
_batchSize = 100;
|
|
18
|
-
_maxInFlight = 10;
|
|
19
17
|
_minAge = 0;
|
|
20
18
|
_maxCompletionAttempts = null;
|
|
21
19
|
_filter = null;
|
|
@@ -26,10 +24,6 @@ class ResubmissionOptions {
|
|
|
26
24
|
this._batchSize = size;
|
|
27
25
|
return this;
|
|
28
26
|
}
|
|
29
|
-
withMaxInFlight(n) {
|
|
30
|
-
this._maxInFlight = n;
|
|
31
|
-
return this;
|
|
32
|
-
}
|
|
33
27
|
withMinAge(ms) {
|
|
34
28
|
this._minAge = ms;
|
|
35
29
|
return this;
|
|
@@ -45,9 +39,6 @@ class ResubmissionOptions {
|
|
|
45
39
|
get batchSize() {
|
|
46
40
|
return this._batchSize;
|
|
47
41
|
}
|
|
48
|
-
get maxInFlight() {
|
|
49
|
-
return this._maxInFlight;
|
|
50
|
-
}
|
|
51
42
|
get minAge() {
|
|
52
43
|
return this._minAge;
|
|
53
44
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resubmission-options.js","sourceRoot":"","sources":["../../src/types/resubmission-options.ts"],"names":[],"mappings":";;;AAQA
|
|
1
|
+
{"version":3,"file":"resubmission-options.js","sourceRoot":"","sources":["../../src/types/resubmission-options.ts"],"names":[],"mappings":";;;AAQA;;;;;;;;;;GAUG;AACH,MAAa,mBAAmB;IACtB,UAAU,GAAG,GAAG,CAAC;IACjB,OAAO,GAAG,CAAC,CAAC;IACZ,sBAAsB,GAAkB,IAAI,CAAC;IAC7C,OAAO,GAA8B,IAAI,CAAC;IAElD,MAAM,CAAC,QAAQ;QACb,OAAO,IAAI,mBAAmB,EAAE,CAAC;IACnC,CAAC;IAED,aAAa,CAAC,IAAY;QACxB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,UAAU,CAAC,EAAU;QACnB,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,eAAe,CAAC,CAAS;QACvB,IAAI,CAAC,sBAAsB,GAAG,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,UAAU,CAAC,MAA0B;QACnC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,IAAI,qBAAqB;QACvB,OAAO,IAAI,CAAC,sBAAsB,CAAC;IACrC,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;CACF;AA7CD,kDA6CC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Policy for automatically resubmitting `FAILED` publications
|
|
3
|
+
* (see DD-026).
|
|
4
|
+
*
|
|
5
|
+
* Disabled unless you ask for it: `maxAttempts: 0` means no automatic
|
|
6
|
+
* retry and the scheduler never even schedules its timer, following the
|
|
7
|
+
* same "0 disables" convention as `StalenessConfig`. Recovery then stays
|
|
8
|
+
* what it has always been — an operator (or your own scheduled job)
|
|
9
|
+
* calling `FailedEventPublications.resubmit(...)`.
|
|
10
|
+
*/
|
|
11
|
+
export interface OutboxRetryConfig {
|
|
12
|
+
/**
|
|
13
|
+
* Total attempts a publication gets, counting the first one. `3` means
|
|
14
|
+
* the original delivery plus two automatic retries. `0` disables
|
|
15
|
+
* automatic retry entirely; `1` enables the scheduler but retries
|
|
16
|
+
* nothing, since a `FAILED` publication has already used its single
|
|
17
|
+
* attempt.
|
|
18
|
+
*
|
|
19
|
+
* A publication that exhausts its attempts stays `FAILED` — no
|
|
20
|
+
* separate terminal state (DD-026). It remains visible through
|
|
21
|
+
* `FailedEventPublications.findAll(...)` and an operator can still
|
|
22
|
+
* resubmit it by hand; the cap bounds the automatic path only.
|
|
23
|
+
*/
|
|
24
|
+
readonly maxAttempts: number;
|
|
25
|
+
/** How often (ms) the scheduler looks for retry-eligible publications. */
|
|
26
|
+
readonly interval: number;
|
|
27
|
+
/** Delay (ms) before the first retry. */
|
|
28
|
+
readonly baseDelay: number;
|
|
29
|
+
/** Multiplier applied per attempt: `baseDelay * factor^(attempts - 1)`. */
|
|
30
|
+
readonly factor: number;
|
|
31
|
+
/** Ceiling (ms) for the computed delay, so the curve cannot run away. */
|
|
32
|
+
readonly maxDelay: number;
|
|
33
|
+
/**
|
|
34
|
+
* Fraction of the computed delay (`0`–`1`) to spread retries over.
|
|
35
|
+
* `0.2` shortens or lengthens each publication's window by up to 20%
|
|
36
|
+
* at random, so a mass failure does not produce a synchronised retry
|
|
37
|
+
* burst once the downstream recovers. `0` makes eligibility exactly
|
|
38
|
+
* reproducible.
|
|
39
|
+
*/
|
|
40
|
+
readonly jitter: number;
|
|
41
|
+
/** Maximum publications resubmitted per pass. */
|
|
42
|
+
readonly batchSize: number;
|
|
43
|
+
/**
|
|
44
|
+
* How long (ms) `stop()` waits for an in-flight pass to finish before
|
|
45
|
+
* abandoning it. `0` disables the wait.
|
|
46
|
+
*/
|
|
47
|
+
readonly shutdownTimeout: number;
|
|
48
|
+
}
|
|
49
|
+
/** Automatic retry off; every other value is the curve it would use if switched on. */
|
|
50
|
+
export declare const DEFAULT_RETRY_CONFIG: OutboxRetryConfig;
|
|
51
|
+
//# sourceMappingURL=retry-config.d.ts.map
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_RETRY_CONFIG = void 0;
|
|
4
|
+
const drain_1 = require("../shutdown/drain");
|
|
5
|
+
/** Automatic retry off; every other value is the curve it would use if switched on. */
|
|
6
|
+
exports.DEFAULT_RETRY_CONFIG = {
|
|
7
|
+
maxAttempts: 0,
|
|
8
|
+
interval: 60_000,
|
|
9
|
+
baseDelay: 1_000,
|
|
10
|
+
factor: 2,
|
|
11
|
+
maxDelay: 300_000,
|
|
12
|
+
jitter: 0.2,
|
|
13
|
+
batchSize: 100,
|
|
14
|
+
shutdownTimeout: drain_1.DEFAULT_DRAIN_TIMEOUT_MS,
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=retry-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-config.js","sourceRoot":"","sources":["../../src/types/retry-config.ts"],"names":[],"mappings":";;;AAAA,6CAA6D;AAmD7D,uFAAuF;AAC1E,QAAA,oBAAoB,GAAsB;IACrD,WAAW,EAAE,CAAC;IACd,QAAQ,EAAE,MAAM;IAChB,SAAS,EAAE,KAAK;IAChB,MAAM,EAAE,CAAC;IACT,QAAQ,EAAE,OAAO;IACjB,MAAM,EAAE,GAAG;IACX,SAAS,EAAE,GAAG;IACd,eAAe,EAAE,gCAAwB;CAC1C,CAAC"}
|
|
@@ -13,6 +13,14 @@ export interface StalenessConfig {
|
|
|
13
13
|
readonly resubmitted: number;
|
|
14
14
|
/** How often (ms) the staleness monitor runs. Defaults to 60000 (1 minute). */
|
|
15
15
|
readonly monitorInterval: number;
|
|
16
|
+
/**
|
|
17
|
+
* How long (ms) `stop()` waits for an in-flight staleness sweep to
|
|
18
|
+
* finish before abandoning it. A sweep is framework-controlled
|
|
19
|
+
* database work rather than user code, so it normally completes well
|
|
20
|
+
* inside the budget; the bound exists so a hung query cannot stall
|
|
21
|
+
* shutdown. `0` disables the wait entirely.
|
|
22
|
+
*/
|
|
23
|
+
readonly shutdownTimeout: number;
|
|
16
24
|
}
|
|
17
25
|
export declare const DEFAULT_STALENESS_CONFIG: StalenessConfig;
|
|
18
26
|
//# sourceMappingURL=staleness-config.d.ts.map
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.DEFAULT_STALENESS_CONFIG = void 0;
|
|
4
|
+
const drain_1 = require("../shutdown/drain");
|
|
4
5
|
exports.DEFAULT_STALENESS_CONFIG = {
|
|
5
6
|
published: 0,
|
|
6
7
|
processing: 0,
|
|
7
8
|
resubmitted: 0,
|
|
8
9
|
monitorInterval: 60_000,
|
|
10
|
+
shutdownTimeout: drain_1.DEFAULT_DRAIN_TIMEOUT_MS,
|
|
9
11
|
};
|
|
10
12
|
//# sourceMappingURL=staleness-config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"staleness-config.js","sourceRoot":"","sources":["../../src/types/staleness-config.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"staleness-config.js","sourceRoot":"","sources":["../../src/types/staleness-config.ts"],"names":[],"mappings":";;;AAAA,6CAA6D;AA2BhD,QAAA,wBAAwB,GAAoB;IACvD,SAAS,EAAE,CAAC;IACZ,UAAU,EAAE,CAAC;IACb,WAAW,EAAE,CAAC;IACd,eAAe,EAAE,MAAM;IACvB,eAAe,EAAE,gCAAwB;CAC1C,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nestjs-transactional/outbox",
|
|
3
|
-
"version": "1.0.0
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "Persistent Event Publication Registry for @nestjs-transactional — Spring Modulith equivalent (ORM-agnostic core)",
|
|
5
5
|
"license": "MIT",
|
|
6
|
+
"type": "commonjs",
|
|
7
|
+
"sideEffects": false,
|
|
6
8
|
"author": "Igor Golovanov",
|
|
7
9
|
"repository": {
|
|
8
10
|
"type": "git",
|
|
9
|
-
"url": "https://github.com/igorgolovanov/nestjs-transactional.git",
|
|
11
|
+
"url": "git+https://github.com/igorgolovanov/nestjs-transactional.git",
|
|
10
12
|
"directory": "packages/outbox"
|
|
11
13
|
},
|
|
12
14
|
"bugs": {
|
|
@@ -42,9 +44,15 @@
|
|
|
42
44
|
"default": "./dist/testing/index.js"
|
|
43
45
|
}
|
|
44
46
|
},
|
|
47
|
+
"typesVersions": {
|
|
48
|
+
"*": {
|
|
49
|
+
"testing": [
|
|
50
|
+
"./dist/testing/index.d.ts"
|
|
51
|
+
]
|
|
52
|
+
}
|
|
53
|
+
},
|
|
45
54
|
"publishConfig": {
|
|
46
55
|
"access": "public",
|
|
47
|
-
"tag": "alpha",
|
|
48
56
|
"provenance": true
|
|
49
57
|
},
|
|
50
58
|
"peerDependencies": {
|
|
@@ -52,7 +60,7 @@
|
|
|
52
60
|
"@nestjs/core": "^10.0.0 || ^11.0.0",
|
|
53
61
|
"reflect-metadata": "^0.1.13 || ^0.2.0",
|
|
54
62
|
"rxjs": "^7.0.0",
|
|
55
|
-
"@nestjs-transactional/core": "^1.0.0
|
|
63
|
+
"@nestjs-transactional/core": "^1.0.0"
|
|
56
64
|
},
|
|
57
65
|
"devDependencies": {
|
|
58
66
|
"@nestjs/common": "^11.0.0",
|
|
@@ -64,7 +72,7 @@
|
|
|
64
72
|
"rxjs": "^7.8.1",
|
|
65
73
|
"ts-jest": "^29.2.5",
|
|
66
74
|
"typescript": "^5.5.4",
|
|
67
|
-
"@nestjs-transactional/core": "1.0.0
|
|
75
|
+
"@nestjs-transactional/core": "1.0.0"
|
|
68
76
|
},
|
|
69
77
|
"scripts": {
|
|
70
78
|
"build": "tsc -p tsconfig.build.json",
|
|
@@ -73,6 +81,9 @@
|
|
|
73
81
|
"test:watch": "jest --watch",
|
|
74
82
|
"test:cov": "jest --coverage",
|
|
75
83
|
"type-check": "tsc --noEmit",
|
|
76
|
-
"lint": "eslint \"src/**/*.ts\""
|
|
84
|
+
"lint": "eslint \"src/**/*.ts\"",
|
|
85
|
+
"api:check": "api-extractor run && api-extractor run -c api-extractor.testing.json",
|
|
86
|
+
"api:update": "api-extractor run --local && api-extractor run --local -c api-extractor.testing.json",
|
|
87
|
+
"publish:check": "publint && attw --pack ."
|
|
77
88
|
}
|
|
78
89
|
}
|