node-cqrs 1.0.0-rc.39 → 1.0.0-rc.40
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/CHANGELOG.md +4 -0
- package/dist/cjs/AbstractAggregate.js +16 -0
- package/dist/cjs/AbstractAggregate.js.map +1 -1
- package/dist/cjs/AggregateCommandHandler.js +8 -6
- package/dist/cjs/AggregateCommandHandler.js.map +1 -1
- package/dist/cjs/CqrsContainerBuilder.js +4 -1
- package/dist/cjs/CqrsContainerBuilder.js.map +1 -1
- package/dist/cjs/in-memory/InMemoryEventStorage.js +1 -2
- package/dist/cjs/in-memory/InMemoryEventStorage.js.map +1 -1
- package/dist/cjs/interfaces/IDispatchPipelineProcessor.js.map +1 -1
- package/dist/cjs/interfaces/IEventStorageWriter.js.map +1 -1
- package/dist/esm/AbstractAggregate.js +16 -0
- package/dist/esm/AbstractAggregate.js.map +1 -1
- package/dist/esm/AggregateCommandHandler.js +8 -6
- package/dist/esm/AggregateCommandHandler.js.map +1 -1
- package/dist/esm/CqrsContainerBuilder.js +4 -1
- package/dist/esm/CqrsContainerBuilder.js.map +1 -1
- package/dist/esm/in-memory/InMemoryEventStorage.js +1 -2
- package/dist/esm/in-memory/InMemoryEventStorage.js.map +1 -1
- package/dist/esm/interfaces/IDispatchPipelineProcessor.js.map +1 -1
- package/dist/esm/interfaces/IEventStorageWriter.js.map +1 -1
- package/package.json +2 -2
- package/src/AbstractAggregate.ts +19 -0
- package/src/AggregateCommandHandler.ts +12 -11
- package/src/CqrsContainerBuilder.ts +4 -1
- package/src/in-memory/InMemoryEventStorage.ts +3 -7
- package/src/interfaces/IAggregate.ts +10 -9
- package/src/interfaces/IDispatchPipelineProcessor.ts +5 -0
- package/src/interfaces/IEventStorageWriter.ts +1 -5
- package/types/AbstractAggregate.d.ts +13 -1
- package/types/AggregateCommandHandler.d.ts +2 -2
- package/types/in-memory/InMemoryEventStorage.d.ts +5 -5
- package/types/interfaces/IAggregate.d.ts +5 -5
- package/types/interfaces/IDispatchPipelineProcessor.d.ts +4 -0
- package/types/interfaces/IEventStorageWriter.d.ts +1 -4
package/CHANGELOG.md
CHANGED
|
@@ -19,6 +19,22 @@ class AbstractAggregate {
|
|
|
19
19
|
static get handles() {
|
|
20
20
|
return (0, index_ts_2.getMessageHandlerNames)(this);
|
|
21
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* Optional list of event types that are required to restore the aggregate state.
|
|
24
|
+
*
|
|
25
|
+
* @see IAggregateConstructor
|
|
26
|
+
*/
|
|
27
|
+
static get restoresFrom() {
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Defines retry behavior when a ConcurrencyError is thrown during event dispatch.
|
|
32
|
+
*
|
|
33
|
+
* @see IAggregateConstructor
|
|
34
|
+
*/
|
|
35
|
+
static get retryOnConcurrencyError() {
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
22
38
|
/**
|
|
23
39
|
* Convenience helper to create an `AggregateCommandHandler` for this aggregate type and
|
|
24
40
|
* subscribe it to the provided `commandBus`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractAggregate.js","sourceRoot":"","sources":["../../src/AbstractAggregate.ts"],"names":[],"mappings":";;;AAAA,6EAAuE;AACvE,
|
|
1
|
+
{"version":3,"file":"AbstractAggregate.js","sourceRoot":"","sources":["../../src/AbstractAggregate.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,13 +10,15 @@ function normalizeRetryResolver(value) {
|
|
|
10
10
|
return value;
|
|
11
11
|
if (value === false)
|
|
12
12
|
return () => false;
|
|
13
|
+
if (value === 'ignore')
|
|
14
|
+
return () => 'ignore';
|
|
13
15
|
if (typeof value === 'number')
|
|
14
|
-
return (err, attempt) => err instanceof index_ts_2.ConcurrencyError && attempt < value;
|
|
16
|
+
return (err, events, attempt) => err instanceof index_ts_2.ConcurrencyError && attempt < value;
|
|
15
17
|
if ((0, isObject_ts_1.isObject)(value)) {
|
|
16
18
|
const { maxRetries = DEFAULT_MAX_RETRY_ATTEMPTS, ignoreAfterMaxRetries = false } = value;
|
|
17
19
|
(0, index_ts_1.assertNonNegativeInteger)(maxRetries, 'retryOnConcurrencyError.maxRetries');
|
|
18
20
|
(0, index_ts_1.assertBoolean)(ignoreAfterMaxRetries, 'retryOnConcurrencyError.ignoreAfterMaxRetries');
|
|
19
|
-
return (err, attempt) => {
|
|
21
|
+
return (err, events, attempt) => {
|
|
20
22
|
if (!(err instanceof index_ts_2.ConcurrencyError))
|
|
21
23
|
return false;
|
|
22
24
|
if (attempt < maxRetries)
|
|
@@ -25,7 +27,7 @@ function normalizeRetryResolver(value) {
|
|
|
25
27
|
};
|
|
26
28
|
}
|
|
27
29
|
// undefined or true — default behavior
|
|
28
|
-
return (err, attempt) => err instanceof index_ts_2.ConcurrencyError && attempt < DEFAULT_MAX_RETRY_ATTEMPTS;
|
|
30
|
+
return (err, events, attempt) => err instanceof index_ts_2.ConcurrencyError && attempt < DEFAULT_MAX_RETRY_ATTEMPTS;
|
|
29
31
|
}
|
|
30
32
|
/**
|
|
31
33
|
* Aggregate command handler.
|
|
@@ -116,7 +118,7 @@ class AggregateCommandHandler {
|
|
|
116
118
|
try {
|
|
117
119
|
for (let attempt = 0;; attempt++) {
|
|
118
120
|
if (attempt > 0)
|
|
119
|
-
this.#logger?.
|
|
121
|
+
this.#logger?.warn(`retrying "${cmd.type}" command on aggregate ${aggregateId}, attempt ${attempt + 1}`);
|
|
120
122
|
// Read the current cache entry after acquiring the lock. On the first attempt
|
|
121
123
|
// this is the pre-warmed (possibly shared) instance; on retries it is the
|
|
122
124
|
// fresh instance placed into the cache by the error handler below.
|
|
@@ -137,11 +139,11 @@ class AggregateCommandHandler {
|
|
|
137
139
|
// queued on the lock start from a clean state.
|
|
138
140
|
if (aggregateId)
|
|
139
141
|
this.#aggregatesCache.set(aggregateId, this.#restoreAggregate(aggregateId));
|
|
140
|
-
const retryDecision = this.#shouldRetry(err, attempt);
|
|
142
|
+
const retryDecision = this.#shouldRetry(err, events, attempt);
|
|
141
143
|
if (!retryDecision)
|
|
142
144
|
throw err;
|
|
143
145
|
if (retryDecision === 'ignore' && events?.length) {
|
|
144
|
-
this.#logger?.
|
|
146
|
+
this.#logger?.warn(`"${cmd.type}" concurrency error ignored after ${attempt + 1} attempt(s), force-dispatching`);
|
|
145
147
|
await this.#eventStore.dispatch(events, { ignoreConcurrencyError: true });
|
|
146
148
|
return events;
|
|
147
149
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AggregateCommandHandler.js","sourceRoot":"","sources":["../../src/AggregateCommandHandler.ts"],"names":[],"mappings":";;;AAAA,+CAG0B;AAC1B,gDAAqD;AAmBrD,0DAAoD;AAEpD,MAAM,0BAA0B,GAAG,CAAC,CAAC;AAErC,SAAS,sBAAsB,
|
|
1
|
+
{"version":3,"file":"AggregateCommandHandler.js","sourceRoot":"","sources":["../../src/AggregateCommandHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -72,7 +72,10 @@ class CqrsContainerBuilder extends di0_1.ContainerBuilder {
|
|
|
72
72
|
const commandHandlerFactory = (container) => container.createInstance(AggregateCommandHandler_ts_1.AggregateCommandHandler, {
|
|
73
73
|
aggregateFactory: (options) => container.createInstance(AggregateType, options),
|
|
74
74
|
handles: AggregateType.handles,
|
|
75
|
-
restoresFrom: AggregateType.restoresFrom
|
|
75
|
+
restoresFrom: AggregateType.restoresFrom,
|
|
76
|
+
...AggregateType.retryOnConcurrencyError !== undefined && {
|
|
77
|
+
retryOnConcurrencyError: AggregateType.retryOnConcurrencyError
|
|
78
|
+
}
|
|
76
79
|
});
|
|
77
80
|
return this.registerCommandHandler(commandHandlerFactory);
|
|
78
81
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CqrsContainerBuilder.js","sourceRoot":"","sources":["../../src/CqrsContainerBuilder.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"CqrsContainerBuilder.js","sourceRoot":"","sources":["../../src/CqrsContainerBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -95,8 +95,7 @@ class InMemoryEventStorage {
|
|
|
95
95
|
throw new Error('Event batch does not contain `event`');
|
|
96
96
|
events.push(event);
|
|
97
97
|
}
|
|
98
|
-
|
|
99
|
-
if (ignoreConcurrencyError)
|
|
98
|
+
if (batch.at(0)?.ignoreConcurrencyError)
|
|
100
99
|
await this.commitEvents(events, { ignoreConcurrencyError: true });
|
|
101
100
|
else
|
|
102
101
|
await this.commitEvents(events);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InMemoryEventStorage.js","sourceRoot":"","sources":["../../../src/in-memory/InMemoryEventStorage.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"InMemoryEventStorage.js","sourceRoot":"","sources":["../../../src/in-memory/InMemoryEventStorage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IDispatchPipelineProcessor.js","sourceRoot":"","sources":["../../../src/interfaces/IDispatchPipelineProcessor.ts"],"names":[],"mappings":";;;AACA,+CAAyC;
|
|
1
|
+
{"version":3,"file":"IDispatchPipelineProcessor.js","sourceRoot":"","sources":["../../../src/interfaces/IDispatchPipelineProcessor.ts"],"names":[],"mappings":";;;AACA,+CAAyC;AAmClC,MAAM,2BAA2B,GAAG,CAAC,GAAY,EAAqC,EAAE,CAC9F,IAAA,sBAAQ,EAAC,GAAG,CAAC;OACV,SAAS,IAAI,GAAG;OAChB,OAAQ,GAAkC,CAAC,OAAO,KAAK,UAAU,CAAC;AAHzD,QAAA,2BAA2B,+BAG8B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IEventStorageWriter.js","sourceRoot":"","sources":["../../../src/interfaces/IEventStorageWriter.ts"],"names":[],"mappings":";;;AACA,+CAAyC;
|
|
1
|
+
{"version":3,"file":"IEventStorageWriter.js","sourceRoot":"","sources":["../../../src/interfaces/IEventStorageWriter.ts"],"names":[],"mappings":";;;AACA,+CAAyC;AAWlC,MAAM,oBAAoB,GAAG,CAAC,GAAY,EAA8B,EAAE,CAChF,IAAA,sBAAQ,EAAC,GAAG,CAAC;OACV,cAAc,IAAI,GAAG;OACrB,OAAO,GAAG,CAAC,YAAY,KAAK,UAAU,CAAC;AAH9B,QAAA,oBAAoB,wBAGU"}
|
|
@@ -16,6 +16,22 @@ export class AbstractAggregate {
|
|
|
16
16
|
static get handles() {
|
|
17
17
|
return getMessageHandlerNames(this);
|
|
18
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* Optional list of event types that are required to restore the aggregate state.
|
|
21
|
+
*
|
|
22
|
+
* @see IAggregateConstructor
|
|
23
|
+
*/
|
|
24
|
+
static get restoresFrom() {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Defines retry behavior when a ConcurrencyError is thrown during event dispatch.
|
|
29
|
+
*
|
|
30
|
+
* @see IAggregateConstructor
|
|
31
|
+
*/
|
|
32
|
+
static get retryOnConcurrencyError() {
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
19
35
|
/**
|
|
20
36
|
* Convenience helper to create an `AggregateCommandHandler` for this aggregate type and
|
|
21
37
|
* subscribe it to the provided `commandBus`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractAggregate.js","sourceRoot":"","sources":["../../src/AbstractAggregate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,
|
|
1
|
+
{"version":3,"file":"AbstractAggregate.js","sourceRoot":"","sources":["../../src/AbstractAggregate.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,13 +7,15 @@ function normalizeRetryResolver(value) {
|
|
|
7
7
|
return value;
|
|
8
8
|
if (value === false)
|
|
9
9
|
return () => false;
|
|
10
|
+
if (value === 'ignore')
|
|
11
|
+
return () => 'ignore';
|
|
10
12
|
if (typeof value === 'number')
|
|
11
|
-
return (err, attempt) => err instanceof ConcurrencyError && attempt < value;
|
|
13
|
+
return (err, events, attempt) => err instanceof ConcurrencyError && attempt < value;
|
|
12
14
|
if (isObject(value)) {
|
|
13
15
|
const { maxRetries = DEFAULT_MAX_RETRY_ATTEMPTS, ignoreAfterMaxRetries = false } = value;
|
|
14
16
|
assertNonNegativeInteger(maxRetries, 'retryOnConcurrencyError.maxRetries');
|
|
15
17
|
assertBoolean(ignoreAfterMaxRetries, 'retryOnConcurrencyError.ignoreAfterMaxRetries');
|
|
16
|
-
return (err, attempt) => {
|
|
18
|
+
return (err, events, attempt) => {
|
|
17
19
|
if (!(err instanceof ConcurrencyError))
|
|
18
20
|
return false;
|
|
19
21
|
if (attempt < maxRetries)
|
|
@@ -22,7 +24,7 @@ function normalizeRetryResolver(value) {
|
|
|
22
24
|
};
|
|
23
25
|
}
|
|
24
26
|
// undefined or true — default behavior
|
|
25
|
-
return (err, attempt) => err instanceof ConcurrencyError && attempt < DEFAULT_MAX_RETRY_ATTEMPTS;
|
|
27
|
+
return (err, events, attempt) => err instanceof ConcurrencyError && attempt < DEFAULT_MAX_RETRY_ATTEMPTS;
|
|
26
28
|
}
|
|
27
29
|
/**
|
|
28
30
|
* Aggregate command handler.
|
|
@@ -113,7 +115,7 @@ export class AggregateCommandHandler {
|
|
|
113
115
|
try {
|
|
114
116
|
for (let attempt = 0;; attempt++) {
|
|
115
117
|
if (attempt > 0)
|
|
116
|
-
this.#logger?.
|
|
118
|
+
this.#logger?.warn(`retrying "${cmd.type}" command on aggregate ${aggregateId}, attempt ${attempt + 1}`);
|
|
117
119
|
// Read the current cache entry after acquiring the lock. On the first attempt
|
|
118
120
|
// this is the pre-warmed (possibly shared) instance; on retries it is the
|
|
119
121
|
// fresh instance placed into the cache by the error handler below.
|
|
@@ -134,11 +136,11 @@ export class AggregateCommandHandler {
|
|
|
134
136
|
// queued on the lock start from a clean state.
|
|
135
137
|
if (aggregateId)
|
|
136
138
|
this.#aggregatesCache.set(aggregateId, this.#restoreAggregate(aggregateId));
|
|
137
|
-
const retryDecision = this.#shouldRetry(err, attempt);
|
|
139
|
+
const retryDecision = this.#shouldRetry(err, events, attempt);
|
|
138
140
|
if (!retryDecision)
|
|
139
141
|
throw err;
|
|
140
142
|
if (retryDecision === 'ignore' && events?.length) {
|
|
141
|
-
this.#logger?.
|
|
143
|
+
this.#logger?.warn(`"${cmd.type}" concurrency error ignored after ${attempt + 1} attempt(s), force-dispatching`);
|
|
142
144
|
await this.#eventStore.dispatch(events, { ignoreConcurrencyError: true });
|
|
143
145
|
return events;
|
|
144
146
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AggregateCommandHandler.js","sourceRoot":"","sources":["../../src/AggregateCommandHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,wBAAwB,EAAE,gBAAgB,EACpG,IAAI,EAAE,aAAa,EACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAmBrD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEpD,MAAM,0BAA0B,GAAG,CAAC,CAAC;AAErC,SAAS,sBAAsB,
|
|
1
|
+
{"version":3,"file":"AggregateCommandHandler.js","sourceRoot":"","sources":["../../src/AggregateCommandHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -69,7 +69,10 @@ export class CqrsContainerBuilder extends ContainerBuilder {
|
|
|
69
69
|
const commandHandlerFactory = (container) => container.createInstance(AggregateCommandHandler, {
|
|
70
70
|
aggregateFactory: (options) => container.createInstance(AggregateType, options),
|
|
71
71
|
handles: AggregateType.handles,
|
|
72
|
-
restoresFrom: AggregateType.restoresFrom
|
|
72
|
+
restoresFrom: AggregateType.restoresFrom,
|
|
73
|
+
...AggregateType.retryOnConcurrencyError !== undefined && {
|
|
74
|
+
retryOnConcurrencyError: AggregateType.retryOnConcurrencyError
|
|
75
|
+
}
|
|
73
76
|
});
|
|
74
77
|
return this.registerCommandHandler(commandHandlerFactory);
|
|
75
78
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CqrsContainerBuilder.js","sourceRoot":"","sources":["../../src/CqrsContainerBuilder.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"CqrsContainerBuilder.js","sourceRoot":"","sources":["../../src/CqrsContainerBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -92,8 +92,7 @@ export class InMemoryEventStorage {
|
|
|
92
92
|
throw new Error('Event batch does not contain `event`');
|
|
93
93
|
events.push(event);
|
|
94
94
|
}
|
|
95
|
-
|
|
96
|
-
if (ignoreConcurrencyError)
|
|
95
|
+
if (batch.at(0)?.ignoreConcurrencyError)
|
|
97
96
|
await this.commitEvents(events, { ignoreConcurrencyError: true });
|
|
98
97
|
else
|
|
99
98
|
await this.commitEvents(events);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InMemoryEventStorage.js","sourceRoot":"","sources":["../../../src/in-memory/InMemoryEventStorage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"InMemoryEventStorage.js","sourceRoot":"","sources":["../../../src/in-memory/InMemoryEventStorage.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD;;;GAGG;AACH,MAAM,OAAO,oBAAoB;IAMhC,OAAO,GAAW,CAAC,CAAC;IACpB,OAAO,GAAc,EAAE,CAAC;IAExB,QAAQ;QACP,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;QAClB,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAiB,EAAE,OAA8C;QACnF,MAAM,SAAS,EAAE,CAAC;QAElB,IAAI,CAAC,OAAO,EAAE,sBAAsB,EAAE,CAAC;YACtC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC5B,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,IAAI,KAAK,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;oBAC7E,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CACtC,CAAC,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW;wBACnC,CAAC,CAAC,gBAAgB,KAAK,KAAK,CAAC,gBAAgB,CAAC,CAAC;oBAChD,IAAI,QAAQ;wBACX,MAAM,IAAI,gBAAgB,CAAC,8BAA8B,KAAK,CAAC,gBAAgB,kBAAkB,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;gBACxH,CAAC;YACF,CAAC;QACF,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAE3C,MAAM,SAAS,EAAE,CAAC;QAElB,OAAO,MAAM,CAAC;IACf,CAAC;IAED,KAAK,CAAA,CAAE,kBAAkB,CAAC,WAAuB,EAAE,OAAoC;QACtF,MAAM,SAAS,EAAE,CAAC;QAElB,MAAM,YAAY,GAAG,OAAO,EAAE,QAAQ,EAAE,gBAAgB,CAAC;QACzD,MAAM,gBAAgB,GAAG,CAAC,YAAY,CAAC,CAAC;YACvC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC;YACzD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACvB,CAAC,CAAC,WAAW,KAAK,WAAW;gBAC7B,CAAC,CAAC,gBAAgB,KAAK,SAAS;gBAChC,CAAC,CAAC,gBAAgB,GAAG,YAAY,CAAC,CAAC;QAErC,MAAM,OAAO,GAAG,OAAO,EAAE,UAAU,KAAK,SAAS,CAAC,CAAC;YAClD,gBAAgB,CAAC,CAAC;YAClB,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,UAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAEpE,MAAM,SAAS,EAAE,CAAC;QAElB,KAAK,CAAC,CAAC,OAAO,CAAC;QAEf,IAAI,OAAO,EAAE,IAAI,KAAK,MAAM,IAAI,gBAAgB,CAAC,MAAM,EAAE,CAAC;YACzD,MAAM,SAAS,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAChE,MAAM,kBAAkB,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,SAAS,CAAC;YACvF,IAAI,CAAC,kBAAkB;gBACtB,MAAM,SAAS,CAAC;QAClB,CAAC;IACF,CAAC;IAED,KAAK,CAAA,CAAE,aAAa,CAAC,MAAkB,EAAE,EAAE,WAAW,EAA2B;QAChF,MAAM,SAAS,EAAE,CAAC;QAElB,YAAY,CAAC,WAAW,EAAE,EAAE,EAAE,gBAAgB,CAAC,CAAC;QAEhD,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QAC9D,IAAI,WAAW,CAAC,WAAW,EAAE,CAAC,cAAc,CAAC,KAAK,aAAa;YAC9D,MAAM,IAAI,SAAS,CAAC,+CAA+C,CAAC,CAAC;QAEtE,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,aAAa,CAAC,CAAC;QACzE,IAAI,YAAY,KAAK,CAAC,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,gBAAgB,aAAa,YAAY,CAAC,CAAC;QAE5D,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,WAAW,CAAC,EAAE,CAAC,CAAC;QAC/E,IAAI,iBAAiB,KAAK,CAAC,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,eAAe,WAAW,CAAC,EAAE,YAAY,CAAC,CAAC;QAE5D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO;aAC1B,KAAK,CAAC,YAAY,EAAE,iBAAiB,CAAC;aACtC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,cAAc,CAAC,KAAK,aAAa,CAAC,CAAC;QAEjE,MAAM,SAAS,EAAE,CAAC;QAElB,KAAK,CAAC,CAAC,OAAO,CAAC;IAChB,CAAC;IAED,KAAK,CAAA,CAAE,gBAAgB,CAAC,UAA8B,EAAE,OAAyB;QAChF,MAAM,SAAS,EAAE,CAAC;QAElB,MAAM,WAAW,GAAG,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC;QAC5C,IAAI,OAAO,EAAE,UAAU;YACtB,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,uBAAuB,CAAC,CAAC;QAE9D,IAAI,WAAW,GAAG,CAAC,WAAW,CAAC;QAC/B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,CAAC,WAAW;gBACf,WAAW,GAAG,KAAK,CAAC,EAAE,KAAK,WAAW,CAAC;iBACnC,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;gBACtD,MAAM,KAAK,CAAC;QACd,CAAC;IACF,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,OAAO,CAAC,KAA4B;QACzC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,KAAK,EAAE,CAAC;YAC/B,IAAI,CAAC,KAAK;gBACT,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;YAEzD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;QAED,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,sBAAsB;YACtC,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,sBAAsB,EAAE,IAAI,EAAE,CAAC,CAAC;;YAElE,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAEjC,OAAO,KAAK,CAAC;IACd,CAAC;CACD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IDispatchPipelineProcessor.js","sourceRoot":"","sources":["../../../src/interfaces/IDispatchPipelineProcessor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"IDispatchPipelineProcessor.js","sourceRoot":"","sources":["../../../src/interfaces/IDispatchPipelineProcessor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAmCzC,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,GAAY,EAAqC,EAAE,CAC9F,QAAQ,CAAC,GAAG,CAAC;OACV,SAAS,IAAI,GAAG;OAChB,OAAQ,GAAkC,CAAC,OAAO,KAAK,UAAU,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IEventStorageWriter.js","sourceRoot":"","sources":["../../../src/interfaces/IEventStorageWriter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"IEventStorageWriter.js","sourceRoot":"","sources":["../../../src/interfaces/IEventStorageWriter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAWzC,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,GAAY,EAA8B,EAAE,CAChF,QAAQ,CAAC,GAAG,CAAC;OACV,cAAc,IAAI,GAAG;OACrB,OAAO,GAAG,CAAC,YAAY,KAAK,UAAU,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "node-cqrs",
|
|
3
|
-
"version": "1.0.0-rc.
|
|
3
|
+
"version": "1.0.0-rc.40",
|
|
4
4
|
"description": "Infrastructure-agnostic building blocks for CQRS/ES",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"keywords": [
|
|
@@ -84,7 +84,7 @@
|
|
|
84
84
|
"dependencies": {
|
|
85
85
|
"async-iterable-buffer": "^1.1.0",
|
|
86
86
|
"async-parallel-pipe": "^1.0.2",
|
|
87
|
-
"di0": "^1.3.0-
|
|
87
|
+
"di0": "^1.3.0-5"
|
|
88
88
|
},
|
|
89
89
|
"devDependencies": {
|
|
90
90
|
"@types/amqplib": "^0.10.8",
|
package/src/AbstractAggregate.ts
CHANGED
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
type IAggregateConstructor,
|
|
12
12
|
type IEventStore,
|
|
13
13
|
type ICommandBus,
|
|
14
|
+
type RetryOnConcurrencyErrorOptions,
|
|
14
15
|
SNAPSHOT_EVENT_TYPE
|
|
15
16
|
} from './interfaces/index.ts';
|
|
16
17
|
|
|
@@ -47,6 +48,24 @@ export abstract class AbstractAggregate<TState extends IMutableState | object |
|
|
|
47
48
|
return getMessageHandlerNames(this);
|
|
48
49
|
}
|
|
49
50
|
|
|
51
|
+
/**
|
|
52
|
+
* Optional list of event types that are required to restore the aggregate state.
|
|
53
|
+
*
|
|
54
|
+
* @see IAggregateConstructor
|
|
55
|
+
*/
|
|
56
|
+
static get restoresFrom(): Readonly<string[]> | undefined {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Defines retry behavior when a ConcurrencyError is thrown during event dispatch.
|
|
62
|
+
*
|
|
63
|
+
* @see IAggregateConstructor
|
|
64
|
+
*/
|
|
65
|
+
static get retryOnConcurrencyError(): RetryOnConcurrencyErrorOptions | undefined {
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
|
|
50
69
|
/**
|
|
51
70
|
* Convenience helper to create an `AggregateCommandHandler` for this aggregate type and
|
|
52
71
|
* subscribe it to the provided `commandBus`.
|
|
@@ -17,30 +17,30 @@ import type {
|
|
|
17
17
|
ILocker,
|
|
18
18
|
ILogger,
|
|
19
19
|
IObservable,
|
|
20
|
-
RetryOnConcurrencyErrorConfig,
|
|
21
20
|
RetryOnConcurrencyErrorDecision,
|
|
21
|
+
RetryOnConcurrencyErrorOptions,
|
|
22
22
|
RetryOnConcurrencyErrorResolver
|
|
23
23
|
} from './interfaces/index.ts';
|
|
24
24
|
import { isObject } from './interfaces/isObject.ts';
|
|
25
25
|
|
|
26
26
|
const DEFAULT_MAX_RETRY_ATTEMPTS = 5;
|
|
27
27
|
|
|
28
|
-
function normalizeRetryResolver(
|
|
29
|
-
value: boolean | number | RetryOnConcurrencyErrorConfig | RetryOnConcurrencyErrorResolver | undefined
|
|
30
|
-
): RetryOnConcurrencyErrorResolver {
|
|
28
|
+
function normalizeRetryResolver(value?: RetryOnConcurrencyErrorOptions): RetryOnConcurrencyErrorResolver {
|
|
31
29
|
if (typeof value === 'function')
|
|
32
30
|
return value;
|
|
33
31
|
if (value === false)
|
|
34
32
|
return () => false;
|
|
33
|
+
if (value === 'ignore')
|
|
34
|
+
return () => 'ignore';
|
|
35
35
|
if (typeof value === 'number')
|
|
36
|
-
return (err, attempt) => err instanceof ConcurrencyError && attempt < value;
|
|
36
|
+
return (err, events, attempt) => err instanceof ConcurrencyError && attempt < value;
|
|
37
37
|
|
|
38
38
|
if (isObject(value)) {
|
|
39
39
|
const { maxRetries = DEFAULT_MAX_RETRY_ATTEMPTS, ignoreAfterMaxRetries = false } = value;
|
|
40
40
|
assertNonNegativeInteger(maxRetries, 'retryOnConcurrencyError.maxRetries');
|
|
41
41
|
assertBoolean(ignoreAfterMaxRetries, 'retryOnConcurrencyError.ignoreAfterMaxRetries');
|
|
42
42
|
|
|
43
|
-
return (err, attempt): RetryOnConcurrencyErrorDecision => {
|
|
43
|
+
return (err, events, attempt): RetryOnConcurrencyErrorDecision => {
|
|
44
44
|
if (!(err instanceof ConcurrencyError))
|
|
45
45
|
return false;
|
|
46
46
|
|
|
@@ -52,7 +52,8 @@ function normalizeRetryResolver(
|
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
// undefined or true — default behavior
|
|
55
|
-
return (err, attempt) =>
|
|
55
|
+
return (err, events, attempt) =>
|
|
56
|
+
err instanceof ConcurrencyError && attempt < DEFAULT_MAX_RETRY_ATTEMPTS;
|
|
56
57
|
}
|
|
57
58
|
|
|
58
59
|
/**
|
|
@@ -91,7 +92,7 @@ export class AggregateCommandHandler<TAggregate extends IAggregate> implements I
|
|
|
91
92
|
aggregateFactory?: IAggregateFactory<TAggregate, any>,
|
|
92
93
|
handles?: Readonly<string[]>,
|
|
93
94
|
restoresFrom?: Readonly<string[]>,
|
|
94
|
-
retryOnConcurrencyError?:
|
|
95
|
+
retryOnConcurrencyError?: RetryOnConcurrencyErrorOptions
|
|
95
96
|
}) {
|
|
96
97
|
assertDefined(eventStore, 'eventStore');
|
|
97
98
|
|
|
@@ -182,7 +183,7 @@ export class AggregateCommandHandler<TAggregate extends IAggregate> implements I
|
|
|
182
183
|
try {
|
|
183
184
|
for (let attempt = 0; ; attempt++) {
|
|
184
185
|
if (attempt > 0)
|
|
185
|
-
this.#logger?.
|
|
186
|
+
this.#logger?.warn(`retrying "${cmd.type}" command on aggregate ${aggregateId}, attempt ${attempt + 1}`);
|
|
186
187
|
|
|
187
188
|
// Read the current cache entry after acquiring the lock. On the first attempt
|
|
188
189
|
// this is the pre-warmed (possibly shared) instance; on retries it is the
|
|
@@ -209,12 +210,12 @@ export class AggregateCommandHandler<TAggregate extends IAggregate> implements I
|
|
|
209
210
|
if (aggregateId)
|
|
210
211
|
this.#aggregatesCache.set(aggregateId, this.#restoreAggregate(aggregateId));
|
|
211
212
|
|
|
212
|
-
const retryDecision = this.#shouldRetry(err, attempt);
|
|
213
|
+
const retryDecision = this.#shouldRetry(err, events, attempt);
|
|
213
214
|
if (!retryDecision)
|
|
214
215
|
throw err;
|
|
215
216
|
|
|
216
217
|
if (retryDecision === 'ignore' && events?.length) {
|
|
217
|
-
this.#logger?.
|
|
218
|
+
this.#logger?.warn(`"${cmd.type}" concurrency error ignored after ${attempt + 1} attempt(s), force-dispatching`);
|
|
218
219
|
await this.#eventStore.dispatch(events, { ignoreConcurrencyError: true });
|
|
219
220
|
return events;
|
|
220
221
|
}
|
|
@@ -110,7 +110,10 @@ export class CqrsContainerBuilder<TContainerInterface extends IContainer = ICont
|
|
|
110
110
|
aggregateFactory: (options: any) =>
|
|
111
111
|
container.createInstance(AggregateType, options),
|
|
112
112
|
handles: AggregateType.handles,
|
|
113
|
-
restoresFrom: AggregateType.restoresFrom
|
|
113
|
+
restoresFrom: AggregateType.restoresFrom,
|
|
114
|
+
...AggregateType.retryOnConcurrencyError !== undefined && {
|
|
115
|
+
retryOnConcurrencyError: AggregateType.retryOnConcurrencyError
|
|
116
|
+
}
|
|
114
117
|
});
|
|
115
118
|
|
|
116
119
|
return this.registerCommandHandler(commandHandlerFactory);
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type {
|
|
2
|
-
CommitEventsOptions,
|
|
3
2
|
IIdentifierProvider,
|
|
4
3
|
IEvent,
|
|
5
4
|
IEventSet,
|
|
@@ -9,7 +8,6 @@ import type {
|
|
|
9
8
|
IEventStorageWriter,
|
|
10
9
|
Identifier,
|
|
11
10
|
IDispatchPipelineProcessor,
|
|
12
|
-
DispatchPipelineEnvelope,
|
|
13
11
|
DispatchPipelineBatch,
|
|
14
12
|
AggregateEventsQueryParams
|
|
15
13
|
} from '../interfaces/index.ts';
|
|
@@ -35,7 +33,7 @@ export class InMemoryEventStorage implements
|
|
|
35
33
|
return String(this.#nextId);
|
|
36
34
|
}
|
|
37
35
|
|
|
38
|
-
async commitEvents(events: IEventSet, options?:
|
|
36
|
+
async commitEvents(events: IEventSet, options?: { ignoreConcurrencyError?: boolean }): Promise<IEventSet> {
|
|
39
37
|
await nextCycle();
|
|
40
38
|
|
|
41
39
|
if (!options?.ignoreConcurrencyError) {
|
|
@@ -132,8 +130,7 @@ export class InMemoryEventStorage implements
|
|
|
132
130
|
*
|
|
133
131
|
* This method is part of the `IDispatchPipelineProcessor` interface.
|
|
134
132
|
*/
|
|
135
|
-
async process(batch: DispatchPipelineBatch<
|
|
136
|
-
Promise<DispatchPipelineBatch> {
|
|
133
|
+
async process(batch: DispatchPipelineBatch): Promise<DispatchPipelineBatch> {
|
|
137
134
|
const events: IEvent[] = [];
|
|
138
135
|
for (const { event } of batch) {
|
|
139
136
|
if (!event)
|
|
@@ -142,8 +139,7 @@ export class InMemoryEventStorage implements
|
|
|
142
139
|
events.push(event);
|
|
143
140
|
}
|
|
144
141
|
|
|
145
|
-
|
|
146
|
-
if (ignoreConcurrencyError)
|
|
142
|
+
if (batch.at(0)?.ignoreConcurrencyError)
|
|
147
143
|
await this.commitEvents(events, { ignoreConcurrencyError: true });
|
|
148
144
|
else
|
|
149
145
|
await this.commitEvents(events);
|
|
@@ -50,13 +50,19 @@ export type IAggregateConstructorParams<TState extends IMutableState | object |
|
|
|
50
50
|
export type RetryOnConcurrencyErrorDecision = boolean | 'ignore';
|
|
51
51
|
|
|
52
52
|
export type RetryOnConcurrencyErrorResolver =
|
|
53
|
-
(err: unknown, attempt: number) => RetryOnConcurrencyErrorDecision;
|
|
53
|
+
(err: unknown, events: IEventSet | undefined, attempt: number) => RetryOnConcurrencyErrorDecision;
|
|
54
54
|
|
|
55
55
|
export type RetryOnConcurrencyErrorConfig = {
|
|
56
56
|
maxRetries?: number;
|
|
57
57
|
ignoreAfterMaxRetries?: boolean;
|
|
58
58
|
};
|
|
59
59
|
|
|
60
|
+
export type RetryOnConcurrencyErrorOptions =
|
|
61
|
+
RetryOnConcurrencyErrorDecision |
|
|
62
|
+
RetryOnConcurrencyErrorConfig |
|
|
63
|
+
RetryOnConcurrencyErrorResolver |
|
|
64
|
+
number;
|
|
65
|
+
|
|
60
66
|
export interface IAggregateConstructor<
|
|
61
67
|
TAggregate extends IAggregate,
|
|
62
68
|
TState extends IMutableState | object | void
|
|
@@ -83,17 +89,12 @@ export interface IAggregateConstructor<
|
|
|
83
89
|
* - `undefined` (default): retry up to 5 times on ConcurrencyError
|
|
84
90
|
* - `false`: no retry
|
|
85
91
|
* - `true`: retry up to 5 times on ConcurrencyError
|
|
86
|
-
* - `number`: retry up to the specified number of times
|
|
87
|
-
* - `
|
|
88
|
-
* and optional ignore on exhaustion
|
|
92
|
+
* - `number`: retry up to the specified number of times on ConcurrencyError
|
|
93
|
+
* - `{ maxRetries?: number, ignoreAfterMaxRetries?: boolean }`: configure retries
|
|
89
94
|
* - `(err, attempt) => RetryOnConcurrencyErrorDecision`:
|
|
90
95
|
* custom function to decide whether to retry (`true`), stop (`false`) or ignore (`'ignore'`)
|
|
91
96
|
*/
|
|
92
|
-
readonly retryOnConcurrencyError?:
|
|
93
|
-
| boolean
|
|
94
|
-
| number
|
|
95
|
-
| RetryOnConcurrencyErrorConfig
|
|
96
|
-
| RetryOnConcurrencyErrorResolver;
|
|
97
|
+
readonly retryOnConcurrencyError?: RetryOnConcurrencyErrorOptions;
|
|
97
98
|
|
|
98
99
|
new(options: IAggregateConstructorParams<TState>): TAggregate;
|
|
99
100
|
}
|
|
@@ -1,17 +1,13 @@
|
|
|
1
1
|
import type { IEventSet } from './IEventSet.ts';
|
|
2
2
|
import { isObject } from './isObject.ts';
|
|
3
3
|
|
|
4
|
-
export type CommitEventsOptions = {
|
|
5
|
-
ignoreConcurrencyError?: boolean;
|
|
6
|
-
};
|
|
7
|
-
|
|
8
4
|
export interface IEventStorageWriter {
|
|
9
5
|
|
|
10
6
|
/**
|
|
11
7
|
* Persists a set of events to the event store.
|
|
12
8
|
* Returns the persisted event set (potentially enriched or normalized).
|
|
13
9
|
*/
|
|
14
|
-
commitEvents(events: IEventSet
|
|
10
|
+
commitEvents(events: IEventSet): Promise<IEventSet>;
|
|
15
11
|
}
|
|
16
12
|
|
|
17
13
|
export const isEventStorageWriter = (obj: unknown): obj is IEventStorageWriter =>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AggregateCommandHandler } from './AggregateCommandHandler.ts';
|
|
2
|
-
import { type IAggregate, type IMutableState, type ICommand, type Identifier, type IEvent, type IEventSet, type IAggregateConstructorParams, type ISnapshotEvent, type IAggregateConstructor, type IEventStore, type ICommandBus } from './interfaces/index.ts';
|
|
2
|
+
import { type IAggregate, type IMutableState, type ICommand, type Identifier, type IEvent, type IEventSet, type IAggregateConstructorParams, type ISnapshotEvent, type IAggregateConstructor, type IEventStore, type ICommandBus, type RetryOnConcurrencyErrorOptions } from './interfaces/index.ts';
|
|
3
3
|
/**
|
|
4
4
|
* Base class for Aggregate definition
|
|
5
5
|
*/
|
|
@@ -14,6 +14,18 @@ export declare abstract class AbstractAggregate<TState extends IMutableState | o
|
|
|
14
14
|
* @example ['createUser', 'changePassword'];
|
|
15
15
|
*/
|
|
16
16
|
static get handles(): string[];
|
|
17
|
+
/**
|
|
18
|
+
* Optional list of event types that are required to restore the aggregate state.
|
|
19
|
+
*
|
|
20
|
+
* @see IAggregateConstructor
|
|
21
|
+
*/
|
|
22
|
+
static get restoresFrom(): Readonly<string[]> | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* Defines retry behavior when a ConcurrencyError is thrown during event dispatch.
|
|
25
|
+
*
|
|
26
|
+
* @see IAggregateConstructor
|
|
27
|
+
*/
|
|
28
|
+
static get retryOnConcurrencyError(): RetryOnConcurrencyErrorOptions | undefined;
|
|
17
29
|
/**
|
|
18
30
|
* Convenience helper to create an `AggregateCommandHandler` for this aggregate type and
|
|
19
31
|
* subscribe it to the provided `commandBus`.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { IAggregate, IAggregateConstructor, IAggregateFactory, ICommand, ICommandHandler, IContainer, IEventSet, IObservable,
|
|
1
|
+
import type { IAggregate, IAggregateConstructor, IAggregateFactory, ICommand, ICommandHandler, IContainer, IEventSet, IObservable, RetryOnConcurrencyErrorOptions } from './interfaces/index.ts';
|
|
2
2
|
/**
|
|
3
3
|
* Aggregate command handler.
|
|
4
4
|
*
|
|
@@ -13,7 +13,7 @@ export declare class AggregateCommandHandler<TAggregate extends IAggregate> impl
|
|
|
13
13
|
aggregateFactory?: IAggregateFactory<TAggregate, any>;
|
|
14
14
|
handles?: Readonly<string[]>;
|
|
15
15
|
restoresFrom?: Readonly<string[]>;
|
|
16
|
-
retryOnConcurrencyError?:
|
|
16
|
+
retryOnConcurrencyError?: RetryOnConcurrencyErrorOptions;
|
|
17
17
|
});
|
|
18
18
|
/** Subscribe to all command types handled by aggregateType */
|
|
19
19
|
subscribe(commandBus: IObservable): void;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { IIdentifierProvider, IEvent, IEventSet, EventQueryAfter, IEventStorageReader, IEventStream, IEventStorageWriter, Identifier, IDispatchPipelineProcessor, DispatchPipelineBatch, AggregateEventsQueryParams } from '../interfaces/index.ts';
|
|
2
2
|
/**
|
|
3
3
|
* A simple event storage implementation intended to use for tests only.
|
|
4
4
|
* Storage content resets on each app restart.
|
|
@@ -6,7 +6,9 @@ import type { CommitEventsOptions, IIdentifierProvider, IEvent, IEventSet, Event
|
|
|
6
6
|
export declare class InMemoryEventStorage implements IEventStorageReader, IEventStorageWriter, IIdentifierProvider, IDispatchPipelineProcessor {
|
|
7
7
|
#private;
|
|
8
8
|
getNewId(): string;
|
|
9
|
-
commitEvents(events: IEventSet, options?:
|
|
9
|
+
commitEvents(events: IEventSet, options?: {
|
|
10
|
+
ignoreConcurrencyError?: boolean;
|
|
11
|
+
}): Promise<IEventSet>;
|
|
10
12
|
getAggregateEvents(aggregateId: Identifier, options?: AggregateEventsQueryParams): IEventStream;
|
|
11
13
|
getSagaEvents(sagaId: Identifier, { beforeEvent }: {
|
|
12
14
|
beforeEvent: IEvent;
|
|
@@ -18,7 +20,5 @@ export declare class InMemoryEventStorage implements IEventStorageReader, IEvent
|
|
|
18
20
|
*
|
|
19
21
|
* This method is part of the `IDispatchPipelineProcessor` interface.
|
|
20
22
|
*/
|
|
21
|
-
process(batch: DispatchPipelineBatch<
|
|
22
|
-
ignoreConcurrencyError?: boolean;
|
|
23
|
-
}>): Promise<DispatchPipelineBatch>;
|
|
23
|
+
process(batch: DispatchPipelineBatch): Promise<DispatchPipelineBatch>;
|
|
24
24
|
}
|
|
@@ -40,11 +40,12 @@ export type IAggregateConstructorParams<TState extends IMutableState | object |
|
|
|
40
40
|
state?: TState;
|
|
41
41
|
};
|
|
42
42
|
export type RetryOnConcurrencyErrorDecision = boolean | 'ignore';
|
|
43
|
-
export type RetryOnConcurrencyErrorResolver = (err: unknown, attempt: number) => RetryOnConcurrencyErrorDecision;
|
|
43
|
+
export type RetryOnConcurrencyErrorResolver = (err: unknown, events: IEventSet | undefined, attempt: number) => RetryOnConcurrencyErrorDecision;
|
|
44
44
|
export type RetryOnConcurrencyErrorConfig = {
|
|
45
45
|
maxRetries?: number;
|
|
46
46
|
ignoreAfterMaxRetries?: boolean;
|
|
47
47
|
};
|
|
48
|
+
export type RetryOnConcurrencyErrorOptions = RetryOnConcurrencyErrorDecision | RetryOnConcurrencyErrorConfig | RetryOnConcurrencyErrorResolver | number;
|
|
48
49
|
export interface IAggregateConstructor<TAggregate extends IAggregate, TState extends IMutableState | object | void> {
|
|
49
50
|
/**
|
|
50
51
|
* List of command types handled by the aggregate.
|
|
@@ -65,13 +66,12 @@ export interface IAggregateConstructor<TAggregate extends IAggregate, TState ext
|
|
|
65
66
|
* - `undefined` (default): retry up to 5 times on ConcurrencyError
|
|
66
67
|
* - `false`: no retry
|
|
67
68
|
* - `true`: retry up to 5 times on ConcurrencyError
|
|
68
|
-
* - `number`: retry up to the specified number of times
|
|
69
|
-
* - `
|
|
70
|
-
* and optional ignore on exhaustion
|
|
69
|
+
* - `number`: retry up to the specified number of times on ConcurrencyError
|
|
70
|
+
* - `{ maxRetries?: number, ignoreAfterMaxRetries?: boolean }`: configure retries
|
|
71
71
|
* - `(err, attempt) => RetryOnConcurrencyErrorDecision`:
|
|
72
72
|
* custom function to decide whether to retry (`true`), stop (`false`) or ignore (`'ignore'`)
|
|
73
73
|
*/
|
|
74
|
-
readonly retryOnConcurrencyError?:
|
|
74
|
+
readonly retryOnConcurrencyError?: RetryOnConcurrencyErrorOptions;
|
|
75
75
|
new (options: IAggregateConstructorParams<TState>): TAggregate;
|
|
76
76
|
}
|
|
77
77
|
export type IAggregateFactory<TAggregate extends IAggregate, TState extends IMutableState | object | void> = (options: IAggregateConstructorParams<TState>) => TAggregate;
|
|
@@ -8,6 +8,10 @@ export type DispatchPipelineEnvelope = {
|
|
|
8
8
|
* Origin of the event. Can be used to distinguish between events coming from different sources.
|
|
9
9
|
*/
|
|
10
10
|
origin?: string;
|
|
11
|
+
/**
|
|
12
|
+
* When true, storage writers may bypass optimistic-concurrency checks for this batch.
|
|
13
|
+
*/
|
|
14
|
+
ignoreConcurrencyError?: boolean;
|
|
11
15
|
event?: IEvent;
|
|
12
16
|
};
|
|
13
17
|
/**
|
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
import type { IEventSet } from './IEventSet.ts';
|
|
2
|
-
export type CommitEventsOptions = {
|
|
3
|
-
ignoreConcurrencyError?: boolean;
|
|
4
|
-
};
|
|
5
2
|
export interface IEventStorageWriter {
|
|
6
3
|
/**
|
|
7
4
|
* Persists a set of events to the event store.
|
|
8
5
|
* Returns the persisted event set (potentially enriched or normalized).
|
|
9
6
|
*/
|
|
10
|
-
commitEvents(events: IEventSet
|
|
7
|
+
commitEvents(events: IEventSet): Promise<IEventSet>;
|
|
11
8
|
}
|
|
12
9
|
export declare const isEventStorageWriter: (obj: unknown) => obj is IEventStorageWriter;
|