@rkrkdldkd/example-event-sourcing 0.1.5 → 0.1.7
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/dist/app.module.js +2 -1
- package/dist/app.module.js.map +1 -1
- package/dist/common/constants.d.ts +1 -0
- package/dist/common/constants.js +2 -1
- package/dist/common/constants.js.map +1 -1
- package/dist/decorator/aggregate-event-repository.decorator.d.ts +3 -1
- package/dist/decorator/aggregate-event-repository.decorator.js +6 -4
- package/dist/decorator/aggregate-event-repository.decorator.js.map +1 -1
- package/dist/decorator/event.decorator.js +9 -4
- package/dist/decorator/event.decorator.js.map +1 -1
- package/dist/helper/metadata/get-aggregate-event-repository-metadata.d.ts +4 -0
- package/dist/helper/metadata/get-aggregate-event-repository-metadata.js +10 -0
- package/dist/helper/metadata/get-aggregate-event-repository-metadata.js.map +1 -0
- package/dist/helper/metadata/index.d.ts +1 -0
- package/dist/helper/metadata/index.js +1 -0
- package/dist/helper/metadata/index.js.map +1 -1
- package/dist/interface/aggregate/aggregate-event-repository-metadata.interface.d.ts +5 -0
- package/dist/interface/aggregate/aggregate-event-repository-metadata.interface.js +3 -0
- package/dist/interface/aggregate/aggregate-event-repository-metadata.interface.js.map +1 -0
- package/dist/interface/aggregate/index.d.ts +1 -0
- package/dist/interface/aggregate/index.js +1 -0
- package/dist/interface/aggregate/index.js.map +1 -1
- package/dist/interface/event/event-filter.interface.d.ts +6 -0
- package/dist/interface/{postgres-event-store-config.js → event/event-filter.interface.js} +1 -1
- package/dist/interface/event/event-filter.interface.js.map +1 -0
- package/dist/interface/event/index.d.ts +1 -0
- package/dist/interface/event/index.js +1 -0
- package/dist/interface/event/index.js.map +1 -1
- package/dist/interface/index.d.ts +0 -2
- package/dist/interface/index.js +0 -2
- package/dist/interface/index.js.map +1 -1
- package/dist/main.js +5 -0
- package/dist/main.js.map +1 -1
- package/dist/model/db/db.connection.d.ts +2 -1
- package/dist/model/db/db.connection.js +20 -0
- package/dist/model/db/db.connection.js.map +1 -1
- package/dist/model/db/event-sourcing.repository.d.ts +7 -2
- package/dist/model/db/event-sourcing.repository.js +74 -1
- package/dist/model/db/event-sourcing.repository.js.map +1 -1
- package/dist/model/db/event-store.entity.d.ts +16 -0
- package/dist/model/db/event-store.entity.js +34 -0
- package/dist/model/db/event-store.entity.js.map +1 -0
- package/dist/model/db/event-store.repository.d.ts +7 -0
- package/dist/model/db/event-store.repository.js +44 -0
- package/dist/model/db/event-store.repository.js.map +1 -1
- package/dist/model/db/event.registry.d.ts +7 -0
- package/dist/model/db/event.registry.js +14 -0
- package/dist/model/db/event.registry.js.map +1 -0
- package/dist/model/db/index.d.ts +3 -0
- package/dist/model/db/index.js +3 -0
- package/dist/model/db/index.js.map +1 -1
- package/dist/model/db/raw-event-store.interface.d.ts +14 -0
- package/dist/{interface/postgres-snapshot-store-config.js → model/db/raw-event-store.interface.js} +1 -1
- package/dist/model/db/raw-event-store.interface.js.map +1 -0
- package/dist/model/db/snapshot.entity.d.ts +2 -0
- package/dist/model/db/snapshot.entity.js +5 -0
- package/dist/model/db/snapshot.entity.js.map +1 -1
- package/dist/model/db/snapshot.repository.js +4 -2
- package/dist/model/db/snapshot.repository.js.map +1 -1
- package/dist/temp.event-store.d.ts +6 -13
- package/dist/temp.event-store.js +22 -33
- package/dist/temp.event-store.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +3 -1
- package/dist/interface/postgres-event-store-config.d.ts +0 -6
- package/dist/interface/postgres-event-store-config.js.map +0 -1
- package/dist/interface/postgres-snapshot-store-config.d.ts +0 -7
- package/dist/interface/postgres-snapshot-store-config.js.map +0 -1
package/dist/app.module.js
CHANGED
|
@@ -11,6 +11,7 @@ const common_1 = require("@nestjs/common");
|
|
|
11
11
|
const event_sourcing_module_1 = require("./event-sourcing.module");
|
|
12
12
|
const app_controller_1 = require("./app.controller");
|
|
13
13
|
const app_service_1 = require("./app.service");
|
|
14
|
+
const temp_event_store_1 = require("./temp.event-store");
|
|
14
15
|
let AppModule = class AppModule {
|
|
15
16
|
};
|
|
16
17
|
exports.AppModule = AppModule;
|
|
@@ -26,7 +27,7 @@ exports.AppModule = AppModule = __decorate([
|
|
|
26
27
|
}),
|
|
27
28
|
],
|
|
28
29
|
controllers: [app_controller_1.AppController],
|
|
29
|
-
providers: [app_service_1.AppService],
|
|
30
|
+
providers: [app_service_1.AppService, temp_event_store_1.AA],
|
|
30
31
|
})
|
|
31
32
|
], AppModule);
|
|
32
33
|
//# sourceMappingURL=app.module.js.map
|
package/dist/app.module.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.module.js","sourceRoot":"","sources":["../src/app.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,mEAAgE;AAChE,qDAAiD;AACjD,+CAA2C;
|
|
1
|
+
{"version":3,"file":"app.module.js","sourceRoot":"","sources":["../src/app.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,mEAAgE;AAChE,qDAAiD;AACjD,+CAA2C;AAC3C,yDAAwC;AAejC,IAAM,SAAS,GAAf,MAAM,SAAS;CAAG,CAAA;AAAZ,8BAAS;oBAAT,SAAS;IAbrB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,2CAAmB,CAAC,YAAY,CAAC;gBAC/B,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,IAAI;gBACV,IAAI,EAAE,UAAU;gBAChB,QAAQ,EAAE,UAAU;gBACpB,QAAQ,EAAE,UAAU;aACrB,CAAC;SACH;QACD,WAAW,EAAE,CAAC,8BAAa,CAAC;QAC5B,SAAS,EAAE,CAAC,wBAAU,EAAE,qBAAE,CAAC;KAC5B,CAAC;GACW,SAAS,CAAG"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export declare const EVENT_SOURCING_OPTIONS: unique symbol;
|
|
2
|
+
export declare const DEFAULT_BATCH_SIZE = 100;
|
|
2
3
|
export declare const AGGREGATE_METADATA = "AGGREGATE_METADATA";
|
|
3
4
|
export declare const COMMAND_HANDLER_METADATA = "COMMAND_HANDLER_METADATA";
|
|
4
5
|
export declare const COMMAND_METADATA = "COMMAND_METADATA";
|
package/dist/common/constants.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.AGGREGATE_EVENT_REPOSITORY_METADATA = exports.SNAPSHOT_METADATA = exports.QUERY_METADATA = exports.QUERY_HANDLER_METADATA = exports.EVENT_SUBSCRIBER_METADATA = exports.EVENT_SERIALIZER_METADATA = exports.EVENT_PUBLISHER_METADATA = exports.EVENT_HANDLER_METADATA = exports.EVENT_METADATA = exports.COMMAND_METADATA = exports.COMMAND_HANDLER_METADATA = exports.AGGREGATE_METADATA = exports.EVENT_SOURCING_OPTIONS = void 0;
|
|
3
|
+
exports.AGGREGATE_EVENT_REPOSITORY_METADATA = exports.SNAPSHOT_METADATA = exports.QUERY_METADATA = exports.QUERY_HANDLER_METADATA = exports.EVENT_SUBSCRIBER_METADATA = exports.EVENT_SERIALIZER_METADATA = exports.EVENT_PUBLISHER_METADATA = exports.EVENT_HANDLER_METADATA = exports.EVENT_METADATA = exports.COMMAND_METADATA = exports.COMMAND_HANDLER_METADATA = exports.AGGREGATE_METADATA = exports.DEFAULT_BATCH_SIZE = exports.EVENT_SOURCING_OPTIONS = void 0;
|
|
4
4
|
exports.EVENT_SOURCING_OPTIONS = Symbol();
|
|
5
|
+
exports.DEFAULT_BATCH_SIZE = 100;
|
|
5
6
|
exports.AGGREGATE_METADATA = 'AGGREGATE_METADATA';
|
|
6
7
|
exports.COMMAND_HANDLER_METADATA = 'COMMAND_HANDLER_METADATA';
|
|
7
8
|
exports.COMMAND_METADATA = 'COMMAND_METADATA';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/common/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,sBAAsB,GAAG,MAAM,EAAE,CAAC;AAElC,QAAA,kBAAkB,GAAG,oBAAoB,CAAC;AAC1C,QAAA,wBAAwB,GAAG,0BAA0B,CAAC;AACtD,QAAA,gBAAgB,GAAG,kBAAkB,CAAC;AACtC,QAAA,cAAc,GAAG,gBAAgB,CAAC;AAClC,QAAA,sBAAsB,GAAG,wBAAwB,CAAC;AAClD,QAAA,wBAAwB,GAAG,0BAA0B,CAAC;AACtD,QAAA,yBAAyB,GAAG,2BAA2B,CAAC;AACxD,QAAA,yBAAyB,GAAG,2BAA2B,CAAC;AACxD,QAAA,sBAAsB,GAAG,wBAAwB,CAAC;AAClD,QAAA,cAAc,GAAG,gBAAgB,CAAC;AAClC,QAAA,iBAAiB,GAAG,mBAAmB,CAAC;AAExC,QAAA,mCAAmC,GAC9C,qCAAqC,CAAC"}
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/common/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,sBAAsB,GAAG,MAAM,EAAE,CAAC;AAElC,QAAA,kBAAkB,GAAG,GAAG,CAAC;AAEzB,QAAA,kBAAkB,GAAG,oBAAoB,CAAC;AAC1C,QAAA,wBAAwB,GAAG,0BAA0B,CAAC;AACtD,QAAA,gBAAgB,GAAG,kBAAkB,CAAC;AACtC,QAAA,cAAc,GAAG,gBAAgB,CAAC;AAClC,QAAA,sBAAsB,GAAG,wBAAwB,CAAC;AAClD,QAAA,wBAAwB,GAAG,0BAA0B,CAAC;AACtD,QAAA,yBAAyB,GAAG,2BAA2B,CAAC;AACxD,QAAA,yBAAyB,GAAG,2BAA2B,CAAC;AACxD,QAAA,sBAAsB,GAAG,wBAAwB,CAAC;AAClD,QAAA,cAAc,GAAG,gBAAgB,CAAC;AAClC,QAAA,iBAAiB,GAAG,mBAAmB,CAAC;AAExC,QAAA,mCAAmC,GAC9C,qCAAqC,CAAC"}
|
|
@@ -1 +1,3 @@
|
|
|
1
|
-
|
|
1
|
+
import { ClassConstructor } from '@smiledragon-corp/app-common/types';
|
|
2
|
+
import { AggregateRoot } from 'src/model/aggregate.root';
|
|
3
|
+
export declare const AggregateEventRepository: (aggregate: ClassConstructor<AggregateRoot>) => ClassDecorator;
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.AggregateEventRepository = void 0;
|
|
4
|
+
const class_validator_1 = require("class-validator");
|
|
4
5
|
const constants_1 = require("../common/constants");
|
|
5
|
-
const AggregateEventRepository = (
|
|
6
|
+
const AggregateEventRepository = (aggregate) => {
|
|
6
7
|
return (target) => {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
if (!(0, class_validator_1.isDefined)(aggregate)) {
|
|
9
|
+
throw new Error('AggregateEventRepository requires an aggregate constructor.');
|
|
10
|
+
}
|
|
11
|
+
Reflect.defineMetadata(constants_1.AGGREGATE_EVENT_REPOSITORY_METADATA, { aggregate }, target);
|
|
10
12
|
};
|
|
11
13
|
};
|
|
12
14
|
exports.AggregateEventRepository = AggregateEventRepository;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aggregate-event-repository.decorator.js","sourceRoot":"","sources":["../../src/decorator/aggregate-event-repository.decorator.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"aggregate-event-repository.decorator.js","sourceRoot":"","sources":["../../src/decorator/aggregate-event-repository.decorator.ts"],"names":[],"mappings":";;;AACA,qDAA4C;AAC5C,mDAA2E;AAGpE,MAAM,wBAAwB,GAAG,CACtC,SAA0C,EAC1B,EAAE;IAClB,OAAO,CAAC,MAAc,EAAE,EAAE;QACxB,IAAI,CAAC,IAAA,2BAAS,EAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CACb,6DAA6D,CAC9D,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,cAAc,CACpB,+CAAmC,EACnC,EAAE,SAAS,EAAE,EACb,MAAM,CACP,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC,CAAC;AAhBW,QAAA,wBAAwB,4BAgBnC"}
|
|
@@ -3,13 +3,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.Event = void 0;
|
|
4
4
|
require("reflect-metadata");
|
|
5
5
|
const constants_1 = require("../common/constants");
|
|
6
|
+
const event_registry_1 = require("../model/db/event.registry");
|
|
6
7
|
const Event = (name) => {
|
|
7
8
|
return (target) => {
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
const metadata = {
|
|
10
|
+
name: name ?? target.name,
|
|
11
|
+
eventClass: target,
|
|
12
|
+
};
|
|
13
|
+
if (metadata.name.length > 80) {
|
|
14
|
+
throw new Error(`Event name '${metadata.name}' exceeds the maximum length of 80 characters.`);
|
|
11
15
|
}
|
|
12
|
-
|
|
16
|
+
event_registry_1.EventRegistry.register(metadata.name, metadata.eventClass);
|
|
17
|
+
Reflect.defineMetadata(constants_1.EVENT_METADATA, metadata, target);
|
|
13
18
|
};
|
|
14
19
|
};
|
|
15
20
|
exports.Event = Event;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event.decorator.js","sourceRoot":"","sources":["../../src/decorator/event.decorator.ts"],"names":[],"mappings":";;;AAAA,4BAA0B;AAC1B,mDAAsD;
|
|
1
|
+
{"version":3,"file":"event.decorator.js","sourceRoot":"","sources":["../../src/decorator/event.decorator.ts"],"names":[],"mappings":";;;AAAA,4BAA0B;AAC1B,mDAAsD;AAGtD,+DAA4D;AAcrD,MAAM,KAAK,GAAG,CAAC,IAAa,EAAkB,EAAE;IACrD,OAAO,CAAC,MAAc,EAAE,EAAE;QACxB,MAAM,QAAQ,GAAG;YACf,IAAI,EAAE,IAAI,IAAK,MAAmC,CAAC,IAAI;YACvD,UAAU,EAAE,MAAkC;SAC/C,CAAC;QAEF,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CACb,eAAe,QAAQ,CAAC,IAAI,gDAAgD,CAC7E,CAAC;QACJ,CAAC;QAED,8BAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;QAE3D,OAAO,CAAC,cAAc,CAAC,0BAAc,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC3D,CAAC,CAAC;AACJ,CAAC,CAAC;AAjBW,QAAA,KAAK,SAiBhB"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { ClassConstructor } from '@smiledragon-corp/app-common/types';
|
|
2
|
+
import { AggregateEventRepositoryMetadata } from 'src/interface/aggregate/aggregate-event-repository-metadata.interface';
|
|
3
|
+
import { AggregateRoot, EventSourcingRepository } from 'src/model';
|
|
4
|
+
export declare const getAggregateEventRepositoryMetadata: (cls: ClassConstructor<EventSourcingRepository<AggregateRoot>>) => AggregateEventRepositoryMetadata | undefined;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getAggregateEventRepositoryMetadata = void 0;
|
|
4
|
+
const constants_1 = require("../../common/constants");
|
|
5
|
+
const assume_metadata_type_1 = require("./assume-metadata-type");
|
|
6
|
+
const getAggregateEventRepositoryMetadata = (cls) => {
|
|
7
|
+
return (0, assume_metadata_type_1.ensureMetadata)(Reflect.getMetadata(constants_1.AGGREGATE_EVENT_REPOSITORY_METADATA, cls));
|
|
8
|
+
};
|
|
9
|
+
exports.getAggregateEventRepositoryMetadata = getAggregateEventRepositoryMetadata;
|
|
10
|
+
//# sourceMappingURL=get-aggregate-event-repository-metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-aggregate-event-repository-metadata.js","sourceRoot":"","sources":["../../../src/helper/metadata/get-aggregate-event-repository-metadata.ts"],"names":[],"mappings":";;;AACA,sDAA2E;AAC3E,iEAA0E;AAInE,MAAM,mCAAmC,GAAG,CACjD,GAA6D,EACf,EAAE;IAChD,OAAO,IAAA,qCAAc,EACnB,OAAO,CAAC,WAAW,CAAC,+CAAmC,EAAE,GAAG,CAAC,CAC9D,CAAC;AACJ,CAAC,CAAC;AANW,QAAA,mCAAmC,uCAM9C"}
|
|
@@ -15,6 +15,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./assume-metadata-type"), exports);
|
|
18
|
+
__exportStar(require("./get-aggregate-event-repository-metadata"), exports);
|
|
18
19
|
__exportStar(require("./get-aggregate-metadata"), exports);
|
|
19
20
|
__exportStar(require("./get-event-handler-metadata"), exports);
|
|
20
21
|
__exportStar(require("./get-event-metadata"), exports);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/helper/metadata/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yDAAuC;AACvC,2DAAyC;AACzC,+DAA6C;AAC7C,uDAAqC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/helper/metadata/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yDAAuC;AACvC,4EAA0D;AAC1D,2DAAyC;AACzC,+DAA6C;AAC7C,uDAAqC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregate-event-repository-metadata.interface.js","sourceRoot":"","sources":["../../../src/interface/aggregate/aggregate-event-repository-metadata.interface.ts"],"names":[],"mappings":""}
|
|
@@ -15,5 +15,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./aggregate-metadata.interface"), exports);
|
|
18
|
+
__exportStar(require("./aggregate-event-repository-metadata.interface"), exports);
|
|
18
19
|
__exportStar(require("./event-handler-method.type"), exports);
|
|
19
20
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/interface/aggregate/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iEAA+C;AAC/C,8DAA4C"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/interface/aggregate/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iEAA+C;AAC/C,kFAAgE;AAChE,8DAA4C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-filter.interface.js","sourceRoot":"","sources":["../../../src/interface/event/event-filter.interface.ts"],"names":[],"mappings":""}
|
|
@@ -15,6 +15,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./event-envelope-metadata.interface"), exports);
|
|
18
|
+
__exportStar(require("./event-filter.interface"), exports);
|
|
18
19
|
__exportStar(require("./event-handler-metadata.interface"), exports);
|
|
19
20
|
__exportStar(require("./event-metadata.interface"), exports);
|
|
20
21
|
__exportStar(require("./event-publisher.interface"), exports);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/interface/event/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sEAAoD;AACpD,qEAAmD;AACnD,6DAA2C;AAC3C,8DAA4C;AAC5C,oDAAkC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/interface/event/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sEAAoD;AACpD,2DAAyC;AACzC,qEAAmD;AACnD,6DAA2C;AAC3C,8DAA4C;AAC5C,oDAAkC"}
|
package/dist/interface/index.js
CHANGED
|
@@ -17,7 +17,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
17
17
|
__exportStar(require("./aggregate/index"), exports);
|
|
18
18
|
__exportStar(require("./class-constructor.type"), exports);
|
|
19
19
|
__exportStar(require("./event/index"), exports);
|
|
20
|
-
__exportStar(require("./postgres-event-store-config"), exports);
|
|
21
20
|
__exportStar(require("./postgres-event.entity"), exports);
|
|
22
|
-
__exportStar(require("./postgres-snapshot-store-config"), exports);
|
|
23
21
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/interface/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,2DAAyC;AACzC,gDAA8B;AAC9B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/interface/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oDAAkC;AAClC,2DAAyC;AACzC,gDAA8B;AAC9B,0DAAwC"}
|
package/dist/main.js
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const core_1 = require("@nestjs/core");
|
|
4
|
+
const time_uuid_1 = require("@smiledragon-corp/time-uuid");
|
|
4
5
|
const app_module_1 = require("./app.module");
|
|
6
|
+
const temp_event_store_1 = require("./temp.event-store");
|
|
5
7
|
async function bootstrap() {
|
|
6
8
|
const app = await core_1.NestFactory.create(app_module_1.AppModule);
|
|
7
9
|
await app.listen(process.env.PORT ?? 3000);
|
|
10
|
+
const repo = app.get(temp_event_store_1.AA);
|
|
11
|
+
const a = await repo.getOneAggregate(time_uuid_1.TimeUUID.parse('019b6359-125a-7718-bdcf-8ebac31313d1'));
|
|
12
|
+
console.log(a);
|
|
8
13
|
}
|
|
9
14
|
bootstrap();
|
|
10
15
|
//# sourceMappingURL=main.js.map
|
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";;AAAA,uCAA2C;AAC3C,6CAAyC;
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";;AAAA,uCAA2C;AAC3C,2DAAuD;AACvD,6CAAyC;AACzC,yDAAwC;AAExC,KAAK,UAAU,SAAS;IACtB,MAAM,GAAG,GAAG,MAAM,kBAAW,CAAC,MAAM,CAAC,sBAAS,CAAC,CAAC;IAChD,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;IAE3C,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,qBAAE,CAAC,CAAC;IAEzB,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,eAAe,CAClC,oBAAQ,CAAC,KAAK,CAAC,sCAAsC,CAAC,CACvD,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC;AAED,SAAS,EAAE,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { PoolClient, QueryConfig, QueryConfigValues, QueryResult, QueryResultRow } from 'pg';
|
|
1
|
+
import { PoolClient, QueryConfig, QueryConfigValues, QueryResult, QueryResultRow, Submittable } from 'pg';
|
|
2
2
|
export declare class DbConnection {
|
|
3
3
|
private connection;
|
|
4
4
|
private readonly logger;
|
|
@@ -8,4 +8,5 @@ export declare class DbConnection {
|
|
|
8
8
|
rollback(): Promise<void>;
|
|
9
9
|
release(): void;
|
|
10
10
|
query<R extends QueryResultRow = any, I = any[]>(queryTextOrConfig: string | QueryConfig<I>, values?: QueryConfigValues<I>): Promise<QueryResult<R>>;
|
|
11
|
+
queryWithCursor<T extends Submittable>(queryStream: T): T;
|
|
11
12
|
}
|
|
@@ -47,6 +47,26 @@ class DbConnection {
|
|
|
47
47
|
throw error;
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
|
+
queryWithCursor(queryStream) {
|
|
51
|
+
const start = Date.now();
|
|
52
|
+
const text = queryStream.text;
|
|
53
|
+
const params = queryStream.values;
|
|
54
|
+
const paramsText = params === undefined ? '' : ` [params: ${JSON.stringify(params)}]`;
|
|
55
|
+
const cursor = this.connection.query(queryStream);
|
|
56
|
+
if (typeof cursor.on === 'function') {
|
|
57
|
+
cursor.on('end', (result) => {
|
|
58
|
+
const ms = Date.now() - start;
|
|
59
|
+
const rowsText = result?.rowCount === undefined ? '' : ` [rows ${result.rowCount}]`;
|
|
60
|
+
this.logger.log(`[cursor] ${text ?? '[unknown]'}${paramsText}${rowsText} [took ${ms} ms]`);
|
|
61
|
+
});
|
|
62
|
+
cursor.on('error', (error) => {
|
|
63
|
+
const ms = Date.now() - start;
|
|
64
|
+
const message = error?.message ?? 'unknown error';
|
|
65
|
+
this.logger.error(`[cursor] ${text ?? '[unknown]'}${paramsText} [took ${ms} ms] error=${message}`);
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
return cursor;
|
|
69
|
+
}
|
|
50
70
|
}
|
|
51
71
|
exports.DbConnection = DbConnection;
|
|
52
72
|
//# sourceMappingURL=db.connection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.connection.js","sourceRoot":"","sources":["../../../src/model/db/db.connection.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"db.connection.js","sourceRoot":"","sources":["../../../src/model/db/db.connection.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +1,24 @@
|
|
|
1
|
+
import { TimeUUID } from '@smiledragon-corp/time-uuid';
|
|
1
2
|
import { AggregateRoot } from '../aggregate.root';
|
|
2
3
|
import { EventEnvelope } from '../event-envelope';
|
|
3
4
|
import { DbClient } from './db.client';
|
|
4
5
|
import { DbConnection } from './db.connection';
|
|
5
6
|
import { EventStoreRepository } from './event-store.repository';
|
|
6
7
|
import { SnapshotRepository } from './snapshot.repository';
|
|
7
|
-
export declare class EventSourcingRepository {
|
|
8
|
+
export declare abstract class EventSourcingRepository<T extends AggregateRoot> {
|
|
8
9
|
private readonly dbClient;
|
|
9
10
|
private readonly eventStoreRepository;
|
|
10
11
|
private readonly snapshotRepository;
|
|
11
12
|
constructor(dbClient: DbClient, eventStoreRepository: EventStoreRepository, snapshotRepository: SnapshotRepository);
|
|
12
|
-
|
|
13
|
+
getOneAggregate(pk: TimeUUID): Promise<T | undefined>;
|
|
13
14
|
getEnvelope({ aggregate, version, connection, }: {
|
|
14
15
|
aggregate: string;
|
|
15
16
|
version: number;
|
|
16
17
|
connection: DbConnection;
|
|
17
18
|
}): Promise<EventEnvelope>;
|
|
18
19
|
save(aggregate: AggregateRoot): Promise<void>;
|
|
20
|
+
private getLatestSnapshot;
|
|
21
|
+
private parsePayload;
|
|
22
|
+
private getTableNames;
|
|
23
|
+
private getRepositoryMetadata;
|
|
19
24
|
}
|
|
@@ -15,9 +15,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
15
15
|
exports.EventSourcingRepository = void 0;
|
|
16
16
|
const common_1 = require("@nestjs/common");
|
|
17
17
|
const time_uuid_1 = require("@smiledragon-corp/time-uuid");
|
|
18
|
+
const get_aggregate_event_repository_metadata_1 = require("../../helper/metadata/get-aggregate-event-repository-metadata");
|
|
18
19
|
const event_envelope_1 = require("../event-envelope");
|
|
19
20
|
const db_client_1 = require("./db.client");
|
|
20
21
|
const event_store_repository_1 = require("./event-store.repository");
|
|
22
|
+
const snapshot_entity_1 = require("./snapshot.entity");
|
|
21
23
|
const snapshot_repository_1 = require("./snapshot.repository");
|
|
22
24
|
let EventSourcingRepository = class EventSourcingRepository {
|
|
23
25
|
dbClient;
|
|
@@ -28,7 +30,45 @@ let EventSourcingRepository = class EventSourcingRepository {
|
|
|
28
30
|
this.eventStoreRepository = eventStoreRepository;
|
|
29
31
|
this.snapshotRepository = snapshotRepository;
|
|
30
32
|
}
|
|
31
|
-
async
|
|
33
|
+
async getOneAggregate(pk) {
|
|
34
|
+
const metadata = this.getRepositoryMetadata();
|
|
35
|
+
const aggregateClass = metadata.aggregate;
|
|
36
|
+
const { eventStoreTableName } = this.getTableNames(aggregateClass.name);
|
|
37
|
+
const aggregateName = aggregateClass.name;
|
|
38
|
+
const streamId = `${aggregateName}:${pk.toString()}`;
|
|
39
|
+
const connection = await this.dbClient.getConnection();
|
|
40
|
+
try {
|
|
41
|
+
let aggregate = new aggregateClass();
|
|
42
|
+
const snapshot = await this.getLatestSnapshot({
|
|
43
|
+
aggregateName,
|
|
44
|
+
streamId,
|
|
45
|
+
connection,
|
|
46
|
+
});
|
|
47
|
+
if (snapshot) {
|
|
48
|
+
const snapshotEntity = snapshot_entity_1.SnapshotEntity.FromRaw(snapshot);
|
|
49
|
+
aggregate = snapshotEntity.toDomain(aggregateClass);
|
|
50
|
+
aggregate.version = snapshotEntity.version;
|
|
51
|
+
}
|
|
52
|
+
const fromVersion = snapshot?.version ?? 0;
|
|
53
|
+
const cursor = this.eventStoreRepository.getEvents({
|
|
54
|
+
tableName: eventStoreTableName,
|
|
55
|
+
streamId,
|
|
56
|
+
connection,
|
|
57
|
+
filter: {
|
|
58
|
+
fromVersion: fromVersion + 1,
|
|
59
|
+
direction: 'ASC',
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
await aggregate.loadFromHistory(cursor);
|
|
63
|
+
if (aggregate.version < 1) {
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
return aggregate;
|
|
67
|
+
}
|
|
68
|
+
finally {
|
|
69
|
+
connection.release();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
32
72
|
async getEnvelope({ aggregate, version, connection, }) {
|
|
33
73
|
const { rows: entities } = await connection.query(`SELECT event, payload, event_id, aggregate_id, version, occurred_on, correlation_id, causation_id
|
|
34
74
|
FROM "${aggregate}_event"
|
|
@@ -70,6 +110,39 @@ let EventSourcingRepository = class EventSourcingRepository {
|
|
|
70
110
|
connection.release();
|
|
71
111
|
}
|
|
72
112
|
}
|
|
113
|
+
async getLatestSnapshot({ aggregateName, streamId, connection, }) {
|
|
114
|
+
const { snapshotTableName } = this.getTableNames(aggregateName);
|
|
115
|
+
const { rows: snapshots } = await connection.query(`SELECT *
|
|
116
|
+
FROM "${snapshotTableName}"
|
|
117
|
+
WHERE stream_id = $1
|
|
118
|
+
ORDER BY version DESC
|
|
119
|
+
LIMIT 1`, [streamId]);
|
|
120
|
+
return snapshots[0];
|
|
121
|
+
}
|
|
122
|
+
parsePayload(payload) {
|
|
123
|
+
if (typeof payload !== 'string') {
|
|
124
|
+
return payload;
|
|
125
|
+
}
|
|
126
|
+
try {
|
|
127
|
+
return JSON.parse(payload);
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return { value: payload };
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
getTableNames(aggregateName) {
|
|
134
|
+
return {
|
|
135
|
+
eventStoreTableName: `${aggregateName}_event`,
|
|
136
|
+
snapshotTableName: `${aggregateName}_snapshot`,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
getRepositoryMetadata() {
|
|
140
|
+
const metadata = (0, get_aggregate_event_repository_metadata_1.getAggregateEventRepositoryMetadata)(this.constructor);
|
|
141
|
+
if (!metadata) {
|
|
142
|
+
throw new Error('Missing @AggregateEventRepository metadata on repository.');
|
|
143
|
+
}
|
|
144
|
+
return metadata;
|
|
145
|
+
}
|
|
73
146
|
};
|
|
74
147
|
exports.EventSourcingRepository = EventSourcingRepository;
|
|
75
148
|
exports.EventSourcingRepository = EventSourcingRepository = __decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-sourcing.repository.js","sourceRoot":"","sources":["../../../src/model/db/event-sourcing.repository.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAwC;
|
|
1
|
+
{"version":3,"file":"event-sourcing.repository.js","sourceRoot":"","sources":["../../../src/model/db/event-sourcing.repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ClassConstructor } from '@smiledragon-corp/app-common/types';
|
|
2
|
+
import { IEvent, IEventPayload } from 'src/interface';
|
|
3
|
+
import { RawEventStore } from './raw-event-store.interface';
|
|
4
|
+
export declare class EventStoreEntity {
|
|
5
|
+
stream_id: string;
|
|
6
|
+
version: number;
|
|
7
|
+
event: string;
|
|
8
|
+
payload: IEventPayload<IEvent>;
|
|
9
|
+
event_id: string;
|
|
10
|
+
aggregate_id: string;
|
|
11
|
+
occurred_on: Date;
|
|
12
|
+
correlation_id: string | null;
|
|
13
|
+
causation_id: string | null;
|
|
14
|
+
static FromRaw(raw: RawEventStore): EventStoreEntity;
|
|
15
|
+
toDomain<T extends IEvent>(eventClass: ClassConstructor<IEvent>): T;
|
|
16
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EventStoreEntity = void 0;
|
|
4
|
+
class EventStoreEntity {
|
|
5
|
+
stream_id;
|
|
6
|
+
version;
|
|
7
|
+
event;
|
|
8
|
+
payload;
|
|
9
|
+
event_id;
|
|
10
|
+
aggregate_id;
|
|
11
|
+
occurred_on;
|
|
12
|
+
correlation_id;
|
|
13
|
+
causation_id;
|
|
14
|
+
static FromRaw(raw) {
|
|
15
|
+
const entity = new EventStoreEntity();
|
|
16
|
+
entity.stream_id = raw.stream_id;
|
|
17
|
+
entity.version = raw.version;
|
|
18
|
+
entity.event = raw.event;
|
|
19
|
+
entity.payload = raw.payload;
|
|
20
|
+
entity.event_id = raw.event_id;
|
|
21
|
+
entity.aggregate_id = raw.aggregate_id;
|
|
22
|
+
entity.occurred_on = raw.occurred_on;
|
|
23
|
+
entity.correlation_id = raw.correlation_id;
|
|
24
|
+
entity.causation_id = raw.causation_id;
|
|
25
|
+
return entity;
|
|
26
|
+
}
|
|
27
|
+
toDomain(eventClass) {
|
|
28
|
+
const event = new eventClass();
|
|
29
|
+
Object.assign(event, this.payload);
|
|
30
|
+
return event;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
exports.EventStoreEntity = EventStoreEntity;
|
|
34
|
+
//# sourceMappingURL=event-store.entity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-store.entity.js","sourceRoot":"","sources":["../../../src/model/db/event-store.entity.ts"],"names":[],"mappings":";;;AAIA,MAAa,gBAAgB;IAC3B,SAAS,CAAS;IAClB,OAAO,CAAS;IAChB,KAAK,CAAS;IACd,OAAO,CAAwB;IAC/B,QAAQ,CAAS;IACjB,YAAY,CAAS;IACrB,WAAW,CAAO;IAClB,cAAc,CAAgB;IAC9B,YAAY,CAAgB;IAE5B,MAAM,CAAC,OAAO,CAAC,GAAkB;QAC/B,MAAM,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;QAEtC,MAAM,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;QACjC,MAAM,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QAC7B,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;QACzB,MAAM,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QAC7B,MAAM,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;QAC/B,MAAM,CAAC,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC;QACvC,MAAM,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC;QACrC,MAAM,CAAC,cAAc,GAAG,GAAG,CAAC,cAAc,CAAC;QAC3C,MAAM,CAAC,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC;QAEvC,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,QAAQ,CAAmB,UAAoC;QAC7D,MAAM,KAAK,GAAG,IAAI,UAAU,EAAE,CAAC;QAE/B,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAEnC,OAAO,KAAU,CAAC;IACpB,CAAC;CACF;AAlCD,4CAkCC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { IEvent } from 'src/interface';
|
|
2
|
+
import { IEventFilter } from 'src/interface/event/event-filter.interface';
|
|
2
3
|
import { AggregateRoot } from '../aggregate.root';
|
|
3
4
|
import { EventEnvelope } from '../event-envelope';
|
|
4
5
|
import { DbClient } from './db.client';
|
|
@@ -18,4 +19,10 @@ export declare class EventStoreRepository {
|
|
|
18
19
|
events: IEvent[];
|
|
19
20
|
connection: DbConnection;
|
|
20
21
|
}): Promise<void>;
|
|
22
|
+
getEvents({ tableName, streamId, connection, filter, }: {
|
|
23
|
+
tableName: string;
|
|
24
|
+
streamId: string;
|
|
25
|
+
connection: DbConnection;
|
|
26
|
+
filter?: IEventFilter;
|
|
27
|
+
}): AsyncGenerator<IEvent[]>;
|
|
21
28
|
}
|
|
@@ -11,13 +11,20 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
11
11
|
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
12
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
13
|
};
|
|
14
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
15
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
16
|
+
};
|
|
14
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
18
|
exports.EventStoreRepository = void 0;
|
|
16
19
|
const common_1 = require("@nestjs/common");
|
|
17
20
|
const time_uuid_1 = require("@smiledragon-corp/time-uuid");
|
|
21
|
+
const pg_cursor_1 = __importDefault(require("pg-cursor"));
|
|
22
|
+
const common_2 = require("../../common");
|
|
18
23
|
const helper_1 = require("../../helper");
|
|
19
24
|
const event_envelope_1 = require("../event-envelope");
|
|
20
25
|
const db_client_1 = require("./db.client");
|
|
26
|
+
const event_store_entity_1 = require("./event-store.entity");
|
|
27
|
+
const event_registry_1 = require("./event.registry");
|
|
21
28
|
let EventStoreRepository = class EventStoreRepository {
|
|
22
29
|
dbClient;
|
|
23
30
|
columns = [
|
|
@@ -91,6 +98,43 @@ let EventStoreRepository = class EventStoreRepository {
|
|
|
91
98
|
connection,
|
|
92
99
|
});
|
|
93
100
|
}
|
|
101
|
+
async *getEvents({ tableName, streamId, connection, filter, }) {
|
|
102
|
+
const fromVersion = filter?.fromVersion;
|
|
103
|
+
const direction = filter?.direction || 'ASC';
|
|
104
|
+
const limit = filter?.limit || Number.MAX_SAFE_INTEGER;
|
|
105
|
+
const batch = filter?.batch || common_2.DEFAULT_BATCH_SIZE;
|
|
106
|
+
const query = `
|
|
107
|
+
SELECT event, payload
|
|
108
|
+
FROM "${tableName}"
|
|
109
|
+
WHERE stream_id = $1
|
|
110
|
+
${fromVersion ? 'AND version >= $2' : ''}
|
|
111
|
+
ORDER BY version ${direction}
|
|
112
|
+
LIMIT ${fromVersion ? '$3' : '$2'}
|
|
113
|
+
`;
|
|
114
|
+
const params = fromVersion
|
|
115
|
+
? [streamId, fromVersion, limit]
|
|
116
|
+
: [streamId, limit];
|
|
117
|
+
const cursor = connection.queryWithCursor(new pg_cursor_1.default(query, params));
|
|
118
|
+
let done = false;
|
|
119
|
+
while (!done) {
|
|
120
|
+
const rows = await new Promise((resolve, reject) => cursor.read(batch, (err, result) => err ? reject(err) : resolve(result)));
|
|
121
|
+
if (rows.length === 0) {
|
|
122
|
+
done = true;
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
const entities = rows.map((row) => {
|
|
126
|
+
const eventClass = event_registry_1.EventRegistry.getClass(row.event);
|
|
127
|
+
if (!eventClass) {
|
|
128
|
+
throw new Error(`Event class not found for event: ${row.event}`);
|
|
129
|
+
}
|
|
130
|
+
const eventEntity = event_store_entity_1.EventStoreEntity.FromRaw(row);
|
|
131
|
+
return eventEntity.toDomain(eventClass);
|
|
132
|
+
});
|
|
133
|
+
yield entities;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
cursor.close(() => { });
|
|
137
|
+
}
|
|
94
138
|
};
|
|
95
139
|
exports.EventStoreRepository = EventStoreRepository;
|
|
96
140
|
exports.EventStoreRepository = EventStoreRepository = __decorate([
|