node-cqrs 1.0.0-rc.42 → 1.0.0-rc.44
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 +38 -0
- package/CONTRIBUTING.md +12 -2
- package/README.md +58 -1
- package/dist/cjs/AbstractAggregate.js +0 -53
- package/dist/cjs/AbstractAggregate.js.map +1 -1
- package/dist/cjs/AbstractProjection.js +0 -36
- package/dist/cjs/AbstractProjection.js.map +1 -1
- package/dist/cjs/AbstractSaga.js +1 -24
- package/dist/cjs/AbstractSaga.js.map +1 -1
- package/dist/cjs/AggregateCommandHandler.js +31 -42
- package/dist/cjs/AggregateCommandHandler.js.map +1 -1
- package/dist/cjs/CommandBus.js +0 -12
- package/dist/cjs/CommandBus.js.map +1 -1
- package/dist/cjs/CqrsContainerBuilder.js +0 -11
- package/dist/cjs/CqrsContainerBuilder.js.map +1 -1
- package/dist/cjs/Event.js +0 -6
- package/dist/cjs/Event.js.map +1 -1
- package/dist/cjs/EventDispatchPipeline.js +0 -1
- package/dist/cjs/EventDispatchPipeline.js.map +1 -1
- package/dist/cjs/EventDispatcher.js +0 -18
- package/dist/cjs/EventDispatcher.js.map +1 -1
- package/dist/cjs/EventIdAugmentor.js +0 -6
- package/dist/cjs/EventIdAugmentor.js.map +1 -1
- package/dist/cjs/EventStore.js +3 -18
- package/dist/cjs/EventStore.js.map +1 -1
- package/dist/cjs/SagaEventHandler.js +0 -12
- package/dist/cjs/SagaEventHandler.js.map +1 -1
- package/dist/cjs/errors/ConcurrencyError.js +0 -6
- package/dist/cjs/errors/ConcurrencyError.js.map +1 -1
- package/dist/cjs/in-memory/InMemoryEventStorage.js +0 -10
- package/dist/cjs/in-memory/InMemoryEventStorage.js.map +1 -1
- package/dist/cjs/in-memory/InMemoryLock.js +0 -14
- package/dist/cjs/in-memory/InMemoryLock.js.map +1 -1
- package/dist/cjs/in-memory/InMemoryMessageBus.js +0 -24
- package/dist/cjs/in-memory/InMemoryMessageBus.js.map +1 -1
- package/dist/cjs/in-memory/InMemorySnapshotStorage.js +0 -27
- package/dist/cjs/in-memory/InMemorySnapshotStorage.js.map +1 -1
- package/dist/cjs/in-memory/InMemoryView.js +2 -36
- package/dist/cjs/in-memory/InMemoryView.js.map +1 -1
- package/dist/cjs/in-memory/utils/nextCycle.js +0 -3
- package/dist/cjs/in-memory/utils/nextCycle.js.map +1 -1
- package/dist/cjs/interfaces/IViewLocker.js +0 -6
- package/dist/cjs/interfaces/IViewLocker.js.map +1 -1
- package/dist/cjs/rabbitmq/RabbitMqEventBus.js +0 -23
- package/dist/cjs/rabbitmq/RabbitMqEventBus.js.map +1 -1
- package/dist/cjs/rabbitmq/RabbitMqGateway.js +4 -66
- package/dist/cjs/rabbitmq/RabbitMqGateway.js.map +1 -1
- package/dist/cjs/rabbitmq/utils/registerExitCleanup.js +0 -8
- package/dist/cjs/rabbitmq/utils/registerExitCleanup.js.map +1 -1
- package/dist/cjs/sqlite/AbstractSqliteAccessor.js +0 -16
- package/dist/cjs/sqlite/AbstractSqliteAccessor.js.map +1 -1
- package/dist/cjs/sqlite/AbstractSqliteView.js +0 -3
- package/dist/cjs/sqlite/AbstractSqliteView.js.map +1 -1
- package/dist/cjs/sqlite/SqliteEventLocker.js +3 -3
- package/dist/cjs/sqlite/SqliteEventLocker.js.map +1 -1
- package/dist/cjs/sqlite/SqliteObjectStorage.js +0 -3
- package/dist/cjs/sqlite/SqliteObjectStorage.js.map +1 -1
- package/dist/cjs/sqlite/SqliteObjectView.js +0 -5
- package/dist/cjs/sqlite/SqliteObjectView.js.map +1 -1
- package/dist/cjs/sqlite/queries/eventLockTableInit.js +1 -1
- package/dist/cjs/sqlite/utils/getEventId.js +0 -3
- package/dist/cjs/sqlite/utils/getEventId.js.map +1 -1
- package/dist/cjs/sqlite/utils/guid.js +0 -3
- package/dist/cjs/sqlite/utils/guid.js.map +1 -1
- package/dist/cjs/utils/Deferred.js +0 -3
- package/dist/cjs/utils/Deferred.js.map +1 -1
- package/dist/cjs/utils/Lock.js +0 -27
- package/dist/cjs/utils/Lock.js.map +1 -1
- package/dist/cjs/utils/MapAssertable.js +0 -6
- package/dist/cjs/utils/MapAssertable.js.map +1 -1
- package/dist/cjs/utils/assert.js +5 -0
- package/dist/cjs/utils/assert.js.map +1 -1
- package/dist/cjs/utils/getClassName.js +0 -3
- package/dist/cjs/utils/getClassName.js.map +1 -1
- package/dist/cjs/utils/getHandler.js +0 -3
- package/dist/cjs/utils/getHandler.js.map +1 -1
- package/dist/cjs/utils/getMessageHandlerNames.js +0 -4
- package/dist/cjs/utils/getMessageHandlerNames.js.map +1 -1
- package/dist/cjs/utils/sagaId.js +0 -1
- package/dist/cjs/utils/sagaId.js.map +1 -1
- package/dist/cjs/utils/setupOneTimeEmitterSubscription.js +1 -14
- package/dist/cjs/utils/setupOneTimeEmitterSubscription.js.map +1 -1
- package/dist/cjs/utils/subscribe.js +1 -7
- package/dist/cjs/utils/subscribe.js.map +1 -1
- package/dist/cjs/utils/validateHandlers.js +0 -3
- package/dist/cjs/utils/validateHandlers.js.map +1 -1
- package/dist/cjs/workers/AbstractWorkerProjection.js +19 -83
- package/dist/cjs/workers/AbstractWorkerProjection.js.map +1 -1
- package/dist/cjs/workers/WorkerProxyProjection.js +2 -7
- package/dist/cjs/workers/WorkerProxyProjection.js.map +1 -1
- package/dist/cjs/workers/index.js +1 -0
- package/dist/cjs/workers/index.js.map +1 -1
- package/dist/cjs/workers/interfaces/IProxyProjection.js +3 -0
- package/dist/cjs/workers/interfaces/IProxyProjection.js.map +1 -0
- package/dist/cjs/workers/interfaces/IWorkerProjection.js +3 -0
- package/dist/cjs/workers/interfaces/IWorkerProjection.js.map +1 -0
- package/dist/cjs/workers/interfaces/index.js +3 -0
- package/dist/cjs/workers/interfaces/index.js.map +1 -0
- package/dist/cjs/workers/protocol.js.map +1 -1
- package/dist/cjs/workers/utils/ProjectionView.js +3 -0
- package/dist/cjs/workers/utils/ProjectionView.js.map +1 -0
- package/dist/cjs/workers/utils/createWorker.js +0 -10
- package/dist/cjs/workers/utils/createWorker.js.map +1 -1
- package/dist/cjs/workers/utils/createWorkerInstance.js +59 -0
- package/dist/cjs/workers/utils/createWorkerInstance.js.map +1 -0
- package/dist/cjs/workers/utils/index.js +2 -0
- package/dist/cjs/workers/utils/index.js.map +1 -1
- package/dist/cjs/workers/utils/nodeEndpoint.js +0 -2
- package/dist/cjs/workers/utils/nodeEndpoint.js.map +1 -1
- package/dist/cjs/workers/utils/workerProxyFactory.js +21 -0
- package/dist/cjs/workers/utils/workerProxyFactory.js.map +1 -0
- package/dist/esm/AbstractAggregate.js +0 -53
- package/dist/esm/AbstractAggregate.js.map +1 -1
- package/dist/esm/AbstractProjection.js +0 -36
- package/dist/esm/AbstractProjection.js.map +1 -1
- package/dist/esm/AbstractSaga.js +2 -25
- package/dist/esm/AbstractSaga.js.map +1 -1
- package/dist/esm/AggregateCommandHandler.js +32 -43
- package/dist/esm/AggregateCommandHandler.js.map +1 -1
- package/dist/esm/CommandBus.js +0 -12
- package/dist/esm/CommandBus.js.map +1 -1
- package/dist/esm/CqrsContainerBuilder.js +0 -11
- package/dist/esm/CqrsContainerBuilder.js.map +1 -1
- package/dist/esm/Event.js +0 -6
- package/dist/esm/Event.js.map +1 -1
- package/dist/esm/EventDispatchPipeline.js +0 -1
- package/dist/esm/EventDispatchPipeline.js.map +1 -1
- package/dist/esm/EventDispatcher.js +0 -18
- package/dist/esm/EventDispatcher.js.map +1 -1
- package/dist/esm/EventIdAugmentor.js +0 -6
- package/dist/esm/EventIdAugmentor.js.map +1 -1
- package/dist/esm/EventStore.js +4 -19
- package/dist/esm/EventStore.js.map +1 -1
- package/dist/esm/SagaEventHandler.js +0 -12
- package/dist/esm/SagaEventHandler.js.map +1 -1
- package/dist/esm/errors/ConcurrencyError.js +0 -6
- package/dist/esm/errors/ConcurrencyError.js.map +1 -1
- package/dist/esm/in-memory/InMemoryEventStorage.js +0 -10
- package/dist/esm/in-memory/InMemoryEventStorage.js.map +1 -1
- package/dist/esm/in-memory/InMemoryLock.js +0 -14
- package/dist/esm/in-memory/InMemoryLock.js.map +1 -1
- package/dist/esm/in-memory/InMemoryMessageBus.js +0 -24
- package/dist/esm/in-memory/InMemoryMessageBus.js.map +1 -1
- package/dist/esm/in-memory/InMemorySnapshotStorage.js +0 -27
- package/dist/esm/in-memory/InMemorySnapshotStorage.js.map +1 -1
- package/dist/esm/in-memory/InMemoryView.js +2 -36
- package/dist/esm/in-memory/InMemoryView.js.map +1 -1
- package/dist/esm/in-memory/utils/nextCycle.js +0 -3
- package/dist/esm/in-memory/utils/nextCycle.js.map +1 -1
- package/dist/esm/interfaces/IViewLocker.js +0 -6
- package/dist/esm/interfaces/IViewLocker.js.map +1 -1
- package/dist/esm/rabbitmq/RabbitMqEventBus.js +0 -23
- package/dist/esm/rabbitmq/RabbitMqEventBus.js.map +1 -1
- package/dist/esm/rabbitmq/RabbitMqGateway.js +4 -66
- package/dist/esm/rabbitmq/RabbitMqGateway.js.map +1 -1
- package/dist/esm/rabbitmq/utils/registerExitCleanup.js +0 -8
- package/dist/esm/rabbitmq/utils/registerExitCleanup.js.map +1 -1
- package/dist/esm/sqlite/AbstractSqliteAccessor.js +0 -16
- package/dist/esm/sqlite/AbstractSqliteAccessor.js.map +1 -1
- package/dist/esm/sqlite/AbstractSqliteView.js +0 -3
- package/dist/esm/sqlite/AbstractSqliteView.js.map +1 -1
- package/dist/esm/sqlite/SqliteEventLocker.js +3 -3
- package/dist/esm/sqlite/SqliteEventLocker.js.map +1 -1
- package/dist/esm/sqlite/SqliteObjectStorage.js +0 -3
- package/dist/esm/sqlite/SqliteObjectStorage.js.map +1 -1
- package/dist/esm/sqlite/SqliteObjectView.js +0 -5
- package/dist/esm/sqlite/SqliteObjectView.js.map +1 -1
- package/dist/esm/sqlite/queries/eventLockTableInit.js +1 -1
- package/dist/esm/sqlite/utils/getEventId.js +0 -3
- package/dist/esm/sqlite/utils/getEventId.js.map +1 -1
- package/dist/esm/sqlite/utils/guid.js +0 -3
- package/dist/esm/sqlite/utils/guid.js.map +1 -1
- package/dist/esm/utils/Deferred.js +0 -3
- package/dist/esm/utils/Deferred.js.map +1 -1
- package/dist/esm/utils/Lock.js +0 -27
- package/dist/esm/utils/Lock.js.map +1 -1
- package/dist/esm/utils/MapAssertable.js +0 -6
- package/dist/esm/utils/MapAssertable.js.map +1 -1
- package/dist/esm/utils/assert.js +4 -0
- package/dist/esm/utils/assert.js.map +1 -1
- package/dist/esm/utils/getClassName.js +0 -3
- package/dist/esm/utils/getClassName.js.map +1 -1
- package/dist/esm/utils/getHandler.js +0 -3
- package/dist/esm/utils/getHandler.js.map +1 -1
- package/dist/esm/utils/getMessageHandlerNames.js +0 -4
- package/dist/esm/utils/getMessageHandlerNames.js.map +1 -1
- package/dist/esm/utils/sagaId.js +0 -1
- package/dist/esm/utils/sagaId.js.map +1 -1
- package/dist/esm/utils/setupOneTimeEmitterSubscription.js +2 -15
- package/dist/esm/utils/setupOneTimeEmitterSubscription.js.map +1 -1
- package/dist/esm/utils/subscribe.js +2 -8
- package/dist/esm/utils/subscribe.js.map +1 -1
- package/dist/esm/utils/validateHandlers.js +0 -3
- package/dist/esm/utils/validateHandlers.js.map +1 -1
- package/dist/esm/workers/AbstractWorkerProjection.js +21 -52
- package/dist/esm/workers/AbstractWorkerProjection.js.map +1 -1
- package/dist/esm/workers/WorkerProxyProjection.js +3 -8
- package/dist/esm/workers/WorkerProxyProjection.js.map +1 -1
- package/dist/esm/workers/index.js +1 -0
- package/dist/esm/workers/index.js.map +1 -1
- package/dist/esm/workers/interfaces/IProxyProjection.js +2 -0
- package/dist/esm/workers/interfaces/IProxyProjection.js.map +1 -0
- package/dist/esm/workers/interfaces/IWorkerProjection.js +2 -0
- package/dist/esm/workers/interfaces/IWorkerProjection.js.map +1 -0
- package/dist/esm/workers/interfaces/index.js +2 -0
- package/dist/esm/workers/interfaces/index.js.map +1 -0
- package/dist/esm/workers/protocol.js.map +1 -1
- package/dist/esm/workers/utils/ProjectionView.js +2 -0
- package/dist/esm/workers/utils/ProjectionView.js.map +1 -0
- package/dist/esm/workers/utils/createWorker.js +0 -10
- package/dist/esm/workers/utils/createWorker.js.map +1 -1
- package/dist/esm/workers/utils/createWorkerInstance.js +23 -0
- package/dist/esm/workers/utils/createWorkerInstance.js.map +1 -0
- package/dist/esm/workers/utils/index.js +2 -0
- package/dist/esm/workers/utils/index.js.map +1 -1
- package/dist/esm/workers/utils/nodeEndpoint.js +0 -2
- package/dist/esm/workers/utils/nodeEndpoint.js.map +1 -1
- package/dist/esm/workers/utils/workerProxyFactory.js +18 -0
- package/dist/esm/workers/utils/workerProxyFactory.js.map +1 -0
- package/eslint.config.mjs +3 -1
- package/package.json +20 -12
- package/src/AbstractSaga.ts +3 -3
- package/src/AggregateCommandHandler.ts +51 -28
- package/src/CommandBus.ts +0 -3
- package/src/CqrsContainerBuilder.ts +4 -0
- package/src/EventStore.ts +7 -4
- package/src/in-memory/InMemoryView.ts +2 -5
- package/src/interfaces/IAggregate.ts +2 -1
- package/src/interfaces/IContainer.ts +12 -1
- package/src/sqlite/SqliteEventLocker.ts +3 -3
- package/src/sqlite/queries/eventLockTableInit.ts +1 -1
- package/src/utils/assert.ts +5 -0
- package/src/utils/getMessageHandlerNames.ts +19 -4
- package/src/utils/setupOneTimeEmitterSubscription.ts +2 -2
- package/src/utils/subscribe.ts +2 -2
- package/src/workers/AbstractWorkerProjection.ts +44 -49
- package/src/workers/WorkerProxyProjection.ts +15 -23
- package/src/workers/index.ts +1 -0
- package/src/workers/interfaces/IProxyProjection.ts +23 -0
- package/src/workers/interfaces/IWorkerProjection.ts +26 -0
- package/src/workers/interfaces/index.ts +2 -0
- package/src/workers/protocol.ts +0 -8
- package/src/workers/utils/ProjectionView.ts +3 -0
- package/src/workers/utils/createWorkerInstance.ts +52 -0
- package/src/workers/utils/index.ts +3 -0
- package/src/workers/utils/workerProxyFactory.ts +62 -0
- package/tsconfig.esm.json +1 -0
- package/types/AbstractAggregate.d.ts +0 -52
- package/types/AbstractProjection.d.ts +0 -47
- package/types/AbstractSaga.d.ts +0 -23
- package/types/AggregateCommandHandler.d.ts +0 -9
- package/types/CommandBus.d.ts +0 -17
- package/types/CqrsContainerBuilder.d.ts +0 -8
- package/types/Event.d.ts +0 -6
- package/types/EventDispatcher.d.ts +0 -15
- package/types/EventIdAugmentor.d.ts +0 -6
- package/types/EventStore.d.ts +1 -15
- package/types/SagaEventHandler.d.ts +0 -8
- package/types/errors/ConcurrencyError.d.ts +0 -6
- package/types/in-memory/InMemoryEventStorage.d.ts +0 -10
- package/types/in-memory/InMemoryLock.d.ts +0 -14
- package/types/in-memory/InMemoryMessageBus.d.ts +0 -20
- package/types/in-memory/InMemorySnapshotStorage.d.ts +0 -27
- package/types/in-memory/InMemoryView.d.ts +0 -27
- package/types/in-memory/utils/nextCycle.d.ts +0 -3
- package/types/interfaces/IAggregate.d.ts +0 -49
- package/types/interfaces/IContainer.d.ts +1 -3
- package/types/interfaces/IDispatchPipelineProcessor.d.ts +0 -17
- package/types/interfaces/IEvent.d.ts +0 -1
- package/types/interfaces/IEventLocker.d.ts +0 -17
- package/types/interfaces/IEventStorageReader.d.ts +0 -27
- package/types/interfaces/IIdentifierProvider.d.ts +0 -5
- package/types/interfaces/IMessage.d.ts +0 -12
- package/types/interfaces/IMutableState.d.ts +0 -9
- package/types/interfaces/IObservable.d.ts +0 -6
- package/types/interfaces/IObservableQueueProvider.d.ts +0 -3
- package/types/interfaces/IProjection.d.ts +0 -3
- package/types/interfaces/ISaga.d.ts +0 -19
- package/types/interfaces/IViewLocker.d.ts +0 -27
- package/types/rabbitmq/RabbitMqEventBus.d.ts +0 -23
- package/types/rabbitmq/RabbitMqGateway.d.ts +0 -64
- package/types/rabbitmq/utils/registerExitCleanup.d.ts +0 -7
- package/types/sqlite/AbstractSqliteAccessor.d.ts +0 -16
- package/types/sqlite/AbstractSqliteView.d.ts +0 -3
- package/types/sqlite/SqliteEventLocker.d.ts +0 -11
- package/types/sqlite/SqliteObjectView.d.ts +0 -3
- package/types/sqlite/SqliteProjectionDataParams.d.ts +0 -10
- package/types/sqlite/SqliteViewLocker.d.ts +0 -10
- package/types/sqlite/utils/getEventId.d.ts +0 -3
- package/types/sqlite/utils/guid.d.ts +0 -3
- package/types/utils/Deferred.d.ts +0 -3
- package/types/utils/Lock.d.ts +0 -14
- package/types/utils/MapAssertable.d.ts +0 -6
- package/types/utils/assert.d.ts +1 -0
- package/types/utils/getClassName.d.ts +0 -3
- package/types/utils/getHandler.d.ts +0 -3
- package/types/utils/getMessageHandlerNames.d.ts +4 -5
- package/types/utils/setupOneTimeEmitterSubscription.d.ts +0 -10
- package/types/utils/subscribe.d.ts +0 -3
- package/types/utils/validateHandlers.d.ts +0 -3
- package/types/workers/AbstractWorkerProjection.d.ts +7 -29
- package/types/workers/WorkerProxyProjection.d.ts +7 -19
- package/types/workers/index.d.ts +1 -0
- package/types/workers/interfaces/IProxyProjection.d.ts +11 -0
- package/types/workers/interfaces/IWorkerProjection.d.ts +10 -0
- package/types/workers/interfaces/index.d.ts +2 -0
- package/types/workers/protocol.d.ts +0 -6
- package/types/workers/utils/ProjectionView.d.ts +2 -0
- package/types/workers/utils/createWorker.d.ts +0 -7
- package/types/workers/utils/createWorkerInstance.d.ts +3 -0
- package/types/workers/utils/index.d.ts +3 -0
- package/types/workers/utils/workerProxyFactory.d.ts +6 -0
- package/src/workers/readme.md +0 -90
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,41 @@
|
|
|
1
|
+
# [1.0.0-rc.44](https://github.com/snatalenko/node-cqrs/compare/v1.0.0-rc.43...v1.0.0-rc.44) (2026-03-18)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Internal Fixes
|
|
5
|
+
|
|
6
|
+
* Upgrade di0 to latest stable version with resolvers ([5f2c9ad](https://github.com/snatalenko/node-cqrs/commit/5f2c9adfd101bb53e7250db95c89f1cbd1730362))
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
# [1.0.0-rc.43](https://github.com/snatalenko/node-cqrs/compare/v1.0.0-rc.42...v1.0.0-rc.43) (2026-03-18)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
### Changes
|
|
13
|
+
|
|
14
|
+
* Allow extending WorkerProxyProjection via workerProxyFactory custom proxy type ([c9860b6](https://github.com/snatalenko/node-cqrs/commit/c9860b605a52e0cf0be167917b66e5efeb0fe29c))
|
|
15
|
+
|
|
16
|
+
### Fixes
|
|
17
|
+
|
|
18
|
+
* All errors being ignored with concurrency resolution set to 'ignore' ([0cb10bc](https://github.com/snatalenko/node-cqrs/commit/0cb10bcaef5ec76050b14caf6d5ad710a005b6d0))
|
|
19
|
+
|
|
20
|
+
### Documentation
|
|
21
|
+
|
|
22
|
+
* Update package description and keywords ([15ef847](https://github.com/snatalenko/node-cqrs/commit/15ef847b4b7dc7007f38423580704604901fc588))
|
|
23
|
+
* Add AbstractWorkerProjection description to readme.md ([dd3952c](https://github.com/snatalenko/node-cqrs/commit/dd3952cc79d8a5762cd5b5bc320429ac9d0e7403))
|
|
24
|
+
|
|
25
|
+
### Tests
|
|
26
|
+
|
|
27
|
+
* Migrate chai+sinon tests to pure jest and remove legacy deps ([86840dd](https://github.com/snatalenko/node-cqrs/commit/86840dd7313e6af217fb74b7c32227d09860433b))
|
|
28
|
+
|
|
29
|
+
### Build System
|
|
30
|
+
|
|
31
|
+
* Remove comments from compiled dists ([d7124bd](https://github.com/snatalenko/node-cqrs/commit/d7124bdb47d8cef12280f404146b4f4d8e0ae1e7))
|
|
32
|
+
|
|
33
|
+
### Internal Fixes
|
|
34
|
+
|
|
35
|
+
* Allow EventStore to resolve reader from eventStorage alias ([91cd778](https://github.com/snatalenko/node-cqrs/commit/91cd778171ed1ace11802a4ef1fb05384de11433))
|
|
36
|
+
* Update dependencies ([8c7478e](https://github.com/snatalenko/node-cqrs/commit/8c7478e6f569426c8ad94fed9bc84a159f31bf1c))
|
|
37
|
+
|
|
38
|
+
|
|
1
39
|
# [1.0.0-rc.42](https://github.com/snatalenko/node-cqrs/compare/v1.0.0-rc.41...v1.0.0-rc.42) (2026-02-27)
|
|
2
40
|
|
|
3
41
|
|
package/CONTRIBUTING.md
CHANGED
|
@@ -66,7 +66,7 @@ npm run lint # Run ESLint
|
|
|
66
66
|
### Running a single test file
|
|
67
67
|
|
|
68
68
|
```bash
|
|
69
|
-
npm
|
|
69
|
+
npm test tests/unit/CommandBus.test.ts
|
|
70
70
|
```
|
|
71
71
|
|
|
72
72
|
## Browser bundle
|
|
@@ -130,7 +130,17 @@ Code style and formatting are enforced via [EditorConfig](https://editorconfig.o
|
|
|
130
130
|
- **Type-only imports:** Use the `type` keyword for imports that are only used as types
|
|
131
131
|
- **`.ts` file extensions in imports:** Always use explicit `.ts` extensions in relative import paths
|
|
132
132
|
|
|
133
|
-
|
|
133
|
+
## Verification
|
|
134
|
+
|
|
135
|
+
Run the following checks to verify your changes:
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
npm test # Unit tests pass
|
|
139
|
+
npm run lint # No lint errors
|
|
140
|
+
npm run build # ESM and CJS build successfully
|
|
141
|
+
npm run examples # Examples run without errors
|
|
142
|
+
npm run test:examples # Example unit tests pass
|
|
143
|
+
```
|
|
134
144
|
|
|
135
145
|
## Pull requests
|
|
136
146
|
|
package/README.md
CHANGED
|
@@ -430,7 +430,64 @@ import { RabbitMqEventBus, RabbitMqGateway } from 'node-cqrs/rabbitmq';
|
|
|
430
430
|
import { AbstractWorkerProjection } from 'node-cqrs/workers';
|
|
431
431
|
```
|
|
432
432
|
|
|
433
|
-
|
|
433
|
+
Workers are an execution mode for projections.
|
|
434
|
+
|
|
435
|
+
You still define one projection class, but it runs as:
|
|
436
|
+
1. A real projection inside a worker thread (handles events, mutates the view).
|
|
437
|
+
2. A proxy projection in the main thread (forwards calls to the worker and exposes the remote view).
|
|
438
|
+
|
|
439
|
+
This lets you keep your projection code unchanged while moving heavy work off the main thread.
|
|
440
|
+
|
|
441
|
+
Quickstart:
|
|
442
|
+
1. Create your projection by extending `AbstractWorkerProjection`.
|
|
443
|
+
2. In the worker module, call `YourProjection.createInstanceInWorkerThread()`.
|
|
444
|
+
3. In your app container, register `YourProjection.workerProxyFactory` and use it like a normal projection.
|
|
445
|
+
|
|
446
|
+
Worker module example (CJS):
|
|
447
|
+
|
|
448
|
+
```js
|
|
449
|
+
const { AbstractWorkerProjection } = require('node-cqrs/workers');
|
|
450
|
+
|
|
451
|
+
class CounterView {
|
|
452
|
+
counter = 0;
|
|
453
|
+
increment() { this.counter += 1; }
|
|
454
|
+
getCounter() { return this.counter; }
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
class CounterProjection extends AbstractWorkerProjection {
|
|
458
|
+
static get workerModulePath() {
|
|
459
|
+
return __filename;
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
constructor() {
|
|
463
|
+
super({ view: new CounterView() });
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
somethingHappened() {
|
|
467
|
+
this.view.increment();
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
CounterProjection.createInstanceInWorkerThread();
|
|
472
|
+
module.exports = CounterProjection;
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
Main thread usage (DI):
|
|
476
|
+
|
|
477
|
+
```js
|
|
478
|
+
const CounterProjection = require('./CounterProjection.cjs');
|
|
479
|
+
const { ContainerBuilder } = require('node-cqrs');
|
|
480
|
+
|
|
481
|
+
const builder = new ContainerBuilder();
|
|
482
|
+
builder.registerProjection(CounterProjection.workerProxyFactory, 'counterView');
|
|
483
|
+
|
|
484
|
+
const { eventStore, counterView } = builder.container();
|
|
485
|
+
await eventStore.dispatch([{ id: '1', type: 'somethingHappened', payload: {} }]);
|
|
486
|
+
const counter = await counterView.getCounter();
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
`workerModulePath` should point to executable JavaScript (`__filename` in CJS, `fileURLToPath(import.meta.url)` in ESM).
|
|
490
|
+
If you need a custom proxy projection, you can still use `workerProxyFactory(...)` directly (advanced usage).
|
|
434
491
|
|
|
435
492
|
|
|
436
493
|
## Examples
|
|
@@ -4,41 +4,16 @@ exports.AbstractAggregate = void 0;
|
|
|
4
4
|
const AggregateCommandHandler_ts_1 = require("./AggregateCommandHandler.js");
|
|
5
5
|
const index_ts_1 = require("./interfaces/index.js");
|
|
6
6
|
const index_ts_2 = require("./utils/index.js");
|
|
7
|
-
/**
|
|
8
|
-
* Base class for Aggregate definition
|
|
9
|
-
*/
|
|
10
7
|
class AbstractAggregate {
|
|
11
|
-
/**
|
|
12
|
-
* List of command names handled by the Aggregate.
|
|
13
|
-
*
|
|
14
|
-
* Can be overridden in the Aggregate implementation to explicitly define supported commands.
|
|
15
|
-
* If not overridden, all public methods will be treated as command handlers by default.
|
|
16
|
-
*
|
|
17
|
-
* @example ['createUser', 'changePassword'];
|
|
18
|
-
*/
|
|
19
8
|
static get handles() {
|
|
20
9
|
return (0, index_ts_2.getMessageHandlerNames)(this);
|
|
21
10
|
}
|
|
22
|
-
/**
|
|
23
|
-
* Optional list of event types that are required to restore the aggregate state.
|
|
24
|
-
*
|
|
25
|
-
* @see IAggregateConstructor
|
|
26
|
-
*/
|
|
27
11
|
static get restoresFrom() {
|
|
28
12
|
return undefined;
|
|
29
13
|
}
|
|
30
|
-
/**
|
|
31
|
-
* Defines retry behavior when a ConcurrencyError is thrown during event dispatch.
|
|
32
|
-
*
|
|
33
|
-
* @see IAggregateConstructor
|
|
34
|
-
*/
|
|
35
14
|
static get retryOnConcurrencyError() {
|
|
36
15
|
return undefined;
|
|
37
16
|
}
|
|
38
|
-
/**
|
|
39
|
-
* Convenience helper to create an `AggregateCommandHandler` for this aggregate type and
|
|
40
|
-
* subscribe it to the provided `commandBus`.
|
|
41
|
-
*/
|
|
42
17
|
static register(eventStore, commandBus) {
|
|
43
18
|
const handler = new AggregateCommandHandler_ts_1.AggregateCommandHandler({ aggregateType: this, eventStore });
|
|
44
19
|
handler.subscribe(commandBus);
|
|
@@ -47,33 +22,18 @@ class AbstractAggregate {
|
|
|
47
22
|
#id;
|
|
48
23
|
#version = 0;
|
|
49
24
|
#snapshotVersion;
|
|
50
|
-
/** List of emitted events */
|
|
51
25
|
changes = [];
|
|
52
|
-
/** Internal aggregate state */
|
|
53
26
|
state;
|
|
54
|
-
/** Command being handled by aggregate */
|
|
55
27
|
command;
|
|
56
|
-
/** Unique aggregate instance identifier */
|
|
57
28
|
get id() {
|
|
58
29
|
return this.#id;
|
|
59
30
|
}
|
|
60
|
-
/** Aggregate instance version */
|
|
61
31
|
get version() {
|
|
62
32
|
return this.#version;
|
|
63
33
|
}
|
|
64
|
-
/** Restored snapshot version */
|
|
65
34
|
get snapshotVersion() {
|
|
66
35
|
return this.#snapshotVersion;
|
|
67
36
|
}
|
|
68
|
-
/**
|
|
69
|
-
* Override to define whether an aggregate state snapshot should be taken
|
|
70
|
-
*
|
|
71
|
-
* @example
|
|
72
|
-
* // create snapshot every 50 events if new events were emitted
|
|
73
|
-
* return !!this.changes.length
|
|
74
|
-
* && this.version - (this.snapshotVersion ?? 0) > 50;
|
|
75
|
-
*/
|
|
76
|
-
// eslint-disable-next-line class-methods-use-this
|
|
77
37
|
get shouldTakeSnapshot() {
|
|
78
38
|
return false;
|
|
79
39
|
}
|
|
@@ -91,7 +51,6 @@ class AbstractAggregate {
|
|
|
91
51
|
if (events)
|
|
92
52
|
events.forEach(event => this.mutate(event));
|
|
93
53
|
}
|
|
94
|
-
/** Mutate aggregate state and increment aggregate version */
|
|
95
54
|
mutate(event) {
|
|
96
55
|
if (event.aggregateVersion !== undefined)
|
|
97
56
|
this.#version = event.aggregateVersion;
|
|
@@ -108,7 +67,6 @@ class AbstractAggregate {
|
|
|
108
67
|
}
|
|
109
68
|
this.#version += 1;
|
|
110
69
|
}
|
|
111
|
-
/** Pass command to command handler */
|
|
112
70
|
async handle(command) {
|
|
113
71
|
(0, index_ts_2.assertMessage)(command, 'command');
|
|
114
72
|
const handler = (0, index_ts_2.getHandler)(this, command.type);
|
|
@@ -126,10 +84,6 @@ class AbstractAggregate {
|
|
|
126
84
|
this.command = undefined;
|
|
127
85
|
}
|
|
128
86
|
}
|
|
129
|
-
/**
|
|
130
|
-
* Get the events emitted during commands processing.
|
|
131
|
-
* If a snapshot should be taken, the snapshot event is added to the end.
|
|
132
|
-
*/
|
|
133
87
|
getUncommittedEvents(offset) {
|
|
134
88
|
if (this.shouldTakeSnapshot)
|
|
135
89
|
this.takeSnapshot();
|
|
@@ -141,7 +95,6 @@ class AbstractAggregate {
|
|
|
141
95
|
this.emitRaw(event);
|
|
142
96
|
return event;
|
|
143
97
|
}
|
|
144
|
-
/** Format event based on a current aggregate state and a command being executed */
|
|
145
98
|
makeEvent(type, payload, sourceCommand) {
|
|
146
99
|
const event = {
|
|
147
100
|
aggregateId: this.id,
|
|
@@ -150,7 +103,6 @@ class AbstractAggregate {
|
|
|
150
103
|
payload
|
|
151
104
|
};
|
|
152
105
|
if (sourceCommand) {
|
|
153
|
-
// augment event with command context
|
|
154
106
|
const { context, sagaOrigins } = sourceCommand;
|
|
155
107
|
if (context !== undefined)
|
|
156
108
|
event.context = context;
|
|
@@ -159,32 +111,27 @@ class AbstractAggregate {
|
|
|
159
111
|
}
|
|
160
112
|
return event;
|
|
161
113
|
}
|
|
162
|
-
/** Register aggregate event and mutate aggregate state */
|
|
163
114
|
emitRaw(event) {
|
|
164
115
|
(0, index_ts_2.assertDefined)(event?.aggregateId, 'event.aggregateId');
|
|
165
116
|
(0, index_ts_2.assertNumber)(event?.aggregateVersion, 'event.aggregateVersion');
|
|
166
117
|
this.mutate(event);
|
|
167
118
|
this.changes.push(event);
|
|
168
119
|
}
|
|
169
|
-
/** Create an aggregate state snapshot */
|
|
170
120
|
makeSnapshot() {
|
|
171
121
|
if (!this.state)
|
|
172
122
|
throw new Error('state property is empty, either define state or override makeSnapshot method');
|
|
173
123
|
return (0, index_ts_2.clone)(this.state);
|
|
174
124
|
}
|
|
175
|
-
/** Add snapshot event to the collection of emitted events */
|
|
176
125
|
takeSnapshot() {
|
|
177
126
|
const snapshotEvent = this.emit(index_ts_1.SNAPSHOT_EVENT_TYPE, this.makeSnapshot());
|
|
178
127
|
this.#snapshotVersion = snapshotEvent.aggregateVersion;
|
|
179
128
|
}
|
|
180
|
-
/** Restore aggregate state from a snapshot */
|
|
181
129
|
restoreSnapshot(snapshotEvent) {
|
|
182
130
|
(0, index_ts_2.assertSnapshotEvent)(snapshotEvent, 'snapshotEvent');
|
|
183
131
|
if (!this.state)
|
|
184
132
|
throw new Error('state property is empty, either defined state or override restoreSnapshot method');
|
|
185
133
|
Object.assign(this.state, (0, index_ts_2.clone)(snapshotEvent.payload));
|
|
186
134
|
}
|
|
187
|
-
/** Get human-readable aggregate identifier */
|
|
188
135
|
toString() {
|
|
189
136
|
return `${(0, index_ts_2.getClassName)(this)} ${this.id} (v${this.version})`;
|
|
190
137
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractAggregate.js","sourceRoot":"","sources":["../../src/AbstractAggregate.ts"],"names":[],"mappings":";;;AAAA,6EAAuE;AACvE,oDAc+B;AAE/B,+CAa0B;
|
|
1
|
+
{"version":3,"file":"AbstractAggregate.js","sourceRoot":"","sources":["../../src/AbstractAggregate.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,14 +5,7 @@ const Event_ts_1 = require("./Event.js");
|
|
|
5
5
|
const InMemoryView_ts_1 = require("./in-memory/InMemoryView.js");
|
|
6
6
|
const index_ts_1 = require("./interfaces/index.js");
|
|
7
7
|
const index_ts_2 = require("./utils/index.js");
|
|
8
|
-
/**
|
|
9
|
-
* Base class for Projection definition
|
|
10
|
-
*/
|
|
11
8
|
class AbstractProjection {
|
|
12
|
-
/**
|
|
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.
|
|
15
|
-
*/
|
|
16
9
|
static get handles() {
|
|
17
10
|
return (0, index_ts_2.getMessageHandlerNames)(this);
|
|
18
11
|
}
|
|
@@ -20,20 +13,12 @@ class AbstractProjection {
|
|
|
20
13
|
#viewLocker;
|
|
21
14
|
#eventLocker;
|
|
22
15
|
_logger;
|
|
23
|
-
/**
|
|
24
|
-
* The default view associated with the projection.
|
|
25
|
-
* Can optionally implement IViewLocker and/or IEventLocker.
|
|
26
|
-
*/
|
|
27
16
|
get view() {
|
|
28
17
|
return this.#view ?? (this.#view = new InMemoryView_ts_1.InMemoryView());
|
|
29
18
|
}
|
|
30
19
|
set view(value) {
|
|
31
20
|
this.#view = value;
|
|
32
21
|
}
|
|
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
22
|
get _viewLocker() {
|
|
38
23
|
if (this.#viewLocker === undefined)
|
|
39
24
|
this.#viewLocker = (0, index_ts_1.isViewLocker)(this.view) ? this.view : null;
|
|
@@ -42,9 +27,6 @@ class AbstractProjection {
|
|
|
42
27
|
set _viewLocker(value) {
|
|
43
28
|
this.#viewLocker = value;
|
|
44
29
|
}
|
|
45
|
-
/**
|
|
46
|
-
* Tracks event processing state to prevent concurrent handling by multiple processes.
|
|
47
|
-
*/
|
|
48
30
|
get _eventLocker() {
|
|
49
31
|
if (this.#eventLocker === undefined)
|
|
50
32
|
this.#eventLocker = (0, index_ts_1.isEventLocker)(this.view) ? this.view : null;
|
|
@@ -62,16 +44,11 @@ class AbstractProjection {
|
|
|
62
44
|
logger.child({ service: (0, index_ts_2.getClassName)(this) }) :
|
|
63
45
|
logger;
|
|
64
46
|
}
|
|
65
|
-
/**
|
|
66
|
-
* Subscribe to event store
|
|
67
|
-
* and restore view state from not yet projected events
|
|
68
|
-
*/
|
|
69
47
|
subscribe(eventStore) {
|
|
70
48
|
(0, index_ts_2.subscribe)(eventStore, this, {
|
|
71
49
|
masterHandler: this.project
|
|
72
50
|
});
|
|
73
51
|
}
|
|
74
|
-
/** Pass event to projection event handler */
|
|
75
52
|
async project(event) {
|
|
76
53
|
if (this._viewLocker && !this._viewLocker.ready) {
|
|
77
54
|
this._logger?.debug(`view is locked, awaiting until it is ready to process ${(0, Event_ts_1.describe)(event)}`);
|
|
@@ -80,7 +57,6 @@ class AbstractProjection {
|
|
|
80
57
|
}
|
|
81
58
|
return this._project(event);
|
|
82
59
|
}
|
|
83
|
-
/** Pass event to projection event handler, without awaiting for restore operation to complete */
|
|
84
60
|
async _project(event) {
|
|
85
61
|
const handler = (0, index_ts_2.getHandler)(this, event.type);
|
|
86
62
|
if (!handler)
|
|
@@ -94,12 +70,6 @@ class AbstractProjection {
|
|
|
94
70
|
if (this._eventLocker)
|
|
95
71
|
await this._eventLocker.markAsProjected(event);
|
|
96
72
|
}
|
|
97
|
-
/**
|
|
98
|
-
* Restore view state from not-yet-projected events.
|
|
99
|
-
*
|
|
100
|
-
* Lock the view to ensure same restoring procedure
|
|
101
|
-
* won't be performed by another projection instance.
|
|
102
|
-
* */
|
|
103
73
|
async restore(eventStore) {
|
|
104
74
|
if (this._viewLocker)
|
|
105
75
|
await this._viewLocker.lock();
|
|
@@ -107,7 +77,6 @@ class AbstractProjection {
|
|
|
107
77
|
if (this._viewLocker)
|
|
108
78
|
this._viewLocker.unlock();
|
|
109
79
|
}
|
|
110
|
-
/** Restore view state from not-yet-projected events */
|
|
111
80
|
async _restore(eventStore) {
|
|
112
81
|
(0, index_ts_2.assertFunction)(eventStore?.getEventsByTypes, 'eventStore.getEventsByTypes');
|
|
113
82
|
let lastEvent;
|
|
@@ -131,11 +100,6 @@ class AbstractProjection {
|
|
|
131
100
|
}
|
|
132
101
|
this._logger?.info(`view restored from ${eventsCount} event(s) in ${Date.now() - startTs} ms`);
|
|
133
102
|
}
|
|
134
|
-
/**
|
|
135
|
-
* Handle error on restoring.
|
|
136
|
-
*
|
|
137
|
-
* Logs and throws error by default
|
|
138
|
-
*/
|
|
139
103
|
_onRestoringError(error, event) {
|
|
140
104
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
141
105
|
this._logger?.error(`view restoring has failed (view remains locked): ${errorMessage}`, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractProjection.js","sourceRoot":"","sources":["../../src/AbstractProjection.ts"],"names":[],"mappings":";;;AAAA,yCAAsC;AACtC,iEAA2D;AAC3D,oDAW+B;AAE/B,+CAO0B;
|
|
1
|
+
{"version":3,"file":"AbstractProjection.js","sourceRoot":"","sources":["../../src/AbstractProjection.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/AbstractSaga.js
CHANGED
|
@@ -3,26 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.AbstractSaga = void 0;
|
|
4
4
|
const SagaEventHandler_ts_1 = require("./SagaEventHandler.js");
|
|
5
5
|
const index_ts_1 = require("./utils/index.js");
|
|
6
|
-
/**
|
|
7
|
-
* Base class for Saga definition
|
|
8
|
-
*/
|
|
9
6
|
class AbstractSaga {
|
|
10
|
-
/**
|
|
11
|
-
* Optional list of events that start new saga.
|
|
12
|
-
*
|
|
13
|
-
* When not defined, saga start is inferred by the absence of `message.sagaOrigins[sagaDescriptor]`.
|
|
14
|
-
*/
|
|
15
7
|
static get startsWith() {
|
|
16
8
|
return undefined;
|
|
17
9
|
}
|
|
18
|
-
/** List of event types being handled by Saga, can be overridden in Saga implementation */
|
|
19
10
|
static get handles() {
|
|
20
11
|
return (0, index_ts_1.getMessageHandlerNames)(this);
|
|
21
12
|
}
|
|
22
|
-
/**
|
|
23
|
-
* Convenience helper to create a `SagaEventHandler` for this saga type and subscribe it to
|
|
24
|
-
* the provided `eventStore`.
|
|
25
|
-
*/
|
|
26
13
|
static register(eventStore, commandBus) {
|
|
27
14
|
const handler = new SagaEventHandler_ts_1.SagaEventHandler({
|
|
28
15
|
sagaType: this,
|
|
@@ -32,11 +19,9 @@ class AbstractSaga {
|
|
|
32
19
|
handler.subscribe(eventStore);
|
|
33
20
|
return handler;
|
|
34
21
|
}
|
|
35
|
-
/** Saga ID */
|
|
36
22
|
get id() {
|
|
37
23
|
return this.#id;
|
|
38
24
|
}
|
|
39
|
-
/** Saga version */
|
|
40
25
|
get version() {
|
|
41
26
|
return this.#version;
|
|
42
27
|
}
|
|
@@ -45,9 +30,6 @@ class AbstractSaga {
|
|
|
45
30
|
#version = 0;
|
|
46
31
|
#messages = [];
|
|
47
32
|
#handling = false;
|
|
48
|
-
/**
|
|
49
|
-
* Creates an instance of AbstractSaga
|
|
50
|
-
*/
|
|
51
33
|
constructor(options) {
|
|
52
34
|
(0, index_ts_1.assertDefined)(options, 'options');
|
|
53
35
|
(0, index_ts_1.assertDefined)(options.id, 'options.id');
|
|
@@ -57,7 +39,6 @@ class AbstractSaga {
|
|
|
57
39
|
(0, index_ts_1.validateHandlers)(this, 'startsWith');
|
|
58
40
|
(0, index_ts_1.validateHandlers)(this, 'handles');
|
|
59
41
|
}
|
|
60
|
-
/** Modify saga state by applying an event */
|
|
61
42
|
mutate(event) {
|
|
62
43
|
(0, index_ts_1.assertEvent)(event, 'event');
|
|
63
44
|
if (this.state) {
|
|
@@ -69,14 +50,12 @@ class AbstractSaga {
|
|
|
69
50
|
}
|
|
70
51
|
this.#version += 1;
|
|
71
52
|
}
|
|
72
|
-
/** Process saga event and return produced commands */
|
|
73
53
|
async handle(event) {
|
|
74
54
|
(0, index_ts_1.assertEvent)(event, 'event');
|
|
75
55
|
if (this.#handling)
|
|
76
56
|
throw new Error('Another event is being processed, concurrent handling is not allowed');
|
|
77
57
|
const handler = (0, index_ts_1.getHandler)(this, event.type);
|
|
78
|
-
|
|
79
|
-
throw new Error(`'${event.type}' handler is not defined or not a function`);
|
|
58
|
+
(0, index_ts_1.assertFunction)(handler, `${event.type} handler`);
|
|
80
59
|
this.#handling = true;
|
|
81
60
|
this.#messages.length = 0;
|
|
82
61
|
try {
|
|
@@ -96,12 +75,10 @@ class AbstractSaga {
|
|
|
96
75
|
payload
|
|
97
76
|
});
|
|
98
77
|
}
|
|
99
|
-
/** Put a command to the execution queue */
|
|
100
78
|
enqueueRaw(command) {
|
|
101
79
|
(0, index_ts_1.assertMessage)(command, 'command');
|
|
102
80
|
this.#messages.push(command);
|
|
103
81
|
}
|
|
104
|
-
/** Get human-readable Saga name */
|
|
105
82
|
toString() {
|
|
106
83
|
return `${(0, index_ts_1.getClassName)(this)} ${this.id} (v${this.version})`;
|
|
107
84
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractSaga.js","sourceRoot":"","sources":["../../src/AbstractSaga.ts"],"names":[],"mappings":";;;AAIA,+DAAyD;AACzD,+
|
|
1
|
+
{"version":3,"file":"AbstractSaga.js","sourceRoot":"","sources":["../../src/AbstractSaga.ts"],"names":[],"mappings":"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"}
|