@powerhousedao/reactor 4.1.0-dev.8 → 4.1.0-dev.80
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/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 +647 -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 +30 -0
- package/dist/src/executor/simple-job-executor-manager.d.ts.map +1 -0
- package/dist/src/executor/simple-job-executor-manager.js +178 -0
- package/dist/src/executor/simple-job-executor-manager.js.map +1 -0
- package/dist/src/executor/simple-job-executor.d.ts +60 -0
- package/dist/src/executor/simple-job-executor.d.ts.map +1 -0
- package/dist/src/executor/simple-job-executor.js +537 -0
- package/dist/src/executor/simple-job-executor.js.map +1 -0
- package/dist/src/executor/types.d.ts +24 -8
- package/dist/src/executor/types.d.ts.map +1 -1
- package/dist/src/executor/types.js.map +1 -1
- package/dist/src/index.d.ts +26 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +33 -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 +265 -36
- package/dist/src/queue/queue.js.map +1 -1
- package/dist/src/queue/types.d.ts +30 -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 +363 -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 +9 -0
- package/dist/src/shared/errors.d.ts.map +1 -0
- package/dist/src/shared/errors.js +18 -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 +108 -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/store.d.ts +15 -0
- package/dist/src/storage/kysely/store.d.ts.map +1 -0
- package/dist/src/storage/kysely/store.js +197 -0
- package/dist/src/storage/kysely/store.js.map +1 -0
- package/dist/src/storage/kysely/types.d.ts +26 -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 +42 -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 +15 -6
- 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
package/dist/src/queue/queue.js
CHANGED
|
@@ -1,12 +1,21 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { JobExecutionHandle } from "./job-execution-handle.js";
|
|
2
|
+
import { JobQueueState, QueueEventTypes } from "./types.js";
|
|
2
3
|
/**
|
|
3
4
|
* In-memory implementation of the IQueue interface.
|
|
4
5
|
* Organizes jobs by documentId, scope, and branch to ensure proper ordering.
|
|
6
|
+
* Ensures serial execution per document by tracking executing jobs.
|
|
7
|
+
* Implements dependency management through queue hints.
|
|
5
8
|
*/
|
|
6
9
|
export class InMemoryQueue {
|
|
7
10
|
eventBus;
|
|
8
11
|
queues = new Map();
|
|
9
|
-
|
|
12
|
+
jobIdToQueueKey = new Map();
|
|
13
|
+
docIdToJobId = new Map();
|
|
14
|
+
jobIdToDocId = new Map();
|
|
15
|
+
completedJobs = new Set();
|
|
16
|
+
jobIndex = new Map();
|
|
17
|
+
isBlocked = false;
|
|
18
|
+
onDrainedCallback;
|
|
10
19
|
constructor(eventBus) {
|
|
11
20
|
this.eventBus = eventBus;
|
|
12
21
|
}
|
|
@@ -27,13 +36,70 @@ export class InMemoryQueue {
|
|
|
27
36
|
}
|
|
28
37
|
return queue;
|
|
29
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* Check if a document has any jobs currently executing
|
|
41
|
+
*/
|
|
42
|
+
isDocumentExecuting(documentId) {
|
|
43
|
+
const executingSet = this.docIdToJobId.get(documentId);
|
|
44
|
+
return executingSet ? executingSet.size > 0 : false;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Mark a job as executing for its document
|
|
48
|
+
*/
|
|
49
|
+
markJobExecuting(job) {
|
|
50
|
+
let executingSet = this.docIdToJobId.get(job.documentId);
|
|
51
|
+
if (!executingSet) {
|
|
52
|
+
executingSet = new Set();
|
|
53
|
+
this.docIdToJobId.set(job.documentId, executingSet);
|
|
54
|
+
}
|
|
55
|
+
executingSet.add(job.id);
|
|
56
|
+
this.jobIdToDocId.set(job.id, job.documentId);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Mark a job as no longer executing for its document
|
|
60
|
+
*/
|
|
61
|
+
markJobComplete(jobId, documentId) {
|
|
62
|
+
const executingSet = this.docIdToJobId.get(documentId);
|
|
63
|
+
if (executingSet) {
|
|
64
|
+
executingSet.delete(jobId);
|
|
65
|
+
if (executingSet.size === 0) {
|
|
66
|
+
this.docIdToJobId.delete(documentId);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
this.jobIdToDocId.delete(jobId);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Check if all dependencies for a job have been completed
|
|
73
|
+
*/
|
|
74
|
+
areDependenciesMet(job) {
|
|
75
|
+
if (job.queueHint.length === 0) {
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
return job.queueHint.every((depId) => this.completedJobs.has(depId));
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Get the next job that has all its dependencies met
|
|
82
|
+
*/
|
|
83
|
+
getNextJobWithMetDependencies(queue) {
|
|
84
|
+
for (const job of queue) {
|
|
85
|
+
if (this.areDependenciesMet(job)) {
|
|
86
|
+
return job;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
30
91
|
async enqueue(job) {
|
|
92
|
+
// Throw error if queue is blocked
|
|
93
|
+
if (this.isBlocked) {
|
|
94
|
+
throw new Error("Queue is blocked");
|
|
95
|
+
}
|
|
31
96
|
const queueKey = this.createQueueKey(job.documentId, job.scope, job.branch);
|
|
32
97
|
const queue = this.getQueue(queueKey);
|
|
33
98
|
// Add job to the end of the queue (FIFO)
|
|
34
99
|
queue.push(job);
|
|
35
|
-
// Track job location for removal
|
|
36
|
-
this.
|
|
100
|
+
// Track job location for removal and dependency resolution
|
|
101
|
+
this.jobIdToQueueKey.set(job.id, queueKey);
|
|
102
|
+
this.jobIndex.set(job.id, job);
|
|
37
103
|
// Emit job available event
|
|
38
104
|
const eventData = {
|
|
39
105
|
documentId: job.documentId,
|
|
@@ -43,94 +109,257 @@ export class InMemoryQueue {
|
|
|
43
109
|
};
|
|
44
110
|
await this.eventBus.emit(QueueEventTypes.JOB_AVAILABLE, eventData);
|
|
45
111
|
}
|
|
46
|
-
|
|
112
|
+
dequeue(documentId, scope, branch, signal) {
|
|
47
113
|
const queueKey = this.createQueueKey(documentId, scope, branch);
|
|
48
114
|
const queue = this.queues.get(queueKey);
|
|
115
|
+
if (signal?.aborted) {
|
|
116
|
+
return Promise.reject(new Error("Operation aborted"));
|
|
117
|
+
}
|
|
49
118
|
if (!queue || queue.length === 0) {
|
|
50
|
-
return null;
|
|
119
|
+
return Promise.resolve(null);
|
|
51
120
|
}
|
|
52
|
-
//
|
|
53
|
-
const job =
|
|
54
|
-
|
|
55
|
-
|
|
121
|
+
// Find the first job with met dependencies
|
|
122
|
+
const job = this.getNextJobWithMetDependencies(queue);
|
|
123
|
+
if (!job) {
|
|
124
|
+
return Promise.resolve(null);
|
|
125
|
+
}
|
|
126
|
+
// Remove job from queue
|
|
127
|
+
const jobIndex = queue.indexOf(job);
|
|
128
|
+
queue.splice(jobIndex, 1);
|
|
129
|
+
// Remove from queue tracking but keep in job index for retry
|
|
130
|
+
this.jobIdToQueueKey.delete(job.id);
|
|
131
|
+
// Mark this job as executing for its document
|
|
132
|
+
this.markJobExecuting(job);
|
|
56
133
|
// Clean up empty queue
|
|
57
134
|
if (queue.length === 0) {
|
|
58
135
|
this.queues.delete(queueKey);
|
|
59
136
|
}
|
|
60
|
-
return
|
|
137
|
+
// Create and return the execution handle
|
|
138
|
+
const handle = new JobExecutionHandle(job, JobQueueState.READY, {
|
|
139
|
+
onStart: () => {
|
|
140
|
+
// Job is now running
|
|
141
|
+
},
|
|
142
|
+
onComplete: () => {
|
|
143
|
+
void this.completeJob(job.id);
|
|
144
|
+
},
|
|
145
|
+
onFail: (reason) => {
|
|
146
|
+
void this.failJob(job.id, reason);
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
return Promise.resolve(handle);
|
|
61
150
|
}
|
|
62
|
-
|
|
63
|
-
|
|
151
|
+
dequeueNext(signal) {
|
|
152
|
+
if (signal?.aborted) {
|
|
153
|
+
return Promise.reject(new Error("Operation aborted"));
|
|
154
|
+
}
|
|
155
|
+
// Find the first non-empty queue for a document that's not currently executing
|
|
64
156
|
for (const [queueKey, queue] of this.queues.entries()) {
|
|
65
157
|
if (queue.length > 0) {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
158
|
+
// Find the first job with met dependencies
|
|
159
|
+
const job = this.getNextJobWithMetDependencies(queue);
|
|
160
|
+
if (!job) {
|
|
161
|
+
continue; // No job with met dependencies in this queue
|
|
162
|
+
}
|
|
163
|
+
// Only dequeue if the document is not currently executing jobs
|
|
164
|
+
if (!this.isDocumentExecuting(job.documentId)) {
|
|
165
|
+
// Remove job from queue
|
|
166
|
+
const jobIdx = queue.indexOf(job);
|
|
167
|
+
queue.splice(jobIdx, 1);
|
|
168
|
+
// Remove from queue tracking but keep in job index for retry
|
|
169
|
+
this.jobIdToQueueKey.delete(job.id);
|
|
170
|
+
// Keep job in jobIndex so we can retry it if needed
|
|
171
|
+
// Mark this job as executing for its document
|
|
172
|
+
this.markJobExecuting(job);
|
|
173
|
+
// Clean up empty queue
|
|
174
|
+
if (queue.length === 0) {
|
|
175
|
+
this.queues.delete(queueKey);
|
|
176
|
+
}
|
|
177
|
+
// Create and return the execution handle
|
|
178
|
+
const handle = new JobExecutionHandle(job, JobQueueState.READY, {
|
|
179
|
+
onStart: () => {
|
|
180
|
+
// Job is now running
|
|
181
|
+
},
|
|
182
|
+
onComplete: () => {
|
|
183
|
+
void this.completeJob(job.id);
|
|
184
|
+
},
|
|
185
|
+
onFail: (reason) => {
|
|
186
|
+
void this.failJob(job.id, reason);
|
|
187
|
+
},
|
|
188
|
+
});
|
|
189
|
+
return Promise.resolve(handle);
|
|
72
190
|
}
|
|
73
|
-
return job;
|
|
74
191
|
}
|
|
75
192
|
}
|
|
76
|
-
return null;
|
|
193
|
+
return Promise.resolve(null);
|
|
77
194
|
}
|
|
78
|
-
|
|
195
|
+
size(documentId, scope, branch) {
|
|
79
196
|
const queueKey = this.createQueueKey(documentId, scope, branch);
|
|
80
197
|
const queue = this.queues.get(queueKey);
|
|
81
|
-
return queue ? queue.length : 0;
|
|
198
|
+
return Promise.resolve(queue ? queue.length : 0);
|
|
82
199
|
}
|
|
83
|
-
|
|
200
|
+
totalSize() {
|
|
84
201
|
let total = 0;
|
|
85
202
|
for (const queue of this.queues.values()) {
|
|
86
203
|
total += queue.length;
|
|
87
204
|
}
|
|
88
|
-
return total;
|
|
205
|
+
return Promise.resolve(total);
|
|
89
206
|
}
|
|
90
|
-
|
|
91
|
-
const queueKey = this.
|
|
207
|
+
remove(jobId) {
|
|
208
|
+
const queueKey = this.jobIdToQueueKey.get(jobId);
|
|
92
209
|
if (!queueKey) {
|
|
93
|
-
return false;
|
|
210
|
+
return Promise.resolve(false);
|
|
94
211
|
}
|
|
95
212
|
const queue = this.queues.get(queueKey);
|
|
96
213
|
if (!queue) {
|
|
97
214
|
// Clean up orphaned index entry
|
|
215
|
+
this.jobIdToQueueKey.delete(jobId);
|
|
98
216
|
this.jobIndex.delete(jobId);
|
|
99
|
-
return false;
|
|
217
|
+
return Promise.resolve(false);
|
|
100
218
|
}
|
|
101
|
-
const
|
|
102
|
-
if (
|
|
219
|
+
const jobIdx = queue.findIndex((job) => job.id === jobId);
|
|
220
|
+
if (jobIdx === -1) {
|
|
103
221
|
// Clean up orphaned index entry
|
|
222
|
+
this.jobIdToQueueKey.delete(jobId);
|
|
104
223
|
this.jobIndex.delete(jobId);
|
|
105
|
-
return false;
|
|
224
|
+
return Promise.resolve(false);
|
|
106
225
|
}
|
|
107
226
|
// Remove job from queue
|
|
108
|
-
queue.splice(
|
|
227
|
+
queue.splice(jobIdx, 1);
|
|
109
228
|
// Remove from job index
|
|
229
|
+
this.jobIdToQueueKey.delete(jobId);
|
|
110
230
|
this.jobIndex.delete(jobId);
|
|
111
231
|
// Clean up empty queue
|
|
112
232
|
if (queue.length === 0) {
|
|
113
233
|
this.queues.delete(queueKey);
|
|
114
234
|
}
|
|
115
|
-
return true;
|
|
235
|
+
return Promise.resolve(true);
|
|
116
236
|
}
|
|
117
|
-
|
|
237
|
+
clear(documentId, scope, branch) {
|
|
118
238
|
const queueKey = this.createQueueKey(documentId, scope, branch);
|
|
119
239
|
const queue = this.queues.get(queueKey);
|
|
120
240
|
if (queue) {
|
|
121
241
|
// Remove all jobs from the job index
|
|
122
242
|
for (const job of queue) {
|
|
243
|
+
this.jobIdToQueueKey.delete(job.id);
|
|
123
244
|
this.jobIndex.delete(job.id);
|
|
124
245
|
}
|
|
125
246
|
// Remove the queue
|
|
126
247
|
this.queues.delete(queueKey);
|
|
127
248
|
}
|
|
249
|
+
return Promise.resolve();
|
|
128
250
|
}
|
|
129
|
-
|
|
251
|
+
clearAll() {
|
|
130
252
|
// Clear all job indices
|
|
253
|
+
this.jobIdToQueueKey.clear();
|
|
131
254
|
this.jobIndex.clear();
|
|
255
|
+
this.completedJobs.clear();
|
|
132
256
|
// Clear all queues
|
|
133
257
|
this.queues.clear();
|
|
258
|
+
return Promise.resolve();
|
|
259
|
+
}
|
|
260
|
+
hasJobs() {
|
|
261
|
+
return Promise.resolve(this.queues.size > 0 &&
|
|
262
|
+
Array.from(this.queues.values()).some((q) => q.length > 0));
|
|
263
|
+
}
|
|
264
|
+
async completeJob(jobId) {
|
|
265
|
+
// Get the documentId for the executing job
|
|
266
|
+
const documentId = this.jobIdToDocId.get(jobId);
|
|
267
|
+
if (documentId) {
|
|
268
|
+
// Mark the job as no longer executing
|
|
269
|
+
this.markJobComplete(jobId, documentId);
|
|
270
|
+
}
|
|
271
|
+
// Track the job as completed for dependency resolution
|
|
272
|
+
this.completedJobs.add(jobId);
|
|
273
|
+
// Remove from job index
|
|
274
|
+
this.jobIndex.delete(jobId);
|
|
275
|
+
// For in-memory queue, completing just removes the job
|
|
276
|
+
// In a persistent queue, this would update the job status
|
|
277
|
+
await this.remove(jobId);
|
|
278
|
+
// Check if queue is now drained
|
|
279
|
+
this.checkDrained();
|
|
280
|
+
}
|
|
281
|
+
async failJob(jobId, error) {
|
|
282
|
+
// Get the documentId for the executing job
|
|
283
|
+
const documentId = this.jobIdToDocId.get(jobId);
|
|
284
|
+
if (documentId) {
|
|
285
|
+
// Mark the job as no longer executing
|
|
286
|
+
this.markJobComplete(jobId, documentId);
|
|
287
|
+
}
|
|
288
|
+
// update the job lastError
|
|
289
|
+
const job = this.jobIndex.get(jobId);
|
|
290
|
+
if (job) {
|
|
291
|
+
job.lastError = error;
|
|
292
|
+
}
|
|
293
|
+
// Remove from job index
|
|
294
|
+
this.jobIndex.delete(jobId);
|
|
295
|
+
// For in-memory queue, failing just removes the job
|
|
296
|
+
// In a persistent queue, this would update the job status and store the error
|
|
297
|
+
await this.remove(jobId);
|
|
298
|
+
// Check if queue is now drained
|
|
299
|
+
this.checkDrained();
|
|
300
|
+
}
|
|
301
|
+
async retryJob(jobId, error) {
|
|
302
|
+
// Get the job from the index (it might be executing, not in queue)
|
|
303
|
+
const job = this.jobIndex.get(jobId);
|
|
304
|
+
if (!job) {
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
// update the job lastError
|
|
308
|
+
job.lastError = error;
|
|
309
|
+
// Mark it as no longer executing if it was
|
|
310
|
+
const documentId = this.jobIdToDocId.get(jobId);
|
|
311
|
+
if (documentId) {
|
|
312
|
+
this.markJobComplete(jobId, documentId);
|
|
313
|
+
}
|
|
314
|
+
// Remove from indices
|
|
315
|
+
this.jobIndex.delete(jobId);
|
|
316
|
+
this.jobIdToQueueKey.delete(jobId);
|
|
317
|
+
// Update retry count
|
|
318
|
+
const updatedJob = {
|
|
319
|
+
...job,
|
|
320
|
+
retryCount: (job.retryCount || 0) + 1,
|
|
321
|
+
lastError: error,
|
|
322
|
+
};
|
|
323
|
+
// Re-enqueue with updated retry count
|
|
324
|
+
await this.enqueue(updatedJob);
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Check if the queue is drained and call the callback if it is
|
|
328
|
+
*/
|
|
329
|
+
checkDrained() {
|
|
330
|
+
if (this.isDrained && this.onDrainedCallback) {
|
|
331
|
+
const callback = this.onDrainedCallback;
|
|
332
|
+
this.onDrainedCallback = undefined;
|
|
333
|
+
callback();
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Returns true if and only if all jobs have been resolved.
|
|
338
|
+
*/
|
|
339
|
+
get isDrained() {
|
|
340
|
+
// Queue is drained if there are no pending jobs and no executing jobs
|
|
341
|
+
const hasPendingJobs = this.queues.size > 0 &&
|
|
342
|
+
Array.from(this.queues.values()).some((q) => q.length > 0);
|
|
343
|
+
const hasExecutingJobs = this.docIdToJobId.size > 0 &&
|
|
344
|
+
Array.from(this.docIdToJobId.values()).some((set) => set.size > 0);
|
|
345
|
+
return !hasPendingJobs && !hasExecutingJobs;
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Blocks the queue from accepting new jobs.
|
|
349
|
+
* @param onDrained - Optional callback to call when the queue is drained
|
|
350
|
+
*/
|
|
351
|
+
block(onDrained) {
|
|
352
|
+
this.isBlocked = true;
|
|
353
|
+
this.onDrainedCallback = onDrained;
|
|
354
|
+
// Check if already drained
|
|
355
|
+
this.checkDrained();
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Unblocks the queue from accepting new jobs.
|
|
359
|
+
*/
|
|
360
|
+
unblock() {
|
|
361
|
+
this.isBlocked = false;
|
|
362
|
+
this.onDrainedCallback = undefined;
|
|
134
363
|
}
|
|
135
364
|
}
|
|
136
365
|
//# sourceMappingURL=queue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../../src/queue/queue.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../../src/queue/queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,25 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { Action } from "document-model";
|
|
2
|
+
/**
|
|
3
|
+
* State of a job in the queue
|
|
4
|
+
*/
|
|
5
|
+
export declare enum JobQueueState {
|
|
6
|
+
UNKNOWN = -1,
|
|
7
|
+
PREPROCESSING = 0,
|
|
8
|
+
PENDING = 1,
|
|
9
|
+
READY = 2,
|
|
10
|
+
RUNNING = 3,
|
|
11
|
+
RESOLVED = 4
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Interface for a job execution handle
|
|
15
|
+
*/
|
|
16
|
+
export interface IJobExecutionHandle {
|
|
17
|
+
readonly job: Job;
|
|
18
|
+
readonly state: JobQueueState;
|
|
19
|
+
start(): void;
|
|
20
|
+
complete(): void;
|
|
21
|
+
fail(reason: string): void;
|
|
22
|
+
}
|
|
2
23
|
/**
|
|
3
24
|
* Represents a job to be executed by the job executor
|
|
4
25
|
*/
|
|
@@ -7,18 +28,22 @@ export type Job = {
|
|
|
7
28
|
id: string;
|
|
8
29
|
/** The document ID this job operates on */
|
|
9
30
|
documentId: string;
|
|
10
|
-
/** The scope of the
|
|
31
|
+
/** The scope of the operations */
|
|
11
32
|
scope: string;
|
|
12
|
-
/** The branch of the
|
|
33
|
+
/** The branch of the operations */
|
|
13
34
|
branch: string;
|
|
14
|
-
/** The
|
|
15
|
-
|
|
35
|
+
/** The actions to be executed (processed sequentially) */
|
|
36
|
+
actions: Action[];
|
|
16
37
|
/** Timestamp when the job was created */
|
|
17
38
|
createdAt: string;
|
|
39
|
+
/** The hint for the queue to use for ordering the job */
|
|
40
|
+
queueHint: string[];
|
|
18
41
|
/** Number of retry attempts */
|
|
19
42
|
retryCount?: number;
|
|
20
43
|
/** Maximum number of retries allowed */
|
|
21
44
|
maxRetries?: number;
|
|
45
|
+
/** Last error message if job failed */
|
|
46
|
+
lastError?: string;
|
|
22
47
|
};
|
|
23
48
|
/**
|
|
24
49
|
* Event types for the queue system
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/queue/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/queue/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE7C;;GAEG;AACH,oBAAY,aAAa;IACvB,OAAO,KAAK;IACZ,aAAa,IAAI;IACjB,OAAO,IAAI;IACX,KAAK,IAAI;IACT,OAAO,IAAI;IACX,QAAQ,IAAI;CACb;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAClB,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAE9B,KAAK,IAAI,IAAI,CAAC;IACd,QAAQ,IAAI,IAAI,CAAC;IACjB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,MAAM,GAAG,GAAG;IAChB,oCAAoC;IACpC,EAAE,EAAE,MAAM,CAAC;IAEX,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;IAEnB,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IAEd,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IAEf,0DAA0D;IAC1D,OAAO,EAAE,MAAM,EAAE,CAAC;IAElB,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAC;IAElB,yDAAyD;IACzD,SAAS,EAAE,MAAM,EAAE,CAAC;IAEpB,+BAA+B;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,wCAAwC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe;;CAElB,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,CAAC"}
|
package/dist/src/queue/types.js
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* State of a job in the queue
|
|
3
|
+
*/
|
|
4
|
+
export var JobQueueState;
|
|
5
|
+
(function (JobQueueState) {
|
|
6
|
+
JobQueueState[JobQueueState["UNKNOWN"] = -1] = "UNKNOWN";
|
|
7
|
+
JobQueueState[JobQueueState["PREPROCESSING"] = 0] = "PREPROCESSING";
|
|
8
|
+
JobQueueState[JobQueueState["PENDING"] = 1] = "PENDING";
|
|
9
|
+
JobQueueState[JobQueueState["READY"] = 2] = "READY";
|
|
10
|
+
JobQueueState[JobQueueState["RUNNING"] = 3] = "RUNNING";
|
|
11
|
+
JobQueueState[JobQueueState["RESOLVED"] = 4] = "RESOLVED";
|
|
12
|
+
})(JobQueueState || (JobQueueState = {}));
|
|
1
13
|
/**
|
|
2
14
|
* Event types for the queue system
|
|
3
15
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/queue/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/queue/types.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,CAAN,IAAY,aAOX;AAPD,WAAY,aAAa;IACvB,wDAAY,CAAA;IACZ,mEAAiB,CAAA;IACjB,uDAAW,CAAA;IACX,mDAAS,CAAA;IACT,uDAAW,CAAA;IACX,yDAAY,CAAA;AACd,CAAC,EAPW,aAAa,KAAb,aAAa,QAOxB;AAiDD;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,aAAa,EAAE,KAAK;CACZ,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { IEventBus } from "../events/interfaces.js";
|
|
2
|
+
import type { IReadModel, IReadModelCoordinator } from "./interfaces.js";
|
|
3
|
+
/**
|
|
4
|
+
* Coordinates read model synchronization by listening to operation write events
|
|
5
|
+
* and updating all registered read models in parallel.
|
|
6
|
+
*
|
|
7
|
+
* This coordinator is responsible for:
|
|
8
|
+
* - Subscribing to OPERATION_WRITTEN events from the event bus
|
|
9
|
+
* - Distributing operation updates to all registered read models
|
|
10
|
+
* - Managing the lifecycle of read model subscriptions
|
|
11
|
+
*
|
|
12
|
+
* Read models are updated asynchronously and in parallel to avoid blocking
|
|
13
|
+
* the write path. Errors in read model updates are propagated through the
|
|
14
|
+
* event bus but do not affect the write operation success.
|
|
15
|
+
*/
|
|
16
|
+
export declare class ReadModelCoordinator implements IReadModelCoordinator {
|
|
17
|
+
private eventBus;
|
|
18
|
+
private readModels;
|
|
19
|
+
private unsubscribe?;
|
|
20
|
+
private isRunning;
|
|
21
|
+
constructor(eventBus: IEventBus, readModels: IReadModel[]);
|
|
22
|
+
/**
|
|
23
|
+
* Start listening for operation events and updating read models.
|
|
24
|
+
* Can be called multiple times safely (subsequent calls are no-ops).
|
|
25
|
+
*/
|
|
26
|
+
start(): void;
|
|
27
|
+
/**
|
|
28
|
+
* Stop listening and clean up subscriptions.
|
|
29
|
+
* Can be called multiple times safely (subsequent calls are no-ops).
|
|
30
|
+
*/
|
|
31
|
+
stop(): void;
|
|
32
|
+
/**
|
|
33
|
+
* Handle operation written events by updating all read models in parallel.
|
|
34
|
+
* Errors from individual read models are collected and re-thrown as an aggregate.
|
|
35
|
+
*/
|
|
36
|
+
private handleOperationWritten;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=coordinator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordinator.d.ts","sourceRoot":"","sources":["../../../src/read-models/coordinator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAMzD,OAAO,KAAK,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAEzE;;;;;;;;;;;;GAYG;AACH,qBAAa,oBAAqB,YAAW,qBAAqB;IAK9D,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,UAAU;IALpB,OAAO,CAAC,WAAW,CAAC,CAAc;IAClC,OAAO,CAAC,SAAS,CAAS;gBAGhB,QAAQ,EAAE,SAAS,EACnB,UAAU,EAAE,UAAU,EAAE;IAGlC;;;OAGG;IACH,KAAK,IAAI,IAAI;IAgBb;;;OAGG;IACH,IAAI,IAAI,IAAI;IAaZ;;;OAGG;YACW,sBAAsB;CAWrC"}
|
|
@@ -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;AAGpB,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;IA0H7D,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;YAqIP,gBAAgB;YAchB,sBAAsB;CAsGrC"}
|