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
package/CHANGELOG.md
CHANGED
|
@@ -1,27 +1,109 @@
|
|
|
1
|
-
# [1.0.0-rc.
|
|
1
|
+
# [1.0.0-rc.20](https://github.com/snatalenko/node-cqrs/compare/v1.0.0-rc.19...v1.0.0-rc.20) (2025-10-13)
|
|
2
2
|
|
|
3
3
|
|
|
4
|
+
### Changes
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
* Enhance type safety in CqrsContainerBuilder with generics ([025765c](https://github.com/snatalenko/node-cqrs/commit/025765cc31eec5a004142dff5cafd8264af10ea9))
|
|
6
7
|
|
|
7
8
|
|
|
8
|
-
|
|
9
|
+
# [1.0.0-rc.19](https://github.com/snatalenko/node-cqrs/compare/v1.0.0-rc.18...v1.0.0-rc.19) (2025-09-24)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
# [1.0.0-rc.18](https://github.com/snatalenko/node-cqrs/compare/v1.0.0-rc.17...v1.0.0-rc.18) (2025-09-11)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
# [1.0.0-rc.17](https://github.com/snatalenko/node-cqrs/compare/v1.0.0-rc.16...v1.0.0-rc.17) (2025-08-29)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
# [1.0.0-rc.16](https://github.com/snatalenko/node-cqrs/compare/v1.0.0-rc.15...v1.0.0-rc.16) (2025-08-29)
|
|
22
|
+
|
|
9
23
|
|
|
10
|
-
* Add NPM publishing script ([3372990](https://github.com/snatalenko/node-cqrs/commit/3372990ba2549695398e0949e35009396e660005))
|
|
11
|
-
* Suppress audit and test for tags ([574a00c](https://github.com/snatalenko/node-cqrs/commit/574a00cc53af009994ca4dd3278cb764743b4ad6))
|
|
12
24
|
|
|
25
|
+
# [1.0.0-rc.15](https://github.com/snatalenko/node-cqrs/compare/v1.0.0-rc.14...v1.0.0-rc.15) (2025-08-24)
|
|
13
26
|
|
|
14
|
-
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
# [1.0.0-rc.14](https://github.com/snatalenko/node-cqrs/compare/v1.0.0-rc.13...v1.0.0-rc.14) (2025-08-15)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
# [1.0.0-rc.13](https://github.com/snatalenko/node-cqrs/compare/v1.0.0-rc.12...v1.0.0-rc.13) (2025-08-14)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
# [1.0.0-rc.12](https://github.com/snatalenko/node-cqrs/compare/v1.0.0-rc.11...v1.0.0-rc.12) (2025-08-11)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
# [1.0.0-rc.11](https://github.com/snatalenko/node-cqrs/compare/v1.0.0-rc.10...v1.0.0-rc.11) (2025-05-09)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
### Changes
|
|
45
|
+
|
|
46
|
+
* Cache immediate aggregates to handle concurrent commands ([e193c4c](https://github.com/snatalenko/node-cqrs/commit/e193c4c8dc7b91de6cbc84e2ac668170ddb48bc0))
|
|
47
|
+
* Use `structuredClone` for snapshot creation ([1d0e827](https://github.com/snatalenko/node-cqrs/commit/1d0e827da71c760739588a37ae6afe63a4fa8d34))
|
|
48
|
+
|
|
49
|
+
### Refactoring
|
|
50
|
+
|
|
51
|
+
* Simplify aggregate interface ([3e141fd](https://github.com/snatalenko/node-cqrs/commit/3e141fd217c4a094a57fefe8788816d474020ffe))
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
# [1.0.0-rc.10](https://github.com/snatalenko/node-cqrs/compare/v1.0.0-rc.9...v1.0.0-rc.10) (2025-04-13)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
### Fixes
|
|
58
|
+
|
|
59
|
+
* Asserting db connection in prolongLock and unlock methods ([b272473](https://github.com/snatalenko/node-cqrs/commit/b2724739b3ff483b13c0cfeea30c73c7d8ab8b94))
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
# [1.0.0-rc.9](https://github.com/snatalenko/node-cqrs/compare/v1.0.0-rc.8...v1.0.0-rc.9) (2025-04-13)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
# [1.0.0-rc.8](https://github.com/snatalenko/node-cqrs/compare/v1.0.0-rc.7...v1.0.0-rc.8) (2025-04-13)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
### Features
|
|
70
|
+
|
|
71
|
+
* RabbitMQ integration classes to support event publishing and subscription ([991c223](https://github.com/snatalenko/node-cqrs/commit/991c2233185d3610a2b8930f6930a03c0cdea01d))
|
|
72
|
+
|
|
73
|
+
### Changes
|
|
74
|
+
|
|
75
|
+
* Move validation, snapshot and event persistence to EventDispatcher pipeline ([e781f7c](https://github.com/snatalenko/node-cqrs/commit/e781f7c6c2e4f7c9f8c4615b170d0d29d3e8f133))
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
# [1.0.0-rc.7](https://github.com/snatalenko/node-cqrs/compare/v1.0.0-rc.6...v1.0.0-rc.7) (2025-04-13)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
### Changes
|
|
82
|
+
|
|
83
|
+
* Remove `publishAsync` setting, simplify publishing sequence ([79257e5](https://github.com/snatalenko/node-cqrs/commit/79257e59d322df5dd8e41bedf5273c97ae77b609))
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
# [1.0.0-rc.6](https://github.com/snatalenko/node-cqrs/compare/v0.16.4...v1.0.0-rc.6) (2025-03-21)
|
|
15
87
|
|
|
16
88
|
|
|
17
89
|
### Fixes
|
|
18
90
|
|
|
19
91
|
* Vulnerability in minimist dependency ([07b8c68](https://github.com/snatalenko/node-cqrs/commit/07b8c682fae4278965aa13a06caa994c037934e9))
|
|
20
92
|
|
|
93
|
+
### Changes
|
|
94
|
+
|
|
95
|
+
* Add `InMemoryView.prototype.getSync` method ([5d4adb9](https://github.com/snatalenko/node-cqrs/commit/5d4adb9109c4c85edae2b0f3dfd995e8c51aef06))
|
|
96
|
+
* Support persistent views; Add SQLite infrastructure ([c235573](https://github.com/snatalenko/node-cqrs/commit/c235573678be349d031d1a696cab3993224979a2))
|
|
97
|
+
|
|
21
98
|
### Refactoring
|
|
22
99
|
|
|
23
100
|
* Migrate to TS and Jest ([6737d55](https://github.com/snatalenko/node-cqrs/commit/6737d5566a9dc6314df0b20a65d32414fc503e54))
|
|
24
101
|
|
|
102
|
+
### Build System
|
|
103
|
+
|
|
104
|
+
* Add NPM publishing script ([3372990](https://github.com/snatalenko/node-cqrs/commit/3372990ba2549695398e0949e35009396e660005))
|
|
105
|
+
* Suppress audit and test for tags ([574a00c](https://github.com/snatalenko/node-cqrs/commit/574a00cc53af009994ca4dd3278cb764743b4ad6))
|
|
106
|
+
|
|
25
107
|
|
|
26
108
|
## [0.16.4](https://github.com/snatalenko/node-cqrs/compare/v0.16.3...v0.16.4) (2022-08-28)
|
|
27
109
|
|
|
@@ -60,36 +142,24 @@
|
|
|
60
142
|
* Postpone view.get responses to next loop iteration ([950c2e4](https://github.com/snatalenko/node-cqrs/commit/950c2e42f62d7388b0cc668e81fb4f6718656fca))
|
|
61
143
|
|
|
62
144
|
|
|
63
|
-
# [0.16.0](https://github.com/snatalenko/node-cqrs/compare/v0.
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
### Fixes
|
|
67
|
-
|
|
68
|
-
* Moderate security issue in "minimist" dev dependency ([579d523](https://github.com/snatalenko/node-cqrs/commit/579d523745a6d33902a5245bc7e9f3fe843abc2b))
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
# [0.16.0-5](https://github.com/snatalenko/node-cqrs/compare/v0.16.0-4...v0.16.0-5) (2020-02-19)
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
# [0.16.0-4](https://github.com/snatalenko/node-cqrs/compare/v0.16.0-3...v0.16.0-4) (2020-02-19)
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
# [0.16.0-3](https://github.com/snatalenko/node-cqrs/compare/v0.16.0-2...v0.16.0-3) (2020-01-28)
|
|
145
|
+
# [0.16.0](https://github.com/snatalenko/node-cqrs/compare/v0.15.1...v0.16.0) (2020-03-18)
|
|
80
146
|
|
|
81
147
|
|
|
82
148
|
### Features
|
|
83
149
|
|
|
150
|
+
* Accept logger as an optional dependency ([65fe5ad](https://github.com/snatalenko/node-cqrs/commit/65fe5ad8a9de48d548715a2bd651f6d9c4cb0af1))
|
|
84
151
|
* Detect circular dependencies in DI container ([1490b51](https://github.com/snatalenko/node-cqrs/commit/1490b519c7581b1de6cd084d91f61875751d773b))
|
|
85
152
|
|
|
86
153
|
### Fixes
|
|
87
154
|
|
|
155
|
+
* Debug output not using toString in Node 12 ([ca0d32f](https://github.com/snatalenko/node-cqrs/commit/ca0d32f78a676faf45a342f4198ef4a93a3d0702))
|
|
88
156
|
* Debug output on one time subscriptions ([2fd7601](https://github.com/snatalenko/node-cqrs/commit/2fd7601b6b8e8059f0b777af6c1294cc78cb787b))
|
|
89
157
|
* Correctly set type of the extended container builder created from container ([1f2f632](https://github.com/snatalenko/node-cqrs/commit/1f2f6325ceab65c4c81494d145261668125d03b1))
|
|
158
|
+
* Moderate security issue in "minimist" dev dependency ([579d523](https://github.com/snatalenko/node-cqrs/commit/579d523745a6d33902a5245bc7e9f3fe843abc2b))
|
|
90
159
|
|
|
91
160
|
### Changes
|
|
92
161
|
|
|
162
|
+
* Debug, mocha, sinon ([ac80c27](https://github.com/snatalenko/node-cqrs/commit/ac80c27653828904cf7b80d37b0ecade860b7490))
|
|
93
163
|
* Move DI container to a separate package ([350f3f4](https://github.com/snatalenko/node-cqrs/commit/350f3f405a98fea2c7a85ea92f2b0f1aa945c75c))
|
|
94
164
|
* Do not bind masterHandler to observer automatically ([d2ec79d](https://github.com/snatalenko/node-cqrs/commit/d2ec79dced5460f619cf9bed5f34df1bbb8e0132))
|
|
95
165
|
* Remove deprecated InMemoryView..markAsReady method ([23015ec](https://github.com/snatalenko/node-cqrs/commit/23015ec3f5bc69f843cf6815caa1f4cda9fea27c))
|
|
@@ -103,122 +173,213 @@
|
|
|
103
173
|
|
|
104
174
|
### Tests
|
|
105
175
|
|
|
176
|
+
* Fix tests in Node 12 ([beeb471](https://github.com/snatalenko/node-cqrs/commit/beeb471faee9e1259f11b4c1c65877cd27309637))
|
|
106
177
|
* Run example domain tests with unit tests ([5ffdb43](https://github.com/snatalenko/node-cqrs/commit/5ffdb43c0398fc6650a7a1d62a5f07870ee20bfd))
|
|
107
178
|
* Run eslint for entire project folder ([d9055a1](https://github.com/snatalenko/node-cqrs/commit/d9055a158faa67dc9ece4f77b01517a5480b0a18))
|
|
108
179
|
|
|
109
180
|
### Build System
|
|
110
181
|
|
|
182
|
+
* Prevent git push on version ([3ea9e38](https://github.com/snatalenko/node-cqrs/commit/3ea9e38babf440ab384235e69d248fd92a2dfdff))
|
|
183
|
+
* Add conventional-changelog script ([da26a1c](https://github.com/snatalenko/node-cqrs/commit/da26a1cf6db0a609fcb3f1ba3a29ce6db6d0ab95))
|
|
184
|
+
* Run tests in NodeJS 12 env ([1d4239c](https://github.com/snatalenko/node-cqrs/commit/1d4239cf0f48e64105bfd6b28ab9a22f3fd23e7e))
|
|
185
|
+
* Replace changelog eslint preset with custom one ([8507262](https://github.com/snatalenko/node-cqrs/commit/8507262eeb7c367bbb8bd52b74e04c678bfcf956))
|
|
111
186
|
* Exclude unnecessary files from package ([47b6797](https://github.com/snatalenko/node-cqrs/commit/47b679750780c0d7840d4d45a1296dc9bef7d674))
|
|
112
187
|
* Do not install global dependencies ([158783c](https://github.com/snatalenko/node-cqrs/commit/158783c299720e709b8a34f3ef74fba1390d03ad))
|
|
113
188
|
|
|
114
189
|
|
|
115
|
-
|
|
190
|
+
## [0.15.1](https://github.com/snatalenko/node-cqrs/compare/v0.15.0...v0.15.1) (2019-08-26)
|
|
116
191
|
|
|
117
192
|
|
|
118
|
-
###
|
|
193
|
+
### Changes
|
|
119
194
|
|
|
120
|
-
*
|
|
195
|
+
* Upgrade dev dependencies to fix audit script ([ef01cc3](https://github.com/snatalenko/node-cqrs/commit/ef01cc33b63a95a8783a83b34c4fcb3f4830fe52))
|
|
121
196
|
|
|
122
|
-
### Build System
|
|
123
197
|
|
|
124
|
-
|
|
198
|
+
# [0.15.0](https://github.com/snatalenko/node-cqrs/compare/v0.14.2...v0.15.0) (2019-08-25)
|
|
125
199
|
|
|
126
200
|
|
|
127
|
-
## [0.15.1](https://github.com/snatalenko/node-cqrs/compare/v0.15.0...v0.15.1) (2019-08-26)
|
|
128
201
|
|
|
202
|
+
## [0.14.2](https://github.com/snatalenko/node-cqrs/compare/v0.14.1...v0.14.2) (2018-07-29)
|
|
129
203
|
|
|
130
|
-
### Changes
|
|
131
204
|
|
|
132
|
-
* Upgrade dev dependencies to fix audit script ([ef01cc3](https://github.com/snatalenko/node-cqrs/commit/ef01cc33b63a95a8783a83b34c4fcb3f4830fe52))
|
|
133
205
|
|
|
206
|
+
## [0.14.1](https://github.com/snatalenko/node-cqrs/compare/v0.14.0...v0.14.1) (2018-07-14)
|
|
134
207
|
|
|
135
|
-
# [0.16.0-1](https://github.com/snatalenko/node-cqrs/compare/v0.16.0-0...v0.16.0-1) (2019-11-28)
|
|
136
208
|
|
|
137
|
-
### Changes
|
|
138
209
|
|
|
139
|
-
|
|
210
|
+
# [0.14.0](https://github.com/snatalenko/node-cqrs/compare/v0.13.0...v0.14.0) (2018-05-17)
|
|
140
211
|
|
|
141
|
-
### Build
|
|
142
212
|
|
|
143
|
-
* Add conventional-changelog script ([da26a1c](https://github.com/snatalenko/node-cqrs/commit/da26a1cf6db0a609fcb3f1ba3a29ce6db6d0ab95))
|
|
144
|
-
* Prevent git push on version ([3ea9e38](https://github.com/snatalenko/node-cqrs/commit/3ea9e38babf440ab384235e69d248fd92a2dfdff))
|
|
145
|
-
* Run tests in NodeJS 12 env ([1d4239c](https://github.com/snatalenko/node-cqrs/commit/1d4239cf0f48e64105bfd6b28ab9a22f3fd23e7e))
|
|
146
213
|
|
|
147
|
-
|
|
214
|
+
# [0.13.0](https://github.com/snatalenko/node-cqrs/compare/v0.12.6...v0.13.0) (2017-10-04)
|
|
148
215
|
|
|
149
|
-
* Debug output not using toString in Node 12 ([ca0d32f](https://github.com/snatalenko/node-cqrs/commit/ca0d32f78a676faf45a342f4198ef4a93a3d0702))
|
|
150
216
|
|
|
151
|
-
### Tests
|
|
152
217
|
|
|
153
|
-
|
|
218
|
+
## [0.12.6](https://github.com/snatalenko/node-cqrs/compare/v0.12.5...v0.12.6) (2017-08-23)
|
|
154
219
|
|
|
155
|
-
### Upgrade
|
|
156
220
|
|
|
157
|
-
* debug, mocha, sinon ([ac80c27](https://github.com/snatalenko/node-cqrs/commit/ac80c27653828904cf7b80d37b0ecade860b7490))
|
|
158
221
|
|
|
159
|
-
## 0.
|
|
222
|
+
## [0.12.5](https://github.com/snatalenko/node-cqrs/compare/v0.12.4...v0.12.5) (2017-06-23)
|
|
160
223
|
|
|
161
224
|
|
|
162
|
-
### Features
|
|
163
225
|
|
|
164
|
-
|
|
226
|
+
## [0.12.4](https://github.com/snatalenko/node-cqrs/compare/v0.12.3...v0.12.4) (2017-04-25)
|
|
165
227
|
|
|
166
|
-
### Changes
|
|
167
228
|
|
|
168
|
-
* `InMemoryView.prototype.create` 2nd parameter must be an instance of an Object, not a factory function
|
|
169
|
-
* `InMemoryView.prototype.updateEnforcingNew` does not pass an empty object as a parameter when record does not exist
|
|
170
|
-
* Observable `on(,,{queueName})` replaced with `queue(name).on(,)`;
|
|
171
|
-
* separated IProjectionView and IConcurrentView interfaces
|
|
172
|
-
* `IProjectionView.prototype.shouldRestore` can return Promise
|
|
173
|
-
* Projection `restore` process flow to support async concurrent views
|
|
174
229
|
|
|
175
|
-
|
|
230
|
+
## [0.12.3](https://github.com/snatalenko/node-cqrs/compare/v0.12.1...v0.12.3) (2017-04-24)
|
|
176
231
|
|
|
177
|
-
* Typings
|
|
178
|
-
* Call stack overflow in EventStream constructor on large number of events
|
|
179
232
|
|
|
180
|
-
## 0.14.2 (2018-07-29)
|
|
181
233
|
|
|
234
|
+
## [0.12.1](https://github.com/snatalenko/node-cqrs/compare/v0.12.0...v0.12.1) (2017-04-24)
|
|
182
235
|
|
|
183
|
-
### Fixes
|
|
184
236
|
|
|
185
|
-
* `Container.prototype.registerInstance` requires an Object as first parameter
|
|
186
237
|
|
|
187
|
-
|
|
238
|
+
# [0.12.0](https://github.com/snatalenko/node-cqrs/compare/v0.11.1...v0.12.0) (2017-04-22)
|
|
188
239
|
|
|
189
|
-
### Features
|
|
190
240
|
|
|
191
|
-
* `Aggregate.prototype.makeEvent` as a separate method for testing purposes
|
|
192
241
|
|
|
193
|
-
|
|
242
|
+
## [0.11.1](https://github.com/snatalenko/node-cqrs/compare/v0.11.0...v0.11.1) (2017-03-01)
|
|
194
243
|
|
|
195
|
-
* Aggregate snapshot modification thru Aggregate state
|
|
196
|
-
* Tests with NodeJS@^10
|
|
197
244
|
|
|
198
|
-
## 0.14.0 (2018-05-17)
|
|
199
245
|
|
|
246
|
+
# [0.11.0](https://github.com/snatalenko/node-cqrs/compare/v0.10.0...v0.11.0) (2017-01-18)
|
|
200
247
|
|
|
201
|
-
### Features
|
|
202
248
|
|
|
203
|
-
* examples/user-domain
|
|
204
|
-
* typings
|
|
205
|
-
* changelog
|
|
206
249
|
|
|
207
|
-
|
|
250
|
+
# [0.10.0](https://github.com/snatalenko/node-cqrs/compare/v0.9.3...v0.10.0) (2017-01-16)
|
|
208
251
|
|
|
209
|
-
* snapshotStorage moved to a separate interface/entity
|
|
210
|
-
* named queues handling moved out of EventStore to InMemoryMessageBus implementation
|
|
211
|
-
* command-to-event context copying moved out of EventStore to AbstractAggregate.prototype.emit, which frees up road for a concurrent operations on same aggregate implementation
|
|
212
|
-
* EventStream is immutable
|
|
213
|
-
* `AbstractProjection.prototype.shouldRestoreView` can be overriden in projection for own view implementations
|
|
214
252
|
|
|
215
|
-
## 0.13.0 (2017-10-04)
|
|
216
253
|
|
|
217
|
-
|
|
254
|
+
## [0.9.3](https://github.com/snatalenko/node-cqrs/compare/v0.9.2...v0.9.3) (2017-01-06)
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
## [0.9.2](https://github.com/snatalenko/node-cqrs/compare/v0.9.1...v0.9.2) (2016-12-19)
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
## [0.9.1](https://github.com/snatalenko/node-cqrs/compare/v0.9.0...v0.9.1) (2016-12-17)
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
# [0.9.0](https://github.com/snatalenko/node-cqrs/compare/v0.8.0...v0.9.0) (2016-12-17)
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
# [0.8.0](https://github.com/snatalenko/node-cqrs/compare/v0.7.8...v0.8.0) (2016-12-07)
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
## [0.7.8](https://github.com/snatalenko/node-cqrs/compare/v0.7.7...v0.7.8) (2016-12-05)
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
## [0.7.7](https://github.com/snatalenko/node-cqrs/compare/v0.7.6...v0.7.7) (2016-12-04)
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
## [0.7.6](https://github.com/snatalenko/node-cqrs/compare/v0.7.5...v0.7.6) (2016-12-01)
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
## [0.7.5](https://github.com/snatalenko/node-cqrs/compare/v0.7.4...v0.7.5) (2016-12-01)
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
## [0.7.4](https://github.com/snatalenko/node-cqrs/compare/v0.7.3...v0.7.4) (2016-11-30)
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
## [0.7.3](https://github.com/snatalenko/node-cqrs/compare/v0.7.2...v0.7.3) (2016-11-29)
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
## [0.7.2](https://github.com/snatalenko/node-cqrs/compare/v0.7.1...v0.7.2) (2016-11-25)
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
## [0.7.1](https://github.com/snatalenko/node-cqrs/compare/v0.7.0...v0.7.1) (2016-11-20)
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
# [0.7.0](https://github.com/snatalenko/node-cqrs/compare/v0.6.10...v0.7.0) (2016-11-18)
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
## [0.6.10](https://github.com/snatalenko/node-cqrs/compare/v0.6.9...v0.6.10) (2016-10-24)
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
## [0.6.9](https://github.com/snatalenko/node-cqrs/compare/v0.6.8...v0.6.9) (2016-10-24)
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
|
|
318
|
+
## [0.6.8](https://github.com/snatalenko/node-cqrs/compare/v0.6.7...v0.6.8) (2016-10-23)
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
## [0.6.7](https://github.com/snatalenko/node-cqrs/compare/v0.6.6...v0.6.7) (2016-10-23)
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
## [0.6.6](https://github.com/snatalenko/node-cqrs/compare/v0.6.5...v0.6.6) (2016-08-23)
|
|
327
|
+
|
|
328
|
+
|
|
329
|
+
|
|
330
|
+
## [0.6.5](https://github.com/snatalenko/node-cqrs/compare/v0.6.4...v0.6.5) (2016-08-23)
|
|
331
|
+
|
|
332
|
+
|
|
333
|
+
|
|
334
|
+
## [0.6.4](https://github.com/snatalenko/node-cqrs/compare/v0.6.3...v0.6.4) (2016-07-24)
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
## [0.6.3](https://github.com/snatalenko/node-cqrs/compare/v0.6.2...v0.6.3) (2016-07-06)
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
|
|
342
|
+
## [0.6.2](https://github.com/snatalenko/node-cqrs/compare/v0.6.1...v0.6.2) (2016-07-02)
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
|
|
346
|
+
## [0.6.1](https://github.com/snatalenko/node-cqrs/compare/v0.6.0...v0.6.1) (2016-05-31)
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
|
|
350
|
+
# [0.6.0](https://github.com/snatalenko/node-cqrs/compare/v0.5.0...v0.6.0) (2016-03-06)
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
# [0.5.0](https://github.com/snatalenko/node-cqrs/compare/v0.4.0...v0.5.0) (2016-03-03)
|
|
355
|
+
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
# [0.4.0](https://github.com/snatalenko/node-cqrs/compare/v0.3.2...v0.4.0) (2016-03-03)
|
|
359
|
+
|
|
360
|
+
|
|
361
|
+
|
|
362
|
+
## [0.3.2](https://github.com/snatalenko/node-cqrs/compare/v0.3.1...v0.3.2) (2016-02-29)
|
|
363
|
+
|
|
364
|
+
|
|
365
|
+
|
|
366
|
+
## [0.3.1](https://github.com/snatalenko/node-cqrs/compare/v0.3.0...v0.3.1) (2016-02-29)
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
|
|
370
|
+
# [0.3.0](https://github.com/snatalenko/node-cqrs/compare/v0.2.2...v0.3.0) (2016-02-29)
|
|
371
|
+
|
|
372
|
+
|
|
373
|
+
|
|
374
|
+
## [0.2.2](https://github.com/snatalenko/node-cqrs/compare/v0.2.1...v0.2.2) (2015-12-23)
|
|
375
|
+
|
|
376
|
+
|
|
377
|
+
|
|
378
|
+
## [0.2.1](https://github.com/snatalenko/node-cqrs/compare/v0.2.0...v0.2.1) (2015-12-22)
|
|
379
|
+
|
|
380
|
+
|
|
381
|
+
|
|
382
|
+
# 0.2.0 (2015-12-22)
|
|
218
383
|
|
|
219
|
-
* docs publishing to [node-cqrs.org](https://www.node-cqrs.org)
|
|
220
384
|
|
|
221
|
-
### Changes
|
|
222
385
|
|
|
223
|
-
* In-Memory views do not respond to get(..) requests until they are restored
|
|
224
|
-
* In-Memory views restoring is handled by AbstractProjection
|
|
@@ -2,33 +2,27 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.AbstractAggregate = void 0;
|
|
4
4
|
const utils_1 = require("./utils");
|
|
5
|
-
/**
|
|
6
|
-
* Deep-clone simple JS object
|
|
7
|
-
*/
|
|
8
|
-
function clone(obj) {
|
|
9
|
-
return JSON.parse(JSON.stringify(obj));
|
|
10
|
-
}
|
|
11
5
|
const SNAPSHOT_EVENT_TYPE = 'snapshot';
|
|
12
6
|
/**
|
|
13
7
|
* Base class for Aggregate definition
|
|
14
8
|
*/
|
|
15
9
|
class AbstractAggregate {
|
|
16
10
|
/**
|
|
17
|
-
*
|
|
11
|
+
* List of command names handled by the Aggregate.
|
|
18
12
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
13
|
+
* Can be overridden in the Aggregate implementation to explicitly define supported commands.
|
|
14
|
+
* If not overridden, all public methods will be treated as command handlers by default.
|
|
21
15
|
*
|
|
22
|
-
* @example
|
|
23
|
-
* return ['createUser', 'changePassword'];
|
|
16
|
+
* @example ['createUser', 'changePassword'];
|
|
24
17
|
*/
|
|
25
18
|
static get handles() {
|
|
26
|
-
return
|
|
19
|
+
return (0, utils_1.getMessageHandlerNames)(this);
|
|
27
20
|
}
|
|
28
21
|
#id;
|
|
29
|
-
#changes = [];
|
|
30
22
|
#version = 0;
|
|
31
23
|
#snapshotVersion;
|
|
24
|
+
/** List of emitted events */
|
|
25
|
+
changes = [];
|
|
32
26
|
/** Internal aggregate state */
|
|
33
27
|
state;
|
|
34
28
|
/** Command being handled by aggregate */
|
|
@@ -45,17 +39,15 @@ class AbstractAggregate {
|
|
|
45
39
|
get snapshotVersion() {
|
|
46
40
|
return this.#snapshotVersion;
|
|
47
41
|
}
|
|
48
|
-
/** Events emitted by Aggregate */
|
|
49
|
-
get changes() {
|
|
50
|
-
return [...this.#changes];
|
|
51
|
-
}
|
|
52
42
|
/**
|
|
53
43
|
* Override to define whether an aggregate state snapshot should be taken
|
|
54
44
|
*
|
|
55
45
|
* @example
|
|
56
|
-
*
|
|
57
|
-
*
|
|
46
|
+
* // create snapshot every 50 events if new events were emitted
|
|
47
|
+
* return !!this.changes.length
|
|
48
|
+
* && this.version - (this.snapshotVersion ?? 0) > 50;
|
|
58
49
|
*/
|
|
50
|
+
// eslint-disable-next-line class-methods-use-this
|
|
59
51
|
get shouldTakeSnapshot() {
|
|
60
52
|
return false;
|
|
61
53
|
}
|
|
@@ -74,18 +66,6 @@ class AbstractAggregate {
|
|
|
74
66
|
if (events)
|
|
75
67
|
events.forEach(event => this.mutate(event));
|
|
76
68
|
}
|
|
77
|
-
/** Pass command to command handler */
|
|
78
|
-
handle(command) {
|
|
79
|
-
if (!command)
|
|
80
|
-
throw new TypeError('command argument required');
|
|
81
|
-
if (!command.type)
|
|
82
|
-
throw new TypeError('command.type argument required');
|
|
83
|
-
const handler = (0, utils_1.getHandler)(this, command.type);
|
|
84
|
-
if (!handler)
|
|
85
|
-
throw new Error(`'${command.type}' handler is not defined or not a function`);
|
|
86
|
-
this.command = command;
|
|
87
|
-
return handler.call(this, command.payload, command.context);
|
|
88
|
-
}
|
|
89
69
|
/** Mutate aggregate state and increment aggregate version */
|
|
90
70
|
mutate(event) {
|
|
91
71
|
if (event.aggregateVersion !== undefined)
|
|
@@ -103,12 +83,55 @@ class AbstractAggregate {
|
|
|
103
83
|
}
|
|
104
84
|
this.#version += 1;
|
|
105
85
|
}
|
|
86
|
+
/** Pass command to command handler */
|
|
87
|
+
handle(command) {
|
|
88
|
+
if (!command)
|
|
89
|
+
throw new TypeError('command argument required');
|
|
90
|
+
if (!command.type)
|
|
91
|
+
throw new TypeError('command.type argument required');
|
|
92
|
+
const handler = (0, utils_1.getHandler)(this, command.type);
|
|
93
|
+
if (!handler)
|
|
94
|
+
throw new Error(`'${command.type}' handler is not defined or not a function`);
|
|
95
|
+
if (this.command)
|
|
96
|
+
throw new Error('Another command is being processed');
|
|
97
|
+
try {
|
|
98
|
+
this.command = command;
|
|
99
|
+
const eventsOffset = this.changes.length;
|
|
100
|
+
const handlerResult = handler.call(this, command.payload, command.context);
|
|
101
|
+
if (handlerResult instanceof Promise) {
|
|
102
|
+
return handlerResult
|
|
103
|
+
.then(() => this.getUncommittedEvents(eventsOffset))
|
|
104
|
+
.finally(() => {
|
|
105
|
+
this.command = undefined;
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
else { // handle synchronous result
|
|
109
|
+
const events = this.getUncommittedEvents(eventsOffset);
|
|
110
|
+
this.command = undefined;
|
|
111
|
+
return events;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
this.command = undefined;
|
|
116
|
+
throw err;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Get the events emitted during commands processing.
|
|
121
|
+
* If a snapshot should be taken, the snapshot event is added to the end.
|
|
122
|
+
*/
|
|
123
|
+
getUncommittedEvents(offset) {
|
|
124
|
+
if (this.shouldTakeSnapshot)
|
|
125
|
+
this.takeSnapshot();
|
|
126
|
+
return this.changes.slice(offset);
|
|
127
|
+
}
|
|
106
128
|
/** Format and register aggregate event and mutate aggregate state */
|
|
107
129
|
emit(type, payload) {
|
|
108
130
|
if (typeof type !== 'string' || !type.length)
|
|
109
131
|
throw new TypeError('type argument must be a non-empty string');
|
|
110
132
|
const event = this.makeEvent(type, payload, this.command);
|
|
111
133
|
this.emitRaw(event);
|
|
134
|
+
return event;
|
|
112
135
|
}
|
|
113
136
|
/** Format event based on a current aggregate state and a command being executed */
|
|
114
137
|
makeEvent(type, payload, sourceCommand) {
|
|
@@ -141,19 +164,18 @@ class AbstractAggregate {
|
|
|
141
164
|
if (typeof event.type !== 'string' || !event.type.length)
|
|
142
165
|
throw new TypeError('event.type argument must be a non-empty String');
|
|
143
166
|
this.mutate(event);
|
|
144
|
-
this
|
|
145
|
-
}
|
|
146
|
-
/**
|
|
147
|
-
* Take an aggregate state snapshot and add it to the changes queue
|
|
148
|
-
*/
|
|
149
|
-
takeSnapshot() {
|
|
150
|
-
this.emit(SNAPSHOT_EVENT_TYPE, this.makeSnapshot());
|
|
167
|
+
this.changes.push(event);
|
|
151
168
|
}
|
|
152
169
|
/** Create an aggregate state snapshot */
|
|
153
170
|
makeSnapshot() {
|
|
154
171
|
if (!this.state)
|
|
155
172
|
throw new Error('state property is empty, either define state or override makeSnapshot method');
|
|
156
|
-
return
|
|
173
|
+
return structuredClone(this.state);
|
|
174
|
+
}
|
|
175
|
+
/** Add snapshot event to the collection of emitted events */
|
|
176
|
+
takeSnapshot() {
|
|
177
|
+
const snapshotEvent = this.emit(SNAPSHOT_EVENT_TYPE, this.makeSnapshot());
|
|
178
|
+
this.#snapshotVersion = snapshotEvent.aggregateVersion;
|
|
157
179
|
}
|
|
158
180
|
/** Restore aggregate state from a snapshot */
|
|
159
181
|
restoreSnapshot(snapshotEvent) {
|
|
@@ -167,7 +189,7 @@ class AbstractAggregate {
|
|
|
167
189
|
throw new Error(`${SNAPSHOT_EVENT_TYPE} event type expected`);
|
|
168
190
|
if (!this.state)
|
|
169
191
|
throw new Error('state property is empty, either defined state or override restoreSnapshot method');
|
|
170
|
-
Object.assign(this.state,
|
|
192
|
+
Object.assign(this.state, structuredClone(snapshotEvent.payload));
|
|
171
193
|
}
|
|
172
194
|
/** Get human-readable aggregate identifier */
|
|
173
195
|
toString() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractAggregate.js","sourceRoot":"","sources":["../src/AbstractAggregate.ts"],"names":[],"mappings":";;;AAUA,
|
|
1
|
+
{"version":3,"file":"AbstractAggregate.js","sourceRoot":"","sources":["../src/AbstractAggregate.ts"],"names":[],"mappings":"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"}
|