@ddd-ts/event-sourcing-firestore 0.0.0-compute-timeout-on-process.5 → 0.0.0-compute-timeout-on-process.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.
@@ -1,7 +1,7 @@
1
- import * as _ddd_ts_store_firestore0 from "@ddd-ts/store-firestore";
2
- import { FirestoreStore, FirestoreTransaction, FirestoreTransactionPerformer } from "@ddd-ts/store-firestore";
3
1
  import * as _ddd_ts_core0 from "@ddd-ts/core";
4
2
  import { EventLakeStore, EventOf, EventSourced, IEventBus, IEventSourced, IIdentifiable, ISerializer, Identifiable, LakeId } from "@ddd-ts/core";
3
+ import * as _ddd_ts_store_firestore0 from "@ddd-ts/store-firestore";
4
+ import { FirestoreStore, FirestoreTransaction, FirestoreTransactionPerformer } from "@ddd-ts/store-firestore";
5
5
  import { CollectionReference } from "firebase-admin/firestore";
6
6
  import { HasTrait } from "@ddd-ts/traits";
7
7
 
@@ -1,6 +1,8 @@
1
1
  import { FirestoreEventLakeStorageLayer } from "./firestore.event-lake.storage-layer.js";
2
- import { FirestoreStore, FirestoreTransactionPerformer } from "@ddd-ts/store-firestore";
3
- import { EventLakeStore } from "@ddd-ts/core";
2
+ import { EventLakeStore, EventOf, EventSourced, IEventBus, IEventSourced, IIdentifiable, ISerializer, Identifiable, LakeId } from "@ddd-ts/core";
3
+ import { FirestoreStore, FirestoreTransaction, FirestoreTransactionPerformer } from "@ddd-ts/store-firestore";
4
+ import { CollectionReference } from "firebase-admin/firestore";
5
+ import { HasTrait } from "@ddd-ts/traits";
4
6
 
5
7
  //#region src/firestore.event-lake.aggregate-store.ts
6
8
  const MakeFirestoreEventLakeAggregateStore = (AGGREGATE) => {
@@ -1 +1 @@
1
- {"version":3,"file":"firestore.event-lake.aggregate-store.js","names":[],"sources":["../src/firestore.event-lake.aggregate-store.ts"],"sourcesContent":["import {\n ISerializer,\n IEventSourced,\n IIdentifiable,\n EventOf,\n EventLakeStore,\n LakeId,\n IChange,\n IEventBus,\n EventSourced,\n Identifiable,\n} from \"@ddd-ts/core\";\nimport {\n FirestoreStore,\n FirestoreTransaction,\n FirestoreTransactionPerformer,\n} from \"@ddd-ts/store-firestore\";\n\nimport { CollectionReference } from \"firebase-admin/firestore\";\nimport { FirestoreEventLakeStorageLayer } from \"./firestore.event-lake.storage-layer\";\nimport { HasTrait } from \"@ddd-ts/traits\";\n\nexport const MakeFirestoreEventLakeAggregateStore = <\n A extends HasTrait<typeof EventSourced> & HasTrait<typeof Identifiable>,\n>(\n AGGREGATE: A,\n) => {\n abstract class $FirestoreEventLakeAggregateStore extends FirestoreEventLakeAggregateStore<\n InstanceType<A>\n > {\n constructor(\n collection: CollectionReference,\n serializer: ISerializer<InstanceType<A>> &\n ISerializer<EventOf<InstanceType<A>>>,\n eventBus?: IEventBus,\n ) {\n super(collection, serializer, eventBus, AGGREGATE.name);\n }\n\n abstract getLakeId(instance: InstanceType<A>): LakeId;\n }\n\n return $FirestoreEventLakeAggregateStore;\n};\n\nexport abstract class FirestoreEventLakeAggregateStore<\n A extends IEventSourced & IIdentifiable,\n> extends FirestoreStore<A> {\n transaction: FirestoreTransactionPerformer;\n lakeStore: EventLakeStore<EventOf<A>>;\n constructor(\n collection: CollectionReference,\n serializer: ISerializer<EventOf<A>> & ISerializer<A>,\n eventBus?: IEventBus,\n $name?: string,\n ) {\n super(collection, serializer, $name);\n const storageLayer = new FirestoreEventLakeStorageLayer(\n collection.firestore,\n );\n this.transaction = new FirestoreTransactionPerformer(collection.firestore);\n this.lakeStore = new EventLakeStore<EventOf<A>>(\n storageLayer,\n serializer,\n eventBus,\n );\n }\n\n abstract getLakeId(instance: A): LakeId;\n\n override async save(aggregate: A, trx?: FirestoreTransaction) {\n const changes = [...aggregate.changes] as IChange<EventOf<A>>[];\n\n await this.transaction.performWith(trx, async (trx) => {\n const lakeId = this.getLakeId(aggregate);\n\n await super.save(aggregate, trx);\n await this.lakeStore.append(lakeId, changes, trx);\n aggregate.clearChanges();\n });\n }\n}\n"],"mappings":";;;;;AAsBA,MAAa,wCAGX,cACG;CACH,MAAe,0CAA0C,iCAEvD;EACA,YACE,YACA,YAEA,UACA;AACA,SAAM,YAAY,YAAY,UAAU,UAAU,KAAK;;;AAM3D,QAAO;;AAGT,IAAsB,mCAAtB,cAEU,eAAkB;CAC1B;CACA;CACA,YACE,YACA,YACA,UACA,OACA;AACA,QAAM,YAAY,YAAY,MAAM;EACpC,MAAM,eAAe,IAAI,+BACvB,WAAW,UACZ;AACD,OAAK,cAAc,IAAI,8BAA8B,WAAW,UAAU;AAC1E,OAAK,YAAY,IAAI,eACnB,cACA,YACA,SACD;;CAKH,MAAe,KAAK,WAAc,KAA4B;EAC5D,MAAM,UAAU,CAAC,GAAG,UAAU,QAAQ;AAEtC,QAAM,KAAK,YAAY,YAAY,KAAK,OAAO,QAAQ;GACrD,MAAM,SAAS,KAAK,UAAU,UAAU;AAExC,SAAM,MAAM,KAAK,WAAW,IAAI;AAChC,SAAM,KAAK,UAAU,OAAO,QAAQ,SAAS,IAAI;AACjD,aAAU,cAAc;IACxB"}
1
+ {"version":3,"file":"firestore.event-lake.aggregate-store.js","names":[],"sources":["../src/firestore.event-lake.aggregate-store.ts"],"sourcesContent":["import {\n ISerializer,\n IEventSourced,\n IIdentifiable,\n EventOf,\n EventLakeStore,\n LakeId,\n IChange,\n IEventBus,\n EventSourced,\n Identifiable,\n} from \"@ddd-ts/core\";\nimport {\n FirestoreStore,\n FirestoreTransaction,\n FirestoreTransactionPerformer,\n} from \"@ddd-ts/store-firestore\";\n\nimport { CollectionReference } from \"firebase-admin/firestore\";\nimport { FirestoreEventLakeStorageLayer } from \"./firestore.event-lake.storage-layer\";\nimport { HasTrait } from \"@ddd-ts/traits\";\n\nexport const MakeFirestoreEventLakeAggregateStore = <\n A extends HasTrait<typeof EventSourced> & HasTrait<typeof Identifiable>,\n>(\n AGGREGATE: A,\n) => {\n abstract class $FirestoreEventLakeAggregateStore extends FirestoreEventLakeAggregateStore<\n InstanceType<A>\n > {\n constructor(\n collection: CollectionReference,\n serializer: ISerializer<InstanceType<A>> &\n ISerializer<EventOf<InstanceType<A>>>,\n eventBus?: IEventBus,\n ) {\n super(collection, serializer, eventBus, AGGREGATE.name);\n }\n\n abstract getLakeId(instance: InstanceType<A>): LakeId;\n }\n\n return $FirestoreEventLakeAggregateStore;\n};\n\nexport abstract class FirestoreEventLakeAggregateStore<\n A extends IEventSourced & IIdentifiable,\n> extends FirestoreStore<A> {\n transaction: FirestoreTransactionPerformer;\n lakeStore: EventLakeStore<EventOf<A>>;\n constructor(\n collection: CollectionReference,\n serializer: ISerializer<EventOf<A>> & ISerializer<A>,\n eventBus?: IEventBus,\n $name?: string,\n ) {\n super(collection, serializer, $name);\n const storageLayer = new FirestoreEventLakeStorageLayer(\n collection.firestore,\n );\n this.transaction = new FirestoreTransactionPerformer(collection.firestore);\n this.lakeStore = new EventLakeStore<EventOf<A>>(\n storageLayer,\n serializer,\n eventBus,\n );\n }\n\n abstract getLakeId(instance: A): LakeId;\n\n override async save(aggregate: A, trx?: FirestoreTransaction) {\n const changes = [...aggregate.changes] as IChange<EventOf<A>>[];\n\n await this.transaction.performWith(trx, async (trx) => {\n const lakeId = this.getLakeId(aggregate);\n\n await super.save(aggregate, trx);\n await this.lakeStore.append(lakeId, changes, trx);\n aggregate.clearChanges();\n });\n }\n}\n"],"mappings":";;;;;;;AAsBA,MAAa,wCAGX,cACG;CACH,MAAe,0CAA0C,iCAEvD;EACA,YACE,YACA,YAEA,UACA;AACA,SAAM,YAAY,YAAY,UAAU,UAAU,KAAK;;;AAM3D,QAAO;;AAGT,IAAsB,mCAAtB,cAEU,eAAkB;CAC1B;CACA;CACA,YACE,YACA,YACA,UACA,OACA;AACA,QAAM,YAAY,YAAY,MAAM;EACpC,MAAM,eAAe,IAAI,+BACvB,WAAW,UACZ;AACD,OAAK,cAAc,IAAI,8BAA8B,WAAW,UAAU;AAC1E,OAAK,YAAY,IAAI,eACnB,cACA,YACA,SACD;;CAKH,MAAe,KAAK,WAAc,KAA4B;EAC5D,MAAM,UAAU,CAAC,GAAG,UAAU,QAAQ;AAEtC,QAAM,KAAK,YAAY,YAAY,KAAK,OAAO,QAAQ;GACrD,MAAM,SAAS,KAAK,UAAU,UAAU;AAExC,SAAM,MAAM,KAAK,WAAW,IAAI;AAChC,SAAM,KAAK,UAAU,OAAO,QAAQ,SAAS,IAAI;AACjD,aAAU,cAAc;IACxB"}
@@ -1,6 +1,6 @@
1
+ import { EventId, EventLakeStorageLayer, ISerializedChange, ISerializedFact, LakeId } from "@ddd-ts/core";
1
2
  import { DefaultConverter, FirestoreTransaction } from "@ddd-ts/store-firestore";
2
3
  import * as fb from "firebase-admin";
3
- import { EventId, EventLakeStorageLayer, ISerializedChange, ISerializedFact, LakeId } from "@ddd-ts/core";
4
4
  import { ISerializedSavedChange as ISerializedSavedChange$1 } from "@ddd-ts/core/dist/interfaces/es-event";
5
5
 
6
6
  //#region src/firestore.event-lake.storage-layer.d.ts
@@ -1,4 +1,5 @@
1
- import { DefaultConverter } from "@ddd-ts/store-firestore";
1
+ import { EventId, LakeId } from "@ddd-ts/core";
2
+ import { DefaultConverter, FirestoreTransaction } from "@ddd-ts/store-firestore";
2
3
  import * as fb from "firebase-admin";
3
4
 
4
5
  //#region src/firestore.event-lake.storage-layer.ts
@@ -1 +1 @@
1
- {"version":3,"file":"firestore.event-lake.storage-layer.js","names":[],"sources":["../src/firestore.event-lake.storage-layer.ts"],"sourcesContent":["import {\n LakeId,\n EventId,\n type ISerializedChange,\n type ISerializedFact,\n EventLakeStorageLayer,\n} from \"@ddd-ts/core\";\nimport { ISerializedSavedChange } from \"@ddd-ts/core/dist/interfaces/es-event\";\n\nimport {\n DefaultConverter,\n FirestoreTransaction,\n} from \"@ddd-ts/store-firestore\";\nimport * as fb from \"firebase-admin\";\n\nexport const serverTimestamp = fb.firestore.FieldValue.serverTimestamp;\n\nexport class FirestoreEventLakeStorageLayer implements EventLakeStorageLayer {\n constructor(\n public readonly firestore: fb.firestore.Firestore,\n public readonly converter = new DefaultConverter(),\n ) {}\n\n getCollection(lakeId: LakeId) {\n return this.firestore\n .collection(\"event-store\")\n .doc(\"Lakes\")\n .collection(lakeId.shardType)\n .doc(lakeId.shardId)\n .collection(\"events\");\n }\n\n async append(\n lakeId: LakeId,\n changes: ISerializedChange[],\n trx: FirestoreTransaction,\n ) {\n const collection = this.getCollection(lakeId);\n\n const result: ISerializedSavedChange[] = [];\n\n for (const change of changes) {\n const revision = trx.increment();\n const storageChange = {\n eventId: change.id,\n name: change.name,\n payload: change.payload,\n occurredAt: serverTimestamp(),\n version: change.version,\n revision,\n };\n\n const ref = collection.doc(change.id);\n trx.transaction.create(ref, this.converter.toFirestore(storageChange));\n\n result.push({\n ...change,\n ref: ref.path,\n revision,\n occurredAt: undefined,\n });\n }\n\n return result;\n }\n\n async *read(\n lakeId: LakeId,\n startAfter?: EventId,\n endAt?: EventId,\n ): AsyncIterable<ISerializedFact> {\n const collection = this.getCollection(lakeId);\n\n const [start, end] = await Promise.all([\n startAfter ? collection.doc(startAfter.serialize()).get() : null,\n endAt ? collection.doc(endAt.serialize()).get() : null,\n ]);\n\n if (startAfter && !start?.exists) {\n throw new Error(`StartAfter event not found: ${startAfter}`);\n }\n\n if (endAt && !end?.exists) {\n throw new Error(`EndAt event not found: ${endAt}`);\n }\n\n let query = collection\n .orderBy(\"occurredAt\", \"asc\")\n .orderBy(\"revision\", \"asc\");\n\n if (start) {\n query = query.startAfter(start);\n }\n\n if (endAt) {\n query = query.endAt(end);\n }\n\n for await (const event of query.stream()) {\n const e = event as any as fb.firestore.QueryDocumentSnapshot<any>;\n const data = this.converter.fromFirestore(e);\n yield {\n id: data.eventId,\n ref: e.ref.path,\n revision: data.revision,\n name: data.name,\n $name: data.name,\n payload: data.payload,\n occurredAt: data.occurredAt,\n version: data.version ?? 1,\n } as ISerializedFact;\n }\n }\n}\n"],"mappings":";;;;AAeA,MAAa,kBAAkB,GAAG,UAAU,WAAW;AAEvD,IAAa,iCAAb,MAA6E;CAC3E,YACE,AAAgB,WAChB,AAAgB,YAAY,IAAI,kBAAkB,EAClD;EAFgB;EACA;;CAGlB,cAAc,QAAgB;AAC5B,SAAO,KAAK,UACT,WAAW,cAAc,CACzB,IAAI,QAAQ,CACZ,WAAW,OAAO,UAAU,CAC5B,IAAI,OAAO,QAAQ,CACnB,WAAW,SAAS;;CAGzB,MAAM,OACJ,QACA,SACA,KACA;EACA,MAAM,aAAa,KAAK,cAAc,OAAO;EAE7C,MAAM,SAAmC,EAAE;AAE3C,OAAK,MAAM,UAAU,SAAS;GAC5B,MAAM,WAAW,IAAI,WAAW;GAChC,MAAM,gBAAgB;IACpB,SAAS,OAAO;IAChB,MAAM,OAAO;IACb,SAAS,OAAO;IAChB,YAAY,iBAAiB;IAC7B,SAAS,OAAO;IAChB;IACD;GAED,MAAM,MAAM,WAAW,IAAI,OAAO,GAAG;AACrC,OAAI,YAAY,OAAO,KAAK,KAAK,UAAU,YAAY,cAAc,CAAC;AAEtE,UAAO,KAAK;IACV,GAAG;IACH,KAAK,IAAI;IACT;IACA,YAAY;IACb,CAAC;;AAGJ,SAAO;;CAGT,OAAO,KACL,QACA,YACA,OACgC;EAChC,MAAM,aAAa,KAAK,cAAc,OAAO;EAE7C,MAAM,CAAC,OAAO,OAAO,MAAM,QAAQ,IAAI,CACrC,aAAa,WAAW,IAAI,WAAW,WAAW,CAAC,CAAC,KAAK,GAAG,MAC5D,QAAQ,WAAW,IAAI,MAAM,WAAW,CAAC,CAAC,KAAK,GAAG,KACnD,CAAC;AAEF,MAAI,cAAc,CAAC,OAAO,OACxB,OAAM,IAAI,MAAM,+BAA+B,aAAa;AAG9D,MAAI,SAAS,CAAC,KAAK,OACjB,OAAM,IAAI,MAAM,0BAA0B,QAAQ;EAGpD,IAAI,QAAQ,WACT,QAAQ,cAAc,MAAM,CAC5B,QAAQ,YAAY,MAAM;AAE7B,MAAI,MACF,SAAQ,MAAM,WAAW,MAAM;AAGjC,MAAI,MACF,SAAQ,MAAM,MAAM,IAAI;AAG1B,aAAW,MAAM,SAAS,MAAM,QAAQ,EAAE;GACxC,MAAM,IAAI;GACV,MAAM,OAAO,KAAK,UAAU,cAAc,EAAE;AAC5C,SAAM;IACJ,IAAI,KAAK;IACT,KAAK,EAAE,IAAI;IACX,UAAU,KAAK;IACf,MAAM,KAAK;IACX,OAAO,KAAK;IACZ,SAAS,KAAK;IACd,YAAY,KAAK;IACjB,SAAS,KAAK,WAAW;IAC1B"}
1
+ {"version":3,"file":"firestore.event-lake.storage-layer.js","names":[],"sources":["../src/firestore.event-lake.storage-layer.ts"],"sourcesContent":["import {\n LakeId,\n EventId,\n type ISerializedChange,\n type ISerializedFact,\n type EventLakeStorageLayer,\n} from \"@ddd-ts/core\";\nimport type { ISerializedSavedChange } from \"@ddd-ts/core/dist/interfaces/es-event\";\n\nimport {\n DefaultConverter,\n FirestoreTransaction,\n} from \"@ddd-ts/store-firestore\";\nimport * as fb from \"firebase-admin\";\n\nexport const serverTimestamp = fb.firestore.FieldValue.serverTimestamp;\n\nexport class FirestoreEventLakeStorageLayer implements EventLakeStorageLayer {\n constructor(\n public readonly firestore: fb.firestore.Firestore,\n public readonly converter = new DefaultConverter(),\n ) {}\n\n getCollection(lakeId: LakeId) {\n return this.firestore\n .collection(\"event-store\")\n .doc(\"Lakes\")\n .collection(lakeId.shardType)\n .doc(lakeId.shardId)\n .collection(\"events\");\n }\n\n async append(\n lakeId: LakeId,\n changes: ISerializedChange[],\n trx: FirestoreTransaction,\n ) {\n const collection = this.getCollection(lakeId);\n\n const result: ISerializedSavedChange[] = [];\n\n for (const change of changes) {\n const revision = trx.increment();\n const storageChange = {\n eventId: change.id,\n name: change.name,\n payload: change.payload,\n occurredAt: serverTimestamp(),\n version: change.version,\n revision,\n };\n\n const ref = collection.doc(change.id);\n trx.transaction.create(ref, this.converter.toFirestore(storageChange));\n\n result.push({\n ...change,\n ref: ref.path,\n revision,\n occurredAt: undefined,\n });\n }\n\n return result;\n }\n\n async *read(\n lakeId: LakeId,\n startAfter?: EventId,\n endAt?: EventId,\n ): AsyncIterable<ISerializedFact> {\n const collection = this.getCollection(lakeId);\n\n const [start, end] = await Promise.all([\n startAfter ? collection.doc(startAfter.serialize()).get() : null,\n endAt ? collection.doc(endAt.serialize()).get() : null,\n ]);\n\n if (startAfter && !start?.exists) {\n throw new Error(`StartAfter event not found: ${startAfter}`);\n }\n\n if (endAt && !end?.exists) {\n throw new Error(`EndAt event not found: ${endAt}`);\n }\n\n let query = collection\n .orderBy(\"occurredAt\", \"asc\")\n .orderBy(\"revision\", \"asc\");\n\n if (start) {\n query = query.startAfter(start);\n }\n\n if (endAt) {\n query = query.endAt(end);\n }\n\n for await (const event of query.stream()) {\n const e = event as any as fb.firestore.QueryDocumentSnapshot<any>;\n const data = this.converter.fromFirestore(e);\n yield {\n id: data.eventId,\n ref: e.ref.path,\n revision: data.revision,\n name: data.name,\n $name: data.name,\n payload: data.payload,\n occurredAt: data.occurredAt,\n version: data.version ?? 1,\n } as ISerializedFact;\n }\n }\n}\n"],"mappings":";;;;;AAeA,MAAa,kBAAkB,GAAG,UAAU,WAAW;AAEvD,IAAa,iCAAb,MAA6E;CAC3E,YACE,AAAgB,WAChB,AAAgB,YAAY,IAAI,kBAAkB,EAClD;EAFgB;EACA;;CAGlB,cAAc,QAAgB;AAC5B,SAAO,KAAK,UACT,WAAW,cAAc,CACzB,IAAI,QAAQ,CACZ,WAAW,OAAO,UAAU,CAC5B,IAAI,OAAO,QAAQ,CACnB,WAAW,SAAS;;CAGzB,MAAM,OACJ,QACA,SACA,KACA;EACA,MAAM,aAAa,KAAK,cAAc,OAAO;EAE7C,MAAM,SAAmC,EAAE;AAE3C,OAAK,MAAM,UAAU,SAAS;GAC5B,MAAM,WAAW,IAAI,WAAW;GAChC,MAAM,gBAAgB;IACpB,SAAS,OAAO;IAChB,MAAM,OAAO;IACb,SAAS,OAAO;IAChB,YAAY,iBAAiB;IAC7B,SAAS,OAAO;IAChB;IACD;GAED,MAAM,MAAM,WAAW,IAAI,OAAO,GAAG;AACrC,OAAI,YAAY,OAAO,KAAK,KAAK,UAAU,YAAY,cAAc,CAAC;AAEtE,UAAO,KAAK;IACV,GAAG;IACH,KAAK,IAAI;IACT;IACA,YAAY;IACb,CAAC;;AAGJ,SAAO;;CAGT,OAAO,KACL,QACA,YACA,OACgC;EAChC,MAAM,aAAa,KAAK,cAAc,OAAO;EAE7C,MAAM,CAAC,OAAO,OAAO,MAAM,QAAQ,IAAI,CACrC,aAAa,WAAW,IAAI,WAAW,WAAW,CAAC,CAAC,KAAK,GAAG,MAC5D,QAAQ,WAAW,IAAI,MAAM,WAAW,CAAC,CAAC,KAAK,GAAG,KACnD,CAAC;AAEF,MAAI,cAAc,CAAC,OAAO,OACxB,OAAM,IAAI,MAAM,+BAA+B,aAAa;AAG9D,MAAI,SAAS,CAAC,KAAK,OACjB,OAAM,IAAI,MAAM,0BAA0B,QAAQ;EAGpD,IAAI,QAAQ,WACT,QAAQ,cAAc,MAAM,CAC5B,QAAQ,YAAY,MAAM;AAE7B,MAAI,MACF,SAAQ,MAAM,WAAW,MAAM;AAGjC,MAAI,MACF,SAAQ,MAAM,MAAM,IAAI;AAG1B,aAAW,MAAM,SAAS,MAAM,QAAQ,EAAE;GACxC,MAAM,IAAI;GACV,MAAM,OAAO,KAAK,UAAU,cAAc,EAAE;AAC5C,SAAM;IACJ,IAAI,KAAK;IACT,KAAK,EAAE,IAAI;IACX,UAAU,KAAK;IACf,MAAM,KAAK;IACX,OAAO,KAAK;IACZ,SAAS,KAAK;IACd,YAAY,KAAK;IACjB,SAAS,KAAK,WAAW;IAC1B"}
@@ -1,5 +1,6 @@
1
1
  import { FirestoreEventLakeStorageLayer } from "./firestore.event-lake.storage-layer.js";
2
- import { EventLakeStore } from "@ddd-ts/core";
2
+ import { EventLakeStore, IEsEvent, IEventBus, ISerializer } from "@ddd-ts/core";
3
+ import { Firestore } from "firebase-admin/firestore";
3
4
 
4
5
  //#region src/firestore.event-lake.store.ts
5
6
  var FirestoreEventLakeStore = class extends EventLakeStore {
@@ -1 +1 @@
1
- {"version":3,"file":"firestore.event-lake.store.js","names":[],"sources":["../src/firestore.event-lake.store.ts"],"sourcesContent":["import { EventLakeStore, IEsEvent, IEventBus, ISerializer } from \"@ddd-ts/core\";\nimport { FirestoreEventLakeStorageLayer } from \"./firestore.event-lake.storage-layer\";\nimport { Firestore } from \"firebase-admin/firestore\";\n\nexport class FirestoreEventLakeStore<\n Event extends IEsEvent,\n> extends EventLakeStore<Event> {\n constructor(\n firestore: Firestore,\n serializer: ISerializer<Event>,\n eventBus?: IEventBus,\n ) {\n super(new FirestoreEventLakeStorageLayer(firestore), serializer, eventBus);\n }\n}\n"],"mappings":";;;;AAIA,IAAa,0BAAb,cAEU,eAAsB;CAC9B,YACE,WACA,YACA,UACA;AACA,QAAM,IAAI,+BAA+B,UAAU,EAAE,YAAY,SAAS"}
1
+ {"version":3,"file":"firestore.event-lake.store.js","names":[],"sources":["../src/firestore.event-lake.store.ts"],"sourcesContent":["import { EventLakeStore, IEsEvent, IEventBus, ISerializer } from \"@ddd-ts/core\";\nimport { FirestoreEventLakeStorageLayer } from \"./firestore.event-lake.storage-layer\";\nimport { Firestore } from \"firebase-admin/firestore\";\n\nexport class FirestoreEventLakeStore<\n Event extends IEsEvent,\n> extends EventLakeStore<Event> {\n constructor(\n firestore: Firestore,\n serializer: ISerializer<Event>,\n eventBus?: IEventBus,\n ) {\n super(new FirestoreEventLakeStorageLayer(firestore), serializer, eventBus);\n }\n}\n"],"mappings":";;;;;AAIA,IAAa,0BAAb,cAEU,eAAsB;CAC9B,YACE,WACA,YACA,UACA;AACA,QAAM,IAAI,+BAA+B,UAAU,EAAE,YAAY,SAAS"}
@@ -1,7 +1,9 @@
1
1
  import { FirestoreEventStreamStorageLayer } from "./firestore.event-stream.storage-layer.js";
2
2
  import { FirestoreSnapshotter } from "./firestore.snapshotter.js";
3
+ import { EventOf, EventSourced, EventStreamAggregateStore, EventStreamStore, EventsOf, IEventSourced, IIdentifiable, ISerializer, StreamId } from "@ddd-ts/core";
3
4
  import { FirestoreTransactionPerformer } from "@ddd-ts/store-firestore";
4
- import { EventStreamAggregateStore, EventStreamStore, StreamId } from "@ddd-ts/core";
5
+ import { Firestore } from "firebase-admin/firestore";
6
+ import { HasTrait } from "@ddd-ts/traits";
5
7
 
6
8
  //#region src/firestore.event-stream.aggregate-store.ts
7
9
  const MakeFirestoreEventStreamAggregateStore = (AGGREGATE) => {
@@ -1 +1 @@
1
- {"version":3,"file":"firestore.event-stream.aggregate-store.js","names":[],"sources":["../src/firestore.event-stream.aggregate-store.ts"],"sourcesContent":["import { HasTrait } from \"@ddd-ts/traits\";\nimport {\n StreamId,\n EventsOf,\n EventSourced,\n type Identifiable,\n type IEventBus,\n EventStreamStore,\n EventStreamAggregateStore,\n ISerializer,\n IEventSourced,\n IIdentifiable,\n EventOf,\n} from \"@ddd-ts/core\";\nimport { FirestoreTransactionPerformer } from \"@ddd-ts/store-firestore\";\n\nimport { FirestoreSnapshotter } from \"./firestore.snapshotter\";\nimport { FirestoreEventStreamStorageLayer } from \"./firestore.event-stream.storage-layer\";\nimport { Firestore } from \"firebase-admin/firestore\";\n\nexport const MakeFirestoreEventStreamAggregateStore = <\n A extends HasTrait<typeof EventSourced> & HasTrait<typeof Identifiable>,\n>(\n AGGREGATE: A,\n) => {\n return class $FirestoreEventStreamAggregateStore extends FirestoreEventStreamAggregateStore<\n InstanceType<A>\n > {\n constructor(\n firestore: Firestore,\n serializer: ISerializer<InstanceType<A>> &\n ISerializer<EventOf<InstanceType<A>>>,\n eventBus?: IEventBus,\n ) {\n const snapshotter = new FirestoreSnapshotter<InstanceType<A>>(\n AGGREGATE.name,\n firestore,\n serializer,\n );\n super(firestore, serializer, snapshotter, eventBus);\n }\n\n loadFirst(event: EventsOf<A>[number]): InstanceType<A> {\n return AGGREGATE.loadFirst(event);\n }\n\n getStreamId(id: InstanceType<A>[\"id\"]): StreamId {\n return StreamId.from(AGGREGATE.name, id.serialize());\n }\n };\n};\n\nexport abstract class FirestoreEventStreamAggregateStore<\n A extends IEventSourced & IIdentifiable,\n> extends EventStreamAggregateStore<A> {\n constructor(\n public readonly firestore: Firestore,\n public readonly serializer: ISerializer<EventOf<A>>,\n public readonly snapshotter: FirestoreSnapshotter<A>,\n public readonly eventBus?: IEventBus,\n ) {\n const storageLayer = new FirestoreEventStreamStorageLayer(firestore);\n const transaction = new FirestoreTransactionPerformer(firestore);\n const streamStore = new EventStreamStore<EventOf<A>>(\n storageLayer,\n serializer,\n eventBus,\n );\n super(streamStore, transaction, snapshotter);\n }\n}\n"],"mappings":";;;;;;AAoBA,MAAa,0CAGX,cACG;AACH,QAAO,MAAM,4CAA4C,mCAEvD;EACA,YACE,WACA,YAEA,UACA;GACA,MAAM,cAAc,IAAI,qBACtB,UAAU,MACV,WACA,WACD;AACD,SAAM,WAAW,YAAY,aAAa,SAAS;;EAGrD,UAAU,OAA6C;AACrD,UAAO,UAAU,UAAU,MAAM;;EAGnC,YAAY,IAAqC;AAC/C,UAAO,SAAS,KAAK,UAAU,MAAM,GAAG,WAAW,CAAC;;;;AAK1D,IAAsB,qCAAtB,cAEU,0BAA6B;CACrC,YACE,AAAgB,WAChB,AAAgB,YAChB,AAAgB,aAChB,AAAgB,UAChB;EACA,MAAM,eAAe,IAAI,iCAAiC,UAAU;EACpE,MAAM,cAAc,IAAI,8BAA8B,UAAU;EAChE,MAAM,cAAc,IAAI,iBACtB,cACA,YACA,SACD;AACD,QAAM,aAAa,aAAa,YAAY;EAZ5B;EACA;EACA;EACA"}
1
+ {"version":3,"file":"firestore.event-stream.aggregate-store.js","names":[],"sources":["../src/firestore.event-stream.aggregate-store.ts"],"sourcesContent":["import { HasTrait } from \"@ddd-ts/traits\";\nimport {\n StreamId,\n EventsOf,\n EventSourced,\n type Identifiable,\n type IEventBus,\n EventStreamStore,\n EventStreamAggregateStore,\n ISerializer,\n IEventSourced,\n IIdentifiable,\n EventOf,\n} from \"@ddd-ts/core\";\nimport { FirestoreTransactionPerformer } from \"@ddd-ts/store-firestore\";\n\nimport { FirestoreSnapshotter } from \"./firestore.snapshotter\";\nimport { FirestoreEventStreamStorageLayer } from \"./firestore.event-stream.storage-layer\";\nimport { Firestore } from \"firebase-admin/firestore\";\n\nexport const MakeFirestoreEventStreamAggregateStore = <\n A extends HasTrait<typeof EventSourced> & HasTrait<typeof Identifiable>,\n>(\n AGGREGATE: A,\n) => {\n return class $FirestoreEventStreamAggregateStore extends FirestoreEventStreamAggregateStore<\n InstanceType<A>\n > {\n constructor(\n firestore: Firestore,\n serializer: ISerializer<InstanceType<A>> &\n ISerializer<EventOf<InstanceType<A>>>,\n eventBus?: IEventBus,\n ) {\n const snapshotter = new FirestoreSnapshotter<InstanceType<A>>(\n AGGREGATE.name,\n firestore,\n serializer,\n );\n super(firestore, serializer, snapshotter, eventBus);\n }\n\n loadFirst(event: EventsOf<A>[number]): InstanceType<A> {\n return AGGREGATE.loadFirst(event);\n }\n\n getStreamId(id: InstanceType<A>[\"id\"]): StreamId {\n return StreamId.from(AGGREGATE.name, id.serialize());\n }\n };\n};\n\nexport abstract class FirestoreEventStreamAggregateStore<\n A extends IEventSourced & IIdentifiable,\n> extends EventStreamAggregateStore<A> {\n constructor(\n public readonly firestore: Firestore,\n public readonly serializer: ISerializer<EventOf<A>>,\n public readonly snapshotter: FirestoreSnapshotter<A>,\n public readonly eventBus?: IEventBus,\n ) {\n const storageLayer = new FirestoreEventStreamStorageLayer(firestore);\n const transaction = new FirestoreTransactionPerformer(firestore);\n const streamStore = new EventStreamStore<EventOf<A>>(\n storageLayer,\n serializer,\n eventBus,\n );\n super(streamStore, transaction, snapshotter);\n }\n}\n"],"mappings":";;;;;;;;AAoBA,MAAa,0CAGX,cACG;AACH,QAAO,MAAM,4CAA4C,mCAEvD;EACA,YACE,WACA,YAEA,UACA;GACA,MAAM,cAAc,IAAI,qBACtB,UAAU,MACV,WACA,WACD;AACD,SAAM,WAAW,YAAY,aAAa,SAAS;;EAGrD,UAAU,OAA6C;AACrD,UAAO,UAAU,UAAU,MAAM;;EAGnC,YAAY,IAAqC;AAC/C,UAAO,SAAS,KAAK,UAAU,MAAM,GAAG,WAAW,CAAC;;;;AAK1D,IAAsB,qCAAtB,cAEU,0BAA6B;CACrC,YACE,AAAgB,WAChB,AAAgB,YAChB,AAAgB,aAChB,AAAgB,UAChB;EACA,MAAM,eAAe,IAAI,iCAAiC,UAAU;EACpE,MAAM,cAAc,IAAI,8BAA8B,UAAU;EAChE,MAAM,cAAc,IAAI,iBACtB,cACA,YACA,SACD;AACD,QAAM,aAAa,aAAa,YAAY;EAZ5B;EACA;EACA;EACA"}
@@ -1,6 +1,6 @@
1
+ import { EventStreamStorageLayer, ISerializedChange, ISerializedFact, StreamId } from "@ddd-ts/core";
1
2
  import { DefaultConverter, FirestoreTransaction } from "@ddd-ts/store-firestore";
2
3
  import * as fb from "firebase-admin";
3
- import { EventStreamStorageLayer, ISerializedChange, ISerializedFact, StreamId } from "@ddd-ts/core";
4
4
  import { ISerializedSavedChange as ISerializedSavedChange$1 } from "@ddd-ts/core/dist/interfaces/es-event";
5
5
 
6
6
  //#region src/firestore.event-stream.storage-layer.d.ts
@@ -1,5 +1,7 @@
1
- import { DefaultConverter } from "@ddd-ts/store-firestore";
1
+ import { EventStreamStorageLayer, StreamId } from "@ddd-ts/core";
2
+ import { DefaultConverter, FirestoreTransaction } from "@ddd-ts/store-firestore";
2
3
  import * as fb from "firebase-admin";
4
+ import { ISerializedSavedChange as ISerializedSavedChange$1 } from "@ddd-ts/core/dist/interfaces/es-event";
3
5
 
4
6
  //#region src/firestore.event-stream.storage-layer.ts
5
7
  const serverTimestamp = fb.firestore.FieldValue.serverTimestamp;
@@ -1 +1 @@
1
- {"version":3,"file":"firestore.event-stream.storage-layer.js","names":[],"sources":["../src/firestore.event-stream.storage-layer.ts"],"sourcesContent":["import {\n StreamId,\n type ISerializedChange,\n type ISerializedFact,\n EventStreamStorageLayer,\n} from \"@ddd-ts/core\";\nimport { ISerializedSavedChange } from \"@ddd-ts/core/dist/interfaces/es-event\";\n\nimport {\n DefaultConverter,\n FirestoreTransaction,\n} from \"@ddd-ts/store-firestore\";\nimport * as fb from \"firebase-admin\";\n\nexport const serverTimestamp = fb.firestore.FieldValue.serverTimestamp;\n\nexport class FirestoreEventStreamStorageLayer\n implements EventStreamStorageLayer\n{\n constructor(\n public readonly firestore: fb.firestore.Firestore,\n public readonly converter = new DefaultConverter(),\n ) {}\n\n isLocalRevisionOutdatedError(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === 6\n );\n }\n\n getCollection(streamId: StreamId) {\n return this.firestore\n .collection(\"event-store\")\n .doc(streamId.aggregateType)\n .collection(\"streams\")\n .doc(streamId.aggregateId)\n .collection(\"events\");\n }\n\n async append(\n streamId: StreamId,\n changes: ISerializedChange[],\n expectedRevision: number,\n trx: FirestoreTransaction,\n ) {\n const collection = this.getCollection(streamId);\n const result: ISerializedSavedChange[] = [];\n\n let revision = expectedRevision + 1;\n for (const change of changes) {\n const storageChange = {\n aggregateType: streamId.aggregateType,\n eventId: change.id,\n aggregateId: streamId.aggregateId,\n revision: revision,\n name: change.name,\n payload: change.payload,\n occurredAt: serverTimestamp(),\n version: change.version,\n };\n\n const ref = collection.doc(`${revision}`);\n\n result.push({\n ...change,\n ref: ref.path,\n revision: revision,\n occurredAt: undefined,\n });\n\n trx.transaction.create(ref, this.converter.toFirestore(storageChange));\n revision++;\n }\n\n return result;\n }\n\n async *read(\n streamId: StreamId,\n startAt?: number,\n ): AsyncIterable<ISerializedFact> {\n const collection = this.getCollection(streamId);\n\n const query = collection\n .where(\"revision\", \">=\", startAt || 0)\n .orderBy(\"revision\", \"asc\");\n\n for await (const event of query.stream()) {\n const e = event as any as fb.firestore.QueryDocumentSnapshot<any>;\n const data = this.converter.fromFirestore(e);\n yield {\n id: data.eventId,\n ref: e.ref.path,\n revision: data.revision,\n name: data.name,\n $name: data.name,\n payload: data.payload,\n occurredAt: data.occurredAt,\n version: data.version ?? 1,\n };\n }\n }\n}\n"],"mappings":";;;;AAcA,MAAa,kBAAkB,GAAG,UAAU,WAAW;AAEvD,IAAa,mCAAb,MAEA;CACE,YACE,AAAgB,WAChB,AAAgB,YAAY,IAAI,kBAAkB,EAClD;EAFgB;EACA;;CAGlB,6BAA6B,OAAyB;AACpD,SACE,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACV,MAAM,SAAS;;CAInB,cAAc,UAAoB;AAChC,SAAO,KAAK,UACT,WAAW,cAAc,CACzB,IAAI,SAAS,cAAc,CAC3B,WAAW,UAAU,CACrB,IAAI,SAAS,YAAY,CACzB,WAAW,SAAS;;CAGzB,MAAM,OACJ,UACA,SACA,kBACA,KACA;EACA,MAAM,aAAa,KAAK,cAAc,SAAS;EAC/C,MAAM,SAAmC,EAAE;EAE3C,IAAI,WAAW,mBAAmB;AAClC,OAAK,MAAM,UAAU,SAAS;GAC5B,MAAM,gBAAgB;IACpB,eAAe,SAAS;IACxB,SAAS,OAAO;IAChB,aAAa,SAAS;IACZ;IACV,MAAM,OAAO;IACb,SAAS,OAAO;IAChB,YAAY,iBAAiB;IAC7B,SAAS,OAAO;IACjB;GAED,MAAM,MAAM,WAAW,IAAI,GAAG,WAAW;AAEzC,UAAO,KAAK;IACV,GAAG;IACH,KAAK,IAAI;IACC;IACV,YAAY;IACb,CAAC;AAEF,OAAI,YAAY,OAAO,KAAK,KAAK,UAAU,YAAY,cAAc,CAAC;AACtE;;AAGF,SAAO;;CAGT,OAAO,KACL,UACA,SACgC;EAGhC,MAAM,QAFa,KAAK,cAAc,SAAS,CAG5C,MAAM,YAAY,MAAM,WAAW,EAAE,CACrC,QAAQ,YAAY,MAAM;AAE7B,aAAW,MAAM,SAAS,MAAM,QAAQ,EAAE;GACxC,MAAM,IAAI;GACV,MAAM,OAAO,KAAK,UAAU,cAAc,EAAE;AAC5C,SAAM;IACJ,IAAI,KAAK;IACT,KAAK,EAAE,IAAI;IACX,UAAU,KAAK;IACf,MAAM,KAAK;IACX,OAAO,KAAK;IACZ,SAAS,KAAK;IACd,YAAY,KAAK;IACjB,SAAS,KAAK,WAAW;IAC1B"}
1
+ {"version":3,"file":"firestore.event-stream.storage-layer.js","names":[],"sources":["../src/firestore.event-stream.storage-layer.ts"],"sourcesContent":["import {\n StreamId,\n type ISerializedChange,\n type ISerializedFact,\n EventStreamStorageLayer,\n} from \"@ddd-ts/core\";\nimport { ISerializedSavedChange } from \"@ddd-ts/core/dist/interfaces/es-event\";\n\nimport {\n DefaultConverter,\n FirestoreTransaction,\n} from \"@ddd-ts/store-firestore\";\nimport * as fb from \"firebase-admin\";\n\nexport const serverTimestamp = fb.firestore.FieldValue.serverTimestamp;\n\nexport class FirestoreEventStreamStorageLayer\n implements EventStreamStorageLayer\n{\n constructor(\n public readonly firestore: fb.firestore.Firestore,\n public readonly converter = new DefaultConverter(),\n ) {}\n\n isLocalRevisionOutdatedError(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === 6\n );\n }\n\n getCollection(streamId: StreamId) {\n return this.firestore\n .collection(\"event-store\")\n .doc(streamId.aggregateType)\n .collection(\"streams\")\n .doc(streamId.aggregateId)\n .collection(\"events\");\n }\n\n async append(\n streamId: StreamId,\n changes: ISerializedChange[],\n expectedRevision: number,\n trx: FirestoreTransaction,\n ) {\n const collection = this.getCollection(streamId);\n const result: ISerializedSavedChange[] = [];\n\n let revision = expectedRevision + 1;\n for (const change of changes) {\n const storageChange = {\n aggregateType: streamId.aggregateType,\n eventId: change.id,\n aggregateId: streamId.aggregateId,\n revision: revision,\n name: change.name,\n payload: change.payload,\n occurredAt: serverTimestamp(),\n version: change.version,\n };\n\n const ref = collection.doc(`${revision}`);\n\n result.push({\n ...change,\n ref: ref.path,\n revision: revision,\n occurredAt: undefined,\n });\n\n trx.transaction.create(ref, this.converter.toFirestore(storageChange));\n revision++;\n }\n\n return result;\n }\n\n async *read(\n streamId: StreamId,\n startAt?: number,\n ): AsyncIterable<ISerializedFact> {\n const collection = this.getCollection(streamId);\n\n const query = collection\n .where(\"revision\", \">=\", startAt || 0)\n .orderBy(\"revision\", \"asc\");\n\n for await (const event of query.stream()) {\n const e = event as any as fb.firestore.QueryDocumentSnapshot<any>;\n const data = this.converter.fromFirestore(e);\n yield {\n id: data.eventId,\n ref: e.ref.path,\n revision: data.revision,\n name: data.name,\n $name: data.name,\n payload: data.payload,\n occurredAt: data.occurredAt,\n version: data.version ?? 1,\n };\n }\n }\n}\n"],"mappings":";;;;;;AAcA,MAAa,kBAAkB,GAAG,UAAU,WAAW;AAEvD,IAAa,mCAAb,MAEA;CACE,YACE,AAAgB,WAChB,AAAgB,YAAY,IAAI,kBAAkB,EAClD;EAFgB;EACA;;CAGlB,6BAA6B,OAAyB;AACpD,SACE,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACV,MAAM,SAAS;;CAInB,cAAc,UAAoB;AAChC,SAAO,KAAK,UACT,WAAW,cAAc,CACzB,IAAI,SAAS,cAAc,CAC3B,WAAW,UAAU,CACrB,IAAI,SAAS,YAAY,CACzB,WAAW,SAAS;;CAGzB,MAAM,OACJ,UACA,SACA,kBACA,KACA;EACA,MAAM,aAAa,KAAK,cAAc,SAAS;EAC/C,MAAM,SAAmC,EAAE;EAE3C,IAAI,WAAW,mBAAmB;AAClC,OAAK,MAAM,UAAU,SAAS;GAC5B,MAAM,gBAAgB;IACpB,eAAe,SAAS;IACxB,SAAS,OAAO;IAChB,aAAa,SAAS;IACZ;IACV,MAAM,OAAO;IACb,SAAS,OAAO;IAChB,YAAY,iBAAiB;IAC7B,SAAS,OAAO;IACjB;GAED,MAAM,MAAM,WAAW,IAAI,GAAG,WAAW;AAEzC,UAAO,KAAK;IACV,GAAG;IACH,KAAK,IAAI;IACC;IACV,YAAY;IACb,CAAC;AAEF,OAAI,YAAY,OAAO,KAAK,KAAK,UAAU,YAAY,cAAc,CAAC;AACtE;;AAGF,SAAO;;CAGT,OAAO,KACL,UACA,SACgC;EAGhC,MAAM,QAFa,KAAK,cAAc,SAAS,CAG5C,MAAM,YAAY,MAAM,WAAW,EAAE,CACrC,QAAQ,YAAY,MAAM;AAE7B,aAAW,MAAM,SAAS,MAAM,QAAQ,EAAE;GACxC,MAAM,IAAI;GACV,MAAM,OAAO,KAAK,UAAU,cAAc,EAAE;AAC5C,SAAM;IACJ,IAAI,KAAK;IACT,KAAK,EAAE,IAAI;IACX,UAAU,KAAK;IACf,MAAM,KAAK;IACX,OAAO,KAAK;IACZ,SAAS,KAAK;IACd,YAAY,KAAK;IACjB,SAAS,KAAK,WAAW;IAC1B"}
@@ -1,5 +1,6 @@
1
1
  import { FirestoreEventStreamStorageLayer } from "./firestore.event-stream.storage-layer.js";
2
2
  import { EventStreamStore } from "@ddd-ts/core";
3
+ import { Firestore } from "firebase-admin/firestore";
3
4
 
4
5
  //#region src/firestore.event-stream.store.ts
5
6
  var FirestoreEventStreamStore = class extends EventStreamStore {
@@ -1 +1 @@
1
- {"version":3,"file":"firestore.event-stream.store.js","names":[],"sources":["../src/firestore.event-stream.store.ts"],"sourcesContent":["import {\n EventStreamStore,\n IEsEvent,\n IEventBus,\n ISerializer,\n} from \"@ddd-ts/core\";\nimport { FirestoreEventStreamStorageLayer } from \"./firestore.event-stream.storage-layer\";\nimport { Firestore } from \"firebase-admin/firestore\";\n\nexport class FirestoreEventStreamStore<\n Event extends IEsEvent,\n> extends EventStreamStore<Event> {\n constructor(\n firestore: Firestore,\n serializer: ISerializer<Event>,\n eventBus?: IEventBus,\n ) {\n super(\n new FirestoreEventStreamStorageLayer(firestore),\n serializer,\n eventBus,\n );\n }\n}\n"],"mappings":";;;;AASA,IAAa,4BAAb,cAEU,iBAAwB;CAChC,YACE,WACA,YACA,UACA;AACA,QACE,IAAI,iCAAiC,UAAU,EAC/C,YACA,SACD"}
1
+ {"version":3,"file":"firestore.event-stream.store.js","names":[],"sources":["../src/firestore.event-stream.store.ts"],"sourcesContent":["import {\n EventStreamStore,\n type IEsEvent,\n type IEventBus,\n type ISerializer,\n} from \"@ddd-ts/core\";\nimport { FirestoreEventStreamStorageLayer } from \"./firestore.event-stream.storage-layer\";\nimport { Firestore } from \"firebase-admin/firestore\";\n\nexport class FirestoreEventStreamStore<\n Event extends IEsEvent,\n> extends EventStreamStore<Event> {\n constructor(\n firestore: Firestore,\n serializer: ISerializer<Event>,\n eventBus?: IEventBus,\n ) {\n super(\n new FirestoreEventStreamStorageLayer(firestore),\n serializer,\n eventBus,\n );\n }\n}\n"],"mappings":";;;;;AASA,IAAa,4BAAb,cAEU,iBAAwB;CAChC,YACE,WACA,YACA,UACA;AACA,QACE,IAAI,iCAAiC,UAAU,EAC/C,YACA,SACD"}
@@ -1,5 +1,6 @@
1
1
  import { FirestoreProjectedStreamStorageLayer } from "./firestore.projected-stream.storage-layer.js";
2
- import { ProjectedStreamReader } from "@ddd-ts/core";
2
+ import { Cursor, IEsEvent, IFact, ISavedChange, ISerializedSavedChange, ISerializer, ProjectedStream, ProjectedStreamReader } from "@ddd-ts/core";
3
+ import { Firestore } from "firebase-admin/firestore";
3
4
 
4
5
  //#region src/firestore.projected-stream.reader.ts
5
6
  var FirestoreProjectedStreamReader = class extends ProjectedStreamReader {
@@ -1 +1 @@
1
- {"version":3,"file":"firestore.projected-stream.reader.js","names":[],"sources":["../src/firestore.projected-stream.reader.ts"],"sourcesContent":["import {\n Cursor,\n IEsEvent,\n IFact,\n ISavedChange,\n ISerializedSavedChange,\n ISerializer,\n ProjectedStream,\n ProjectedStreamReader,\n} from \"@ddd-ts/core\";\nimport { Firestore } from \"firebase-admin/firestore\";\nimport { FirestoreProjectedStreamStorageLayer } from \"./firestore.projected-stream.storage-layer\";\n\nexport class FirestoreProjectedStreamReader<\n Event extends IEsEvent,\n> extends ProjectedStreamReader<Event> {\n storage: FirestoreProjectedStreamStorageLayer;\n serializer: ISerializer<Event>;\n constructor(firestore: Firestore, serializer: ISerializer<Event>) {\n const storage = new FirestoreProjectedStreamStorageLayer(firestore);\n super(storage, serializer);\n this.storage = storage;\n this.serializer = serializer;\n }\n\n async getCursor(savedChange: ISavedChange<Event>) {\n const serialized = await this.serializer.serialize(savedChange);\n return this.storage.getCursor(serialized as ISerializedSavedChange);\n }\n\n async get(cursor: Cursor) {\n const serialized = await this.storage.get(cursor);\n if (!serialized) {\n return undefined;\n }\n return this.serializer.deserialize(serialized) as unknown as Promise<\n IFact<Event>\n >;\n }\n\n async slice(\n projectedStream: ProjectedStream,\n shard: string,\n startAfter?: Cursor,\n endAt?: Cursor,\n limit?: number,\n ) {\n const serialized = await this.storage.slice(\n projectedStream,\n shard,\n startAfter,\n endAt,\n limit,\n );\n return Promise.all(\n serialized.map((s) => this.serializer.deserialize(s)),\n ) as any;\n }\n\n async *read(\n projectedStream: ProjectedStream,\n shard: string,\n startAfter?: Cursor,\n endAt?: Cursor,\n ) {\n for await (const serialized of this.storage.read(\n projectedStream,\n shard,\n startAfter,\n endAt,\n )) {\n yield this.serializer.deserialize(serialized) as unknown as IFact<Event>;\n }\n }\n}\n"],"mappings":";;;;AAaA,IAAa,iCAAb,cAEU,sBAA6B;CACrC;CACA;CACA,YAAY,WAAsB,YAAgC;EAChE,MAAM,UAAU,IAAI,qCAAqC,UAAU;AACnE,QAAM,SAAS,WAAW;AAC1B,OAAK,UAAU;AACf,OAAK,aAAa;;CAGpB,MAAM,UAAU,aAAkC;EAChD,MAAM,aAAa,MAAM,KAAK,WAAW,UAAU,YAAY;AAC/D,SAAO,KAAK,QAAQ,UAAU,WAAqC;;CAGrE,MAAM,IAAI,QAAgB;EACxB,MAAM,aAAa,MAAM,KAAK,QAAQ,IAAI,OAAO;AACjD,MAAI,CAAC,WACH;AAEF,SAAO,KAAK,WAAW,YAAY,WAAW;;CAKhD,MAAM,MACJ,iBACA,OACA,YACA,OACA,OACA;EACA,MAAM,aAAa,MAAM,KAAK,QAAQ,MACpC,iBACA,OACA,YACA,OACA,MACD;AACD,SAAO,QAAQ,IACb,WAAW,KAAK,MAAM,KAAK,WAAW,YAAY,EAAE,CAAC,CACtD;;CAGH,OAAO,KACL,iBACA,OACA,YACA,OACA;AACA,aAAW,MAAM,cAAc,KAAK,QAAQ,KAC1C,iBACA,OACA,YACA,MACD,CACC,OAAM,KAAK,WAAW,YAAY,WAAW"}
1
+ {"version":3,"file":"firestore.projected-stream.reader.js","names":[],"sources":["../src/firestore.projected-stream.reader.ts"],"sourcesContent":["import {\n Cursor,\n IEsEvent,\n IFact,\n ISavedChange,\n ISerializedSavedChange,\n ISerializer,\n ProjectedStream,\n ProjectedStreamReader,\n} from \"@ddd-ts/core\";\nimport { Firestore } from \"firebase-admin/firestore\";\nimport { FirestoreProjectedStreamStorageLayer } from \"./firestore.projected-stream.storage-layer\";\n\nexport class FirestoreProjectedStreamReader<\n Event extends IEsEvent,\n> extends ProjectedStreamReader<Event> {\n storage: FirestoreProjectedStreamStorageLayer;\n serializer: ISerializer<Event>;\n constructor(firestore: Firestore, serializer: ISerializer<Event>) {\n const storage = new FirestoreProjectedStreamStorageLayer(firestore);\n super(storage, serializer);\n this.storage = storage;\n this.serializer = serializer;\n }\n\n async getCursor(savedChange: ISavedChange<Event>) {\n const serialized = await this.serializer.serialize(savedChange);\n return this.storage.getCursor(serialized as ISerializedSavedChange);\n }\n\n async get(cursor: Cursor) {\n const serialized = await this.storage.get(cursor);\n if (!serialized) {\n return undefined;\n }\n return this.serializer.deserialize(serialized) as unknown as Promise<\n IFact<Event>\n >;\n }\n\n async slice(\n projectedStream: ProjectedStream,\n shard: string,\n startAfter?: Cursor,\n endAt?: Cursor,\n limit?: number,\n ) {\n const serialized = await this.storage.slice(\n projectedStream,\n shard,\n startAfter,\n endAt,\n limit,\n );\n return Promise.all(\n serialized.map((s) => this.serializer.deserialize(s)),\n ) as any;\n }\n\n async *read(\n projectedStream: ProjectedStream,\n shard: string,\n startAfter?: Cursor,\n endAt?: Cursor,\n ) {\n for await (const serialized of this.storage.read(\n projectedStream,\n shard,\n startAfter,\n endAt,\n )) {\n yield this.serializer.deserialize(serialized) as unknown as IFact<Event>;\n }\n }\n}\n"],"mappings":";;;;;AAaA,IAAa,iCAAb,cAEU,sBAA6B;CACrC;CACA;CACA,YAAY,WAAsB,YAAgC;EAChE,MAAM,UAAU,IAAI,qCAAqC,UAAU;AACnE,QAAM,SAAS,WAAW;AAC1B,OAAK,UAAU;AACf,OAAK,aAAa;;CAGpB,MAAM,UAAU,aAAkC;EAChD,MAAM,aAAa,MAAM,KAAK,WAAW,UAAU,YAAY;AAC/D,SAAO,KAAK,QAAQ,UAAU,WAAqC;;CAGrE,MAAM,IAAI,QAAgB;EACxB,MAAM,aAAa,MAAM,KAAK,QAAQ,IAAI,OAAO;AACjD,MAAI,CAAC,WACH;AAEF,SAAO,KAAK,WAAW,YAAY,WAAW;;CAKhD,MAAM,MACJ,iBACA,OACA,YACA,OACA,OACA;EACA,MAAM,aAAa,MAAM,KAAK,QAAQ,MACpC,iBACA,OACA,YACA,OACA,MACD;AACD,SAAO,QAAQ,IACb,WAAW,KAAK,MAAM,KAAK,WAAW,YAAY,EAAE,CAAC,CACtD;;CAGH,OAAO,KACL,iBACA,OACA,YACA,OACA;AACA,aAAW,MAAM,cAAc,KAAK,QAAQ,KAC1C,iBACA,OACA,YACA,MACD,CACC,OAAM,KAAK,WAAW,YAAY,WAAW"}
@@ -1,8 +1,8 @@
1
- import { DefaultConverter } from "@ddd-ts/store-firestore";
2
1
  import { ISerializedFact, ISerializedSavedChange, LakeSource, ProjectedStream, ProjectedStreamStorageLayer, StreamSource } from "@ddd-ts/core";
2
+ import { DefaultConverter } from "@ddd-ts/store-firestore";
3
3
  import { Filter, Firestore, Timestamp } from "firebase-admin/firestore";
4
- import { Cursor as Cursor$1 } from "@ddd-ts/core/dist/components/cursor";
5
4
  import { MicrosecondTimestamp } from "@ddd-ts/shape";
5
+ import { Cursor as Cursor$1 } from "@ddd-ts/core/dist/components/cursor";
6
6
 
7
7
  //#region src/firestore.projected-stream.storage-layer.d.ts
8
8
  declare class FirestoreLakeSourceFilter {
@@ -1,6 +1,7 @@
1
+ import { ISerializedFact, ISerializedSavedChange, LakeSource, ProjectedStream, ProjectedStreamStorageLayer, StreamSource } from "@ddd-ts/core";
1
2
  import { DefaultConverter } from "@ddd-ts/store-firestore";
2
- import { LakeSource, StreamSource } from "@ddd-ts/core";
3
- import { Filter, Timestamp } from "firebase-admin/firestore";
3
+ import { Filter, Firestore, Timestamp } from "firebase-admin/firestore";
4
+ import { MicrosecondTimestamp } from "@ddd-ts/shape";
4
5
  import { Cursor as Cursor$1 } from "@ddd-ts/core/dist/components/cursor";
5
6
 
6
7
  //#region src/firestore.projected-stream.storage-layer.ts
@@ -1 +1 @@
1
- {"version":3,"file":"firestore.projected-stream.storage-layer.js","names":["Cursor"],"sources":["../src/firestore.projected-stream.storage-layer.ts"],"sourcesContent":["import {\n ISerializedFact,\n ISerializedSavedChange,\n LakeSource,\n ProjectedStream,\n ProjectedStreamStorageLayer,\n StreamSource,\n} from \"@ddd-ts/core\";\nimport { DefaultConverter } from \"@ddd-ts/store-firestore\";\nimport {\n Filter,\n Firestore,\n QueryDocumentSnapshot,\n Timestamp,\n} from \"firebase-admin/firestore\";\nimport { MicrosecondTimestamp } from \"@ddd-ts/shape\";\nimport { Cursor } from \"@ddd-ts/core/dist/components/cursor\";\n\nexport class FirestoreLakeSourceFilter {\n filter(shard: string, lakeSource: LakeSource) {\n return Filter.and(\n Filter.where(`payload.${lakeSource.shardKey}`, \"==\", shard),\n Filter.where(\"name\", \"in\", lakeSource.events),\n );\n }\n}\n\nexport class FirestoreStreamSourceFilter {\n filter(shard: string, streamSource: StreamSource) {\n return Filter.and(\n Filter.where(\"aggregateType\", \"==\", streamSource.aggregateType),\n Filter.where(`payload.${streamSource.shardKey}`, \"==\", shard),\n Filter.where(\"name\", \"in\", streamSource.events),\n );\n }\n}\n\nexport class FirestoreProjectedStreamStorageLayer\n implements ProjectedStreamStorageLayer\n{\n constructor(\n private readonly firestore: Firestore,\n public readonly converter = new DefaultConverter(),\n ) {}\n\n async *read(\n projectedStream: ProjectedStream,\n shard: string,\n startAfter?: Cursor,\n endAt?: Cursor,\n ) {\n let query = this.firestore\n .collectionGroup(\"events\")\n .orderBy(\"occurredAt\")\n .orderBy(\"revision\");\n\n const filters = projectedStream.sources.map((source) => {\n if (source instanceof LakeSource) {\n return new FirestoreLakeSourceFilter().filter(shard, source);\n }\n if (source instanceof StreamSource) {\n return new FirestoreStreamSourceFilter().filter(shard, source);\n }\n throw new Error(\"Unknown source type\");\n });\n\n query = query.where(Filter.or(...filters));\n\n if (startAfter) {\n const ts = this.microsecondToTimestamp(startAfter.occurredAt);\n query = query.startAfter(ts, startAfter.revision);\n }\n\n if (endAt) {\n const ts = this.microsecondToTimestamp(endAt.occurredAt);\n query = query.endAt(ts, endAt.revision);\n }\n\n for await (const doc of query.stream() as AsyncIterable<QueryDocumentSnapshot>) {\n const data = this.converter.fromFirestore(doc);\n yield {\n id: data.eventId,\n ref: doc.ref.path,\n revision: data.revision,\n name: data.name,\n $name: data.name,\n payload: data.payload,\n occurredAt: data.occurredAt,\n version: data.version ?? 1,\n };\n }\n }\n public microsecondToTimestamp(microseconds: MicrosecondTimestamp) {\n const seconds = BigInt(microseconds.micros) / 1_000_000n;\n const nanoseconds = (BigInt(microseconds.micros) % 1_000_000n) * 1000n; // Convert to nanoseconds\n return new Timestamp(Number(seconds), Number(nanoseconds));\n }\n\n async get(cursor: Cursor) {\n const doc = await this.firestore.doc(cursor.ref).get();\n if (!doc.exists) {\n return undefined;\n }\n const data = this.converter.fromFirestoreSnapshot(doc) as any;\n return {\n id: data.eventId,\n ref: doc.ref.path,\n revision: data.revision,\n name: data.name,\n $name: data.name,\n payload: data.payload,\n occurredAt: data.occurredAt,\n version: data.version ?? 1,\n } as ISerializedFact;\n }\n\n async getCursor(\n savedChange: ISerializedSavedChange,\n ): Promise<Cursor | undefined> {\n const doc = await this.firestore.doc(savedChange.ref).get();\n if (!doc.exists) {\n return undefined;\n }\n const data = this.converter.fromFirestoreSnapshot(doc) as any;\n return Cursor.deserialize({\n eventId: data.eventId,\n ref: doc.ref.path,\n occurredAt: data.occurredAt,\n revision: data.revision,\n });\n }\n\n async slice(\n projectedStream: ProjectedStream,\n shard: string,\n startAfter?: Cursor,\n endAt?: Cursor,\n limit?: number,\n ) {\n let query = this.firestore\n .collectionGroup(\"events\")\n .orderBy(\"occurredAt\")\n .orderBy(\"revision\");\n\n const filters = projectedStream.sources.map((source) => {\n if (source instanceof LakeSource) {\n return new FirestoreLakeSourceFilter().filter(shard, source);\n }\n if (source instanceof StreamSource) {\n return new FirestoreStreamSourceFilter().filter(shard, source);\n }\n throw new Error(\"Unknown source type\");\n });\n\n query = query.where(Filter.or(...filters));\n\n if (startAfter) {\n const ts = this.microsecondToTimestamp(startAfter.occurredAt);\n query = query.startAfter(ts, startAfter.revision);\n }\n\n if (endAt) {\n const ts = this.microsecondToTimestamp(endAt.occurredAt);\n query = query.endAt(ts, endAt.revision);\n }\n\n if (limit) {\n query = query.limit(limit);\n }\n\n const all = await query.get();\n\n return all.docs.map((doc) => {\n const data = this.converter.fromFirestore(doc);\n return {\n id: data.eventId,\n ref: doc.ref.path,\n revision: data.revision,\n name: data.name,\n $name: data.name,\n payload: data.payload,\n occurredAt: data.occurredAt,\n version: data.version ?? 1,\n } as ISerializedFact;\n });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"firestore.projected-stream.storage-layer.js","names":["Cursor"],"sources":["../src/firestore.projected-stream.storage-layer.ts"],"sourcesContent":["import {\n ISerializedFact,\n ISerializedSavedChange,\n LakeSource,\n ProjectedStream,\n ProjectedStreamStorageLayer,\n StreamSource,\n} from \"@ddd-ts/core\";\nimport { DefaultConverter } from \"@ddd-ts/store-firestore\";\nimport {\n Filter,\n Firestore,\n QueryDocumentSnapshot,\n Timestamp,\n} from \"firebase-admin/firestore\";\nimport { MicrosecondTimestamp } from \"@ddd-ts/shape\";\nimport { Cursor } from \"@ddd-ts/core/dist/components/cursor\";\n\nexport class FirestoreLakeSourceFilter {\n filter(shard: string, lakeSource: LakeSource) {\n return Filter.and(\n Filter.where(`payload.${lakeSource.shardKey}`, \"==\", shard),\n Filter.where(\"name\", \"in\", lakeSource.events),\n );\n }\n}\n\nexport class FirestoreStreamSourceFilter {\n filter(shard: string, streamSource: StreamSource) {\n return Filter.and(\n Filter.where(\"aggregateType\", \"==\", streamSource.aggregateType),\n Filter.where(`payload.${streamSource.shardKey}`, \"==\", shard),\n Filter.where(\"name\", \"in\", streamSource.events),\n );\n }\n}\n\nexport class FirestoreProjectedStreamStorageLayer\n implements ProjectedStreamStorageLayer\n{\n constructor(\n private readonly firestore: Firestore,\n public readonly converter = new DefaultConverter(),\n ) {}\n\n async *read(\n projectedStream: ProjectedStream,\n shard: string,\n startAfter?: Cursor,\n endAt?: Cursor,\n ) {\n let query = this.firestore\n .collectionGroup(\"events\")\n .orderBy(\"occurredAt\")\n .orderBy(\"revision\");\n\n const filters = projectedStream.sources.map((source) => {\n if (source instanceof LakeSource) {\n return new FirestoreLakeSourceFilter().filter(shard, source);\n }\n if (source instanceof StreamSource) {\n return new FirestoreStreamSourceFilter().filter(shard, source);\n }\n throw new Error(\"Unknown source type\");\n });\n\n query = query.where(Filter.or(...filters));\n\n if (startAfter) {\n const ts = this.microsecondToTimestamp(startAfter.occurredAt);\n query = query.startAfter(ts, startAfter.revision);\n }\n\n if (endAt) {\n const ts = this.microsecondToTimestamp(endAt.occurredAt);\n query = query.endAt(ts, endAt.revision);\n }\n\n for await (const doc of query.stream() as AsyncIterable<QueryDocumentSnapshot>) {\n const data = this.converter.fromFirestore(doc);\n yield {\n id: data.eventId,\n ref: doc.ref.path,\n revision: data.revision,\n name: data.name,\n $name: data.name,\n payload: data.payload,\n occurredAt: data.occurredAt,\n version: data.version ?? 1,\n };\n }\n }\n public microsecondToTimestamp(microseconds: MicrosecondTimestamp) {\n const seconds = BigInt(microseconds.micros) / 1_000_000n;\n const nanoseconds = (BigInt(microseconds.micros) % 1_000_000n) * 1000n; // Convert to nanoseconds\n return new Timestamp(Number(seconds), Number(nanoseconds));\n }\n\n async get(cursor: Cursor) {\n const doc = await this.firestore.doc(cursor.ref).get();\n if (!doc.exists) {\n return undefined;\n }\n const data = this.converter.fromFirestoreSnapshot(doc) as any;\n return {\n id: data.eventId,\n ref: doc.ref.path,\n revision: data.revision,\n name: data.name,\n $name: data.name,\n payload: data.payload,\n occurredAt: data.occurredAt,\n version: data.version ?? 1,\n } as ISerializedFact;\n }\n\n async getCursor(\n savedChange: ISerializedSavedChange,\n ): Promise<Cursor | undefined> {\n const doc = await this.firestore.doc(savedChange.ref).get();\n if (!doc.exists) {\n return undefined;\n }\n const data = this.converter.fromFirestoreSnapshot(doc) as any;\n return Cursor.deserialize({\n eventId: data.eventId,\n ref: doc.ref.path,\n occurredAt: data.occurredAt,\n revision: data.revision,\n });\n }\n\n async slice(\n projectedStream: ProjectedStream,\n shard: string,\n startAfter?: Cursor,\n endAt?: Cursor,\n limit?: number,\n ) {\n let query = this.firestore\n .collectionGroup(\"events\")\n .orderBy(\"occurredAt\")\n .orderBy(\"revision\");\n\n const filters = projectedStream.sources.map((source) => {\n if (source instanceof LakeSource) {\n return new FirestoreLakeSourceFilter().filter(shard, source);\n }\n if (source instanceof StreamSource) {\n return new FirestoreStreamSourceFilter().filter(shard, source);\n }\n throw new Error(\"Unknown source type\");\n });\n\n query = query.where(Filter.or(...filters));\n\n if (startAfter) {\n const ts = this.microsecondToTimestamp(startAfter.occurredAt);\n query = query.startAfter(ts, startAfter.revision);\n }\n\n if (endAt) {\n const ts = this.microsecondToTimestamp(endAt.occurredAt);\n query = query.endAt(ts, endAt.revision);\n }\n\n if (limit) {\n query = query.limit(limit);\n }\n\n const all = await query.get();\n\n return all.docs.map((doc) => {\n const data = this.converter.fromFirestore(doc);\n return {\n id: data.eventId,\n ref: doc.ref.path,\n revision: data.revision,\n name: data.name,\n $name: data.name,\n payload: data.payload,\n occurredAt: data.occurredAt,\n version: data.version ?? 1,\n } as ISerializedFact;\n });\n }\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { FirestoreStore } from "@ddd-ts/store-firestore";
2
1
  import { IEventSourced, IIdentifiable, ISerializer } from "@ddd-ts/core";
2
+ import { FirestoreStore } from "@ddd-ts/store-firestore";
3
3
 
4
4
  //#region src/firestore.snapshotter.d.ts
5
5
  declare class FirestoreSnapshotter<A extends IEventSourced & IIdentifiable> extends FirestoreStore<A> {
@@ -1,3 +1,4 @@
1
+ import "@ddd-ts/core";
1
2
  import { FirestoreStore } from "@ddd-ts/store-firestore";
2
3
 
3
4
  //#region src/firestore.snapshotter.ts
@@ -1 +1 @@
1
- {"version":3,"file":"firestore.snapshotter.js","names":[],"sources":["../src/firestore.snapshotter.ts"],"sourcesContent":["import {\n type IEventSourced,\n type IIdentifiable,\n type ISerializer,\n} from \"@ddd-ts/core\";\nimport { FirestoreStore } from \"@ddd-ts/store-firestore\";\n\nclass SnapshotSerializer<A extends IEventSourced & IIdentifiable> {\n constructor(\n private readonly serializer: ISerializer<A>,\n private readonly aggregateType: string,\n ) {}\n\n async serialize(instance: A) {\n const serialized = await this.serializer.serialize(instance);\n return {\n ...serialized,\n $name: this.aggregateType,\n revision: instance.acknowledgedRevision,\n };\n }\n\n async deserialize(serialized: any) {\n const { revision, ...content } = serialized;\n const instance = await this.serializer.deserialize({\n $name: this.aggregateType,\n ...content,\n });\n instance.acknowledgedRevision = Number(revision);\n return instance;\n }\n}\n\nexport class FirestoreSnapshotter<\n A extends IEventSourced & IIdentifiable,\n> extends FirestoreStore<A> {\n constructor(\n aggregateType: string,\n database: FirebaseFirestore.Firestore,\n serializer: ISerializer<A>,\n ) {\n const collection = database\n .collection(\"event-store\")\n .doc(aggregateType)\n .collection(\"streams\");\n super(\n collection,\n new SnapshotSerializer(serializer, aggregateType),\n aggregateType,\n );\n }\n}\n"],"mappings":";;;AAOA,IAAM,qBAAN,MAAkE;CAChE,YACE,AAAiB,YACjB,AAAiB,eACjB;EAFiB;EACA;;CAGnB,MAAM,UAAU,UAAa;AAE3B,SAAO;GACL,GAFiB,MAAM,KAAK,WAAW,UAAU,SAAS;GAG1D,OAAO,KAAK;GACZ,UAAU,SAAS;GACpB;;CAGH,MAAM,YAAY,YAAiB;EACjC,MAAM,EAAE,UAAU,GAAG,YAAY;EACjC,MAAM,WAAW,MAAM,KAAK,WAAW,YAAY;GACjD,OAAO,KAAK;GACZ,GAAG;GACJ,CAAC;AACF,WAAS,uBAAuB,OAAO,SAAS;AAChD,SAAO;;;AAIX,IAAa,uBAAb,cAEU,eAAkB;CAC1B,YACE,eACA,UACA,YACA;EACA,MAAM,aAAa,SAChB,WAAW,cAAc,CACzB,IAAI,cAAc,CAClB,WAAW,UAAU;AACxB,QACE,YACA,IAAI,mBAAmB,YAAY,cAAc,EACjD,cACD"}
1
+ {"version":3,"file":"firestore.snapshotter.js","names":[],"sources":["../src/firestore.snapshotter.ts"],"sourcesContent":["import {\n type IEventSourced,\n type IIdentifiable,\n type ISerializer,\n} from \"@ddd-ts/core\";\nimport { FirestoreStore } from \"@ddd-ts/store-firestore\";\n\nclass SnapshotSerializer<A extends IEventSourced & IIdentifiable> {\n constructor(\n private readonly serializer: ISerializer<A>,\n private readonly aggregateType: string,\n ) {}\n\n async serialize(instance: A) {\n const serialized = await this.serializer.serialize(instance);\n return {\n ...serialized,\n $name: this.aggregateType,\n revision: instance.acknowledgedRevision,\n };\n }\n\n async deserialize(serialized: any) {\n const { revision, ...content } = serialized;\n const instance = await this.serializer.deserialize({\n $name: this.aggregateType,\n ...content,\n });\n instance.acknowledgedRevision = Number(revision);\n return instance;\n }\n}\n\nexport class FirestoreSnapshotter<\n A extends IEventSourced & IIdentifiable,\n> extends FirestoreStore<A> {\n constructor(\n aggregateType: string,\n database: FirebaseFirestore.Firestore,\n serializer: ISerializer<A>,\n ) {\n const collection = database\n .collection(\"event-store\")\n .doc(aggregateType)\n .collection(\"streams\");\n super(\n collection,\n new SnapshotSerializer(serializer, aggregateType),\n aggregateType,\n );\n }\n}\n"],"mappings":";;;;AAOA,IAAM,qBAAN,MAAkE;CAChE,YACE,AAAiB,YACjB,AAAiB,eACjB;EAFiB;EACA;;CAGnB,MAAM,UAAU,UAAa;AAE3B,SAAO;GACL,GAFiB,MAAM,KAAK,WAAW,UAAU,SAAS;GAG1D,OAAO,KAAK;GACZ,UAAU,SAAS;GACpB;;CAGH,MAAM,YAAY,YAAiB;EACjC,MAAM,EAAE,UAAU,GAAG,YAAY;EACjC,MAAM,WAAW,MAAM,KAAK,WAAW,YAAY;GACjD,OAAO,KAAK;GACZ,GAAG;GACJ,CAAC;AACF,WAAS,uBAAuB,OAAO,SAAS;AAChD,SAAO;;;AAIX,IAAa,uBAAb,cAEU,eAAkB;CAC1B,YACE,eACA,UACA,YACA;EACA,MAAM,aAAa,SAChB,WAAW,cAAc,CACzB,IAAI,cAAc,CAClB,WAAW,UAAU;AACxB,QACE,YACA,IAAI,mBAAmB,YAAY,cAAc,EACjD,cACD"}
@@ -1,5 +1,5 @@
1
- import { DefaultConverter, FirestoreTransaction } from "@ddd-ts/store-firestore";
2
1
  import { CheckpointId, Cursor, ESProjection, EventId, IEsEvent, IFact, ISavedChange, Lock, ProjectedStreamReader, Serialized } from "@ddd-ts/core";
2
+ import { DefaultConverter, FirestoreTransaction } from "@ddd-ts/store-firestore";
3
3
  import { Firestore, WriteBatch } from "firebase-admin/firestore";
4
4
  import * as _ddd_ts_shape0 from "@ddd-ts/shape";
5
5
  import { Mapping, MicrosecondTimestamp } from "@ddd-ts/shape";
@@ -1,6 +1,6 @@
1
- import { DefaultConverter } from "@ddd-ts/store-firestore";
2
- import { Cursor, EventId, Lock } from "@ddd-ts/core";
3
- import { FieldValue, Timestamp } from "firebase-admin/firestore";
1
+ import { CheckpointId, Cursor, ESProjection, EventId, IEsEvent, IFact, ISavedChange, Lock, ProjectedStream, ProjectedStreamReader, Serialized } from "@ddd-ts/core";
2
+ import { DefaultConverter, FirestoreTransaction } from "@ddd-ts/store-firestore";
3
+ import { FieldValue, Firestore, Timestamp, WriteBatch } from "firebase-admin/firestore";
4
4
  import { Mapping, MicrosecondTimestamp, Optional, Shape } from "@ddd-ts/shape";
5
5
 
6
6
  //#region src/projection/firestore.projector.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ddd-ts/event-sourcing-firestore",
3
- "version": "0.0.0-compute-timeout-on-process.5",
3
+ "version": "0.0.0-compute-timeout-on-process.7",
4
4
  "types": "dist/index.d.ts",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -10,19 +10,19 @@
10
10
  "dist"
11
11
  ],
12
12
  "dependencies": {
13
- "@ddd-ts/core": "0.0.0-compute-timeout-on-process.5",
14
- "@ddd-ts/shape": "0.0.0-compute-timeout-on-process.5",
15
- "@ddd-ts/store-firestore": "0.0.0-compute-timeout-on-process.5",
16
- "@ddd-ts/traits": "0.0.0-compute-timeout-on-process.5",
17
- "@ddd-ts/types": "0.0.0-compute-timeout-on-process.5",
13
+ "@ddd-ts/core": "0.0.0-compute-timeout-on-process.7",
14
+ "@ddd-ts/shape": "0.0.0-compute-timeout-on-process.7",
15
+ "@ddd-ts/store-firestore": "0.0.0-compute-timeout-on-process.7",
16
+ "@ddd-ts/traits": "0.0.0-compute-timeout-on-process.7",
17
+ "@ddd-ts/types": "0.0.0-compute-timeout-on-process.7",
18
18
  "@opentelemetry/api": "1.6.0",
19
19
  "firebase-admin": "^13.2.0"
20
20
  },
21
21
  "devDependencies": {
22
- "@ddd-ts/shape": "0.0.0-compute-timeout-on-process.5",
23
- "@ddd-ts/tests": "0.0.0-compute-timeout-on-process.5",
24
- "@ddd-ts/tools": "0.0.0-compute-timeout-on-process.5",
25
- "@ddd-ts/types": "0.0.0-compute-timeout-on-process.5",
22
+ "@ddd-ts/shape": "0.0.0-compute-timeout-on-process.7",
23
+ "@ddd-ts/tests": "0.0.0-compute-timeout-on-process.7",
24
+ "@ddd-ts/tools": "0.0.0-compute-timeout-on-process.7",
25
+ "@ddd-ts/types": "0.0.0-compute-timeout-on-process.7",
26
26
  "@types/jest": "^29.5.1"
27
27
  },
28
28
  "exports": {