node-cqrs 1.0.0-rc.9 → 1.0.0
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 +245 -123
- package/LICENSE +202 -21
- package/NOTICE +15 -0
- package/README.md +429 -113
- package/dist/cjs/AbstractAggregate.js +193 -0
- package/dist/cjs/AbstractAggregate.js.map +1 -0
- package/dist/cjs/AbstractProjection.js +165 -0
- package/dist/cjs/AbstractProjection.js.map +1 -0
- package/dist/cjs/AbstractSaga.js +109 -0
- package/dist/cjs/AbstractSaga.js.map +1 -0
- package/dist/cjs/AggregateCommandHandler.js +182 -0
- package/dist/cjs/AggregateCommandHandler.js.map +1 -0
- package/dist/cjs/CommandBus.js +9 -0
- package/dist/cjs/CommandBus.js.map +1 -0
- package/dist/cjs/CqrsContainerBuilder.js +97 -0
- package/dist/cjs/CqrsContainerBuilder.js.map +1 -0
- package/dist/cjs/Event.js +19 -0
- package/dist/cjs/Event.js.map +1 -0
- package/dist/cjs/EventDispatchPipeline.js +83 -0
- package/dist/cjs/EventDispatchPipeline.js.map +1 -0
- package/dist/cjs/EventDispatcher.js +93 -0
- package/dist/cjs/EventDispatcher.js.map +1 -0
- package/dist/cjs/EventIdAugmentor.js +30 -0
- package/dist/cjs/EventIdAugmentor.js.map +1 -0
- package/dist/cjs/EventStore.js +106 -0
- package/dist/cjs/EventStore.js.map +1 -0
- package/dist/cjs/SagaEventHandler.js +153 -0
- package/dist/cjs/SagaEventHandler.js.map +1 -0
- package/dist/cjs/errors/ConcurrencyError.js +21 -0
- package/dist/cjs/errors/ConcurrencyError.js.map +1 -0
- package/dist/cjs/errors/index.js +18 -0
- package/dist/cjs/errors/index.js.map +1 -0
- package/dist/cjs/in-memory/InMemoryEventStorage.js +106 -0
- package/dist/cjs/in-memory/InMemoryEventStorage.js.map +1 -0
- package/dist/cjs/in-memory/InMemoryLock.js +44 -0
- package/dist/cjs/in-memory/InMemoryLock.js.map +1 -0
- package/dist/cjs/in-memory/InMemoryMessageBus.js +93 -0
- package/dist/cjs/in-memory/InMemoryMessageBus.js.map +1 -0
- package/dist/cjs/in-memory/InMemorySnapshotStorage.js +101 -0
- package/dist/cjs/in-memory/InMemorySnapshotStorage.js.map +1 -0
- package/dist/cjs/in-memory/InMemoryView.js +154 -0
- package/dist/cjs/in-memory/InMemoryView.js.map +1 -0
- package/dist/cjs/in-memory/index.js +22 -0
- package/dist/cjs/in-memory/index.js.map +1 -0
- package/dist/cjs/in-memory/utils/index.js +18 -0
- package/dist/cjs/in-memory/utils/index.js.map +1 -0
- package/dist/cjs/in-memory/utils/nextCycle.js +9 -0
- package/dist/cjs/in-memory/utils/nextCycle.js.map +1 -0
- package/dist/cjs/index.js +58 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/interfaces/IAggregate.js.map +1 -0
- package/dist/cjs/interfaces/IAggregateSnapshotStorage.js +13 -0
- package/dist/cjs/interfaces/IAggregateSnapshotStorage.js.map +1 -0
- package/dist/cjs/interfaces/ICommand.js.map +1 -0
- package/dist/cjs/interfaces/ICommandBus.js.map +1 -0
- package/dist/cjs/interfaces/IContainer.js.map +1 -0
- package/dist/cjs/interfaces/IDispatchPipelineProcessor.js +9 -0
- package/dist/cjs/interfaces/IDispatchPipelineProcessor.js.map +1 -0
- package/dist/cjs/interfaces/IEvent.js +10 -0
- package/dist/cjs/interfaces/IEvent.js.map +1 -0
- package/dist/cjs/interfaces/IEventBus.js +9 -0
- package/dist/cjs/interfaces/IEventBus.js.map +1 -0
- package/dist/cjs/interfaces/IEventDispatcher.js.map +1 -0
- package/dist/cjs/interfaces/IEventLocker.js +15 -0
- package/dist/cjs/interfaces/IEventLocker.js.map +1 -0
- package/dist/cjs/interfaces/IEventReceptor.js.map +1 -0
- package/dist/cjs/interfaces/IEventSet.js +8 -0
- package/dist/cjs/interfaces/IEventSet.js.map +1 -0
- package/dist/cjs/interfaces/IEventStorageReader.js +13 -0
- package/dist/cjs/interfaces/IEventStorageReader.js.map +1 -0
- package/dist/cjs/interfaces/IEventStore.js.map +1 -0
- package/dist/cjs/interfaces/IEventStream.js.map +1 -0
- package/dist/cjs/interfaces/IIdentifierProvider.js +9 -0
- package/dist/cjs/interfaces/IIdentifierProvider.js.map +1 -0
- package/dist/cjs/interfaces/ILocker.js +9 -0
- package/dist/cjs/interfaces/ILocker.js.map +1 -0
- package/dist/cjs/interfaces/ILogger.js.map +1 -0
- package/dist/cjs/interfaces/IMessage.js +10 -0
- package/dist/cjs/interfaces/IMessage.js.map +1 -0
- package/dist/cjs/interfaces/IMutableState.js +3 -0
- package/dist/cjs/interfaces/IMutableState.js.map +1 -0
- package/dist/cjs/interfaces/IObjectStorage.js.map +1 -0
- package/dist/cjs/interfaces/IObservable.js +11 -0
- package/dist/cjs/interfaces/IObservable.js.map +1 -0
- package/dist/cjs/interfaces/IObservableQueueProvider.js +9 -0
- package/dist/cjs/interfaces/IObservableQueueProvider.js.map +1 -0
- package/dist/cjs/interfaces/IObserver.js.map +1 -0
- package/dist/cjs/interfaces/IProjection.js.map +1 -0
- package/dist/cjs/interfaces/ISaga.js.map +1 -0
- package/dist/cjs/interfaces/ISnapshotEvent.js +10 -0
- package/dist/cjs/interfaces/ISnapshotEvent.js.map +1 -0
- package/dist/cjs/interfaces/IViewLocker.js +21 -0
- package/dist/cjs/interfaces/IViewLocker.js.map +1 -0
- package/dist/cjs/interfaces/Identifier.js.map +1 -0
- package/dist/cjs/interfaces/index.js +46 -0
- package/dist/cjs/interfaces/index.js.map +1 -0
- package/dist/cjs/interfaces/isObject.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/rabbitmq/IContainer.js.map +1 -0
- package/dist/cjs/rabbitmq/RabbitMqCommandBus.js +84 -0
- package/dist/cjs/rabbitmq/RabbitMqCommandBus.js.map +1 -0
- package/dist/cjs/rabbitmq/RabbitMqEventBus.js +121 -0
- package/dist/cjs/rabbitmq/RabbitMqEventBus.js.map +1 -0
- package/dist/cjs/rabbitmq/RabbitMqGateway.js +578 -0
- package/dist/cjs/rabbitmq/RabbitMqGateway.js.map +1 -0
- package/dist/cjs/rabbitmq/index.js +21 -0
- package/dist/cjs/rabbitmq/index.js.map +1 -0
- package/dist/cjs/rabbitmq/utils/index.js +19 -0
- package/dist/cjs/rabbitmq/utils/index.js.map +1 -0
- package/dist/cjs/rabbitmq/utils/registerExitCleanup.js +28 -0
- package/dist/cjs/rabbitmq/utils/registerExitCleanup.js.map +1 -0
- package/dist/cjs/rabbitmq/utils/resolveProvider.js +9 -0
- package/dist/cjs/rabbitmq/utils/resolveProvider.js.map +1 -0
- package/dist/cjs/sqlite/AbstractSqliteAccessor.js +50 -0
- package/dist/cjs/sqlite/AbstractSqliteAccessor.js.map +1 -0
- package/dist/cjs/sqlite/AbstractSqliteObjectProjection.js +26 -0
- package/dist/cjs/sqlite/AbstractSqliteObjectProjection.js.map +1 -0
- package/dist/cjs/sqlite/AbstractSqliteView.js +50 -0
- package/dist/cjs/sqlite/AbstractSqliteView.js.map +1 -0
- package/dist/cjs/sqlite/IContainer.js.map +1 -0
- package/dist/cjs/sqlite/SqliteEventLocker.js +93 -0
- package/dist/cjs/sqlite/SqliteEventLocker.js.map +1 -0
- package/dist/cjs/sqlite/SqliteObjectStorage.js +114 -0
- package/dist/cjs/sqlite/SqliteObjectStorage.js.map +1 -0
- package/dist/cjs/sqlite/SqliteObjectView.js +48 -0
- package/dist/cjs/sqlite/SqliteObjectView.js.map +1 -0
- package/dist/cjs/sqlite/SqliteProjectionDataParams.js.map +1 -0
- package/dist/cjs/sqlite/SqliteViewLocker.js +119 -0
- package/dist/cjs/sqlite/SqliteViewLocker.js.map +1 -0
- package/dist/cjs/sqlite/index.js +26 -0
- package/dist/cjs/sqlite/index.js.map +1 -0
- package/dist/cjs/sqlite/queries/eventLockTableInit.js +15 -0
- package/dist/cjs/sqlite/queries/eventLockTableInit.js.map +1 -0
- package/dist/cjs/sqlite/queries/index.js +19 -0
- package/dist/cjs/sqlite/queries/index.js.map +1 -0
- package/dist/cjs/sqlite/queries/viewLockTableInit.js.map +1 -0
- package/dist/cjs/sqlite/utils/getEventId.js +14 -0
- package/dist/cjs/sqlite/utils/getEventId.js.map +1 -0
- package/dist/cjs/sqlite/utils/guid.js.map +1 -0
- package/dist/cjs/sqlite/utils/index.js +19 -0
- package/dist/cjs/sqlite/utils/index.js.map +1 -0
- package/dist/cjs/utils/Deferred.js.map +1 -0
- package/dist/cjs/utils/Lock.js +102 -0
- package/dist/cjs/utils/Lock.js.map +1 -0
- package/dist/cjs/utils/MapAssertable.js +30 -0
- package/dist/cjs/utils/MapAssertable.js.map +1 -0
- package/dist/cjs/utils/assert.js +88 -0
- package/dist/cjs/utils/assert.js.map +1 -0
- package/dist/cjs/utils/clone.js +13 -0
- package/dist/cjs/utils/clone.js.map +1 -0
- package/dist/cjs/utils/extractErrorDetails.js +37 -0
- package/dist/cjs/utils/extractErrorDetails.js.map +1 -0
- package/dist/cjs/utils/getClassName.js.map +1 -0
- package/dist/cjs/utils/getHandler.js +18 -0
- package/dist/cjs/utils/getHandler.js.map +1 -0
- package/dist/cjs/utils/getMessageHandlerNames.js +30 -0
- package/dist/cjs/utils/getMessageHandlerNames.js.map +1 -0
- package/dist/cjs/utils/index.js +31 -0
- package/dist/cjs/utils/index.js.map +1 -0
- package/dist/cjs/utils/isClass.js.map +1 -0
- package/dist/cjs/utils/sagaId.js +23 -0
- package/dist/cjs/utils/sagaId.js.map +1 -0
- package/dist/cjs/utils/setupOneTimeEmitterSubscription.js +45 -0
- package/dist/cjs/utils/setupOneTimeEmitterSubscription.js.map +1 -0
- package/dist/cjs/utils/subscribe.js +43 -0
- package/dist/cjs/utils/subscribe.js.map +1 -0
- package/dist/cjs/utils/validateHandlers.js +21 -0
- package/dist/cjs/utils/validateHandlers.js.map +1 -0
- package/dist/cjs/workers/AbstractWorkerProjection.js +56 -0
- package/dist/cjs/workers/AbstractWorkerProjection.js.map +1 -0
- package/dist/cjs/workers/WorkerProxyProjection.js +142 -0
- package/dist/cjs/workers/WorkerProxyProjection.js.map +1 -0
- package/dist/cjs/workers/index.js +20 -0
- package/dist/cjs/workers/index.js.map +1 -0
- 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 +16 -0
- package/dist/cjs/workers/protocol.js.map +1 -0
- 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 +87 -0
- package/dist/cjs/workers/utils/createWorker.js.map +1 -0
- 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 +21 -0
- package/dist/cjs/workers/utils/index.js.map +1 -0
- package/dist/cjs/workers/utils/nodeEndpoint.js +8 -0
- package/dist/cjs/workers/utils/nodeEndpoint.js.map +1 -0
- package/dist/cjs/workers/utils/workerProxyFactory.js +21 -0
- package/dist/cjs/workers/utils/workerProxyFactory.js.map +1 -0
- package/dist/esm/AbstractAggregate.js +189 -0
- package/dist/esm/AbstractAggregate.js.map +1 -0
- package/dist/esm/AbstractProjection.js +161 -0
- package/dist/esm/AbstractProjection.js.map +1 -0
- package/dist/esm/AbstractSaga.js +105 -0
- package/dist/esm/AbstractSaga.js.map +1 -0
- package/dist/esm/AggregateCommandHandler.js +178 -0
- package/dist/esm/AggregateCommandHandler.js.map +1 -0
- package/dist/esm/CommandBus.js +5 -0
- package/dist/esm/CommandBus.js.map +1 -0
- package/dist/esm/CqrsContainerBuilder.js +93 -0
- package/dist/esm/CqrsContainerBuilder.js.map +1 -0
- package/dist/esm/Event.js +15 -0
- package/dist/esm/Event.js.map +1 -0
- package/dist/esm/EventDispatchPipeline.js +79 -0
- package/dist/esm/EventDispatchPipeline.js.map +1 -0
- package/dist/esm/EventDispatcher.js +89 -0
- package/dist/esm/EventDispatcher.js.map +1 -0
- package/dist/esm/EventIdAugmentor.js +26 -0
- package/dist/esm/EventIdAugmentor.js.map +1 -0
- package/dist/esm/EventStore.js +102 -0
- package/dist/esm/EventStore.js.map +1 -0
- package/dist/esm/SagaEventHandler.js +116 -0
- package/dist/esm/SagaEventHandler.js.map +1 -0
- package/dist/esm/errors/ConcurrencyError.js +17 -0
- package/dist/esm/errors/ConcurrencyError.js.map +1 -0
- package/dist/esm/errors/index.js +2 -0
- package/dist/esm/errors/index.js.map +1 -0
- package/dist/esm/in-memory/InMemoryEventStorage.js +102 -0
- package/dist/esm/in-memory/InMemoryEventStorage.js.map +1 -0
- package/dist/esm/in-memory/InMemoryLock.js +40 -0
- package/dist/esm/in-memory/InMemoryLock.js.map +1 -0
- package/dist/esm/in-memory/InMemoryMessageBus.js +89 -0
- package/dist/esm/in-memory/InMemoryMessageBus.js.map +1 -0
- package/dist/esm/in-memory/InMemorySnapshotStorage.js +64 -0
- package/dist/esm/in-memory/InMemorySnapshotStorage.js.map +1 -0
- package/dist/esm/in-memory/InMemoryView.js +150 -0
- package/dist/esm/in-memory/InMemoryView.js.map +1 -0
- package/dist/esm/in-memory/index.js +6 -0
- package/dist/esm/in-memory/index.js.map +1 -0
- package/dist/esm/in-memory/utils/index.js +2 -0
- package/dist/esm/in-memory/utils/index.js.map +1 -0
- package/dist/esm/in-memory/utils/nextCycle.js +5 -0
- package/dist/esm/in-memory/utils/nextCycle.js.map +1 -0
- package/dist/esm/index.js +16 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/interfaces/IAggregate.js +2 -0
- package/dist/esm/interfaces/IAggregate.js.map +1 -0
- package/dist/esm/interfaces/IAggregateSnapshotStorage.js +9 -0
- package/dist/esm/interfaces/IAggregateSnapshotStorage.js.map +1 -0
- package/dist/esm/interfaces/ICommand.js +2 -0
- package/dist/esm/interfaces/ICommand.js.map +1 -0
- package/dist/esm/interfaces/ICommandBus.js +2 -0
- package/dist/esm/interfaces/ICommandBus.js.map +1 -0
- package/dist/esm/interfaces/IContainer.js +2 -0
- package/dist/esm/interfaces/IContainer.js.map +1 -0
- package/dist/esm/interfaces/IDispatchPipelineProcessor.js +5 -0
- package/dist/esm/interfaces/IDispatchPipelineProcessor.js.map +1 -0
- package/dist/esm/interfaces/IEvent.js +6 -0
- package/dist/esm/interfaces/IEvent.js.map +1 -0
- package/dist/esm/interfaces/IEventBus.js +5 -0
- package/dist/esm/interfaces/IEventBus.js.map +1 -0
- package/dist/esm/interfaces/IEventDispatcher.js +2 -0
- package/dist/esm/interfaces/IEventDispatcher.js.map +1 -0
- package/dist/esm/interfaces/IEventLocker.js +11 -0
- package/dist/esm/interfaces/IEventLocker.js.map +1 -0
- package/dist/esm/interfaces/IEventReceptor.js +2 -0
- package/dist/esm/interfaces/IEventReceptor.js.map +1 -0
- package/dist/esm/interfaces/IEventSet.js +4 -0
- package/dist/esm/interfaces/IEventSet.js.map +1 -0
- package/dist/esm/interfaces/IEventStorageReader.js +9 -0
- package/dist/esm/interfaces/IEventStorageReader.js.map +1 -0
- package/dist/esm/interfaces/IEventStore.js +2 -0
- package/dist/esm/interfaces/IEventStore.js.map +1 -0
- package/dist/esm/interfaces/IEventStream.js +2 -0
- package/dist/esm/interfaces/IEventStream.js.map +1 -0
- package/dist/esm/interfaces/IIdentifierProvider.js +5 -0
- package/dist/esm/interfaces/IIdentifierProvider.js.map +1 -0
- package/dist/esm/interfaces/ILocker.js +5 -0
- package/dist/esm/interfaces/ILocker.js.map +1 -0
- package/dist/esm/interfaces/ILogger.js +2 -0
- package/dist/esm/interfaces/ILogger.js.map +1 -0
- package/dist/esm/interfaces/IMessage.js +6 -0
- package/dist/esm/interfaces/IMessage.js.map +1 -0
- package/dist/esm/interfaces/IMutableState.js +2 -0
- package/dist/esm/interfaces/IMutableState.js.map +1 -0
- package/dist/esm/interfaces/IObjectStorage.js +2 -0
- package/dist/esm/interfaces/IObjectStorage.js.map +1 -0
- package/dist/esm/interfaces/IObservable.js +7 -0
- package/dist/esm/interfaces/IObservable.js.map +1 -0
- package/dist/esm/interfaces/IObservableQueueProvider.js +5 -0
- package/dist/esm/interfaces/IObservableQueueProvider.js.map +1 -0
- package/dist/esm/interfaces/IObserver.js +2 -0
- package/dist/esm/interfaces/IObserver.js.map +1 -0
- package/dist/esm/interfaces/IProjection.js +2 -0
- package/dist/esm/interfaces/IProjection.js.map +1 -0
- package/dist/esm/interfaces/ISaga.js +2 -0
- package/dist/esm/interfaces/ISaga.js.map +1 -0
- package/dist/esm/interfaces/ISnapshotEvent.js +6 -0
- package/dist/esm/interfaces/ISnapshotEvent.js.map +1 -0
- package/dist/esm/interfaces/IViewLocker.js +17 -0
- package/dist/esm/interfaces/IViewLocker.js.map +1 -0
- package/dist/esm/interfaces/Identifier.js +2 -0
- package/dist/esm/interfaces/Identifier.js.map +1 -0
- package/dist/esm/interfaces/index.js +30 -0
- package/dist/esm/interfaces/index.js.map +1 -0
- package/dist/esm/interfaces/isObject.js +5 -0
- package/dist/esm/interfaces/isObject.js.map +1 -0
- package/dist/esm/rabbitmq/IContainer.js +2 -0
- package/dist/esm/rabbitmq/IContainer.js.map +1 -0
- package/dist/esm/rabbitmq/RabbitMqCommandBus.js +80 -0
- package/dist/esm/rabbitmq/RabbitMqCommandBus.js.map +1 -0
- package/dist/esm/rabbitmq/RabbitMqEventBus.js +117 -0
- package/dist/esm/rabbitmq/RabbitMqEventBus.js.map +1 -0
- package/dist/esm/rabbitmq/RabbitMqGateway.js +541 -0
- package/dist/esm/rabbitmq/RabbitMqGateway.js.map +1 -0
- package/dist/esm/rabbitmq/index.js +5 -0
- package/dist/esm/rabbitmq/index.js.map +1 -0
- package/dist/esm/rabbitmq/utils/index.js +3 -0
- package/dist/esm/rabbitmq/utils/index.js.map +1 -0
- package/dist/esm/rabbitmq/utils/registerExitCleanup.js +24 -0
- package/dist/esm/rabbitmq/utils/registerExitCleanup.js.map +1 -0
- package/dist/esm/rabbitmq/utils/resolveProvider.js +6 -0
- package/dist/esm/rabbitmq/utils/resolveProvider.js.map +1 -0
- package/dist/esm/sqlite/AbstractSqliteAccessor.js +46 -0
- package/dist/esm/sqlite/AbstractSqliteAccessor.js.map +1 -0
- package/dist/esm/sqlite/AbstractSqliteObjectProjection.js +22 -0
- package/dist/esm/sqlite/AbstractSqliteObjectProjection.js.map +1 -0
- package/dist/esm/sqlite/AbstractSqliteView.js +46 -0
- package/dist/esm/sqlite/AbstractSqliteView.js.map +1 -0
- package/dist/esm/sqlite/IContainer.js +2 -0
- package/dist/esm/sqlite/IContainer.js.map +1 -0
- package/dist/esm/sqlite/SqliteEventLocker.js +89 -0
- package/dist/esm/sqlite/SqliteEventLocker.js.map +1 -0
- package/dist/esm/sqlite/SqliteObjectStorage.js +110 -0
- package/dist/esm/sqlite/SqliteObjectStorage.js.map +1 -0
- package/dist/esm/sqlite/SqliteObjectView.js +44 -0
- package/dist/esm/sqlite/SqliteObjectView.js.map +1 -0
- package/dist/esm/sqlite/SqliteProjectionDataParams.js +2 -0
- package/dist/esm/sqlite/SqliteProjectionDataParams.js.map +1 -0
- package/dist/esm/sqlite/SqliteViewLocker.js +115 -0
- package/dist/esm/sqlite/SqliteViewLocker.js.map +1 -0
- package/dist/esm/sqlite/index.js +10 -0
- package/dist/esm/sqlite/index.js.map +1 -0
- package/dist/esm/sqlite/queries/eventLockTableInit.js +11 -0
- package/dist/esm/sqlite/queries/eventLockTableInit.js.map +1 -0
- package/dist/esm/sqlite/queries/index.js +3 -0
- package/dist/esm/sqlite/queries/index.js.map +1 -0
- package/dist/esm/sqlite/queries/viewLockTableInit.js +10 -0
- package/dist/esm/sqlite/queries/viewLockTableInit.js.map +1 -0
- package/dist/esm/sqlite/utils/getEventId.js +7 -0
- package/dist/esm/sqlite/utils/getEventId.js.map +1 -0
- package/dist/esm/sqlite/utils/guid.js +5 -0
- package/dist/esm/sqlite/utils/guid.js.map +1 -0
- package/dist/esm/sqlite/utils/index.js +3 -0
- package/dist/esm/sqlite/utils/index.js.map +1 -0
- package/dist/esm/utils/Deferred.js +34 -0
- package/dist/esm/utils/Deferred.js.map +1 -0
- package/dist/esm/utils/Lock.js +97 -0
- package/dist/esm/utils/Lock.js.map +1 -0
- package/dist/esm/utils/MapAssertable.js +26 -0
- package/dist/esm/utils/MapAssertable.js.map +1 -0
- package/dist/esm/utils/assert.js +70 -0
- package/dist/esm/utils/assert.js.map +1 -0
- package/dist/esm/utils/clone.js +10 -0
- package/dist/esm/utils/clone.js.map +1 -0
- package/dist/esm/utils/extractErrorDetails.js +33 -0
- package/dist/esm/utils/extractErrorDetails.js.map +1 -0
- package/dist/esm/utils/getClassName.js +7 -0
- package/dist/esm/utils/getClassName.js.map +1 -0
- package/dist/esm/utils/getHandler.js +15 -0
- package/dist/esm/utils/getHandler.js.map +1 -0
- package/dist/esm/utils/getMessageHandlerNames.js +27 -0
- package/dist/esm/utils/getMessageHandlerNames.js.map +1 -0
- package/dist/esm/utils/index.js +15 -0
- package/dist/esm/utils/index.js.map +1 -0
- package/dist/esm/utils/isClass.js +5 -0
- package/dist/esm/utils/isClass.js.map +1 -0
- package/dist/esm/utils/sagaId.js +18 -0
- package/dist/esm/utils/sagaId.js.map +1 -0
- package/dist/esm/utils/setupOneTimeEmitterSubscription.js +42 -0
- package/dist/esm/utils/setupOneTimeEmitterSubscription.js.map +1 -0
- package/dist/esm/utils/subscribe.js +40 -0
- package/dist/esm/utils/subscribe.js.map +1 -0
- package/dist/esm/utils/validateHandlers.js +18 -0
- package/dist/esm/utils/validateHandlers.js.map +1 -0
- package/dist/esm/workers/AbstractWorkerProjection.js +52 -0
- package/dist/esm/workers/AbstractWorkerProjection.js.map +1 -0
- package/dist/esm/workers/WorkerProxyProjection.js +105 -0
- package/dist/esm/workers/WorkerProxyProjection.js.map +1 -0
- package/dist/esm/workers/index.js +4 -0
- package/dist/esm/workers/index.js.map +1 -0
- 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 +11 -0
- package/dist/esm/workers/protocol.js.map +1 -0
- 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 +51 -0
- package/dist/esm/workers/utils/createWorker.js.map +1 -0
- 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 +5 -0
- package/dist/esm/workers/utils/index.js.map +1 -0
- package/dist/esm/workers/utils/nodeEndpoint.js +5 -0
- package/dist/esm/workers/utils/nodeEndpoint.js.map +1 -0
- package/dist/esm/workers/utils/workerProxyFactory.js +18 -0
- package/dist/esm/workers/utils/workerProxyFactory.js.map +1 -0
- package/dist/types/AbstractAggregate.d.ts +80 -0
- package/dist/types/AbstractProjection.d.ts +77 -0
- package/dist/types/AbstractSaga.d.ts +42 -0
- package/dist/types/AggregateCommandHandler.d.ts +22 -0
- package/dist/types/CommandBus.d.ts +4 -0
- package/dist/types/CqrsContainerBuilder.d.ts +21 -0
- package/dist/types/Event.d.ts +9 -0
- package/dist/types/EventDispatchPipeline.d.ts +16 -0
- package/dist/types/EventDispatcher.d.ts +39 -0
- package/dist/types/EventIdAugmentor.d.ts +12 -0
- package/dist/types/EventStore.d.ts +29 -0
- package/dist/types/SagaEventHandler.d.ts +22 -0
- package/dist/types/errors/ConcurrencyError.d.ts +9 -0
- package/dist/types/errors/index.d.ts +1 -0
- package/dist/types/in-memory/InMemoryEventStorage.d.ts +24 -0
- package/dist/types/in-memory/InMemoryLock.d.ts +23 -0
- package/dist/types/in-memory/InMemoryMessageBus.d.ts +45 -0
- package/dist/types/in-memory/InMemorySnapshotStorage.d.ts +37 -0
- package/dist/types/in-memory/InMemoryView.d.ts +53 -0
- package/dist/types/in-memory/index.d.ts +5 -0
- package/dist/types/in-memory/utils/index.d.ts +1 -0
- package/dist/types/index.d.ts +15 -0
- package/dist/types/interfaces/IAggregate.d.ts +78 -0
- package/dist/types/interfaces/IAggregateSnapshotStorage.d.ts +8 -0
- package/dist/types/interfaces/ICommand.d.ts +2 -0
- package/dist/types/interfaces/ICommandBus.d.ts +15 -0
- package/dist/types/interfaces/IContainer.d.ts +37 -0
- package/dist/types/interfaces/IDispatchPipelineProcessor.d.ts +29 -0
- package/dist/types/interfaces/IEvent.d.ts +7 -0
- package/dist/types/interfaces/IEventBus.d.ts +6 -0
- package/dist/types/interfaces/IEventDispatcher.d.ts +6 -0
- package/dist/types/interfaces/IEventLocker.d.ts +28 -0
- package/dist/types/interfaces/IEventReceptor.d.ts +5 -0
- package/dist/types/interfaces/IEventSet.d.ts +3 -0
- package/dist/types/interfaces/IEventStorageReader.d.ts +48 -0
- package/dist/types/interfaces/IEventStore.d.ts +9 -0
- package/dist/types/interfaces/IEventStream.d.ts +2 -0
- package/dist/types/interfaces/IIdentifierProvider.d.ts +10 -0
- package/dist/types/interfaces/ILocker.d.ts +8 -0
- package/dist/types/interfaces/IMessage.d.ts +23 -0
- package/dist/types/interfaces/IMutableState.d.ts +14 -0
- package/dist/types/interfaces/IObjectStorage.d.ts +8 -0
- package/dist/types/interfaces/IObservable.d.ts +15 -0
- package/dist/types/interfaces/IObservableQueueProvider.d.ts +8 -0
- package/dist/types/interfaces/IObserver.d.ts +4 -0
- package/dist/types/interfaces/IProjection.d.ts +17 -0
- package/dist/types/interfaces/ISaga.d.ts +38 -0
- package/dist/types/interfaces/ISnapshotEvent.d.ts +7 -0
- package/dist/types/interfaces/Identifier.d.ts +1 -0
- package/dist/types/interfaces/index.d.ts +29 -0
- package/dist/types/interfaces/isObject.d.ts +1 -0
- package/dist/types/rabbitmq/IContainer.d.ts +19 -0
- package/dist/types/rabbitmq/RabbitMqCommandBus.d.ts +38 -0
- package/dist/types/rabbitmq/RabbitMqEventBus.d.ts +44 -0
- package/dist/types/rabbitmq/RabbitMqGateway.d.ts +133 -0
- package/dist/types/rabbitmq/index.d.ts +4 -0
- package/dist/types/rabbitmq/utils/index.d.ts +2 -0
- package/dist/types/rabbitmq/utils/registerExitCleanup.d.ts +10 -0
- package/dist/types/rabbitmq/utils/resolveProvider.d.ts +3 -0
- package/dist/types/sqlite/AbstractSqliteAccessor.d.ts +25 -0
- package/dist/types/sqlite/AbstractSqliteObjectProjection.d.ts +8 -0
- package/dist/types/sqlite/AbstractSqliteView.d.ts +23 -0
- package/dist/types/sqlite/IContainer.d.ts +7 -0
- package/dist/types/sqlite/SqliteEventLocker.d.ts +30 -0
- package/dist/types/sqlite/SqliteObjectStorage.d.ts +17 -0
- package/dist/types/sqlite/SqliteObjectView.d.ts +19 -0
- package/dist/types/sqlite/SqliteViewLocker.d.ts +31 -0
- package/dist/types/sqlite/index.d.ts +9 -0
- package/dist/types/sqlite/queries/index.d.ts +2 -0
- package/dist/types/sqlite/utils/getEventId.d.ts +5 -0
- package/dist/types/sqlite/utils/index.d.ts +2 -0
- package/dist/types/utils/Lock.d.ts +30 -0
- package/dist/types/utils/MapAssertable.d.ts +11 -0
- package/dist/types/utils/assert.d.ts +20 -0
- package/dist/types/utils/clone.d.ts +1 -0
- package/dist/types/utils/extractErrorDetails.d.ts +8 -0
- package/dist/types/utils/getHandler.d.ts +7 -0
- package/dist/types/utils/getMessageHandlerNames.d.ts +12 -0
- package/dist/types/utils/index.d.ts +14 -0
- package/dist/types/utils/isClass.d.ts +1 -0
- package/dist/types/utils/sagaId.d.ts +6 -0
- package/dist/types/utils/setupOneTimeEmitterSubscription.d.ts +12 -0
- package/dist/types/utils/subscribe.d.ts +9 -0
- package/dist/types/workers/AbstractWorkerProjection.d.ts +25 -0
- package/dist/types/workers/WorkerProxyProjection.d.ts +25 -0
- package/dist/types/workers/index.d.ts +3 -0
- package/dist/types/workers/interfaces/IProxyProjection.d.ts +15 -0
- package/dist/types/workers/interfaces/IWorkerProjection.d.ts +19 -0
- package/dist/types/workers/interfaces/index.d.ts +2 -0
- package/dist/types/workers/protocol.d.ts +10 -0
- package/dist/types/workers/utils/ProjectionView.d.ts +2 -0
- package/dist/types/workers/utils/createWorker.d.ts +10 -0
- package/dist/types/workers/utils/createWorkerInstance.d.ts +11 -0
- package/dist/types/workers/utils/index.d.ts +5 -0
- package/dist/types/workers/utils/nodeEndpoint.d.ts +2 -0
- package/dist/types/workers/utils/workerProxyFactory.d.ts +14 -0
- package/package.json +106 -54
- package/dist/AbstractAggregate.js +0 -178
- package/dist/AbstractAggregate.js.map +0 -1
- package/dist/AbstractProjection.js +0 -138
- package/dist/AbstractProjection.js.map +0 -1
- package/dist/AbstractSaga.js +0 -99
- package/dist/AbstractSaga.js.map +0 -1
- package/dist/AggregateCommandHandler.js +0 -86
- package/dist/AggregateCommandHandler.js.map +0 -1
- package/dist/CommandBus.js +0 -74
- package/dist/CommandBus.js.map +0 -1
- package/dist/CqrsContainerBuilder.js +0 -92
- package/dist/CqrsContainerBuilder.js.map +0 -1
- package/dist/Event.js +0 -33
- package/dist/Event.js.map +0 -1
- package/dist/EventDispatcher.js +0 -131
- package/dist/EventDispatcher.js.map +0 -1
- package/dist/EventStore.js +0 -137
- package/dist/EventStore.js.map +0 -1
- package/dist/EventValidationProcessor.js +0 -29
- package/dist/EventValidationProcessor.js.map +0 -1
- package/dist/SagaEventHandler.js +0 -118
- package/dist/SagaEventHandler.js.map +0 -1
- package/dist/in-memory/InMemoryEventStorage.js +0 -73
- package/dist/in-memory/InMemoryEventStorage.js.map +0 -1
- package/dist/in-memory/InMemoryLock.js +0 -40
- package/dist/in-memory/InMemoryLock.js.map +0 -1
- package/dist/in-memory/InMemoryMessageBus.js +0 -111
- package/dist/in-memory/InMemoryMessageBus.js.map +0 -1
- package/dist/in-memory/InMemorySnapshotStorage.js +0 -70
- package/dist/in-memory/InMemorySnapshotStorage.js.map +0 -1
- package/dist/in-memory/InMemoryView.js +0 -167
- package/dist/in-memory/InMemoryView.js.map +0 -1
- package/dist/in-memory/index.js +0 -22
- package/dist/in-memory/index.js.map +0 -1
- package/dist/in-memory/utils/index.js +0 -18
- package/dist/in-memory/utils/index.js.map +0 -1
- package/dist/in-memory/utils/nextCycle.js +0 -9
- package/dist/in-memory/utils/nextCycle.js.map +0 -1
- package/dist/index.js +0 -35
- package/dist/index.js.map +0 -1
- package/dist/interfaces/IAggregate.js.map +0 -1
- package/dist/interfaces/IAggregateSnapshotStorage.js +0 -3
- package/dist/interfaces/IAggregateSnapshotStorage.js.map +0 -1
- package/dist/interfaces/ICommand.js.map +0 -1
- package/dist/interfaces/ICommandBus.js.map +0 -1
- package/dist/interfaces/IContainer.js.map +0 -1
- package/dist/interfaces/IDispatchPipelineProcessor.js +0 -9
- package/dist/interfaces/IDispatchPipelineProcessor.js.map +0 -1
- package/dist/interfaces/IEvent.js +0 -9
- package/dist/interfaces/IEvent.js.map +0 -1
- package/dist/interfaces/IEventBus.js +0 -9
- package/dist/interfaces/IEventBus.js.map +0 -1
- package/dist/interfaces/IEventDispatcher.js.map +0 -1
- package/dist/interfaces/IEventLocker.js +0 -10
- package/dist/interfaces/IEventLocker.js.map +0 -1
- package/dist/interfaces/IEventReceptor.js.map +0 -1
- package/dist/interfaces/IEventSet.js +0 -8
- package/dist/interfaces/IEventSet.js.map +0 -1
- package/dist/interfaces/IEventStorage.js +0 -13
- package/dist/interfaces/IEventStorage.js.map +0 -1
- package/dist/interfaces/IEventStore.js.map +0 -1
- package/dist/interfaces/IEventStream.js.map +0 -1
- package/dist/interfaces/IIdentifierProvider.js +0 -9
- package/dist/interfaces/IIdentifierProvider.js.map +0 -1
- package/dist/interfaces/ILogger.js.map +0 -1
- package/dist/interfaces/IMessage.js +0 -9
- package/dist/interfaces/IMessage.js.map +0 -1
- package/dist/interfaces/IMessageBus.js +0 -3
- package/dist/interfaces/IMessageBus.js.map +0 -1
- package/dist/interfaces/IObjectStorage.js.map +0 -1
- package/dist/interfaces/IObservable.js +0 -11
- package/dist/interfaces/IObservable.js.map +0 -1
- package/dist/interfaces/IObserver.js.map +0 -1
- package/dist/interfaces/IProjection.js.map +0 -1
- package/dist/interfaces/ISaga.js.map +0 -1
- package/dist/interfaces/IViewLocker.js +0 -17
- package/dist/interfaces/IViewLocker.js.map +0 -1
- package/dist/interfaces/Identifier.js.map +0 -1
- package/dist/interfaces/index.js +0 -43
- package/dist/interfaces/index.js.map +0 -1
- package/dist/interfaces/isObject.js.map +0 -1
- package/dist/rabbitmq/IContainer.js.map +0 -1
- package/dist/rabbitmq/RabbitMqEventBus.js +0 -89
- package/dist/rabbitmq/RabbitMqEventBus.js.map +0 -1
- package/dist/rabbitmq/RabbitMqEventInjector.js +0 -55
- package/dist/rabbitmq/RabbitMqEventInjector.js.map +0 -1
- package/dist/rabbitmq/RabbitMqGateway.js +0 -347
- package/dist/rabbitmq/RabbitMqGateway.js.map +0 -1
- package/dist/rabbitmq/TerminationHandler.js +0 -31
- package/dist/rabbitmq/TerminationHandler.js.map +0 -1
- package/dist/rabbitmq/constants.js +0 -6
- package/dist/rabbitmq/constants.js.map +0 -1
- package/dist/rabbitmq/index.js +0 -20
- package/dist/rabbitmq/index.js.map +0 -1
- package/dist/sqlite/AbstractSqliteAccessor.js +0 -50
- package/dist/sqlite/AbstractSqliteAccessor.js.map +0 -1
- package/dist/sqlite/AbstractSqliteObjectProjection.js +0 -26
- package/dist/sqlite/AbstractSqliteObjectProjection.js.map +0 -1
- package/dist/sqlite/AbstractSqliteView.js +0 -44
- package/dist/sqlite/AbstractSqliteView.js.map +0 -1
- package/dist/sqlite/IContainer.js.map +0 -1
- package/dist/sqlite/SqliteEventLocker.js +0 -94
- package/dist/sqlite/SqliteEventLocker.js.map +0 -1
- package/dist/sqlite/SqliteObjectStorage.js +0 -113
- package/dist/sqlite/SqliteObjectStorage.js.map +0 -1
- package/dist/sqlite/SqliteObjectView.js +0 -46
- package/dist/sqlite/SqliteObjectView.js.map +0 -1
- package/dist/sqlite/SqliteProjectionDataParams.js.map +0 -1
- package/dist/sqlite/SqliteViewLocker.js +0 -119
- package/dist/sqlite/SqliteViewLocker.js.map +0 -1
- package/dist/sqlite/index.js +0 -25
- package/dist/sqlite/index.js.map +0 -1
- package/dist/sqlite/queries/eventLockTableInit.js +0 -15
- package/dist/sqlite/queries/eventLockTableInit.js.map +0 -1
- package/dist/sqlite/queries/index.js +0 -19
- package/dist/sqlite/queries/index.js.map +0 -1
- package/dist/sqlite/queries/viewLockTableInit.js.map +0 -1
- package/dist/sqlite/utils/getEventId.js +0 -11
- package/dist/sqlite/utils/getEventId.js.map +0 -1
- package/dist/sqlite/utils/guid.js.map +0 -1
- package/dist/sqlite/utils/index.js +0 -19
- package/dist/sqlite/utils/index.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/dist/utils/Deferred.js.map +0 -1
- package/dist/utils/Lock.js +0 -50
- package/dist/utils/Lock.js.map +0 -1
- package/dist/utils/delay.js +0 -13
- package/dist/utils/delay.js.map +0 -1
- package/dist/utils/getClassName.js.map +0 -1
- package/dist/utils/getHandler.js +0 -19
- package/dist/utils/getHandler.js.map +0 -1
- package/dist/utils/getMessageHandlerNames.js +0 -34
- package/dist/utils/getMessageHandlerNames.js.map +0 -1
- package/dist/utils/index.js +0 -29
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/isClass.js.map +0 -1
- package/dist/utils/iteratorToArray.js +0 -10
- package/dist/utils/iteratorToArray.js.map +0 -1
- package/dist/utils/notEmpty.js +0 -6
- package/dist/utils/notEmpty.js.map +0 -1
- package/dist/utils/setupOneTimeEmitterSubscription.js +0 -46
- package/dist/utils/setupOneTimeEmitterSubscription.js.map +0 -1
- package/dist/utils/subscribe.js +0 -51
- package/dist/utils/subscribe.js.map +0 -1
- package/dist/utils/validateHandlers.js +0 -21
- package/dist/utils/validateHandlers.js.map +0 -1
- package/eslint.config.mjs +0 -838
- package/src/AbstractAggregate.ts +0 -223
- package/src/AbstractProjection.ts +0 -209
- package/src/AbstractSaga.ts +0 -118
- package/src/AggregateCommandHandler.ts +0 -131
- package/src/CommandBus.ts +0 -100
- package/src/CqrsContainerBuilder.ts +0 -124
- package/src/Event.ts +0 -32
- package/src/EventDispatcher.ts +0 -173
- package/src/EventStore.ts +0 -205
- package/src/EventValidationProcessor.ts +0 -33
- package/src/SagaEventHandler.ts +0 -160
- package/src/in-memory/InMemoryEventStorage.ts +0 -108
- package/src/in-memory/InMemoryLock.ts +0 -43
- package/src/in-memory/InMemoryMessageBus.ts +0 -140
- package/src/in-memory/InMemorySnapshotStorage.ts +0 -89
- package/src/in-memory/InMemoryView.ts +0 -208
- package/src/in-memory/index.ts +0 -5
- package/src/in-memory/utils/index.ts +0 -1
- package/src/in-memory/utils/nextCycle.ts +0 -4
- package/src/index.ts +0 -22
- package/src/interfaces/IAggregate.ts +0 -58
- package/src/interfaces/IAggregateSnapshotStorage.ts +0 -11
- package/src/interfaces/ICommand.ts +0 -3
- package/src/interfaces/ICommandBus.ts +0 -16
- package/src/interfaces/IContainer.ts +0 -27
- package/src/interfaces/IDispatchPipelineProcessor.ts +0 -35
- package/src/interfaces/IEvent.ts +0 -13
- package/src/interfaces/IEventBus.ts +0 -11
- package/src/interfaces/IEventDispatcher.ts +0 -7
- package/src/interfaces/IEventLocker.ts +0 -34
- package/src/interfaces/IEventReceptor.ts +0 -6
- package/src/interfaces/IEventSet.ts +0 -7
- package/src/interfaces/IEventStorage.ts +0 -53
- package/src/interfaces/IEventStore.ts +0 -13
- package/src/interfaces/IEventStream.ts +0 -3
- package/src/interfaces/IIdentifierProvider.ts +0 -17
- package/src/interfaces/ILogger.ts +0 -11
- package/src/interfaces/IMessage.ts +0 -22
- package/src/interfaces/IMessageBus.ts +0 -8
- package/src/interfaces/IObjectStorage.ts +0 -13
- package/src/interfaces/IObservable.ts +0 -31
- package/src/interfaces/IObserver.ts +0 -5
- package/src/interfaces/IProjection.ts +0 -20
- package/src/interfaces/ISaga.ts +0 -38
- package/src/interfaces/IViewLocker.ts +0 -46
- package/src/interfaces/Identifier.ts +0 -1
- package/src/interfaces/index.ts +0 -26
- package/src/interfaces/isObject.ts +0 -5
- package/src/rabbitmq/IContainer.ts +0 -16
- package/src/rabbitmq/RabbitMqEventBus.ts +0 -104
- package/src/rabbitmq/RabbitMqEventInjector.ts +0 -66
- package/src/rabbitmq/RabbitMqGateway.ts +0 -473
- package/src/rabbitmq/TerminationHandler.ts +0 -31
- package/src/rabbitmq/constants.ts +0 -2
- package/src/rabbitmq/index.ts +0 -3
- package/src/sqlite/AbstractSqliteAccessor.ts +0 -58
- package/src/sqlite/AbstractSqliteObjectProjection.ts +0 -31
- package/src/sqlite/AbstractSqliteView.ts +0 -53
- package/src/sqlite/IContainer.ts +0 -8
- package/src/sqlite/SqliteEventLocker.ts +0 -137
- package/src/sqlite/SqliteObjectStorage.ts +0 -142
- package/src/sqlite/SqliteObjectView.ts +0 -58
- package/src/sqlite/SqliteProjectionDataParams.ts +0 -16
- package/src/sqlite/SqliteViewLocker.ts +0 -167
- package/src/sqlite/index.ts +0 -8
- package/src/sqlite/queries/eventLockTableInit.ts +0 -10
- package/src/sqlite/queries/index.ts +0 -2
- package/src/sqlite/queries/viewLockTableInit.ts +0 -9
- package/src/sqlite/utils/getEventId.ts +0 -8
- package/src/sqlite/utils/guid.ts +0 -4
- package/src/sqlite/utils/index.ts +0 -2
- package/src/utils/Deferred.ts +0 -41
- package/src/utils/Lock.ts +0 -53
- package/src/utils/delay.ts +0 -8
- package/src/utils/getClassName.ts +0 -6
- package/src/utils/getHandler.ts +0 -20
- package/src/utils/getMessageHandlerNames.ts +0 -38
- package/src/utils/index.ts +0 -12
- package/src/utils/isClass.ts +0 -4
- package/src/utils/iteratorToArray.ts +0 -6
- package/src/utils/notEmpty.ts +0 -1
- package/src/utils/setupOneTimeEmitterSubscription.ts +0 -59
- package/src/utils/subscribe.ts +0 -65
- package/src/utils/validateHandlers.ts +0 -20
- package/types/AbstractAggregate.d.ts +0 -57
- package/types/AbstractProjection.d.ts +0 -60
- package/types/AbstractSaga.d.ts +0 -31
- package/types/AggregateCommandHandler.d.ts +0 -20
- package/types/CommandBus.d.ts +0 -27
- package/types/CqrsContainerBuilder.d.ts +0 -21
- package/types/Event.d.ts +0 -13
- package/types/EventDispatcher.d.ts +0 -32
- package/types/EventStore.d.ts +0 -34
- package/types/EventValidationProcessor.d.ts +0 -19
- package/types/SagaEventHandler.d.ts +0 -21
- package/types/in-memory/InMemoryEventStorage.d.ts +0 -24
- package/types/in-memory/InMemoryLock.d.ts +0 -21
- package/types/in-memory/InMemoryMessageBus.d.ts +0 -42
- package/types/in-memory/InMemorySnapshotStorage.d.ts +0 -37
- package/types/in-memory/InMemoryView.d.ts +0 -53
- package/types/in-memory/index.d.ts +0 -5
- package/types/in-memory/utils/index.d.ts +0 -1
- package/types/index.d.ts +0 -14
- package/types/interfaces/IAggregate.d.ts +0 -35
- package/types/interfaces/IAggregateSnapshotStorage.d.ts +0 -7
- package/types/interfaces/ICommand.d.ts +0 -2
- package/types/interfaces/ICommandBus.d.ts +0 -14
- package/types/interfaces/IContainer.d.ts +0 -23
- package/types/interfaces/IDispatchPipelineProcessor.d.ts +0 -25
- package/types/interfaces/IEvent.d.ts +0 -6
- package/types/interfaces/IEventBus.d.ts +0 -6
- package/types/interfaces/IEventDispatcher.d.ts +0 -6
- package/types/interfaces/IEventLocker.d.ts +0 -24
- package/types/interfaces/IEventReceptor.d.ts +0 -5
- package/types/interfaces/IEventSet.d.ts +0 -3
- package/types/interfaces/IEventStorage.d.ts +0 -36
- package/types/interfaces/IEventStore.d.ts +0 -9
- package/types/interfaces/IEventStream.d.ts +0 -2
- package/types/interfaces/IIdentifierProvider.d.ts +0 -10
- package/types/interfaces/IMessage.d.ts +0 -12
- package/types/interfaces/IMessageBus.d.ts +0 -7
- package/types/interfaces/IObjectStorage.d.ts +0 -8
- package/types/interfaces/IObservable.d.ts +0 -19
- package/types/interfaces/IObserver.d.ts +0 -4
- package/types/interfaces/IProjection.d.ts +0 -17
- package/types/interfaces/ISaga.d.ts +0 -30
- package/types/interfaces/Identifier.d.ts +0 -1
- package/types/interfaces/index.d.ts +0 -26
- package/types/interfaces/isObject.d.ts +0 -1
- package/types/rabbitmq/IContainer.d.ts +0 -14
- package/types/rabbitmq/RabbitMqEventBus.d.ts +0 -41
- package/types/rabbitmq/RabbitMqEventInjector.d.ts +0 -13
- package/types/rabbitmq/RabbitMqGateway.d.ts +0 -78
- package/types/rabbitmq/TerminationHandler.d.ts +0 -10
- package/types/rabbitmq/constants.d.ts +0 -2
- package/types/rabbitmq/index.d.ts +0 -3
- package/types/sqlite/AbstractSqliteAccessor.d.ts +0 -25
- package/types/sqlite/AbstractSqliteObjectProjection.d.ts +0 -8
- package/types/sqlite/AbstractSqliteView.d.ts +0 -18
- package/types/sqlite/IContainer.d.ts +0 -7
- package/types/sqlite/SqliteEventLocker.d.ts +0 -28
- package/types/sqlite/SqliteObjectStorage.d.ts +0 -16
- package/types/sqlite/SqliteObjectView.d.ts +0 -16
- package/types/sqlite/SqliteViewLocker.d.ts +0 -30
- package/types/sqlite/index.d.ts +0 -8
- package/types/sqlite/queries/index.d.ts +0 -2
- package/types/sqlite/utils/getEventId.d.ts +0 -5
- package/types/sqlite/utils/index.d.ts +0 -2
- package/types/utils/Lock.d.ts +0 -22
- package/types/utils/delay.d.ts +0 -5
- package/types/utils/getHandler.d.ts +0 -7
- package/types/utils/getMessageHandlerNames.d.ts +0 -5
- package/types/utils/index.d.ts +0 -12
- package/types/utils/isClass.d.ts +0 -1
- package/types/utils/iteratorToArray.d.ts +0 -1
- package/types/utils/notEmpty.d.ts +0 -1
- package/types/utils/setupOneTimeEmitterSubscription.d.ts +0 -12
- package/types/utils/subscribe.d.ts +0 -13
- /package/dist/{interfaces → cjs/interfaces}/IAggregate.js +0 -0
- /package/dist/{interfaces → cjs/interfaces}/ICommand.js +0 -0
- /package/dist/{interfaces → cjs/interfaces}/ICommandBus.js +0 -0
- /package/dist/{interfaces → cjs/interfaces}/IContainer.js +0 -0
- /package/dist/{interfaces → cjs/interfaces}/IEventDispatcher.js +0 -0
- /package/dist/{interfaces → cjs/interfaces}/IEventReceptor.js +0 -0
- /package/dist/{interfaces → cjs/interfaces}/IEventStore.js +0 -0
- /package/dist/{interfaces → cjs/interfaces}/IEventStream.js +0 -0
- /package/dist/{interfaces → cjs/interfaces}/ILogger.js +0 -0
- /package/dist/{interfaces → cjs/interfaces}/IObjectStorage.js +0 -0
- /package/dist/{interfaces → cjs/interfaces}/IObserver.js +0 -0
- /package/dist/{interfaces → cjs/interfaces}/IProjection.js +0 -0
- /package/dist/{interfaces → cjs/interfaces}/ISaga.js +0 -0
- /package/dist/{interfaces → cjs/interfaces}/Identifier.js +0 -0
- /package/dist/{interfaces → cjs/interfaces}/isObject.js +0 -0
- /package/dist/{rabbitmq → cjs/rabbitmq}/IContainer.js +0 -0
- /package/dist/{sqlite → cjs/sqlite}/IContainer.js +0 -0
- /package/dist/{sqlite → cjs/sqlite}/SqliteProjectionDataParams.js +0 -0
- /package/dist/{sqlite → cjs/sqlite}/queries/viewLockTableInit.js +0 -0
- /package/dist/{sqlite → cjs/sqlite}/utils/guid.js +0 -0
- /package/dist/{utils → cjs/utils}/Deferred.js +0 -0
- /package/dist/{utils → cjs/utils}/getClassName.js +0 -0
- /package/dist/{utils → cjs/utils}/isClass.js +0 -0
- /package/{types → dist/types}/in-memory/utils/nextCycle.d.ts +0 -0
- /package/{types → dist/types}/interfaces/ILogger.d.ts +0 -0
- /package/{types → dist/types}/interfaces/IViewLocker.d.ts +0 -0
- /package/{types → dist/types}/sqlite/SqliteProjectionDataParams.d.ts +0 -0
- /package/{types → dist/types}/sqlite/queries/eventLockTableInit.d.ts +0 -0
- /package/{types → dist/types}/sqlite/queries/viewLockTableInit.d.ts +0 -0
- /package/{types → dist/types}/sqlite/utils/guid.d.ts +0 -0
- /package/{types → dist/types}/utils/Deferred.d.ts +0 -0
- /package/{types → dist/types}/utils/getClassName.d.ts +0 -0
- /package/{types → dist/types}/utils/validateHandlers.d.ts +0 -0
package/README.md
CHANGED
|
@@ -1,188 +1,504 @@
|
|
|
1
1
|
node-cqrs
|
|
2
2
|
=========
|
|
3
3
|
|
|
4
|
-
[](https://www.npmjs.com/package/node-cqrs)
|
|
5
|
+
[](https://coveralls.io/github/snatalenko/node-cqrs)
|
|
6
|
+
[](https://www.npmjs.com/package/node-cqrs)
|
|
7
|
+
[](https://github.com/snatalenko/node-cqrs)
|
|
8
|
+
[](https://github.com/snatalenko/node-cqrs)
|
|
9
|
+
[](https://github.com/snatalenko/node-cqrs)
|
|
10
|
+
[](https://github.com/snatalenko/node-cqrs/actions/workflows/ci.yml)
|
|
11
|
+
|
|
12
|
+
Infrastructure-agnostic building blocks for CQRS/ES, inspired by Lokad.CQRS.
|
|
13
|
+
|
|
14
|
+
CQRS/ES can be simple in a single process - minimal code, no framework:
|
|
15
|
+
[examples/user-domain/framework-free](examples/user-domain/framework-free/index.ts).
|
|
16
|
+
This library handles the "boring but hard" parts required in distributed environments:
|
|
17
|
+
|
|
18
|
+
- safer async command + event handling (per-aggregate FIFO, shared restore, fewer footguns)
|
|
19
|
+
- restart-safe projections/views (catch-up with checkpoints, readiness gates, locking)
|
|
20
|
+
- snapshots for fast rehydrate (automatic snapshot events + restore)
|
|
21
|
+
- pluggable dispatch pipeline (encode/persist/fan-out; order is explicit)
|
|
22
|
+
- conflict-safe writes (optimistic concurrency + retry with clean rehydrate)
|
|
23
|
+
- routed pipelines with backpressure (named pipelines + concurrency limits)
|
|
24
|
+
- competing-consumer delivery (named queues when supported)
|
|
25
|
+
- selective restore with correct versioning (filter + tail to keep versions right)
|
|
26
|
+
- sagas with built-in correlation (event-id origins + sagaOrigins propagation)
|
|
27
|
+
|
|
28
|
+
Built around ES6/TypeScript classes and dependency injection - swap implementations without patching the library.
|
|
29
|
+
|
|
30
|
+
## Table of Contents
|
|
31
|
+
|
|
32
|
+
- [Overview](#overview)
|
|
33
|
+
- [Installation](#installation)
|
|
34
|
+
- [ContainerBuilder](#containerbuilder)
|
|
35
|
+
- [Commands](#commands)
|
|
36
|
+
- [Aggregates (write model)](#aggregates-write-model)
|
|
37
|
+
- [AbstractAggregate](#abstractaggregate)
|
|
38
|
+
- [Aggregate State](#aggregate-state)
|
|
39
|
+
- [External Dependencies](#external-dependencies)
|
|
40
|
+
- [Projections and Views (read model)](#projections-and-views-read-model)
|
|
41
|
+
- [AbstractProjection](#abstractprojection)
|
|
42
|
+
- [View restoring on start](#view-restoring-on-start)
|
|
43
|
+
- [Accessing views](#accessing-views)
|
|
44
|
+
- [Sagas](#sagas)
|
|
45
|
+
- [Infrastructure modules](#infrastructure-modules)
|
|
46
|
+
- [In-memory](#in-memory)
|
|
47
|
+
- [SQLite](#sqlite)
|
|
48
|
+
- [RabbitMQ](#rabbitmq)
|
|
49
|
+
- [Workers](#workers)
|
|
50
|
+
- [Examples](#examples)
|
|
51
|
+
|
|
9
52
|
|
|
10
53
|
## Overview
|
|
11
54
|
|
|
12
|
-
|
|
55
|
+

|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
Commands and events are loosely typed objects implementing the [`IMessage`](src/interfaces/IMessage.ts) interface:
|
|
59
|
+
|
|
60
|
+
```ts
|
|
61
|
+
interface IMessage<TPayload = any> {
|
|
62
|
+
type: string;
|
|
63
|
+
|
|
64
|
+
aggregateId?: string | number;
|
|
65
|
+
aggregateVersion?: number;
|
|
66
|
+
sagaOrigins?: Record<string, string>;
|
|
67
|
+
|
|
68
|
+
payload: TPayload;
|
|
69
|
+
context?: any;
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Domain logic lives in three building blocks:
|
|
74
|
+
|
|
75
|
+
- **[Aggregates](#aggregates-write-model)** - handle commands and emit events
|
|
76
|
+
- **[Projections](#projections-and-views-read-model)** - consume events and update views
|
|
77
|
+
- **[Sagas](#sagas)** - manage processes by reacting to events and enqueueing follow-up commands
|
|
78
|
+
|
|
79
|
+
Message delivery is handled by the following components, in order:
|
|
80
|
+
|
|
81
|
+
- **[Command Bus](src/in-memory/InMemoryMessageBus.ts)** - routes commands to handlers
|
|
82
|
+
- **[Aggregate Command Handler](src/AggregateCommandHandler.ts)** - restores aggregate state and executes commands
|
|
83
|
+
- **[Event Store](src/EventStore.ts)** — runs the event dispatch pipeline (e.g. encoding, persistence), then publishes events to the event bus for delivery to all subscribers
|
|
84
|
+
- **[Saga Event Handler](src/SagaEventHandler.ts)** - restores saga state and applies events
|
|
85
|
+
|
|
86
|
+
> `src/`, `tests/`, and `examples/` are good entry points - the codebase is intentionally small and readable.
|
|
87
|
+
|
|
13
88
|
|
|
14
|
-
|
|
89
|
+
## Installation
|
|
15
90
|
|
|
91
|
+
```bash
|
|
92
|
+
npm install node-cqrs
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Node.js 16+ and browsers are supported.
|
|
96
|
+
|
|
97
|
+
Optional peer dependencies:
|
|
98
|
+
|
|
99
|
+
| Module | Packages |
|
|
100
|
+
|--------|----------|
|
|
101
|
+
| SQLite | `better-sqlite3`, `md5` |
|
|
102
|
+
| RabbitMQ | `amqplib` |
|
|
103
|
+
| Worker threads | `comlink` |
|
|
16
104
|
|
|
17
|
-
|
|
105
|
+
|
|
106
|
+
## ContainerBuilder
|
|
107
|
+
|
|
108
|
+
Wire buses, the event store, and your domain components with dependency injection:
|
|
18
109
|
|
|
19
110
|
```ts
|
|
20
|
-
|
|
21
|
-
type: string,
|
|
111
|
+
const builder = new ContainerBuilder();
|
|
22
112
|
|
|
23
|
-
|
|
24
|
-
|
|
113
|
+
builder.register(InMemoryEventStorage); // implements IEventStorageReader, IDispatchPipelineProcessor, and IIdentifierProvider
|
|
114
|
+
builder.registerAggregate(UserAggregate);
|
|
115
|
+
builder.registerProjection(UsersProjection, 'usersView');
|
|
116
|
+
builder.registerSaga(WelcomeEmailSaga);
|
|
25
117
|
|
|
26
|
-
|
|
27
|
-
|
|
118
|
+
const { commandBus, eventStore, usersView } = builder.container();
|
|
119
|
+
```
|
|
28
120
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
121
|
+
<details>
|
|
122
|
+
<summary>Manual setup (without DI container)</summary>
|
|
123
|
+
|
|
124
|
+
```ts
|
|
125
|
+
const commandBus = new InMemoryMessageBus();
|
|
126
|
+
const eventBus = new InMemoryMessageBus();
|
|
127
|
+
const eventStorage = new InMemoryEventStorage();
|
|
128
|
+
const eventStore = new EventStore({
|
|
129
|
+
eventStorageReader: eventStorage,
|
|
130
|
+
identifierProvider: eventStorage,
|
|
131
|
+
eventDispatchPipeline: [eventStorage],
|
|
132
|
+
eventBus
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
const aggregateCommandHandler = new AggregateCommandHandler({ eventStore, aggregateType: UserAggregate });
|
|
136
|
+
aggregateCommandHandler.subscribe(commandBus);
|
|
137
|
+
|
|
138
|
+
const projection = new UsersProjection();
|
|
139
|
+
projection.subscribe(eventStore);
|
|
140
|
+
projection.restore(eventStore);
|
|
141
|
+
const users = projection.view;
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
</details>
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
## Commands
|
|
148
|
+
|
|
149
|
+
Commands represent intent. Send them via `commandBus`:
|
|
150
|
+
|
|
151
|
+
```ts
|
|
152
|
+
commandBus.send('signupUser', undefined, { payload: { profile, password } });
|
|
153
|
+
// or
|
|
154
|
+
commandBus.send({ type: 'signupUser', payload: { profile, password } });
|
|
32
155
|
```
|
|
33
156
|
|
|
34
|
-
|
|
157
|
+
Commands are handled by [Aggregates](#aggregates-write-model) and may also be enqueued by [Sagas](#sagas).
|
|
35
158
|
|
|
36
|
-
- [Aggregates](entities/Aggregate/README.MD) handle commands and emit events
|
|
37
|
-
- [Sagas](entities/Saga/README.MD) handle events and enqueue commands
|
|
38
|
-
- [Projections](entities/Projection/README.md) listen to events and update views
|
|
39
159
|
|
|
160
|
+
## Aggregates (write model)
|
|
40
161
|
|
|
41
|
-
|
|
162
|
+
Aggregates handle commands, validate business rules, and emit events.
|
|
163
|
+
Minimal contract ([IAggregate](src/interfaces/IAggregate.ts)):
|
|
42
164
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
165
|
+
```ts
|
|
166
|
+
interface IAggregate {
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Applies a single event to update the aggregate's internal state.
|
|
170
|
+
*
|
|
171
|
+
* This method is used primarily when rehydrating the aggregate
|
|
172
|
+
* from the persisted sequence of events
|
|
173
|
+
*
|
|
174
|
+
* @param event - The event to be applied
|
|
175
|
+
*/
|
|
176
|
+
mutate(event: IEvent): void;
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Processes a command by executing the aggregate's business logic,
|
|
180
|
+
* resulting in new events that capture the state changes.
|
|
181
|
+
* It serves as the primary entry point for invoking aggregate behavior
|
|
182
|
+
*
|
|
183
|
+
* @param command - The command to be processed
|
|
184
|
+
* @returns A set of events produced by the command
|
|
185
|
+
*/
|
|
186
|
+
handle(command: ICommand): IEventSet | Promise<IEventSet>;
|
|
187
|
+
}
|
|
188
|
+
```
|
|
47
189
|
|
|
190
|
+
### AbstractAggregate
|
|
48
191
|
|
|
49
|
-
|
|
192
|
+
The recommended base class. Public method names are matched to command types - `createUser()` handles `createUser`:
|
|
50
193
|
|
|
51
|
-
|
|
194
|
+
```ts
|
|
195
|
+
class UserAggregate extends AbstractAggregate<void> {
|
|
196
|
+
createUser(payload: CreateUserCommandPayload) {
|
|
197
|
+
this.emit('userCreated', { username: payload.username });
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
```
|
|
52
201
|
|
|
202
|
+
Override `static get handles()` to declare command types explicitly.
|
|
53
203
|
|
|
54
|
-
|
|
204
|
+
### Aggregate State
|
|
55
205
|
|
|
56
|
-
|
|
206
|
+
Keep state separate from command handlers - derive it by projecting the aggregate's own events:
|
|
57
207
|
|
|
208
|
+
```ts
|
|
209
|
+
class UserAggregateState {
|
|
210
|
+
passwordHash: string;
|
|
58
211
|
|
|
59
|
-
|
|
212
|
+
passwordChanged(event: IEvent<PasswordChangedEventPayload>) {
|
|
213
|
+
this.passwordHash = event.payload.passwordHash;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
60
216
|
|
|
61
|
-
|
|
217
|
+
class UserAggregate extends AbstractAggregate<UserAggregateState> {
|
|
218
|
+
protected readonly state = new UserAggregateState();
|
|
62
219
|
|
|
63
|
-
|
|
64
|
-
|
|
220
|
+
changePassword(payload: ChangePasswordCommandPayload) {
|
|
221
|
+
if (md5(payload.oldPassword) !== this.state.passwordHash)
|
|
222
|
+
throw new Error('Invalid password');
|
|
65
223
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
return ['createUser'];
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
createUser(commandPayload) {
|
|
72
|
-
// ...
|
|
73
|
-
}
|
|
224
|
+
this.emit('passwordChanged', { passwordHash: md5(payload.newPassword) });
|
|
225
|
+
}
|
|
74
226
|
}
|
|
75
227
|
```
|
|
76
228
|
|
|
77
|
-
|
|
78
|
-
All the wiring can be done manually, without a DI container (you can find it in samples), but with container it’s just easier:
|
|
229
|
+
State **must not throw** - all validation belongs in the aggregate command handler.
|
|
79
230
|
|
|
80
|
-
|
|
81
|
-
const { ContainerBuilder, InMemoryEventStorage } = require('node-cqrs');
|
|
231
|
+
### External Dependencies
|
|
82
232
|
|
|
83
|
-
|
|
84
|
-
|
|
233
|
+
Constructor arguments are injected automatically by the DI container:
|
|
234
|
+
|
|
235
|
+
```ts
|
|
236
|
+
class UserAggregate extends AbstractAggregate {
|
|
237
|
+
constructor({ id, authService }) {
|
|
238
|
+
super({ id });
|
|
239
|
+
this._authService = authService;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
async signupUser(payload) {
|
|
243
|
+
await this._authService.registerUser(payload);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
builder.register(AuthService).as('authService');
|
|
85
248
|
builder.registerAggregate(UserAggregate);
|
|
249
|
+
```
|
|
250
|
+
|
|
86
251
|
|
|
87
|
-
|
|
252
|
+
## Projections and Views (read model)
|
|
253
|
+
|
|
254
|
+
Projections listen to events and update views.
|
|
255
|
+
Minimal contract ([IProjection](src/interfaces/IProjection.ts)):
|
|
256
|
+
|
|
257
|
+
```ts
|
|
258
|
+
interface IProjection<TView> extends IObserver {
|
|
259
|
+
readonly view: TView;
|
|
260
|
+
|
|
261
|
+
/** Subscribe to new events */
|
|
262
|
+
subscribe(eventStore: IObservable): Promise<void> | void;
|
|
263
|
+
|
|
264
|
+
/** Restore view state from not-yet-projected events */
|
|
265
|
+
restore(eventStore: IEventStorageReader): Promise<void> | void;
|
|
266
|
+
|
|
267
|
+
/** Project new event */
|
|
268
|
+
project(event: IEvent): Promise<void> | void;
|
|
269
|
+
}
|
|
88
270
|
```
|
|
89
271
|
|
|
90
|
-
|
|
272
|
+
### AbstractProjection
|
|
91
273
|
|
|
92
|
-
|
|
93
|
-
const userAggregateId = undefined;
|
|
94
|
-
const payload = {
|
|
95
|
-
username: 'john',
|
|
96
|
-
password: 'test'
|
|
97
|
-
};
|
|
274
|
+
Same name-matching rule as AbstractAggregate - `userCreated()` handles the `userCreated` event:
|
|
98
275
|
|
|
99
|
-
|
|
276
|
+
```ts
|
|
277
|
+
class UsersProjection extends AbstractProjection<Map<string, { username: string }>> {
|
|
278
|
+
constructor() {
|
|
279
|
+
super();
|
|
280
|
+
this.view = new Map();
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
userCreated(event: IEvent<UserCreatedEventPayload>) {
|
|
284
|
+
this.view.set(event.aggregateId as string, { username: event.payload.username });
|
|
285
|
+
}
|
|
286
|
+
}
|
|
100
287
|
```
|
|
101
288
|
|
|
102
|
-
|
|
103
|
-
try to load an aggregate event stream and project it to aggregate state,
|
|
104
|
-
then it will pass the command payload to the `createUser` handler we’ve defined earlier.
|
|
289
|
+
Override `static get handles()` to declare event types explicitly.
|
|
105
290
|
|
|
106
|
-
|
|
291
|
+
### View restoring on start
|
|
107
292
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
293
|
+
For persistent views and safe restarts, implement [IViewLocker](src/interfaces/IViewLocker.ts) and [IEventLocker](src/interfaces/IEventLocker.ts) on the projection `view` to enable catch-up and last-processed checkpoints.
|
|
294
|
+
|
|
295
|
+
### Accessing views
|
|
296
|
+
|
|
297
|
+
```ts
|
|
298
|
+
interface IMyContainer extends IContainer { // optional interface for container typing
|
|
299
|
+
usersView: UsersView;
|
|
300
|
+
}
|
|
111
301
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
}
|
|
302
|
+
const builder = new ContainerBuilder<IMyContainer>();
|
|
303
|
+
builder.registerProjection(UsersProjection, 'usersView');
|
|
304
|
+
|
|
305
|
+
const { usersView } = builder.container();
|
|
117
306
|
```
|
|
118
307
|
|
|
119
|
-
|
|
308
|
+
For projections that manage and need to expose multiple views:
|
|
120
309
|
|
|
310
|
+
```ts
|
|
311
|
+
builder.registerProjection(UsersProjection).as('usersProjection');
|
|
312
|
+
builder.register(c => c.usersProjection.users).as('usersView');
|
|
313
|
+
builder.register(c => c.usersProjection.connections).as('connectionsView');
|
|
314
|
+
```
|
|
121
315
|
|
|
122
|
-
### Aggregate → Event → Projection → View
|
|
123
316
|
|
|
124
|
-
|
|
125
|
-
To make it easier, you can extend an `AbstractProjection`:
|
|
317
|
+
## Sagas
|
|
126
318
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
class
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
userCreated(event) {
|
|
136
|
-
// ...
|
|
137
|
-
}
|
|
319
|
+
Sagas coordinate multi-step processes by reacting to events and enqueueing follow-up commands.
|
|
320
|
+
|
|
321
|
+
```ts
|
|
322
|
+
class WelcomeEmailSaga extends AbstractSaga {
|
|
323
|
+
userSignedUp(event) {
|
|
324
|
+
this.enqueue('sendWelcomeEmail', undefined, { email: event.payload.email });
|
|
325
|
+
}
|
|
138
326
|
}
|
|
327
|
+
|
|
328
|
+
builder.register(EventIdAugmentor).as('eventIdAugmenter'); // required: adds event.id
|
|
329
|
+
builder.registerSaga(WelcomeEmailSaga);
|
|
139
330
|
```
|
|
140
331
|
|
|
141
|
-
|
|
332
|
+
- Handler methods are named after event types (`userSignedUp` handles `userSignedUp`)
|
|
333
|
+
- `this.enqueue(commandType, aggregateId, payload)` produces commands
|
|
334
|
+
- `EventIdAugmentor` must be in the dispatch pipeline - starter events use `event.id` as the saga origin
|
|
335
|
+
- `static sagaDescriptor` (optional) - stable key for `message.sagaOrigins`, defaults to class name
|
|
142
336
|
|
|
143
|
-
|
|
144
|
-
class UsersProjection extends AbstractProjection {
|
|
145
|
-
get view() {
|
|
146
|
-
return this._view || (this._view = new Map());
|
|
147
|
-
}
|
|
337
|
+
`handle(event)` runs the handler before `mutate(event)`, so handlers always see the previous state.
|
|
148
338
|
|
|
149
|
-
|
|
150
|
-
|
|
339
|
+
Saga context is tracked in `message.sagaOrigins[sagaDescriptor]`, storing the starter event id. A saga starts when `sagaOrigins[sagaDescriptor]` is absent and continues when it is present. A single event type can start multiple saga types.
|
|
340
|
+
|
|
341
|
+
<details>
|
|
342
|
+
<summary><strong>Optional: explicit startsWith/handles</strong></summary>
|
|
343
|
+
|
|
344
|
+
By default, the saga starts on any handled event that does not have `sagaOrigins[sagaDescriptor]` and continues when it does.
|
|
345
|
+
|
|
346
|
+
For strict, explicit routing:
|
|
347
|
+
- `static startsWith`: event types allowed to start a saga
|
|
348
|
+
- `static handles`: additional event types to subscribe to
|
|
349
|
+
</details>
|
|
350
|
+
|
|
351
|
+
<details>
|
|
352
|
+
<summary><strong>Manual wiring (without DI container)</strong></summary>
|
|
353
|
+
|
|
354
|
+
```ts
|
|
355
|
+
const commandBus = new InMemoryMessageBus();
|
|
356
|
+
const eventBus = new InMemoryMessageBus();
|
|
357
|
+
const eventStorage = new InMemoryEventStorage();
|
|
358
|
+
const eventStore = new EventStore({
|
|
359
|
+
eventStorageReader: eventStorage,
|
|
360
|
+
identifierProvider: eventStorage,
|
|
361
|
+
eventDispatchPipeline: [
|
|
362
|
+
new EventIdAugmentor({ identifierProvider: eventStorage }),
|
|
363
|
+
eventStorage
|
|
364
|
+
],
|
|
365
|
+
eventBus
|
|
366
|
+
});
|
|
367
|
+
|
|
368
|
+
SignupAggregate.register(eventStore, commandBus);
|
|
369
|
+
WelcomeEmailSaga.register(eventStore, commandBus);
|
|
151
370
|
```
|
|
152
371
|
|
|
153
|
-
|
|
372
|
+
</details>
|
|
154
373
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
374
|
+
Minimal contract ([ISaga](src/interfaces/ISaga.ts)):
|
|
375
|
+
|
|
376
|
+
```ts
|
|
377
|
+
interface ISaga {
|
|
378
|
+
|
|
379
|
+
/**
|
|
380
|
+
* Apply a historical event to restore saga state.
|
|
381
|
+
*/
|
|
382
|
+
mutate(event: IEvent): unknown | Promise<unknown>;
|
|
383
|
+
|
|
384
|
+
/**
|
|
385
|
+
* Process an incoming event.
|
|
386
|
+
*
|
|
387
|
+
* @returns Commands produced by the saga in response to the event
|
|
388
|
+
*/
|
|
389
|
+
handle(event: IEvent): ReadonlyArray<ICommand> | Promise<ReadonlyArray<ICommand>>;
|
|
164
390
|
}
|
|
165
391
|
```
|
|
166
392
|
|
|
167
|
-
|
|
393
|
+
|
|
394
|
+
## Infrastructure modules
|
|
395
|
+
|
|
396
|
+
| Module | Import | Use case |
|
|
397
|
+
|--------|--------|----------|
|
|
398
|
+
| In-memory | `node-cqrs` | Tests and local development |
|
|
399
|
+
| SQLite | `node-cqrs/sqlite` | Persistent views with catch-up |
|
|
400
|
+
| RabbitMQ | `node-cqrs/rabbitmq` | Cross-process event distribution |
|
|
401
|
+
| Workers | `node-cqrs/workers` | CPU-heavy projections in worker threads |
|
|
402
|
+
|
|
403
|
+
### In-memory
|
|
404
|
+
|
|
405
|
+
- [InMemoryEventStorage](src/in-memory/InMemoryEventStorage.ts) - event storage + identifier provider
|
|
406
|
+
- [InMemoryMessageBus](src/in-memory/InMemoryMessageBus.ts) - event/command bus
|
|
407
|
+
- [InMemoryView](src/in-memory/InMemoryView.ts) - in-memory view with locking support
|
|
408
|
+
|
|
409
|
+
### SQLite
|
|
410
|
+
|
|
411
|
+
```ts
|
|
412
|
+
import { AbstractSqliteView, SqliteObjectView } from 'node-cqrs/sqlite';
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
- [AbstractSqliteView](src/sqlite/AbstractSqliteView.ts) - SQLite view with restore locking and checkpoint tracking
|
|
416
|
+
- [SqliteObjectView](src/sqlite/SqliteObjectView.ts) - SQLite-backed object view
|
|
417
|
+
|
|
418
|
+
### RabbitMQ
|
|
419
|
+
|
|
420
|
+
```ts
|
|
421
|
+
import { RabbitMqEventBus, RabbitMqCommandBus, RabbitMqGateway } from 'node-cqrs/rabbitmq';
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
- [RabbitMqGateway](src/rabbitmq/RabbitMqGateway.ts) - publish/subscribe gateway with durable and transient queue support
|
|
425
|
+
- [RabbitMqEventBus](src/rabbitmq/RabbitMqEventBus.ts) - RabbitMQ-backed `IEventBus` (fanout delivery to all subscribers)
|
|
426
|
+
- [RabbitMqCommandBus](src/rabbitmq/RabbitMqCommandBus.ts) - RabbitMQ-backed `ICommandBus` (point-to-point delivery via durable queue)
|
|
427
|
+
|
|
428
|
+
### Workers
|
|
429
|
+
|
|
430
|
+
```ts
|
|
431
|
+
import { AbstractWorkerProjection } from 'node-cqrs/workers';
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
Workers are an execution mode for projections.
|
|
435
|
+
|
|
436
|
+
You still define one projection class, but it runs as:
|
|
437
|
+
1. A real projection inside a worker thread (handles events, mutates the view).
|
|
438
|
+
2. A proxy projection in the main thread (forwards calls to the worker and exposes the remote view).
|
|
439
|
+
|
|
440
|
+
This lets you keep your projection code unchanged while moving heavy work off the main thread.
|
|
441
|
+
|
|
442
|
+
Quickstart:
|
|
443
|
+
1. Create your projection by extending `AbstractWorkerProjection`.
|
|
444
|
+
2. In the worker module, call `YourProjection.createInstanceInWorkerThread()`.
|
|
445
|
+
3. In your app container, register `YourProjection.workerProxyFactory` and use it like a normal projection.
|
|
446
|
+
|
|
447
|
+
Worker module example (CJS):
|
|
168
448
|
|
|
169
449
|
```js
|
|
170
|
-
|
|
450
|
+
const { AbstractWorkerProjection } = require('node-cqrs/workers');
|
|
451
|
+
|
|
452
|
+
class CounterView {
|
|
453
|
+
counter = 0;
|
|
454
|
+
increment() { this.counter += 1; }
|
|
455
|
+
getCounter() { return this.counter; }
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
class CounterProjection extends AbstractWorkerProjection {
|
|
459
|
+
static get workerModulePath() {
|
|
460
|
+
return __filename;
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
constructor() {
|
|
464
|
+
super({ view: new CounterView() });
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
somethingHappened() {
|
|
468
|
+
this.view.increment();
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
CounterProjection.createInstanceInWorkerThread();
|
|
473
|
+
module.exports = CounterProjection;
|
|
171
474
|
```
|
|
172
475
|
|
|
173
|
-
|
|
476
|
+
Main thread usage (DI):
|
|
174
477
|
|
|
175
478
|
```js
|
|
176
|
-
|
|
177
|
-
|
|
479
|
+
const CounterProjection = require('./CounterProjection.cjs');
|
|
480
|
+
const { ContainerBuilder } = require('node-cqrs');
|
|
481
|
+
|
|
482
|
+
const builder = new ContainerBuilder();
|
|
483
|
+
builder.registerProjection(CounterProjection.workerProxyFactory, 'counterView');
|
|
484
|
+
|
|
485
|
+
const { eventStore, counterView } = builder.container();
|
|
486
|
+
await eventStore.dispatch([{ id: '1', type: 'somethingHappened', payload: {} }]);
|
|
487
|
+
const counter = await counterView.getCounter();
|
|
178
488
|
```
|
|
179
489
|
|
|
180
|
-
|
|
490
|
+
`workerModulePath` should point to executable JavaScript (`__filename` in CJS, `fileURLToPath(import.meta.url)` in ESM).
|
|
491
|
+
If you need a custom proxy projection, you can still use `workerProxyFactory(...)` directly (advanced usage).
|
|
492
|
+
|
|
181
493
|
|
|
182
|
-
|
|
183
|
-
* [eslint](http://eslint.org)
|
|
184
|
-
* `npm test -- --watch`
|
|
494
|
+
## Examples
|
|
185
495
|
|
|
186
|
-
|
|
496
|
+
- [examples/user-domain/framework-free](examples/user-domain/framework-free/index.ts) - minimal, no-framework CQRS/ES in one file
|
|
497
|
+
- [examples/user-domain/ts](examples/user-domain/ts) - TypeScript with DI container
|
|
498
|
+
- [examples/user-domain/cjs](examples/user-domain/cjs) - CommonJS
|
|
499
|
+
- [examples/sagas/simple](examples/sagas/simple/index.ts) - simple saga
|
|
500
|
+
- [examples/sagas/overlaps](examples/sagas/overlaps/index.ts) - overlapping sagas, multi-step flow
|
|
501
|
+
- [examples/browser](examples/browser) - browser smoke test
|
|
502
|
+
- [examples/workers/worker-projection](examples/workers/worker-projection) - worker thread projection
|
|
187
503
|
|
|
188
|
-
|
|
504
|
+
TS examples can be run with NodeJS 24+ without transpiling.
|