@ddd-ts/event-sourcing-inmemory 0.0.32 → 0.0.34

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.
@@ -13,6 +13,7 @@ export declare const MakeInMemoryEventLakeAggregateStore: <A extends HasTrait<ty
13
13
  save(aggregate: InstanceType<A>, trx?: InMemoryTransaction): Promise<void>;
14
14
  filter(predicate: (model: InstanceType<A>) => boolean, trx?: InMemoryTransaction): Promise<InstanceType<A>[]>;
15
15
  clear(): void;
16
+ create(model: InstanceType<A>, trx?: InMemoryTransaction): Promise<void>;
16
17
  saveAll(models: InstanceType<A>[], trx?: InMemoryTransaction): Promise<void>;
17
18
  load(id: InstanceType<A>["id"], trx?: InMemoryTransaction): Promise<InstanceType<A> | undefined>;
18
19
  loadAll(trx?: InMemoryTransaction): Promise<InstanceType<A>[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"in-memory.event-lake.aggregate-store.d.ts","sourceRoot":"","sources":["../src/in-memory.event-lake.aggregate-store.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,KAAK,SAAS,EACd,cAAc,EACd,OAAO,EACP,WAAW,EACX,aAAa,EACb,aAAa,EAEb,YAAY,EACZ,YAAY,EACb,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,mBAAmB,EACnB,4BAA4B,EAC7B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,eAAO,MAAM,mCAAmC,GAC9C,CAAC,SAAS,QAAQ,CAAC,OAAO,YAAY,CAAC,GAAG,QAAQ,CAAC,OAAO,YAAY,CAAC,aAE5D,CAAC,6BAMkB,gBAAgB,cACd,MAAM,cACtB,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GACtC,WAAW,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,aAC5B,SAAS;uBAJM,gBAAgB;yBACd,MAAM;wBAQP,YAAY,CAAC,CAAC,CAAC,GAAG,MAAM;iBAS1C,4BAA4B;;;wBAMZ,SAAS;qBACZ,MAAM;2CAcQ,mBAAmB;;;;;;;;;;CA1B5D,CAAC;AAEF,8BAAsB,+BAA+B,CACnD,CAAC,SAAS,aAAa,GAAG,aAAa,CACvC,SAAQ,aAAa,CAAC,CAAC,CAAC;aAIN,QAAQ,EAAE,gBAAgB;aAC1B,UAAU,EAAE,MAAM;aAClB,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;aACpD,QAAQ,CAAC,EAAE,SAAS;aACpB,KAAK,CAAC,EAAE,MAAM;IAPhC,WAAW,EAAE,4BAA4B,CAAC;IAC1C,SAAS,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;gBAEpB,QAAQ,EAAE,gBAAgB,EAC1B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,EACpD,QAAQ,CAAC,EAAE,SAAS,YAAA,EACpB,KAAK,CAAC,EAAE,MAAM,YAAA;IAYhC,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,GAAG,MAAM;IAExB,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,mBAAmB;CAW5D"}
1
+ {"version":3,"file":"in-memory.event-lake.aggregate-store.d.ts","sourceRoot":"","sources":["../src/in-memory.event-lake.aggregate-store.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,KAAK,SAAS,EACd,cAAc,EACd,OAAO,EACP,WAAW,EACX,aAAa,EACb,aAAa,EAEb,YAAY,EACZ,YAAY,EACb,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,mBAAmB,EACnB,4BAA4B,EAC7B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,eAAO,MAAM,mCAAmC,GAC9C,CAAC,SAAS,QAAQ,CAAC,OAAO,YAAY,CAAC,GAAG,QAAQ,CAAC,OAAO,YAAY,CAAC,aAE5D,CAAC,6BAMkB,gBAAgB,cACd,MAAM,cACtB,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GACtC,WAAW,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,aAC5B,SAAS;uBAJM,gBAAgB;yBACd,MAAM;wBAQP,YAAY,CAAC,CAAC,CAAC,GAAG,MAAM;iBAS1C,4BAA4B;;;wBAMZ,SAAS;qBACZ,MAAM;2CAcQ,mBAAmB;;;;;;;;;;;CA1B5D,CAAC;AAEF,8BAAsB,+BAA+B,CACnD,CAAC,SAAS,aAAa,GAAG,aAAa,CACvC,SAAQ,aAAa,CAAC,CAAC,CAAC;aAIN,QAAQ,EAAE,gBAAgB;aAC1B,UAAU,EAAE,MAAM;aAClB,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;aACpD,QAAQ,CAAC,EAAE,SAAS;aACpB,KAAK,CAAC,EAAE,MAAM;IAPhC,WAAW,EAAE,4BAA4B,CAAC;IAC1C,SAAS,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;gBAEpB,QAAQ,EAAE,gBAAgB,EAC1B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,EACpD,QAAQ,CAAC,EAAE,SAAS,YAAA,EACpB,KAAK,CAAC,EAAE,MAAM,YAAA;IAYhC,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,GAAG,MAAM;IAExB,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,mBAAmB;CAW5D"}
@@ -1,9 +1,10 @@
1
- import { LakeId, type ISerializedChange, type ISerializedFact, EventReference, EventLakeStorageLayer, EventId } from "@ddd-ts/core";
1
+ import { LakeId, type ISerializedChange, type ISerializedFact, EventLakeStorageLayer, EventId } from "@ddd-ts/core";
2
+ import { ISerializedSavedChange } from "@ddd-ts/core/dist/interfaces/es-event";
2
3
  import { InMemoryDatabase, InMemoryTransaction } from "@ddd-ts/store-inmemory";
3
4
  export declare class InMemoryEventLakeStorageLayer implements EventLakeStorageLayer {
4
5
  readonly database: InMemoryDatabase;
5
6
  constructor(database: InMemoryDatabase);
6
- append(lakeId: LakeId, changes: ISerializedChange[], trx: InMemoryTransaction): Promise<EventReference[]>;
7
+ append(lakeId: LakeId, changes: ISerializedChange[], trx: InMemoryTransaction): Promise<ISerializedSavedChange[]>;
7
8
  read(lakeId: LakeId, startAfter?: EventId, endAt?: EventId): AsyncIterable<ISerializedFact>;
8
9
  }
9
10
  //# sourceMappingURL=in-memory.event-lake.storage-layer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"in-memory.event-lake.storage-layer.d.ts","sourceRoot":"","sources":["../src/in-memory.event-lake.storage-layer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,cAAc,EACd,qBAAqB,EACrB,OAAO,EACR,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE/E,qBAAa,6BAA8B,YAAW,qBAAqB;aAC7C,QAAQ,EAAE,gBAAgB;gBAA1B,QAAQ,EAAE,gBAAgB;IAEhD,MAAM,CACV,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,iBAAiB,EAAE,EAC5B,GAAG,EAAE,mBAAmB;IA0BnB,IAAI,CACT,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,OAAO,EACpB,KAAK,CAAC,EAAE,OAAO,GACd,aAAa,CAAC,eAAe,CAAC;CA6BlC"}
1
+ {"version":3,"file":"in-memory.event-lake.storage-layer.d.ts","sourceRoot":"","sources":["../src/in-memory.event-lake.storage-layer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,qBAAqB,EACrB,OAAO,EACR,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE/E,qBAAa,6BAA8B,YAAW,qBAAqB;aAC7C,QAAQ,EAAE,gBAAgB;gBAA1B,QAAQ,EAAE,gBAAgB;IAEhD,MAAM,CACV,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,iBAAiB,EAAE,EAC5B,GAAG,EAAE,mBAAmB;IA+BnB,IAAI,CACT,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,OAAO,EACpB,KAAK,CAAC,EAAE,OAAO,GACd,aAAa,CAAC,eAAe,CAAC;CA6BlC"}
@@ -1,27 +1,31 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.InMemoryEventLakeStorageLayer = void 0;
4
- const core_1 = require("@ddd-ts/core");
5
4
  class InMemoryEventLakeStorageLayer {
6
5
  database;
7
6
  constructor(database) {
8
7
  this.database = database;
9
8
  }
10
9
  async append(lakeId, changes, trx) {
11
- const refs = [];
10
+ const result = [];
12
11
  let revision = 0;
13
12
  for (const change of changes) {
14
- const ref = new core_1.EventReference(`${lakeId.serialize()}/${change.id}`);
13
+ const ref = `${lakeId.serialize()}/${change.id}`;
15
14
  const stored = {
16
15
  ...change,
17
- ref: ref.serialize(),
16
+ ref: ref,
18
17
  revision: revision,
19
18
  };
20
19
  this.database.save(lakeId.serialize(), change.id, stored, trx.transaction);
21
- refs.push(ref);
20
+ result.push({
21
+ ...change,
22
+ ref: ref,
23
+ revision: revision,
24
+ occurredAt: undefined,
25
+ });
22
26
  revision++;
23
27
  }
24
- return refs;
28
+ return result;
25
29
  }
26
30
  async *read(lakeId, startAfter, endAt) {
27
31
  const events = this.database.loadAll(lakeId.serialize());
@@ -30,19 +34,19 @@ class InMemoryEventLakeStorageLayer {
30
34
  : a.data.savedAt < b.data.savedAt
31
35
  ? -1
32
36
  : 1);
33
- const facts = sorted.map((e) => e.data.data);
37
+ const facts = sorted.map((e) => e.data);
34
38
  let started = !startAfter;
35
39
  for (const fact of facts) {
36
- if (startAfter && fact.id === startAfter.serialize()) {
40
+ if (startAfter && fact.data.id === startAfter.serialize()) {
37
41
  started = true;
38
42
  continue;
39
43
  }
40
- if (endAt && fact.id === endAt.serialize()) {
41
- yield fact;
44
+ if (endAt && fact.data.id === endAt.serialize()) {
45
+ yield { ...fact.data, occurredAt: fact.data.savedAt };
42
46
  break;
43
47
  }
44
48
  if (started) {
45
- yield fact;
49
+ yield { ...fact.data, occurredAt: fact.data.savedAt };
46
50
  }
47
51
  }
48
52
  }
@@ -1 +1 @@
1
- {"version":3,"file":"in-memory.event-lake.storage-layer.js","sourceRoot":"","sources":["../src/in-memory.event-lake.storage-layer.ts"],"names":[],"mappings":";;;AAAA,uCAOsB;AAGtB,MAAa,6BAA6B;IACZ;IAA5B,YAA4B,QAA0B;QAA1B,aAAQ,GAAR,QAAQ,CAAkB;IAAG,CAAC;IAE1D,KAAK,CAAC,MAAM,CACV,MAAc,EACd,OAA4B,EAC5B,GAAwB;QAExB,MAAM,IAAI,GAAqB,EAAE,CAAC;QAElC,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,GAAG,GAAG,IAAI,qBAAc,CAAC,GAAG,MAAM,CAAC,SAAS,EAAE,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;YAErE,MAAM,MAAM,GAAG;gBACb,GAAG,MAAM;gBACT,GAAG,EAAE,GAAG,CAAC,SAAS,EAAE;gBACpB,QAAQ,EAAE,QAAQ;aACnB,CAAC;YAEF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAChB,MAAM,CAAC,SAAS,EAAE,EAClB,MAAM,CAAC,EAAE,EACT,MAAM,EACN,GAAG,CAAC,WAAW,CAChB,CAAC;YACF,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACf,QAAQ,EAAE,CAAC;QACb,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,CAAC,IAAI,CACT,MAAc,EACd,UAAoB,EACpB,KAAe;QAEf,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QAEzD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAClC,CAAC,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO;YAC/B,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ;YAC7C,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO;gBAC/B,CAAC,CAAC,CAAC,CAAC;gBACJ,CAAC,CAAC,CAAC,CACR,CAAC;QAEF,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE7C,IAAI,OAAO,GAAG,CAAC,UAAU,CAAC;QAE1B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,UAAU,IAAI,IAAI,CAAC,EAAE,KAAK,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC;gBACrD,OAAO,GAAG,IAAI,CAAC;gBACf,SAAS;YACX,CAAC;YACD,IAAI,KAAK,IAAI,IAAI,CAAC,EAAE,KAAK,KAAK,CAAC,SAAS,EAAE,EAAE,CAAC;gBAC3C,MAAM,IAAI,CAAC;gBACX,MAAM;YACR,CAAC;YACD,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,IAAI,CAAC;YACb,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAjED,sEAiEC","sourcesContent":["import {\n LakeId,\n type ISerializedChange,\n type ISerializedFact,\n EventReference,\n EventLakeStorageLayer,\n EventId,\n} from \"@ddd-ts/core\";\nimport { InMemoryDatabase, InMemoryTransaction } from \"@ddd-ts/store-inmemory\";\n\nexport class InMemoryEventLakeStorageLayer implements EventLakeStorageLayer {\n constructor(public readonly database: InMemoryDatabase) {}\n\n async append(\n lakeId: LakeId,\n changes: ISerializedChange[],\n trx: InMemoryTransaction,\n ) {\n const refs: EventReference[] = [];\n\n let revision = 0;\n for (const change of changes) {\n const ref = new EventReference(`${lakeId.serialize()}/${change.id}`);\n\n const stored = {\n ...change,\n ref: ref.serialize(),\n revision: revision,\n };\n\n this.database.save(\n lakeId.serialize(),\n change.id,\n stored,\n trx.transaction,\n );\n refs.push(ref);\n revision++;\n }\n return refs;\n }\n\n async *read(\n lakeId: LakeId,\n startAfter?: EventId,\n endAt?: EventId,\n ): AsyncIterable<ISerializedFact> {\n const events = this.database.loadAll(lakeId.serialize());\n\n const sorted = events.sort((a, b) =>\n a.data.savedAt === b.data.savedAt\n ? a.data.data.revision - b.data.data.revision\n : a.data.savedAt < b.data.savedAt\n ? -1\n : 1,\n );\n\n const facts = sorted.map((e) => e.data.data);\n\n let started = !startAfter;\n\n for (const fact of facts) {\n if (startAfter && fact.id === startAfter.serialize()) {\n started = true;\n continue;\n }\n if (endAt && fact.id === endAt.serialize()) {\n yield fact;\n break;\n }\n if (started) {\n yield fact;\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"in-memory.event-lake.storage-layer.js","sourceRoot":"","sources":["../src/in-memory.event-lake.storage-layer.ts"],"names":[],"mappings":";;;AAUA,MAAa,6BAA6B;IACZ;IAA5B,YAA4B,QAA0B;QAA1B,aAAQ,GAAR,QAAQ,CAAkB;IAAG,CAAC;IAE1D,KAAK,CAAC,MAAM,CACV,MAAc,EACd,OAA4B,EAC5B,GAAwB;QAExB,MAAM,MAAM,GAA6B,EAAE,CAAC;QAE5C,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,SAAS,EAAE,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YAEjD,MAAM,MAAM,GAAG;gBACb,GAAG,MAAM;gBACT,GAAG,EAAE,GAAG;gBACR,QAAQ,EAAE,QAAQ;aACnB,CAAC;YAEF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAChB,MAAM,CAAC,SAAS,EAAE,EAClB,MAAM,CAAC,EAAE,EACT,MAAM,EACN,GAAG,CAAC,WAAW,CAChB,CAAC;YACF,MAAM,CAAC,IAAI,CAAC;gBACV,GAAG,MAAM;gBACT,GAAG,EAAE,GAAG;gBACR,QAAQ,EAAE,QAAQ;gBAClB,UAAU,EAAE,SAAS;aACtB,CAAC,CAAC;YACH,QAAQ,EAAE,CAAC;QACb,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,CAAC,IAAI,CACT,MAAc,EACd,UAAoB,EACpB,KAAe;QAEf,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QAEzD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAClC,CAAC,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO;YAC/B,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ;YAC7C,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO;gBAC/B,CAAC,CAAC,CAAC,CAAC;gBACJ,CAAC,CAAC,CAAC,CACR,CAAC;QAEF,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAExC,IAAI,OAAO,GAAG,CAAC,UAAU,CAAC;QAE1B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC;gBAC1D,OAAO,GAAG,IAAI,CAAC;gBACf,SAAS;YACX,CAAC;YACD,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,KAAK,CAAC,SAAS,EAAE,EAAE,CAAC;gBAChD,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACtD,MAAM;YACR,CAAC;YACD,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACxD,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAtED,sEAsEC","sourcesContent":["import {\n LakeId,\n type ISerializedChange,\n type ISerializedFact,\n EventLakeStorageLayer,\n EventId,\n} from \"@ddd-ts/core\";\nimport { ISerializedSavedChange } from \"@ddd-ts/core/dist/interfaces/es-event\";\nimport { InMemoryDatabase, InMemoryTransaction } from \"@ddd-ts/store-inmemory\";\n\nexport class InMemoryEventLakeStorageLayer implements EventLakeStorageLayer {\n constructor(public readonly database: InMemoryDatabase) {}\n\n async append(\n lakeId: LakeId,\n changes: ISerializedChange[],\n trx: InMemoryTransaction,\n ) {\n const result: ISerializedSavedChange[] = [];\n\n let revision = 0;\n for (const change of changes) {\n const ref = `${lakeId.serialize()}/${change.id}`;\n\n const stored = {\n ...change,\n ref: ref,\n revision: revision,\n };\n\n this.database.save(\n lakeId.serialize(),\n change.id,\n stored,\n trx.transaction,\n );\n result.push({\n ...change,\n ref: ref,\n revision: revision,\n occurredAt: undefined,\n });\n revision++;\n }\n return result;\n }\n\n async *read(\n lakeId: LakeId,\n startAfter?: EventId,\n endAt?: EventId,\n ): AsyncIterable<ISerializedFact> {\n const events = this.database.loadAll(lakeId.serialize());\n\n const sorted = events.sort((a, b) =>\n a.data.savedAt === b.data.savedAt\n ? a.data.data.revision - b.data.data.revision\n : a.data.savedAt < b.data.savedAt\n ? -1\n : 1,\n );\n\n const facts = sorted.map((e) => e.data);\n\n let started = !startAfter;\n\n for (const fact of facts) {\n if (startAfter && fact.data.id === startAfter.serialize()) {\n started = true;\n continue;\n }\n if (endAt && fact.data.id === endAt.serialize()) {\n yield { ...fact.data, occurredAt: fact.data.savedAt };\n break;\n }\n if (started) {\n yield { ...fact.data, occurredAt: fact.data.savedAt };\n }\n }\n }\n}\n"]}
@@ -1,10 +1,11 @@
1
- import { StreamId, type ISerializedChange, type ISerializedFact, EventReference, EventStreamStorageLayer } from "@ddd-ts/core";
1
+ import { StreamId, type ISerializedChange, type ISerializedFact, EventStreamStorageLayer } from "@ddd-ts/core";
2
+ import { ISerializedSavedChange } from "@ddd-ts/core/dist/interfaces/es-event";
2
3
  import { InMemoryDatabase, InMemoryTransaction } from "@ddd-ts/store-inmemory";
3
4
  export declare class InMemoryEventStreamStorageLayer implements EventStreamStorageLayer {
4
5
  readonly database: InMemoryDatabase;
5
6
  constructor(database: InMemoryDatabase);
6
7
  isLocalRevisionOutdatedError(error: unknown): boolean;
7
- append(streamId: StreamId, changes: ISerializedChange[], expectedRevision: number, trx: InMemoryTransaction): Promise<EventReference[]>;
8
+ append(streamId: StreamId, changes: ISerializedChange[], expectedRevision: number, trx: InMemoryTransaction): Promise<ISerializedSavedChange[]>;
8
9
  read(streamId: StreamId, from?: number): AsyncIterable<ISerializedFact>;
9
10
  }
10
11
  //# sourceMappingURL=in-memory.event-stream.storage-layer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"in-memory.event-stream.storage-layer.d.ts","sourceRoot":"","sources":["../src/in-memory.event-stream.storage-layer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,cAAc,EACd,uBAAuB,EAExB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE/E,qBAAa,+BACX,YAAW,uBAAuB;aAEN,QAAQ,EAAE,gBAAgB;gBAA1B,QAAQ,EAAE,gBAAgB;IAEtD,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAI/C,MAAM,CACV,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,iBAAiB,EAAE,EAC5B,gBAAgB,EAAE,MAAM,EACxB,GAAG,EAAE,mBAAmB;IA4BnB,IAAI,CACT,QAAQ,EAAE,QAAQ,EAClB,IAAI,CAAC,EAAE,MAAM,GACZ,aAAa,CAAC,eAAe,CAAC;CAWlC"}
1
+ {"version":3,"file":"in-memory.event-stream.storage-layer.d.ts","sourceRoot":"","sources":["../src/in-memory.event-stream.storage-layer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,uBAAuB,EAExB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE/E,qBAAa,+BACX,YAAW,uBAAuB;aAEN,QAAQ,EAAE,gBAAgB;gBAA1B,QAAQ,EAAE,gBAAgB;IAEtD,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAI/C,MAAM,CACV,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,iBAAiB,EAAE,EAC5B,gBAAgB,EAAE,MAAM,EACxB,GAAG,EAAE,mBAAmB;IAkCnB,IAAI,CACT,QAAQ,EAAE,QAAQ,EAClB,IAAI,CAAC,EAAE,MAAM,GACZ,aAAa,CAAC,eAAe,CAAC;CAclC"}
@@ -11,25 +11,33 @@ class InMemoryEventStreamStorageLayer {
11
11
  return error instanceof core_1.ConcurrencyError;
12
12
  }
13
13
  async append(streamId, changes, expectedRevision, trx) {
14
- const refs = [];
14
+ const result = [];
15
15
  let revision = expectedRevision + 1;
16
16
  for (const change of changes) {
17
- const ref = new core_1.EventReference(`${streamId.serialize()}/${revision}`);
17
+ const ref = `${streamId.serialize()}/${revision}`;
18
18
  const stored = {
19
19
  ...change,
20
- ref: ref.serialize(),
20
+ ref: ref,
21
21
  revision: revision,
22
22
  };
23
23
  this.database.create(streamId.serialize(), `${revision}`, stored, trx.transaction);
24
- refs.push(ref);
24
+ result.push({
25
+ ...change,
26
+ ref: ref,
27
+ revision: revision,
28
+ occurredAt: undefined,
29
+ });
25
30
  revision++;
26
31
  }
27
- return refs;
32
+ return result;
28
33
  }
29
34
  async *read(streamId, from) {
30
35
  const events = this.database.loadAll(streamId.serialize());
31
36
  const sorted = events.sort((a, b) => a.data.data.revision - b.data.data.revision);
32
- const facts = sorted.map((e) => e.data.data);
37
+ const facts = sorted.map((e) => ({
38
+ ...e.data.data,
39
+ occurredAt: e.data.savedAt,
40
+ }));
33
41
  yield* facts.slice(from !== undefined ? from : 0);
34
42
  }
35
43
  }
@@ -1 +1 @@
1
- {"version":3,"file":"in-memory.event-stream.storage-layer.js","sourceRoot":"","sources":["../src/in-memory.event-stream.storage-layer.ts"],"names":[],"mappings":";;;AAAA,uCAOsB;AAGtB,MAAa,+BAA+B;IAGd;IAA5B,YAA4B,QAA0B;QAA1B,aAAQ,GAAR,QAAQ,CAAkB;IAAG,CAAC;IAE1D,4BAA4B,CAAC,KAAc;QACzC,OAAO,KAAK,YAAY,uBAAgB,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,MAAM,CACV,QAAkB,EAClB,OAA4B,EAC5B,gBAAwB,EACxB,GAAwB;QAExB,MAAM,IAAI,GAAqB,EAAE,CAAC;QAElC,IAAI,QAAQ,GAAG,gBAAgB,GAAG,CAAC,CAAC;QAEpC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,GAAG,GAAG,IAAI,qBAAc,CAAC,GAAG,QAAQ,CAAC,SAAS,EAAE,IAAI,QAAQ,EAAE,CAAC,CAAC;YAEtE,MAAM,MAAM,GAAG;gBACb,GAAG,MAAM;gBACT,GAAG,EAAE,GAAG,CAAC,SAAS,EAAE;gBACpB,QAAQ,EAAE,QAAQ;aACnB,CAAC;YAEF,IAAI,CAAC,QAAQ,CAAC,MAAM,CAClB,QAAQ,CAAC,SAAS,EAAE,EACpB,GAAG,QAAQ,EAAE,EACb,MAAM,EACN,GAAG,CAAC,WAAW,CAChB,CAAC;YAEF,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACf,QAAQ,EAAE,CAAC;QACb,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,CAAC,IAAI,CACT,QAAkB,EAClB,IAAa;QAEb,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;QAE3D,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CACxB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CACtD,CAAC;QAEF,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE7C,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;CACF;AAvDD,0EAuDC","sourcesContent":["import {\n StreamId,\n type ISerializedChange,\n type ISerializedFact,\n EventReference,\n EventStreamStorageLayer,\n ConcurrencyError,\n} from \"@ddd-ts/core\";\nimport { InMemoryDatabase, InMemoryTransaction } from \"@ddd-ts/store-inmemory\";\n\nexport class InMemoryEventStreamStorageLayer\n implements EventStreamStorageLayer\n{\n constructor(public readonly database: InMemoryDatabase) {}\n\n isLocalRevisionOutdatedError(error: unknown): boolean {\n return error instanceof ConcurrencyError;\n }\n\n async append(\n streamId: StreamId,\n changes: ISerializedChange[],\n expectedRevision: number,\n trx: InMemoryTransaction,\n ) {\n const refs: EventReference[] = [];\n\n let revision = expectedRevision + 1;\n\n for (const change of changes) {\n const ref = new EventReference(`${streamId.serialize()}/${revision}`);\n\n const stored = {\n ...change,\n ref: ref.serialize(),\n revision: revision,\n };\n\n this.database.create(\n streamId.serialize(),\n `${revision}`,\n stored,\n trx.transaction,\n );\n\n refs.push(ref);\n revision++;\n }\n return refs;\n }\n\n async *read(\n streamId: StreamId,\n from?: number,\n ): AsyncIterable<ISerializedFact> {\n const events = this.database.loadAll(streamId.serialize());\n\n const sorted = events.sort(\n (a, b) => a.data.data.revision - b.data.data.revision,\n );\n\n const facts = sorted.map((e) => e.data.data);\n\n yield* facts.slice(from !== undefined ? from : 0);\n }\n}\n"]}
1
+ {"version":3,"file":"in-memory.event-stream.storage-layer.js","sourceRoot":"","sources":["../src/in-memory.event-stream.storage-layer.ts"],"names":[],"mappings":";;;AAAA,uCAMsB;AAItB,MAAa,+BAA+B;IAGd;IAA5B,YAA4B,QAA0B;QAA1B,aAAQ,GAAR,QAAQ,CAAkB;IAAG,CAAC;IAE1D,4BAA4B,CAAC,KAAc;QACzC,OAAO,KAAK,YAAY,uBAAgB,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,MAAM,CACV,QAAkB,EAClB,OAA4B,EAC5B,gBAAwB,EACxB,GAAwB;QAExB,MAAM,MAAM,GAA6B,EAAE,CAAC;QAE5C,IAAI,QAAQ,GAAG,gBAAgB,GAAG,CAAC,CAAC;QAEpC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,GAAG,GAAG,GAAG,QAAQ,CAAC,SAAS,EAAE,IAAI,QAAQ,EAAE,CAAC;YAElD,MAAM,MAAM,GAAG;gBACb,GAAG,MAAM;gBACT,GAAG,EAAE,GAAG;gBACR,QAAQ,EAAE,QAAQ;aACnB,CAAC;YAEF,IAAI,CAAC,QAAQ,CAAC,MAAM,CAClB,QAAQ,CAAC,SAAS,EAAE,EACpB,GAAG,QAAQ,EAAE,EACb,MAAM,EACN,GAAG,CAAC,WAAW,CAChB,CAAC;YAEF,MAAM,CAAC,IAAI,CAAC;gBACV,GAAG,MAAM;gBACT,GAAG,EAAE,GAAG;gBACR,QAAQ,EAAE,QAAQ;gBAClB,UAAU,EAAE,SAAS;aACtB,CAAC,CAAC;YAEH,QAAQ,EAAE,CAAC;QACb,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,CAAC,IAAI,CACT,QAAkB,EAClB,IAAa;QAEb,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;QAE3D,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CACxB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CACtD,CAAC;QAEF,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/B,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI;YACd,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO;SAC3B,CAAC,CAAC,CAAC;QAEJ,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;CACF;AAhED,0EAgEC","sourcesContent":["import {\n StreamId,\n type ISerializedChange,\n type ISerializedFact,\n EventStreamStorageLayer,\n ConcurrencyError,\n} from \"@ddd-ts/core\";\nimport { ISerializedSavedChange } from \"@ddd-ts/core/dist/interfaces/es-event\";\nimport { InMemoryDatabase, InMemoryTransaction } from \"@ddd-ts/store-inmemory\";\n\nexport class InMemoryEventStreamStorageLayer\n implements EventStreamStorageLayer\n{\n constructor(public readonly database: InMemoryDatabase) {}\n\n isLocalRevisionOutdatedError(error: unknown): boolean {\n return error instanceof ConcurrencyError;\n }\n\n async append(\n streamId: StreamId,\n changes: ISerializedChange[],\n expectedRevision: number,\n trx: InMemoryTransaction,\n ) {\n const result: ISerializedSavedChange[] = [];\n\n let revision = expectedRevision + 1;\n\n for (const change of changes) {\n const ref = `${streamId.serialize()}/${revision}`;\n\n const stored = {\n ...change,\n ref: ref,\n revision: revision,\n };\n\n this.database.create(\n streamId.serialize(),\n `${revision}`,\n stored,\n trx.transaction,\n );\n\n result.push({\n ...change,\n ref: ref,\n revision: revision,\n occurredAt: undefined,\n });\n\n revision++;\n }\n return result;\n }\n\n async *read(\n streamId: StreamId,\n from?: number,\n ): AsyncIterable<ISerializedFact> {\n const events = this.database.loadAll(streamId.serialize());\n\n const sorted = events.sort(\n (a, b) => a.data.data.revision - b.data.data.revision,\n );\n\n const facts = sorted.map((e) => ({\n ...e.data.data,\n occurredAt: e.data.savedAt,\n }));\n\n yield* facts.slice(from !== undefined ? from : 0);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"in-memory.projected-stream.reader.d.ts","sourceRoot":"","sources":["../src/in-memory.projected-stream.reader.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAER,WAAW,EACX,qBAAqB,EAEtB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D,qBAAa,6BAA6B,CACxC,MAAM,SAAS,QAAQ,CACvB,SAAQ,qBAAqB,CAAC,MAAM,CAAC;gBACzB,QAAQ,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC;CAGxE"}
1
+ {"version":3,"file":"in-memory.projected-stream.reader.d.ts","sourceRoot":"","sources":["../src/in-memory.projected-stream.reader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D,qBAAa,6BAA6B,CACxC,MAAM,SAAS,QAAQ,CACvB,SAAQ,qBAAqB,CAAC,MAAM,CAAC;gBACzB,QAAQ,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC;CAGxE"}
@@ -1 +1 @@
1
- {"version":3,"file":"in-memory.projected-stream.reader.js","sourceRoot":"","sources":["../src/in-memory.projected-stream.reader.ts"],"names":[],"mappings":";;;AAAA,uCAMsB;AAEtB,yGAAiG;AAEjG,MAAa,6BAEX,SAAQ,4BAA6B;IACrC,YAAY,QAA0B,EAAE,UAA+B;QACrE,KAAK,CAAC,IAAI,8EAAmC,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,CAAC;IACvE,CAAC;CACF;AAND,sEAMC","sourcesContent":["import {\n IEsEvent,\n INamed,\n ISerializer,\n ProjectedStreamReader,\n SerializerRegistry,\n} from \"@ddd-ts/core\";\nimport { InMemoryDatabase } from \"@ddd-ts/store-inmemory\";\nimport { InMemoryProjectedStreamStorageLayer } from \"./in-memory.projected-stream.storage-layer\";\n\nexport class InMemoryProjectedStreamReader<\n Events extends IEsEvent,\n> extends ProjectedStreamReader<Events> {\n constructor(database: InMemoryDatabase, serializer: ISerializer<Events>) {\n super(new InMemoryProjectedStreamStorageLayer(database), serializer);\n }\n}\n"]}
1
+ {"version":3,"file":"in-memory.projected-stream.reader.js","sourceRoot":"","sources":["../src/in-memory.projected-stream.reader.ts"],"names":[],"mappings":";;;AAAA,uCAA4E;AAE5E,yGAAiG;AAEjG,MAAa,6BAEX,SAAQ,4BAA6B;IACrC,YAAY,QAA0B,EAAE,UAA+B;QACrE,KAAK,CAAC,IAAI,8EAAmC,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,CAAC;IACvE,CAAC;CACF;AAND,sEAMC","sourcesContent":["import { IEsEvent, ISerializer, ProjectedStreamReader } from \"@ddd-ts/core\";\nimport { InMemoryDatabase } from \"@ddd-ts/store-inmemory\";\nimport { InMemoryProjectedStreamStorageLayer } from \"./in-memory.projected-stream.storage-layer\";\n\nexport class InMemoryProjectedStreamReader<\n Events extends IEsEvent,\n> extends ProjectedStreamReader<Events> {\n constructor(database: InMemoryDatabase, serializer: ISerializer<Events>) {\n super(new InMemoryProjectedStreamStorageLayer(database), serializer);\n }\n}\n"]}
@@ -1,10 +1,10 @@
1
- import { EventReference, LakeSource, ProjectedStream, ProjectedStreamStorageLayer, StreamSource } from "@ddd-ts/core";
1
+ import { ISerializedFact, LakeSource, ProjectedStream, ProjectedStreamStorageLayer, StreamSource, Cursor, ISerializedSavedChange } from "@ddd-ts/core";
2
2
  import { InMemoryDatabase } from "@ddd-ts/store-inmemory";
3
3
  export declare class InMemoryStreamSourceFilter {
4
4
  private readonly database;
5
5
  constructor(database: InMemoryDatabase);
6
6
  all(source: StreamSource, shard: string): Generator<{
7
- savedAt: number;
7
+ savedAt: bigint;
8
8
  data: any;
9
9
  }, void, unknown>;
10
10
  }
@@ -12,13 +12,16 @@ export declare class InMemoryLakeSourceFilter {
12
12
  private readonly database;
13
13
  constructor(database: InMemoryDatabase);
14
14
  all(source: LakeSource, shard: string): Generator<{
15
- savedAt: number;
15
+ savedAt: bigint;
16
16
  data: any;
17
17
  }, void, unknown>;
18
18
  }
19
19
  export declare class InMemoryProjectedStreamStorageLayer implements ProjectedStreamStorageLayer {
20
20
  private readonly database;
21
21
  constructor(database: InMemoryDatabase);
22
- read(projectedStream: ProjectedStream, shard: string, startAfter?: EventReference, endAt?: EventReference): AsyncGenerator<any, void, unknown>;
22
+ getCursor(savedChange: ISerializedSavedChange): Promise<Cursor | undefined>;
23
+ get(cursor: Cursor): Promise<ISerializedFact | undefined>;
24
+ read(projectedStream: ProjectedStream, shard: string, startAfter?: Cursor, endAt?: Cursor): AsyncGenerator<any, void, unknown>;
25
+ slice(projectedStream: ProjectedStream, shard: string, startAfter?: Cursor, endAt?: Cursor, count?: number): Promise<ISerializedFact[]>;
23
26
  }
24
27
  //# sourceMappingURL=in-memory.projected-stream.storage-layer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"in-memory.projected-stream.storage-layer.d.ts","sourceRoot":"","sources":["../src/in-memory.projected-stream.storage-layer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EAEd,UAAU,EACV,eAAe,EACf,2BAA2B,EAC3B,YAAY,EACb,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,qBAAa,0BAA0B;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,gBAAgB;IAEtD,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM;;;;CAezC;AAED,qBAAa,wBAAwB;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,gBAAgB;IAEtD,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM;;;;CAYvC;AAED,qBAAa,mCACX,YAAW,2BAA2B;IAE1B,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,gBAAgB;IAEhD,IAAI,CACT,eAAe,EAAE,eAAe,EAChC,KAAK,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,cAAc,EAC3B,KAAK,CAAC,EAAE,cAAc;CAmCzB"}
1
+ {"version":3,"file":"in-memory.projected-stream.storage-layer.d.ts","sourceRoot":"","sources":["../src/in-memory.projected-stream.storage-layer.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,eAAe,EAEf,UAAU,EACV,eAAe,EACf,2BAA2B,EAC3B,YAAY,EACZ,MAAM,EACN,sBAAsB,EACvB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D,qBAAa,0BAA0B;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,gBAAgB;IAEtD,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM;;;;CAezC;AAED,qBAAa,wBAAwB;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,gBAAgB;IAEtD,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM;;;;CAYvC;AAED,qBAAa,mCACX,YAAW,2BAA2B;IAE1B,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,gBAAgB;IAEjD,SAAS,CACb,WAAW,EAAE,sBAAsB,GAClC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAexB,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC;IAUxD,IAAI,CACT,eAAe,EAAE,eAAe,EAChC,KAAK,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,MAAM;IAmCV,KAAK,CACT,eAAe,EAAE,eAAe,EAChC,KAAK,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,eAAe,EAAE,CAAC;CAa9B"}
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.InMemoryProjectedStreamStorageLayer = exports.InMemoryLakeSourceFilter = exports.InMemoryStreamSourceFilter = void 0;
4
4
  const core_1 = require("@ddd-ts/core");
5
+ const shape_1 = require("@ddd-ts/shape");
5
6
  class InMemoryStreamSourceFilter {
6
7
  database;
7
8
  constructor(database) {
@@ -52,6 +53,29 @@ class InMemoryProjectedStreamStorageLayer {
52
53
  constructor(database) {
53
54
  this.database = database;
54
55
  }
56
+ async getCursor(savedChange) {
57
+ const [collection, id] = savedChange.ref.split("/");
58
+ if (!collection || !id)
59
+ return undefined;
60
+ const raw = this.database.storage.getCollection(collection).getRaw(id);
61
+ if (!raw)
62
+ return undefined;
63
+ return new core_1.Cursor({
64
+ ref: savedChange.ref,
65
+ eventId: new core_1.EventId(savedChange.id),
66
+ occurredAt: shape_1.MicrosecondTimestamp.fromMicroseconds(raw.savedAt),
67
+ revision: savedChange.revision,
68
+ });
69
+ }
70
+ async get(cursor) {
71
+ const [collection, id] = cursor.ref.split("/");
72
+ if (!collection || !id)
73
+ return undefined;
74
+ const raw = this.database.storage.getCollection(collection).getRaw(id);
75
+ if (!raw)
76
+ return undefined;
77
+ return { ...raw.data, occurredAt: raw.savedAt };
78
+ }
55
79
  async *read(projectedStream, shard, startAfter, endAt) {
56
80
  const sources = projectedStream.sources.map((source) => {
57
81
  if (source instanceof core_1.StreamSource) {
@@ -65,23 +89,33 @@ class InMemoryProjectedStreamStorageLayer {
65
89
  ? a.data.revision - b.data.revision
66
90
  : a.savedAt > b.savedAt
67
91
  ? 1
68
- : -1)
69
- .map((event) => event.data);
70
- let started = !startAfter;
71
- for (const event of all) {
72
- if (startAfter && event.ref === startAfter.serialize()) {
92
+ : -1);
93
+ let started = !startAfter?.ref;
94
+ for (const fact of all) {
95
+ if (startAfter && fact.data.ref === startAfter.ref) {
73
96
  started = true;
74
97
  continue;
75
98
  }
76
- if (endAt && event.ref === endAt.serialize()) {
77
- yield event;
99
+ if (endAt?.ref && fact.data.ref === endAt.ref) {
100
+ yield { ...fact.data, occurredAt: fact.savedAt };
78
101
  break;
79
102
  }
80
103
  if (started) {
81
- yield event;
104
+ yield { ...fact.data, occurredAt: fact.savedAt };
82
105
  }
83
106
  }
84
107
  }
108
+ async slice(projectedStream, shard, startAfter, endAt, count) {
109
+ const stream = this.read(projectedStream, shard, startAfter, endAt);
110
+ const result = [];
111
+ let limit = count ?? Number.POSITIVE_INFINITY;
112
+ for await (const fact of stream) {
113
+ if (!limit--)
114
+ break;
115
+ result.push(fact);
116
+ }
117
+ return result;
118
+ }
85
119
  }
86
120
  exports.InMemoryProjectedStreamStorageLayer = InMemoryProjectedStreamStorageLayer;
87
121
  //# sourceMappingURL=in-memory.projected-stream.storage-layer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"in-memory.projected-stream.storage-layer.js","sourceRoot":"","sources":["../src/in-memory.projected-stream.storage-layer.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n EventReference,\n LakeId,\n LakeSource,\n ProjectedStream,\n ProjectedStreamStorageLayer,\n StreamSource,\n} from \"@ddd-ts/core\";\nimport { InMemoryDatabase } from \"@ddd-ts/store-inmemory\";\n\nexport class InMemoryStreamSourceFilter {\n constructor(private readonly database: InMemoryDatabase) {}\n\n *all(source: StreamSource, shard: string) {\n const cols = [...this.database.storage.collections.keys()];\n const streams = cols.filter((it) => it.startsWith(source.aggregateType));\n for (const stream of streams) {\n yield* this.database\n .loadAll(stream)\n .filter((event) => {\n if (!source.events.includes(event.data.data.name)) return false;\n const payload = event.data.data.payload;\n if (!payload) return false;\n return payload[source.shardKey] === shard;\n })\n .map((event) => event.data);\n }\n }\n}\n\nexport class InMemoryLakeSourceFilter {\n constructor(private readonly database: InMemoryDatabase) {}\n\n *all(source: LakeSource, shard: string) {\n const lakeId = LakeId.from(source.shardType, shard);\n yield* this.database\n .loadAll(lakeId.serialize())\n .filter((event) => {\n if (!source.events.includes(event.data.data.name)) return false;\n const payload = event.data.data.payload;\n if (!payload) return false;\n return payload[source.shardKey] === shard;\n })\n .map((event) => event.data);\n }\n}\n\nexport class InMemoryProjectedStreamStorageLayer\n implements ProjectedStreamStorageLayer\n{\n constructor(private readonly database: InMemoryDatabase) {}\n\n async *read(\n projectedStream: ProjectedStream,\n shard: string,\n startAfter?: EventReference,\n endAt?: EventReference,\n ) {\n const sources = projectedStream.sources.map((source) => {\n if (source instanceof StreamSource) {\n return new InMemoryStreamSourceFilter(this.database).all(source, shard);\n }\n return new InMemoryLakeSourceFilter(this.database).all(source, shard);\n });\n\n const all = sources\n .flatMap((source) => [...source])\n .sort((a, b) =>\n a.savedAt === b.savedAt\n ? a.data.revision - b.data.revision\n : a.savedAt > b.savedAt\n ? 1\n : -1,\n )\n .map((event) => event.data);\n\n let started = !startAfter;\n for (const event of all) {\n if (startAfter && event.ref === startAfter.serialize()) {\n started = true;\n continue;\n }\n if (endAt && event.ref === endAt.serialize()) {\n yield event;\n break;\n }\n if (started) {\n yield event;\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"in-memory.projected-stream.storage-layer.js","sourceRoot":"","sources":["../src/in-memory.projected-stream.storage-layer.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n EventId,\n ISerializedFact,\n LakeId,\n LakeSource,\n ProjectedStream,\n ProjectedStreamStorageLayer,\n StreamSource,\n Cursor,\n ISerializedSavedChange,\n} from \"@ddd-ts/core\";\nimport { InMemoryDatabase } from \"@ddd-ts/store-inmemory\";\nimport { MicrosecondTimestamp } from \"@ddd-ts/shape\";\n\nexport class InMemoryStreamSourceFilter {\n constructor(private readonly database: InMemoryDatabase) {}\n\n *all(source: StreamSource, shard: string) {\n const cols = [...this.database.storage.collections.keys()];\n const streams = cols.filter((it) => it.startsWith(source.aggregateType));\n for (const stream of streams) {\n yield* this.database\n .loadAll(stream)\n .filter((event) => {\n if (!source.events.includes(event.data.data.name)) return false;\n const payload = event.data.data.payload;\n if (!payload) return false;\n return payload[source.shardKey] === shard;\n })\n .map((event) => event.data);\n }\n }\n}\n\nexport class InMemoryLakeSourceFilter {\n constructor(private readonly database: InMemoryDatabase) {}\n\n *all(source: LakeSource, shard: string) {\n const lakeId = LakeId.from(source.shardType, shard);\n yield* this.database\n .loadAll(lakeId.serialize())\n .filter((event) => {\n if (!source.events.includes(event.data.data.name)) return false;\n const payload = event.data.data.payload;\n if (!payload) return false;\n return payload[source.shardKey] === shard;\n })\n .map((event) => event.data);\n }\n}\n\nexport class InMemoryProjectedStreamStorageLayer\n implements ProjectedStreamStorageLayer\n{\n constructor(private readonly database: InMemoryDatabase) {}\n\n async getCursor(\n savedChange: ISerializedSavedChange,\n ): Promise<Cursor | undefined> {\n const [collection, id] = savedChange.ref.split(\"/\");\n if (!collection || !id) return undefined;\n\n const raw = this.database.storage.getCollection(collection).getRaw(id);\n\n if (!raw) return undefined;\n return new Cursor({\n ref: savedChange.ref,\n eventId: new EventId(savedChange.id),\n occurredAt: MicrosecondTimestamp.fromMicroseconds(raw.savedAt),\n revision: savedChange.revision,\n });\n }\n\n async get(cursor: Cursor): Promise<ISerializedFact | undefined> {\n const [collection, id] = cursor.ref.split(\"/\");\n if (!collection || !id) return undefined;\n\n const raw = this.database.storage.getCollection(collection).getRaw(id);\n\n if (!raw) return undefined;\n return { ...raw.data, occurredAt: raw.savedAt };\n }\n\n async *read(\n projectedStream: ProjectedStream,\n shard: string,\n startAfter?: Cursor,\n endAt?: Cursor,\n ) {\n const sources = projectedStream.sources.map((source) => {\n if (source instanceof StreamSource) {\n return new InMemoryStreamSourceFilter(this.database).all(source, shard);\n }\n return new InMemoryLakeSourceFilter(this.database).all(source, shard);\n });\n\n const all = sources\n .flatMap((source) => [...source])\n .sort((a, b) =>\n a.savedAt === b.savedAt\n ? a.data.revision - b.data.revision\n : a.savedAt > b.savedAt\n ? 1\n : -1,\n );\n\n let started = !startAfter?.ref;\n for (const fact of all) {\n if (startAfter && fact.data.ref === startAfter.ref) {\n started = true;\n continue;\n }\n if (endAt?.ref && fact.data.ref === endAt.ref) {\n yield { ...fact.data, occurredAt: fact.savedAt };\n break;\n }\n if (started) {\n yield { ...fact.data, occurredAt: fact.savedAt };\n }\n }\n }\n\n async slice(\n projectedStream: ProjectedStream,\n shard: string,\n startAfter?: Cursor,\n endAt?: Cursor,\n count?: number,\n ): Promise<ISerializedFact[]> {\n const stream = this.read(projectedStream, shard, startAfter, endAt);\n\n const result: ISerializedFact[] = [];\n\n let limit = count ?? Number.POSITIVE_INFINITY;\n for await (const fact of stream) {\n if (!limit--) break;\n result.push(fact);\n }\n\n return result;\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ddd-ts/event-sourcing-inmemory",
3
- "version": "0.0.32",
3
+ "version": "0.0.34",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "license": "MIT",
@@ -9,15 +9,16 @@
9
9
  "build": "tsc"
10
10
  },
11
11
  "dependencies": {
12
- "@ddd-ts/core": "0.0.32",
13
- "@ddd-ts/store-inmemory": "0.0.32",
14
- "@ddd-ts/types": "0.0.32"
12
+ "@ddd-ts/core": "0.0.34",
13
+ "@ddd-ts/shape": "0.0.34",
14
+ "@ddd-ts/store-inmemory": "0.0.34",
15
+ "@ddd-ts/types": "0.0.34"
15
16
  },
16
17
  "devDependencies": {
17
- "@ddd-ts/shape": "0.0.32",
18
- "@ddd-ts/tests": "0.0.32",
19
- "@ddd-ts/tools": "0.0.32",
20
- "@ddd-ts/traits": "0.0.32",
18
+ "@ddd-ts/shape": "0.0.34",
19
+ "@ddd-ts/tests": "0.0.34",
20
+ "@ddd-ts/tools": "0.0.34",
21
+ "@ddd-ts/traits": "0.0.34",
21
22
  "@types/jest": "^29.5.1",
22
23
  "@types/node": "^20.12.4"
23
24
  }