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
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EventDispatcher = void 0;
|
|
4
|
+
const interfaces_1 = require("./interfaces");
|
|
5
|
+
const in_memory_1 = require("./in-memory");
|
|
6
|
+
const EventDispatchPipeline_1 = require("./EventDispatchPipeline");
|
|
7
|
+
class EventDispatcher {
|
|
8
|
+
/** Default pipeline name */
|
|
9
|
+
static DEFAULT_PIPELINE = 'default';
|
|
10
|
+
/** Default maximum number of parallel batches for newly created pipelines */
|
|
11
|
+
static DEFAULT_CONCURRENT_LIMIT = 100;
|
|
12
|
+
/** Default router that uses `meta.origin` as the pipeline name */
|
|
13
|
+
static DEFAULT_ROUTER = (_e, meta) => meta?.origin;
|
|
14
|
+
/**
|
|
15
|
+
* Event bus where dispatched messages are delivered after processing.
|
|
16
|
+
* If not provided in the constructor, defaults to an instance of `InMemoryMessageBus`.
|
|
17
|
+
*/
|
|
18
|
+
eventBus;
|
|
19
|
+
/**
|
|
20
|
+
* Default maximum number of parallel batches for newly created pipelines.
|
|
21
|
+
*/
|
|
22
|
+
concurrentLimit;
|
|
23
|
+
/** Router that selects a pipeline name given events and meta */
|
|
24
|
+
eventDispatchRouter;
|
|
25
|
+
#pipelines = new Map();
|
|
26
|
+
constructor(o) {
|
|
27
|
+
this.eventBus = o?.eventBus ?? new in_memory_1.InMemoryMessageBus();
|
|
28
|
+
this.concurrentLimit = o?.eventDispatcherConfig?.concurrentLimit ?? EventDispatcher.DEFAULT_CONCURRENT_LIMIT;
|
|
29
|
+
this.eventDispatchRouter = o?.eventDispatchRouter ?? EventDispatcher.DEFAULT_ROUTER;
|
|
30
|
+
if (o?.eventDispatchPipelines) {
|
|
31
|
+
// Initialize pipelines if provided
|
|
32
|
+
for (const [name, processors] of Object.entries(o.eventDispatchPipelines))
|
|
33
|
+
this.addPipeline(name, processors);
|
|
34
|
+
}
|
|
35
|
+
else if (o?.eventDispatchPipeline) {
|
|
36
|
+
// Single pipeline provided becomes the default pipeline
|
|
37
|
+
this.addPipeline(EventDispatcher.DEFAULT_PIPELINE, o.eventDispatchPipeline);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
// Ensure default pipeline exists at minimum
|
|
41
|
+
this.addPipeline(EventDispatcher.DEFAULT_PIPELINE, []);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/** Add or create the default pipeline processors */
|
|
45
|
+
addPipelineProcessors(eventDispatchPipeline, pipelineName) {
|
|
46
|
+
if (!Array.isArray(eventDispatchPipeline))
|
|
47
|
+
throw new TypeError('eventDispatchPipeline argument must be an Array');
|
|
48
|
+
for (const processor of eventDispatchPipeline)
|
|
49
|
+
this.addPipelineProcessor(processor, pipelineName);
|
|
50
|
+
}
|
|
51
|
+
/** Adds a single processor to the default pipeline */
|
|
52
|
+
addPipelineProcessor(preprocessor, pipelineName) {
|
|
53
|
+
const pipeline = this.#pipelines.get(pipelineName ?? EventDispatcher.DEFAULT_PIPELINE);
|
|
54
|
+
if (!pipeline)
|
|
55
|
+
throw new Error(`Pipeline "${pipelineName ?? EventDispatcher.DEFAULT_PIPELINE}" does not exist`);
|
|
56
|
+
pipeline.addProcessor(preprocessor);
|
|
57
|
+
}
|
|
58
|
+
/** Create a named pipeline with processors and optional concurrency limit */
|
|
59
|
+
addPipeline(name, processors = [], options) {
|
|
60
|
+
if (!name)
|
|
61
|
+
throw new TypeError('pipeline name required');
|
|
62
|
+
if (this.#pipelines.has(name))
|
|
63
|
+
throw new Error(`pipeline "${name}" already exists`);
|
|
64
|
+
const pipeline = new EventDispatchPipeline_1.EventDispatchPipeline(this.eventBus, options?.concurrentLimit ?? this.concurrentLimit);
|
|
65
|
+
for (const p of processors)
|
|
66
|
+
pipeline.addProcessor(p);
|
|
67
|
+
this.#pipelines.set(name, pipeline);
|
|
68
|
+
return pipeline;
|
|
69
|
+
}
|
|
70
|
+
/** Dispatch events through a routed pipeline and publish to the shared eventBus */
|
|
71
|
+
async dispatch(events, meta) {
|
|
72
|
+
if (!(0, interfaces_1.isEventSet)(events) || events.length === 0)
|
|
73
|
+
throw new TypeError('dispatch requires a non-empty array of events');
|
|
74
|
+
let resolve;
|
|
75
|
+
let reject;
|
|
76
|
+
const promise = new Promise((res, rej) => {
|
|
77
|
+
resolve = res;
|
|
78
|
+
reject = rej;
|
|
79
|
+
});
|
|
80
|
+
const envelope = {
|
|
81
|
+
data: events.map(event => ({ event, ...meta })),
|
|
82
|
+
resolve,
|
|
83
|
+
reject
|
|
84
|
+
};
|
|
85
|
+
const desired = this.eventDispatchRouter?.(events, meta) ?? EventDispatcher.DEFAULT_PIPELINE;
|
|
86
|
+
const pipeline = this.#pipelines.get(desired) ?? this.#pipelines.get(EventDispatcher.DEFAULT_PIPELINE);
|
|
87
|
+
if (!pipeline)
|
|
88
|
+
throw new Error(`No "${desired}" pipeline configured`);
|
|
89
|
+
pipeline.push(envelope);
|
|
90
|
+
return promise;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
exports.EventDispatcher = EventDispatcher;
|
|
94
|
+
//# sourceMappingURL=EventDispatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventDispatcher.js","sourceRoot":"","sources":["../src/EventDispatcher.ts"],"names":[],"mappings":"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"}
|
package/dist/EventStore.js
CHANGED
|
@@ -1,82 +1,67 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.EventStore = void 0;
|
|
4
|
+
const interfaces_1 = require("./interfaces");
|
|
4
5
|
const utils_1 = require("./utils");
|
|
5
|
-
const
|
|
6
|
-
const isIEventStorage = (storage) => storage
|
|
7
|
-
&& typeof storage.getNewId === 'function'
|
|
8
|
-
&& typeof storage.commitEvents === 'function'
|
|
9
|
-
&& typeof storage.getEvents === 'function'
|
|
10
|
-
&& typeof storage.getAggregateEvents === 'function'
|
|
11
|
-
&& typeof storage.getSagaEvents === 'function';
|
|
12
|
-
const isIObservable = (obj) => obj
|
|
13
|
-
&& typeof obj.on === 'function'
|
|
14
|
-
&& typeof obj.off === 'function';
|
|
15
|
-
const isIMessageBus = (bus) => bus
|
|
16
|
-
&& isIObservable(bus)
|
|
17
|
-
&& typeof bus.send === 'function'
|
|
18
|
-
&& typeof bus.publish === 'function';
|
|
19
|
-
const SNAPSHOT_EVENT_TYPE = 'snapshot';
|
|
6
|
+
const EventDispatcher_1 = require("./EventDispatcher");
|
|
20
7
|
class EventStore {
|
|
21
|
-
#
|
|
22
|
-
#
|
|
23
|
-
#logger;
|
|
24
|
-
#storage;
|
|
25
|
-
#messageBus;
|
|
8
|
+
#identifierProvider;
|
|
9
|
+
#eventStorageReader;
|
|
26
10
|
#snapshotStorage;
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
11
|
+
eventBus;
|
|
12
|
+
#eventDispatcher;
|
|
13
|
+
#sagaStarters = new Set();
|
|
14
|
+
#logger;
|
|
15
|
+
constructor({ eventStorageReader, identifierProvider = (0, interfaces_1.isIdentifierProvider)(eventStorageReader) ? eventStorageReader : undefined, snapshotStorage, eventBus, eventDispatcher, logger }) {
|
|
16
|
+
if (!eventStorageReader)
|
|
17
|
+
throw new TypeError('eventStorageReader argument required');
|
|
18
|
+
if (!identifierProvider)
|
|
19
|
+
throw new TypeError('identifierProvider argument required');
|
|
20
|
+
if (!(0, interfaces_1.isIEventStorageReader)(eventStorageReader))
|
|
36
21
|
throw new TypeError('storage does not implement IEventStorage interface');
|
|
37
|
-
if (!
|
|
38
|
-
throw new TypeError('
|
|
39
|
-
this.#
|
|
40
|
-
this.#
|
|
22
|
+
if (eventBus && !(0, interfaces_1.isIEventBus)(eventBus))
|
|
23
|
+
throw new TypeError('eventBus does not implement IMessageBus interface');
|
|
24
|
+
this.#eventStorageReader = eventStorageReader;
|
|
25
|
+
this.#identifierProvider = identifierProvider;
|
|
26
|
+
this.#snapshotStorage = snapshotStorage;
|
|
27
|
+
this.#eventDispatcher = eventDispatcher ?? new EventDispatcher_1.EventDispatcher({ eventBus });
|
|
28
|
+
this.eventBus = eventBus ?? this.#eventDispatcher.eventBus;
|
|
41
29
|
this.#logger = logger && 'child' in logger ?
|
|
42
30
|
logger.child({ service: (0, utils_1.getClassName)(this) }) :
|
|
43
31
|
logger;
|
|
44
|
-
this.#storage = storage;
|
|
45
|
-
this.#snapshotStorage = snapshotStorage;
|
|
46
|
-
this.#messageBus = messageBus;
|
|
47
32
|
}
|
|
48
|
-
/**
|
|
33
|
+
/**
|
|
34
|
+
* Generates and returns a new unique identifier using the configured identifier provider.
|
|
35
|
+
*
|
|
36
|
+
* @returns A promise resolving to a unique identifier suitable for aggregates, sagas, and events.
|
|
37
|
+
*/
|
|
49
38
|
async getNewId() {
|
|
50
|
-
return this.#
|
|
39
|
+
return this.#identifierProvider.getNewId();
|
|
51
40
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
const eventsIterable = await this.#storage.getEvents(eventTypes);
|
|
41
|
+
async *getEventsByTypes(eventTypes, options) {
|
|
42
|
+
if (!Array.isArray(eventTypes))
|
|
43
|
+
throw new TypeError('eventTypes argument must be an Array');
|
|
44
|
+
this.#logger?.debug(`retrieving ${eventTypes.join(', ')} events...`);
|
|
45
|
+
const eventsIterable = await this.#eventStorageReader.getEventsByTypes(eventTypes, options);
|
|
58
46
|
yield* eventsIterable;
|
|
59
|
-
this.#logger?.debug(`${eventTypes
|
|
47
|
+
this.#logger?.debug(`${eventTypes.join(', ')} events retrieved`);
|
|
60
48
|
}
|
|
61
49
|
/** Retrieve all events of specific Aggregate */
|
|
62
|
-
async getAggregateEvents(aggregateId) {
|
|
50
|
+
async *getAggregateEvents(aggregateId) {
|
|
63
51
|
if (!aggregateId)
|
|
64
52
|
throw new TypeError('aggregateId argument required');
|
|
65
53
|
this.#logger?.debug(`retrieving event stream for aggregate ${aggregateId}...`);
|
|
66
54
|
const snapshot = this.#snapshotStorage ?
|
|
67
55
|
await this.#snapshotStorage.getAggregateSnapshot(aggregateId) :
|
|
68
56
|
undefined;
|
|
69
|
-
const events = [];
|
|
70
57
|
if (snapshot)
|
|
71
|
-
|
|
72
|
-
const eventsIterable = await this.#
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
this.#logger?.debug(`${Event.describeMultiple(events)} retrieved`);
|
|
76
|
-
return events;
|
|
58
|
+
yield snapshot;
|
|
59
|
+
const eventsIterable = await this.#eventStorageReader.getAggregateEvents(aggregateId, { snapshot });
|
|
60
|
+
yield* eventsIterable;
|
|
61
|
+
this.#logger?.debug(`all events for aggregate ${aggregateId} retrieved`);
|
|
77
62
|
}
|
|
78
63
|
/** Retrieve events of specific Saga */
|
|
79
|
-
async getSagaEvents(sagaId, filter) {
|
|
64
|
+
async *getSagaEvents(sagaId, filter) {
|
|
80
65
|
if (!sagaId)
|
|
81
66
|
throw new TypeError('sagaId argument required');
|
|
82
67
|
if (!filter)
|
|
@@ -86,46 +71,39 @@ class EventStore {
|
|
|
86
71
|
if (filter.beforeEvent.sagaVersion === undefined)
|
|
87
72
|
throw new TypeError('filter.beforeEvent.sagaVersion argument required');
|
|
88
73
|
this.#logger?.debug(`retrieving event stream for saga ${sagaId}, v${filter.beforeEvent.sagaVersion}...`);
|
|
89
|
-
const
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
events.push(event);
|
|
93
|
-
this.#logger?.debug(`${Event.describeMultiple(events)} retrieved`);
|
|
94
|
-
return events;
|
|
74
|
+
const eventsIterable = await this.#eventStorageReader.getSagaEvents(sagaId, filter);
|
|
75
|
+
yield* eventsIterable;
|
|
76
|
+
this.#logger?.debug(`all events for saga ${sagaId} retrieved`);
|
|
95
77
|
}
|
|
96
78
|
/**
|
|
97
79
|
* Register event types that start sagas.
|
|
98
80
|
* Upon such event commit a new sagaId will be assigned
|
|
99
81
|
*/
|
|
100
82
|
registerSagaStarters(eventTypes = []) {
|
|
101
|
-
const
|
|
102
|
-
|
|
83
|
+
for (const eventType of eventTypes)
|
|
84
|
+
this.#sagaStarters.add(eventType);
|
|
103
85
|
}
|
|
104
86
|
/**
|
|
105
87
|
* Validate events, commit to storage and publish to messageBus, if needed
|
|
106
88
|
*
|
|
107
|
-
* @param
|
|
108
|
-
* @returns
|
|
89
|
+
* @param events - a set of events to commit
|
|
90
|
+
* @returns Signed and committed events
|
|
109
91
|
*/
|
|
110
|
-
async
|
|
111
|
-
if (!
|
|
112
|
-
throw new TypeError('
|
|
113
|
-
const
|
|
114
|
-
|
|
115
|
-
await this.#attachSagaIdToSagaStarterEvents(events) :
|
|
116
|
-
events;
|
|
117
|
-
const eventStreamWithoutSnapshots = await this.save(augmentedEvents);
|
|
118
|
-
// after events are saved to the persistent storage,
|
|
119
|
-
// publish them to the event bus (i.e. RabbitMq)
|
|
120
|
-
if (this.#messageBus)
|
|
121
|
-
await this.publish(eventStreamWithoutSnapshots);
|
|
122
|
-
return eventStreamWithoutSnapshots;
|
|
92
|
+
async dispatch(events) {
|
|
93
|
+
if (!(0, interfaces_1.isEventSet)(events) || events.length === 0)
|
|
94
|
+
throw new TypeError('dispatch requires a non-empty array of events');
|
|
95
|
+
const augmentedEvents = await this.#attachSagaIdToSagaStarterEvents(events);
|
|
96
|
+
return this.#eventDispatcher.dispatch(augmentedEvents, { origin: 'internal' });
|
|
123
97
|
}
|
|
124
|
-
/**
|
|
98
|
+
/**
|
|
99
|
+
* Generate and attach sagaId to events that start new sagas
|
|
100
|
+
*/
|
|
125
101
|
async #attachSagaIdToSagaStarterEvents(events) {
|
|
102
|
+
if (!this.#sagaStarters.size)
|
|
103
|
+
return events;
|
|
126
104
|
const augmentedEvents = [];
|
|
127
105
|
for (const event of events) {
|
|
128
|
-
if (this.#sagaStarters.
|
|
106
|
+
if (this.#sagaStarters.has(event.type)) {
|
|
129
107
|
if (event.sagaId)
|
|
130
108
|
throw new Error(`Event "${event.type}" already contains sagaId. Multiple sagas with same event type are not supported`);
|
|
131
109
|
event.sagaId = await this.getNewId();
|
|
@@ -138,77 +116,21 @@ class EventStore {
|
|
|
138
116
|
}
|
|
139
117
|
return augmentedEvents;
|
|
140
118
|
}
|
|
141
|
-
/** Save events to the persistent storage(s) */
|
|
142
|
-
async save(events) {
|
|
143
|
-
if (!Array.isArray(events))
|
|
144
|
-
throw new TypeError('events argument must be an Array');
|
|
145
|
-
const snapshotEvents = events.filter(e => e.type === SNAPSHOT_EVENT_TYPE);
|
|
146
|
-
if (snapshotEvents.length > 1)
|
|
147
|
-
throw new Error(`cannot commit a stream with more than 1 ${SNAPSHOT_EVENT_TYPE} event`);
|
|
148
|
-
if (snapshotEvents.length && !this.snapshotsSupported)
|
|
149
|
-
throw new Error(`${SNAPSHOT_EVENT_TYPE} event type is not supported by the storage`);
|
|
150
|
-
const snapshot = snapshotEvents[0];
|
|
151
|
-
const eventsWithoutSnapshot = events.filter(e => e !== snapshot);
|
|
152
|
-
this.#logger?.debug(`validating ${Event.describeMultiple(eventsWithoutSnapshot)}...`);
|
|
153
|
-
eventsWithoutSnapshot.forEach(this.#validator);
|
|
154
|
-
this.#logger?.debug(`saving ${Event.describeMultiple(eventsWithoutSnapshot)}...`);
|
|
155
|
-
await Promise.all([
|
|
156
|
-
this.#storage.commitEvents(eventsWithoutSnapshot),
|
|
157
|
-
snapshot ?
|
|
158
|
-
this.#snapshotStorage?.saveAggregateSnapshot(snapshot) :
|
|
159
|
-
undefined
|
|
160
|
-
]);
|
|
161
|
-
return eventsWithoutSnapshot;
|
|
162
|
-
}
|
|
163
|
-
/**
|
|
164
|
-
* After events are
|
|
165
|
-
*/
|
|
166
|
-
async publish(events) {
|
|
167
|
-
if (this.#publishAsync) {
|
|
168
|
-
this.#logger?.debug(`publishing ${Event.describeMultiple(events)} asynchronously...`);
|
|
169
|
-
setImmediate(() => this.#publishEvents(events));
|
|
170
|
-
}
|
|
171
|
-
else {
|
|
172
|
-
this.#logger?.debug(`publishing ${Event.describeMultiple(events)} synchronously...`);
|
|
173
|
-
await this.#publishEvents(events);
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
async #publishEvents(events) {
|
|
177
|
-
try {
|
|
178
|
-
await Promise.all(events.map(event => this.#messageBus.publish(event)));
|
|
179
|
-
this.#logger?.debug(`${Event.describeMultiple(events)} published`);
|
|
180
|
-
}
|
|
181
|
-
catch (error) {
|
|
182
|
-
this.#logger?.error(`${Event.describeMultiple(events)} publishing failed: ${error.message}`, {
|
|
183
|
-
stack: error.stack
|
|
184
|
-
});
|
|
185
|
-
throw error;
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
/** Setup a listener for a specific event type */
|
|
189
119
|
on(messageType, handler) {
|
|
190
|
-
|
|
191
|
-
throw new TypeError('messageType argument must be a non-empty String');
|
|
192
|
-
if (typeof handler !== 'function')
|
|
193
|
-
throw new TypeError('handler argument must be a Function');
|
|
194
|
-
if (arguments.length !== 2)
|
|
195
|
-
throw new TypeError(`2 arguments are expected, but ${arguments.length} received`);
|
|
196
|
-
this.#messageBus.on(messageType, handler);
|
|
120
|
+
this.eventBus.on(messageType, handler);
|
|
197
121
|
}
|
|
198
|
-
/** Remove previously installed listener */
|
|
199
122
|
off(messageType, handler) {
|
|
200
|
-
this
|
|
123
|
+
this.eventBus.off(messageType, handler);
|
|
201
124
|
}
|
|
202
|
-
/** Get or create a named queue, which delivers events to a single handler only */
|
|
203
125
|
queue(name) {
|
|
204
|
-
if (
|
|
205
|
-
throw new Error('
|
|
206
|
-
return this
|
|
126
|
+
if (!this.eventBus.queue)
|
|
127
|
+
throw new Error('Injected eventBus does not support named queues');
|
|
128
|
+
return this.eventBus.queue(name);
|
|
207
129
|
}
|
|
208
130
|
/** Creates one-time subscription for one or multiple events that match a filter */
|
|
209
131
|
once(messageTypes, handler, filter) {
|
|
210
132
|
const subscribeTo = Array.isArray(messageTypes) ? messageTypes : [messageTypes];
|
|
211
|
-
return (0, utils_1.setupOneTimeEmitterSubscription)(this
|
|
133
|
+
return (0, utils_1.setupOneTimeEmitterSubscription)(this.eventBus, subscribeTo, filter, handler, this.#logger);
|
|
212
134
|
}
|
|
213
135
|
}
|
|
214
136
|
exports.EventStore = EventStore;
|
package/dist/EventStore.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventStore.js","sourceRoot":"","sources":["../src/EventStore.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"EventStore.js","sourceRoot":"","sources":["../src/EventStore.ts"],"names":[],"mappings":"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"}
|
package/dist/SagaEventHandler.js
CHANGED
|
@@ -54,7 +54,7 @@ class SagaEventHandler {
|
|
|
54
54
|
subscribe(eventStore) {
|
|
55
55
|
(0, utils_1.subscribe)(eventStore, this, {
|
|
56
56
|
messageTypes: [...this.#startsWith, ...this.#handles],
|
|
57
|
-
masterHandler:
|
|
57
|
+
masterHandler: this.handle,
|
|
58
58
|
queueName: this.#queueName
|
|
59
59
|
});
|
|
60
60
|
}
|
|
@@ -107,7 +107,8 @@ class SagaEventHandler {
|
|
|
107
107
|
async #restoreSaga(event) {
|
|
108
108
|
if (!event.sagaId)
|
|
109
109
|
throw new TypeError(`${Event.describe(event)} does not contain sagaId`);
|
|
110
|
-
const
|
|
110
|
+
const eventsIterable = this.#eventStore.getSagaEvents(event.sagaId, { beforeEvent: event });
|
|
111
|
+
const events = await (0, utils_1.iteratorToArray)(eventsIterable);
|
|
111
112
|
const saga = this.#sagaFactory.call(null, { id: event.sagaId, events });
|
|
112
113
|
this.#logger?.info(`Saga state restored from ${events.length} event(s)`);
|
|
113
114
|
return saga;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SagaEventHandler.js","sourceRoot":"","sources":["../src/SagaEventHandler.ts"],"names":[],"mappings":";;;AAAA,iCAAiC;AAcjC,
|
|
1
|
+
{"version":3,"file":"SagaEventHandler.js","sourceRoot":"","sources":["../src/SagaEventHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InMemoryEventStorage = void 0;
|
|
4
|
+
const utils_1 = require("./utils");
|
|
5
|
+
/**
|
|
6
|
+
* A simple event storage implementation intended to use for tests only.
|
|
7
|
+
* Storage content resets on each app restart.
|
|
8
|
+
*/
|
|
9
|
+
class InMemoryEventStorage {
|
|
10
|
+
#nextId = 0;
|
|
11
|
+
#events = [];
|
|
12
|
+
getNewId() {
|
|
13
|
+
this.#nextId += 1;
|
|
14
|
+
return String(this.#nextId);
|
|
15
|
+
}
|
|
16
|
+
async commitEvents(events) {
|
|
17
|
+
await (0, utils_1.nextCycle)();
|
|
18
|
+
this.#events = this.#events.concat(events);
|
|
19
|
+
await (0, utils_1.nextCycle)();
|
|
20
|
+
return events;
|
|
21
|
+
}
|
|
22
|
+
async *getAggregateEvents(aggregateId, options) {
|
|
23
|
+
await (0, utils_1.nextCycle)();
|
|
24
|
+
const afterVersion = options?.snapshot?.aggregateVersion;
|
|
25
|
+
const results = !afterVersion ?
|
|
26
|
+
this.#events.filter(e => e.aggregateId === aggregateId) :
|
|
27
|
+
this.#events.filter(e => e.aggregateId === aggregateId &&
|
|
28
|
+
e.aggregateVersion !== undefined &&
|
|
29
|
+
e.aggregateVersion > afterVersion);
|
|
30
|
+
await (0, utils_1.nextCycle)();
|
|
31
|
+
yield* results;
|
|
32
|
+
}
|
|
33
|
+
async *getSagaEvents(sagaId, { beforeEvent }) {
|
|
34
|
+
await (0, utils_1.nextCycle)();
|
|
35
|
+
const results = this.#events.filter(e => e.sagaId === sagaId &&
|
|
36
|
+
e.sagaVersion !== undefined &&
|
|
37
|
+
beforeEvent.sagaVersion !== undefined &&
|
|
38
|
+
e.sagaVersion < beforeEvent.sagaVersion);
|
|
39
|
+
await (0, utils_1.nextCycle)();
|
|
40
|
+
yield* results;
|
|
41
|
+
}
|
|
42
|
+
async *getEventsByTypes(eventTypes, options) {
|
|
43
|
+
await (0, utils_1.nextCycle)();
|
|
44
|
+
const lastEventId = options?.afterEvent?.id;
|
|
45
|
+
if (options?.afterEvent && !lastEventId)
|
|
46
|
+
throw new TypeError('options.afterEvent.id is required');
|
|
47
|
+
let offsetFound = !lastEventId;
|
|
48
|
+
for (const event of this.#events) {
|
|
49
|
+
if (!offsetFound)
|
|
50
|
+
offsetFound = event.id === lastEventId;
|
|
51
|
+
else if (!eventTypes || eventTypes.includes(event.type))
|
|
52
|
+
yield event;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Processes a batch of dispatch pipeline items, extracts the events,
|
|
57
|
+
* commits them to the in-memory storage, and returns the original batch.
|
|
58
|
+
*
|
|
59
|
+
* This method is part of the `IDispatchPipelineProcessor` interface.
|
|
60
|
+
*/
|
|
61
|
+
async process(batch) {
|
|
62
|
+
const events = [];
|
|
63
|
+
for (const { event } of batch) {
|
|
64
|
+
if (!event)
|
|
65
|
+
throw new Error('Event batch does not contain `event`');
|
|
66
|
+
events.push(event);
|
|
67
|
+
}
|
|
68
|
+
await this.commitEvents(events);
|
|
69
|
+
return batch;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
exports.InMemoryEventStorage = InMemoryEventStorage;
|
|
73
|
+
//# sourceMappingURL=InMemoryEventStorage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InMemoryEventStorage.js","sourceRoot":"","sources":["../../src/in-memory/InMemoryEventStorage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InMemoryLock = void 0;
|
|
4
|
+
const utils_1 = require("../utils");
|
|
5
|
+
class InMemoryLock {
|
|
6
|
+
#lockMarker;
|
|
7
|
+
/**
|
|
8
|
+
* Indicates if lock is acquired
|
|
9
|
+
*/
|
|
10
|
+
get locked() {
|
|
11
|
+
return !!this.#lockMarker;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Acquire the lock on the current instance.
|
|
15
|
+
* Resolves when the lock is successfully acquired
|
|
16
|
+
*/
|
|
17
|
+
async lock() {
|
|
18
|
+
while (this.locked)
|
|
19
|
+
await this.once('unlocked');
|
|
20
|
+
this.#lockMarker = new utils_1.Deferred();
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Release the lock acquired earlier
|
|
24
|
+
*/
|
|
25
|
+
async unlock() {
|
|
26
|
+
this.#lockMarker?.resolve();
|
|
27
|
+
this.#lockMarker = undefined;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Wait until the lock is released.
|
|
31
|
+
* Resolves immediately if the lock is not acquired
|
|
32
|
+
*/
|
|
33
|
+
once(event) {
|
|
34
|
+
if (event !== 'unlocked')
|
|
35
|
+
throw new TypeError(`Unexpected event type: ${event}`);
|
|
36
|
+
return this.#lockMarker?.promise ?? Promise.resolve();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.InMemoryLock = InMemoryLock;
|
|
40
|
+
//# sourceMappingURL=InMemoryLock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InMemoryLock.js","sourceRoot":"","sources":["../../src/in-memory/InMemoryLock.ts"],"names":[],"mappings":";;;AAAA,oCAAoC;AAEpC,MAAa,YAAY;IAExB,WAAW,CAA6B;IAExC;;OAEG;IACH,IAAI,MAAM;QACT,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI;QACT,OAAO,IAAI,CAAC,MAAM;YACjB,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE7B,IAAI,CAAC,WAAW,GAAG,IAAI,gBAAQ,EAAE,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM;QACX,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,IAAI,CAAC,KAAiB;QACrB,IAAI,KAAK,KAAK,UAAU;YACvB,MAAM,IAAI,SAAS,CAAC,0BAA0B,KAAK,EAAE,CAAC,CAAC;QAExD,OAAO,IAAI,CAAC,WAAW,EAAE,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IACvD,CAAC;CACD;AAxCD,oCAwCC"}
|