@ddd-ts/event-sourcing-firestore 0.0.0-compute-timeout-on-process.6 → 0.0.0-compute-timeout-on-process.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_virtual/_rolldown/runtime.js +29 -0
- package/dist/firestore.event-lake.aggregate-store.js +12 -11
- package/dist/firestore.event-lake.aggregate-store.mjs +38 -0
- package/dist/firestore.event-lake.aggregate-store.mjs.map +1 -0
- package/dist/firestore.event-lake.storage-layer.d.ts +1 -1
- package/dist/firestore.event-lake.storage-layer.js +8 -7
- package/dist/firestore.event-lake.storage-layer.mjs +66 -0
- package/dist/firestore.event-lake.storage-layer.mjs.map +1 -0
- package/dist/firestore.event-lake.store.js +7 -7
- package/dist/firestore.event-lake.store.mjs +14 -0
- package/dist/firestore.event-lake.store.mjs.map +1 -0
- package/dist/firestore.event-stream.aggregate-store.js +15 -14
- package/dist/firestore.event-stream.aggregate-store.mjs +38 -0
- package/dist/firestore.event-stream.aggregate-store.mjs.map +1 -0
- package/dist/firestore.event-stream.storage-layer.d.ts +1 -1
- package/dist/firestore.event-stream.storage-layer.js +9 -8
- package/dist/firestore.event-stream.storage-layer.mjs +67 -0
- package/dist/firestore.event-stream.storage-layer.mjs.map +1 -0
- package/dist/firestore.event-stream.store.js +7 -7
- package/dist/firestore.event-stream.store.mjs +14 -0
- package/dist/firestore.event-stream.store.mjs.map +1 -0
- package/dist/firestore.projected-stream.reader.js +7 -7
- package/dist/firestore.projected-stream.reader.mjs +35 -0
- package/dist/firestore.projected-stream.reader.mjs.map +1 -0
- package/dist/firestore.projected-stream.storage-layer.js +20 -18
- package/dist/firestore.projected-stream.storage-layer.mjs +119 -0
- package/dist/firestore.projected-stream.storage-layer.mjs.map +1 -0
- package/dist/firestore.snapshotter.js +5 -5
- package/dist/firestore.snapshotter.mjs +36 -0
- package/dist/firestore.snapshotter.mjs.map +1 -0
- package/dist/index.js +29 -11
- package/dist/index.mjs +12 -0
- package/dist/projection/firestore.projector.js +48 -44
- package/dist/projection/firestore.projector.mjs +521 -0
- package/dist/projection/firestore.projector.mjs.map +1 -0
- package/package.json +16 -11
- package/dist/firestore.event-lake.aggregate-store.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-stream.aggregate-store.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.storage-layer.js.map +0 -1
- package/dist/firestore.snapshotter.js.map +0 -1
- package/dist/projection/firestore.projector.js.map +0 -1
|
@@ -1,33 +1,34 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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");
|
|
6
7
|
|
|
7
8
|
//#region src/firestore.projected-stream.storage-layer.ts
|
|
8
9
|
var FirestoreLakeSourceFilter = class {
|
|
9
10
|
filter(shard, lakeSource) {
|
|
10
|
-
return Filter.and(Filter.where(`payload.${lakeSource.shardKey}`, "==", shard), Filter.where("name", "in", lakeSource.events));
|
|
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));
|
|
11
12
|
}
|
|
12
13
|
};
|
|
13
14
|
var FirestoreStreamSourceFilter = class {
|
|
14
15
|
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
|
+
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));
|
|
16
17
|
}
|
|
17
18
|
};
|
|
18
19
|
var FirestoreProjectedStreamStorageLayer = class {
|
|
19
|
-
constructor(firestore, converter = new DefaultConverter()) {
|
|
20
|
+
constructor(firestore, converter = new _ddd_ts_store_firestore.DefaultConverter()) {
|
|
20
21
|
this.firestore = firestore;
|
|
21
22
|
this.converter = converter;
|
|
22
23
|
}
|
|
23
24
|
async *read(projectedStream, shard, startAfter, endAt) {
|
|
24
25
|
let query = this.firestore.collectionGroup("events").orderBy("occurredAt").orderBy("revision");
|
|
25
26
|
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);
|
|
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);
|
|
28
29
|
throw new Error("Unknown source type");
|
|
29
30
|
});
|
|
30
|
-
query = query.where(Filter.or(...filters));
|
|
31
|
+
query = query.where(firebase_admin_firestore.Filter.or(...filters));
|
|
31
32
|
if (startAfter) {
|
|
32
33
|
const ts = this.microsecondToTimestamp(startAfter.occurredAt);
|
|
33
34
|
query = query.startAfter(ts, startAfter.revision);
|
|
@@ -53,7 +54,7 @@ var FirestoreProjectedStreamStorageLayer = class {
|
|
|
53
54
|
microsecondToTimestamp(microseconds) {
|
|
54
55
|
const seconds = BigInt(microseconds.micros) / 1000000n;
|
|
55
56
|
const nanoseconds = BigInt(microseconds.micros) % 1000000n * 1000n;
|
|
56
|
-
return new Timestamp(Number(seconds), Number(nanoseconds));
|
|
57
|
+
return new firebase_admin_firestore.Timestamp(Number(seconds), Number(nanoseconds));
|
|
57
58
|
}
|
|
58
59
|
async get(cursor) {
|
|
59
60
|
const doc = await this.firestore.doc(cursor.ref).get();
|
|
@@ -74,7 +75,7 @@ var FirestoreProjectedStreamStorageLayer = class {
|
|
|
74
75
|
const doc = await this.firestore.doc(savedChange.ref).get();
|
|
75
76
|
if (!doc.exists) return;
|
|
76
77
|
const data = this.converter.fromFirestoreSnapshot(doc);
|
|
77
|
-
return Cursor
|
|
78
|
+
return _ddd_ts_core_dist_components_cursor.Cursor.deserialize({
|
|
78
79
|
eventId: data.eventId,
|
|
79
80
|
ref: doc.ref.path,
|
|
80
81
|
occurredAt: data.occurredAt,
|
|
@@ -84,11 +85,11 @@ var FirestoreProjectedStreamStorageLayer = class {
|
|
|
84
85
|
async slice(projectedStream, shard, startAfter, endAt, limit) {
|
|
85
86
|
let query = this.firestore.collectionGroup("events").orderBy("occurredAt").orderBy("revision");
|
|
86
87
|
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);
|
|
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);
|
|
89
90
|
throw new Error("Unknown source type");
|
|
90
91
|
});
|
|
91
|
-
query = query.where(Filter.or(...filters));
|
|
92
|
+
query = query.where(firebase_admin_firestore.Filter.or(...filters));
|
|
92
93
|
if (startAfter) {
|
|
93
94
|
const ts = this.microsecondToTimestamp(startAfter.occurredAt);
|
|
94
95
|
query = query.startAfter(ts, startAfter.revision);
|
|
@@ -115,5 +116,6 @@ var FirestoreProjectedStreamStorageLayer = class {
|
|
|
115
116
|
};
|
|
116
117
|
|
|
117
118
|
//#endregion
|
|
118
|
-
|
|
119
|
-
|
|
119
|
+
exports.FirestoreLakeSourceFilter = FirestoreLakeSourceFilter;
|
|
120
|
+
exports.FirestoreProjectedStreamStorageLayer = FirestoreProjectedStreamStorageLayer;
|
|
121
|
+
exports.FirestoreStreamSourceFilter = FirestoreStreamSourceFilter;
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { ISerializedFact, ISerializedSavedChange, LakeSource, ProjectedStream, ProjectedStreamStorageLayer, StreamSource } from "@ddd-ts/core";
|
|
2
|
+
import { DefaultConverter } from "@ddd-ts/store-firestore";
|
|
3
|
+
import { Filter, Firestore, 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 };
|
|
119
|
+
//# sourceMappingURL=firestore.projected-stream.storage-layer.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firestore.projected-stream.storage-layer.mjs","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,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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");
|
|
3
4
|
|
|
4
5
|
//#region src/firestore.snapshotter.ts
|
|
5
6
|
var SnapshotSerializer = class {
|
|
@@ -24,7 +25,7 @@ var SnapshotSerializer = class {
|
|
|
24
25
|
return instance;
|
|
25
26
|
}
|
|
26
27
|
};
|
|
27
|
-
var FirestoreSnapshotter = class extends FirestoreStore {
|
|
28
|
+
var FirestoreSnapshotter = class extends _ddd_ts_store_firestore.FirestoreStore {
|
|
28
29
|
constructor(aggregateType, database, serializer) {
|
|
29
30
|
const collection = database.collection("event-store").doc(aggregateType).collection("streams");
|
|
30
31
|
super(collection, new SnapshotSerializer(serializer, aggregateType), aggregateType);
|
|
@@ -32,5 +33,4 @@ var FirestoreSnapshotter = class extends FirestoreStore {
|
|
|
32
33
|
};
|
|
33
34
|
|
|
34
35
|
//#endregion
|
|
35
|
-
|
|
36
|
-
//# sourceMappingURL=firestore.snapshotter.js.map
|
|
36
|
+
exports.FirestoreSnapshotter = FirestoreSnapshotter;
|
|
@@ -0,0 +1,36 @@
|
|
|
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 };
|
|
36
|
+
//# sourceMappingURL=firestore.snapshotter.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firestore.snapshotter.mjs","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"}
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,30 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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');
|
|
11
12
|
|
|
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,7 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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");
|
|
5
6
|
|
|
6
7
|
//#region src/projection/firestore.projector.ts
|
|
7
8
|
const Status = {
|
|
@@ -15,7 +16,7 @@ const TaskState = {
|
|
|
15
16
|
MISSING: "MISSING"
|
|
16
17
|
};
|
|
17
18
|
const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
18
|
-
const RETENTION = MicrosecondTimestamp.MONTH;
|
|
19
|
+
const RETENTION = _ddd_ts_shape.MicrosecondTimestamp.MONTH;
|
|
19
20
|
var FirestoreProjector = class {
|
|
20
21
|
_unclaim = true;
|
|
21
22
|
constructor(projection, reader, queue, config = {
|
|
@@ -183,19 +184,19 @@ var AlreadyEnqueuedError = class extends Error {
|
|
|
183
184
|
}
|
|
184
185
|
};
|
|
185
186
|
var FirestoreQueueStore = class {
|
|
186
|
-
converter = new DefaultConverter();
|
|
187
|
+
converter = new _ddd_ts_store_firestore.DefaultConverter();
|
|
187
188
|
collection;
|
|
188
189
|
constructor(db) {
|
|
189
190
|
this.db = db;
|
|
190
191
|
this.collection = db.collection("checkpoints");
|
|
191
192
|
}
|
|
192
193
|
timestampToMicroseconds(timestamp) {
|
|
193
|
-
return new MicrosecondTimestamp(BigInt(timestamp.seconds) * BigInt(1e6) + BigInt(timestamp.nanoseconds) / BigInt(1e3));
|
|
194
|
+
return new _ddd_ts_shape.MicrosecondTimestamp(BigInt(timestamp.seconds) * BigInt(1e6) + BigInt(timestamp.nanoseconds) / BigInt(1e3));
|
|
194
195
|
}
|
|
195
196
|
microsecondsToTimestamp(microseconds) {
|
|
196
197
|
const seconds = BigInt(microseconds.micros) / 1000000n;
|
|
197
198
|
const nanoseconds = BigInt(microseconds.micros) % 1000000n * 1000n;
|
|
198
|
-
return new Timestamp(Number(seconds), Number(nanoseconds));
|
|
199
|
+
return new firebase_admin_firestore.Timestamp(Number(seconds), Number(nanoseconds));
|
|
199
200
|
}
|
|
200
201
|
async enqueue(checkpointId, tasks) {
|
|
201
202
|
const batch = this.collection.firestore.batch();
|
|
@@ -221,11 +222,11 @@ var FirestoreQueueStore = class {
|
|
|
221
222
|
const ref = this.queued(checkpointId, task.id);
|
|
222
223
|
batch.update(ref, {
|
|
223
224
|
claimer: claimer.serialize(),
|
|
224
|
-
claimedAt: FieldValue.serverTimestamp(),
|
|
225
|
-
[`claimsMetadata.${claimer.serialize()}`]: { claimedAt: FieldValue.serverTimestamp() },
|
|
226
|
-
claimIds: FieldValue.arrayUnion(claimer.serialize()),
|
|
227
|
-
attempts: FieldValue.increment(1),
|
|
228
|
-
remaining: FieldValue.increment(-1)
|
|
225
|
+
claimedAt: firebase_admin_firestore.FieldValue.serverTimestamp(),
|
|
226
|
+
[`claimsMetadata.${claimer.serialize()}`]: { claimedAt: firebase_admin_firestore.FieldValue.serverTimestamp() },
|
|
227
|
+
claimIds: firebase_admin_firestore.FieldValue.arrayUnion(claimer.serialize()),
|
|
228
|
+
attempts: firebase_admin_firestore.FieldValue.increment(1),
|
|
229
|
+
remaining: firebase_admin_firestore.FieldValue.increment(-1)
|
|
229
230
|
}, { lastUpdateTime: this.microsecondsToTimestamp(task.lastUpdateTime) });
|
|
230
231
|
}
|
|
231
232
|
await batch.commit();
|
|
@@ -235,7 +236,7 @@ var FirestoreQueueStore = class {
|
|
|
235
236
|
if (!headDoc) return;
|
|
236
237
|
const headData = this.converter.fromFirestoreSnapshot(headDoc);
|
|
237
238
|
if (!headData) return;
|
|
238
|
-
return headDoc ? Cursor.deserialize({
|
|
239
|
+
return headDoc ? _ddd_ts_core.Cursor.deserialize({
|
|
239
240
|
ref: headData.ref,
|
|
240
241
|
occurredAt: headData.occurredAt,
|
|
241
242
|
revision: headData.revision,
|
|
@@ -259,8 +260,8 @@ var FirestoreQueueStore = class {
|
|
|
259
260
|
for (const task of expiredTasks) {
|
|
260
261
|
const ref = this.queued(checkpointId, task.id);
|
|
261
262
|
batch.update(ref, {
|
|
262
|
-
claimer: FieldValue.delete(),
|
|
263
|
-
claimedAt: FieldValue.delete(),
|
|
263
|
+
claimer: firebase_admin_firestore.FieldValue.delete(),
|
|
264
|
+
claimedAt: firebase_admin_firestore.FieldValue.delete(),
|
|
264
265
|
claimIds: task.claimIds
|
|
265
266
|
}, { lastUpdateTime: this.microsecondsToTimestamp(task.lastUpdateTime) });
|
|
266
267
|
}
|
|
@@ -280,9 +281,9 @@ var FirestoreQueueStore = class {
|
|
|
280
281
|
for (const task of tasks) {
|
|
281
282
|
const ref = this.queued(checkpointId, task.id);
|
|
282
283
|
batch.update(ref, {
|
|
283
|
-
claimer: FieldValue.delete(),
|
|
284
|
-
claimedAt: FieldValue.delete(),
|
|
285
|
-
claimIds: FieldValue.arrayRemove(task.currentClaimId)
|
|
284
|
+
claimer: firebase_admin_firestore.FieldValue.delete(),
|
|
285
|
+
claimedAt: firebase_admin_firestore.FieldValue.delete(),
|
|
286
|
+
claimIds: firebase_admin_firestore.FieldValue.arrayRemove(task.currentClaimId)
|
|
286
287
|
}, { lastUpdateTime: this.microsecondsToTimestamp(task.lastUpdateTime) });
|
|
287
288
|
}
|
|
288
289
|
await batch.commit();
|
|
@@ -301,7 +302,7 @@ var FirestoreQueueStore = class {
|
|
|
301
302
|
if (data.processed === true) return TaskState.PROCESSED;
|
|
302
303
|
return TaskState.ENQUEUED;
|
|
303
304
|
}
|
|
304
|
-
const lastRetention = MicrosecondTimestamp.now().sub(RETENTION);
|
|
305
|
+
const lastRetention = _ddd_ts_shape.MicrosecondTimestamp.now().sub(RETENTION);
|
|
305
306
|
if (cursor.isOlderThan(lastRetention)) return TaskState.PROCESSED;
|
|
306
307
|
return TaskState.MISSING;
|
|
307
308
|
}
|
|
@@ -321,14 +322,14 @@ var FirestoreQueueStore = class {
|
|
|
321
322
|
const ref = this.queued(id, eventId);
|
|
322
323
|
trx.transaction.update(ref, {
|
|
323
324
|
processed: true,
|
|
324
|
-
[`claimsMetadata.${claimerId.serialize()}.processedAt`]: FieldValue.serverTimestamp()
|
|
325
|
+
[`claimsMetadata.${claimerId.serialize()}.processedAt`]: firebase_admin_firestore.FieldValue.serverTimestamp()
|
|
325
326
|
});
|
|
326
327
|
}
|
|
327
328
|
return;
|
|
328
329
|
}
|
|
329
330
|
await Promise.all(eventIds.map((eventId) => this.queued(id, eventId).update({
|
|
330
331
|
processed: true,
|
|
331
|
-
[`claimsMetadata.${claimerId.serialize()}.processedAt`]: FieldValue.serverTimestamp()
|
|
332
|
+
[`claimsMetadata.${claimerId.serialize()}.processedAt`]: firebase_admin_firestore.FieldValue.serverTimestamp()
|
|
332
333
|
})));
|
|
333
334
|
}
|
|
334
335
|
async getTailCursor(id) {
|
|
@@ -336,7 +337,7 @@ var FirestoreQueueStore = class {
|
|
|
336
337
|
if (!tailDoc) return;
|
|
337
338
|
const tailData = this.converter.fromFirestoreSnapshot(tailDoc);
|
|
338
339
|
if (!tailData) return;
|
|
339
|
-
return tailDoc ? Cursor.deserialize({
|
|
340
|
+
return tailDoc ? _ddd_ts_core.Cursor.deserialize({
|
|
340
341
|
ref: tailData.ref,
|
|
341
342
|
occurredAt: tailData.occurredAt,
|
|
342
343
|
revision: tailData.revision,
|
|
@@ -344,7 +345,7 @@ var FirestoreQueueStore = class {
|
|
|
344
345
|
}) : void 0;
|
|
345
346
|
}
|
|
346
347
|
async cleanup(id) {
|
|
347
|
-
const aMonthAgo = MicrosecondTimestamp.now().sub(MicrosecondTimestamp.WEEK.mult(4));
|
|
348
|
+
const aMonthAgo = _ddd_ts_shape.MicrosecondTimestamp.now().sub(_ddd_ts_shape.MicrosecondTimestamp.WEEK.mult(4));
|
|
348
349
|
const query = this.queue(id).where("remaining", ">", 0).where("occurredAt", "<", aMonthAgo.serialize()).orderBy("occurredAt", "asc").orderBy("revision", "asc");
|
|
349
350
|
const TRAIL = 1;
|
|
350
351
|
const snapshot = await query.get();
|
|
@@ -374,14 +375,14 @@ var FirestoreQueueStore = class {
|
|
|
374
375
|
* correct point in time, avoiding reprocessing of old events.
|
|
375
376
|
*/
|
|
376
377
|
async seed(checkpointId) {
|
|
377
|
-
const cursor = new Cursor({
|
|
378
|
+
const cursor = new _ddd_ts_core.Cursor({
|
|
378
379
|
ref: "seed",
|
|
379
|
-
occurredAt: MicrosecondTimestamp.now(),
|
|
380
|
+
occurredAt: _ddd_ts_shape.MicrosecondTimestamp.now(),
|
|
380
381
|
revision: 0,
|
|
381
|
-
eventId: EventId.generate()
|
|
382
|
+
eventId: _ddd_ts_core.EventId.generate()
|
|
382
383
|
});
|
|
383
384
|
const task = new Task({
|
|
384
|
-
id: EventId.generate(),
|
|
385
|
+
id: _ddd_ts_core.EventId.generate(),
|
|
385
386
|
ref: "Seed",
|
|
386
387
|
occurredAt: cursor.occurredAt,
|
|
387
388
|
revision: cursor.revision,
|
|
@@ -391,7 +392,7 @@ var FirestoreQueueStore = class {
|
|
|
391
392
|
claimedAt: void 0,
|
|
392
393
|
claimsMetadata: {},
|
|
393
394
|
claimIds: [],
|
|
394
|
-
lock: new Lock({}),
|
|
395
|
+
lock: new _ddd_ts_core.Lock({}),
|
|
395
396
|
remaining: 1,
|
|
396
397
|
claimTimeout: 0,
|
|
397
398
|
skipAfter: 0,
|
|
@@ -407,30 +408,30 @@ var FirestoreQueueStore = class {
|
|
|
407
408
|
}
|
|
408
409
|
}
|
|
409
410
|
};
|
|
410
|
-
var ClaimerId = class extends EventId {};
|
|
411
|
-
var Task = class Task extends Shape({
|
|
412
|
-
id: EventId,
|
|
411
|
+
var ClaimerId = class extends _ddd_ts_core.EventId {};
|
|
412
|
+
var Task = class Task extends (0, _ddd_ts_shape.Shape)({
|
|
413
|
+
id: _ddd_ts_core.EventId,
|
|
413
414
|
ref: String,
|
|
414
|
-
occurredAt: MicrosecondTimestamp,
|
|
415
|
+
occurredAt: _ddd_ts_shape.MicrosecondTimestamp,
|
|
415
416
|
revision: Number,
|
|
416
417
|
attempts: Number,
|
|
417
418
|
processed: Boolean,
|
|
418
|
-
claimer: Optional(String),
|
|
419
|
-
claimedAt: Optional(MicrosecondTimestamp),
|
|
420
|
-
claimsMetadata: Mapping([{
|
|
421
|
-
claimedAt: MicrosecondTimestamp,
|
|
422
|
-
processedAt: Optional(MicrosecondTimestamp)
|
|
419
|
+
claimer: (0, _ddd_ts_shape.Optional)(String),
|
|
420
|
+
claimedAt: (0, _ddd_ts_shape.Optional)(_ddd_ts_shape.MicrosecondTimestamp),
|
|
421
|
+
claimsMetadata: (0, _ddd_ts_shape.Mapping)([{
|
|
422
|
+
claimedAt: _ddd_ts_shape.MicrosecondTimestamp,
|
|
423
|
+
processedAt: (0, _ddd_ts_shape.Optional)(_ddd_ts_shape.MicrosecondTimestamp)
|
|
423
424
|
}]),
|
|
424
425
|
claimIds: [String],
|
|
425
|
-
lock: Lock,
|
|
426
|
+
lock: _ddd_ts_core.Lock,
|
|
426
427
|
skipAfter: Number,
|
|
427
428
|
remaining: Number,
|
|
428
429
|
isolateAfter: Number,
|
|
429
430
|
claimTimeout: Number,
|
|
430
|
-
lastUpdateTime: Optional(MicrosecondTimestamp)
|
|
431
|
+
lastUpdateTime: (0, _ddd_ts_shape.Optional)(_ddd_ts_shape.MicrosecondTimestamp)
|
|
431
432
|
}) {
|
|
432
433
|
get cursor() {
|
|
433
|
-
return new Cursor({
|
|
434
|
+
return new _ddd_ts_core.Cursor({
|
|
434
435
|
ref: this.ref,
|
|
435
436
|
occurredAt: this.occurredAt,
|
|
436
437
|
revision: this.revision,
|
|
@@ -477,7 +478,7 @@ var Task = class Task extends Shape({
|
|
|
477
478
|
if (!claimer) return;
|
|
478
479
|
const claimInfo = this.claimsMetadata[claimer];
|
|
479
480
|
if (!claimInfo || !claimInfo.claimedAt) return;
|
|
480
|
-
if (MicrosecondTimestamp.now().micros - claimInfo.claimedAt.micros > BigInt(this.claimTimeout) * 1000n) this.claimIds = this.claimIds.filter((id) => id !== claimer);
|
|
481
|
+
if (_ddd_ts_shape.MicrosecondTimestamp.now().micros - claimInfo.claimedAt.micros > BigInt(this.claimTimeout) * 1000n) this.claimIds = this.claimIds.filter((id) => id !== claimer);
|
|
481
482
|
}
|
|
482
483
|
static deserializeWithLastUpdateTime(data, timestamp) {
|
|
483
484
|
return Task.deserialize({
|
|
@@ -517,5 +518,8 @@ var Task = class Task extends Shape({
|
|
|
517
518
|
};
|
|
518
519
|
|
|
519
520
|
//#endregion
|
|
520
|
-
|
|
521
|
-
|
|
521
|
+
exports.AlreadyEnqueuedError = AlreadyEnqueuedError;
|
|
522
|
+
exports.ClaimerId = ClaimerId;
|
|
523
|
+
exports.FirestoreProjector = FirestoreProjector;
|
|
524
|
+
exports.FirestoreQueueStore = FirestoreQueueStore;
|
|
525
|
+
exports.Task = Task;
|