@ddd-ts/event-sourcing-firestore 0.0.37 → 0.0.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/_virtual/_rolldown/runtime.js +29 -0
- package/dist/firestore.event-lake.aggregate-store.d.ts +35 -0
- package/dist/firestore.event-lake.aggregate-store.d.ts.map +1 -0
- package/dist/firestore.event-lake.aggregate-store.js +38 -0
- package/dist/firestore.event-lake.aggregate-store.mjs +36 -0
- package/dist/firestore.event-lake.aggregate-store.spec.d.ts +2 -0
- package/dist/firestore.event-lake.aggregate-store.spec.d.ts.map +1 -0
- package/dist/firestore.event-lake.storage-layer.d.ts +14 -0
- package/dist/firestore.event-lake.storage-layer.d.ts.map +1 -0
- package/dist/firestore.event-lake.storage-layer.js +67 -0
- package/dist/firestore.event-lake.storage-layer.mjs +65 -0
- package/dist/firestore.event-lake.store.d.ts +6 -0
- package/dist/firestore.event-lake.store.d.ts.map +1 -0
- package/dist/firestore.event-lake.store.js +14 -0
- package/dist/firestore.event-lake.store.mjs +13 -0
- package/dist/firestore.event-lake.store.spec.d.ts +2 -0
- package/dist/firestore.event-lake.store.spec.d.ts.map +1 -0
- package/dist/firestore.event-stream-store.spec.d.ts +2 -0
- package/dist/firestore.event-stream-store.spec.d.ts.map +1 -0
- package/dist/firestore.event-stream.aggregate-store.d.ts +30 -0
- package/dist/firestore.event-stream.aggregate-store.d.ts.map +1 -0
- package/dist/firestore.event-stream.aggregate-store.js +38 -0
- package/dist/firestore.event-stream.aggregate-store.mjs +36 -0
- package/dist/firestore.event-stream.aggregate-store.spec.d.ts +2 -0
- package/dist/firestore.event-stream.aggregate-store.spec.d.ts.map +1 -0
- package/dist/firestore.event-stream.storage-layer.d.ts +15 -0
- package/dist/firestore.event-stream.storage-layer.d.ts.map +1 -0
- package/dist/firestore.event-stream.storage-layer.js +67 -0
- package/dist/firestore.event-stream.storage-layer.mjs +65 -0
- package/dist/firestore.event-stream.store.d.ts +6 -0
- package/dist/firestore.event-stream.store.d.ts.map +1 -0
- package/dist/firestore.event-stream.store.js +14 -0
- package/dist/firestore.event-stream.store.mjs +13 -0
- package/dist/firestore.projected-stream.reader.d.ts +13 -0
- package/dist/firestore.projected-stream.reader.d.ts.map +1 -0
- package/dist/firestore.projected-stream.reader.js +35 -0
- package/dist/firestore.projected-stream.reader.mjs +34 -0
- package/dist/firestore.projected-stream.reader.spec.d.ts +2 -0
- package/dist/firestore.projected-stream.reader.spec.d.ts.map +1 -0
- package/dist/firestore.projected-stream.storage-layer.d.ts +31 -0
- package/dist/firestore.projected-stream.storage-layer.d.ts.map +1 -0
- package/dist/firestore.projected-stream.storage-layer.js +121 -0
- package/dist/firestore.projected-stream.storage-layer.mjs +118 -0
- package/dist/firestore.snapshotter.d.ts +6 -0
- package/dist/firestore.snapshotter.d.ts.map +1 -0
- package/dist/firestore.snapshotter.js +36 -0
- package/dist/firestore.snapshotter.mjs +35 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.mjs +12 -0
- package/dist/projection/cases/attempts.spec.d.ts +2 -0
- package/dist/projection/cases/attempts.spec.d.ts.map +1 -0
- package/dist/projection/cases/batchlast.spec.d.ts +2 -0
- package/dist/projection/cases/batchlast.spec.d.ts.map +1 -0
- package/dist/projection/cases/bigshuffle.spec.d.ts +2 -0
- package/dist/projection/cases/bigshuffle.spec.d.ts.map +1 -0
- package/dist/projection/cases/burst.spec.d.ts +2 -0
- package/dist/projection/cases/burst.spec.d.ts.map +1 -0
- package/dist/projection/cases/claimtimeout.spec.d.ts +2 -0
- package/dist/projection/cases/claimtimeout.spec.d.ts.map +1 -0
- package/dist/projection/cases/concurrency.spec.d.ts +2 -0
- package/dist/projection/cases/concurrency.spec.d.ts.map +1 -0
- package/dist/projection/cases/deduplicate.spec.d.ts +2 -0
- package/dist/projection/cases/deduplicate.spec.d.ts.map +1 -0
- package/dist/projection/cases/defer.spec.d.ts +2 -0
- package/dist/projection/cases/defer.spec.d.ts.map +1 -0
- package/dist/projection/cases/lock.spec.d.ts +2 -0
- package/dist/projection/cases/lock.spec.d.ts.map +1 -0
- package/dist/projection/cases/skip.spec.d.ts +2 -0
- package/dist/projection/cases/skip.spec.d.ts.map +1 -0
- package/dist/projection/cases/stress.spec.d.ts +2 -0
- package/dist/projection/cases/stress.spec.d.ts.map +1 -0
- package/dist/projection/firestore.projector.d.ts +130 -0
- package/dist/projection/firestore.projector.d.ts.map +1 -0
- package/dist/projection/firestore.projector.js +484 -0
- package/dist/projection/firestore.projector.mjs +479 -0
- package/dist/projection/testkit/case-fixture.d.ts +610 -0
- package/dist/projection/testkit/case-fixture.d.ts.map +1 -0
- package/dist/projection/testkit.d.ts +44 -0
- package/dist/projection/testkit.d.ts.map +1 -0
- package/dist/projection/trace.decorator.d.ts +2 -0
- package/dist/projection/trace.decorator.d.ts.map +1 -0
- package/package.json +43 -41
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2023 Aetherall
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
//#region \0rolldown/runtime.js
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __copyProps = (to, from, except, desc) => {
|
|
9
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
10
|
+
for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
|
|
11
|
+
key = keys[i];
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except) {
|
|
13
|
+
__defProp(to, key, {
|
|
14
|
+
get: ((k) => from[k]).bind(null, key),
|
|
15
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return to;
|
|
21
|
+
};
|
|
22
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
|
|
23
|
+
value: mod,
|
|
24
|
+
enumerable: true
|
|
25
|
+
}) : target, mod));
|
|
26
|
+
|
|
27
|
+
//#endregion
|
|
28
|
+
|
|
29
|
+
exports.__toESM = __toESM;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type ISerializer, type IEventSourced, type IIdentifiable, type EventOf, EventLakeStore, LakeId, type IEventBus, EventSourced, Identifiable } from "@ddd-ts/core";
|
|
2
|
+
import { FirestoreStore, FirestoreTransaction, FirestoreTransactionPerformer } from "@ddd-ts/store-firestore";
|
|
3
|
+
import { CollectionReference } from "firebase-admin/firestore";
|
|
4
|
+
import type { HasTrait } from "@ddd-ts/traits";
|
|
5
|
+
export declare const MakeFirestoreEventLakeAggregateStore: <A extends HasTrait<typeof EventSourced> & HasTrait<typeof Identifiable>>(AGGREGATE: A) => abstract new (collection: CollectionReference, serializer: ISerializer<InstanceType<A>> & ISerializer<EventOf<InstanceType<A>>>, eventBus?: IEventBus) => {
|
|
6
|
+
getLakeId(instance: InstanceType<A>): LakeId;
|
|
7
|
+
transaction: FirestoreTransactionPerformer;
|
|
8
|
+
lakeStore: EventLakeStore<EventOf<InstanceType<A>>>;
|
|
9
|
+
save(aggregate: InstanceType<A>, trx?: FirestoreTransaction): Promise<void>;
|
|
10
|
+
defaultConverter: import("@ddd-ts/store-firestore").DefaultConverter<FirebaseFirestore.DocumentData>;
|
|
11
|
+
readonly _collection: CollectionReference;
|
|
12
|
+
readonly serializer: ISerializer<InstanceType<A>, {}>;
|
|
13
|
+
readonly $name?: string | undefined;
|
|
14
|
+
readonly firestore: FirebaseFirestore.Firestore;
|
|
15
|
+
readonly collection: CollectionReference<import("@ddd-ts/core").Serialized<S>, import("@ddd-ts/core").Serialized<S>>;
|
|
16
|
+
executeQuery(query: FirebaseFirestore.Query<any>, trx?: FirestoreTransaction): Promise<InstanceType<A>[]>;
|
|
17
|
+
streamPages(query: FirebaseFirestore.Query<any>, pageSize: number): AsyncGenerator<FirebaseFirestore.QueryDocumentSnapshot<any, FirebaseFirestore.DocumentData>, void, unknown>;
|
|
18
|
+
streamQuery(query: FirebaseFirestore.Query<any>, pageSize?: number): AsyncIterable<InstanceType<A>>;
|
|
19
|
+
saveAll(models: InstanceType<A>[], trx?: FirestoreTransaction): Promise<void>;
|
|
20
|
+
load(id: InstanceType<A>["id"], trx?: FirestoreTransaction): Promise<InstanceType<A> | undefined>;
|
|
21
|
+
loadAll(transaction?: FirestoreTransaction): Promise<InstanceType<A>[]>;
|
|
22
|
+
delete(id: InstanceType<A>["id"], trx?: FirestoreTransaction): Promise<void>;
|
|
23
|
+
loadMany(ids: InstanceType<A>["id"][], trx?: FirestoreTransaction): Promise<InstanceType<A>[]>;
|
|
24
|
+
streamAll(pageSize?: number): AsyncIterable<InstanceType<A>>;
|
|
25
|
+
countAll(): Promise<number>;
|
|
26
|
+
count(query: FirebaseFirestore.Query<FirebaseFirestore.DocumentData>): Promise<number>;
|
|
27
|
+
};
|
|
28
|
+
export declare abstract class FirestoreEventLakeAggregateStore<A extends IEventSourced & IIdentifiable> extends FirestoreStore<A> {
|
|
29
|
+
transaction: FirestoreTransactionPerformer;
|
|
30
|
+
lakeStore: EventLakeStore<EventOf<A>>;
|
|
31
|
+
constructor(collection: CollectionReference, serializer: ISerializer<EventOf<A>> & ISerializer<A>, eventBus?: IEventBus, $name?: string);
|
|
32
|
+
abstract getLakeId(instance: A): LakeId;
|
|
33
|
+
save(aggregate: A, trx?: FirestoreTransaction): Promise<void>;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=firestore.event-lake.aggregate-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firestore.event-lake.aggregate-store.d.ts","sourceRoot":"","sources":["../src/firestore.event-lake.aggregate-store.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,OAAO,EACZ,cAAc,EACd,MAAM,EAEN,KAAK,SAAS,EACd,YAAY,EACZ,YAAY,EACb,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,6BAA6B,EAC9B,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,eAAO,MAAM,oCAAoC,GAC/C,CAAC,SAAS,QAAQ,CAAC,OAAO,YAAY,CAAC,GAAG,QAAQ,CAAC,OAAO,YAAY,CAAC,aAE5D,CAAC,+BAMI,mBAAmB,cACnB,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GACtC,WAAW,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,aAC5B,SAAS;wBAKO,YAAY,CAAC,CAAC,CAAC,GAAG,MAAM;iBAS1C,6BAA6B;;2CAsBF,oBAAoB;;;;;;;wBApCxD,kBAAkB,KACvB;uBAc8B,kBACtB,KAAK;uBAuB0C,kBAC3C,KAAK;;;;;;;;iBAQs8E,kBAAmB,KAAK;CAvC/+E,CAAC;AAEF,8BAAsB,gCAAgC,CACpD,CAAC,SAAS,aAAa,GAAG,aAAa,CACvC,SAAQ,cAAc,CAAC,CAAC,CAAC;IACzB,WAAW,EAAE,6BAA6B,CAAC;IAC3C,SAAS,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;gBAEpC,UAAU,EAAE,mBAAmB,EAC/B,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,EACpD,QAAQ,CAAC,EAAE,SAAS,EACpB,KAAK,CAAC,EAAE,MAAM;IAchB,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,GAAG,MAAM;IAExB,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,oBAAoB;CAW7D"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
const require_runtime = require('./_virtual/_rolldown/runtime.js');
|
|
2
|
+
const require_firestore_event_lake_storage_layer = require('./firestore.event-lake.storage-layer.js');
|
|
3
|
+
let _ddd_ts_core = require("@ddd-ts/core");
|
|
4
|
+
let _ddd_ts_store_firestore = require("@ddd-ts/store-firestore");
|
|
5
|
+
let firebase_admin_firestore = require("firebase-admin/firestore");
|
|
6
|
+
|
|
7
|
+
//#region src/firestore.event-lake.aggregate-store.ts
|
|
8
|
+
const MakeFirestoreEventLakeAggregateStore = (AGGREGATE) => {
|
|
9
|
+
class $FirestoreEventLakeAggregateStore extends FirestoreEventLakeAggregateStore {
|
|
10
|
+
constructor(collection, serializer, eventBus) {
|
|
11
|
+
super(collection, serializer, eventBus, AGGREGATE.name);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return $FirestoreEventLakeAggregateStore;
|
|
15
|
+
};
|
|
16
|
+
var FirestoreEventLakeAggregateStore = class extends _ddd_ts_store_firestore.FirestoreStore {
|
|
17
|
+
transaction;
|
|
18
|
+
lakeStore;
|
|
19
|
+
constructor(collection, serializer, eventBus, $name) {
|
|
20
|
+
super(collection, serializer, $name);
|
|
21
|
+
const storageLayer = new require_firestore_event_lake_storage_layer.FirestoreEventLakeStorageLayer(collection.firestore);
|
|
22
|
+
this.transaction = new _ddd_ts_store_firestore.FirestoreTransactionPerformer(collection.firestore);
|
|
23
|
+
this.lakeStore = new _ddd_ts_core.EventLakeStore(storageLayer, serializer, eventBus);
|
|
24
|
+
}
|
|
25
|
+
async save(aggregate, trx) {
|
|
26
|
+
const changes = [...aggregate.changes];
|
|
27
|
+
await this.transaction.performWith(trx, async (trx) => {
|
|
28
|
+
const lakeId = this.getLakeId(aggregate);
|
|
29
|
+
await super.save(aggregate, trx);
|
|
30
|
+
await this.lakeStore.append(lakeId, changes, trx);
|
|
31
|
+
aggregate.clearChanges();
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
//#endregion
|
|
37
|
+
exports.FirestoreEventLakeAggregateStore = FirestoreEventLakeAggregateStore;
|
|
38
|
+
exports.MakeFirestoreEventLakeAggregateStore = MakeFirestoreEventLakeAggregateStore;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { FirestoreEventLakeStorageLayer } from "./firestore.event-lake.storage-layer.mjs";
|
|
2
|
+
import { EventLakeStore } from "@ddd-ts/core";
|
|
3
|
+
import { FirestoreStore, FirestoreTransactionPerformer } from "@ddd-ts/store-firestore";
|
|
4
|
+
import "firebase-admin/firestore";
|
|
5
|
+
|
|
6
|
+
//#region src/firestore.event-lake.aggregate-store.ts
|
|
7
|
+
const MakeFirestoreEventLakeAggregateStore = (AGGREGATE) => {
|
|
8
|
+
class $FirestoreEventLakeAggregateStore extends FirestoreEventLakeAggregateStore {
|
|
9
|
+
constructor(collection, serializer, eventBus) {
|
|
10
|
+
super(collection, serializer, eventBus, AGGREGATE.name);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
return $FirestoreEventLakeAggregateStore;
|
|
14
|
+
};
|
|
15
|
+
var FirestoreEventLakeAggregateStore = class extends FirestoreStore {
|
|
16
|
+
transaction;
|
|
17
|
+
lakeStore;
|
|
18
|
+
constructor(collection, serializer, eventBus, $name) {
|
|
19
|
+
super(collection, serializer, $name);
|
|
20
|
+
const storageLayer = new FirestoreEventLakeStorageLayer(collection.firestore);
|
|
21
|
+
this.transaction = new FirestoreTransactionPerformer(collection.firestore);
|
|
22
|
+
this.lakeStore = new EventLakeStore(storageLayer, serializer, eventBus);
|
|
23
|
+
}
|
|
24
|
+
async save(aggregate, trx) {
|
|
25
|
+
const changes = [...aggregate.changes];
|
|
26
|
+
await this.transaction.performWith(trx, async (trx) => {
|
|
27
|
+
const lakeId = this.getLakeId(aggregate);
|
|
28
|
+
await super.save(aggregate, trx);
|
|
29
|
+
await this.lakeStore.append(lakeId, changes, trx);
|
|
30
|
+
aggregate.clearChanges();
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
//#endregion
|
|
36
|
+
export { FirestoreEventLakeAggregateStore, MakeFirestoreEventLakeAggregateStore };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firestore.event-lake.aggregate-store.spec.d.ts","sourceRoot":"","sources":["../src/firestore.event-lake.aggregate-store.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { LakeId, EventId, type ISerializedChange, type ISerializedFact, type EventLakeStorageLayer } from "@ddd-ts/core";
|
|
2
|
+
import type { ISerializedSavedChange } from "@ddd-ts/core/dist/interfaces/es-event";
|
|
3
|
+
import { DefaultConverter, FirestoreTransaction } from "@ddd-ts/store-firestore";
|
|
4
|
+
import * as fb from "firebase-admin";
|
|
5
|
+
export declare const serverTimestamp: typeof fb.firestore.FieldValue.serverTimestamp;
|
|
6
|
+
export declare class FirestoreEventLakeStorageLayer implements EventLakeStorageLayer {
|
|
7
|
+
readonly firestore: fb.firestore.Firestore;
|
|
8
|
+
readonly converter: DefaultConverter<fb.firestore.DocumentData>;
|
|
9
|
+
constructor(firestore: fb.firestore.Firestore, converter?: DefaultConverter<fb.firestore.DocumentData>);
|
|
10
|
+
getCollection(lakeId: LakeId): fb.firestore.CollectionReference<fb.firestore.DocumentData, fb.firestore.DocumentData>;
|
|
11
|
+
append(lakeId: LakeId, changes: ISerializedChange[], trx: FirestoreTransaction): Promise<ISerializedSavedChange[]>;
|
|
12
|
+
read(lakeId: LakeId, startAfter?: EventId, endAt?: EventId): AsyncIterable<ISerializedFact>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=firestore.event-lake.storage-layer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firestore.event-lake.storage-layer.d.ts","sourceRoot":"","sources":["../src/firestore.event-lake.storage-layer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,OAAO,EACP,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC3B,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAEpF,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAErC,eAAO,MAAM,eAAe,gDAA0C,CAAC;AAEvE,qBAAa,8BAA+B,YAAW,qBAAqB;aAExD,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,SAAS;aACjC,SAAS;gBADT,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,SAAS,EACjC,SAAS,8CAAyB;IAGpD,aAAa,CAAC,MAAM,EAAE,MAAM;IAStB,MAAM,CACV,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,iBAAiB,EAAE,EAC5B,GAAG,EAAE,oBAAoB;IA+BpB,IAAI,CACT,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,OAAO,EACpB,KAAK,CAAC,EAAE,OAAO,GACd,aAAa,CAAC,eAAe,CAAC;CA2ClC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
const require_runtime = require('./_virtual/_rolldown/runtime.js');
|
|
2
|
+
let _ddd_ts_core = require("@ddd-ts/core");
|
|
3
|
+
let _ddd_ts_store_firestore = require("@ddd-ts/store-firestore");
|
|
4
|
+
let firebase_admin = require("firebase-admin");
|
|
5
|
+
firebase_admin = require_runtime.__toESM(firebase_admin);
|
|
6
|
+
|
|
7
|
+
//#region src/firestore.event-lake.storage-layer.ts
|
|
8
|
+
const serverTimestamp = firebase_admin.firestore.FieldValue.serverTimestamp;
|
|
9
|
+
var FirestoreEventLakeStorageLayer = class {
|
|
10
|
+
constructor(firestore, converter = new _ddd_ts_store_firestore.DefaultConverter()) {
|
|
11
|
+
this.firestore = firestore;
|
|
12
|
+
this.converter = converter;
|
|
13
|
+
}
|
|
14
|
+
getCollection(lakeId) {
|
|
15
|
+
return this.firestore.collection("event-store").doc("Lakes").collection(lakeId.shardType).doc(lakeId.shardId).collection("events");
|
|
16
|
+
}
|
|
17
|
+
async append(lakeId, changes, trx) {
|
|
18
|
+
const collection = this.getCollection(lakeId);
|
|
19
|
+
const result = [];
|
|
20
|
+
for (const change of changes) {
|
|
21
|
+
const revision = trx.increment();
|
|
22
|
+
const storageChange = {
|
|
23
|
+
eventId: change.id,
|
|
24
|
+
name: change.name,
|
|
25
|
+
payload: change.payload,
|
|
26
|
+
occurredAt: serverTimestamp(),
|
|
27
|
+
version: change.version,
|
|
28
|
+
revision
|
|
29
|
+
};
|
|
30
|
+
const ref = collection.doc(change.id);
|
|
31
|
+
trx.transaction.create(ref, this.converter.toFirestore(storageChange));
|
|
32
|
+
result.push({
|
|
33
|
+
...change,
|
|
34
|
+
ref: ref.path,
|
|
35
|
+
revision,
|
|
36
|
+
occurredAt: void 0
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
async *read(lakeId, startAfter, endAt) {
|
|
42
|
+
const collection = this.getCollection(lakeId);
|
|
43
|
+
const [start, end] = await Promise.all([startAfter ? collection.doc(startAfter.serialize()).get() : null, endAt ? collection.doc(endAt.serialize()).get() : null]);
|
|
44
|
+
if (startAfter && !start?.exists) throw new Error(`StartAfter event not found: ${startAfter}`);
|
|
45
|
+
if (endAt && !end?.exists) throw new Error(`EndAt event not found: ${endAt}`);
|
|
46
|
+
let query = collection.orderBy("occurredAt", "asc").orderBy("revision", "asc");
|
|
47
|
+
if (start) query = query.startAfter(start);
|
|
48
|
+
if (endAt) query = query.endAt(end);
|
|
49
|
+
for await (const event of query.stream()) {
|
|
50
|
+
const e = event;
|
|
51
|
+
const data = this.converter.fromFirestore(e);
|
|
52
|
+
yield {
|
|
53
|
+
id: data.eventId,
|
|
54
|
+
ref: e.ref.path,
|
|
55
|
+
revision: data.revision,
|
|
56
|
+
name: data.name,
|
|
57
|
+
$name: data.name,
|
|
58
|
+
payload: data.payload,
|
|
59
|
+
occurredAt: data.occurredAt,
|
|
60
|
+
version: data.version ?? 1
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
//#endregion
|
|
67
|
+
exports.FirestoreEventLakeStorageLayer = FirestoreEventLakeStorageLayer;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { EventId } from "@ddd-ts/core";
|
|
2
|
+
import { DefaultConverter } from "@ddd-ts/store-firestore";
|
|
3
|
+
import * as fb from "firebase-admin";
|
|
4
|
+
|
|
5
|
+
//#region src/firestore.event-lake.storage-layer.ts
|
|
6
|
+
const serverTimestamp = fb.firestore.FieldValue.serverTimestamp;
|
|
7
|
+
var FirestoreEventLakeStorageLayer = class {
|
|
8
|
+
constructor(firestore, converter = new DefaultConverter()) {
|
|
9
|
+
this.firestore = firestore;
|
|
10
|
+
this.converter = converter;
|
|
11
|
+
}
|
|
12
|
+
getCollection(lakeId) {
|
|
13
|
+
return this.firestore.collection("event-store").doc("Lakes").collection(lakeId.shardType).doc(lakeId.shardId).collection("events");
|
|
14
|
+
}
|
|
15
|
+
async append(lakeId, changes, trx) {
|
|
16
|
+
const collection = this.getCollection(lakeId);
|
|
17
|
+
const result = [];
|
|
18
|
+
for (const change of changes) {
|
|
19
|
+
const revision = trx.increment();
|
|
20
|
+
const storageChange = {
|
|
21
|
+
eventId: change.id,
|
|
22
|
+
name: change.name,
|
|
23
|
+
payload: change.payload,
|
|
24
|
+
occurredAt: serverTimestamp(),
|
|
25
|
+
version: change.version,
|
|
26
|
+
revision
|
|
27
|
+
};
|
|
28
|
+
const ref = collection.doc(change.id);
|
|
29
|
+
trx.transaction.create(ref, this.converter.toFirestore(storageChange));
|
|
30
|
+
result.push({
|
|
31
|
+
...change,
|
|
32
|
+
ref: ref.path,
|
|
33
|
+
revision,
|
|
34
|
+
occurredAt: void 0
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
async *read(lakeId, startAfter, endAt) {
|
|
40
|
+
const collection = this.getCollection(lakeId);
|
|
41
|
+
const [start, end] = await Promise.all([startAfter ? collection.doc(startAfter.serialize()).get() : null, endAt ? collection.doc(endAt.serialize()).get() : null]);
|
|
42
|
+
if (startAfter && !start?.exists) throw new Error(`StartAfter event not found: ${startAfter}`);
|
|
43
|
+
if (endAt && !end?.exists) throw new Error(`EndAt event not found: ${endAt}`);
|
|
44
|
+
let query = collection.orderBy("occurredAt", "asc").orderBy("revision", "asc");
|
|
45
|
+
if (start) query = query.startAfter(start);
|
|
46
|
+
if (endAt) query = query.endAt(end);
|
|
47
|
+
for await (const event of query.stream()) {
|
|
48
|
+
const e = event;
|
|
49
|
+
const data = this.converter.fromFirestore(e);
|
|
50
|
+
yield {
|
|
51
|
+
id: data.eventId,
|
|
52
|
+
ref: e.ref.path,
|
|
53
|
+
revision: data.revision,
|
|
54
|
+
name: data.name,
|
|
55
|
+
$name: data.name,
|
|
56
|
+
payload: data.payload,
|
|
57
|
+
occurredAt: data.occurredAt,
|
|
58
|
+
version: data.version ?? 1
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
//#endregion
|
|
65
|
+
export { FirestoreEventLakeStorageLayer };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { EventLakeStore, type IEsEvent, type IEventBus, type ISerializer } from "@ddd-ts/core";
|
|
2
|
+
import { Firestore } from "firebase-admin/firestore";
|
|
3
|
+
export declare class FirestoreEventLakeStore<Event extends IEsEvent> extends EventLakeStore<Event> {
|
|
4
|
+
constructor(firestore: Firestore, serializer: ISerializer<Event>, eventBus?: IEventBus);
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=firestore.event-lake.store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firestore.event-lake.store.d.ts","sourceRoot":"","sources":["../src/firestore.event-lake.store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAE/F,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAErD,qBAAa,uBAAuB,CAClC,KAAK,SAAS,QAAQ,CACtB,SAAQ,cAAc,CAAC,KAAK,CAAC;gBAE3B,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,WAAW,CAAC,KAAK,CAAC,EAC9B,QAAQ,CAAC,EAAE,SAAS;CAIvB"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
const require_runtime = require('./_virtual/_rolldown/runtime.js');
|
|
2
|
+
const require_firestore_event_lake_storage_layer = require('./firestore.event-lake.storage-layer.js');
|
|
3
|
+
let _ddd_ts_core = require("@ddd-ts/core");
|
|
4
|
+
let firebase_admin_firestore = require("firebase-admin/firestore");
|
|
5
|
+
|
|
6
|
+
//#region src/firestore.event-lake.store.ts
|
|
7
|
+
var FirestoreEventLakeStore = class extends _ddd_ts_core.EventLakeStore {
|
|
8
|
+
constructor(firestore, serializer, eventBus) {
|
|
9
|
+
super(new require_firestore_event_lake_storage_layer.FirestoreEventLakeStorageLayer(firestore), serializer, eventBus);
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
//#endregion
|
|
14
|
+
exports.FirestoreEventLakeStore = FirestoreEventLakeStore;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { FirestoreEventLakeStorageLayer } from "./firestore.event-lake.storage-layer.mjs";
|
|
2
|
+
import { EventLakeStore } from "@ddd-ts/core";
|
|
3
|
+
import "firebase-admin/firestore";
|
|
4
|
+
|
|
5
|
+
//#region src/firestore.event-lake.store.ts
|
|
6
|
+
var FirestoreEventLakeStore = class extends EventLakeStore {
|
|
7
|
+
constructor(firestore, serializer, eventBus) {
|
|
8
|
+
super(new FirestoreEventLakeStorageLayer(firestore), serializer, eventBus);
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
//#endregion
|
|
13
|
+
export { FirestoreEventLakeStore };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firestore.event-lake.store.spec.d.ts","sourceRoot":"","sources":["../src/firestore.event-lake.store.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firestore.event-stream-store.spec.d.ts","sourceRoot":"","sources":["../src/firestore.event-stream-store.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { HasTrait } from "@ddd-ts/traits";
|
|
2
|
+
import { StreamId, type EventsOf, EventSourced, type Identifiable, type IEventBus, EventStreamStore, EventStreamAggregateStore, type ISerializer, type IEventSourced, type IIdentifiable, type EventOf } from "@ddd-ts/core";
|
|
3
|
+
import { FirestoreSnapshotter } from "./firestore.snapshotter";
|
|
4
|
+
import { Firestore } from "firebase-admin/firestore";
|
|
5
|
+
export declare const MakeFirestoreEventStreamAggregateStore: <A extends HasTrait<typeof EventSourced> & HasTrait<typeof Identifiable>>(AGGREGATE: A) => {
|
|
6
|
+
new (firestore: Firestore, serializer: ISerializer<InstanceType<A>> & ISerializer<EventOf<InstanceType<A>>>, eventBus?: IEventBus): {
|
|
7
|
+
loadFirst(event: EventsOf<A>[number]): InstanceType<A>;
|
|
8
|
+
getStreamId(id: InstanceType<A>["id"]): StreamId;
|
|
9
|
+
readonly firestore: Firestore;
|
|
10
|
+
readonly serializer: ISerializer<EventOf<InstanceType<A>>, {}>;
|
|
11
|
+
readonly snapshotter: FirestoreSnapshotter<InstanceType<A>>;
|
|
12
|
+
readonly eventBus?: IEventBus | undefined;
|
|
13
|
+
readonly streamStore: EventStreamStore<EventOf<InstanceType<A>>>;
|
|
14
|
+
readonly transaction: import("@ddd-ts/core").TransactionPerformer;
|
|
15
|
+
loadFromSnapshot(snapshot: InstanceType<A>): Promise<InstanceType<A>>;
|
|
16
|
+
loadFromScratch(id: InstanceType<A>["id"]): Promise<InstanceType<A> | undefined>;
|
|
17
|
+
loadForce(id: InstanceType<A>["id"]): Promise<InstanceType<A> | undefined>;
|
|
18
|
+
load(id: InstanceType<A>["id"]): Promise<InstanceType<A> | undefined>;
|
|
19
|
+
saveAll(aggregates: InstanceType<A>[], parentTrx?: import("@ddd-ts/core").Transaction, attempts?: number): Promise<void>;
|
|
20
|
+
save(aggregate: InstanceType<A>, trx?: import("@ddd-ts/core").Transaction, attempts?: number): Promise<void>;
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
export declare abstract class FirestoreEventStreamAggregateStore<A extends IEventSourced & IIdentifiable> extends EventStreamAggregateStore<A> {
|
|
24
|
+
readonly firestore: Firestore;
|
|
25
|
+
readonly serializer: ISerializer<EventOf<A>>;
|
|
26
|
+
readonly snapshotter: FirestoreSnapshotter<A>;
|
|
27
|
+
readonly eventBus?: IEventBus | undefined;
|
|
28
|
+
constructor(firestore: Firestore, serializer: ISerializer<EventOf<A>>, snapshotter: FirestoreSnapshotter<A>, eventBus?: IEventBus | undefined);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=firestore.event-stream.aggregate-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firestore.event-stream.aggregate-store.d.ts","sourceRoot":"","sources":["../src/firestore.event-stream.aggregate-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EACL,QAAQ,EACR,KAAK,QAAQ,EACb,YAAY,EACZ,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,gBAAgB,EAChB,yBAAyB,EACzB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,OAAO,EACb,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAErD,eAAO,MAAM,sCAAsC,GACjD,CAAC,SAAS,QAAQ,CAAC,OAAO,YAAY,CAAC,GAAG,QAAQ,CAAC,OAAO,YAAY,CAAC,aAE5D,CAAC;oBAMG,SAAS,cACR,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GACtC,WAAW,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,aAC5B,SAAS;yBAUL,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;wBAItC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,QAAQ;4BAUrB,SAAS;;;4BAGT,SAAS;;;;;;;;;;CATvC,CAAC;AAEF,8BAAsB,kCAAkC,CACtD,CAAC,SAAS,aAAa,GAAG,aAAa,CACvC,SAAQ,yBAAyB,CAAC,CAAC,CAAC;aAElB,SAAS,EAAE,SAAS;aACpB,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;aACnC,WAAW,EAAE,oBAAoB,CAAC,CAAC,CAAC;aACpC,QAAQ,CAAC,EAAE,SAAS;gBAHpB,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EACnC,WAAW,EAAE,oBAAoB,CAAC,CAAC,CAAC,EACpC,QAAQ,CAAC,EAAE,SAAS,YAAA;CAWvC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
const require_runtime = require('./_virtual/_rolldown/runtime.js');
|
|
2
|
+
const require_firestore_event_stream_storage_layer = require('./firestore.event-stream.storage-layer.js');
|
|
3
|
+
const require_firestore_snapshotter = require('./firestore.snapshotter.js');
|
|
4
|
+
let _ddd_ts_core = require("@ddd-ts/core");
|
|
5
|
+
let _ddd_ts_store_firestore = require("@ddd-ts/store-firestore");
|
|
6
|
+
let firebase_admin_firestore = require("firebase-admin/firestore");
|
|
7
|
+
|
|
8
|
+
//#region src/firestore.event-stream.aggregate-store.ts
|
|
9
|
+
const MakeFirestoreEventStreamAggregateStore = (AGGREGATE) => {
|
|
10
|
+
return class $FirestoreEventStreamAggregateStore extends FirestoreEventStreamAggregateStore {
|
|
11
|
+
constructor(firestore, serializer, eventBus) {
|
|
12
|
+
const snapshotter = new require_firestore_snapshotter.FirestoreSnapshotter(AGGREGATE.name, firestore, serializer);
|
|
13
|
+
super(firestore, serializer, snapshotter, eventBus);
|
|
14
|
+
}
|
|
15
|
+
loadFirst(event) {
|
|
16
|
+
return AGGREGATE.loadFirst(event);
|
|
17
|
+
}
|
|
18
|
+
getStreamId(id) {
|
|
19
|
+
return _ddd_ts_core.StreamId.from(AGGREGATE.name, id.serialize());
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
var FirestoreEventStreamAggregateStore = class extends _ddd_ts_core.EventStreamAggregateStore {
|
|
24
|
+
constructor(firestore, serializer, snapshotter, eventBus) {
|
|
25
|
+
const storageLayer = new require_firestore_event_stream_storage_layer.FirestoreEventStreamStorageLayer(firestore);
|
|
26
|
+
const transaction = new _ddd_ts_store_firestore.FirestoreTransactionPerformer(firestore);
|
|
27
|
+
const streamStore = new _ddd_ts_core.EventStreamStore(storageLayer, serializer, eventBus);
|
|
28
|
+
super(streamStore, transaction, snapshotter);
|
|
29
|
+
this.firestore = firestore;
|
|
30
|
+
this.serializer = serializer;
|
|
31
|
+
this.snapshotter = snapshotter;
|
|
32
|
+
this.eventBus = eventBus;
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
//#endregion
|
|
37
|
+
exports.FirestoreEventStreamAggregateStore = FirestoreEventStreamAggregateStore;
|
|
38
|
+
exports.MakeFirestoreEventStreamAggregateStore = MakeFirestoreEventStreamAggregateStore;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { FirestoreEventStreamStorageLayer } from "./firestore.event-stream.storage-layer.mjs";
|
|
2
|
+
import { FirestoreSnapshotter } from "./firestore.snapshotter.mjs";
|
|
3
|
+
import { EventStreamAggregateStore, EventStreamStore, StreamId } from "@ddd-ts/core";
|
|
4
|
+
import { FirestoreTransactionPerformer } from "@ddd-ts/store-firestore";
|
|
5
|
+
import "firebase-admin/firestore";
|
|
6
|
+
|
|
7
|
+
//#region src/firestore.event-stream.aggregate-store.ts
|
|
8
|
+
const MakeFirestoreEventStreamAggregateStore = (AGGREGATE) => {
|
|
9
|
+
return class $FirestoreEventStreamAggregateStore extends FirestoreEventStreamAggregateStore {
|
|
10
|
+
constructor(firestore, serializer, eventBus) {
|
|
11
|
+
const snapshotter = new FirestoreSnapshotter(AGGREGATE.name, firestore, serializer);
|
|
12
|
+
super(firestore, serializer, snapshotter, eventBus);
|
|
13
|
+
}
|
|
14
|
+
loadFirst(event) {
|
|
15
|
+
return AGGREGATE.loadFirst(event);
|
|
16
|
+
}
|
|
17
|
+
getStreamId(id) {
|
|
18
|
+
return StreamId.from(AGGREGATE.name, id.serialize());
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
var FirestoreEventStreamAggregateStore = class extends EventStreamAggregateStore {
|
|
23
|
+
constructor(firestore, serializer, snapshotter, eventBus) {
|
|
24
|
+
const storageLayer = new FirestoreEventStreamStorageLayer(firestore);
|
|
25
|
+
const transaction = new FirestoreTransactionPerformer(firestore);
|
|
26
|
+
const streamStore = new EventStreamStore(storageLayer, serializer, eventBus);
|
|
27
|
+
super(streamStore, transaction, snapshotter);
|
|
28
|
+
this.firestore = firestore;
|
|
29
|
+
this.serializer = serializer;
|
|
30
|
+
this.snapshotter = snapshotter;
|
|
31
|
+
this.eventBus = eventBus;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
//#endregion
|
|
36
|
+
export { FirestoreEventStreamAggregateStore, MakeFirestoreEventStreamAggregateStore };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firestore.event-stream.aggregate-store.spec.d.ts","sourceRoot":"","sources":["../src/firestore.event-stream.aggregate-store.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { StreamId, type ISerializedChange, type ISerializedFact, type EventStreamStorageLayer } from "@ddd-ts/core";
|
|
2
|
+
import type { ISerializedSavedChange } from "@ddd-ts/core/dist/interfaces/es-event";
|
|
3
|
+
import { DefaultConverter, FirestoreTransaction } from "@ddd-ts/store-firestore";
|
|
4
|
+
import * as fb from "firebase-admin";
|
|
5
|
+
export declare const serverTimestamp: typeof fb.firestore.FieldValue.serverTimestamp;
|
|
6
|
+
export declare class FirestoreEventStreamStorageLayer implements EventStreamStorageLayer {
|
|
7
|
+
readonly firestore: fb.firestore.Firestore;
|
|
8
|
+
readonly converter: DefaultConverter<fb.firestore.DocumentData>;
|
|
9
|
+
constructor(firestore: fb.firestore.Firestore, converter?: DefaultConverter<fb.firestore.DocumentData>);
|
|
10
|
+
isLocalRevisionOutdatedError(error: unknown): boolean;
|
|
11
|
+
getCollection(streamId: StreamId): fb.firestore.CollectionReference<fb.firestore.DocumentData, fb.firestore.DocumentData>;
|
|
12
|
+
append(streamId: StreamId, changes: ISerializedChange[], expectedRevision: number, trx: FirestoreTransaction): Promise<ISerializedSavedChange[]>;
|
|
13
|
+
read(streamId: StreamId, startAt?: number): AsyncIterable<ISerializedFact>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=firestore.event-stream.storage-layer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firestore.event-stream.storage-layer.d.ts","sourceRoot":"","sources":["../src/firestore.event-stream.storage-layer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,uBAAuB,EAC7B,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAEpF,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAErC,eAAO,MAAM,eAAe,gDAA0C,CAAC;AAEvE,qBAAa,gCACX,YAAW,uBAAuB;aAGhB,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,SAAS;aACjC,SAAS;gBADT,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,SAAS,EACjC,SAAS,8CAAyB;IAGpD,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IASrD,aAAa,CAAC,QAAQ,EAAE,QAAQ;IAS1B,MAAM,CACV,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,iBAAiB,EAAE,EAC5B,gBAAgB,EAAE,MAAM,EACxB,GAAG,EAAE,oBAAoB;IAkCpB,IAAI,CACT,QAAQ,EAAE,QAAQ,EAClB,OAAO,CAAC,EAAE,MAAM,GACf,aAAa,CAAC,eAAe,CAAC;CAsBlC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
const require_runtime = require('./_virtual/_rolldown/runtime.js');
|
|
2
|
+
let _ddd_ts_core = require("@ddd-ts/core");
|
|
3
|
+
let _ddd_ts_store_firestore = require("@ddd-ts/store-firestore");
|
|
4
|
+
let firebase_admin = require("firebase-admin");
|
|
5
|
+
firebase_admin = require_runtime.__toESM(firebase_admin);
|
|
6
|
+
|
|
7
|
+
//#region src/firestore.event-stream.storage-layer.ts
|
|
8
|
+
const serverTimestamp = firebase_admin.firestore.FieldValue.serverTimestamp;
|
|
9
|
+
var FirestoreEventStreamStorageLayer = class {
|
|
10
|
+
constructor(firestore, converter = new _ddd_ts_store_firestore.DefaultConverter()) {
|
|
11
|
+
this.firestore = firestore;
|
|
12
|
+
this.converter = converter;
|
|
13
|
+
}
|
|
14
|
+
isLocalRevisionOutdatedError(error) {
|
|
15
|
+
return typeof error === "object" && error !== null && "code" in error && error.code === 6;
|
|
16
|
+
}
|
|
17
|
+
getCollection(streamId) {
|
|
18
|
+
return this.firestore.collection("event-store").doc(streamId.aggregateType).collection("streams").doc(streamId.aggregateId).collection("events");
|
|
19
|
+
}
|
|
20
|
+
async append(streamId, changes, expectedRevision, trx) {
|
|
21
|
+
const collection = this.getCollection(streamId);
|
|
22
|
+
const result = [];
|
|
23
|
+
let revision = expectedRevision + 1;
|
|
24
|
+
for (const change of changes) {
|
|
25
|
+
const storageChange = {
|
|
26
|
+
aggregateType: streamId.aggregateType,
|
|
27
|
+
eventId: change.id,
|
|
28
|
+
aggregateId: streamId.aggregateId,
|
|
29
|
+
revision,
|
|
30
|
+
name: change.name,
|
|
31
|
+
payload: change.payload,
|
|
32
|
+
occurredAt: serverTimestamp(),
|
|
33
|
+
version: change.version
|
|
34
|
+
};
|
|
35
|
+
const ref = collection.doc(`${revision}`);
|
|
36
|
+
result.push({
|
|
37
|
+
...change,
|
|
38
|
+
ref: ref.path,
|
|
39
|
+
revision,
|
|
40
|
+
occurredAt: void 0
|
|
41
|
+
});
|
|
42
|
+
trx.transaction.create(ref, this.converter.toFirestore(storageChange));
|
|
43
|
+
revision++;
|
|
44
|
+
}
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
async *read(streamId, startAt) {
|
|
48
|
+
const query = this.getCollection(streamId).where("revision", ">=", startAt || 0).orderBy("revision", "asc");
|
|
49
|
+
for await (const event of query.stream()) {
|
|
50
|
+
const e = event;
|
|
51
|
+
const data = this.converter.fromFirestore(e);
|
|
52
|
+
yield {
|
|
53
|
+
id: data.eventId,
|
|
54
|
+
ref: e.ref.path,
|
|
55
|
+
revision: data.revision,
|
|
56
|
+
name: data.name,
|
|
57
|
+
$name: data.name,
|
|
58
|
+
payload: data.payload,
|
|
59
|
+
occurredAt: data.occurredAt,
|
|
60
|
+
version: data.version ?? 1
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
//#endregion
|
|
67
|
+
exports.FirestoreEventStreamStorageLayer = FirestoreEventStreamStorageLayer;
|