@powerhousedao/reactor 4.1.0-dev.9 → 4.1.0-dev.90
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/src/cache/buffer/ring-buffer.d.ts +37 -0
- package/dist/src/cache/buffer/ring-buffer.d.ts.map +1 -0
- package/dist/src/cache/buffer/ring-buffer.js +69 -0
- package/dist/src/cache/buffer/ring-buffer.js.map +1 -0
- package/dist/src/cache/kysely-write-cache.d.ts +133 -0
- package/dist/src/cache/kysely-write-cache.d.ts.map +1 -0
- package/dist/src/cache/kysely-write-cache.js +375 -0
- package/dist/src/cache/kysely-write-cache.js.map +1 -0
- package/dist/src/cache/lru/lru-tracker.d.ts +15 -0
- package/dist/src/cache/lru/lru-tracker.d.ts.map +1 -0
- package/dist/src/cache/lru/lru-tracker.js +96 -0
- package/dist/src/cache/lru/lru-tracker.js.map +1 -0
- package/dist/src/cache/types.d.ts +42 -0
- package/dist/src/cache/types.d.ts.map +1 -0
- package/dist/src/cache/types.js +2 -0
- package/dist/src/cache/types.js.map +1 -0
- package/dist/src/cache/write/interfaces.d.ts +83 -0
- package/dist/src/cache/write/interfaces.d.ts.map +1 -0
- package/dist/src/cache/write/interfaces.js +2 -0
- package/dist/src/cache/write/interfaces.js.map +1 -0
- package/dist/src/client/reactor-client.d.ts +103 -0
- package/dist/src/client/reactor-client.d.ts.map +1 -0
- package/dist/src/client/reactor-client.js +184 -0
- package/dist/src/client/reactor-client.js.map +1 -0
- package/dist/src/client/types.d.ts +213 -0
- package/dist/src/client/types.d.ts.map +1 -0
- package/dist/src/client/types.js +14 -0
- package/dist/src/client/types.js.map +1 -0
- package/dist/src/core/builder.d.ts +20 -0
- package/dist/src/core/builder.d.ts.map +1 -0
- package/dist/src/core/builder.js +47 -0
- package/dist/src/core/builder.js.map +1 -0
- package/dist/src/core/reactor.d.ts +92 -0
- package/dist/src/core/reactor.d.ts.map +1 -0
- package/dist/src/core/reactor.js +646 -0
- package/dist/src/core/reactor.js.map +1 -0
- package/dist/src/core/types.d.ts +121 -0
- package/dist/src/core/types.d.ts.map +1 -0
- package/dist/src/core/types.js +2 -0
- package/dist/src/core/types.js.map +1 -0
- package/dist/src/core/utils.d.ts +11 -0
- package/dist/src/core/utils.d.ts.map +1 -0
- package/dist/src/core/utils.js +31 -0
- package/dist/src/core/utils.js.map +1 -0
- package/dist/src/events/event-bus.d.ts +3 -3
- package/dist/src/events/event-bus.d.ts.map +1 -1
- package/dist/src/events/event-bus.js.map +1 -1
- package/dist/src/events/interfaces.d.ts +1 -1
- package/dist/src/events/interfaces.d.ts.map +1 -1
- package/dist/src/events/types.d.ts +15 -1
- package/dist/src/events/types.d.ts.map +1 -1
- package/dist/src/events/types.js +6 -0
- package/dist/src/events/types.js.map +1 -1
- package/dist/src/executor/interfaces.d.ts +31 -54
- package/dist/src/executor/interfaces.d.ts.map +1 -1
- package/dist/src/executor/simple-job-executor-manager.d.ts +31 -0
- package/dist/src/executor/simple-job-executor-manager.d.ts.map +1 -0
- package/dist/src/executor/simple-job-executor-manager.js +190 -0
- package/dist/src/executor/simple-job-executor-manager.js.map +1 -0
- package/dist/src/executor/simple-job-executor.d.ts +48 -0
- package/dist/src/executor/simple-job-executor.d.ts.map +1 -0
- package/dist/src/executor/simple-job-executor.js +488 -0
- package/dist/src/executor/simple-job-executor.js.map +1 -0
- package/dist/src/executor/types.d.ts +30 -8
- package/dist/src/executor/types.d.ts.map +1 -1
- package/dist/src/executor/types.js.map +1 -1
- package/dist/src/executor/util.d.ts +47 -0
- package/dist/src/executor/util.d.ts.map +1 -0
- package/dist/src/executor/util.js +113 -0
- package/dist/src/executor/util.js.map +1 -0
- package/dist/src/index.d.ts +30 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +36 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/job-tracker/in-memory-job-tracker.d.ts +15 -0
- package/dist/src/job-tracker/in-memory-job-tracker.d.ts.map +1 -0
- package/dist/src/job-tracker/in-memory-job-tracker.js +78 -0
- package/dist/src/job-tracker/in-memory-job-tracker.js.map +1 -0
- package/dist/src/job-tracker/index.d.ts +3 -0
- package/dist/src/job-tracker/index.d.ts.map +1 -0
- package/dist/src/job-tracker/index.js +2 -0
- package/dist/src/job-tracker/index.js.map +1 -0
- package/dist/src/job-tracker/interfaces.d.ts +41 -0
- package/dist/src/job-tracker/interfaces.d.ts.map +1 -0
- package/dist/src/job-tracker/interfaces.js +2 -0
- package/dist/src/job-tracker/interfaces.js.map +1 -0
- package/dist/src/queue/interfaces.d.ts +45 -5
- package/dist/src/queue/interfaces.d.ts.map +1 -1
- package/dist/src/queue/job-execution-handle.d.ts +24 -0
- package/dist/src/queue/job-execution-handle.d.ts.map +1 -0
- package/dist/src/queue/job-execution-handle.js +62 -0
- package/dist/src/queue/job-execution-handle.js.map +1 -0
- package/dist/src/queue/queue.d.ts +54 -5
- package/dist/src/queue/queue.d.ts.map +1 -1
- package/dist/src/queue/queue.js +272 -36
- package/dist/src/queue/queue.js.map +1 -1
- package/dist/src/queue/types.d.ts +32 -5
- package/dist/src/queue/types.d.ts.map +1 -1
- package/dist/src/queue/types.js +12 -0
- package/dist/src/queue/types.js.map +1 -1
- package/dist/src/read-models/coordinator.d.ts +38 -0
- package/dist/src/read-models/coordinator.d.ts.map +1 -0
- package/dist/src/read-models/coordinator.js +62 -0
- package/dist/src/read-models/coordinator.js.map +1 -0
- package/dist/src/read-models/document-view.d.ts +20 -0
- package/dist/src/read-models/document-view.d.ts.map +1 -0
- package/dist/src/read-models/document-view.js +365 -0
- package/dist/src/read-models/document-view.js.map +1 -0
- package/dist/src/read-models/interfaces.d.ts +29 -0
- package/dist/src/read-models/interfaces.d.ts.map +1 -0
- package/dist/src/read-models/interfaces.js +2 -0
- package/dist/src/read-models/interfaces.js.map +1 -0
- package/dist/src/read-models/types.d.ts +46 -0
- package/dist/src/read-models/types.d.ts.map +1 -0
- package/dist/src/read-models/types.js +2 -0
- package/dist/src/read-models/types.js.map +1 -0
- package/dist/src/registry/implementation.d.ts +62 -0
- package/dist/src/registry/implementation.d.ts.map +1 -0
- package/dist/src/registry/implementation.js +96 -0
- package/dist/src/registry/implementation.js.map +1 -0
- package/dist/src/registry/index.d.ts +3 -0
- package/dist/src/registry/index.d.ts.map +1 -0
- package/dist/src/registry/index.js +2 -0
- package/dist/src/registry/index.js.map +1 -0
- package/dist/src/registry/interfaces.d.ts +39 -0
- package/dist/src/registry/interfaces.d.ts.map +1 -0
- package/dist/src/registry/interfaces.js +2 -0
- package/dist/src/registry/interfaces.js.map +1 -0
- package/dist/src/shared/awaiter.d.ts +32 -0
- package/dist/src/shared/awaiter.d.ts.map +1 -0
- package/dist/src/shared/awaiter.js +132 -0
- package/dist/src/shared/awaiter.js.map +1 -0
- package/dist/src/shared/errors.d.ts +17 -0
- package/dist/src/shared/errors.d.ts.map +1 -0
- package/dist/src/shared/errors.js +33 -0
- package/dist/src/shared/errors.js.map +1 -0
- package/dist/src/shared/factories.d.ts +16 -0
- package/dist/src/shared/factories.d.ts.map +1 -0
- package/dist/src/shared/factories.js +33 -0
- package/dist/src/shared/factories.js.map +1 -0
- package/dist/src/shared/types.d.ts +91 -19
- package/dist/src/shared/types.d.ts.map +1 -1
- package/dist/src/shared/types.js +35 -1
- package/dist/src/shared/types.js.map +1 -1
- package/dist/src/shared/utils.d.ts +3 -0
- package/dist/src/shared/utils.d.ts.map +1 -0
- package/dist/src/shared/utils.js +8 -0
- package/dist/src/shared/utils.js.map +1 -0
- package/dist/src/signer/passthrough-signer.d.ts +6 -0
- package/dist/src/signer/passthrough-signer.d.ts.map +1 -0
- package/dist/src/signer/passthrough-signer.js +6 -0
- package/dist/src/signer/passthrough-signer.js.map +1 -0
- package/dist/src/signer/types.d.ts +15 -0
- package/dist/src/signer/types.d.ts.map +1 -0
- package/dist/src/signer/types.js +2 -0
- package/dist/src/signer/types.js.map +1 -0
- package/dist/src/storage/interfaces.d.ts +121 -0
- package/dist/src/storage/interfaces.d.ts.map +1 -0
- package/dist/src/storage/interfaces.js +19 -0
- package/dist/src/storage/interfaces.js.map +1 -0
- package/dist/src/storage/kysely/keyframe-store.d.ts +15 -0
- package/dist/src/storage/kysely/keyframe-store.d.ts.map +1 -0
- package/dist/src/storage/kysely/keyframe-store.js +71 -0
- package/dist/src/storage/kysely/keyframe-store.js.map +1 -0
- package/dist/src/storage/kysely/store.d.ts +15 -0
- package/dist/src/storage/kysely/store.d.ts.map +1 -0
- package/dist/src/storage/kysely/store.js +196 -0
- package/dist/src/storage/kysely/store.js.map +1 -0
- package/dist/src/storage/kysely/types.d.ts +39 -0
- package/dist/src/storage/kysely/types.d.ts.map +1 -0
- package/dist/src/storage/kysely/types.js +2 -0
- package/dist/src/storage/kysely/types.js.map +1 -0
- package/dist/src/storage/txn.d.ts +15 -0
- package/dist/src/storage/txn.d.ts.map +1 -0
- package/dist/src/storage/txn.js +41 -0
- package/dist/src/storage/txn.js.map +1 -0
- package/dist/src/subs/default-error-handler.d.ts +13 -0
- package/dist/src/subs/default-error-handler.d.ts.map +1 -0
- package/dist/src/subs/default-error-handler.js +27 -0
- package/dist/src/subs/default-error-handler.js.map +1 -0
- package/dist/src/subs/react-subscription-manager.d.ts +45 -0
- package/dist/src/subs/react-subscription-manager.d.ts.map +1 -0
- package/dist/src/subs/react-subscription-manager.js +185 -0
- package/dist/src/subs/react-subscription-manager.js.map +1 -0
- package/dist/src/subs/types.d.ts +64 -0
- package/dist/src/subs/types.d.ts.map +1 -0
- package/dist/src/subs/types.js +2 -0
- package/dist/src/subs/types.js.map +1 -0
- package/dist/src/utils/reshuffle.d.ts +30 -0
- package/dist/src/utils/reshuffle.d.ts.map +1 -0
- package/dist/src/utils/reshuffle.js +47 -0
- package/dist/src/utils/reshuffle.js.map +1 -0
- package/package.json +18 -7
- package/dist/bench/end-to-end-flow.bench.d.ts +0 -2
- package/dist/bench/end-to-end-flow.bench.d.ts.map +0 -1
- package/dist/bench/end-to-end-flow.bench.js +0 -256
- package/dist/bench/end-to-end-flow.bench.js.map +0 -1
- package/dist/bench/event-bus.bench.d.ts +0 -2
- package/dist/bench/event-bus.bench.d.ts.map +0 -1
- package/dist/bench/event-bus.bench.js +0 -238
- package/dist/bench/event-bus.bench.js.map +0 -1
- package/dist/bench/queue-only.bench.d.ts +0 -2
- package/dist/bench/queue-only.bench.d.ts.map +0 -1
- package/dist/bench/queue-only.bench.js +0 -40
- package/dist/bench/queue-only.bench.js.map +0 -1
- package/dist/bench/reactor-throughput.bench.d.ts +0 -2
- package/dist/bench/reactor-throughput.bench.d.ts.map +0 -1
- package/dist/bench/reactor-throughput.bench.js +0 -137
- package/dist/bench/reactor-throughput.bench.js.map +0 -1
- package/dist/src/executor/job-executor.d.ts +0 -62
- package/dist/src/executor/job-executor.d.ts.map +0 -1
- package/dist/src/executor/job-executor.js +0 -325
- package/dist/src/executor/job-executor.js.map +0 -1
- package/dist/test/event-bus.test.d.ts +0 -2
- package/dist/test/event-bus.test.d.ts.map +0 -1
- package/dist/test/event-bus.test.js +0 -532
- package/dist/test/event-bus.test.js.map +0 -1
- package/dist/test/job-executor.test.d.ts +0 -2
- package/dist/test/job-executor.test.d.ts.map +0 -1
- package/dist/test/job-executor.test.js +0 -581
- package/dist/test/job-executor.test.js.map +0 -1
- package/dist/test/queue.test.d.ts +0 -2
- package/dist/test/queue.test.d.ts.map +0 -1
- package/dist/test/queue.test.js +0 -396
- package/dist/test/queue.test.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { OperationEventTypes, } from "../events/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Coordinates read model synchronization by listening to operation write events
|
|
4
|
+
* and updating all registered read models in parallel.
|
|
5
|
+
*
|
|
6
|
+
* This coordinator is responsible for:
|
|
7
|
+
* - Subscribing to OPERATION_WRITTEN events from the event bus
|
|
8
|
+
* - Distributing operation updates to all registered read models
|
|
9
|
+
* - Managing the lifecycle of read model subscriptions
|
|
10
|
+
*
|
|
11
|
+
* Read models are updated asynchronously and in parallel to avoid blocking
|
|
12
|
+
* the write path. Errors in read model updates are propagated through the
|
|
13
|
+
* event bus but do not affect the write operation success.
|
|
14
|
+
*/
|
|
15
|
+
export class ReadModelCoordinator {
|
|
16
|
+
eventBus;
|
|
17
|
+
readModels;
|
|
18
|
+
unsubscribe;
|
|
19
|
+
isRunning = false;
|
|
20
|
+
constructor(eventBus, readModels) {
|
|
21
|
+
this.eventBus = eventBus;
|
|
22
|
+
this.readModels = readModels;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Start listening for operation events and updating read models.
|
|
26
|
+
* Can be called multiple times safely (subsequent calls are no-ops).
|
|
27
|
+
*/
|
|
28
|
+
start() {
|
|
29
|
+
if (this.isRunning) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
// Subscribe to OPERATION_WRITTEN events
|
|
33
|
+
this.unsubscribe = this.eventBus.subscribe(OperationEventTypes.OPERATION_WRITTEN, async (type, event) => {
|
|
34
|
+
await this.handleOperationWritten(event);
|
|
35
|
+
});
|
|
36
|
+
this.isRunning = true;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Stop listening and clean up subscriptions.
|
|
40
|
+
* Can be called multiple times safely (subsequent calls are no-ops).
|
|
41
|
+
*/
|
|
42
|
+
stop() {
|
|
43
|
+
if (!this.isRunning) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (this.unsubscribe) {
|
|
47
|
+
this.unsubscribe();
|
|
48
|
+
this.unsubscribe = undefined;
|
|
49
|
+
}
|
|
50
|
+
this.isRunning = false;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Handle operation written events by updating all read models in parallel.
|
|
54
|
+
* Errors from individual read models are collected and re-thrown as an aggregate.
|
|
55
|
+
*/
|
|
56
|
+
async handleOperationWritten(event) {
|
|
57
|
+
// Index into all read models in parallel
|
|
58
|
+
// If any read model fails, the error will be collected by the event bus
|
|
59
|
+
await Promise.all(this.readModels.map((readModel) => readModel.indexOperations(event.operations)));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=coordinator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../../../src/read-models/coordinator.ts"],"names":[],"mappings":"AACA,OAAO,EACL,mBAAmB,GAGpB,MAAM,oBAAoB,CAAC;AAG5B;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,oBAAoB;IAKrB;IACA;IALF,WAAW,CAAe;IAC1B,SAAS,GAAG,KAAK,CAAC;IAE1B,YACU,QAAmB,EACnB,UAAwB;QADxB,aAAQ,GAAR,QAAQ,CAAW;QACnB,eAAU,GAAV,UAAU,CAAc;IAC/B,CAAC;IAEJ;;;OAGG;IACH,KAAK;QACH,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,wCAAwC;QACxC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CACxC,mBAAmB,CAAC,iBAAiB,EACrC,KAAK,EAAE,IAAI,EAAE,KAA4B,EAAE,EAAE;YAC3C,MAAM,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,IAAI;QACF,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;QAC/B,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IACzB,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,sBAAsB,CAClC,KAA4B;QAE5B,yCAAyC;QACzC,wEAAwE;QACxE,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAChC,SAAS,CAAC,eAAe,CAAC,KAAK,CAAC,UAAU,CAAC,CAC5C,CACF,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { PHDocument } from "document-model";
|
|
2
|
+
import type { Kysely } from "kysely";
|
|
3
|
+
import type { IDocumentView, IOperationStore, OperationWithContext, ViewFilter } from "../storage/interfaces.js";
|
|
4
|
+
import type { Database as StorageDatabase } from "../storage/kysely/types.js";
|
|
5
|
+
import type { DocumentViewDatabase } from "./types.js";
|
|
6
|
+
type Database = StorageDatabase & DocumentViewDatabase;
|
|
7
|
+
export declare class KyselyDocumentView implements IDocumentView {
|
|
8
|
+
private db;
|
|
9
|
+
private operationStore;
|
|
10
|
+
private lastOperationId;
|
|
11
|
+
constructor(db: Kysely<Database>, operationStore: IOperationStore);
|
|
12
|
+
init(): Promise<void>;
|
|
13
|
+
indexOperations(items: OperationWithContext[]): Promise<void>;
|
|
14
|
+
exists(documentIds: string[], signal?: AbortSignal): Promise<boolean[]>;
|
|
15
|
+
get<TDocument extends PHDocument>(documentId: string, view?: ViewFilter, signal?: AbortSignal): Promise<TDocument>;
|
|
16
|
+
private checkTablesExist;
|
|
17
|
+
private createTablesIfNotExist;
|
|
18
|
+
}
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=document-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-view.d.ts","sourceRoot":"","sources":["../../../src/read-models/document-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,UAAU,EAAoB,MAAM,gBAAgB,CAAC;AAC9E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,oBAAoB,EACpB,UAAU,EACX,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC9E,OAAO,KAAK,EACV,oBAAoB,EAErB,MAAM,YAAY,CAAC;AAEpB,KAAK,QAAQ,GAAG,eAAe,GAAG,oBAAoB,CAAC;AAEvD,qBAAa,kBAAmB,YAAW,aAAa;IAIpD,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,cAAc;IAJxB,OAAO,CAAC,eAAe,CAAa;gBAG1B,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,EACpB,cAAc,EAAE,eAAe;IAGnC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAiCrB,eAAe,CAAC,KAAK,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAgI7D,MAAM,CACV,WAAW,EAAE,MAAM,EAAE,EACrB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,OAAO,EAAE,CAAC;IAsBf,GAAG,CAAC,SAAS,SAAS,UAAU,EACpC,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,UAAU,EACjB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,SAAS,CAAC;YAoIP,gBAAgB;YAchB,sBAAsB;CAsGrC"}
|
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
import { v4 as uuidv4 } from "uuid";
|
|
2
|
+
export class KyselyDocumentView {
|
|
3
|
+
db;
|
|
4
|
+
operationStore;
|
|
5
|
+
lastOperationId = 0;
|
|
6
|
+
constructor(db, operationStore) {
|
|
7
|
+
this.db = db;
|
|
8
|
+
this.operationStore = operationStore;
|
|
9
|
+
}
|
|
10
|
+
async init() {
|
|
11
|
+
await this.createTablesIfNotExist();
|
|
12
|
+
const viewState = await this.db
|
|
13
|
+
.selectFrom("ViewState")
|
|
14
|
+
.selectAll()
|
|
15
|
+
.executeTakeFirst();
|
|
16
|
+
if (viewState) {
|
|
17
|
+
this.lastOperationId = viewState.lastOperationId;
|
|
18
|
+
const missedOperations = await this.operationStore.getSinceId(this.lastOperationId);
|
|
19
|
+
if (missedOperations.items.length > 0) {
|
|
20
|
+
await this.indexOperations(missedOperations.items);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
await this.db
|
|
25
|
+
.insertInto("ViewState")
|
|
26
|
+
.values({
|
|
27
|
+
lastOperationId: 0,
|
|
28
|
+
})
|
|
29
|
+
.execute();
|
|
30
|
+
const allOperations = await this.operationStore.getSinceId(0);
|
|
31
|
+
if (allOperations.items.length > 0) {
|
|
32
|
+
await this.indexOperations(allOperations.items);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
async indexOperations(items) {
|
|
37
|
+
if (items.length === 0)
|
|
38
|
+
return;
|
|
39
|
+
await this.db.transaction().execute(async (trx) => {
|
|
40
|
+
for (const item of items) {
|
|
41
|
+
const { operation, context } = item;
|
|
42
|
+
const { documentId, scope, branch, documentType, resultingState } = context;
|
|
43
|
+
const { index, hash } = operation;
|
|
44
|
+
// We never rebuild here
|
|
45
|
+
if (!resultingState) {
|
|
46
|
+
throw new Error(`Missing resultingState in context for operation ${operation.id || "unknown"}. ` +
|
|
47
|
+
`IDocumentView requires resultingState from upstream - it does not rebuild documents.`);
|
|
48
|
+
}
|
|
49
|
+
let fullState = {};
|
|
50
|
+
try {
|
|
51
|
+
fullState = JSON.parse(resultingState);
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
throw new Error(`Failed to parse resultingState for operation ${operation.id || "unknown"}: ${error instanceof Error ? error.message : String(error)}`);
|
|
55
|
+
}
|
|
56
|
+
const operationType = operation.action.type;
|
|
57
|
+
let scopesToIndex;
|
|
58
|
+
if (operationType === "CREATE_DOCUMENT") {
|
|
59
|
+
scopesToIndex = Object.entries(fullState).filter(([key]) => key === "header" || key === "document" || key === "auth");
|
|
60
|
+
}
|
|
61
|
+
else if (operationType === "UPGRADE_DOCUMENT") {
|
|
62
|
+
const scopeStatesToIndex = [];
|
|
63
|
+
for (const [scopeName, scopeState] of Object.entries(fullState)) {
|
|
64
|
+
if (scopeName === "header") {
|
|
65
|
+
scopeStatesToIndex.push([scopeName, scopeState]);
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (scopeName === scope) {
|
|
69
|
+
scopeStatesToIndex.push([scopeName, scopeState]);
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
const existingSnapshot = await trx
|
|
73
|
+
.selectFrom("DocumentSnapshot")
|
|
74
|
+
.select("scope")
|
|
75
|
+
.where("documentId", "=", documentId)
|
|
76
|
+
.where("scope", "=", scopeName)
|
|
77
|
+
.where("branch", "=", branch)
|
|
78
|
+
.executeTakeFirst();
|
|
79
|
+
if (!existingSnapshot) {
|
|
80
|
+
scopeStatesToIndex.push([scopeName, scopeState]);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
scopesToIndex = scopeStatesToIndex;
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
scopesToIndex = [];
|
|
87
|
+
if (fullState.header !== undefined) {
|
|
88
|
+
scopesToIndex.push(["header", fullState.header]);
|
|
89
|
+
}
|
|
90
|
+
if (fullState[scope] !== undefined) {
|
|
91
|
+
scopesToIndex.push([scope, fullState[scope]]);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
scopesToIndex.push([scope, {}]);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
for (const [scopeName, scopeState] of scopesToIndex) {
|
|
98
|
+
const existingSnapshot = await trx
|
|
99
|
+
.selectFrom("DocumentSnapshot")
|
|
100
|
+
.selectAll()
|
|
101
|
+
.where("documentId", "=", documentId)
|
|
102
|
+
.where("scope", "=", scopeName)
|
|
103
|
+
.where("branch", "=", branch)
|
|
104
|
+
.executeTakeFirst();
|
|
105
|
+
const newState = typeof scopeState === "object" && scopeState !== null
|
|
106
|
+
? scopeState
|
|
107
|
+
: {};
|
|
108
|
+
if (existingSnapshot) {
|
|
109
|
+
await trx
|
|
110
|
+
.updateTable("DocumentSnapshot")
|
|
111
|
+
.set({
|
|
112
|
+
lastOperationIndex: index,
|
|
113
|
+
lastOperationHash: hash,
|
|
114
|
+
lastUpdatedAt: new Date(),
|
|
115
|
+
snapshotVersion: existingSnapshot.snapshotVersion + 1,
|
|
116
|
+
content: JSON.stringify(newState),
|
|
117
|
+
})
|
|
118
|
+
.where("documentId", "=", documentId)
|
|
119
|
+
.where("scope", "=", scopeName)
|
|
120
|
+
.where("branch", "=", branch)
|
|
121
|
+
.execute();
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
const snapshot = {
|
|
125
|
+
id: uuidv4(),
|
|
126
|
+
documentId,
|
|
127
|
+
slug: null,
|
|
128
|
+
name: null,
|
|
129
|
+
scope: scopeName,
|
|
130
|
+
branch,
|
|
131
|
+
content: JSON.stringify(newState),
|
|
132
|
+
documentType,
|
|
133
|
+
lastOperationIndex: index,
|
|
134
|
+
lastOperationHash: hash,
|
|
135
|
+
identifiers: null,
|
|
136
|
+
metadata: null,
|
|
137
|
+
deletedAt: null,
|
|
138
|
+
};
|
|
139
|
+
await trx.insertInto("DocumentSnapshot").values(snapshot).execute();
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
async exists(documentIds, signal) {
|
|
146
|
+
if (signal?.aborted) {
|
|
147
|
+
throw new Error("Operation aborted");
|
|
148
|
+
}
|
|
149
|
+
if (documentIds.length === 0) {
|
|
150
|
+
return [];
|
|
151
|
+
}
|
|
152
|
+
const snapshots = await this.db
|
|
153
|
+
.selectFrom("DocumentSnapshot")
|
|
154
|
+
.select(["documentId"])
|
|
155
|
+
.where("documentId", "in", documentIds)
|
|
156
|
+
.where("isDeleted", "=", false)
|
|
157
|
+
.distinct()
|
|
158
|
+
.execute();
|
|
159
|
+
const existingIds = new Set(snapshots.map((s) => s.documentId));
|
|
160
|
+
return documentIds.map((id) => existingIds.has(id));
|
|
161
|
+
}
|
|
162
|
+
async get(documentId, view, signal) {
|
|
163
|
+
if (signal?.aborted) {
|
|
164
|
+
throw new Error("Operation aborted");
|
|
165
|
+
}
|
|
166
|
+
const branch = view?.branch || "main";
|
|
167
|
+
// Determine which scopes to retrieve
|
|
168
|
+
let scopesToQuery;
|
|
169
|
+
if (view?.scopes && view.scopes.length > 0) {
|
|
170
|
+
// If scopes has values, always include header + document + specified scopes
|
|
171
|
+
// (header and document are the minimum scopes that must be returned)
|
|
172
|
+
scopesToQuery = [...new Set(["header", "document", ...view.scopes])];
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
// If scopes is undefined, null, or empty array [], get all scopes (no filter)
|
|
176
|
+
scopesToQuery = [];
|
|
177
|
+
}
|
|
178
|
+
// Build query to get snapshots
|
|
179
|
+
let query = this.db
|
|
180
|
+
.selectFrom("DocumentSnapshot")
|
|
181
|
+
.selectAll()
|
|
182
|
+
.where("documentId", "=", documentId)
|
|
183
|
+
.where("branch", "=", branch)
|
|
184
|
+
.where("isDeleted", "=", false);
|
|
185
|
+
// Apply scope filter if we have specific scopes to query
|
|
186
|
+
if (scopesToQuery.length > 0) {
|
|
187
|
+
query = query.where("scope", "in", scopesToQuery);
|
|
188
|
+
}
|
|
189
|
+
// Execute the query
|
|
190
|
+
const snapshots = await query.execute();
|
|
191
|
+
if (snapshots.length === 0) {
|
|
192
|
+
throw new Error(`Document not found: ${documentId}`);
|
|
193
|
+
}
|
|
194
|
+
if (signal?.aborted) {
|
|
195
|
+
throw new Error("Operation aborted");
|
|
196
|
+
}
|
|
197
|
+
// Find the header snapshot
|
|
198
|
+
const headerSnapshot = snapshots.find((s) => s.scope === "header");
|
|
199
|
+
if (!headerSnapshot) {
|
|
200
|
+
throw new Error(`Document header not found: ${documentId}`);
|
|
201
|
+
}
|
|
202
|
+
// Parse the header
|
|
203
|
+
let header;
|
|
204
|
+
try {
|
|
205
|
+
header = JSON.parse(headerSnapshot.content);
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
throw new Error(`Failed to parse header for document ${documentId}: ${error instanceof Error ? error.message : String(error)}`);
|
|
209
|
+
}
|
|
210
|
+
// Reconstruct cross-scope header metadata (revision, lastModifiedAtUtcIso)
|
|
211
|
+
// by aggregating information from all scopes
|
|
212
|
+
const revisions = await this.operationStore.getRevisions(documentId, branch, signal);
|
|
213
|
+
header.revision = revisions.revision;
|
|
214
|
+
header.lastModifiedAtUtcIso = revisions.latestTimestamp;
|
|
215
|
+
// Reconstruct the document state from all snapshots
|
|
216
|
+
// Note: exclude "header" scope from state since it's already in the header field
|
|
217
|
+
const state = {};
|
|
218
|
+
for (const snapshot of snapshots) {
|
|
219
|
+
// Skip header scope - it's stored separately in the header field
|
|
220
|
+
if (snapshot.scope === "header") {
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
try {
|
|
224
|
+
const scopeState = JSON.parse(snapshot.content);
|
|
225
|
+
state[snapshot.scope] = scopeState;
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
// Failed to parse snapshot content, use empty state
|
|
229
|
+
state[snapshot.scope] = {};
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
// Retrieve operations from the operation store to match legacy storage format
|
|
233
|
+
const operations = {};
|
|
234
|
+
// Get all operations for this document across all scopes
|
|
235
|
+
const allOps = await this.operationStore.getSinceId(0, undefined, signal);
|
|
236
|
+
const docOps = allOps.items.filter((op) => op.context.documentId === documentId && op.context.branch === branch);
|
|
237
|
+
// Group operations by scope and normalize to match legacy storage structure
|
|
238
|
+
for (const { operation, context } of docOps) {
|
|
239
|
+
operations[context.scope] ??= [];
|
|
240
|
+
// Normalize operation to match legacy storage format
|
|
241
|
+
// Legacy storage includes redundant top-level fields that duplicate action fields
|
|
242
|
+
const normalizedOp = {
|
|
243
|
+
action: operation.action,
|
|
244
|
+
index: operation.index,
|
|
245
|
+
timestampUtcMs: operation.timestampUtcMs,
|
|
246
|
+
hash: operation.hash,
|
|
247
|
+
skip: operation.skip,
|
|
248
|
+
// Add top-level fields that mirror action fields (legacy format)
|
|
249
|
+
...operation.action,
|
|
250
|
+
// Legacy storage includes these optional fields
|
|
251
|
+
error: operation.error,
|
|
252
|
+
resultingState: operation.resultingState,
|
|
253
|
+
};
|
|
254
|
+
operations[context.scope].push(normalizedOp);
|
|
255
|
+
}
|
|
256
|
+
// Construct the PHDocument
|
|
257
|
+
const document = {
|
|
258
|
+
header,
|
|
259
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
260
|
+
state: state,
|
|
261
|
+
operations,
|
|
262
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
263
|
+
initialState: state,
|
|
264
|
+
clipboard: [],
|
|
265
|
+
};
|
|
266
|
+
return document;
|
|
267
|
+
}
|
|
268
|
+
async checkTablesExist() {
|
|
269
|
+
try {
|
|
270
|
+
// Try to query ViewState table
|
|
271
|
+
await this.db
|
|
272
|
+
.selectFrom("ViewState")
|
|
273
|
+
.select("lastOperationId")
|
|
274
|
+
.limit(1)
|
|
275
|
+
.execute();
|
|
276
|
+
return true;
|
|
277
|
+
}
|
|
278
|
+
catch {
|
|
279
|
+
return false;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
async createTablesIfNotExist() {
|
|
283
|
+
// Check if tables exist by trying to query them
|
|
284
|
+
const tablesExist = await this.checkTablesExist();
|
|
285
|
+
if (!tablesExist) {
|
|
286
|
+
// Create ViewState table
|
|
287
|
+
await this.db.schema
|
|
288
|
+
.createTable("ViewState")
|
|
289
|
+
.ifNotExists()
|
|
290
|
+
.addColumn("lastOperationId", "integer", (col) => col.primaryKey())
|
|
291
|
+
.addColumn("lastOperationTimestamp", "timestamptz", (col) => col.defaultTo("now()").notNull())
|
|
292
|
+
.execute();
|
|
293
|
+
// Create DocumentSnapshot table
|
|
294
|
+
await this.db.schema
|
|
295
|
+
.createTable("DocumentSnapshot")
|
|
296
|
+
.ifNotExists()
|
|
297
|
+
.addColumn("id", "text", (col) => col.primaryKey())
|
|
298
|
+
.addColumn("documentId", "text", (col) => col.notNull())
|
|
299
|
+
.addColumn("slug", "text")
|
|
300
|
+
.addColumn("name", "text")
|
|
301
|
+
.addColumn("scope", "text", (col) => col.notNull())
|
|
302
|
+
.addColumn("branch", "text", (col) => col.notNull())
|
|
303
|
+
.addColumn("content", "text", (col) => col.notNull())
|
|
304
|
+
.addColumn("documentType", "text", (col) => col.notNull())
|
|
305
|
+
.addColumn("lastOperationIndex", "integer", (col) => col.notNull())
|
|
306
|
+
.addColumn("lastOperationHash", "text", (col) => col.notNull())
|
|
307
|
+
.addColumn("lastUpdatedAt", "timestamptz", (col) => col.defaultTo("now()").notNull())
|
|
308
|
+
.addColumn("snapshotVersion", "integer", (col) => col.defaultTo(1).notNull())
|
|
309
|
+
.addColumn("identifiers", "text")
|
|
310
|
+
.addColumn("metadata", "text")
|
|
311
|
+
.addColumn("isDeleted", "boolean", (col) => col.defaultTo(false).notNull())
|
|
312
|
+
.addColumn("deletedAt", "timestamptz")
|
|
313
|
+
.addUniqueConstraint("unique_doc_scope_branch", [
|
|
314
|
+
"documentId",
|
|
315
|
+
"scope",
|
|
316
|
+
"branch",
|
|
317
|
+
])
|
|
318
|
+
.execute();
|
|
319
|
+
// Create indexes for DocumentSnapshot
|
|
320
|
+
await this.db.schema
|
|
321
|
+
.createIndex("idx_slug_scope_branch")
|
|
322
|
+
.on("DocumentSnapshot")
|
|
323
|
+
.columns(["slug", "scope", "branch"])
|
|
324
|
+
.execute();
|
|
325
|
+
await this.db.schema
|
|
326
|
+
.createIndex("idx_doctype_scope_branch")
|
|
327
|
+
.on("DocumentSnapshot")
|
|
328
|
+
.columns(["documentType", "scope", "branch"])
|
|
329
|
+
.execute();
|
|
330
|
+
await this.db.schema
|
|
331
|
+
.createIndex("idx_last_updated")
|
|
332
|
+
.on("DocumentSnapshot")
|
|
333
|
+
.column("lastUpdatedAt")
|
|
334
|
+
.execute();
|
|
335
|
+
await this.db.schema
|
|
336
|
+
.createIndex("idx_is_deleted")
|
|
337
|
+
.on("DocumentSnapshot")
|
|
338
|
+
.column("isDeleted")
|
|
339
|
+
.execute();
|
|
340
|
+
// Create SlugMapping table
|
|
341
|
+
await this.db.schema
|
|
342
|
+
.createTable("SlugMapping")
|
|
343
|
+
.ifNotExists()
|
|
344
|
+
.addColumn("slug", "text", (col) => col.primaryKey())
|
|
345
|
+
.addColumn("documentId", "text", (col) => col.notNull())
|
|
346
|
+
.addColumn("scope", "text", (col) => col.notNull())
|
|
347
|
+
.addColumn("branch", "text", (col) => col.notNull())
|
|
348
|
+
.addColumn("createdAt", "timestamptz", (col) => col.defaultTo("now()").notNull())
|
|
349
|
+
.addColumn("updatedAt", "timestamptz", (col) => col.defaultTo("now()").notNull())
|
|
350
|
+
.addUniqueConstraint("unique_docid_scope_branch", [
|
|
351
|
+
"documentId",
|
|
352
|
+
"scope",
|
|
353
|
+
"branch",
|
|
354
|
+
])
|
|
355
|
+
.execute();
|
|
356
|
+
// Create index for SlugMapping
|
|
357
|
+
await this.db.schema
|
|
358
|
+
.createIndex("idx_slug_documentid")
|
|
359
|
+
.on("SlugMapping")
|
|
360
|
+
.column("documentId")
|
|
361
|
+
.execute();
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
//# sourceMappingURL=document-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-view.js","sourceRoot":"","sources":["../../../src/read-models/document-view.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { OperationWithContext } from "../storage/interfaces.js";
|
|
2
|
+
/**
|
|
3
|
+
* Generic interface for any read model that can index operations.
|
|
4
|
+
* Implementations include IDocumentView, search indices, caches, etc.
|
|
5
|
+
*/
|
|
6
|
+
export interface IReadModel {
|
|
7
|
+
/**
|
|
8
|
+
* Indexes a list of operations into the read model.
|
|
9
|
+
* This method is called asynchronously when operations are written to the operation store.
|
|
10
|
+
*
|
|
11
|
+
* @param operations - The operations with their context to index
|
|
12
|
+
*/
|
|
13
|
+
indexOperations(operations: OperationWithContext[]): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Coordinates read model synchronization with operation writes.
|
|
17
|
+
* Listens to operation events from the event bus and updates all registered read models.
|
|
18
|
+
*/
|
|
19
|
+
export interface IReadModelCoordinator {
|
|
20
|
+
/**
|
|
21
|
+
* Start listening for operation events and updating read models.
|
|
22
|
+
*/
|
|
23
|
+
start(): void;
|
|
24
|
+
/**
|
|
25
|
+
* Stop listening and clean up subscriptions.
|
|
26
|
+
*/
|
|
27
|
+
stop(): void;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=interfaces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../src/read-models/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAErE;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB;;;;;OAKG;IACH,eAAe,CAAC,UAAU,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpE;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,KAAK,IAAI,IAAI,CAAC;IAEd;;OAEG;IACH,IAAI,IAAI,IAAI,CAAC;CACd"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../../src/read-models/interfaces.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { Generated, Insertable, Selectable, Updateable } from "kysely";
|
|
2
|
+
export interface ViewStateTable {
|
|
3
|
+
lastOperationId: number;
|
|
4
|
+
lastOperationTimestamp: Generated<Date>;
|
|
5
|
+
}
|
|
6
|
+
export interface DocumentSnapshotTable {
|
|
7
|
+
id: Generated<string>;
|
|
8
|
+
documentId: string;
|
|
9
|
+
slug: string | null;
|
|
10
|
+
name: string | null;
|
|
11
|
+
scope: string;
|
|
12
|
+
branch: string;
|
|
13
|
+
content: string;
|
|
14
|
+
documentType: string;
|
|
15
|
+
lastOperationIndex: number;
|
|
16
|
+
lastOperationHash: string;
|
|
17
|
+
lastUpdatedAt: Generated<Date>;
|
|
18
|
+
snapshotVersion: Generated<number>;
|
|
19
|
+
identifiers: string | null;
|
|
20
|
+
metadata: string | null;
|
|
21
|
+
isDeleted: Generated<boolean>;
|
|
22
|
+
deletedAt: Date | null;
|
|
23
|
+
}
|
|
24
|
+
export interface SlugMappingTable {
|
|
25
|
+
slug: string;
|
|
26
|
+
documentId: string;
|
|
27
|
+
scope: string;
|
|
28
|
+
branch: string;
|
|
29
|
+
createdAt: Generated<Date>;
|
|
30
|
+
updatedAt: Generated<Date>;
|
|
31
|
+
}
|
|
32
|
+
export interface DocumentViewDatabase {
|
|
33
|
+
ViewState: ViewStateTable;
|
|
34
|
+
DocumentSnapshot: DocumentSnapshotTable;
|
|
35
|
+
SlugMapping: SlugMappingTable;
|
|
36
|
+
}
|
|
37
|
+
export type ViewStateRow = Selectable<ViewStateTable>;
|
|
38
|
+
export type InsertableViewState = Insertable<ViewStateTable>;
|
|
39
|
+
export type UpdateableViewState = Updateable<ViewStateTable>;
|
|
40
|
+
export type DocumentSnapshotRow = Selectable<DocumentSnapshotTable>;
|
|
41
|
+
export type InsertableDocumentSnapshot = Insertable<DocumentSnapshotTable>;
|
|
42
|
+
export type UpdateableDocumentSnapshot = Updateable<DocumentSnapshotTable>;
|
|
43
|
+
export type SlugMappingRow = Selectable<SlugMappingTable>;
|
|
44
|
+
export type InsertableSlugMapping = Insertable<SlugMappingTable>;
|
|
45
|
+
export type UpdateableSlugMapping = Updateable<SlugMappingTable>;
|
|
46
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/read-models/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAE5E,MAAM,WAAW,cAAc;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,sBAAsB,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IAC/B,eAAe,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IACnC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IAC9B,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IAC3B,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,cAAc,CAAC;IAC1B,gBAAgB,EAAE,qBAAqB,CAAC;IACxC,WAAW,EAAE,gBAAgB,CAAC;CAC/B;AAED,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;AACtD,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;AAC7D,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;AAE7D,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,0BAA0B,GAAG,UAAU,CAAC,qBAAqB,CAAC,CAAC;AAC3E,MAAM,MAAM,0BAA0B,GAAG,UAAU,CAAC,qBAAqB,CAAC,CAAC;AAE3E,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC;AAC1D,MAAM,MAAM,qBAAqB,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC;AACjE,MAAM,MAAM,qBAAqB,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/read-models/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { DocumentModelModule } from "document-model";
|
|
2
|
+
import type { IDocumentModelRegistry } from "./interfaces.js";
|
|
3
|
+
/**
|
|
4
|
+
* Error thrown when a document model module is not found in the registry.
|
|
5
|
+
*/
|
|
6
|
+
export declare class ModuleNotFoundError extends Error {
|
|
7
|
+
constructor(documentType: string);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Error thrown when attempting to register a module that already exists.
|
|
11
|
+
*/
|
|
12
|
+
export declare class DuplicateModuleError extends Error {
|
|
13
|
+
constructor(documentType: string);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Error thrown when a module is invalid or malformed.
|
|
17
|
+
*/
|
|
18
|
+
export declare class InvalidModuleError extends Error {
|
|
19
|
+
constructor(message: string);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* In-memory implementation of the IDocumentModelRegistry interface.
|
|
23
|
+
* Manages document model modules and provides centralized access to their reducers, utils, and specifications.
|
|
24
|
+
*/
|
|
25
|
+
export declare class DocumentModelRegistry implements IDocumentModelRegistry {
|
|
26
|
+
private modules;
|
|
27
|
+
/**
|
|
28
|
+
* Register multiple modules at once.
|
|
29
|
+
*
|
|
30
|
+
* @param modules Document model modules to register
|
|
31
|
+
* @throws DuplicateModuleError if a module with the same document type is already registered
|
|
32
|
+
* @throws InvalidModuleError if a module is malformed
|
|
33
|
+
*/
|
|
34
|
+
registerModules(...modules: DocumentModelModule<any>[]): void;
|
|
35
|
+
/**
|
|
36
|
+
* Unregister multiple document model modules at once.
|
|
37
|
+
*
|
|
38
|
+
* @param documentTypes The document types to unregister
|
|
39
|
+
* @returns true if all modules were unregistered, false if any were not found
|
|
40
|
+
*/
|
|
41
|
+
unregisterModules(...documentTypes: string[]): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Get a specific document model module by document type.
|
|
44
|
+
*
|
|
45
|
+
* @param documentType The document type identifier
|
|
46
|
+
* @returns The document model module
|
|
47
|
+
* @throws ModuleNotFoundError if the document type is not registered
|
|
48
|
+
*/
|
|
49
|
+
getModule(documentType: string): DocumentModelModule<any>;
|
|
50
|
+
/**
|
|
51
|
+
* Get all registered document model modules.
|
|
52
|
+
* Note: This only returns loaded modules, not lazy-loaded ones.
|
|
53
|
+
*
|
|
54
|
+
* @returns Array of all registered modules
|
|
55
|
+
*/
|
|
56
|
+
getAllModules(): DocumentModelModule<any>[];
|
|
57
|
+
/**
|
|
58
|
+
* Clear all registered modules
|
|
59
|
+
*/
|
|
60
|
+
clear(): void;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=implementation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"implementation.d.ts","sourceRoot":"","sources":["../../../src/registry/implementation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAE9D;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,YAAY,EAAE,MAAM;CAIjC;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,YAAY,EAAE,MAAM;CAIjC;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,OAAO,EAAE,MAAM;CAI5B;AAED;;;GAGG;AACH,qBAAa,qBAAsB,YAAW,sBAAsB;IAClE,OAAO,CAAC,OAAO,CAA+C;IAE9D;;;;;;OAMG;IACH,eAAe,CAAC,GAAG,OAAO,EAAE,mBAAmB,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI;IAY7D;;;;;OAKG;IACH,iBAAiB,CAAC,GAAG,aAAa,EAAE,MAAM,EAAE,GAAG,OAAO;IAatD;;;;;;OAMG;IACH,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,mBAAmB,CAAC,GAAG,CAAC;IAUzD;;;;;OAKG;IACH,aAAa,IAAI,mBAAmB,CAAC,GAAG,CAAC,EAAE;IAI3C;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd"}
|