node-cqrs 1.0.0 → 1.1.0-alpha.1
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 +30 -1
- package/README.md +115 -101
- package/dist/cjs/AbstractProjection.js +43 -18
- package/dist/cjs/AbstractProjection.js.map +1 -1
- package/dist/cjs/AggregateCommandHandler.js +27 -13
- package/dist/cjs/AggregateCommandHandler.js.map +1 -1
- package/dist/cjs/CqrsContainerBuilder.js +6 -1
- package/dist/cjs/CqrsContainerBuilder.js.map +1 -1
- package/dist/cjs/EventDispatchPipeline.js +12 -2
- package/dist/cjs/EventDispatchPipeline.js.map +1 -1
- package/dist/cjs/EventDispatcher.js +39 -10
- package/dist/cjs/EventDispatcher.js.map +1 -1
- package/dist/cjs/EventStore.js +7 -2
- package/dist/cjs/EventStore.js.map +1 -1
- package/dist/cjs/SagaEventHandler.js +54 -40
- package/dist/cjs/SagaEventHandler.js.map +1 -1
- package/dist/cjs/in-memory/InMemoryEventStorage.js +39 -24
- package/dist/cjs/in-memory/InMemoryEventStorage.js.map +1 -1
- package/dist/cjs/in-memory/InMemoryMessageBus.js +11 -5
- package/dist/cjs/in-memory/InMemoryMessageBus.js.map +1 -1
- package/dist/cjs/interfaces/IDispatchPipelineProcessor.js.map +1 -1
- package/dist/cjs/interfaces/IMessageMeta.js +3 -0
- package/dist/cjs/interfaces/IMessageMeta.js.map +1 -0
- package/dist/cjs/interfaces/IObservable.js.map +1 -1
- package/dist/cjs/interfaces/index.js +1 -0
- package/dist/cjs/interfaces/index.js.map +1 -1
- package/dist/cjs/mongodb/AbstractMongoAccessor.js +51 -0
- package/dist/cjs/mongodb/AbstractMongoAccessor.js.map +1 -0
- package/dist/cjs/mongodb/AbstractMongoObjectProjection.js +26 -0
- package/dist/cjs/mongodb/AbstractMongoObjectProjection.js.map +1 -0
- package/dist/cjs/mongodb/AbstractMongoView.js +57 -0
- package/dist/cjs/mongodb/AbstractMongoView.js.map +1 -0
- package/dist/cjs/mongodb/IContainer.js +3 -0
- package/dist/cjs/mongodb/IContainer.js.map +1 -0
- package/dist/cjs/mongodb/MongoEventLocker.js +104 -0
- package/dist/cjs/mongodb/MongoEventLocker.js.map +1 -0
- package/dist/cjs/mongodb/MongoEventStorage.js +200 -0
- package/dist/cjs/mongodb/MongoEventStorage.js.map +1 -0
- package/dist/cjs/mongodb/MongoObjectStorage.js +101 -0
- package/dist/cjs/mongodb/MongoObjectStorage.js.map +1 -0
- package/dist/cjs/mongodb/MongoObjectView.js +41 -0
- package/dist/cjs/mongodb/MongoObjectView.js.map +1 -0
- package/dist/cjs/mongodb/MongoProjectionDataParams.js +3 -0
- package/dist/cjs/mongodb/MongoProjectionDataParams.js.map +1 -0
- package/dist/cjs/mongodb/MongoViewLocker.js +136 -0
- package/dist/cjs/mongodb/MongoViewLocker.js.map +1 -0
- package/dist/cjs/mongodb/index.js +28 -0
- package/dist/cjs/mongodb/index.js.map +1 -0
- package/dist/cjs/mongodb/registerExitCleanup.js +28 -0
- package/dist/cjs/mongodb/registerExitCleanup.js.map +1 -0
- package/dist/cjs/mongodb/utils/getEventId.js +14 -0
- package/dist/cjs/mongodb/utils/getEventId.js.map +1 -0
- package/dist/cjs/mongodb/utils/index.js +18 -0
- package/dist/cjs/mongodb/utils/index.js.map +1 -0
- package/dist/cjs/rabbitmq/RabbitMqCommandBus.js +21 -8
- package/dist/cjs/rabbitmq/RabbitMqCommandBus.js.map +1 -1
- package/dist/cjs/rabbitmq/RabbitMqEventBus.js +2 -2
- package/dist/cjs/rabbitmq/RabbitMqEventBus.js.map +1 -1
- package/dist/cjs/rabbitmq/RabbitMqGateway.js +89 -64
- package/dist/cjs/rabbitmq/RabbitMqGateway.js.map +1 -1
- package/dist/cjs/redis/AbstractRedisAccessor.js +51 -0
- package/dist/cjs/redis/AbstractRedisAccessor.js.map +1 -0
- package/dist/cjs/redis/AbstractRedisProjection.js +26 -0
- package/dist/cjs/redis/AbstractRedisProjection.js.map +1 -0
- package/dist/cjs/redis/IContainer.js +3 -0
- package/dist/cjs/redis/IContainer.js.map +1 -0
- package/dist/cjs/redis/RedisEventLocker.js +96 -0
- package/dist/cjs/redis/RedisEventLocker.js.map +1 -0
- package/dist/cjs/redis/RedisObjectStorage.js +125 -0
- package/dist/cjs/redis/RedisObjectStorage.js.map +1 -0
- package/dist/cjs/redis/RedisProjectionDataParams.js +3 -0
- package/dist/cjs/redis/RedisProjectionDataParams.js.map +1 -0
- package/dist/cjs/redis/RedisView.js +81 -0
- package/dist/cjs/redis/RedisView.js.map +1 -0
- package/dist/cjs/redis/RedisViewLocker.js +111 -0
- package/dist/cjs/redis/RedisViewLocker.js.map +1 -0
- package/dist/cjs/redis/index.js +30 -0
- package/dist/cjs/redis/index.js.map +1 -0
- package/dist/cjs/redis/utils/getEventId.js +14 -0
- package/dist/cjs/redis/utils/getEventId.js.map +1 -0
- package/dist/cjs/redis/utils/index.js +18 -0
- package/dist/cjs/redis/utils/index.js.map +1 -0
- package/dist/cjs/sqlite/AbstractSqliteView.js.map +1 -1
- package/dist/cjs/sqlite/SqliteEventStorage.js +215 -0
- package/dist/cjs/sqlite/SqliteEventStorage.js.map +1 -0
- package/dist/cjs/sqlite/SqliteObjectStorage.js +6 -6
- package/dist/cjs/sqlite/SqliteObjectStorage.js.map +1 -1
- package/dist/cjs/sqlite/SqliteObjectView.js.map +1 -1
- package/dist/cjs/sqlite/index.js +1 -0
- package/dist/cjs/sqlite/index.js.map +1 -1
- package/dist/cjs/sqlite/utils/bufferToGuid.js +9 -0
- package/dist/cjs/sqlite/utils/bufferToGuid.js.map +1 -0
- package/dist/cjs/sqlite/utils/getEventId.js +2 -5
- package/dist/cjs/sqlite/utils/getEventId.js.map +1 -1
- package/dist/cjs/sqlite/utils/guid.js +1 -1
- package/dist/cjs/sqlite/utils/guid.js.map +1 -1
- package/dist/cjs/sqlite/utils/index.js +1 -0
- package/dist/cjs/sqlite/utils/index.js.map +1 -1
- package/dist/cjs/telemetry/index.js +20 -0
- package/dist/cjs/telemetry/index.js.map +1 -0
- package/dist/cjs/telemetry/recordSpanError.js +19 -0
- package/dist/cjs/telemetry/recordSpanError.js.map +1 -0
- package/dist/cjs/telemetry/spanAttributes.js +26 -0
- package/dist/cjs/telemetry/spanAttributes.js.map +1 -0
- package/dist/cjs/telemetry/spanContext.js +25 -0
- package/dist/cjs/telemetry/spanContext.js.map +1 -0
- package/dist/cjs/utils/MapAssertable.js +25 -1
- package/dist/cjs/utils/MapAssertable.js.map +1 -1
- package/dist/esm/AbstractProjection.js +32 -7
- package/dist/esm/AbstractProjection.js.map +1 -1
- package/dist/esm/AggregateCommandHandler.js +22 -8
- package/dist/esm/AggregateCommandHandler.js.map +1 -1
- package/dist/esm/CqrsContainerBuilder.js +6 -1
- package/dist/esm/CqrsContainerBuilder.js.map +1 -1
- package/dist/esm/EventDispatchPipeline.js +12 -2
- package/dist/esm/EventDispatchPipeline.js.map +1 -1
- package/dist/esm/EventDispatcher.js +33 -4
- package/dist/esm/EventDispatcher.js.map +1 -1
- package/dist/esm/EventStore.js +7 -2
- package/dist/esm/EventStore.js.map +1 -1
- package/dist/esm/SagaEventHandler.js +42 -28
- package/dist/esm/SagaEventHandler.js.map +1 -1
- package/dist/esm/in-memory/InMemoryEventStorage.js +25 -10
- package/dist/esm/in-memory/InMemoryEventStorage.js.map +1 -1
- package/dist/esm/in-memory/InMemoryMessageBus.js +11 -5
- package/dist/esm/in-memory/InMemoryMessageBus.js.map +1 -1
- package/dist/esm/interfaces/IDispatchPipelineProcessor.js.map +1 -1
- package/dist/esm/interfaces/IMessageMeta.js +2 -0
- package/dist/esm/interfaces/IMessageMeta.js.map +1 -0
- package/dist/esm/interfaces/IObservable.js.map +1 -1
- package/dist/esm/interfaces/index.js +1 -0
- package/dist/esm/interfaces/index.js.map +1 -1
- package/dist/esm/mongodb/AbstractMongoAccessor.js +47 -0
- package/dist/esm/mongodb/AbstractMongoAccessor.js.map +1 -0
- package/dist/esm/mongodb/AbstractMongoObjectProjection.js +22 -0
- package/dist/esm/mongodb/AbstractMongoObjectProjection.js.map +1 -0
- package/dist/esm/mongodb/AbstractMongoView.js +53 -0
- package/dist/esm/mongodb/AbstractMongoView.js.map +1 -0
- package/dist/esm/mongodb/IContainer.js +2 -0
- package/dist/esm/mongodb/IContainer.js.map +1 -0
- package/dist/esm/mongodb/MongoEventLocker.js +100 -0
- package/dist/esm/mongodb/MongoEventLocker.js.map +1 -0
- package/dist/esm/mongodb/MongoEventStorage.js +196 -0
- package/dist/esm/mongodb/MongoEventStorage.js.map +1 -0
- package/dist/esm/mongodb/MongoObjectStorage.js +97 -0
- package/dist/esm/mongodb/MongoObjectStorage.js.map +1 -0
- package/dist/esm/mongodb/MongoObjectView.js +37 -0
- package/dist/esm/mongodb/MongoObjectView.js.map +1 -0
- package/dist/esm/mongodb/MongoProjectionDataParams.js +2 -0
- package/dist/esm/mongodb/MongoProjectionDataParams.js.map +1 -0
- package/dist/esm/mongodb/MongoViewLocker.js +132 -0
- package/dist/esm/mongodb/MongoViewLocker.js.map +1 -0
- package/dist/esm/mongodb/index.js +12 -0
- package/dist/esm/mongodb/index.js.map +1 -0
- package/dist/esm/mongodb/registerExitCleanup.js +24 -0
- package/dist/esm/mongodb/registerExitCleanup.js.map +1 -0
- package/dist/esm/mongodb/utils/getEventId.js +10 -0
- package/dist/esm/mongodb/utils/getEventId.js.map +1 -0
- package/dist/esm/mongodb/utils/index.js +2 -0
- package/dist/esm/mongodb/utils/index.js.map +1 -0
- package/dist/esm/rabbitmq/RabbitMqCommandBus.js +21 -8
- package/dist/esm/rabbitmq/RabbitMqCommandBus.js.map +1 -1
- package/dist/esm/rabbitmq/RabbitMqEventBus.js +2 -2
- package/dist/esm/rabbitmq/RabbitMqEventBus.js.map +1 -1
- package/dist/esm/rabbitmq/RabbitMqGateway.js +69 -44
- package/dist/esm/rabbitmq/RabbitMqGateway.js.map +1 -1
- package/dist/esm/redis/AbstractRedisAccessor.js +47 -0
- package/dist/esm/redis/AbstractRedisAccessor.js.map +1 -0
- package/dist/esm/redis/AbstractRedisProjection.js +22 -0
- package/dist/esm/redis/AbstractRedisProjection.js.map +1 -0
- package/dist/esm/redis/IContainer.js +2 -0
- package/dist/esm/redis/IContainer.js.map +1 -0
- package/dist/esm/redis/RedisEventLocker.js +92 -0
- package/dist/esm/redis/RedisEventLocker.js.map +1 -0
- package/dist/esm/redis/RedisObjectStorage.js +121 -0
- package/dist/esm/redis/RedisObjectStorage.js.map +1 -0
- package/dist/esm/redis/RedisProjectionDataParams.js +2 -0
- package/dist/esm/redis/RedisProjectionDataParams.js.map +1 -0
- package/dist/esm/redis/RedisView.js +77 -0
- package/dist/esm/redis/RedisView.js.map +1 -0
- package/dist/esm/redis/RedisViewLocker.js +107 -0
- package/dist/esm/redis/RedisViewLocker.js.map +1 -0
- package/dist/esm/redis/index.js +14 -0
- package/dist/esm/redis/index.js.map +1 -0
- package/dist/esm/redis/utils/getEventId.js +10 -0
- package/dist/esm/redis/utils/getEventId.js.map +1 -0
- package/dist/esm/redis/utils/index.js +2 -0
- package/dist/esm/redis/utils/index.js.map +1 -0
- package/dist/esm/sqlite/AbstractSqliteView.js.map +1 -1
- package/dist/esm/sqlite/SqliteEventStorage.js +211 -0
- package/dist/esm/sqlite/SqliteEventStorage.js.map +1 -0
- package/dist/esm/sqlite/SqliteObjectStorage.js +7 -7
- package/dist/esm/sqlite/SqliteObjectStorage.js.map +1 -1
- package/dist/esm/sqlite/SqliteObjectView.js.map +1 -1
- package/dist/esm/sqlite/index.js +1 -0
- package/dist/esm/sqlite/index.js.map +1 -1
- package/dist/esm/sqlite/utils/bufferToGuid.js +5 -0
- package/dist/esm/sqlite/utils/bufferToGuid.js.map +1 -0
- package/dist/esm/sqlite/utils/getEventId.js +2 -2
- package/dist/esm/sqlite/utils/getEventId.js.map +1 -1
- package/dist/esm/sqlite/utils/guid.js +1 -1
- package/dist/esm/sqlite/utils/guid.js.map +1 -1
- package/dist/esm/sqlite/utils/index.js +1 -0
- package/dist/esm/sqlite/utils/index.js.map +1 -1
- package/dist/esm/telemetry/index.js +4 -0
- package/dist/esm/telemetry/index.js.map +1 -0
- package/dist/esm/telemetry/recordSpanError.js +16 -0
- package/dist/esm/telemetry/recordSpanError.js.map +1 -0
- package/dist/esm/telemetry/spanAttributes.js +23 -0
- package/dist/esm/telemetry/spanAttributes.js.map +1 -0
- package/dist/esm/telemetry/spanContext.js +22 -0
- package/dist/esm/telemetry/spanContext.js.map +1 -0
- package/dist/esm/utils/MapAssertable.js +25 -1
- package/dist/esm/utils/MapAssertable.js.map +1 -1
- package/dist/types/AbstractProjection.d.ts +3 -1
- package/dist/types/AggregateCommandHandler.d.ts +3 -3
- package/dist/types/EventDispatchPipeline.d.ts +3 -1
- package/dist/types/EventDispatcher.d.ts +9 -1
- package/dist/types/EventStore.d.ts +4 -2
- package/dist/types/SagaEventHandler.d.ts +3 -3
- package/dist/types/in-memory/InMemoryEventStorage.d.ts +2 -1
- package/dist/types/in-memory/InMemoryMessageBus.d.ts +3 -3
- package/dist/types/interfaces/ICommandBus.d.ts +3 -2
- package/dist/types/interfaces/IContainer.d.ts +7 -0
- package/dist/types/interfaces/IDispatchPipelineProcessor.d.ts +2 -0
- package/dist/types/interfaces/IEventDispatcher.d.ts +3 -0
- package/dist/types/interfaces/IMessageMeta.d.ts +4 -0
- package/dist/types/interfaces/IObservable.d.ts +2 -1
- package/dist/types/interfaces/index.d.ts +1 -0
- package/dist/types/mongodb/AbstractMongoAccessor.d.ts +26 -0
- package/dist/types/mongodb/AbstractMongoObjectProjection.d.ts +8 -0
- package/dist/types/mongodb/AbstractMongoView.d.ts +25 -0
- package/dist/types/mongodb/IContainer.d.ts +11 -0
- package/dist/types/mongodb/MongoEventLocker.d.ts +47 -0
- package/dist/types/mongodb/MongoEventStorage.d.ts +27 -0
- package/dist/types/mongodb/MongoObjectStorage.d.ts +26 -0
- package/dist/types/mongodb/MongoObjectView.d.ts +16 -0
- package/dist/types/mongodb/MongoProjectionDataParams.d.ts +14 -0
- package/dist/types/mongodb/MongoViewLocker.d.ts +43 -0
- package/dist/types/mongodb/index.d.ts +11 -0
- package/dist/types/mongodb/registerExitCleanup.d.ts +10 -0
- package/dist/types/mongodb/utils/getEventId.d.ts +5 -0
- package/dist/types/mongodb/utils/index.d.ts +1 -0
- package/dist/types/rabbitmq/IContainer.d.ts +2 -2
- package/dist/types/rabbitmq/RabbitMqCommandBus.d.ts +5 -4
- package/dist/types/rabbitmq/RabbitMqEventBus.d.ts +2 -2
- package/dist/types/rabbitmq/RabbitMqGateway.d.ts +4 -4
- package/dist/types/redis/AbstractRedisAccessor.d.ts +26 -0
- package/dist/types/redis/AbstractRedisProjection.d.ts +8 -0
- package/dist/types/redis/IContainer.d.ts +7 -0
- package/dist/types/redis/RedisEventLocker.d.ts +36 -0
- package/dist/types/redis/RedisObjectStorage.d.ts +26 -0
- package/dist/types/redis/RedisProjectionDataParams.d.ts +21 -0
- package/dist/types/redis/RedisView.d.ts +33 -0
- package/dist/types/redis/RedisViewLocker.d.ts +35 -0
- package/dist/types/redis/index.d.ts +13 -0
- package/dist/types/redis/utils/getEventId.d.ts +5 -0
- package/dist/types/redis/utils/index.d.ts +1 -0
- package/dist/types/sqlite/AbstractSqliteView.d.ts +2 -2
- package/dist/types/sqlite/SqliteEventStorage.d.ts +18 -0
- package/dist/types/sqlite/SqliteObjectStorage.d.ts +7 -7
- package/dist/types/sqlite/SqliteObjectView.d.ts +7 -7
- package/dist/types/sqlite/index.d.ts +1 -0
- package/dist/types/sqlite/utils/bufferToGuid.d.ts +4 -0
- package/dist/types/sqlite/utils/getEventId.d.ts +1 -1
- package/dist/types/sqlite/utils/guid.d.ts +2 -1
- package/dist/types/sqlite/utils/index.d.ts +1 -0
- package/dist/types/telemetry/index.d.ts +3 -0
- package/dist/types/telemetry/recordSpanError.d.ts +6 -0
- package/dist/types/telemetry/spanAttributes.d.ts +14 -0
- package/dist/types/telemetry/spanContext.d.ts +12 -0
- package/dist/types/utils/MapAssertable.d.ts +8 -0
- package/package.json +43 -13
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InMemoryEventStorage.js","sourceRoot":"","sources":["../../../src/in-memory/InMemoryEventStorage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"InMemoryEventStorage.js","sourceRoot":"","sources":["../../../src/in-memory/InMemoryEventStorage.ts"],"names":[],"mappings":"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"}
|
|
@@ -50,10 +50,16 @@ export class InMemoryMessageBus {
|
|
|
50
50
|
throw new Error(`No ${messageType} subscribers found`);
|
|
51
51
|
this.handlers.get(messageType)?.delete(handler);
|
|
52
52
|
}
|
|
53
|
-
async send(commandOrType,
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
53
|
+
async send(commandOrType, aggregateIdOrMeta, options) {
|
|
54
|
+
let command;
|
|
55
|
+
let meta;
|
|
56
|
+
if (typeof commandOrType === 'string') {
|
|
57
|
+
command = { type: commandOrType, aggregateId: aggregateIdOrMeta, ...options };
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
command = commandOrType;
|
|
61
|
+
meta = aggregateIdOrMeta;
|
|
62
|
+
}
|
|
57
63
|
assertMessage(command, 'command');
|
|
58
64
|
const handlers = this.handlers.get(command.type);
|
|
59
65
|
if (!handlers || !handlers.size)
|
|
@@ -61,7 +67,7 @@ export class InMemoryMessageBus {
|
|
|
61
67
|
if (handlers.size > 1)
|
|
62
68
|
throw new Error(`More than one '${command.type}' subscriber found`);
|
|
63
69
|
const commandHandler = handlers.values().next().value;
|
|
64
|
-
return commandHandler(command);
|
|
70
|
+
return commandHandler(command, meta);
|
|
65
71
|
}
|
|
66
72
|
/** @deprecated Use {@link send} */
|
|
67
73
|
sendRaw(command) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InMemoryMessageBus.js","sourceRoot":"","sources":["../../../src/in-memory/InMemoryMessageBus.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"InMemoryMessageBus.js","sourceRoot":"","sources":["../../../src/in-memory/InMemoryMessageBus.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IDispatchPipelineProcessor.js","sourceRoot":"","sources":["../../../src/interfaces/IDispatchPipelineProcessor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"IDispatchPipelineProcessor.js","sourceRoot":"","sources":["../../../src/interfaces/IDispatchPipelineProcessor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAqCzC,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,GAAY,EAAqC,EAAE,CAC9F,QAAQ,CAAC,GAAG,CAAC;OACV,SAAS,IAAI,GAAG;OAChB,OAAQ,GAAkC,CAAC,OAAO,KAAK,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IMessageMeta.js","sourceRoot":"","sources":["../../../src/interfaces/IMessageMeta.ts"],"names":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IObservable.js","sourceRoot":"","sources":["../../../src/interfaces/IObservable.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"IObservable.js","sourceRoot":"","sources":["../../../src/interfaces/IObservable.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAmBzC,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAY,EAAsB,EAAE,CAChE,QAAQ,CAAC,GAAG,CAAC;OACV,IAAI,IAAI,GAAG;OACX,OAAO,GAAG,CAAC,EAAE,KAAK,UAAU;OAC5B,KAAK,IAAI,GAAG;OACZ,OAAO,GAAG,CAAC,GAAG,KAAK,UAAU,CAAC"}
|
|
@@ -18,6 +18,7 @@ export * from "./IIdentifierProvider.js";
|
|
|
18
18
|
export * from "./ILocker.js";
|
|
19
19
|
export * from "./ILogger.js";
|
|
20
20
|
export * from "./IMessage.js";
|
|
21
|
+
export * from "./IMessageMeta.js";
|
|
21
22
|
export * from "./IMutableState.js";
|
|
22
23
|
export * from "./IObjectStorage.js";
|
|
23
24
|
export * from "./IObservable.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/interfaces/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iCAAiC,CAAC;AAChD,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/interfaces/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iCAAiC,CAAC;AAChD,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Lock } from "../utils/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Abstract base class for accessing a MongoDB database.
|
|
4
|
+
*
|
|
5
|
+
* Manages the database connection lifecycle, ensuring initialization via `assertConnection`.
|
|
6
|
+
* Supports providing a Db instance directly or a factory function for lazy initialization.
|
|
7
|
+
*
|
|
8
|
+
* Subclasses must implement the `initialize` method for specific setup tasks
|
|
9
|
+
* (e.g. creating collections or indexes).
|
|
10
|
+
*/
|
|
11
|
+
export class AbstractMongoAccessor {
|
|
12
|
+
db;
|
|
13
|
+
#dbFactory;
|
|
14
|
+
#initLocker = new Lock();
|
|
15
|
+
#initialized = false;
|
|
16
|
+
constructor(c) {
|
|
17
|
+
if (!c.viewModelMongoDb && !c.viewModelMongoDbFactory)
|
|
18
|
+
throw new TypeError('either viewModelMongoDb or viewModelMongoDbFactory argument required');
|
|
19
|
+
this.db = c.viewModelMongoDb;
|
|
20
|
+
this.#dbFactory = c.viewModelMongoDbFactory;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Ensures that the MongoDB connection is initialized.
|
|
24
|
+
* Uses a lock to prevent race conditions during concurrent initialization attempts.
|
|
25
|
+
* If the database is not already set, it creates one using the provided factory
|
|
26
|
+
* and then calls the `initialize` method.
|
|
27
|
+
*
|
|
28
|
+
* This method is idempotent and safe to call multiple times.
|
|
29
|
+
*/
|
|
30
|
+
async assertConnection() {
|
|
31
|
+
if (this.#initialized)
|
|
32
|
+
return;
|
|
33
|
+
try {
|
|
34
|
+
await this.#initLocker.acquire();
|
|
35
|
+
if (this.#initialized)
|
|
36
|
+
return;
|
|
37
|
+
if (!this.db)
|
|
38
|
+
this.db = await this.#dbFactory();
|
|
39
|
+
await this.initialize(this.db);
|
|
40
|
+
this.#initialized = true;
|
|
41
|
+
}
|
|
42
|
+
finally {
|
|
43
|
+
this.#initLocker.release();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=AbstractMongoAccessor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AbstractMongoAccessor.js","sourceRoot":"","sources":["../../../src/mongodb/AbstractMongoAccessor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC;;;;;;;;GAQG;AACH,MAAM,OAAgB,qBAAqB;IAEhC,EAAE,CAAiB;IACpB,UAAU,CAAuC;IACjD,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;IAClC,YAAY,GAAG,KAAK,CAAC;IAErB,YAAY,CAA4E;QACvF,IAAI,CAAC,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC,CAAC,uBAAuB;YACpD,MAAM,IAAI,SAAS,CAAC,sEAAsE,CAAC,CAAC;QAE7F,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,gBAAgB,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,uBAAuB,CAAC;IAC7C,CAAC;IAID;;;;;;;OAOG;IACH,KAAK,CAAC,gBAAgB;QACrB,IAAI,IAAI,CAAC,YAAY;YACpB,OAAO;QAER,IAAI,CAAC;YACJ,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YACjC,IAAI,IAAI,CAAC,YAAY;gBACpB,OAAO;YAER,IAAI,CAAC,IAAI,CAAC,EAAE;gBACX,IAAI,CAAC,EAAE,GAAG,MAAM,IAAI,CAAC,UAAW,EAAE,CAAC;YAEpC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAE/B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC1B,CAAC;gBACO,CAAC;YACR,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QAC5B,CAAC;IACF,CAAC;CACD"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { AbstractProjection } from "../AbstractProjection.js";
|
|
2
|
+
import { MongoObjectView } from "./MongoObjectView.js";
|
|
3
|
+
export class AbstractMongoObjectProjection extends AbstractProjection {
|
|
4
|
+
static get tableName() {
|
|
5
|
+
throw new Error('tableName is not defined');
|
|
6
|
+
}
|
|
7
|
+
static get schemaVersion() {
|
|
8
|
+
throw new Error('schemaVersion is not defined');
|
|
9
|
+
}
|
|
10
|
+
constructor({ viewModelMongoDb, viewModelMongoDbFactory, logger }) {
|
|
11
|
+
super({ logger });
|
|
12
|
+
this.view = new MongoObjectView({
|
|
13
|
+
schemaVersion: new.target.schemaVersion,
|
|
14
|
+
projectionName: new.target.name,
|
|
15
|
+
viewModelMongoDb,
|
|
16
|
+
viewModelMongoDbFactory,
|
|
17
|
+
tableNamePrefix: new.target.tableName,
|
|
18
|
+
logger
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=AbstractMongoObjectProjection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AbstractMongoObjectProjection.js","sourceRoot":"","sources":["../../../src/mongodb/AbstractMongoObjectProjection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,OAAgB,6BAAiC,SAAQ,kBAAsC;IAEpG,MAAM,KAAK,SAAS;QACnB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,KAAK,aAAa;QACvB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACjD,CAAC;IAED,YAAY,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,EACsB;QAEpF,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAElB,IAAI,CAAC,IAAI,GAAG,IAAI,eAAe,CAAC;YAC/B,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,aAAa;YACvC,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI;YAC/B,gBAAgB;YAChB,uBAAuB;YACvB,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS;YACrC,MAAM;SACN,CAAC,CAAC;IACJ,CAAC;CACD"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { MongoViewLocker } from "./MongoViewLocker.js";
|
|
2
|
+
import { MongoEventLocker } from "./MongoEventLocker.js";
|
|
3
|
+
import { AbstractMongoAccessor } from "./AbstractMongoAccessor.js";
|
|
4
|
+
import { assertString } from "../utils/assert.js";
|
|
5
|
+
/**
|
|
6
|
+
* Base class for MongoDB-backed projection views with restore locking and last-processed-event tracking
|
|
7
|
+
*/
|
|
8
|
+
export class AbstractMongoView extends AbstractMongoAccessor {
|
|
9
|
+
schemaVersion;
|
|
10
|
+
viewLocker;
|
|
11
|
+
eventLocker;
|
|
12
|
+
logger;
|
|
13
|
+
get ready() {
|
|
14
|
+
return this.viewLocker.ready;
|
|
15
|
+
}
|
|
16
|
+
constructor(options) {
|
|
17
|
+
assertString(options.projectionName, 'projectionName');
|
|
18
|
+
assertString(options.schemaVersion, 'schemaVersion');
|
|
19
|
+
super(options);
|
|
20
|
+
this.schemaVersion = options.schemaVersion;
|
|
21
|
+
this.viewLocker = new MongoViewLocker(options);
|
|
22
|
+
this.eventLocker = new MongoEventLocker(options);
|
|
23
|
+
this.logger = options.logger && 'child' in options.logger ?
|
|
24
|
+
options.logger.child({ serviceName: new.target.name }) :
|
|
25
|
+
options.logger;
|
|
26
|
+
}
|
|
27
|
+
// eslint-disable-next-line class-methods-use-this
|
|
28
|
+
initialize(_db) {
|
|
29
|
+
// Lockers initialize themselves on first use
|
|
30
|
+
}
|
|
31
|
+
async lock() {
|
|
32
|
+
return this.viewLocker.lock();
|
|
33
|
+
}
|
|
34
|
+
async unlock() {
|
|
35
|
+
await this.viewLocker.unlock();
|
|
36
|
+
}
|
|
37
|
+
once(event) {
|
|
38
|
+
return this.viewLocker.once(event);
|
|
39
|
+
}
|
|
40
|
+
getLastEvent() {
|
|
41
|
+
return this.eventLocker.getLastEvent();
|
|
42
|
+
}
|
|
43
|
+
tryMarkAsProjecting(event) {
|
|
44
|
+
return this.eventLocker.tryMarkAsProjecting(event);
|
|
45
|
+
}
|
|
46
|
+
markAsProjected(event) {
|
|
47
|
+
return this.eventLocker.markAsProjected(event);
|
|
48
|
+
}
|
|
49
|
+
markAsLastEvent(event) {
|
|
50
|
+
return this.eventLocker.markAsLastEvent(event);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=AbstractMongoView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AbstractMongoView.js","sourceRoot":"","sources":["../../../src/mongodb/AbstractMongoView.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAA8B,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAA+B,MAAM,uBAAuB,CAAC;AACtF,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD;;GAEG;AACH,MAAM,OAAgB,iBAAkB,SAAQ,qBAAqB;IAEjD,aAAa,CAAS;IACtB,UAAU,CAAkB;IAC5B,WAAW,CAAmB;IACvC,MAAM,CAAsB;IAEtC,IAAI,KAAK;QACR,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;IAC9B,CAAC;IAED,YAAY,OAEY;QACvB,YAAY,CAAC,OAAO,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;QACvD,YAAY,CAAC,OAAO,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;QAErD,KAAK,CAAC,OAAO,CAAC,CAAC;QAEf,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAC3C,IAAI,CAAC,UAAU,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,CAAC,WAAW,GAAG,IAAI,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;YAC1D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACxD,OAAO,CAAC,MAAM,CAAC;IACjB,CAAC;IAED,kDAAkD;IACxC,UAAU,CAAC,GAAO;QAC3B,6CAA6C;IAC9C,CAAC;IAED,KAAK,CAAC,IAAI;QACT,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,MAAM;QACX,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;IAChC,CAAC;IAED,IAAI,CAAC,KAAc;QAClB,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,YAAY;QACX,OAAO,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC;IACxC,CAAC;IAED,mBAAmB,CAAC,KAAa;QAChC,OAAO,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACpD,CAAC;IAED,eAAe,CAAC,KAAa;QAC5B,OAAO,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;IAED,eAAe,CAAC,KAAa;QAC5B,OAAO,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;CACD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IContainer.js","sourceRoot":"","sources":["../../../src/mongodb/IContainer.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { assertNonNegativeInteger, assertString } from "../utils/assert.js";
|
|
2
|
+
import { AbstractMongoAccessor } from "./AbstractMongoAccessor.js";
|
|
3
|
+
import { getEventId } from "./utils/index.js";
|
|
4
|
+
/**
|
|
5
|
+
* MongoDB-backed implementation of IEventLocker.
|
|
6
|
+
*
|
|
7
|
+
* Uses two collections:
|
|
8
|
+
* - `ncqrs_event_locks`: tracks per-event processing state
|
|
9
|
+
* - `ncqrs_view_locks`: stores the last processed event per projection
|
|
10
|
+
*
|
|
11
|
+
* Event lock state machine: nil → processing → processed
|
|
12
|
+
*/
|
|
13
|
+
export class MongoEventLocker extends AbstractMongoAccessor {
|
|
14
|
+
static DEFAULT_EVENT_LOCK_TTL = 15_000;
|
|
15
|
+
static DEFAULT_EVENT_LOCKS_COLLECTION = 'ncqrs_event_locks';
|
|
16
|
+
static DEFAULT_VIEW_LOCKS_COLLECTION = 'ncqrs_view_locks';
|
|
17
|
+
#lockIdPrefix;
|
|
18
|
+
#viewLockId;
|
|
19
|
+
#eventLockTtl;
|
|
20
|
+
#eventLocksCollectionName;
|
|
21
|
+
#viewLocksCollectionName;
|
|
22
|
+
#eventLocksCollection;
|
|
23
|
+
#viewLocksCollection;
|
|
24
|
+
constructor(o) {
|
|
25
|
+
super(o);
|
|
26
|
+
assertString(o.projectionName, 'projectionName');
|
|
27
|
+
assertString(o.schemaVersion, 'schemaVersion');
|
|
28
|
+
if (o.eventLockTtl !== undefined)
|
|
29
|
+
assertNonNegativeInteger(o.eventLockTtl, 'eventLockTtl');
|
|
30
|
+
if (o.eventLocksCollection !== undefined)
|
|
31
|
+
assertString(o.eventLocksCollection, 'eventLocksCollection');
|
|
32
|
+
if (o.viewLocksCollection !== undefined)
|
|
33
|
+
assertString(o.viewLocksCollection, 'viewLocksCollection');
|
|
34
|
+
this.#eventLocksCollectionName = o.eventLocksCollection ?? MongoEventLocker.DEFAULT_EVENT_LOCKS_COLLECTION;
|
|
35
|
+
this.#viewLocksCollectionName = o.viewLocksCollection ?? MongoEventLocker.DEFAULT_VIEW_LOCKS_COLLECTION;
|
|
36
|
+
this.#lockIdPrefix = `${o.projectionName}:${o.schemaVersion}`;
|
|
37
|
+
this.#viewLockId = `${o.projectionName}:${o.schemaVersion}`;
|
|
38
|
+
this.#eventLockTtl = o.eventLockTtl ?? MongoEventLocker.DEFAULT_EVENT_LOCK_TTL;
|
|
39
|
+
}
|
|
40
|
+
async initialize(db) {
|
|
41
|
+
this.#eventLocksCollection = db.collection(this.#eventLocksCollectionName);
|
|
42
|
+
this.#viewLocksCollection = db.collection(this.#viewLocksCollectionName);
|
|
43
|
+
await this.#eventLocksCollection.createIndex({ processingAt: 1 }, { sparse: true });
|
|
44
|
+
}
|
|
45
|
+
#eventLockId(eventId) {
|
|
46
|
+
return `${this.#lockIdPrefix}:${eventId}`;
|
|
47
|
+
}
|
|
48
|
+
async tryMarkAsProjecting(event) {
|
|
49
|
+
await this.assertConnection();
|
|
50
|
+
const eventId = getEventId(event);
|
|
51
|
+
const lockId = this.#eventLockId(eventId);
|
|
52
|
+
const now = new Date();
|
|
53
|
+
const lockExpiry = new Date(now.getTime() - this.#eventLockTtl);
|
|
54
|
+
// Claim an expired lock if one exists
|
|
55
|
+
const updateResult = await this.#eventLocksCollection.updateOne({
|
|
56
|
+
_id: lockId,
|
|
57
|
+
processedAt: null,
|
|
58
|
+
$or: [
|
|
59
|
+
{ processingAt: null },
|
|
60
|
+
{ processingAt: { $exists: false } },
|
|
61
|
+
{ processingAt: { $lt: lockExpiry } }
|
|
62
|
+
]
|
|
63
|
+
}, { $set: { processingAt: now, processedAt: null } });
|
|
64
|
+
if (updateResult.modifiedCount === 1)
|
|
65
|
+
return true;
|
|
66
|
+
// No existing document matched — try to insert a fresh lock
|
|
67
|
+
try {
|
|
68
|
+
await this.#eventLocksCollection.insertOne({ _id: lockId, processingAt: now, processedAt: null });
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
if (typeof err === 'object' && err !== null && 'code' in err && err.code === 11000)
|
|
73
|
+
return false; // Document exists and is actively locked
|
|
74
|
+
throw err;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async markAsProjected(event) {
|
|
78
|
+
await this.assertConnection();
|
|
79
|
+
const eventId = getEventId(event);
|
|
80
|
+
const lockId = this.#eventLockId(eventId);
|
|
81
|
+
const result = await this.#eventLocksCollection.findOneAndUpdate({ _id: lockId, processedAt: null }, { $set: { processedAt: new Date() } });
|
|
82
|
+
if (!result)
|
|
83
|
+
throw new Error(`Event ${event.id} could not be marked as processed`);
|
|
84
|
+
}
|
|
85
|
+
async markAsLastEvent(event) {
|
|
86
|
+
await this.assertConnection();
|
|
87
|
+
await this.#viewLocksCollection.updateOne({ _id: this.#viewLockId }, {
|
|
88
|
+
$set: { lastEvent: JSON.stringify(event) },
|
|
89
|
+
$setOnInsert: { _id: this.#viewLockId }
|
|
90
|
+
}, { upsert: true });
|
|
91
|
+
}
|
|
92
|
+
async getLastEvent() {
|
|
93
|
+
await this.assertConnection();
|
|
94
|
+
const doc = await this.#viewLocksCollection.findOne({ _id: this.#viewLockId });
|
|
95
|
+
if (!doc?.lastEvent)
|
|
96
|
+
return undefined;
|
|
97
|
+
return JSON.parse(doc.lastEvent);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=MongoEventLocker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MongoEventLocker.js","sourceRoot":"","sources":["../../../src/mongodb/MongoEventLocker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { ObjectId } from 'mongodb';
|
|
2
|
+
import { parseSagaId } from "../utils/index.js";
|
|
3
|
+
import { ConcurrencyError } from "../errors/index.js";
|
|
4
|
+
import { assertFunction, assertString } from "../utils/assert.js";
|
|
5
|
+
import { registerExitCleanup } from "./registerExitCleanup.js";
|
|
6
|
+
function toObjectId(id) {
|
|
7
|
+
return new ObjectId(String(id));
|
|
8
|
+
}
|
|
9
|
+
function isHexObjectId(value) {
|
|
10
|
+
return typeof value === 'string' && value.length === 24 && /^[0-9a-f]{24}$/i.test(value);
|
|
11
|
+
}
|
|
12
|
+
function toObjectIdOrString(aggregateId) {
|
|
13
|
+
if (isHexObjectId(aggregateId))
|
|
14
|
+
return toObjectId(aggregateId);
|
|
15
|
+
return String(aggregateId);
|
|
16
|
+
}
|
|
17
|
+
function toEvent(doc) {
|
|
18
|
+
const { _id, aggregateId, ...rest } = doc;
|
|
19
|
+
return {
|
|
20
|
+
...rest,
|
|
21
|
+
id: _id.toHexString(),
|
|
22
|
+
...aggregateId && {
|
|
23
|
+
aggregateId: aggregateId instanceof ObjectId ? aggregateId.toHexString() : aggregateId
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function toEventDocument(event) {
|
|
28
|
+
const { id, aggregateId, ...rest } = event;
|
|
29
|
+
return {
|
|
30
|
+
...rest,
|
|
31
|
+
_id: id !== undefined ? toObjectId(id) : new ObjectId(),
|
|
32
|
+
...aggregateId && {
|
|
33
|
+
aggregateId: toObjectIdOrString(aggregateId)
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* MongoDB-backed event storage for node-cqrs.
|
|
39
|
+
* Implements IEventStorageReader, IIdentifierProvider, and IDispatchPipelineProcessor.
|
|
40
|
+
*/
|
|
41
|
+
export class MongoEventStorage {
|
|
42
|
+
static EVENTS_COLLECTION = 'events';
|
|
43
|
+
#initPromise;
|
|
44
|
+
constructor({ mongoDbFactory, mongoEventStorageConfig, process }) {
|
|
45
|
+
assertFunction(mongoDbFactory, 'mongoDbFactory');
|
|
46
|
+
const collectionName = mongoEventStorageConfig?.collection ?? MongoEventStorage.EVENTS_COLLECTION;
|
|
47
|
+
assertString(collectionName, 'mongoEventStorageConfig.collection');
|
|
48
|
+
this.#initPromise = MongoEventStorage.#init(mongoDbFactory, collectionName);
|
|
49
|
+
if (process) {
|
|
50
|
+
registerExitCleanup(process, async () => {
|
|
51
|
+
const { db } = await this.#initPromise;
|
|
52
|
+
await db.client.close();
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
static async #init(factory, collectionName) {
|
|
57
|
+
const db = await factory();
|
|
58
|
+
const collection = db.collection(collectionName);
|
|
59
|
+
await Promise.all([
|
|
60
|
+
collection.createIndex({ aggregateId: 1, aggregateVersion: 1 }, { unique: true, sparse: true }),
|
|
61
|
+
collection.createIndex({ 'sagaOrigins.$**': 1 }),
|
|
62
|
+
collection.createIndex({ type: 1, _id: 1 })
|
|
63
|
+
]);
|
|
64
|
+
return { db, collection };
|
|
65
|
+
}
|
|
66
|
+
// eslint-disable-next-line class-methods-use-this
|
|
67
|
+
getNewId() {
|
|
68
|
+
return new ObjectId().toHexString();
|
|
69
|
+
}
|
|
70
|
+
async commitEvents(events, options) {
|
|
71
|
+
if (options?.ignoreConcurrencyError)
|
|
72
|
+
throw new Error('ignoreConcurrencyError is not supported by MongoEventStorage');
|
|
73
|
+
const { collection } = await this.#initPromise;
|
|
74
|
+
const docs = events.map(toEventDocument);
|
|
75
|
+
const insertedIds = [];
|
|
76
|
+
try {
|
|
77
|
+
for (const doc of docs) {
|
|
78
|
+
await collection.insertOne(doc);
|
|
79
|
+
insertedIds.push(doc._id);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
if (insertedIds.length)
|
|
84
|
+
await collection.deleteMany({ _id: { $in: insertedIds } });
|
|
85
|
+
if (typeof err === 'object' && err !== null && 'code' in err && err.code === 11000)
|
|
86
|
+
throw new ConcurrencyError('Concurrency conflict: duplicate event version');
|
|
87
|
+
throw err;
|
|
88
|
+
}
|
|
89
|
+
docs.forEach((doc, i) => {
|
|
90
|
+
events[i].id = doc._id.toHexString();
|
|
91
|
+
});
|
|
92
|
+
return events;
|
|
93
|
+
}
|
|
94
|
+
async *getAggregateEvents(aggregateId, options) {
|
|
95
|
+
const { collection } = await this.#initPromise;
|
|
96
|
+
const filter = {
|
|
97
|
+
aggregateId: toObjectIdOrString(aggregateId)
|
|
98
|
+
};
|
|
99
|
+
const snapshotVersion = options?.snapshot?.aggregateVersion;
|
|
100
|
+
if (snapshotVersion !== undefined)
|
|
101
|
+
filter.aggregateVersion = { $gt: snapshotVersion };
|
|
102
|
+
const hasTypeFilter = options?.eventTypes !== undefined && options.eventTypes.length > 0;
|
|
103
|
+
if (hasTypeFilter)
|
|
104
|
+
filter.type = { $in: options.eventTypes };
|
|
105
|
+
const cursor = collection.find(filter, {
|
|
106
|
+
sort: { aggregateVersion: 1 }
|
|
107
|
+
});
|
|
108
|
+
let lastDoc;
|
|
109
|
+
for await (const doc of cursor) {
|
|
110
|
+
lastDoc = doc;
|
|
111
|
+
yield toEvent(doc);
|
|
112
|
+
}
|
|
113
|
+
if (options?.tail === 'last' && hasTypeFilter) {
|
|
114
|
+
const tailFilter = {
|
|
115
|
+
aggregateId: toObjectIdOrString(aggregateId),
|
|
116
|
+
...snapshotVersion && {
|
|
117
|
+
aggregateVersion: { $gt: snapshotVersion }
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
const tailDoc = await collection.findOne(tailFilter, {
|
|
121
|
+
sort: { aggregateVersion: -1 }
|
|
122
|
+
});
|
|
123
|
+
if (tailDoc && (!lastDoc || tailDoc._id.toHexString() !== lastDoc._id.toHexString()))
|
|
124
|
+
yield toEvent(tailDoc);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
async *getSagaEvents(sagaId, { beforeEvent }) {
|
|
128
|
+
if (typeof beforeEvent?.id !== 'string' || !beforeEvent.id.length)
|
|
129
|
+
throw new TypeError('beforeEvent.id must be a non-empty String');
|
|
130
|
+
const { sagaDescriptor, originEventId } = parseSagaId(sagaId);
|
|
131
|
+
if (beforeEvent.sagaOrigins?.[sagaDescriptor] !== originEventId)
|
|
132
|
+
throw new TypeError('beforeEvent.sagaOrigins does not match sagaId');
|
|
133
|
+
const { collection } = await this.#initPromise;
|
|
134
|
+
const originObjectId = toObjectId(originEventId);
|
|
135
|
+
const beforeObjectId = toObjectId(beforeEvent.id);
|
|
136
|
+
const [originDoc, beforeDoc] = await Promise.all([
|
|
137
|
+
collection.findOne({ _id: originObjectId }),
|
|
138
|
+
collection.findOne({ _id: beforeObjectId })
|
|
139
|
+
]);
|
|
140
|
+
if (!originDoc)
|
|
141
|
+
throw new Error(`origin event ${originEventId} not found`);
|
|
142
|
+
if (!beforeDoc)
|
|
143
|
+
throw new Error(`beforeEvent ${beforeEvent.id} not found`);
|
|
144
|
+
const filter = {
|
|
145
|
+
$or: [
|
|
146
|
+
{ _id: originObjectId },
|
|
147
|
+
{
|
|
148
|
+
[`sagaOrigins.${sagaDescriptor}`]: originEventId,
|
|
149
|
+
_id: {
|
|
150
|
+
$gt: originObjectId,
|
|
151
|
+
$lt: beforeObjectId
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
]
|
|
155
|
+
};
|
|
156
|
+
const cursor = collection.find(filter, {
|
|
157
|
+
sort: { _id: 1 }
|
|
158
|
+
});
|
|
159
|
+
for await (const doc of cursor)
|
|
160
|
+
yield toEvent(doc);
|
|
161
|
+
}
|
|
162
|
+
async *getEventsByTypes(eventTypes, options) {
|
|
163
|
+
if (options?.afterEvent !== undefined && (typeof options.afterEvent.id !== 'string' || !options.afterEvent.id.length))
|
|
164
|
+
throw new TypeError('options.afterEvent.id must be a non-empty String');
|
|
165
|
+
const { collection } = await this.#initPromise;
|
|
166
|
+
const filter = {
|
|
167
|
+
type: { $in: eventTypes }
|
|
168
|
+
};
|
|
169
|
+
if (options?.afterEvent?.id)
|
|
170
|
+
filter._id = { $gt: toObjectId(options.afterEvent.id) };
|
|
171
|
+
const cursor = collection.find(filter, {
|
|
172
|
+
sort: { _id: 1 }
|
|
173
|
+
});
|
|
174
|
+
for await (const doc of cursor)
|
|
175
|
+
yield toEvent(doc);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Processes a batch of dispatch pipeline items, commits the events to MongoDB,
|
|
179
|
+
* and returns the original batch.
|
|
180
|
+
*
|
|
181
|
+
* This method is part of the `IDispatchPipelineProcessor` interface.
|
|
182
|
+
*/
|
|
183
|
+
async process(batch) {
|
|
184
|
+
const events = [];
|
|
185
|
+
for (const { event } of batch) {
|
|
186
|
+
if (!event)
|
|
187
|
+
throw new Error('Event batch does not contain `event`');
|
|
188
|
+
events.push(event);
|
|
189
|
+
}
|
|
190
|
+
await this.commitEvents(events, {
|
|
191
|
+
ignoreConcurrencyError: batch[0]?.ignoreConcurrencyError
|
|
192
|
+
});
|
|
193
|
+
return batch;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=MongoEventStorage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MongoEventStorage.js","sourceRoot":"","sources":["../../../src/mongodb/MongoEventStorage.ts"],"names":[],"mappings":"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"}
|