@ddd-ts/event-sourcing-firestore 0.0.37 → 0.0.39

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.
Files changed (93) hide show
  1. package/LICENSE +21 -0
  2. package/dist/_virtual/_rolldown/runtime.js +29 -0
  3. package/dist/firestore.event-lake.aggregate-store.d.ts +35 -0
  4. package/dist/firestore.event-lake.aggregate-store.d.ts.map +1 -0
  5. package/dist/firestore.event-lake.aggregate-store.js +38 -0
  6. package/dist/firestore.event-lake.aggregate-store.mjs +36 -0
  7. package/dist/firestore.event-lake.aggregate-store.spec.d.ts +2 -0
  8. package/dist/firestore.event-lake.aggregate-store.spec.d.ts.map +1 -0
  9. package/dist/firestore.event-lake.storage-layer.d.ts +14 -0
  10. package/dist/firestore.event-lake.storage-layer.d.ts.map +1 -0
  11. package/dist/firestore.event-lake.storage-layer.js +67 -0
  12. package/dist/firestore.event-lake.storage-layer.mjs +65 -0
  13. package/dist/firestore.event-lake.store.d.ts +6 -0
  14. package/dist/firestore.event-lake.store.d.ts.map +1 -0
  15. package/dist/firestore.event-lake.store.js +14 -0
  16. package/dist/firestore.event-lake.store.mjs +13 -0
  17. package/dist/firestore.event-lake.store.spec.d.ts +2 -0
  18. package/dist/firestore.event-lake.store.spec.d.ts.map +1 -0
  19. package/dist/firestore.event-stream-store.spec.d.ts +2 -0
  20. package/dist/firestore.event-stream-store.spec.d.ts.map +1 -0
  21. package/dist/firestore.event-stream.aggregate-store.d.ts +30 -0
  22. package/dist/firestore.event-stream.aggregate-store.d.ts.map +1 -0
  23. package/dist/firestore.event-stream.aggregate-store.js +38 -0
  24. package/dist/firestore.event-stream.aggregate-store.mjs +36 -0
  25. package/dist/firestore.event-stream.aggregate-store.spec.d.ts +2 -0
  26. package/dist/firestore.event-stream.aggregate-store.spec.d.ts.map +1 -0
  27. package/dist/firestore.event-stream.storage-layer.d.ts +15 -0
  28. package/dist/firestore.event-stream.storage-layer.d.ts.map +1 -0
  29. package/dist/firestore.event-stream.storage-layer.js +67 -0
  30. package/dist/firestore.event-stream.storage-layer.mjs +65 -0
  31. package/dist/firestore.event-stream.store.d.ts +6 -0
  32. package/dist/firestore.event-stream.store.d.ts.map +1 -0
  33. package/dist/firestore.event-stream.store.js +14 -0
  34. package/dist/firestore.event-stream.store.mjs +13 -0
  35. package/dist/firestore.projected-stream.reader.d.ts +13 -0
  36. package/dist/firestore.projected-stream.reader.d.ts.map +1 -0
  37. package/dist/firestore.projected-stream.reader.js +35 -0
  38. package/dist/firestore.projected-stream.reader.mjs +34 -0
  39. package/dist/firestore.projected-stream.reader.spec.d.ts +2 -0
  40. package/dist/firestore.projected-stream.reader.spec.d.ts.map +1 -0
  41. package/dist/firestore.projected-stream.storage-layer.d.ts +31 -0
  42. package/dist/firestore.projected-stream.storage-layer.d.ts.map +1 -0
  43. package/dist/firestore.projected-stream.storage-layer.js +121 -0
  44. package/dist/firestore.projected-stream.storage-layer.mjs +118 -0
  45. package/dist/firestore.snapshotter.d.ts +6 -0
  46. package/dist/firestore.snapshotter.d.ts.map +1 -0
  47. package/dist/firestore.snapshotter.js +36 -0
  48. package/dist/firestore.snapshotter.mjs +35 -0
  49. package/dist/index.d.ts +11 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +30 -0
  52. package/dist/index.mjs +12 -0
  53. package/dist/projection/cases/attempts.spec.d.ts +2 -0
  54. package/dist/projection/cases/attempts.spec.d.ts.map +1 -0
  55. package/dist/projection/cases/batchlast.spec.d.ts +2 -0
  56. package/dist/projection/cases/batchlast.spec.d.ts.map +1 -0
  57. package/dist/projection/cases/bigshuffle.spec.d.ts +2 -0
  58. package/dist/projection/cases/bigshuffle.spec.d.ts.map +1 -0
  59. package/dist/projection/cases/burst.spec.d.ts +2 -0
  60. package/dist/projection/cases/burst.spec.d.ts.map +1 -0
  61. package/dist/projection/cases/claimtimeout.spec.d.ts +2 -0
  62. package/dist/projection/cases/claimtimeout.spec.d.ts.map +1 -0
  63. package/dist/projection/cases/concurrency.spec.d.ts +2 -0
  64. package/dist/projection/cases/concurrency.spec.d.ts.map +1 -0
  65. package/dist/projection/cases/deduplicate.spec.d.ts +2 -0
  66. package/dist/projection/cases/deduplicate.spec.d.ts.map +1 -0
  67. package/dist/projection/cases/defer.spec.d.ts +2 -0
  68. package/dist/projection/cases/defer.spec.d.ts.map +1 -0
  69. package/dist/projection/cases/lock.spec.d.ts +2 -0
  70. package/dist/projection/cases/lock.spec.d.ts.map +1 -0
  71. package/dist/projection/cases/skip.spec.d.ts +2 -0
  72. package/dist/projection/cases/skip.spec.d.ts.map +1 -0
  73. package/dist/projection/cases/stress.spec.d.ts +2 -0
  74. package/dist/projection/cases/stress.spec.d.ts.map +1 -0
  75. package/dist/projection/event-coordinator.d.ts +16 -0
  76. package/dist/projection/event-coordinator.d.ts.map +1 -0
  77. package/dist/projection/event-coordinator.js +47 -0
  78. package/dist/projection/event-coordinator.mjs +47 -0
  79. package/dist/projection/firestore.projector.d.ts +128 -0
  80. package/dist/projection/firestore.projector.d.ts.map +1 -0
  81. package/dist/projection/firestore.projector.js +538 -0
  82. package/dist/projection/firestore.projector.mjs +533 -0
  83. package/dist/projection/testkit/case-fixture.d.ts +610 -0
  84. package/dist/projection/testkit/case-fixture.d.ts.map +1 -0
  85. package/dist/projection/testkit.d.ts +44 -0
  86. package/dist/projection/testkit.d.ts.map +1 -0
  87. package/dist/projection/trace.decorator.d.ts +2 -0
  88. package/dist/projection/trace.decorator.d.ts.map +1 -0
  89. package/dist/utils/promise-with-resolvers.d.ts +7 -0
  90. package/dist/utils/promise-with-resolvers.d.ts.map +1 -0
  91. package/dist/utils/promise-with-resolvers.js +17 -0
  92. package/dist/utils/promise-with-resolvers.mjs +16 -0
  93. package/package.json +43 -41
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bigshuffle.spec.d.ts","sourceRoot":"","sources":["../../../src/projection/cases/bigshuffle.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=burst.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"burst.spec.d.ts","sourceRoot":"","sources":["../../../src/projection/cases/burst.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=claimtimeout.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claimtimeout.spec.d.ts","sourceRoot":"","sources":["../../../src/projection/cases/claimtimeout.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=concurrency.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concurrency.spec.d.ts","sourceRoot":"","sources":["../../../src/projection/cases/concurrency.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=deduplicate.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deduplicate.spec.d.ts","sourceRoot":"","sources":["../../../src/projection/cases/deduplicate.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=defer.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defer.spec.d.ts","sourceRoot":"","sources":["../../../src/projection/cases/defer.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=lock.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lock.spec.d.ts","sourceRoot":"","sources":["../../../src/projection/cases/lock.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=skip.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skip.spec.d.ts","sourceRoot":"","sources":["../../../src/projection/cases/skip.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=stress.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stress.spec.d.ts","sourceRoot":"","sources":["../../../src/projection/cases/stress.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ import type { IEsEvent, ISavedChange } from "@ddd-ts/core";
2
+ export declare class EventCoordinator {
3
+ private eventProcessing;
4
+ private currentEventId;
5
+ private lastEvent;
6
+ private isRunning;
7
+ private _onEmpty;
8
+ addEvent(event: ISavedChange<IEsEvent>): void;
9
+ start(event: ISavedChange<IEsEvent>): () => void;
10
+ waitCurrentEvent(): Promise<void>;
11
+ cleanEvent(event: ISavedChange<IEsEvent>): void;
12
+ canProceed(event: ISavedChange<IEsEvent>): boolean;
13
+ onEmpty(callback: () => void): void;
14
+ checkEmpty(): void;
15
+ }
16
+ //# sourceMappingURL=event-coordinator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-coordinator.d.ts","sourceRoot":"","sources":["../../src/projection/event-coordinator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG3D,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,eAAe,CAAkD;IACzE,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,SAAS,CAAuC;IACxD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAY;IAE5B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC,QAAQ,CAAC;IAYtC,KAAK,CAAC,KAAK,EAAE,YAAY,CAAC,QAAQ,CAAC;IAU7B,gBAAgB;IAMtB,UAAU,CAAC,KAAK,EAAE,YAAY,CAAC,QAAQ,CAAC;IAYxC,UAAU,CAAC,KAAK,EAAE,YAAY,CAAC,QAAQ,CAAC;IAMxC,OAAO,CAAC,QAAQ,EAAE,MAAM,IAAI;IAI5B,UAAU;CAKX"}
@@ -0,0 +1,47 @@
1
+ const require_promise_with_resolvers = require('../utils/promise-with-resolvers.js');
2
+
3
+ //#region src/projection/event-coordinator.ts
4
+ var EventCoordinator = class {
5
+ eventProcessing = /* @__PURE__ */ new Map();
6
+ currentEventId = null;
7
+ lastEvent = null;
8
+ isRunning = false;
9
+ _onEmpty = () => {};
10
+ addEvent(event) {
11
+ const eventId = event.id.serialize();
12
+ this.eventProcessing.set(eventId, require_promise_with_resolvers.promiseWithResolvers());
13
+ if (this.lastEvent === null || this.lastEvent.revision < event.revision) this.lastEvent = event;
14
+ }
15
+ start(event) {
16
+ if (this.isRunning) throw new Error("Event processing already in progress");
17
+ this.currentEventId = event.id.serialize();
18
+ this.isRunning = true;
19
+ return () => this.cleanEvent(event);
20
+ }
21
+ async waitCurrentEvent() {
22
+ if (!this.currentEventId) return;
23
+ await this.eventProcessing.get(this.currentEventId)?.promise;
24
+ }
25
+ cleanEvent(event) {
26
+ const eventId = event.id.serialize();
27
+ this.eventProcessing.get(eventId)?.resolve();
28
+ this.eventProcessing.delete(eventId);
29
+ this.isRunning = false;
30
+ this.currentEventId = null;
31
+ this.checkEmpty();
32
+ }
33
+ canProceed(event) {
34
+ if (this.isRunning) return false;
35
+ const eventId = event.id.serialize();
36
+ return this.lastEvent?.id.serialize() === eventId;
37
+ }
38
+ onEmpty(callback) {
39
+ this._onEmpty = callback;
40
+ }
41
+ checkEmpty() {
42
+ if (this.eventProcessing.size === 0) this._onEmpty();
43
+ }
44
+ };
45
+
46
+ //#endregion
47
+ exports.EventCoordinator = EventCoordinator;
@@ -0,0 +1,47 @@
1
+ import { promiseWithResolvers } from "../utils/promise-with-resolvers.mjs";
2
+
3
+ //#region src/projection/event-coordinator.ts
4
+ var EventCoordinator = class {
5
+ eventProcessing = /* @__PURE__ */ new Map();
6
+ currentEventId = null;
7
+ lastEvent = null;
8
+ isRunning = false;
9
+ _onEmpty = () => {};
10
+ addEvent(event) {
11
+ const eventId = event.id.serialize();
12
+ this.eventProcessing.set(eventId, promiseWithResolvers());
13
+ if (this.lastEvent === null || this.lastEvent.revision < event.revision) this.lastEvent = event;
14
+ }
15
+ start(event) {
16
+ if (this.isRunning) throw new Error("Event processing already in progress");
17
+ this.currentEventId = event.id.serialize();
18
+ this.isRunning = true;
19
+ return () => this.cleanEvent(event);
20
+ }
21
+ async waitCurrentEvent() {
22
+ if (!this.currentEventId) return;
23
+ await this.eventProcessing.get(this.currentEventId)?.promise;
24
+ }
25
+ cleanEvent(event) {
26
+ const eventId = event.id.serialize();
27
+ this.eventProcessing.get(eventId)?.resolve();
28
+ this.eventProcessing.delete(eventId);
29
+ this.isRunning = false;
30
+ this.currentEventId = null;
31
+ this.checkEmpty();
32
+ }
33
+ canProceed(event) {
34
+ if (this.isRunning) return false;
35
+ const eventId = event.id.serialize();
36
+ return this.lastEvent?.id.serialize() === eventId;
37
+ }
38
+ onEmpty(callback) {
39
+ this._onEmpty = callback;
40
+ }
41
+ checkEmpty() {
42
+ if (this.eventProcessing.size === 0) this._onEmpty();
43
+ }
44
+ };
45
+
46
+ //#endregion
47
+ export { EventCoordinator };
@@ -0,0 +1,128 @@
1
+ import { Firestore, WriteBatch } from "firebase-admin/firestore";
2
+ import { type IEsEvent, type ISavedChange, EventId, ProjectedStreamReader, Cursor, CheckpointId, ESProjection, type IFact, type Serialized, Lock } from "@ddd-ts/core";
3
+ import { Mapping, MicrosecondTimestamp } from "@ddd-ts/shape";
4
+ import { DefaultConverter, FirestoreTransaction } from "@ddd-ts/store-firestore";
5
+ interface FirestoreProjectorConfig {
6
+ retry: {
7
+ attempts: number;
8
+ minDelay: number;
9
+ maxDelay: number;
10
+ backoff: number;
11
+ };
12
+ enqueue: {
13
+ batchSize: number;
14
+ };
15
+ onProcessError: (error: Error) => void;
16
+ onEnqueueError: (error: Error) => void;
17
+ }
18
+ export declare class FirestoreProjector {
19
+ readonly projection: ESProjection<IEsEvent>;
20
+ readonly reader: ProjectedStreamReader<IEsEvent>;
21
+ readonly queue: FirestoreQueueStore;
22
+ config: FirestoreProjectorConfig;
23
+ _unclaim: boolean;
24
+ constructor(projection: ESProjection<IEsEvent>, reader: ProjectedStreamReader<IEsEvent>, queue: FirestoreQueueStore, config?: FirestoreProjectorConfig);
25
+ breathe(): AsyncGenerator<readonly [number, () => void], void, unknown>;
26
+ private eventCoordinators;
27
+ private getEventCoordinator;
28
+ handle(savedChange: ISavedChange<IEsEvent>): Promise<void>;
29
+ private getCursor;
30
+ private attempt;
31
+ private getQueueHead;
32
+ private readSourceStream;
33
+ private enqueue;
34
+ private enqueueOne;
35
+ private checkIsProcessed;
36
+ private getUnprocessed;
37
+ private claimTasks;
38
+ private processEvents;
39
+ private assertBeforeInsert;
40
+ }
41
+ export declare class AlreadyEnqueuedError extends Error {
42
+ constructor();
43
+ }
44
+ export declare class FirestoreQueueStore {
45
+ db: Firestore;
46
+ converter: DefaultConverter<FirebaseFirestore.DocumentData>;
47
+ collection: FirebaseFirestore.CollectionReference;
48
+ constructor(db: Firestore);
49
+ private timestampToMicroseconds;
50
+ private microsecondsToTimestamp;
51
+ enqueue(checkpointId: CheckpointId, tasks: Task<false>[]): Promise<readonly ["OK", "Tasks enqueued successfully"] | readonly ["DEFERRED", any]>;
52
+ claim(checkpointId: CheckpointId, claimer: ClaimerId, tasks: Task<true>[]): Promise<void>;
53
+ head(checkpointId: CheckpointId): Promise<Cursor | undefined>;
54
+ unprocessed(checkpointId: CheckpointId): Promise<Task<true>[]>;
55
+ claimed(checkpointId: CheckpointId, claimer: ClaimerId): Promise<Task<true>[]>;
56
+ unclaim(checkpointId: CheckpointId, tasks: Task<true>[]): Promise<void>;
57
+ /**
58
+ * If the task exists, then looks for a processed flag.
59
+ * If not found, check if the cursor is older than the retention time for processed event.
60
+ * If so, consider it processed.
61
+ * Otherwise, consider it missing.
62
+ */
63
+ isProcessed(checkpointId: CheckpointId, cursor: Cursor): Promise<"ENQUEUED" | "PROCESSED" | "MISSING">;
64
+ checkpoint(id: CheckpointId): FirebaseFirestore.CollectionReference<FirebaseFirestore.DocumentData, FirebaseFirestore.DocumentData>;
65
+ queue(id: CheckpointId): FirebaseFirestore.CollectionReference<FirebaseFirestore.DocumentData, FirebaseFirestore.DocumentData>;
66
+ queued(id: CheckpointId, eventId: EventId): FirebaseFirestore.DocumentReference<FirebaseFirestore.DocumentData, FirebaseFirestore.DocumentData>;
67
+ processed(claimerId: ClaimerId, id: CheckpointId, eventIds: EventId[], context?: {
68
+ transaction?: FirestoreTransaction;
69
+ batchWriter?: WriteBatch;
70
+ }): Promise<void>;
71
+ getTailCursor(id: CheckpointId): Promise<Cursor | undefined>;
72
+ cleanup(id: CheckpointId): Promise<void>;
73
+ flush(id: CheckpointId): Promise<void>;
74
+ /**
75
+ * This method adds a fake processed event to the queue.
76
+ * It is useful for initializing the tail cursor of a new projection, at the
77
+ * same time as the projection's initial state is created, reset, or updated.
78
+ * By default, it will use the current time as the occurredAt timestamp.
79
+ * You can override this by providing a specific timestamp.
80
+ *
81
+ * This ensures that the projection can start processing new events from the
82
+ * correct point in time, avoiding reprocessing of old events.
83
+ */
84
+ seed(checkpointId: CheckpointId): Promise<void>;
85
+ }
86
+ export declare class ClaimerId extends EventId {
87
+ }
88
+ declare const Task_base: import("@ddd-ts/shape").IDict<{
89
+ readonly id: typeof EventId;
90
+ readonly ref: StringConstructor;
91
+ readonly occurredAt: typeof MicrosecondTimestamp;
92
+ readonly revision: NumberConstructor;
93
+ readonly attempts: NumberConstructor;
94
+ readonly processed: BooleanConstructor;
95
+ /** @deprecated */ readonly claimer: import("@ddd-ts/shape").IOptional<StringConstructor, typeof import("@ddd-ts/shape").Empty>;
96
+ /** @deprecated */ readonly claimedAt: import("@ddd-ts/shape").IOptional<typeof MicrosecondTimestamp, typeof import("@ddd-ts/shape").Empty>;
97
+ readonly claimsMetadata: Mapping<[{
98
+ claimedAt: typeof MicrosecondTimestamp;
99
+ processedAt: import("@ddd-ts/shape").IOptional<typeof MicrosecondTimestamp, typeof import("@ddd-ts/shape").Empty>;
100
+ }], typeof import("@ddd-ts/shape").Empty>;
101
+ readonly claimIds: [StringConstructor];
102
+ readonly lock: typeof Lock;
103
+ readonly skipAfter: NumberConstructor;
104
+ readonly remaining: NumberConstructor;
105
+ readonly isolateAfter: NumberConstructor;
106
+ readonly claimTimeout: NumberConstructor;
107
+ readonly lastUpdateTime: import("@ddd-ts/shape").IOptional<typeof MicrosecondTimestamp, typeof import("@ddd-ts/shape").Empty>;
108
+ }, typeof import("@ddd-ts/shape").Empty>;
109
+ export declare class Task<Stored extends boolean> extends Task_base {
110
+ lastUpdateTime: Stored extends true ? MicrosecondTimestamp : undefined;
111
+ get cursor(): Cursor;
112
+ static new(fact: IFact, config: {
113
+ lock: Lock;
114
+ claimTimeout: number;
115
+ skipAfter: number;
116
+ isolateAfter: number;
117
+ }): Task<false>;
118
+ get currentClaimId(): string | undefined;
119
+ get isProcessing(): boolean;
120
+ get isProcessed(): boolean;
121
+ get shouldSkip(): boolean;
122
+ get shouldIsolate(): boolean;
123
+ checkTimeout(): void;
124
+ static deserializeWithLastUpdateTime(data: Omit<Serialized<Task<true>>, "lastUpdateTime">, timestamp?: MicrosecondTimestamp): Task<true>;
125
+ static batch(tasks: Task<true>[]): Task<true>[];
126
+ }
127
+ export {};
128
+ //# sourceMappingURL=firestore.projector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"firestore.projector.d.ts","sourceRoot":"","sources":["../../src/projection/firestore.projector.ts"],"names":[],"mappings":"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"}