node-cqrs 1.0.0-rc.2 → 1.0.0-rc.20
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 +244 -83
- package/dist/AbstractAggregate.js +62 -40
- package/dist/AbstractAggregate.js.map +1 -1
- package/dist/AbstractProjection.js +64 -47
- package/dist/AbstractProjection.js.map +1 -1
- package/dist/AbstractSaga.js.map +1 -1
- package/dist/AggregateCommandHandler.js +44 -20
- package/dist/AggregateCommandHandler.js.map +1 -1
- package/dist/CommandBus.js +6 -10
- package/dist/CommandBus.js.map +1 -1
- package/dist/CqrsContainerBuilder.js +12 -3
- package/dist/CqrsContainerBuilder.js.map +1 -1
- package/dist/Event.js +0 -24
- package/dist/Event.js.map +1 -1
- package/dist/EventDispatchPipeline.js +81 -0
- package/dist/EventDispatchPipeline.js.map +1 -0
- package/dist/EventDispatcher.js +94 -0
- package/dist/EventDispatcher.js.map +1 -0
- package/dist/EventStore.js +63 -141
- package/dist/EventStore.js.map +1 -1
- package/dist/SagaEventHandler.js +3 -2
- package/dist/SagaEventHandler.js.map +1 -1
- package/dist/in-memory/InMemoryEventStorage.js +73 -0
- package/dist/in-memory/InMemoryEventStorage.js.map +1 -0
- package/dist/in-memory/InMemoryLock.js +40 -0
- package/dist/in-memory/InMemoryLock.js.map +1 -0
- package/dist/{infrastructure → in-memory}/InMemoryMessageBus.js +28 -27
- package/dist/in-memory/InMemoryMessageBus.js.map +1 -0
- package/dist/in-memory/InMemorySnapshotStorage.js +70 -0
- package/dist/in-memory/InMemorySnapshotStorage.js.map +1 -0
- package/dist/{infrastructure → in-memory}/InMemoryView.js +13 -9
- package/dist/in-memory/InMemoryView.js.map +1 -0
- package/dist/in-memory/index.js +22 -0
- package/dist/in-memory/index.js.map +1 -0
- package/dist/{infrastructure → in-memory}/utils/index.js +0 -1
- package/dist/in-memory/utils/index.js.map +1 -0
- package/dist/{infrastructure → in-memory}/utils/nextCycle.js +1 -1
- package/dist/in-memory/utils/nextCycle.js.map +1 -0
- package/dist/index.js +3 -8
- package/dist/index.js.map +1 -1
- package/dist/{interfaces.js → interfaces/IAggregate.js} +1 -2
- package/dist/interfaces/IAggregate.js.map +1 -0
- package/dist/interfaces/IAggregateSnapshotStorage.js +3 -0
- package/dist/interfaces/IAggregateSnapshotStorage.js.map +1 -0
- package/dist/interfaces/ICommand.js +3 -0
- package/dist/interfaces/ICommand.js.map +1 -0
- package/dist/interfaces/ICommandBus.js +3 -0
- package/dist/interfaces/ICommandBus.js.map +1 -0
- package/dist/interfaces/IContainer.js +3 -0
- package/dist/interfaces/IContainer.js.map +1 -0
- package/dist/interfaces/IDispatchPipelineProcessor.js +9 -0
- package/dist/interfaces/IDispatchPipelineProcessor.js.map +1 -0
- package/dist/interfaces/IEvent.js +10 -0
- package/dist/interfaces/IEvent.js.map +1 -0
- package/dist/interfaces/IEventBus.js +9 -0
- package/dist/interfaces/IEventBus.js.map +1 -0
- package/dist/interfaces/IEventDispatcher.js +3 -0
- package/dist/interfaces/IEventDispatcher.js.map +1 -0
- package/dist/interfaces/IEventLocker.js +10 -0
- package/dist/interfaces/IEventLocker.js.map +1 -0
- package/dist/interfaces/IEventReceptor.js +3 -0
- package/dist/interfaces/IEventReceptor.js.map +1 -0
- package/dist/interfaces/IEventSet.js +8 -0
- package/dist/interfaces/IEventSet.js.map +1 -0
- package/dist/interfaces/IEventStorageReader.js +13 -0
- package/dist/interfaces/IEventStorageReader.js.map +1 -0
- package/dist/interfaces/IEventStorageWriter.js +3 -0
- package/dist/interfaces/IEventStorageWriter.js.map +1 -0
- package/dist/interfaces/IEventStore.js +3 -0
- package/dist/interfaces/IEventStore.js.map +1 -0
- package/dist/interfaces/IEventStream.js +3 -0
- package/dist/interfaces/IEventStream.js.map +1 -0
- package/dist/interfaces/IIdentifierProvider.js +9 -0
- package/dist/interfaces/IIdentifierProvider.js.map +1 -0
- package/dist/interfaces/ILogger.js +3 -0
- package/dist/interfaces/ILogger.js.map +1 -0
- package/dist/interfaces/IMessage.js +9 -0
- package/dist/interfaces/IMessage.js.map +1 -0
- package/dist/interfaces/IMessageBus.js +3 -0
- package/dist/interfaces/IMessageBus.js.map +1 -0
- package/dist/interfaces/IObjectStorage.js +3 -0
- package/dist/interfaces/IObjectStorage.js.map +1 -0
- package/dist/interfaces/IObservable.js +11 -0
- package/dist/interfaces/IObservable.js.map +1 -0
- package/dist/interfaces/IObserver.js +3 -0
- package/dist/interfaces/IObserver.js.map +1 -0
- package/dist/interfaces/IProjection.js +3 -0
- package/dist/interfaces/IProjection.js.map +1 -0
- package/dist/interfaces/ISaga.js +3 -0
- package/dist/interfaces/ISaga.js.map +1 -0
- package/dist/interfaces/IViewLocker.js +17 -0
- package/dist/interfaces/IViewLocker.js.map +1 -0
- package/dist/interfaces/Identifier.js +3 -0
- package/dist/interfaces/Identifier.js.map +1 -0
- package/dist/interfaces/index.js +44 -0
- package/dist/interfaces/index.js.map +1 -0
- package/dist/interfaces/isObject.js +9 -0
- package/dist/interfaces/isObject.js.map +1 -0
- package/dist/rabbitmq/IContainer.js +3 -0
- package/dist/rabbitmq/IContainer.js.map +1 -0
- package/dist/rabbitmq/RabbitMqEventBus.js +89 -0
- package/dist/rabbitmq/RabbitMqEventBus.js.map +1 -0
- package/dist/rabbitmq/RabbitMqEventInjector.js +55 -0
- package/dist/rabbitmq/RabbitMqEventInjector.js.map +1 -0
- package/dist/rabbitmq/RabbitMqGateway.js +349 -0
- package/dist/rabbitmq/RabbitMqGateway.js.map +1 -0
- package/dist/rabbitmq/TerminationHandler.js +31 -0
- package/dist/rabbitmq/TerminationHandler.js.map +1 -0
- package/dist/rabbitmq/index.js +20 -0
- package/dist/rabbitmq/index.js.map +1 -0
- package/dist/sqlite/AbstractSqliteAccessor.js +50 -0
- package/dist/sqlite/AbstractSqliteAccessor.js.map +1 -0
- package/dist/sqlite/AbstractSqliteObjectProjection.js +26 -0
- package/dist/sqlite/AbstractSqliteObjectProjection.js.map +1 -0
- package/dist/sqlite/AbstractSqliteView.js +44 -0
- package/dist/sqlite/AbstractSqliteView.js.map +1 -0
- package/dist/sqlite/IContainer.js +3 -0
- package/dist/sqlite/IContainer.js.map +1 -0
- package/dist/sqlite/SqliteEventLocker.js +94 -0
- package/dist/sqlite/SqliteEventLocker.js.map +1 -0
- package/dist/sqlite/SqliteObjectStorage.js +113 -0
- package/dist/sqlite/SqliteObjectStorage.js.map +1 -0
- package/dist/sqlite/SqliteObjectView.js +46 -0
- package/dist/sqlite/SqliteObjectView.js.map +1 -0
- package/dist/sqlite/SqliteProjectionDataParams.js +3 -0
- package/dist/sqlite/SqliteProjectionDataParams.js.map +1 -0
- package/dist/sqlite/SqliteViewLocker.js +121 -0
- package/dist/sqlite/SqliteViewLocker.js.map +1 -0
- package/dist/sqlite/index.js +25 -0
- package/dist/sqlite/index.js.map +1 -0
- package/dist/sqlite/queries/eventLockTableInit.js +15 -0
- package/dist/sqlite/queries/eventLockTableInit.js.map +1 -0
- package/dist/sqlite/queries/index.js +19 -0
- package/dist/sqlite/queries/index.js.map +1 -0
- package/dist/sqlite/queries/viewLockTableInit.js +14 -0
- package/dist/sqlite/queries/viewLockTableInit.js.map +1 -0
- package/dist/sqlite/utils/getEventId.js +11 -0
- package/dist/sqlite/utils/getEventId.js.map +1 -0
- package/dist/sqlite/utils/guid.js +9 -0
- package/dist/sqlite/utils/guid.js.map +1 -0
- package/dist/sqlite/utils/index.js +19 -0
- package/dist/sqlite/utils/index.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/utils/Deferred.js.map +1 -0
- package/dist/utils/Lock.js +86 -0
- package/dist/utils/Lock.js.map +1 -0
- package/dist/utils/MapAssertable.js +30 -0
- package/dist/utils/MapAssertable.js.map +1 -0
- package/dist/utils/delay.js +13 -0
- package/dist/utils/delay.js.map +1 -0
- package/dist/utils/getHandler.js +2 -3
- package/dist/utils/getHandler.js.map +1 -1
- package/dist/utils/getMessageHandlerNames.js +2 -6
- package/dist/utils/getMessageHandlerNames.js.map +1 -1
- package/dist/utils/index.js +8 -3
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/iteratorToArray.js +10 -0
- package/dist/utils/iteratorToArray.js.map +1 -0
- package/dist/utils/notEmpty.js +6 -0
- package/dist/utils/notEmpty.js.map +1 -0
- package/dist/utils/setupOneTimeEmitterSubscription.js.map +1 -1
- package/dist/utils/subscribe.js +16 -4
- package/dist/utils/subscribe.js.map +1 -1
- package/dist/utils/validateHandlers.js.map +1 -1
- package/eslint.config.mjs +839 -0
- package/package.json +68 -30
- package/src/AbstractAggregate.ts +83 -56
- package/src/AbstractProjection.ts +107 -69
- package/src/AbstractSaga.ts +3 -3
- package/src/AggregateCommandHandler.ts +69 -46
- package/src/CommandBus.ts +14 -13
- package/src/CqrsContainerBuilder.ts +28 -29
- package/src/Event.ts +1 -26
- package/src/EventDispatchPipeline.ts +99 -0
- package/src/EventDispatcher.ts +126 -0
- package/src/EventStore.ts +93 -181
- package/src/SagaEventHandler.ts +7 -8
- package/src/in-memory/InMemoryEventStorage.ts +108 -0
- package/src/in-memory/InMemoryLock.ts +43 -0
- package/src/{infrastructure → in-memory}/InMemoryMessageBus.ts +34 -32
- package/src/in-memory/InMemorySnapshotStorage.ts +89 -0
- package/src/{infrastructure → in-memory}/InMemoryView.ts +23 -24
- package/src/in-memory/index.ts +5 -0
- package/src/{infrastructure → in-memory}/utils/index.ts +0 -1
- package/src/{infrastructure → in-memory}/utils/nextCycle.ts +1 -1
- package/src/index.ts +2 -7
- package/src/interfaces/IAggregate.ts +68 -0
- package/src/interfaces/IAggregateSnapshotStorage.ts +11 -0
- package/src/interfaces/ICommand.ts +3 -0
- package/src/interfaces/ICommandBus.ts +16 -0
- package/src/interfaces/IContainer.ts +33 -0
- package/src/interfaces/IDispatchPipelineProcessor.ts +35 -0
- package/src/interfaces/IEvent.ts +14 -0
- package/src/interfaces/IEventBus.ts +11 -0
- package/src/interfaces/IEventDispatcher.ts +7 -0
- package/src/interfaces/IEventLocker.ts +34 -0
- package/src/interfaces/IEventReceptor.ts +6 -0
- package/src/interfaces/IEventSet.ts +7 -0
- package/src/interfaces/IEventStorageReader.ts +44 -0
- package/src/interfaces/IEventStorageWriter.ts +10 -0
- package/src/interfaces/IEventStore.ts +13 -0
- package/src/interfaces/IEventStream.ts +3 -0
- package/src/interfaces/IIdentifierProvider.ts +17 -0
- package/src/interfaces/ILogger.ts +11 -0
- package/src/interfaces/IMessage.ts +22 -0
- package/src/interfaces/IMessageBus.ts +8 -0
- package/src/interfaces/IObjectStorage.ts +13 -0
- package/src/interfaces/IObservable.ts +31 -0
- package/src/interfaces/IObserver.ts +5 -0
- package/src/interfaces/IProjection.ts +20 -0
- package/src/interfaces/ISaga.ts +38 -0
- package/src/interfaces/IViewLocker.ts +46 -0
- package/src/interfaces/Identifier.ts +1 -0
- package/src/interfaces/index.ts +27 -0
- package/src/interfaces/isObject.ts +5 -0
- package/src/rabbitmq/IContainer.ts +16 -0
- package/src/rabbitmq/RabbitMqEventBus.ts +105 -0
- package/src/rabbitmq/RabbitMqEventInjector.ts +66 -0
- package/src/rabbitmq/RabbitMqGateway.ts +474 -0
- package/src/rabbitmq/TerminationHandler.ts +31 -0
- package/src/rabbitmq/index.ts +3 -0
- package/src/sqlite/AbstractSqliteAccessor.ts +58 -0
- package/src/sqlite/AbstractSqliteObjectProjection.ts +31 -0
- package/src/sqlite/AbstractSqliteView.ts +53 -0
- package/src/sqlite/IContainer.ts +8 -0
- package/src/sqlite/SqliteEventLocker.ts +137 -0
- package/src/sqlite/SqliteObjectStorage.ts +142 -0
- package/src/sqlite/SqliteObjectView.ts +58 -0
- package/src/sqlite/SqliteProjectionDataParams.ts +16 -0
- package/src/sqlite/SqliteViewLocker.ts +171 -0
- package/src/sqlite/index.ts +8 -0
- package/src/sqlite/queries/eventLockTableInit.ts +10 -0
- package/src/sqlite/queries/index.ts +2 -0
- package/src/sqlite/queries/viewLockTableInit.ts +9 -0
- package/src/sqlite/utils/getEventId.ts +8 -0
- package/src/sqlite/utils/guid.ts +4 -0
- package/src/sqlite/utils/index.ts +2 -0
- package/src/utils/Lock.ts +99 -0
- package/src/utils/MapAssertable.ts +30 -0
- package/src/utils/delay.ts +8 -0
- package/src/utils/getHandler.ts +4 -4
- package/src/utils/getMessageHandlerNames.ts +2 -8
- package/src/utils/index.ts +8 -3
- package/src/utils/iteratorToArray.ts +6 -0
- package/src/utils/notEmpty.ts +1 -0
- package/src/utils/setupOneTimeEmitterSubscription.ts +5 -3
- package/src/utils/subscribe.ts +20 -6
- package/src/utils/validateHandlers.ts +2 -1
- package/types/AbstractAggregate.d.ts +61 -0
- package/types/AbstractProjection.d.ts +60 -0
- package/types/AbstractSaga.d.ts +31 -0
- package/types/AggregateCommandHandler.d.ts +20 -0
- package/types/CommandBus.d.ts +27 -0
- package/types/CqrsContainerBuilder.d.ts +21 -0
- package/types/Event.d.ts +9 -0
- package/types/EventDispatchPipeline.d.ts +18 -0
- package/types/EventDispatcher.d.ts +39 -0
- package/types/EventStore.d.ts +34 -0
- package/types/SagaEventHandler.d.ts +21 -0
- package/types/in-memory/InMemoryEventStorage.d.ts +24 -0
- package/types/in-memory/InMemoryLock.d.ts +21 -0
- package/types/in-memory/InMemoryMessageBus.d.ts +36 -0
- package/types/in-memory/InMemorySnapshotStorage.d.ts +37 -0
- package/types/in-memory/InMemoryView.d.ts +53 -0
- package/types/in-memory/index.d.ts +5 -0
- package/types/in-memory/utils/index.d.ts +1 -0
- package/types/in-memory/utils/nextCycle.d.ts +4 -0
- package/types/index.d.ts +13 -0
- package/types/interfaces/IAggregate.d.ts +51 -0
- package/types/interfaces/IAggregateSnapshotStorage.d.ts +7 -0
- package/types/interfaces/ICommand.d.ts +2 -0
- package/types/interfaces/ICommandBus.d.ts +14 -0
- package/types/interfaces/IContainer.d.ts +27 -0
- package/types/interfaces/IDispatchPipelineProcessor.d.ts +25 -0
- package/types/interfaces/IEvent.d.ts +6 -0
- package/types/interfaces/IEventBus.d.ts +6 -0
- package/types/interfaces/IEventDispatcher.d.ts +6 -0
- package/types/interfaces/IEventLocker.d.ts +24 -0
- package/types/interfaces/IEventReceptor.d.ts +5 -0
- package/types/interfaces/IEventSet.d.ts +3 -0
- package/types/interfaces/IEventStorageReader.d.ts +28 -0
- package/types/interfaces/IEventStorageWriter.d.ts +8 -0
- package/types/interfaces/IEventStore.d.ts +9 -0
- package/types/interfaces/IEventStream.d.ts +2 -0
- package/types/interfaces/IIdentifierProvider.d.ts +10 -0
- package/types/interfaces/ILogger.d.ts +22 -0
- package/types/interfaces/IMessage.d.ts +12 -0
- package/types/interfaces/IMessageBus.d.ts +7 -0
- package/types/interfaces/IObjectStorage.d.ts +8 -0
- package/types/interfaces/IObservable.d.ts +19 -0
- package/types/interfaces/IObserver.d.ts +4 -0
- package/types/interfaces/IProjection.d.ts +17 -0
- package/types/interfaces/ISaga.d.ts +30 -0
- package/types/interfaces/IViewLocker.d.ts +34 -0
- package/types/interfaces/Identifier.d.ts +1 -0
- package/types/interfaces/index.d.ts +27 -0
- package/types/interfaces/isObject.d.ts +1 -0
- package/types/rabbitmq/IContainer.d.ts +14 -0
- package/types/rabbitmq/RabbitMqEventBus.d.ts +42 -0
- package/types/rabbitmq/RabbitMqEventInjector.d.ts +13 -0
- package/types/rabbitmq/RabbitMqGateway.d.ts +79 -0
- package/types/rabbitmq/TerminationHandler.d.ts +10 -0
- package/types/rabbitmq/index.d.ts +3 -0
- package/types/sqlite/AbstractSqliteAccessor.d.ts +25 -0
- package/types/sqlite/AbstractSqliteObjectProjection.d.ts +8 -0
- package/types/sqlite/AbstractSqliteView.d.ts +18 -0
- package/types/sqlite/IContainer.d.ts +7 -0
- package/types/sqlite/SqliteEventLocker.d.ts +28 -0
- package/types/sqlite/SqliteObjectStorage.d.ts +16 -0
- package/types/sqlite/SqliteObjectView.d.ts +16 -0
- package/types/sqlite/SqliteProjectionDataParams.d.ts +14 -0
- package/types/sqlite/SqliteViewLocker.d.ts +30 -0
- package/types/sqlite/index.d.ts +8 -0
- package/types/sqlite/queries/eventLockTableInit.d.ts +1 -0
- package/types/sqlite/queries/index.d.ts +2 -0
- package/types/sqlite/queries/viewLockTableInit.d.ts +1 -0
- package/types/sqlite/utils/getEventId.d.ts +5 -0
- package/types/sqlite/utils/guid.d.ts +4 -0
- package/types/sqlite/utils/index.d.ts +2 -0
- package/types/utils/Deferred.d.ts +13 -0
- package/types/utils/Lock.d.ts +22 -0
- package/types/utils/MapAssertable.d.ts +11 -0
- package/types/utils/delay.d.ts +5 -0
- package/types/utils/getClassName.d.ts +4 -0
- package/types/utils/getHandler.d.ts +7 -0
- package/types/utils/getMessageHandlerNames.d.ts +5 -0
- package/types/utils/index.d.ts +13 -0
- package/types/utils/isClass.d.ts +1 -0
- package/types/utils/iteratorToArray.d.ts +1 -0
- package/types/utils/notEmpty.d.ts +1 -0
- package/types/utils/setupOneTimeEmitterSubscription.d.ts +12 -0
- package/types/utils/subscribe.d.ts +13 -0
- package/types/utils/validateHandlers.d.ts +4 -0
- package/dist/infrastructure/InMemoryEventStorage.js +0 -53
- package/dist/infrastructure/InMemoryEventStorage.js.map +0 -1
- package/dist/infrastructure/InMemoryLock.js +0 -68
- package/dist/infrastructure/InMemoryLock.js.map +0 -1
- package/dist/infrastructure/InMemoryMessageBus.js.map +0 -1
- package/dist/infrastructure/InMemorySnapshotStorage.js +0 -26
- package/dist/infrastructure/InMemorySnapshotStorage.js.map +0 -1
- package/dist/infrastructure/InMemoryView.js.map +0 -1
- package/dist/infrastructure/utils/Deferred.js.map +0 -1
- package/dist/infrastructure/utils/index.js.map +0 -1
- package/dist/infrastructure/utils/nextCycle.js.map +0 -1
- package/dist/interfaces.js.map +0 -1
- package/dist/utils/getHandledMessageTypes.js +0 -18
- package/dist/utils/getHandledMessageTypes.js.map +0 -1
- package/src/infrastructure/InMemoryEventStorage.ts +0 -68
- package/src/infrastructure/InMemoryLock.ts +0 -73
- package/src/infrastructure/InMemorySnapshotStorage.ts +0 -27
- package/src/interfaces.ts +0 -328
- package/src/utils/getHandledMessageTypes.ts +0 -20
- /package/dist/{infrastructure/utils → utils}/Deferred.js +0 -0
- /package/src/{infrastructure/utils → utils}/Deferred.ts +0 -0
|
@@ -1,52 +1,59 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.AbstractProjection = void 0;
|
|
4
|
-
const
|
|
4
|
+
const Event_1 = require("./Event");
|
|
5
|
+
const InMemoryView_1 = require("./in-memory/InMemoryView");
|
|
6
|
+
const interfaces_1 = require("./interfaces");
|
|
5
7
|
const utils_1 = require("./utils");
|
|
6
|
-
const isProjectionView = (view) => 'ready' in view &&
|
|
7
|
-
'lock' in view &&
|
|
8
|
-
'unlock' in view &&
|
|
9
|
-
'once' in view;
|
|
10
|
-
const asProjectionView = (view) => (isProjectionView(view) ? view : undefined);
|
|
11
8
|
/**
|
|
12
9
|
* Base class for Projection definition
|
|
13
10
|
*/
|
|
14
11
|
class AbstractProjection {
|
|
15
12
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* If not overridden, will detect event types from event handlers declared on the Projection class
|
|
13
|
+
* List of event types handled by the projection. Can be overridden in the projection implementation.
|
|
14
|
+
* If not overridden, event types will be inferred from handler methods defined on the Projection class.
|
|
19
15
|
*/
|
|
20
16
|
static get handles() {
|
|
21
|
-
return
|
|
17
|
+
return (0, utils_1.getMessageHandlerNames)(this);
|
|
22
18
|
}
|
|
19
|
+
#view;
|
|
20
|
+
#viewLocker;
|
|
21
|
+
#eventLocker;
|
|
22
|
+
_logger;
|
|
23
23
|
/**
|
|
24
|
-
*
|
|
24
|
+
* The default view associated with the projection.
|
|
25
|
+
* Can optionally implement IViewLocker and/or IEventLocker.
|
|
25
26
|
*/
|
|
26
27
|
get view() {
|
|
27
|
-
|
|
28
|
-
this.#view = this.#viewFactory();
|
|
29
|
-
return this.#view;
|
|
28
|
+
return this.#view ?? (this.#view = new InMemoryView_1.InMemoryView());
|
|
30
29
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
30
|
+
set view(value) {
|
|
31
|
+
this.#view = value;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Manages view restoration state to prevent early access to an inconsistent view
|
|
35
|
+
* or conflicts from concurrent restoration by other processes.
|
|
36
|
+
*/
|
|
37
|
+
get _viewLocker() {
|
|
38
|
+
return this.#viewLocker ?? ((0, interfaces_1.isViewLocker)(this.view) ? this.view : undefined);
|
|
39
|
+
}
|
|
40
|
+
set _viewLocker(value) {
|
|
41
|
+
this.#viewLocker = value;
|
|
36
42
|
}
|
|
37
43
|
/**
|
|
38
|
-
*
|
|
39
|
-
* Override for custom behavior.
|
|
44
|
+
* Tracks event processing state to prevent concurrent handling by multiple processes.
|
|
40
45
|
*/
|
|
41
|
-
get
|
|
42
|
-
return (this.view
|
|
43
|
-
|
|
46
|
+
get _eventLocker() {
|
|
47
|
+
return this.#eventLocker ?? ((0, interfaces_1.isEventLocker)(this.view) ? this.view : undefined);
|
|
48
|
+
}
|
|
49
|
+
set _eventLocker(value) {
|
|
50
|
+
this.#eventLocker = value;
|
|
44
51
|
}
|
|
45
|
-
constructor({ view,
|
|
52
|
+
constructor({ view, viewLocker, eventLocker, logger } = {}) {
|
|
46
53
|
(0, utils_1.validateHandlers)(this);
|
|
47
|
-
this.#
|
|
48
|
-
|
|
49
|
-
|
|
54
|
+
this.#view = view;
|
|
55
|
+
this.#viewLocker = viewLocker;
|
|
56
|
+
this.#eventLocker = eventLocker;
|
|
50
57
|
this._logger = logger && 'child' in logger ?
|
|
51
58
|
logger.child({ service: (0, utils_1.getClassName)(this) }) :
|
|
52
59
|
logger;
|
|
@@ -54,15 +61,16 @@ class AbstractProjection {
|
|
|
54
61
|
/** Subscribe to event store */
|
|
55
62
|
async subscribe(eventStore) {
|
|
56
63
|
(0, utils_1.subscribe)(eventStore, this, {
|
|
57
|
-
masterHandler:
|
|
64
|
+
masterHandler: this.project
|
|
58
65
|
});
|
|
59
66
|
await this.restore(eventStore);
|
|
60
67
|
}
|
|
61
68
|
/** Pass event to projection event handler */
|
|
62
69
|
async project(event) {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
await
|
|
70
|
+
if (this._viewLocker && !this._viewLocker?.ready) {
|
|
71
|
+
this._logger?.debug('view is locked, awaiting until it is ready');
|
|
72
|
+
await this._viewLocker.once('ready');
|
|
73
|
+
}
|
|
66
74
|
return this._project(event);
|
|
67
75
|
}
|
|
68
76
|
/** Pass event to projection event handler, without awaiting for restore operation to complete */
|
|
@@ -70,30 +78,39 @@ class AbstractProjection {
|
|
|
70
78
|
const handler = (0, utils_1.getHandler)(this, event.type);
|
|
71
79
|
if (!handler)
|
|
72
80
|
throw new Error(`'${event.type}' handler is not defined or not a function`);
|
|
73
|
-
|
|
81
|
+
if (this._eventLocker) {
|
|
82
|
+
const eventLockObtained = await this._eventLocker.tryMarkAsProjecting(event);
|
|
83
|
+
if (!eventLockObtained)
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
await handler.call(this, event);
|
|
87
|
+
if (this._eventLocker)
|
|
88
|
+
await this._eventLocker.markAsProjected(event);
|
|
74
89
|
}
|
|
75
90
|
/** Restore projection view from event store */
|
|
76
91
|
async restore(eventStore) {
|
|
77
92
|
// lock the view to ensure same restoring procedure
|
|
78
93
|
// won't be performed by another projection instance
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
await this._restore(eventStore);
|
|
85
|
-
if (concurrentView)
|
|
86
|
-
concurrentView.unlock();
|
|
94
|
+
if (this._viewLocker)
|
|
95
|
+
await this._viewLocker.lock();
|
|
96
|
+
await this._restore(eventStore);
|
|
97
|
+
if (this._viewLocker)
|
|
98
|
+
this._viewLocker.unlock();
|
|
87
99
|
}
|
|
88
100
|
/** Restore projection view from event store */
|
|
89
101
|
async _restore(eventStore) {
|
|
90
102
|
if (!eventStore)
|
|
91
103
|
throw new TypeError('eventStore argument required');
|
|
92
|
-
if (typeof eventStore.
|
|
93
|
-
throw new TypeError('eventStore.
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
104
|
+
if (typeof eventStore.getEventsByTypes !== 'function')
|
|
105
|
+
throw new TypeError('eventStore.getEventsByTypes must be a Function');
|
|
106
|
+
let lastEvent;
|
|
107
|
+
if (this._eventLocker) {
|
|
108
|
+
this._logger?.debug('retrieving last event projected');
|
|
109
|
+
lastEvent = await this._eventLocker.getLastEvent();
|
|
110
|
+
}
|
|
111
|
+
this._logger?.debug(`retrieving ${lastEvent ? `events after ${(0, Event_1.describe)(lastEvent)}` : 'all events'}...`);
|
|
112
|
+
const messageTypes = this.constructor.handles;
|
|
113
|
+
const eventsIterable = eventStore.getEventsByTypes(messageTypes, { afterEvent: lastEvent });
|
|
97
114
|
let eventsCount = 0;
|
|
98
115
|
const startTs = Date.now();
|
|
99
116
|
for await (const event of eventsIterable) {
|
|
@@ -105,7 +122,7 @@ class AbstractProjection {
|
|
|
105
122
|
this._onRestoringError(err, event);
|
|
106
123
|
}
|
|
107
124
|
}
|
|
108
|
-
this._logger?.info(`view restored
|
|
125
|
+
this._logger?.info(`view restored from ${eventsCount} event(s) in ${Date.now() - startTs} ms`);
|
|
109
126
|
}
|
|
110
127
|
/** Handle error on restoring. Logs and throws error by default */
|
|
111
128
|
_onRestoringError(error, event) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractProjection.js","sourceRoot":"","sources":["../src/AbstractProjection.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"AbstractProjection.js","sourceRoot":"","sources":["../src/AbstractProjection.ts"],"names":[],"mappings":"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"}
|
package/dist/AbstractSaga.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractSaga.js","sourceRoot":"","sources":["../src/AbstractSaga.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"AbstractSaga.js","sourceRoot":"","sources":["../src/AbstractSaga.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.AggregateCommandHandler = void 0;
|
|
4
4
|
const utils_1 = require("./utils");
|
|
5
|
+
const interfaces_1 = require("./interfaces");
|
|
5
6
|
/**
|
|
6
7
|
* Aggregate command handler.
|
|
7
8
|
*
|
|
@@ -14,6 +15,10 @@ class AggregateCommandHandler {
|
|
|
14
15
|
#logger;
|
|
15
16
|
#aggregateFactory;
|
|
16
17
|
#handles;
|
|
18
|
+
/** Aggregate instances cache for concurrent command handling */
|
|
19
|
+
#aggregatesCache = new utils_1.MapAssertable();
|
|
20
|
+
/** Lock for sequential aggregate command execution */
|
|
21
|
+
#executionLock = new utils_1.Lock();
|
|
17
22
|
constructor({ eventStore, aggregateType, aggregateFactory, handles, logger }) {
|
|
18
23
|
if (!eventStore)
|
|
19
24
|
throw new TypeError('eventStore argument required');
|
|
@@ -24,7 +29,7 @@ class AggregateCommandHandler {
|
|
|
24
29
|
if (aggregateType) {
|
|
25
30
|
const AggregateType = aggregateType;
|
|
26
31
|
this.#aggregateFactory = params => new AggregateType(params);
|
|
27
|
-
this.#handles =
|
|
32
|
+
this.#handles = AggregateType.handles;
|
|
28
33
|
}
|
|
29
34
|
else if (aggregateFactory) {
|
|
30
35
|
if (!Array.isArray(handles) || !handles.length)
|
|
@@ -38,18 +43,25 @@ class AggregateCommandHandler {
|
|
|
38
43
|
}
|
|
39
44
|
/** Subscribe to all command types handled by aggregateType */
|
|
40
45
|
subscribe(commandBus) {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
46
|
+
if (!commandBus)
|
|
47
|
+
throw new TypeError('commandBus argument required');
|
|
48
|
+
if (!(0, interfaces_1.isIObservable)(commandBus))
|
|
49
|
+
throw new TypeError('commandBus argument must implement IObservable interface');
|
|
50
|
+
for (const commandType of this.#handles)
|
|
51
|
+
commandBus.on(commandType, (cmd) => this.execute(cmd));
|
|
45
52
|
}
|
|
46
53
|
/** Restore aggregate from event store events */
|
|
47
54
|
async #restoreAggregate(id) {
|
|
48
55
|
if (!id)
|
|
49
56
|
throw new TypeError('id argument required');
|
|
50
|
-
const
|
|
51
|
-
const aggregate = this.#aggregateFactory({ id
|
|
52
|
-
|
|
57
|
+
const eventsIterable = this.#eventStore.getAggregateEvents(id);
|
|
58
|
+
const aggregate = this.#aggregateFactory({ id });
|
|
59
|
+
let eventCount = 0;
|
|
60
|
+
for await (const event of eventsIterable) {
|
|
61
|
+
aggregate.mutate(event);
|
|
62
|
+
eventCount += 1;
|
|
63
|
+
}
|
|
64
|
+
this.#logger?.info(`${aggregate} state restored from ${eventCount} event(s)`);
|
|
53
65
|
return aggregate;
|
|
54
66
|
}
|
|
55
67
|
/** Create new aggregate with new Id generated by event store */
|
|
@@ -59,26 +71,38 @@ class AggregateCommandHandler {
|
|
|
59
71
|
this.#logger?.info(`${aggregate} created`);
|
|
60
72
|
return aggregate;
|
|
61
73
|
}
|
|
74
|
+
async #getAggregateInstance(aggregateId) {
|
|
75
|
+
if (!aggregateId)
|
|
76
|
+
return this.#createAggregate();
|
|
77
|
+
else
|
|
78
|
+
return this.#aggregatesCache.assert(aggregateId, () => this.#restoreAggregate(aggregateId));
|
|
79
|
+
}
|
|
62
80
|
/** Pass a command to corresponding aggregate */
|
|
63
81
|
async execute(cmd) {
|
|
64
82
|
if (!cmd)
|
|
65
83
|
throw new TypeError('cmd argument required');
|
|
66
84
|
if (!cmd.type)
|
|
67
85
|
throw new TypeError('cmd.type argument required');
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
86
|
+
// create new or get cached aggregate instance promise
|
|
87
|
+
// multiple concurrent calls to #getAggregateInstance will return the same promise
|
|
88
|
+
const aggregate = await this.#getAggregateInstance(cmd.aggregateId);
|
|
89
|
+
try {
|
|
90
|
+
// multiple concurrent commands to a same aggregateId will execute sequentially
|
|
91
|
+
if (cmd.aggregateId)
|
|
92
|
+
await this.#executionLock.acquire(String(cmd.aggregateId));
|
|
93
|
+
// pass command to aggregate instance
|
|
94
|
+
const events = await aggregate.handle(cmd);
|
|
95
|
+
this.#logger?.info(`${aggregate} "${cmd.type}" command processed, ${events.length} event(s) produced`);
|
|
96
|
+
if (events.length)
|
|
97
|
+
await this.#eventStore.dispatch(events);
|
|
75
98
|
return events;
|
|
76
|
-
if (aggregate.shouldTakeSnapshot && this.#eventStore.snapshotsSupported) {
|
|
77
|
-
aggregate.takeSnapshot();
|
|
78
|
-
events = aggregate.changes;
|
|
79
99
|
}
|
|
80
|
-
|
|
81
|
-
|
|
100
|
+
finally {
|
|
101
|
+
if (cmd.aggregateId) {
|
|
102
|
+
this.#executionLock.release(String(cmd.aggregateId));
|
|
103
|
+
this.#aggregatesCache.release(cmd.aggregateId);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
82
106
|
}
|
|
83
107
|
}
|
|
84
108
|
exports.AggregateCommandHandler = AggregateCommandHandler;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AggregateCommandHandler.js","sourceRoot":"","sources":["../src/AggregateCommandHandler.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"AggregateCommandHandler.js","sourceRoot":"","sources":["../src/AggregateCommandHandler.ts"],"names":[],"mappings":"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"}
|
package/dist/CommandBus.js
CHANGED
|
@@ -1,19 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.CommandBus = void 0;
|
|
4
|
+
const in_memory_1 = require("./in-memory");
|
|
4
5
|
class CommandBus {
|
|
5
6
|
#logger;
|
|
6
7
|
#bus;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
throw new TypeError('messageBus argument required');
|
|
13
|
-
this.#bus = messageBus;
|
|
14
|
-
this.#logger = logger && 'child' in logger ?
|
|
15
|
-
logger.child({ service: 'CommandBus' }) :
|
|
16
|
-
logger;
|
|
8
|
+
constructor(o) {
|
|
9
|
+
this.#bus = o?.messageBus ?? new in_memory_1.InMemoryMessageBus();
|
|
10
|
+
this.#logger = o?.logger && 'child' in o.logger ?
|
|
11
|
+
o.logger.child({ service: 'CommandBus' }) :
|
|
12
|
+
o?.logger;
|
|
17
13
|
}
|
|
18
14
|
/**
|
|
19
15
|
* Set up a command handler
|
package/dist/CommandBus.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommandBus.js","sourceRoot":"","sources":["../src/CommandBus.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"CommandBus.js","sourceRoot":"","sources":["../src/CommandBus.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,14 +6,23 @@ const AggregateCommandHandler_1 = require("./AggregateCommandHandler");
|
|
|
6
6
|
const CommandBus_1 = require("./CommandBus");
|
|
7
7
|
const EventStore_1 = require("./EventStore");
|
|
8
8
|
const SagaEventHandler_1 = require("./SagaEventHandler");
|
|
9
|
-
const
|
|
9
|
+
const EventDispatcher_1 = require("./EventDispatcher");
|
|
10
|
+
const in_memory_1 = require("./in-memory");
|
|
10
11
|
const utils_1 = require("./utils");
|
|
12
|
+
const interfaces_1 = require("./interfaces");
|
|
11
13
|
class CqrsContainerBuilder extends di0_1.ContainerBuilder {
|
|
12
14
|
constructor(options) {
|
|
13
15
|
super(options);
|
|
14
|
-
super.register(
|
|
16
|
+
super.register(in_memory_1.InMemoryMessageBus).as('eventBus');
|
|
15
17
|
super.register(EventStore_1.EventStore).as('eventStore');
|
|
16
18
|
super.register(CommandBus_1.CommandBus).as('commandBus');
|
|
19
|
+
super.register(EventDispatcher_1.EventDispatcher).as('eventDispatcher');
|
|
20
|
+
super.register(c => [
|
|
21
|
+
// automatically add `eventStorageWrite` and `snapshotStorage` to the default dispatch pipeline
|
|
22
|
+
// if they're registered in the DI container and implement `IDispatchPipelineProcessor` interface
|
|
23
|
+
...(0, interfaces_1.isDispatchPipelineProcessor)(c.eventStorageWriter) ? [c.eventStorageWriter] : [],
|
|
24
|
+
...(0, interfaces_1.isDispatchPipelineProcessor)(c.snapshotStorage) ? [c.snapshotStorage] : []
|
|
25
|
+
]).as('eventDispatchPipeline');
|
|
17
26
|
}
|
|
18
27
|
/** Register command handler, which will be subscribed to commandBus upon instance creation */
|
|
19
28
|
registerCommandHandler(typeOrFactory) {
|
|
@@ -58,7 +67,7 @@ class CqrsContainerBuilder extends di0_1.ContainerBuilder {
|
|
|
58
67
|
throw new TypeError('AggregateType argument must be a constructor function');
|
|
59
68
|
const commandHandlerFactory = (container) => container.createInstance(AggregateCommandHandler_1.AggregateCommandHandler, {
|
|
60
69
|
aggregateFactory: (options) => container.createInstance(AggregateType, options),
|
|
61
|
-
handles:
|
|
70
|
+
handles: AggregateType.handles
|
|
62
71
|
});
|
|
63
72
|
return this.registerCommandHandler(commandHandlerFactory);
|
|
64
73
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CqrsContainerBuilder.js","sourceRoot":"","sources":["../src/CqrsContainerBuilder.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"CqrsContainerBuilder.js","sourceRoot":"","sources":["../src/CqrsContainerBuilder.ts"],"names":[],"mappings":"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"}
|
package/dist/Event.js
CHANGED
|
@@ -2,14 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.describe = describe;
|
|
4
4
|
exports.describeMultiple = describeMultiple;
|
|
5
|
-
exports.validate = validate;
|
|
6
|
-
exports.getId = getId;
|
|
7
|
-
const crypto = require("crypto");
|
|
8
|
-
const md5 = (data) => crypto
|
|
9
|
-
.createHash('md5')
|
|
10
|
-
.update(JSON.stringify(data))
|
|
11
|
-
.digest('hex')
|
|
12
|
-
.replace(/==$/, '');
|
|
13
5
|
/**
|
|
14
6
|
* Get text description of an event for logging purposes
|
|
15
7
|
*/
|
|
@@ -24,20 +16,4 @@ function describeMultiple(events) {
|
|
|
24
16
|
return describe(events[0]);
|
|
25
17
|
return `${events.length} events`;
|
|
26
18
|
}
|
|
27
|
-
/**
|
|
28
|
-
* Validate event structure
|
|
29
|
-
*/
|
|
30
|
-
function validate(event) {
|
|
31
|
-
if (typeof event !== 'object' || !event)
|
|
32
|
-
throw new TypeError('event must be an Object');
|
|
33
|
-
if (typeof event.type !== 'string' || !event.type.length)
|
|
34
|
-
throw new TypeError('event.type must be a non-empty String');
|
|
35
|
-
if (!event.aggregateId && !event.sagaId)
|
|
36
|
-
throw new TypeError('either event.aggregateId or event.sagaId is required');
|
|
37
|
-
if (event.sagaId && typeof event.sagaVersion === 'undefined')
|
|
38
|
-
throw new TypeError('event.sagaVersion is required, when event.sagaId is defined');
|
|
39
|
-
}
|
|
40
|
-
function getId(event) {
|
|
41
|
-
return event.id ?? md5(event);
|
|
42
|
-
}
|
|
43
19
|
//# sourceMappingURL=Event.js.map
|
package/dist/Event.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Event.js","sourceRoot":"","sources":["../src/Event.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"Event.js","sourceRoot":"","sources":["../src/Event.ts"],"names":[],"mappings":";;AAKA,4BAEC;AAKD,4CAKC;AAfD;;GAEG;AACH,SAAgB,QAAQ,CAAC,KAAa;IACrC,OAAO,IAAI,KAAK,CAAC,IAAI,QAAQ,KAAK,CAAC,WAAW,MAAM,KAAK,CAAC,gBAAgB,GAAG,CAAC;AAC/E,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,MAA6B;IAC7D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QACtB,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5B,OAAO,GAAG,MAAM,CAAC,MAAM,SAAS,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EventDispatchPipeline = void 0;
|
|
4
|
+
const interfaces_1 = require("./interfaces");
|
|
5
|
+
const async_parallel_pipe_1 = require("async-parallel-pipe");
|
|
6
|
+
const async_iterable_buffer_1 = require("async-iterable-buffer");
|
|
7
|
+
const utils_1 = require("./utils");
|
|
8
|
+
class EventDispatchPipeline {
|
|
9
|
+
eventBus;
|
|
10
|
+
concurrentLimit;
|
|
11
|
+
#pipelineInput = new async_iterable_buffer_1.AsyncIterableBuffer();
|
|
12
|
+
#processors = [];
|
|
13
|
+
#pipeline = this.#pipelineInput;
|
|
14
|
+
#processing = false;
|
|
15
|
+
constructor(eventBus, concurrentLimit) {
|
|
16
|
+
this.eventBus = eventBus;
|
|
17
|
+
this.concurrentLimit = concurrentLimit;
|
|
18
|
+
}
|
|
19
|
+
addProcessor(preprocessor) {
|
|
20
|
+
if (!(0, interfaces_1.isDispatchPipelineProcessor)(preprocessor))
|
|
21
|
+
throw new TypeError(`preprocessor ${(0, utils_1.getClassName)(preprocessor)} does not implement IDispatchPipelineProcessor`);
|
|
22
|
+
if (this.#processing)
|
|
23
|
+
throw new Error('pipeline processing already started');
|
|
24
|
+
this.#processors.push(preprocessor);
|
|
25
|
+
// Build a processing pipeline that runs preprocessors concurrently, preserving FIFO ordering
|
|
26
|
+
this.#pipeline = (0, async_parallel_pipe_1.parallelPipe)(this.#pipeline, this.concurrentLimit, async (envelope) => {
|
|
27
|
+
if (envelope.error)
|
|
28
|
+
return envelope;
|
|
29
|
+
try {
|
|
30
|
+
return {
|
|
31
|
+
...envelope,
|
|
32
|
+
data: await preprocessor.process(envelope.data)
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
return {
|
|
37
|
+
...envelope,
|
|
38
|
+
error
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
#ensureProcessingStarted() {
|
|
44
|
+
if (this.#processing)
|
|
45
|
+
return;
|
|
46
|
+
this.#processing = true;
|
|
47
|
+
(async () => {
|
|
48
|
+
for await (const { error, reject, data, resolve } of this.#pipeline) {
|
|
49
|
+
try {
|
|
50
|
+
if (error) {
|
|
51
|
+
await this.revert(data);
|
|
52
|
+
reject(error);
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
const events = [];
|
|
56
|
+
for (const batch of data) {
|
|
57
|
+
const { event, ...meta } = batch;
|
|
58
|
+
if (event) {
|
|
59
|
+
await this.eventBus.publish(event, meta);
|
|
60
|
+
events.push(event);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
resolve(events);
|
|
64
|
+
}
|
|
65
|
+
catch (publishError) {
|
|
66
|
+
reject(publishError);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
})();
|
|
70
|
+
}
|
|
71
|
+
async revert(batch) {
|
|
72
|
+
for (const processor of this.#processors)
|
|
73
|
+
await processor.revert?.(batch);
|
|
74
|
+
}
|
|
75
|
+
push(envelope) {
|
|
76
|
+
this.#ensureProcessingStarted();
|
|
77
|
+
this.#pipelineInput.push(envelope);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
exports.EventDispatchPipeline = EventDispatchPipeline;
|
|
81
|
+
//# sourceMappingURL=EventDispatchPipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventDispatchPipeline.js","sourceRoot":"","sources":["../src/EventDispatchPipeline.ts"],"names":[],"mappings":"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"}
|