@nestjs-transactional/outbox 1.0.0 → 2.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 +38 -5
- package/dist/api/completed-event-publications.d.ts +2 -2
- package/dist/api/completed-event-publications.js +6 -9
- package/dist/api/completed-event-publications.js.map +1 -1
- package/dist/api/failed-event-publications.d.ts +3 -3
- package/dist/api/failed-event-publications.js +10 -13
- package/dist/api/failed-event-publications.js.map +1 -1
- package/dist/api/incomplete-event-publications.d.ts +3 -3
- package/dist/api/incomplete-event-publications.js +11 -14
- package/dist/api/incomplete-event-publications.js.map +1 -1
- package/dist/decorators/inject-decorators.js +12 -24
- package/dist/decorators/inject-decorators.js.map +1 -1
- package/dist/decorators/outbox-events-handler.decorator.js +6 -11
- package/dist/decorators/outbox-events-handler.decorator.js.map +1 -1
- package/dist/dispatcher/data-source-outbox-publisher.d.ts +2 -2
- package/dist/dispatcher/data-source-outbox-publisher.js +7 -11
- package/dist/dispatcher/data-source-outbox-publisher.js.map +1 -1
- package/dist/dispatcher/event-publication-processor.d.ts +5 -5
- package/dist/dispatcher/event-publication-processor.js +18 -21
- package/dist/dispatcher/event-publication-processor.js.map +1 -1
- package/dist/dispatcher/outbox-event-publisher.js +16 -19
- package/dist/dispatcher/outbox-event-publisher.js.map +1 -1
- package/dist/dispatcher/processor-options.d.ts +1 -1
- package/dist/dispatcher/processor-options.js +5 -8
- package/dist/dispatcher/processor-options.js.map +1 -1
- package/dist/externalization/describe-thrown.d.ts +20 -0
- package/dist/externalization/describe-thrown.js +46 -0
- package/dist/externalization/describe-thrown.js.map +1 -0
- package/dist/externalization/errors.d.ts +1 -1
- package/dist/externalization/errors.js +2 -6
- package/dist/externalization/errors.js.map +1 -1
- package/dist/externalization/event-externalizer.d.ts +1 -1
- package/dist/externalization/event-externalizer.js +1 -4
- package/dist/externalization/event-externalizer.js.map +1 -1
- package/dist/externalization/externalization-registry.d.ts +3 -3
- package/dist/externalization/externalization-registry.js +10 -13
- package/dist/externalization/externalization-registry.js.map +1 -1
- package/dist/externalization/externalized.decorator.js +6 -11
- package/dist/externalization/externalized.decorator.js.map +1 -1
- package/dist/externalization/types.js +1 -2
- package/dist/index.d.ts +43 -40
- package/dist/index.js +41 -61
- package/dist/index.js.map +1 -1
- package/dist/interfaces/outbox-event-handler.interface.js +1 -2
- package/dist/module/outbox-processing.module.d.ts +1 -1
- package/dist/module/outbox-processing.module.js +12 -9
- package/dist/module/outbox-processing.module.js.map +1 -1
- package/dist/module/outbox.module.d.ts +15 -8
- package/dist/module/outbox.module.js +179 -145
- package/dist/module/outbox.module.js.map +1 -1
- package/dist/recovery/outbox-cleanup-scheduler.d.ts +56 -0
- package/dist/recovery/outbox-cleanup-scheduler.js +136 -0
- package/dist/recovery/outbox-cleanup-scheduler.js.map +1 -0
- package/dist/recovery/outbox-retry-scheduler.d.ts +2 -2
- package/dist/recovery/outbox-retry-scheduler.js +11 -14
- package/dist/recovery/outbox-retry-scheduler.js.map +1 -1
- package/dist/recovery/staleness-monitor.d.ts +2 -2
- package/dist/recovery/staleness-monitor.js +14 -17
- package/dist/recovery/staleness-monitor.js.map +1 -1
- package/dist/recovery/startup-recovery.d.ts +1 -1
- package/dist/recovery/startup-recovery.js +11 -14
- package/dist/recovery/startup-recovery.js.map +1 -1
- package/dist/registry/event-publication-registry.d.ts +4 -4
- package/dist/registry/event-publication-registry.js +17 -20
- package/dist/registry/event-publication-registry.js.map +1 -1
- package/dist/registry/listener-registry.js +6 -9
- package/dist/registry/listener-registry.js.map +1 -1
- package/dist/registry/multi-ds-listener-registrar.d.ts +1 -1
- package/dist/registry/multi-ds-listener-registrar.js +15 -18
- 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 +23 -27
- package/dist/registry/outbox-listener-scanner.js.map +1 -1
- package/dist/repository/event-publication-repository.d.ts +14 -3
- package/dist/repository/event-publication-repository.js +1 -4
- package/dist/repository/event-publication-repository.js.map +1 -1
- package/dist/serialization/event-serializer.js +1 -4
- package/dist/serialization/event-serializer.js.map +1 -1
- package/dist/serialization/event-type-registry.js +5 -8
- package/dist/serialization/event-type-registry.js.map +1 -1
- package/dist/serialization/event-type-resolver.d.ts +1 -1
- package/dist/serialization/event-type-resolver.js +4 -7
- package/dist/serialization/event-type-resolver.js.map +1 -1
- package/dist/serialization/json-event-serializer.d.ts +2 -2
- package/dist/serialization/json-event-serializer.js +10 -13
- package/dist/serialization/json-event-serializer.js.map +1 -1
- package/dist/shutdown/drain.js +2 -6
- package/dist/shutdown/drain.js.map +1 -1
- package/dist/testing/assertable-published-events.d.ts +1 -1
- package/dist/testing/assertable-published-events.js +8 -13
- package/dist/testing/assertable-published-events.js.map +1 -1
- package/dist/testing/in-memory-repository.d.ts +3 -3
- package/dist/testing/in-memory-repository.js +32 -25
- package/dist/testing/in-memory-repository.js.map +1 -1
- package/dist/testing/index.d.ts +3 -3
- package/dist/testing/index.js +3 -19
- package/dist/testing/index.js.map +1 -1
- package/dist/testing/published-events.d.ts +3 -3
- package/dist/testing/published-events.js +11 -14
- package/dist/testing/published-events.js.map +1 -1
- package/dist/tokens/index.d.ts +1 -1
- package/dist/tokens/index.js +1 -13
- package/dist/tokens/index.js.map +1 -1
- package/dist/tokens/token-utils.js +10 -21
- package/dist/tokens/token-utils.js.map +1 -1
- package/dist/types/cleanup-config.d.ts +59 -0
- package/dist/types/cleanup-config.js +14 -0
- package/dist/types/cleanup-config.js.map +1 -0
- package/dist/types/completion-mode.js +2 -5
- package/dist/types/completion-mode.js.map +1 -1
- package/dist/types/errors.d.ts +1 -1
- package/dist/types/errors.js +7 -16
- package/dist/types/errors.js.map +1 -1
- package/dist/types/event-publication.d.ts +1 -1
- package/dist/types/event-publication.js +1 -2
- package/dist/types/publication-status.js +2 -5
- package/dist/types/publication-status.js.map +1 -1
- package/dist/types/resubmission-options.d.ts +1 -1
- package/dist/types/resubmission-options.js +1 -5
- package/dist/types/resubmission-options.js.map +1 -1
- package/dist/types/retry-config.js +3 -6
- package/dist/types/retry-config.js.map +1 -1
- package/dist/types/staleness-config.js +3 -6
- package/dist/types/staleness-config.js.map +1 -1
- package/package.json +21 -19
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
2
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
3
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
@@ -11,13 +10,11 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
11
10
|
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
11
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
12
|
};
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const completion_mode_1 = require("../types/completion-mode");
|
|
20
|
-
const publication_status_1 = require("../types/publication-status");
|
|
13
|
+
import { Inject, Injectable } from '@nestjs/common';
|
|
14
|
+
import { EVENT_PUBLICATION_REPOSITORY } from '../repository/event-publication-repository.js';
|
|
15
|
+
import { EVENT_SERIALIZER } from '../serialization/event-serializer.js';
|
|
16
|
+
import { CompletionMode } from '../types/completion-mode.js';
|
|
17
|
+
import { PublicationStatus } from '../types/publication-status.js';
|
|
21
18
|
/**
|
|
22
19
|
* Central service that coordinates the event publication lifecycle.
|
|
23
20
|
*
|
|
@@ -80,17 +77,17 @@ let EventPublicationRegistry = class EventPublicationRegistry {
|
|
|
80
77
|
* - `DELETE`: delete the row outright;
|
|
81
78
|
* - `ARCHIVE`: move the row to the archive table (impl-specific).
|
|
82
79
|
*/
|
|
83
|
-
async markCompleted(publicationId, mode =
|
|
80
|
+
async markCompleted(publicationId, mode = CompletionMode.UPDATE) {
|
|
84
81
|
switch (mode) {
|
|
85
|
-
case
|
|
86
|
-
await this.repository.updateStatus(publicationId,
|
|
82
|
+
case CompletionMode.UPDATE:
|
|
83
|
+
await this.repository.updateStatus(publicationId, PublicationStatus.COMPLETED, {
|
|
87
84
|
completionDate: new Date(),
|
|
88
85
|
});
|
|
89
86
|
return;
|
|
90
|
-
case
|
|
87
|
+
case CompletionMode.DELETE:
|
|
91
88
|
await this.repository.delete(publicationId);
|
|
92
89
|
return;
|
|
93
|
-
case
|
|
90
|
+
case CompletionMode.ARCHIVE:
|
|
94
91
|
await this.repository.archiveCompleted(publicationId);
|
|
95
92
|
return;
|
|
96
93
|
}
|
|
@@ -100,7 +97,7 @@ let EventPublicationRegistry = class EventPublicationRegistry {
|
|
|
100
97
|
* operators can triage.
|
|
101
98
|
*/
|
|
102
99
|
async markFailed(publicationId, reason) {
|
|
103
|
-
await this.repository.updateStatus(publicationId,
|
|
100
|
+
await this.repository.updateStatus(publicationId, PublicationStatus.FAILED, {
|
|
104
101
|
failureReason: reason,
|
|
105
102
|
});
|
|
106
103
|
}
|
|
@@ -109,7 +106,7 @@ let EventPublicationRegistry = class EventPublicationRegistry {
|
|
|
109
106
|
* Stamps `lastResubmissionDate` with the current time.
|
|
110
107
|
*/
|
|
111
108
|
async markResubmitted(publicationId) {
|
|
112
|
-
await this.repository.updateStatus(publicationId,
|
|
109
|
+
await this.repository.updateStatus(publicationId, PublicationStatus.RESUBMITTED, {
|
|
113
110
|
lastResubmissionDate: new Date(),
|
|
114
111
|
});
|
|
115
112
|
}
|
|
@@ -128,11 +125,11 @@ let EventPublicationRegistry = class EventPublicationRegistry {
|
|
|
128
125
|
return this.repository.findReadyForProcessing(limit);
|
|
129
126
|
}
|
|
130
127
|
};
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
(0,
|
|
134
|
-
__param(
|
|
135
|
-
__param(1, (0, common_1.Inject)(event_serializer_1.EVENT_SERIALIZER)),
|
|
128
|
+
EventPublicationRegistry = __decorate([
|
|
129
|
+
Injectable(),
|
|
130
|
+
__param(0, Inject(EVENT_PUBLICATION_REPOSITORY)),
|
|
131
|
+
__param(1, Inject(EVENT_SERIALIZER)),
|
|
136
132
|
__metadata("design:paramtypes", [Object, Object])
|
|
137
133
|
], EventPublicationRegistry);
|
|
134
|
+
export { EventPublicationRegistry };
|
|
138
135
|
//# sourceMappingURL=event-publication-registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-publication-registry.js","sourceRoot":"","sources":["../../src/registry/event-publication-registry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"event-publication-registry.js","sourceRoot":"","sources":["../../src/registry/event-publication-registry.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEpD,OAAO,EAAE,4BAA4B,EAAE,MAAM,+CAA+C,CAAC;AAE7F,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAExE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAEnE;;;;;;;;;;;;;GAaG;AAEI,IAAM,wBAAwB,GAA9B,MAAM,wBAAwB;IAGhB;IAEA;IAJnB,YAEmB,UAAsC,EAEtC,UAA2B;QAF3B,eAAU,GAAV,UAAU,CAA4B;QAEtC,eAAU,GAAV,UAAU,CAAiB;IAC3C,CAAC;IAEJ;;;;;;;;;OASG;IACH,KAAK,CAAC,OAAO,CAAC,KAAc,EAAE,WAA8B;QAC1D,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,oEAAoE;QACpE,kEAAkE;QAClE,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACpD,MAAM,SAAS,GAAI,KAAgB,CAAC,WAAW,CAAC,IAAI,CAAC;QAErD,MAAM,MAAM,GAA0B,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACrE,UAAU;YACV,SAAS;YACT,eAAe,EAAE,UAAU;SAC5B,CAAC,CAAC,CAAC;QAEJ,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,QAAQ,CAAC,aAAqB;QAClC,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IACjD,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,aAAa,CACjB,aAAqB,EACrB,OAAuB,cAAc,CAAC,MAAM;QAE5C,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,cAAc,CAAC,MAAM;gBACxB,MAAM,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,aAAa,EAAE,iBAAiB,CAAC,SAAS,EAAE;oBAC7E,cAAc,EAAE,IAAI,IAAI,EAAE;iBAC3B,CAAC,CAAC;gBACH,OAAO;YACT,KAAK,cAAc,CAAC,MAAM;gBACxB,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;gBAC5C,OAAO;YACT,KAAK,cAAc,CAAC,OAAO;gBACzB,MAAM,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;gBACtD,OAAO;QACX,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CAAC,aAAqB,EAAE,MAAc;QACpD,MAAM,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,aAAa,EAAE,iBAAiB,CAAC,MAAM,EAAE;YAC1E,aAAa,EAAE,MAAM;SACtB,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,eAAe,CAAC,aAAqB;QACzC,MAAM,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,aAAa,EAAE,iBAAiB,CAAC,WAAW,EAAE;YAC/E,oBAAoB,EAAE,IAAI,IAAI,EAAE;SACjC,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,WAAW,CAAC,WAA6B;QACvC,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,WAAW,CAAC,eAAe,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;IACzF,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,sBAAsB,CAAC,KAAa;QACxC,OAAO,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC;CACF,CAAA;AA5GY,wBAAwB;IADpC,UAAU,EAAE;IAGR,WAAA,MAAM,CAAC,4BAA4B,CAAC,CAAA;IAEpC,WAAA,MAAM,CAAC,gBAAgB,CAAC,CAAA;;GAJhB,wBAAwB,CA4GpC"}
|
|
@@ -1,14 +1,11 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
2
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
3
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
4
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
6
|
};
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const common_1 = require("@nestjs/common");
|
|
11
|
-
const errors_1 = require("../types/errors");
|
|
7
|
+
import { Injectable } from '@nestjs/common';
|
|
8
|
+
import { DuplicateListenerIdError } from '../types/errors.js';
|
|
12
9
|
/**
|
|
13
10
|
* Registry of `@OutboxEventsHandler`-annotated classes (and other
|
|
14
11
|
* programmatically-registered listeners such as those routed from
|
|
@@ -31,7 +28,7 @@ let OutboxListenerRegistry = class OutboxListenerRegistry {
|
|
|
31
28
|
*/
|
|
32
29
|
register(listener) {
|
|
33
30
|
if (this.listenersById.has(listener.id)) {
|
|
34
|
-
throw new
|
|
31
|
+
throw new DuplicateListenerIdError(listener.id);
|
|
35
32
|
}
|
|
36
33
|
const listeners = this.listenersByEventType.get(listener.eventType) ?? [];
|
|
37
34
|
listeners.push(listener);
|
|
@@ -60,8 +57,8 @@ let OutboxListenerRegistry = class OutboxListenerRegistry {
|
|
|
60
57
|
this.listenersById.clear();
|
|
61
58
|
}
|
|
62
59
|
};
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
(0, common_1.Injectable)()
|
|
60
|
+
OutboxListenerRegistry = __decorate([
|
|
61
|
+
Injectable()
|
|
66
62
|
], OutboxListenerRegistry);
|
|
63
|
+
export { OutboxListenerRegistry };
|
|
67
64
|
//# sourceMappingURL=listener-registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"listener-registry.js","sourceRoot":"","sources":["../../src/registry/listener-registry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"listener-registry.js","sourceRoot":"","sources":["../../src/registry/listener-registry.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAoB9D;;;;;;;;;GASG;AAEI,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IAChB,oBAAoB,GAAG,IAAI,GAAG,EAAsC,CAAC;IACrE,aAAa,GAAG,IAAI,GAAG,EAAoC,CAAC;IAE7E;;;;;;OAMG;IACH,QAAQ,CAAC,QAAkC;QACzC,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,wBAAwB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAC1E,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzB,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC7D,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IAChD,CAAC;IAED;;;;OAIG;IACH,cAAc,CAAC,SAAiB;QAC9B,OAAO,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IACxD,CAAC;IAED,iFAAiF;IACjF,OAAO,CAAC,EAAU;QAChB,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,+DAA+D;IAC/D,MAAM;QACJ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,uEAAuE;IACvE,KAAK;QACH,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAC;QAClC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;CACF,CAAA;AA9CY,sBAAsB;IADlC,UAAU,EAAE;GACA,sBAAsB,CA8ClC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ModuleRef } from '@nestjs/core';
|
|
2
|
-
import { type OutboxDataSourceNames } from '../dispatcher/outbox-event-publisher';
|
|
2
|
+
import { type OutboxDataSourceNames } from '../dispatcher/outbox-event-publisher.js';
|
|
3
3
|
/**
|
|
4
4
|
* Cross-package shared DI token for the outbox listener registrar
|
|
5
5
|
* structural port (declared in the cqrs package as
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
2
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
3
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
@@ -12,13 +11,11 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
12
11
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
12
|
};
|
|
14
13
|
var MultiDsOutboxListenerRegistrar_1;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
const event_type_resolver_1 = require("../serialization/event-type-resolver");
|
|
21
|
-
const token_utils_1 = require("../tokens/token-utils");
|
|
14
|
+
import { Inject, Injectable, Logger } from '@nestjs/common';
|
|
15
|
+
import { ModuleRef } from '@nestjs/core';
|
|
16
|
+
import { OUTBOX_DATA_SOURCE_NAMES, } from '../dispatcher/outbox-event-publisher.js';
|
|
17
|
+
import { resolveDataSourceByEventTypeName } from '../serialization/event-type-resolver.js';
|
|
18
|
+
import { getEventTypeRegistryToken, getOutboxListenerRegistryToken, } from '../tokens/token-utils.js';
|
|
22
19
|
/**
|
|
23
20
|
* Cross-package shared DI token for the outbox listener registrar
|
|
24
21
|
* structural port (declared in the cqrs package as
|
|
@@ -37,7 +34,7 @@ const token_utils_1 = require("../tokens/token-utils");
|
|
|
37
34
|
* `OUTBOX_LISTENER_REGISTRAR` from `@nestjs-transactional/cqrs` for
|
|
38
35
|
* source-level clarity.
|
|
39
36
|
*/
|
|
40
|
-
|
|
37
|
+
export const OUTBOX_LISTENER_REGISTRAR_TOKEN = Symbol.for('@nestjs-transactional/cqrs/outbox-listener-registrar');
|
|
41
38
|
/**
|
|
42
39
|
* Multi-dataSource implementation of the cqrs package's
|
|
43
40
|
* `OutboxListenerRegistrar` structural port.
|
|
@@ -69,7 +66,7 @@ exports.OUTBOX_LISTENER_REGISTRAR_TOKEN = Symbol.for('@nestjs-transactional/cqrs
|
|
|
69
66
|
let MultiDsOutboxListenerRegistrar = MultiDsOutboxListenerRegistrar_1 = class MultiDsOutboxListenerRegistrar {
|
|
70
67
|
moduleRef;
|
|
71
68
|
dataSourceNames;
|
|
72
|
-
logger = new
|
|
69
|
+
logger = new Logger(MultiDsOutboxListenerRegistrar_1.name);
|
|
73
70
|
constructor(moduleRef, dataSourceNames) {
|
|
74
71
|
this.moduleRef = moduleRef;
|
|
75
72
|
this.dataSourceNames = dataSourceNames;
|
|
@@ -82,8 +79,8 @@ let MultiDsOutboxListenerRegistrar = MultiDsOutboxListenerRegistrar_1 = class Mu
|
|
|
82
79
|
*/
|
|
83
80
|
register(listener) {
|
|
84
81
|
const eventTypeRegistries = this.collectEventTypeRegistries();
|
|
85
|
-
const dataSource =
|
|
86
|
-
const registry = this.moduleRef.get(
|
|
82
|
+
const dataSource = resolveDataSourceByEventTypeName(listener.eventType, eventTypeRegistries);
|
|
83
|
+
const registry = this.moduleRef.get(getOutboxListenerRegistryToken(dataSource), { strict: false });
|
|
87
84
|
registry.register(listener);
|
|
88
85
|
this.logger.debug(`Routed listener id='${listener.id}' for event '${listener.eventType}' → dataSource '${dataSource}'`);
|
|
89
86
|
}
|
|
@@ -97,16 +94,16 @@ let MultiDsOutboxListenerRegistrar = MultiDsOutboxListenerRegistrar_1 = class Mu
|
|
|
97
94
|
collectEventTypeRegistries() {
|
|
98
95
|
const registries = new Map();
|
|
99
96
|
for (const dataSource of this.dataSourceNames.keys()) {
|
|
100
|
-
const registry = this.moduleRef.get(
|
|
97
|
+
const registry = this.moduleRef.get(getEventTypeRegistryToken(dataSource), { strict: false });
|
|
101
98
|
registries.set(dataSource, registry);
|
|
102
99
|
}
|
|
103
100
|
return registries;
|
|
104
101
|
}
|
|
105
102
|
};
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
(
|
|
109
|
-
|
|
110
|
-
__metadata("design:paramtypes", [core_1.ModuleRef, Object])
|
|
103
|
+
MultiDsOutboxListenerRegistrar = MultiDsOutboxListenerRegistrar_1 = __decorate([
|
|
104
|
+
Injectable(),
|
|
105
|
+
__param(1, Inject(OUTBOX_DATA_SOURCE_NAMES)),
|
|
106
|
+
__metadata("design:paramtypes", [ModuleRef, Object])
|
|
111
107
|
], MultiDsOutboxListenerRegistrar);
|
|
108
|
+
export { MultiDsOutboxListenerRegistrar };
|
|
112
109
|
//# sourceMappingURL=multi-ds-listener-registrar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multi-ds-listener-registrar.js","sourceRoot":"","sources":["../../src/registry/multi-ds-listener-registrar.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"multi-ds-listener-registrar.js","sourceRoot":"","sources":["../../src/registry/multi-ds-listener-registrar.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EACL,wBAAwB,GAEzB,MAAM,yCAAyC,CAAC;AAEjD,OAAO,EAAE,gCAAgC,EAAE,MAAM,yCAAyC,CAAC;AAC3F,OAAO,EACL,yBAAyB,EACzB,8BAA8B,GAC/B,MAAM,0BAA0B,CAAC;AAIlC;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,MAAM,CAAC,GAAG,CACvD,sDAAsD,CACvD,CAAC;AAgBF;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEI,IAAM,8BAA8B,sCAApC,MAAM,8BAA8B;IAItB;IAEA;IALF,MAAM,GAAG,IAAI,MAAM,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,gCAAgC,CAAC,QAAQ,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;QAE7F,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CACjC,8BAA8B,CAAC,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,yBAAyB,CAAC,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,8BAA8B;IAD1C,UAAU,EAAE;IAMR,WAAA,MAAM,CAAC,wBAAwB,CAAC,CAAA;qCADL,SAAS;GAJ5B,8BAA8B,CAgD1C"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type OnModuleInit, type Type } from '@nestjs/common';
|
|
2
2
|
import { DiscoveryService, ModuleRef } from '@nestjs/core';
|
|
3
3
|
import { TransactionManager } from '@nestjs-transactional/core';
|
|
4
|
-
import { type OutboxDataSourceNames } from '../dispatcher/outbox-event-publisher';
|
|
4
|
+
import { type OutboxDataSourceNames } from '../dispatcher/outbox-event-publisher.js';
|
|
5
5
|
/**
|
|
6
6
|
* Bootstrap-time scanner that walks every provider in the running
|
|
7
7
|
* Nest application, finds classes decorated with
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
2
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
3
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
@@ -12,17 +11,14 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
12
11
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
12
|
};
|
|
14
13
|
var OutboxListenerScanner_1;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
const event_type_resolver_1 = require("../serialization/event-type-resolver");
|
|
24
|
-
const token_utils_1 = require("../tokens/token-utils");
|
|
25
|
-
const errors_1 = require("../types/errors");
|
|
14
|
+
import { Inject, Injectable, Logger } from '@nestjs/common';
|
|
15
|
+
import { DiscoveryService, ModuleRef } from '@nestjs/core';
|
|
16
|
+
import { PropagationMode, TransactionManager } from '@nestjs-transactional/core';
|
|
17
|
+
import { getOutboxEventsHandlerMetadata } from '../decorators/outbox-events-handler.decorator.js';
|
|
18
|
+
import { OUTBOX_DATA_SOURCE_NAMES, } from '../dispatcher/outbox-event-publisher.js';
|
|
19
|
+
import { resolveDataSourceByEventTypeName } from '../serialization/event-type-resolver.js';
|
|
20
|
+
import { getEventTypeRegistryToken, getOutboxListenerRegistryToken, } from '../tokens/token-utils.js';
|
|
21
|
+
import { OutboxError } from '../types/errors.js';
|
|
26
22
|
/**
|
|
27
23
|
* Bootstrap-time scanner that walks every provider in the running
|
|
28
24
|
* Nest application, finds classes decorated with
|
|
@@ -64,7 +60,7 @@ let OutboxListenerScanner = OutboxListenerScanner_1 = class OutboxListenerScanne
|
|
|
64
60
|
moduleRef;
|
|
65
61
|
dataSourceNames;
|
|
66
62
|
transactionManager;
|
|
67
|
-
logger = new
|
|
63
|
+
logger = new Logger(OutboxListenerScanner_1.name);
|
|
68
64
|
constructor(discovery, moduleRef, dataSourceNames, transactionManager) {
|
|
69
65
|
this.discovery = discovery;
|
|
70
66
|
this.moduleRef = moduleRef;
|
|
@@ -82,7 +78,7 @@ let OutboxListenerScanner = OutboxListenerScanner_1 = class OutboxListenerScanne
|
|
|
82
78
|
wrapper.instance === undefined) {
|
|
83
79
|
continue;
|
|
84
80
|
}
|
|
85
|
-
const metadata =
|
|
81
|
+
const metadata = getOutboxEventsHandlerMetadata(wrapper.metatype);
|
|
86
82
|
if (metadata === undefined) {
|
|
87
83
|
continue;
|
|
88
84
|
}
|
|
@@ -99,7 +95,7 @@ let OutboxListenerScanner = OutboxListenerScanner_1 = class OutboxListenerScanne
|
|
|
99
95
|
// Defensive — every dataSource in `dataSourceNames` is also
|
|
100
96
|
// in `listenerRegistries` because both maps are built from
|
|
101
97
|
// the same Set. Throw rather than silently skip.
|
|
102
|
-
throw new
|
|
98
|
+
throw new OutboxError(`@OutboxEventsHandler on ${className}: no OutboxListenerRegistry registered for ` +
|
|
103
99
|
`dataSource '${dataSource}'. This is a framework bug — please open an issue.`);
|
|
104
100
|
}
|
|
105
101
|
const boundHandle = rawHandle.bind(instance);
|
|
@@ -107,7 +103,7 @@ let OutboxListenerScanner = OutboxListenerScanner_1 = class OutboxListenerScanne
|
|
|
107
103
|
const { newTransaction } = metadata;
|
|
108
104
|
const invoke = async (event) => {
|
|
109
105
|
if (newTransaction) {
|
|
110
|
-
await manager.run({ propagation:
|
|
106
|
+
await manager.run({ propagation: PropagationMode.REQUIRES_NEW }, async () => {
|
|
111
107
|
await boundHandle(event);
|
|
112
108
|
});
|
|
113
109
|
}
|
|
@@ -135,7 +131,7 @@ let OutboxListenerScanner = OutboxListenerScanner_1 = class OutboxListenerScanne
|
|
|
135
131
|
resolveHandlerDataSource(className, eventTypes, eventTypeRegistries) {
|
|
136
132
|
const dataSourcePerEvent = new Map();
|
|
137
133
|
for (const eventType of eventTypes) {
|
|
138
|
-
const dataSource =
|
|
134
|
+
const dataSource = resolveDataSourceByEventTypeName(eventType.name, eventTypeRegistries);
|
|
139
135
|
dataSourcePerEvent.set(eventType.name, dataSource);
|
|
140
136
|
}
|
|
141
137
|
const uniqueDataSources = new Set(dataSourcePerEvent.values());
|
|
@@ -143,7 +139,7 @@ let OutboxListenerScanner = OutboxListenerScanner_1 = class OutboxListenerScanne
|
|
|
143
139
|
const breakdown = [...dataSourcePerEvent]
|
|
144
140
|
.map(([eventName, dataSource]) => ` ${eventName} → '${dataSource}'`)
|
|
145
141
|
.join('\n');
|
|
146
|
-
throw new
|
|
142
|
+
throw new OutboxError(`@OutboxEventsHandler on ${className}: events span multiple dataSources:\n${breakdown}\n` +
|
|
147
143
|
`Handlers must be scoped to a single dataSource. Either:\n` +
|
|
148
144
|
` • register the events under the same dataSource (OutboxModule.forFeature(...))\n` +
|
|
149
145
|
` • split the handler into separate classes per dataSource\n` +
|
|
@@ -157,7 +153,7 @@ let OutboxListenerScanner = OutboxListenerScanner_1 = class OutboxListenerScanne
|
|
|
157
153
|
collectEventTypeRegistries() {
|
|
158
154
|
const registries = new Map();
|
|
159
155
|
for (const dataSource of this.dataSourceNames.keys()) {
|
|
160
|
-
registries.set(dataSource, this.moduleRef.get(
|
|
156
|
+
registries.set(dataSource, this.moduleRef.get(getEventTypeRegistryToken(dataSource), {
|
|
161
157
|
strict: false,
|
|
162
158
|
}));
|
|
163
159
|
}
|
|
@@ -166,27 +162,27 @@ let OutboxListenerScanner = OutboxListenerScanner_1 = class OutboxListenerScanne
|
|
|
166
162
|
collectListenerRegistries() {
|
|
167
163
|
const registries = new Map();
|
|
168
164
|
for (const dataSource of this.dataSourceNames.keys()) {
|
|
169
|
-
registries.set(dataSource, this.moduleRef.get(
|
|
165
|
+
registries.set(dataSource, this.moduleRef.get(getOutboxListenerRegistryToken(dataSource), {
|
|
170
166
|
strict: false,
|
|
171
167
|
}));
|
|
172
168
|
}
|
|
173
169
|
return registries;
|
|
174
170
|
}
|
|
175
171
|
};
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
(
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
core_1.ModuleRef, Object, core_2.TransactionManager])
|
|
172
|
+
OutboxListenerScanner = OutboxListenerScanner_1 = __decorate([
|
|
173
|
+
Injectable(),
|
|
174
|
+
__param(2, Inject(OUTBOX_DATA_SOURCE_NAMES)),
|
|
175
|
+
__metadata("design:paramtypes", [DiscoveryService,
|
|
176
|
+
ModuleRef, Object, TransactionManager])
|
|
182
177
|
], OutboxListenerScanner);
|
|
178
|
+
export { OutboxListenerScanner };
|
|
183
179
|
/**
|
|
184
180
|
* Compose the stable listener id. Always ends with `#${EventName}`
|
|
185
181
|
* so a single class handling multiple event types gets distinct ids
|
|
186
182
|
* — the registry requires globally-unique ids. Exported so consumers
|
|
187
183
|
* can pre-compute the id for explicit registration / tests.
|
|
188
184
|
*/
|
|
189
|
-
function composeListenerId(baseId, eventType) {
|
|
185
|
+
export function composeListenerId(baseId, eventType) {
|
|
190
186
|
return `${baseId}#${eventType.name}`;
|
|
191
187
|
}
|
|
192
188
|
//# sourceMappingURL=outbox-listener-scanner.js.map
|
|
@@ -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":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { EventPublication, NewEventPublication } from '../types/event-publication';
|
|
2
|
-
import type { PublicationStatus } from '../types/publication-status';
|
|
1
|
+
import type { EventPublication, NewEventPublication } from '../types/event-publication.js';
|
|
2
|
+
import type { PublicationStatus } from '../types/publication-status.js';
|
|
3
3
|
/**
|
|
4
4
|
* Options accepted by {@link EventPublicationRepository.updateStatus}.
|
|
5
5
|
*/
|
|
@@ -100,7 +100,18 @@ export interface EventPublicationRepository {
|
|
|
100
100
|
* strictly before `beforeDate`. Used by the staleness monitor.
|
|
101
101
|
*/
|
|
102
102
|
findStale(beforeDate: Date, statuses: PublicationStatus[]): Promise<EventPublication[]>;
|
|
103
|
-
/**
|
|
103
|
+
/**
|
|
104
|
+
* Find all completed publications, with optional pagination / cutoff,
|
|
105
|
+
* ordered by `completionDate` **oldest first**.
|
|
106
|
+
*
|
|
107
|
+
* The ordering is part of the contract because `limit` makes it one.
|
|
108
|
+
* A retention job asks for a bounded page and deletes it; if the page
|
|
109
|
+
* came back newest-first, a job that cannot keep up with the
|
|
110
|
+
* completion rate would delete only the recent rows and never reach
|
|
111
|
+
* the old ones, which is the exact opposite of what a retention window
|
|
112
|
+
* promises. Draining from the oldest end degrades correctly instead:
|
|
113
|
+
* falling behind shrinks the backlog, it does not strand its tail.
|
|
114
|
+
*/
|
|
104
115
|
findCompleted(options?: FindCompletedOptions): Promise<EventPublication[]>;
|
|
105
116
|
/**
|
|
106
117
|
* Find all incomplete publications (status other than `COMPLETED`).
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.EVENT_PUBLICATION_REPOSITORY = void 0;
|
|
4
1
|
/** DI token for the active {@link EventPublicationRepository}. */
|
|
5
|
-
|
|
2
|
+
export const EVENT_PUBLICATION_REPOSITORY = Symbol('EVENT_PUBLICATION_REPOSITORY');
|
|
6
3
|
//# sourceMappingURL=event-publication-repository.js.map
|
|
@@ -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":"AA4JA,kEAAkE;AAClE,MAAM,CAAC,MAAM,4BAA4B,GAAG,MAAM,CAAC,8BAA8B,CAAC,CAAC"}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.EVENT_SERIALIZER = void 0;
|
|
4
1
|
/** DI token for the active {@link EventSerializer} implementation. */
|
|
5
|
-
|
|
2
|
+
export const EVENT_SERIALIZER = Symbol('EVENT_SERIALIZER');
|
|
6
3
|
//# sourceMappingURL=event-serializer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-serializer.js","sourceRoot":"","sources":["../../src/serialization/event-serializer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"event-serializer.js","sourceRoot":"","sources":["../../src/serialization/event-serializer.ts"],"names":[],"mappings":"AA0BA,sEAAsE;AACtE,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC"}
|
|
@@ -1,13 +1,10 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
2
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
3
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
4
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
6
|
};
|
|
8
|
-
|
|
9
|
-
exports.EVENT_TYPE_REGISTRY = exports.EventTypeRegistry = void 0;
|
|
10
|
-
const common_1 = require("@nestjs/common");
|
|
7
|
+
import { Injectable } from '@nestjs/common';
|
|
11
8
|
/**
|
|
12
9
|
* Registry that maps event class names to their constructors so the
|
|
13
10
|
* serializer can reconstruct class instances from stored JSON payloads.
|
|
@@ -70,10 +67,10 @@ let EventTypeRegistry = class EventTypeRegistry {
|
|
|
70
67
|
return new Map(this.registry);
|
|
71
68
|
}
|
|
72
69
|
};
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
(0, common_1.Injectable)()
|
|
70
|
+
EventTypeRegistry = __decorate([
|
|
71
|
+
Injectable()
|
|
76
72
|
], EventTypeRegistry);
|
|
73
|
+
export { EventTypeRegistry };
|
|
77
74
|
/** DI token for the {@link EventTypeRegistry}. */
|
|
78
|
-
|
|
75
|
+
export const EVENT_TYPE_REGISTRY = Symbol('EVENT_TYPE_REGISTRY');
|
|
79
76
|
//# sourceMappingURL=event-type-registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-type-registry.js","sourceRoot":"","sources":["../../src/serialization/event-type-registry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"event-type-registry.js","sourceRoot":"","sources":["../../src/serialization/event-type-registry.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAQ,MAAM,gBAAgB,CAAC;AAElD;;;;;;;;;GASG;AAEI,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IACX,QAAQ,GAAG,IAAI,GAAG,EAAwB,CAAC;IAE5D;;;;;;;OAOG;IACH,QAAQ,CAAC,SAAuB;QAC9B,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CACb,eAAe,SAAS,CAAC,IAAI,wBAAwB;gBACnD,0DAA0D;gBAC1D,2DAA2D,CAC9D,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC/C,CAAC;IAED,2CAA2C;IAC3C,WAAW,CAAC,UAA0B;QACpC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,sEAAsE;IACtE,GAAG,CAAC,QAAgB;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED;;;;;OAKG;IACH,UAAU,CAAC,QAAgB;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CACb,eAAe,QAAQ,oBAAoB;gBACzC,+DAA+D;gBAC/D,gDAAgD,CACnD,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,4DAA4D;IAC5D,GAAG,CAAC,QAAgB;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED,+EAA+E;IAC/E,MAAM;QACJ,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;CACF,CAAA;AA7DY,iBAAiB;IAD7B,UAAU,EAAE;GACA,iBAAiB,CA6D7B;;AAED,kDAAkD;AAClD,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { EventTypeRegistry } from './event-type-registry';
|
|
1
|
+
import type { EventTypeRegistry } from './event-type-registry.js';
|
|
2
2
|
/**
|
|
3
3
|
* Resolve the dataSource that owns a given event-type name by walking
|
|
4
4
|
* a Map of per-dataSource {@link EventTypeRegistry} instances. Returns
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.resolveDataSourceByEventTypeName = resolveDataSourceByEventTypeName;
|
|
4
|
-
const errors_1 = require("../types/errors");
|
|
1
|
+
import { OutboxError } from '../types/errors.js';
|
|
5
2
|
/**
|
|
6
3
|
* Resolve the dataSource that owns a given event-type name by walking
|
|
7
4
|
* a Map of per-dataSource {@link EventTypeRegistry} instances. Returns
|
|
@@ -42,7 +39,7 @@ const errors_1 = require("../types/errors");
|
|
|
42
39
|
* @throws {OutboxError} when zero or multiple registries contain the
|
|
43
40
|
* event-type.
|
|
44
41
|
*/
|
|
45
|
-
function resolveDataSourceByEventTypeName(eventTypeName, registries) {
|
|
42
|
+
export function resolveDataSourceByEventTypeName(eventTypeName, registries) {
|
|
46
43
|
const matches = [];
|
|
47
44
|
for (const [dataSource, registry] of registries) {
|
|
48
45
|
if (registry.has(eventTypeName)) {
|
|
@@ -50,12 +47,12 @@ function resolveDataSourceByEventTypeName(eventTypeName, registries) {
|
|
|
50
47
|
}
|
|
51
48
|
}
|
|
52
49
|
if (matches.length === 0) {
|
|
53
|
-
throw new
|
|
50
|
+
throw new OutboxError(`Event type '${eventTypeName}' is not registered in any dataSource. ` +
|
|
54
51
|
`Add it to OutboxModule.forFeature([...], { dataSource: '...' }) ` +
|
|
55
52
|
`in the feature module that owns the event class.`);
|
|
56
53
|
}
|
|
57
54
|
if (matches.length > 1) {
|
|
58
|
-
throw new
|
|
55
|
+
throw new OutboxError(`Event type '${eventTypeName}' is registered in multiple dataSources ` +
|
|
59
56
|
`(${matches.join(', ')}). Pass an explicit { dataSource } option to ` +
|
|
60
57
|
`disambiguate, or register the event in only one dataSource.`);
|
|
61
58
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-type-resolver.js","sourceRoot":"","sources":["../../src/serialization/event-type-resolver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"event-type-resolver.js","sourceRoot":"","sources":["../../src/serialization/event-type-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAIjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,MAAM,UAAU,gCAAgC,CAC9C,aAAqB,EACrB,UAAkD;IAElD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,UAAU,EAAE,CAAC;QAChD,IAAI,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,WAAW,CACnB,eAAe,aAAa,yCAAyC;YACnE,kEAAkE;YAClE,kDAAkD,CACrD,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,WAAW,CACnB,eAAe,aAAa,0CAA0C;YACpE,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,+CAA+C;YACrE,6DAA6D,CAChE,CAAC;IACJ,CAAC;IACD,mCAAmC;IACnC,oEAAoE;IACpE,OAAO,OAAO,CAAC,CAAC,CAAE,CAAC;AACrB,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { EventSerializer } from './event-serializer';
|
|
2
|
-
import { EventTypeRegistry } from './event-type-registry';
|
|
1
|
+
import type { EventSerializer } from './event-serializer.js';
|
|
2
|
+
import { EventTypeRegistry } from './event-type-registry.js';
|
|
3
3
|
/**
|
|
4
4
|
* Default JSON-based {@link EventSerializer}. Uses `JSON.stringify` for
|
|
5
5
|
* encoding and `JSON.parse` + `Object.create` for decoding, consulting
|