@ddd-ts/event-sourcing-firestore 0.0.36 → 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 +4 -8
- package/dist/firestore.event-lake.aggregate-store.d.ts.map +1 -1
- package/dist/firestore.event-lake.aggregate-store.js +35 -33
- package/dist/firestore.event-lake.aggregate-store.mjs +36 -0
- package/dist/firestore.event-lake.storage-layer.d.ts +2 -2
- package/dist/firestore.event-lake.storage-layer.d.ts.map +1 -1
- package/dist/firestore.event-lake.storage-layer.js +67 -117
- package/dist/firestore.event-lake.storage-layer.mjs +65 -0
- package/dist/firestore.event-lake.store.d.ts +1 -1
- package/dist/firestore.event-lake.store.d.ts.map +1 -1
- package/dist/firestore.event-lake.store.js +14 -12
- package/dist/firestore.event-lake.store.mjs +13 -0
- package/dist/firestore.event-stream.aggregate-store.d.ts +2 -2
- package/dist/firestore.event-stream.aggregate-store.d.ts.map +1 -1
- package/dist/firestore.event-stream.aggregate-store.js +35 -37
- package/dist/firestore.event-stream.aggregate-store.mjs +36 -0
- package/dist/firestore.event-stream.storage-layer.d.ts +2 -2
- package/dist/firestore.event-stream.storage-layer.d.ts.map +1 -1
- package/dist/firestore.event-stream.storage-layer.js +67 -110
- package/dist/firestore.event-stream.storage-layer.mjs +65 -0
- package/dist/firestore.event-stream.store.d.ts +1 -1
- package/dist/firestore.event-stream.store.d.ts.map +1 -1
- package/dist/firestore.event-stream.store.js +14 -12
- package/dist/firestore.event-stream.store.mjs +13 -0
- package/dist/firestore.projected-stream.reader.d.ts +1 -1
- package/dist/firestore.projected-stream.reader.d.ts.map +1 -1
- package/dist/firestore.projected-stream.reader.js +35 -37
- package/dist/firestore.projected-stream.reader.mjs +34 -0
- package/dist/firestore.projected-stream.storage-layer.d.ts +1 -1
- package/dist/firestore.projected-stream.storage-layer.d.ts.map +1 -1
- package/dist/firestore.projected-stream.storage-layer.js +119 -140
- package/dist/firestore.projected-stream.storage-layer.mjs +118 -0
- package/dist/firestore.snapshotter.js +36 -40
- package/dist/firestore.snapshotter.mjs +35 -0
- package/dist/index.js +30 -32
- package/dist/index.mjs +12 -0
- package/dist/projection/firestore.projector.d.ts +1 -1
- package/dist/projection/firestore.projector.d.ts.map +1 -1
- package/dist/projection/firestore.projector.js +477 -630
- package/dist/projection/firestore.projector.mjs +479 -0
- package/dist/projection/testkit/case-fixture.d.ts.map +1 -1
- package/dist/projection/testkit.d.ts +1 -1
- package/dist/projection/testkit.d.ts.map +1 -1
- package/package.json +43 -32
- package/dist/firestore.event-lake.aggregate-store.js.map +0 -1
- package/dist/firestore.event-lake.aggregate-store.spec.js +0 -58
- package/dist/firestore.event-lake.aggregate-store.spec.js.map +0 -1
- package/dist/firestore.event-lake.storage-layer.js.map +0 -1
- package/dist/firestore.event-lake.store.js.map +0 -1
- package/dist/firestore.event-lake.store.spec.js +0 -50
- package/dist/firestore.event-lake.store.spec.js.map +0 -1
- package/dist/firestore.event-stream-store.spec.js +0 -50
- package/dist/firestore.event-stream-store.spec.js.map +0 -1
- package/dist/firestore.event-stream.aggregate-store.js.map +0 -1
- package/dist/firestore.event-stream.aggregate-store.spec.js +0 -54
- package/dist/firestore.event-stream.aggregate-store.spec.js.map +0 -1
- package/dist/firestore.event-stream.storage-layer.js.map +0 -1
- package/dist/firestore.event-stream.store.js.map +0 -1
- package/dist/firestore.projected-stream.reader.js.map +0 -1
- package/dist/firestore.projected-stream.reader.spec.js +0 -54
- package/dist/firestore.projected-stream.reader.spec.js.map +0 -1
- package/dist/firestore.projected-stream.storage-layer.js.map +0 -1
- package/dist/firestore.snapshotter.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/projection/cases/attempts.spec.js +0 -42
- package/dist/projection/cases/attempts.spec.js.map +0 -1
- package/dist/projection/cases/batchlast.spec.js +0 -51
- package/dist/projection/cases/batchlast.spec.js.map +0 -1
- package/dist/projection/cases/bigshuffle.spec.js +0 -59
- package/dist/projection/cases/bigshuffle.spec.js.map +0 -1
- package/dist/projection/cases/burst.spec.js +0 -38
- package/dist/projection/cases/burst.spec.js.map +0 -1
- package/dist/projection/cases/claimtimeout.spec.js +0 -40
- package/dist/projection/cases/claimtimeout.spec.js.map +0 -1
- package/dist/projection/cases/concurrency.spec.js +0 -49
- package/dist/projection/cases/concurrency.spec.js.map +0 -1
- package/dist/projection/cases/deduplicate.spec.js +0 -22
- package/dist/projection/cases/deduplicate.spec.js.map +0 -1
- package/dist/projection/cases/defer.spec.js +0 -44
- package/dist/projection/cases/defer.spec.js.map +0 -1
- package/dist/projection/cases/lock.spec.js +0 -91
- package/dist/projection/cases/lock.spec.js.map +0 -1
- package/dist/projection/cases/skip.spec.js +0 -86
- package/dist/projection/cases/skip.spec.js.map +0 -1
- package/dist/projection/cases/stress.spec.js +0 -73
- package/dist/projection/cases/stress.spec.js.map +0 -1
- package/dist/projection/firestore.projector.js.map +0 -1
- package/dist/projection/testkit/case-fixture.js +0 -341
- package/dist/projection/testkit/case-fixture.js.map +0 -1
- package/dist/projection/testkit.js +0 -77
- package/dist/projection/testkit.js.map +0 -1
- package/dist/projection/trace.decorator.js +0 -35
- package/dist/projection/trace.decorator.js.map +0 -1
|
@@ -1,142 +1,121 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}
|
|
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_firestore = require("firebase-admin/firestore");
|
|
5
|
+
let _ddd_ts_shape = require("@ddd-ts/shape");
|
|
6
|
+
let _ddd_ts_core_dist_components_cursor = require("@ddd-ts/core/dist/components/cursor");
|
|
7
|
+
|
|
8
|
+
//#region src/firestore.projected-stream.storage-layer.ts
|
|
9
|
+
var FirestoreLakeSourceFilter = class {
|
|
10
|
+
filter(shard, lakeSource) {
|
|
11
|
+
return firebase_admin_firestore.Filter.and(firebase_admin_firestore.Filter.where(`payload.${lakeSource.shardKey}`, "==", shard), firebase_admin_firestore.Filter.where("name", "in", lakeSource.events));
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
var FirestoreStreamSourceFilter = class {
|
|
15
|
+
filter(shard, streamSource) {
|
|
16
|
+
return firebase_admin_firestore.Filter.and(firebase_admin_firestore.Filter.where("aggregateType", "==", streamSource.aggregateType), firebase_admin_firestore.Filter.where(`payload.${streamSource.shardKey}`, "==", shard), firebase_admin_firestore.Filter.where("name", "in", streamSource.events));
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
var FirestoreProjectedStreamStorageLayer = class {
|
|
20
|
+
constructor(firestore, converter = new _ddd_ts_store_firestore.DefaultConverter()) {
|
|
21
|
+
this.firestore = firestore;
|
|
22
|
+
this.converter = converter;
|
|
23
|
+
}
|
|
24
|
+
async *read(projectedStream, shard, startAfter, endAt) {
|
|
25
|
+
let query = this.firestore.collectionGroup("events").orderBy("occurredAt").orderBy("revision");
|
|
26
|
+
const filters = projectedStream.sources.map((source) => {
|
|
27
|
+
if (source instanceof _ddd_ts_core.LakeSource) return new FirestoreLakeSourceFilter().filter(shard, source);
|
|
28
|
+
if (source instanceof _ddd_ts_core.StreamSource) return new FirestoreStreamSourceFilter().filter(shard, source);
|
|
29
|
+
throw new Error("Unknown source type");
|
|
30
|
+
});
|
|
31
|
+
query = query.where(firebase_admin_firestore.Filter.or(...filters));
|
|
32
|
+
if (startAfter) {
|
|
33
|
+
const ts = this.microsecondToTimestamp(startAfter.occurredAt);
|
|
34
|
+
query = query.startAfter(ts, startAfter.revision);
|
|
35
|
+
}
|
|
36
|
+
if (endAt) {
|
|
37
|
+
const ts = this.microsecondToTimestamp(endAt.occurredAt);
|
|
38
|
+
query = query.endAt(ts, endAt.revision);
|
|
39
|
+
}
|
|
40
|
+
for await (const doc of query.stream()) {
|
|
41
|
+
const data = this.converter.fromFirestore(doc);
|
|
42
|
+
yield {
|
|
43
|
+
id: data.eventId,
|
|
44
|
+
ref: doc.ref.path,
|
|
45
|
+
revision: data.revision,
|
|
46
|
+
name: data.name,
|
|
47
|
+
$name: data.name,
|
|
48
|
+
payload: data.payload,
|
|
49
|
+
occurredAt: data.occurredAt,
|
|
50
|
+
version: data.version ?? 1
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
microsecondToTimestamp(microseconds) {
|
|
55
|
+
const seconds = BigInt(microseconds.micros) / 1000000n;
|
|
56
|
+
const nanoseconds = BigInt(microseconds.micros) % 1000000n * 1000n;
|
|
57
|
+
return new firebase_admin_firestore.Timestamp(Number(seconds), Number(nanoseconds));
|
|
58
|
+
}
|
|
59
|
+
async get(cursor) {
|
|
60
|
+
const doc = await this.firestore.doc(cursor.ref).get();
|
|
61
|
+
if (!doc.exists) return;
|
|
62
|
+
const data = this.converter.fromFirestoreSnapshot(doc);
|
|
63
|
+
return {
|
|
64
|
+
id: data.eventId,
|
|
65
|
+
ref: doc.ref.path,
|
|
66
|
+
revision: data.revision,
|
|
67
|
+
name: data.name,
|
|
68
|
+
$name: data.name,
|
|
69
|
+
payload: data.payload,
|
|
70
|
+
occurredAt: data.occurredAt,
|
|
71
|
+
version: data.version ?? 1
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
async getCursor(savedChange) {
|
|
75
|
+
const doc = await this.firestore.doc(savedChange.ref).get();
|
|
76
|
+
if (!doc.exists) return;
|
|
77
|
+
const data = this.converter.fromFirestoreSnapshot(doc);
|
|
78
|
+
return _ddd_ts_core_dist_components_cursor.Cursor.deserialize({
|
|
79
|
+
eventId: data.eventId,
|
|
80
|
+
ref: doc.ref.path,
|
|
81
|
+
occurredAt: data.occurredAt,
|
|
82
|
+
revision: data.revision
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
async slice(projectedStream, shard, startAfter, endAt, limit) {
|
|
86
|
+
let query = this.firestore.collectionGroup("events").orderBy("occurredAt").orderBy("revision");
|
|
87
|
+
const filters = projectedStream.sources.map((source) => {
|
|
88
|
+
if (source instanceof _ddd_ts_core.LakeSource) return new FirestoreLakeSourceFilter().filter(shard, source);
|
|
89
|
+
if (source instanceof _ddd_ts_core.StreamSource) return new FirestoreStreamSourceFilter().filter(shard, source);
|
|
90
|
+
throw new Error("Unknown source type");
|
|
91
|
+
});
|
|
92
|
+
query = query.where(firebase_admin_firestore.Filter.or(...filters));
|
|
93
|
+
if (startAfter) {
|
|
94
|
+
const ts = this.microsecondToTimestamp(startAfter.occurredAt);
|
|
95
|
+
query = query.startAfter(ts, startAfter.revision);
|
|
96
|
+
}
|
|
97
|
+
if (endAt) {
|
|
98
|
+
const ts = this.microsecondToTimestamp(endAt.occurredAt);
|
|
99
|
+
query = query.endAt(ts, endAt.revision);
|
|
100
|
+
}
|
|
101
|
+
if (limit) query = query.limit(limit);
|
|
102
|
+
return (await query.get()).docs.map((doc) => {
|
|
103
|
+
const data = this.converter.fromFirestore(doc);
|
|
104
|
+
return {
|
|
105
|
+
id: data.eventId,
|
|
106
|
+
ref: doc.ref.path,
|
|
107
|
+
revision: data.revision,
|
|
108
|
+
name: data.name,
|
|
109
|
+
$name: data.name,
|
|
110
|
+
payload: data.payload,
|
|
111
|
+
occurredAt: data.occurredAt,
|
|
112
|
+
version: data.version ?? 1
|
|
113
|
+
};
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
//#endregion
|
|
13
119
|
exports.FirestoreLakeSourceFilter = FirestoreLakeSourceFilter;
|
|
14
|
-
class FirestoreStreamSourceFilter {
|
|
15
|
-
filter(shard, streamSource) {
|
|
16
|
-
return firestore_1.Filter.and(firestore_1.Filter.where("aggregateType", "==", streamSource.aggregateType), firestore_1.Filter.where(`payload.${streamSource.shardKey}`, "==", shard), firestore_1.Filter.where("name", "in", streamSource.events));
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
exports.FirestoreStreamSourceFilter = FirestoreStreamSourceFilter;
|
|
20
|
-
class FirestoreProjectedStreamStorageLayer {
|
|
21
|
-
firestore;
|
|
22
|
-
converter;
|
|
23
|
-
constructor(firestore, converter = new store_firestore_1.DefaultConverter()) {
|
|
24
|
-
this.firestore = firestore;
|
|
25
|
-
this.converter = converter;
|
|
26
|
-
}
|
|
27
|
-
async *read(projectedStream, shard, startAfter, endAt) {
|
|
28
|
-
let query = this.firestore
|
|
29
|
-
.collectionGroup("events")
|
|
30
|
-
.orderBy("occurredAt")
|
|
31
|
-
.orderBy("revision");
|
|
32
|
-
const filters = projectedStream.sources.map((source) => {
|
|
33
|
-
if (source instanceof core_1.LakeSource) {
|
|
34
|
-
return new FirestoreLakeSourceFilter().filter(shard, source);
|
|
35
|
-
}
|
|
36
|
-
if (source instanceof core_1.StreamSource) {
|
|
37
|
-
return new FirestoreStreamSourceFilter().filter(shard, source);
|
|
38
|
-
}
|
|
39
|
-
throw new Error("Unknown source type");
|
|
40
|
-
});
|
|
41
|
-
query = query.where(firestore_1.Filter.or(...filters));
|
|
42
|
-
if (startAfter) {
|
|
43
|
-
const ts = this.microsecondToTimestamp(startAfter.occurredAt);
|
|
44
|
-
query = query.startAfter(ts, startAfter.revision);
|
|
45
|
-
}
|
|
46
|
-
if (endAt) {
|
|
47
|
-
const ts = this.microsecondToTimestamp(endAt.occurredAt);
|
|
48
|
-
query = query.endAt(ts, endAt.revision);
|
|
49
|
-
}
|
|
50
|
-
for await (const doc of query.stream()) {
|
|
51
|
-
const data = this.converter.fromFirestore(doc);
|
|
52
|
-
yield {
|
|
53
|
-
id: data.eventId,
|
|
54
|
-
ref: doc.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
|
-
microsecondToTimestamp(microseconds) {
|
|
65
|
-
const seconds = BigInt(microseconds.micros) / 1000000n;
|
|
66
|
-
const nanoseconds = (BigInt(microseconds.micros) % 1000000n) * 1000n; // Convert to nanoseconds
|
|
67
|
-
return new firestore_1.Timestamp(Number(seconds), Number(nanoseconds));
|
|
68
|
-
}
|
|
69
|
-
async get(cursor) {
|
|
70
|
-
const doc = await this.firestore.doc(cursor.ref).get();
|
|
71
|
-
if (!doc.exists) {
|
|
72
|
-
return undefined;
|
|
73
|
-
}
|
|
74
|
-
const data = this.converter.fromFirestoreSnapshot(doc);
|
|
75
|
-
return {
|
|
76
|
-
id: data.eventId,
|
|
77
|
-
ref: doc.ref.path,
|
|
78
|
-
revision: data.revision,
|
|
79
|
-
name: data.name,
|
|
80
|
-
$name: data.name,
|
|
81
|
-
payload: data.payload,
|
|
82
|
-
occurredAt: data.occurredAt,
|
|
83
|
-
version: data.version ?? 1,
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
async getCursor(savedChange) {
|
|
87
|
-
const doc = await this.firestore.doc(savedChange.ref).get();
|
|
88
|
-
if (!doc.exists) {
|
|
89
|
-
return undefined;
|
|
90
|
-
}
|
|
91
|
-
const data = this.converter.fromFirestoreSnapshot(doc);
|
|
92
|
-
return cursor_1.Cursor.deserialize({
|
|
93
|
-
eventId: data.eventId,
|
|
94
|
-
ref: doc.ref.path,
|
|
95
|
-
occurredAt: data.occurredAt,
|
|
96
|
-
revision: data.revision,
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
async slice(projectedStream, shard, startAfter, endAt, limit) {
|
|
100
|
-
let query = this.firestore
|
|
101
|
-
.collectionGroup("events")
|
|
102
|
-
.orderBy("occurredAt")
|
|
103
|
-
.orderBy("revision");
|
|
104
|
-
const filters = projectedStream.sources.map((source) => {
|
|
105
|
-
if (source instanceof core_1.LakeSource) {
|
|
106
|
-
return new FirestoreLakeSourceFilter().filter(shard, source);
|
|
107
|
-
}
|
|
108
|
-
if (source instanceof core_1.StreamSource) {
|
|
109
|
-
return new FirestoreStreamSourceFilter().filter(shard, source);
|
|
110
|
-
}
|
|
111
|
-
throw new Error("Unknown source type");
|
|
112
|
-
});
|
|
113
|
-
query = query.where(firestore_1.Filter.or(...filters));
|
|
114
|
-
if (startAfter) {
|
|
115
|
-
const ts = this.microsecondToTimestamp(startAfter.occurredAt);
|
|
116
|
-
query = query.startAfter(ts, startAfter.revision);
|
|
117
|
-
}
|
|
118
|
-
if (endAt) {
|
|
119
|
-
const ts = this.microsecondToTimestamp(endAt.occurredAt);
|
|
120
|
-
query = query.endAt(ts, endAt.revision);
|
|
121
|
-
}
|
|
122
|
-
if (limit) {
|
|
123
|
-
query = query.limit(limit);
|
|
124
|
-
}
|
|
125
|
-
const all = await query.get();
|
|
126
|
-
return all.docs.map((doc) => {
|
|
127
|
-
const data = this.converter.fromFirestore(doc);
|
|
128
|
-
return {
|
|
129
|
-
id: data.eventId,
|
|
130
|
-
ref: doc.ref.path,
|
|
131
|
-
revision: data.revision,
|
|
132
|
-
name: data.name,
|
|
133
|
-
$name: data.name,
|
|
134
|
-
payload: data.payload,
|
|
135
|
-
occurredAt: data.occurredAt,
|
|
136
|
-
version: data.version ?? 1,
|
|
137
|
-
};
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
120
|
exports.FirestoreProjectedStreamStorageLayer = FirestoreProjectedStreamStorageLayer;
|
|
142
|
-
|
|
121
|
+
exports.FirestoreStreamSourceFilter = FirestoreStreamSourceFilter;
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { LakeSource, StreamSource } from "@ddd-ts/core";
|
|
2
|
+
import { DefaultConverter } from "@ddd-ts/store-firestore";
|
|
3
|
+
import { Filter, Timestamp } from "firebase-admin/firestore";
|
|
4
|
+
import { MicrosecondTimestamp } from "@ddd-ts/shape";
|
|
5
|
+
import { Cursor as Cursor$1 } from "@ddd-ts/core/dist/components/cursor";
|
|
6
|
+
|
|
7
|
+
//#region src/firestore.projected-stream.storage-layer.ts
|
|
8
|
+
var FirestoreLakeSourceFilter = class {
|
|
9
|
+
filter(shard, lakeSource) {
|
|
10
|
+
return Filter.and(Filter.where(`payload.${lakeSource.shardKey}`, "==", shard), Filter.where("name", "in", lakeSource.events));
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
var FirestoreStreamSourceFilter = class {
|
|
14
|
+
filter(shard, streamSource) {
|
|
15
|
+
return Filter.and(Filter.where("aggregateType", "==", streamSource.aggregateType), Filter.where(`payload.${streamSource.shardKey}`, "==", shard), Filter.where("name", "in", streamSource.events));
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
var FirestoreProjectedStreamStorageLayer = class {
|
|
19
|
+
constructor(firestore, converter = new DefaultConverter()) {
|
|
20
|
+
this.firestore = firestore;
|
|
21
|
+
this.converter = converter;
|
|
22
|
+
}
|
|
23
|
+
async *read(projectedStream, shard, startAfter, endAt) {
|
|
24
|
+
let query = this.firestore.collectionGroup("events").orderBy("occurredAt").orderBy("revision");
|
|
25
|
+
const filters = projectedStream.sources.map((source) => {
|
|
26
|
+
if (source instanceof LakeSource) return new FirestoreLakeSourceFilter().filter(shard, source);
|
|
27
|
+
if (source instanceof StreamSource) return new FirestoreStreamSourceFilter().filter(shard, source);
|
|
28
|
+
throw new Error("Unknown source type");
|
|
29
|
+
});
|
|
30
|
+
query = query.where(Filter.or(...filters));
|
|
31
|
+
if (startAfter) {
|
|
32
|
+
const ts = this.microsecondToTimestamp(startAfter.occurredAt);
|
|
33
|
+
query = query.startAfter(ts, startAfter.revision);
|
|
34
|
+
}
|
|
35
|
+
if (endAt) {
|
|
36
|
+
const ts = this.microsecondToTimestamp(endAt.occurredAt);
|
|
37
|
+
query = query.endAt(ts, endAt.revision);
|
|
38
|
+
}
|
|
39
|
+
for await (const doc of query.stream()) {
|
|
40
|
+
const data = this.converter.fromFirestore(doc);
|
|
41
|
+
yield {
|
|
42
|
+
id: data.eventId,
|
|
43
|
+
ref: doc.ref.path,
|
|
44
|
+
revision: data.revision,
|
|
45
|
+
name: data.name,
|
|
46
|
+
$name: data.name,
|
|
47
|
+
payload: data.payload,
|
|
48
|
+
occurredAt: data.occurredAt,
|
|
49
|
+
version: data.version ?? 1
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
microsecondToTimestamp(microseconds) {
|
|
54
|
+
const seconds = BigInt(microseconds.micros) / 1000000n;
|
|
55
|
+
const nanoseconds = BigInt(microseconds.micros) % 1000000n * 1000n;
|
|
56
|
+
return new Timestamp(Number(seconds), Number(nanoseconds));
|
|
57
|
+
}
|
|
58
|
+
async get(cursor) {
|
|
59
|
+
const doc = await this.firestore.doc(cursor.ref).get();
|
|
60
|
+
if (!doc.exists) return;
|
|
61
|
+
const data = this.converter.fromFirestoreSnapshot(doc);
|
|
62
|
+
return {
|
|
63
|
+
id: data.eventId,
|
|
64
|
+
ref: doc.ref.path,
|
|
65
|
+
revision: data.revision,
|
|
66
|
+
name: data.name,
|
|
67
|
+
$name: data.name,
|
|
68
|
+
payload: data.payload,
|
|
69
|
+
occurredAt: data.occurredAt,
|
|
70
|
+
version: data.version ?? 1
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
async getCursor(savedChange) {
|
|
74
|
+
const doc = await this.firestore.doc(savedChange.ref).get();
|
|
75
|
+
if (!doc.exists) return;
|
|
76
|
+
const data = this.converter.fromFirestoreSnapshot(doc);
|
|
77
|
+
return Cursor$1.deserialize({
|
|
78
|
+
eventId: data.eventId,
|
|
79
|
+
ref: doc.ref.path,
|
|
80
|
+
occurredAt: data.occurredAt,
|
|
81
|
+
revision: data.revision
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
async slice(projectedStream, shard, startAfter, endAt, limit) {
|
|
85
|
+
let query = this.firestore.collectionGroup("events").orderBy("occurredAt").orderBy("revision");
|
|
86
|
+
const filters = projectedStream.sources.map((source) => {
|
|
87
|
+
if (source instanceof LakeSource) return new FirestoreLakeSourceFilter().filter(shard, source);
|
|
88
|
+
if (source instanceof StreamSource) return new FirestoreStreamSourceFilter().filter(shard, source);
|
|
89
|
+
throw new Error("Unknown source type");
|
|
90
|
+
});
|
|
91
|
+
query = query.where(Filter.or(...filters));
|
|
92
|
+
if (startAfter) {
|
|
93
|
+
const ts = this.microsecondToTimestamp(startAfter.occurredAt);
|
|
94
|
+
query = query.startAfter(ts, startAfter.revision);
|
|
95
|
+
}
|
|
96
|
+
if (endAt) {
|
|
97
|
+
const ts = this.microsecondToTimestamp(endAt.occurredAt);
|
|
98
|
+
query = query.endAt(ts, endAt.revision);
|
|
99
|
+
}
|
|
100
|
+
if (limit) query = query.limit(limit);
|
|
101
|
+
return (await query.get()).docs.map((doc) => {
|
|
102
|
+
const data = this.converter.fromFirestore(doc);
|
|
103
|
+
return {
|
|
104
|
+
id: data.eventId,
|
|
105
|
+
ref: doc.ref.path,
|
|
106
|
+
revision: data.revision,
|
|
107
|
+
name: data.name,
|
|
108
|
+
$name: data.name,
|
|
109
|
+
payload: data.payload,
|
|
110
|
+
occurredAt: data.occurredAt,
|
|
111
|
+
version: data.version ?? 1
|
|
112
|
+
};
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
//#endregion
|
|
118
|
+
export { FirestoreLakeSourceFilter, FirestoreProjectedStreamStorageLayer, FirestoreStreamSourceFilter };
|
|
@@ -1,40 +1,36 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
exports.FirestoreSnapshotter = FirestoreSnapshotter;
|
|
40
|
-
//# sourceMappingURL=firestore.snapshotter.js.map
|
|
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
|
+
|
|
5
|
+
//#region src/firestore.snapshotter.ts
|
|
6
|
+
var SnapshotSerializer = class {
|
|
7
|
+
constructor(serializer, aggregateType) {
|
|
8
|
+
this.serializer = serializer;
|
|
9
|
+
this.aggregateType = aggregateType;
|
|
10
|
+
}
|
|
11
|
+
async serialize(instance) {
|
|
12
|
+
return {
|
|
13
|
+
...await this.serializer.serialize(instance),
|
|
14
|
+
$name: this.aggregateType,
|
|
15
|
+
revision: instance.acknowledgedRevision
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
async deserialize(serialized) {
|
|
19
|
+
const { revision, ...content } = serialized;
|
|
20
|
+
const instance = await this.serializer.deserialize({
|
|
21
|
+
$name: this.aggregateType,
|
|
22
|
+
...content
|
|
23
|
+
});
|
|
24
|
+
instance.acknowledgedRevision = Number(revision);
|
|
25
|
+
return instance;
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
var FirestoreSnapshotter = class extends _ddd_ts_store_firestore.FirestoreStore {
|
|
29
|
+
constructor(aggregateType, database, serializer) {
|
|
30
|
+
const collection = database.collection("event-store").doc(aggregateType).collection("streams");
|
|
31
|
+
super(collection, new SnapshotSerializer(serializer, aggregateType), aggregateType);
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
//#endregion
|
|
36
|
+
exports.FirestoreSnapshotter = FirestoreSnapshotter;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import "@ddd-ts/core";
|
|
2
|
+
import { FirestoreStore } from "@ddd-ts/store-firestore";
|
|
3
|
+
|
|
4
|
+
//#region src/firestore.snapshotter.ts
|
|
5
|
+
var SnapshotSerializer = class {
|
|
6
|
+
constructor(serializer, aggregateType) {
|
|
7
|
+
this.serializer = serializer;
|
|
8
|
+
this.aggregateType = aggregateType;
|
|
9
|
+
}
|
|
10
|
+
async serialize(instance) {
|
|
11
|
+
return {
|
|
12
|
+
...await this.serializer.serialize(instance),
|
|
13
|
+
$name: this.aggregateType,
|
|
14
|
+
revision: instance.acknowledgedRevision
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
async deserialize(serialized) {
|
|
18
|
+
const { revision, ...content } = serialized;
|
|
19
|
+
const instance = await this.serializer.deserialize({
|
|
20
|
+
$name: this.aggregateType,
|
|
21
|
+
...content
|
|
22
|
+
});
|
|
23
|
+
instance.acknowledgedRevision = Number(revision);
|
|
24
|
+
return instance;
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
var FirestoreSnapshotter = class extends FirestoreStore {
|
|
28
|
+
constructor(aggregateType, database, serializer) {
|
|
29
|
+
const collection = database.collection("event-store").doc(aggregateType).collection("streams");
|
|
30
|
+
super(collection, new SnapshotSerializer(serializer, aggregateType), aggregateType);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
//#endregion
|
|
35
|
+
export { FirestoreSnapshotter };
|
package/dist/index.js
CHANGED
|
@@ -1,32 +1,30 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
Object.defineProperty(exports, "ClaimerId", { enumerable: true, get: function () { return firestore_projector_1.ClaimerId; } });
|
|
32
|
-
//# sourceMappingURL=index.js.map
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
const require_firestore_event_lake_storage_layer = require('./firestore.event-lake.storage-layer.js');
|
|
3
|
+
const require_firestore_event_lake_store = require('./firestore.event-lake.store.js');
|
|
4
|
+
const require_firestore_event_stream_storage_layer = require('./firestore.event-stream.storage-layer.js');
|
|
5
|
+
const require_firestore_event_stream_store = require('./firestore.event-stream.store.js');
|
|
6
|
+
const require_firestore_snapshotter = require('./firestore.snapshotter.js');
|
|
7
|
+
const require_firestore_event_stream_aggregate_store = require('./firestore.event-stream.aggregate-store.js');
|
|
8
|
+
const require_firestore_event_lake_aggregate_store = require('./firestore.event-lake.aggregate-store.js');
|
|
9
|
+
const require_firestore_projected_stream_storage_layer = require('./firestore.projected-stream.storage-layer.js');
|
|
10
|
+
const require_firestore_projected_stream_reader = require('./firestore.projected-stream.reader.js');
|
|
11
|
+
const require_firestore_projector = require('./projection/firestore.projector.js');
|
|
12
|
+
|
|
13
|
+
exports.AlreadyEnqueuedError = require_firestore_projector.AlreadyEnqueuedError;
|
|
14
|
+
exports.ClaimerId = require_firestore_projector.ClaimerId;
|
|
15
|
+
exports.FirestoreEventLakeAggregateStore = require_firestore_event_lake_aggregate_store.FirestoreEventLakeAggregateStore;
|
|
16
|
+
exports.FirestoreEventLakeStorageLayer = require_firestore_event_lake_storage_layer.FirestoreEventLakeStorageLayer;
|
|
17
|
+
exports.FirestoreEventLakeStore = require_firestore_event_lake_store.FirestoreEventLakeStore;
|
|
18
|
+
exports.FirestoreEventStreamAggregateStore = require_firestore_event_stream_aggregate_store.FirestoreEventStreamAggregateStore;
|
|
19
|
+
exports.FirestoreEventStreamStorageLayer = require_firestore_event_stream_storage_layer.FirestoreEventStreamStorageLayer;
|
|
20
|
+
exports.FirestoreEventStreamStore = require_firestore_event_stream_store.FirestoreEventStreamStore;
|
|
21
|
+
exports.FirestoreLakeSourceFilter = require_firestore_projected_stream_storage_layer.FirestoreLakeSourceFilter;
|
|
22
|
+
exports.FirestoreProjectedStreamReader = require_firestore_projected_stream_reader.FirestoreProjectedStreamReader;
|
|
23
|
+
exports.FirestoreProjectedStreamStorageLayer = require_firestore_projected_stream_storage_layer.FirestoreProjectedStreamStorageLayer;
|
|
24
|
+
exports.FirestoreProjector = require_firestore_projector.FirestoreProjector;
|
|
25
|
+
exports.FirestoreQueueStore = require_firestore_projector.FirestoreQueueStore;
|
|
26
|
+
exports.FirestoreSnapshotter = require_firestore_snapshotter.FirestoreSnapshotter;
|
|
27
|
+
exports.FirestoreStreamSourceFilter = require_firestore_projected_stream_storage_layer.FirestoreStreamSourceFilter;
|
|
28
|
+
exports.MakeFirestoreEventLakeAggregateStore = require_firestore_event_lake_aggregate_store.MakeFirestoreEventLakeAggregateStore;
|
|
29
|
+
exports.MakeFirestoreEventStreamAggregateStore = require_firestore_event_stream_aggregate_store.MakeFirestoreEventStreamAggregateStore;
|
|
30
|
+
exports.Task = require_firestore_projector.Task;
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { FirestoreEventLakeStorageLayer } from "./firestore.event-lake.storage-layer.mjs";
|
|
2
|
+
import { FirestoreEventLakeStore } from "./firestore.event-lake.store.mjs";
|
|
3
|
+
import { FirestoreEventStreamStorageLayer } from "./firestore.event-stream.storage-layer.mjs";
|
|
4
|
+
import { FirestoreEventStreamStore } from "./firestore.event-stream.store.mjs";
|
|
5
|
+
import { FirestoreSnapshotter } from "./firestore.snapshotter.mjs";
|
|
6
|
+
import { FirestoreEventStreamAggregateStore, MakeFirestoreEventStreamAggregateStore } from "./firestore.event-stream.aggregate-store.mjs";
|
|
7
|
+
import { FirestoreEventLakeAggregateStore, MakeFirestoreEventLakeAggregateStore } from "./firestore.event-lake.aggregate-store.mjs";
|
|
8
|
+
import { FirestoreLakeSourceFilter, FirestoreProjectedStreamStorageLayer, FirestoreStreamSourceFilter } from "./firestore.projected-stream.storage-layer.mjs";
|
|
9
|
+
import { FirestoreProjectedStreamReader } from "./firestore.projected-stream.reader.mjs";
|
|
10
|
+
import { AlreadyEnqueuedError, ClaimerId, FirestoreProjector, FirestoreQueueStore, Task } from "./projection/firestore.projector.mjs";
|
|
11
|
+
|
|
12
|
+
export { AlreadyEnqueuedError, ClaimerId, FirestoreEventLakeAggregateStore, FirestoreEventLakeStorageLayer, FirestoreEventLakeStore, FirestoreEventStreamAggregateStore, FirestoreEventStreamStorageLayer, FirestoreEventStreamStore, FirestoreLakeSourceFilter, FirestoreProjectedStreamReader, FirestoreProjectedStreamStorageLayer, FirestoreProjector, FirestoreQueueStore, FirestoreSnapshotter, FirestoreStreamSourceFilter, MakeFirestoreEventLakeAggregateStore, MakeFirestoreEventStreamAggregateStore, Task };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Firestore, WriteBatch } from "firebase-admin/firestore";
|
|
2
|
-
import { IEsEvent, ISavedChange, EventId, ProjectedStreamReader, Cursor, CheckpointId, ESProjection, IFact, Serialized, Lock } from "@ddd-ts/core";
|
|
2
|
+
import { type IEsEvent, type ISavedChange, EventId, ProjectedStreamReader, Cursor, CheckpointId, ESProjection, type IFact, type Serialized, Lock } from "@ddd-ts/core";
|
|
3
3
|
import { MicrosecondTimestamp } from "@ddd-ts/shape";
|
|
4
4
|
import { DefaultConverter, FirestoreTransaction } from "@ddd-ts/store-firestore";
|
|
5
5
|
export declare class FirestoreProjector {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firestore.projector.d.ts","sourceRoot":"","sources":["../../src/projection/firestore.projector.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,SAAS,EAET,UAAU,EACX,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,QAAQ,
|
|
1
|
+
{"version":3,"file":"firestore.projector.d.ts","sourceRoot":"","sources":["../../src/projection/firestore.projector.ts"],"names":[],"mappings":"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"}
|