@powerhousedao/reactor-api 6.0.0-dev.43 → 6.0.0-dev.45
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/graphql/reactor/factory.d.ts +11 -0
- package/dist/src/graphql/reactor/factory.d.ts.map +1 -1
- package/dist/src/graphql/reactor/gen/graphql.d.ts +103 -3
- package/dist/src/graphql/reactor/gen/graphql.d.ts.map +1 -1
- package/dist/src/graphql/reactor/gen/graphql.js +91 -0
- package/dist/src/graphql/reactor/gen/graphql.js.map +1 -1
- package/dist/src/graphql/reactor/operations.graphql +80 -0
- package/dist/src/graphql/reactor/requester.with-zod.d.ts.map +1 -1
- package/dist/src/graphql/reactor/requester.with-zod.js +4 -0
- package/dist/src/graphql/reactor/requester.with-zod.js.map +1 -1
- package/dist/src/graphql/reactor/resolvers.d.ts +7 -3
- package/dist/src/graphql/reactor/resolvers.d.ts.map +1 -1
- package/dist/src/graphql/reactor/resolvers.js +30 -20
- package/dist/src/graphql/reactor/resolvers.js.map +1 -1
- package/dist/src/graphql/reactor/schema.graphql +11 -1
- package/dist/src/graphql/reactor/subgraph.d.ts.map +1 -1
- package/dist/src/graphql/reactor/subgraph.js +6 -3
- package/dist/src/graphql/reactor/subgraph.js.map +1 -1
- package/dist/test/connect-switchboard-sync.test.d.ts +2 -0
- package/dist/test/connect-switchboard-sync.test.d.ts.map +1 -0
- package/dist/test/connect-switchboard-sync.test.js +561 -0
- package/dist/test/connect-switchboard-sync.test.js.map +1 -0
- package/dist/test/utils/gql-resolver-bridge.d.ts.map +1 -1
- package/dist/test/utils/gql-resolver-bridge.js +24 -2
- package/dist/test/utils/gql-resolver-bridge.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +16 -16
- package/dist/test/two-reactor-gql-catchup-duplicate.test.d.ts +0 -2
- package/dist/test/two-reactor-gql-catchup-duplicate.test.d.ts.map +0 -1
- package/dist/test/two-reactor-gql-catchup-duplicate.test.js +0 -264
- package/dist/test/two-reactor-gql-catchup-duplicate.test.js.map +0 -1
- package/dist/test/two-reactor-gql-sync.test.d.ts +0 -2
- package/dist/test/two-reactor-gql-sync.test.d.ts.map +0 -1
- package/dist/test/two-reactor-gql-sync.test.js +0 -335
- package/dist/test/two-reactor-gql-sync.test.js.map +0 -1
|
@@ -1,335 +0,0 @@
|
|
|
1
|
-
import { CompositeChannelFactory, ConsoleLogger, driveCollectionId, JobStatus, ReactorBuilder, ReactorEventTypes, SyncBuilder, } from "@powerhousedao/reactor";
|
|
2
|
-
import { driveDocumentModelModule } from "document-drive";
|
|
3
|
-
import { documentModelDocumentModelModule, } from "document-model";
|
|
4
|
-
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
5
|
-
import { createResolverBridge } from "./utils/gql-resolver-bridge.js";
|
|
6
|
-
async function waitForJobCompletion(reactor, jobId, timeoutMs = 5000) {
|
|
7
|
-
const startTime = Date.now();
|
|
8
|
-
while (Date.now() - startTime < timeoutMs) {
|
|
9
|
-
const status = await reactor.getJobStatus(jobId);
|
|
10
|
-
if (status.status === JobStatus.READ_READY) {
|
|
11
|
-
return;
|
|
12
|
-
}
|
|
13
|
-
if (status.status === JobStatus.FAILED) {
|
|
14
|
-
throw new Error(`Job failed: ${status.error?.message || "Unknown"}`);
|
|
15
|
-
}
|
|
16
|
-
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
17
|
-
}
|
|
18
|
-
throw new Error(`Job did not complete within ${timeoutMs}ms`);
|
|
19
|
-
}
|
|
20
|
-
async function waitForOperationsReady(eventBus, documentId, timeoutMs = 5000) {
|
|
21
|
-
return new Promise((resolve, reject) => {
|
|
22
|
-
const timeout = setTimeout(() => {
|
|
23
|
-
unsubscribe();
|
|
24
|
-
reject(new Error(`OPERATIONS_READY event for document ${documentId} not received within ${timeoutMs}ms`));
|
|
25
|
-
}, timeoutMs);
|
|
26
|
-
const unsubscribe = eventBus.subscribe(ReactorEventTypes.JOB_READ_READY, (type, event) => {
|
|
27
|
-
const hasDocument = event.operations.some((op) => op.context.documentId === documentId);
|
|
28
|
-
if (hasDocument) {
|
|
29
|
-
clearTimeout(timeout);
|
|
30
|
-
unsubscribe();
|
|
31
|
-
resolve();
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
async function setupTwoReactors() {
|
|
37
|
-
const syncManagerRegistry = new Map();
|
|
38
|
-
const resolverBridge = createResolverBridge(syncManagerRegistry);
|
|
39
|
-
const logger = new ConsoleLogger(["test"]);
|
|
40
|
-
const channelFactoryA = new CompositeChannelFactory(logger);
|
|
41
|
-
const channelFactoryB = new CompositeChannelFactory(logger);
|
|
42
|
-
const models = [
|
|
43
|
-
driveDocumentModelModule,
|
|
44
|
-
documentModelDocumentModelModule,
|
|
45
|
-
];
|
|
46
|
-
const reactorAModule = await new ReactorBuilder()
|
|
47
|
-
.withDocumentModels(models)
|
|
48
|
-
.withSync(new SyncBuilder().withChannelFactory(channelFactoryA))
|
|
49
|
-
.buildModule();
|
|
50
|
-
const reactorA = reactorAModule.reactor;
|
|
51
|
-
const eventBusA = reactorAModule.eventBus;
|
|
52
|
-
const syncManagerA = reactorAModule.syncModule.syncManager;
|
|
53
|
-
const reactorBModule = await new ReactorBuilder()
|
|
54
|
-
.withDocumentModels(models)
|
|
55
|
-
.withSync(new SyncBuilder().withChannelFactory(channelFactoryB))
|
|
56
|
-
.buildModule();
|
|
57
|
-
const reactorB = reactorBModule.reactor;
|
|
58
|
-
const eventBusB = reactorBModule.eventBus;
|
|
59
|
-
const syncManagerB = reactorBModule.syncModule.syncManager;
|
|
60
|
-
syncManagerRegistry.set("reactora", syncManagerA);
|
|
61
|
-
syncManagerRegistry.set("reactorb", syncManagerB);
|
|
62
|
-
return {
|
|
63
|
-
reactorA,
|
|
64
|
-
reactorB,
|
|
65
|
-
eventBusA,
|
|
66
|
-
eventBusB,
|
|
67
|
-
syncManagerA,
|
|
68
|
-
syncManagerB,
|
|
69
|
-
resolverBridge,
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
async function setupSyncForDrive(syncManagerA, driveId, resolverBridge) {
|
|
73
|
-
const collectionId = driveCollectionId("main", driveId);
|
|
74
|
-
const filter = {
|
|
75
|
-
documentId: [],
|
|
76
|
-
scope: [],
|
|
77
|
-
branch: "main",
|
|
78
|
-
};
|
|
79
|
-
const gqlParamsToB = {
|
|
80
|
-
url: "http://reactorB/graphql",
|
|
81
|
-
pollIntervalMs: 100,
|
|
82
|
-
maxFailures: 10,
|
|
83
|
-
retryBaseDelayMs: 50,
|
|
84
|
-
fetchFn: resolverBridge,
|
|
85
|
-
};
|
|
86
|
-
await syncManagerA.add(`remoteB-${driveId}`, collectionId, { type: "gql", parameters: gqlParamsToB }, filter);
|
|
87
|
-
}
|
|
88
|
-
describe("Two-Reactor Sync with GqlChannel", () => {
|
|
89
|
-
let reactorA;
|
|
90
|
-
let reactorB;
|
|
91
|
-
let eventBusA;
|
|
92
|
-
let eventBusB;
|
|
93
|
-
let syncManagerA;
|
|
94
|
-
let resolverBridge;
|
|
95
|
-
beforeEach(async () => {
|
|
96
|
-
const setup = await setupTwoReactors();
|
|
97
|
-
reactorA = setup.reactorA;
|
|
98
|
-
reactorB = setup.reactorB;
|
|
99
|
-
eventBusA = setup.eventBusA;
|
|
100
|
-
eventBusB = setup.eventBusB;
|
|
101
|
-
syncManagerA = setup.syncManagerA;
|
|
102
|
-
resolverBridge = setup.resolverBridge;
|
|
103
|
-
});
|
|
104
|
-
afterEach(() => {
|
|
105
|
-
reactorA.kill();
|
|
106
|
-
reactorB.kill();
|
|
107
|
-
});
|
|
108
|
-
it("should sync operation from ReactorA to ReactorB via GqlChannel", async () => {
|
|
109
|
-
const document = driveDocumentModelModule.utils.createDocument();
|
|
110
|
-
await setupSyncForDrive(syncManagerA, document.header.id, resolverBridge);
|
|
111
|
-
const readyPromise = waitForOperationsReady(eventBusB, document.header.id);
|
|
112
|
-
const jobInfo = await reactorA.create(document);
|
|
113
|
-
await waitForJobCompletion(reactorA, jobInfo.id);
|
|
114
|
-
const resultA = await reactorA.getOperations(document.header.id, {
|
|
115
|
-
branch: "main",
|
|
116
|
-
});
|
|
117
|
-
const opsA = Object.values(resultA).flatMap((scope) => scope.results);
|
|
118
|
-
await readyPromise;
|
|
119
|
-
const resultB = await reactorB.getOperations(document.header.id, {
|
|
120
|
-
branch: "main",
|
|
121
|
-
});
|
|
122
|
-
const opsB = Object.values(resultB).flatMap((scope) => scope.results);
|
|
123
|
-
expect(opsA.length).toBeGreaterThan(0);
|
|
124
|
-
expect(opsB.length).toBe(opsA.length);
|
|
125
|
-
for (let i = 0; i < opsA.length; i++) {
|
|
126
|
-
expect(opsB[i]).toEqual(opsA[i]);
|
|
127
|
-
}
|
|
128
|
-
const docA = await reactorA.get(document.header.id, { branch: "main" });
|
|
129
|
-
const docB = await reactorB.get(document.header.id, { branch: "main" });
|
|
130
|
-
expect(docA).toEqual(docB);
|
|
131
|
-
});
|
|
132
|
-
it("should sync operation from ReactorB to ReactorA via GqlChannel", async () => {
|
|
133
|
-
const document = driveDocumentModelModule.utils.createDocument();
|
|
134
|
-
await setupSyncForDrive(syncManagerA, document.header.id, resolverBridge);
|
|
135
|
-
const readyPromise = waitForOperationsReady(eventBusA, document.header.id);
|
|
136
|
-
const jobInfo = await reactorB.create(document);
|
|
137
|
-
await waitForJobCompletion(reactorB, jobInfo.id);
|
|
138
|
-
const resultB = await reactorB.getOperations(document.header.id, {
|
|
139
|
-
branch: "main",
|
|
140
|
-
});
|
|
141
|
-
const opsB = Object.values(resultB).flatMap((scope) => scope.results);
|
|
142
|
-
await readyPromise;
|
|
143
|
-
const resultA = await reactorA.getOperations(document.header.id, {
|
|
144
|
-
branch: "main",
|
|
145
|
-
});
|
|
146
|
-
const opsA = Object.values(resultA).flatMap((scope) => scope.results);
|
|
147
|
-
expect(opsB.length).toBeGreaterThan(0);
|
|
148
|
-
expect(opsA.length).toBe(opsB.length);
|
|
149
|
-
for (let i = 0; i < opsB.length; i++) {
|
|
150
|
-
expect(opsA[i]).toEqual(opsB[i]);
|
|
151
|
-
}
|
|
152
|
-
const docA = await reactorA.get(document.header.id, { branch: "main" });
|
|
153
|
-
const docB = await reactorB.get(document.header.id, { branch: "main" });
|
|
154
|
-
expect(docA).toEqual(docB);
|
|
155
|
-
});
|
|
156
|
-
it("should sync multiple documents with concurrent operations from both reactors", async () => {
|
|
157
|
-
const docA1 = driveDocumentModelModule.utils.createDocument();
|
|
158
|
-
const docA2 = driveDocumentModelModule.utils.createDocument();
|
|
159
|
-
const docB1 = driveDocumentModelModule.utils.createDocument();
|
|
160
|
-
const docB2 = driveDocumentModelModule.utils.createDocument();
|
|
161
|
-
const allDocIds = [
|
|
162
|
-
docA1.header.id,
|
|
163
|
-
docA2.header.id,
|
|
164
|
-
docB1.header.id,
|
|
165
|
-
docB2.header.id,
|
|
166
|
-
];
|
|
167
|
-
await Promise.all([
|
|
168
|
-
setupSyncForDrive(syncManagerA, docA1.header.id, resolverBridge),
|
|
169
|
-
setupSyncForDrive(syncManagerA, docA2.header.id, resolverBridge),
|
|
170
|
-
setupSyncForDrive(syncManagerA, docB1.header.id, resolverBridge),
|
|
171
|
-
setupSyncForDrive(syncManagerA, docB2.header.id, resolverBridge),
|
|
172
|
-
]);
|
|
173
|
-
const readyOnB_A1 = waitForOperationsReady(eventBusB, docA1.header.id);
|
|
174
|
-
const readyOnB_A2 = waitForOperationsReady(eventBusB, docA2.header.id);
|
|
175
|
-
const readyOnA_B1 = waitForOperationsReady(eventBusA, docB1.header.id);
|
|
176
|
-
const readyOnA_B2 = waitForOperationsReady(eventBusA, docB2.header.id);
|
|
177
|
-
const [jobA1, jobA2] = await Promise.all([
|
|
178
|
-
reactorA.create(docA1),
|
|
179
|
-
reactorA.create(docA2),
|
|
180
|
-
]);
|
|
181
|
-
const [jobB1, jobB2] = await Promise.all([
|
|
182
|
-
reactorB.create(docB1),
|
|
183
|
-
reactorB.create(docB2),
|
|
184
|
-
]);
|
|
185
|
-
await Promise.all([
|
|
186
|
-
waitForJobCompletion(reactorA, jobA1.id),
|
|
187
|
-
waitForJobCompletion(reactorA, jobA2.id),
|
|
188
|
-
waitForJobCompletion(reactorB, jobB1.id),
|
|
189
|
-
waitForJobCompletion(reactorB, jobB2.id),
|
|
190
|
-
]);
|
|
191
|
-
await Promise.all([readyOnB_A1, readyOnB_A2, readyOnA_B1, readyOnA_B2]);
|
|
192
|
-
void reactorA.execute(docA1.header.id, "main", [
|
|
193
|
-
driveDocumentModelModule.actions.setDriveName({ name: "Drive A1" }),
|
|
194
|
-
driveDocumentModelModule.actions.addFolder({
|
|
195
|
-
id: "folder-a1",
|
|
196
|
-
name: "Folder A1",
|
|
197
|
-
parentFolder: null,
|
|
198
|
-
}),
|
|
199
|
-
]);
|
|
200
|
-
void reactorA.execute(docA2.header.id, "main", [
|
|
201
|
-
driveDocumentModelModule.actions.setDriveName({ name: "Drive A2" }),
|
|
202
|
-
driveDocumentModelModule.actions.addFolder({
|
|
203
|
-
id: "folder-a2",
|
|
204
|
-
name: "Folder A2",
|
|
205
|
-
parentFolder: null,
|
|
206
|
-
}),
|
|
207
|
-
]);
|
|
208
|
-
void reactorB.execute(docB1.header.id, "main", [
|
|
209
|
-
driveDocumentModelModule.actions.setDriveName({ name: "Drive B1" }),
|
|
210
|
-
driveDocumentModelModule.actions.addFolder({
|
|
211
|
-
id: "folder-b1",
|
|
212
|
-
name: "Folder B1",
|
|
213
|
-
parentFolder: null,
|
|
214
|
-
}),
|
|
215
|
-
]);
|
|
216
|
-
void reactorB.execute(docB2.header.id, "main", [
|
|
217
|
-
driveDocumentModelModule.actions.setDriveName({ name: "Drive B2" }),
|
|
218
|
-
driveDocumentModelModule.actions.addFolder({
|
|
219
|
-
id: "folder-b2",
|
|
220
|
-
name: "Folder B2",
|
|
221
|
-
parentFolder: null,
|
|
222
|
-
}),
|
|
223
|
-
]);
|
|
224
|
-
const startTime = Date.now();
|
|
225
|
-
const timeout = 25000;
|
|
226
|
-
let synced = false;
|
|
227
|
-
while (Date.now() - startTime < timeout) {
|
|
228
|
-
let allDocsSynced = true;
|
|
229
|
-
for (const docId of allDocIds) {
|
|
230
|
-
try {
|
|
231
|
-
const resultA = await reactorA.getOperations(docId, {
|
|
232
|
-
branch: "main",
|
|
233
|
-
});
|
|
234
|
-
const opsA = Object.values(resultA).flatMap((scope) => scope.results);
|
|
235
|
-
const resultB = await reactorB.getOperations(docId, {
|
|
236
|
-
branch: "main",
|
|
237
|
-
});
|
|
238
|
-
const opsB = Object.values(resultB).flatMap((scope) => scope.results);
|
|
239
|
-
if (opsA.length < 2 ||
|
|
240
|
-
opsB.length < 2 ||
|
|
241
|
-
opsA.length !== opsB.length) {
|
|
242
|
-
allDocsSynced = false;
|
|
243
|
-
break;
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
catch {
|
|
247
|
-
allDocsSynced = false;
|
|
248
|
-
break;
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
if (allDocsSynced) {
|
|
252
|
-
synced = true;
|
|
253
|
-
break;
|
|
254
|
-
}
|
|
255
|
-
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
256
|
-
}
|
|
257
|
-
expect(synced).toBe(true);
|
|
258
|
-
for (const docId of allDocIds) {
|
|
259
|
-
const resultA = await reactorA.getOperations(docId, { branch: "main" });
|
|
260
|
-
const opsA = Object.values(resultA).flatMap((scope) => scope.results);
|
|
261
|
-
const resultB = await reactorB.getOperations(docId, { branch: "main" });
|
|
262
|
-
const opsB = Object.values(resultB).flatMap((scope) => scope.results);
|
|
263
|
-
expect(opsA.length).toBeGreaterThan(0);
|
|
264
|
-
expect(opsB.length).toBe(opsA.length);
|
|
265
|
-
for (let i = 0; i < opsA.length; i++) {
|
|
266
|
-
expect(opsB[i]).toEqual(opsA[i]);
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
for (const docId of allDocIds) {
|
|
270
|
-
const docFromA = await reactorA.get(docId, { branch: "main" });
|
|
271
|
-
const docFromB = await reactorB.get(docId, { branch: "main" });
|
|
272
|
-
expect(docFromA).toEqual(docFromB);
|
|
273
|
-
}
|
|
274
|
-
}, 30000);
|
|
275
|
-
it("should include key/dependsOn in poll response for batch operations", async () => {
|
|
276
|
-
const driveDoc = driveDocumentModelModule.utils.createDocument();
|
|
277
|
-
await setupSyncForDrive(syncManagerA, driveDoc.header.id, resolverBridge);
|
|
278
|
-
const readyPromise = waitForOperationsReady(eventBusA, driveDoc.header.id);
|
|
279
|
-
const createJob = await reactorB.create(driveDoc);
|
|
280
|
-
await waitForJobCompletion(reactorB, createJob.id);
|
|
281
|
-
await readyPromise;
|
|
282
|
-
const batchResult = await reactorB.executeBatch({
|
|
283
|
-
jobs: [
|
|
284
|
-
{
|
|
285
|
-
key: "rename",
|
|
286
|
-
documentId: driveDoc.header.id,
|
|
287
|
-
scope: "global",
|
|
288
|
-
branch: "main",
|
|
289
|
-
actions: [
|
|
290
|
-
driveDocumentModelModule.actions.setDriveName({
|
|
291
|
-
name: "Renamed Drive",
|
|
292
|
-
}),
|
|
293
|
-
],
|
|
294
|
-
dependsOn: [],
|
|
295
|
-
},
|
|
296
|
-
{
|
|
297
|
-
key: "add-folder",
|
|
298
|
-
documentId: driveDoc.header.id,
|
|
299
|
-
scope: "global",
|
|
300
|
-
branch: "main",
|
|
301
|
-
actions: [
|
|
302
|
-
driveDocumentModelModule.actions.addFolder({
|
|
303
|
-
id: "folder-1",
|
|
304
|
-
name: "Folder 1",
|
|
305
|
-
parentFolder: null,
|
|
306
|
-
}),
|
|
307
|
-
],
|
|
308
|
-
dependsOn: ["rename"],
|
|
309
|
-
},
|
|
310
|
-
],
|
|
311
|
-
});
|
|
312
|
-
for (const jobInfo of Object.values(batchResult.jobs)) {
|
|
313
|
-
await waitForJobCompletion(reactorB, jobInfo.id);
|
|
314
|
-
}
|
|
315
|
-
const startTime = Date.now();
|
|
316
|
-
const timeout = 10000;
|
|
317
|
-
let statesSynced = false;
|
|
318
|
-
while (Date.now() - startTime < timeout) {
|
|
319
|
-
const docA = await reactorA.get(driveDoc.header.id, { branch: "main" });
|
|
320
|
-
const docB = await reactorB.get(driveDoc.header.id, { branch: "main" });
|
|
321
|
-
if (docA &&
|
|
322
|
-
docB &&
|
|
323
|
-
JSON.stringify(docA.state) === JSON.stringify(docB.state)) {
|
|
324
|
-
statesSynced = true;
|
|
325
|
-
break;
|
|
326
|
-
}
|
|
327
|
-
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
328
|
-
}
|
|
329
|
-
expect(statesSynced).toBe(true);
|
|
330
|
-
const docA = await reactorA.get(driveDoc.header.id, { branch: "main" });
|
|
331
|
-
const docB = await reactorB.get(driveDoc.header.id, { branch: "main" });
|
|
332
|
-
expect(docA.state).toEqual(docB.state);
|
|
333
|
-
}, 15000);
|
|
334
|
-
});
|
|
335
|
-
//# sourceMappingURL=two-reactor-gql-sync.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"two-reactor-gql-sync.test.js","sourceRoot":"","sources":["../../test/two-reactor-gql-sync.test.ts"],"names":[],"mappings":"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"}
|