@powerhousedao/reactor-api 5.1.0 → 5.2.0-staging.1
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/codegen.js +2 -2
- package/dist/codegen.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/src/graphql/auth/index.d.ts +2 -0
- package/dist/src/graphql/auth/index.d.ts.map +1 -0
- package/dist/src/graphql/auth/index.js +2 -0
- package/dist/src/graphql/auth/index.js.map +1 -0
- package/dist/src/graphql/auth/resolvers.d.ts +149 -0
- package/dist/src/graphql/auth/resolvers.d.ts.map +1 -0
- package/dist/src/graphql/auth/resolvers.js +173 -0
- package/dist/src/graphql/auth/resolvers.js.map +1 -0
- package/dist/src/graphql/auth/schema.graphql +173 -0
- package/dist/src/graphql/auth/subgraph.d.ts +177 -0
- package/dist/src/graphql/auth/subgraph.d.ts.map +1 -0
- package/dist/src/graphql/auth/subgraph.js +340 -0
- package/dist/src/graphql/auth/subgraph.js.map +1 -0
- package/dist/src/graphql/base-subgraph.d.ts +4 -1
- package/dist/src/graphql/base-subgraph.d.ts.map +1 -1
- package/dist/src/graphql/base-subgraph.js +4 -0
- package/dist/src/graphql/base-subgraph.js.map +1 -1
- package/dist/src/graphql/document-model-subgraph.d.ts +51 -0
- package/dist/src/graphql/document-model-subgraph.d.ts.map +1 -0
- package/dist/src/graphql/document-model-subgraph.js +104 -0
- package/dist/src/graphql/document-model-subgraph.js.map +1 -0
- package/dist/src/graphql/drive-subgraph.d.ts.map +1 -1
- package/dist/src/graphql/drive-subgraph.js +51 -10
- package/dist/src/graphql/drive-subgraph.js.map +1 -1
- package/dist/src/graphql/graphql-manager.d.ts +11 -3
- package/dist/src/graphql/graphql-manager.d.ts.map +1 -1
- package/dist/src/graphql/graphql-manager.js +72 -15
- package/dist/src/graphql/graphql-manager.js.map +1 -1
- package/dist/src/graphql/index.d.ts +1 -0
- package/dist/src/graphql/index.d.ts.map +1 -1
- package/dist/src/graphql/index.js +1 -0
- package/dist/src/graphql/index.js.map +1 -1
- package/dist/src/graphql/reactor/adapters.js +1 -1
- package/dist/src/graphql/reactor/adapters.js.map +1 -1
- package/dist/src/graphql/reactor/factory.d.ts +4 -4
- package/dist/src/graphql/reactor/factory.d.ts.map +1 -1
- package/dist/src/graphql/reactor/gen/graphql.d.ts +295 -64
- package/dist/src/graphql/reactor/gen/graphql.d.ts.map +1 -1
- package/dist/src/graphql/reactor/gen/graphql.js +121 -8
- package/dist/src/graphql/reactor/gen/graphql.js.map +1 -1
- package/dist/src/graphql/reactor/operations.graphql +253 -0
- package/dist/src/graphql/reactor/pubsub.d.ts +2 -2
- package/dist/src/graphql/reactor/pubsub.d.ts.map +1 -1
- package/dist/src/graphql/reactor/pubsub.js +2 -1
- package/dist/src/graphql/reactor/pubsub.js.map +1 -1
- package/dist/src/graphql/reactor/resolvers.d.ts +48 -17
- package/dist/src/graphql/reactor/resolvers.d.ts.map +1 -1
- package/dist/src/graphql/reactor/resolvers.js +114 -34
- package/dist/src/graphql/reactor/resolvers.js.map +1 -1
- package/dist/src/graphql/reactor/schema.graphql +429 -0
- package/dist/src/graphql/reactor/subgraph.d.ts +34 -0
- package/dist/src/graphql/reactor/subgraph.d.ts.map +1 -1
- package/dist/src/graphql/reactor/subgraph.js +325 -22
- package/dist/src/graphql/reactor/subgraph.js.map +1 -1
- package/dist/src/graphql/reactor/validation.d.ts +62 -62
- package/dist/src/graphql/system/system-subgraph.d.ts.map +1 -1
- package/dist/src/graphql/types.d.ts +5 -1
- package/dist/src/graphql/types.d.ts.map +1 -1
- package/dist/src/graphql/utils.js +1 -1
- package/dist/src/graphql/utils.js.map +1 -1
- package/dist/src/migrations/001_create_document_permissions.d.ts +4 -0
- package/dist/src/migrations/001_create_document_permissions.d.ts.map +1 -0
- package/dist/src/migrations/001_create_document_permissions.js +91 -0
- package/dist/src/migrations/001_create_document_permissions.js.map +1 -0
- package/dist/src/migrations/index.d.ts +10 -0
- package/dist/src/migrations/index.d.ts.map +1 -0
- package/dist/src/migrations/index.js +59 -0
- package/dist/src/migrations/index.js.map +1 -0
- package/dist/src/packages/util.js +1 -1
- package/dist/src/packages/util.js.map +1 -1
- package/dist/src/server.d.ts +17 -7
- package/dist/src/server.d.ts.map +1 -1
- package/dist/src/server.js +49 -27
- package/dist/src/server.js.map +1 -1
- package/dist/src/services/auth.service.d.ts +1 -0
- package/dist/src/services/auth.service.d.ts.map +1 -1
- package/dist/src/services/auth.service.js +32 -22
- package/dist/src/services/auth.service.js.map +1 -1
- package/dist/src/services/document-permission.service.d.ts +201 -0
- package/dist/src/services/document-permission.service.d.ts.map +1 -0
- package/dist/src/services/document-permission.service.js +636 -0
- package/dist/src/services/document-permission.service.js.map +1 -0
- package/dist/src/utils/create-schema.d.ts +5 -4
- package/dist/src/utils/create-schema.d.ts.map +1 -1
- package/dist/src/utils/create-schema.js +110 -4
- package/dist/src/utils/create-schema.js.map +1 -1
- package/dist/src/utils/db.d.ts +65 -1
- package/dist/src/utils/db.d.ts.map +1 -1
- package/dist/src/utils/db.js.map +1 -1
- package/dist/test/document-permission.service.test.d.ts +2 -0
- package/dist/test/document-permission.service.test.d.ts.map +1 -0
- package/dist/test/document-permission.service.test.js +480 -0
- package/dist/test/document-permission.service.test.js.map +1 -0
- package/dist/test/drive-subgraph-permissions.test.d.ts +2 -0
- package/dist/test/drive-subgraph-permissions.test.d.ts.map +1 -0
- package/dist/test/drive-subgraph-permissions.test.js +195 -0
- package/dist/test/drive-subgraph-permissions.test.js.map +1 -0
- package/dist/test/identity-integration.test.d.ts +2 -0
- package/dist/test/identity-integration.test.d.ts.map +1 -0
- package/dist/test/identity-integration.test.js +349 -0
- package/dist/test/identity-integration.test.js.map +1 -0
- package/dist/test/permissions-integration.test.d.ts +2 -0
- package/dist/test/permissions-integration.test.d.ts.map +1 -0
- package/dist/test/permissions-integration.test.js +421 -0
- package/dist/test/permissions-integration.test.js.map +1 -0
- package/dist/test/reactor-adapters.test.js +2 -2
- package/dist/test/reactor-adapters.test.js.map +1 -1
- package/dist/test/reactor-resolvers.test.js +24 -24
- package/dist/test/reactor-resolvers.test.js.map +1 -1
- package/dist/test/reactor-subgraph-permissions.test.d.ts +2 -0
- package/dist/test/reactor-subgraph-permissions.test.d.ts.map +1 -0
- package/dist/test/reactor-subgraph-permissions.test.js +400 -0
- package/dist/test/reactor-subgraph-permissions.test.js.map +1 -0
- package/dist/test/two-reactor-gql-sync.test.d.ts +2 -0
- package/dist/test/two-reactor-gql-sync.test.d.ts.map +1 -0
- package/dist/test/two-reactor-gql-sync.test.js +298 -0
- package/dist/test/two-reactor-gql-sync.test.js.map +1 -0
- package/dist/test/utils/gql-resolver-bridge.d.ts +12 -0
- package/dist/test/utils/gql-resolver-bridge.d.ts.map +1 -0
- package/dist/test/utils/gql-resolver-bridge.js +60 -0
- package/dist/test/utils/gql-resolver-bridge.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +11 -9
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import { CompositeChannelFactory, JobStatus, OperationEventTypes, ReactorBuilder, SyncBuilder, } from "@powerhousedao/reactor";
|
|
2
|
+
import { driveDocumentModelModule } from "document-drive";
|
|
3
|
+
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
4
|
+
import { createResolverBridge } from "./utils/gql-resolver-bridge.js";
|
|
5
|
+
async function waitForJobCompletion(reactor, jobId, timeoutMs = 5000) {
|
|
6
|
+
const startTime = Date.now();
|
|
7
|
+
while (Date.now() - startTime < timeoutMs) {
|
|
8
|
+
const status = await reactor.getJobStatus(jobId);
|
|
9
|
+
if (status.status === JobStatus.READ_MODELS_READY) {
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
if (status.status === JobStatus.FAILED) {
|
|
13
|
+
throw new Error(`Job failed: ${status.error?.message || "Unknown"}`);
|
|
14
|
+
}
|
|
15
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
16
|
+
}
|
|
17
|
+
throw new Error(`Job did not complete within ${timeoutMs}ms`);
|
|
18
|
+
}
|
|
19
|
+
async function waitForOperationsReady(eventBus, documentId, timeoutMs = 5000) {
|
|
20
|
+
return new Promise((resolve, reject) => {
|
|
21
|
+
const timeout = setTimeout(() => {
|
|
22
|
+
unsubscribe();
|
|
23
|
+
reject(new Error(`OPERATIONS_READY event for document ${documentId} not received within ${timeoutMs}ms`));
|
|
24
|
+
}, timeoutMs);
|
|
25
|
+
const unsubscribe = eventBus.subscribe(OperationEventTypes.OPERATIONS_READY, (type, event) => {
|
|
26
|
+
const hasDocument = event.operations.some((op) => op.context.documentId === documentId);
|
|
27
|
+
if (hasDocument) {
|
|
28
|
+
clearTimeout(timeout);
|
|
29
|
+
unsubscribe();
|
|
30
|
+
resolve();
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
async function waitForMultipleOperationsReady(eventBus, expectedCount, timeoutMs = 10000) {
|
|
36
|
+
return new Promise((resolve, reject) => {
|
|
37
|
+
let count = 0;
|
|
38
|
+
const timeout = setTimeout(() => {
|
|
39
|
+
unsubscribe();
|
|
40
|
+
reject(new Error(`Expected ${expectedCount} OPERATIONS_READY events but received ${count} within ${timeoutMs}ms`));
|
|
41
|
+
}, timeoutMs);
|
|
42
|
+
const unsubscribe = eventBus.subscribe(OperationEventTypes.OPERATIONS_READY, () => {
|
|
43
|
+
count++;
|
|
44
|
+
if (count >= expectedCount) {
|
|
45
|
+
clearTimeout(timeout);
|
|
46
|
+
unsubscribe();
|
|
47
|
+
resolve();
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
async function setupTwoReactorsWithGqlChannel() {
|
|
53
|
+
const syncManagerRegistry = new Map();
|
|
54
|
+
const resolverBridge = createResolverBridge(syncManagerRegistry);
|
|
55
|
+
const channelFactoryA = new CompositeChannelFactory();
|
|
56
|
+
const channelFactoryB = new CompositeChannelFactory();
|
|
57
|
+
const reactorAModule = await new ReactorBuilder()
|
|
58
|
+
.withSync(new SyncBuilder().withChannelFactory(channelFactoryA))
|
|
59
|
+
.buildModule();
|
|
60
|
+
const reactorA = reactorAModule.reactor;
|
|
61
|
+
const eventBusA = reactorAModule.eventBus;
|
|
62
|
+
const syncManagerA = reactorAModule.syncModule.syncManager;
|
|
63
|
+
const reactorBModule = await new ReactorBuilder()
|
|
64
|
+
.withSync(new SyncBuilder().withChannelFactory(channelFactoryB))
|
|
65
|
+
.buildModule();
|
|
66
|
+
const reactorB = reactorBModule.reactor;
|
|
67
|
+
const eventBusB = reactorBModule.eventBus;
|
|
68
|
+
const syncManagerB = reactorBModule.syncModule.syncManager;
|
|
69
|
+
syncManagerRegistry.set("reactora", syncManagerA);
|
|
70
|
+
syncManagerRegistry.set("reactorb", syncManagerB);
|
|
71
|
+
const filter = {
|
|
72
|
+
documentId: [],
|
|
73
|
+
scope: [],
|
|
74
|
+
branch: "main",
|
|
75
|
+
};
|
|
76
|
+
const gqlParamsToB = {
|
|
77
|
+
url: "http://reactorB/graphql",
|
|
78
|
+
pollIntervalMs: 100,
|
|
79
|
+
maxFailures: 10,
|
|
80
|
+
retryBaseDelayMs: 50,
|
|
81
|
+
fetchFn: resolverBridge,
|
|
82
|
+
};
|
|
83
|
+
const gqlParamsToA = {
|
|
84
|
+
url: "http://reactorA/graphql",
|
|
85
|
+
pollIntervalMs: 100,
|
|
86
|
+
maxFailures: 10,
|
|
87
|
+
retryBaseDelayMs: 50,
|
|
88
|
+
fetchFn: resolverBridge,
|
|
89
|
+
};
|
|
90
|
+
// ReactorA adds remote pointing to B
|
|
91
|
+
// touchChannel automatically creates receiving channel on B
|
|
92
|
+
await syncManagerA.add("remoteB", "collection1", { type: "gql", parameters: gqlParamsToB }, filter);
|
|
93
|
+
// ReactorB adds remote pointing to A
|
|
94
|
+
// touchChannel automatically creates receiving channel on A
|
|
95
|
+
await syncManagerB.add("remoteA", "collection1", { type: "gql", parameters: gqlParamsToA }, filter);
|
|
96
|
+
return { reactorA, reactorB, eventBusA, eventBusB };
|
|
97
|
+
}
|
|
98
|
+
describe("Two-Reactor Sync with GqlChannel", () => {
|
|
99
|
+
let reactorA;
|
|
100
|
+
let reactorB;
|
|
101
|
+
let eventBusA;
|
|
102
|
+
let eventBusB;
|
|
103
|
+
beforeEach(async () => {
|
|
104
|
+
const setup = await setupTwoReactorsWithGqlChannel();
|
|
105
|
+
reactorA = setup.reactorA;
|
|
106
|
+
reactorB = setup.reactorB;
|
|
107
|
+
eventBusA = setup.eventBusA;
|
|
108
|
+
eventBusB = setup.eventBusB;
|
|
109
|
+
});
|
|
110
|
+
afterEach(() => {
|
|
111
|
+
reactorA.kill();
|
|
112
|
+
reactorB.kill();
|
|
113
|
+
});
|
|
114
|
+
it("should sync operation from ReactorA to ReactorB via GqlChannel", async () => {
|
|
115
|
+
const document = driveDocumentModelModule.utils.createDocument();
|
|
116
|
+
const readyPromise = waitForOperationsReady(eventBusB, document.header.id);
|
|
117
|
+
const jobInfo = await reactorA.create(document);
|
|
118
|
+
await waitForJobCompletion(reactorA, jobInfo.id);
|
|
119
|
+
const resultA = await reactorA.getOperations(document.header.id, {
|
|
120
|
+
branch: "main",
|
|
121
|
+
});
|
|
122
|
+
const opsA = Object.values(resultA).flatMap((scope) => scope.results);
|
|
123
|
+
await readyPromise;
|
|
124
|
+
const resultB = await reactorB.getOperations(document.header.id, {
|
|
125
|
+
branch: "main",
|
|
126
|
+
});
|
|
127
|
+
const opsB = Object.values(resultB).flatMap((scope) => scope.results);
|
|
128
|
+
expect(opsA.length).toBeGreaterThan(0);
|
|
129
|
+
expect(opsB.length).toBe(opsA.length);
|
|
130
|
+
for (let i = 0; i < opsA.length; i++) {
|
|
131
|
+
expect(opsB[i]).toEqual(opsA[i]);
|
|
132
|
+
}
|
|
133
|
+
const docA = await reactorA.get(document.header.id, { branch: "main" });
|
|
134
|
+
const docB = await reactorB.get(document.header.id, { branch: "main" });
|
|
135
|
+
expect(docA.document).toEqual(docB.document);
|
|
136
|
+
});
|
|
137
|
+
it("should sync operation from ReactorB to ReactorA via GqlChannel", async () => {
|
|
138
|
+
const document = driveDocumentModelModule.utils.createDocument();
|
|
139
|
+
const readyPromise = waitForOperationsReady(eventBusA, document.header.id);
|
|
140
|
+
const jobInfo = await reactorB.create(document);
|
|
141
|
+
await waitForJobCompletion(reactorB, jobInfo.id);
|
|
142
|
+
const resultB = await reactorB.getOperations(document.header.id, {
|
|
143
|
+
branch: "main",
|
|
144
|
+
});
|
|
145
|
+
const opsB = Object.values(resultB).flatMap((scope) => scope.results);
|
|
146
|
+
await readyPromise;
|
|
147
|
+
const resultA = await reactorA.getOperations(document.header.id, {
|
|
148
|
+
branch: "main",
|
|
149
|
+
});
|
|
150
|
+
const opsA = Object.values(resultA).flatMap((scope) => scope.results);
|
|
151
|
+
expect(opsB.length).toBeGreaterThan(0);
|
|
152
|
+
expect(opsA.length).toBe(opsB.length);
|
|
153
|
+
for (let i = 0; i < opsB.length; i++) {
|
|
154
|
+
expect(opsA[i]).toEqual(opsB[i]);
|
|
155
|
+
}
|
|
156
|
+
const docA = await reactorA.get(document.header.id, { branch: "main" });
|
|
157
|
+
const docB = await reactorB.get(document.header.id, { branch: "main" });
|
|
158
|
+
expect(docA.document).toEqual(docB.document);
|
|
159
|
+
});
|
|
160
|
+
it("should sync multiple documents with concurrent operations from both reactors", async () => {
|
|
161
|
+
const docA = driveDocumentModelModule.utils.createDocument();
|
|
162
|
+
const docB = driveDocumentModelModule.utils.createDocument();
|
|
163
|
+
const docC = driveDocumentModelModule.utils.createDocument();
|
|
164
|
+
const docD = driveDocumentModelModule.utils.createDocument();
|
|
165
|
+
const waitForCreatesA = waitForMultipleOperationsReady(eventBusA, 2, 15000);
|
|
166
|
+
const waitForCreatesB = waitForMultipleOperationsReady(eventBusB, 2, 15000);
|
|
167
|
+
void reactorA.create(docA);
|
|
168
|
+
void reactorB.create(docC);
|
|
169
|
+
void reactorA.create(docB);
|
|
170
|
+
void reactorB.create(docD);
|
|
171
|
+
await waitForCreatesA;
|
|
172
|
+
await waitForCreatesB;
|
|
173
|
+
const waitForMutatesA = waitForMultipleOperationsReady(eventBusA, 2, 15000);
|
|
174
|
+
const waitForMutatesB = waitForMultipleOperationsReady(eventBusB, 2, 15000);
|
|
175
|
+
void reactorA.execute(docA.header.id, "main", [
|
|
176
|
+
driveDocumentModelModule.actions.setDriveName({ name: "Drive A1" }),
|
|
177
|
+
driveDocumentModelModule.actions.addFolder({
|
|
178
|
+
id: "folder-a1",
|
|
179
|
+
name: "Folder A1",
|
|
180
|
+
parentFolder: null,
|
|
181
|
+
}),
|
|
182
|
+
]);
|
|
183
|
+
void reactorB.execute(docC.header.id, "main", [
|
|
184
|
+
driveDocumentModelModule.actions.setDriveName({ name: "Drive C1" }),
|
|
185
|
+
driveDocumentModelModule.actions.addFolder({
|
|
186
|
+
id: "folder-c1",
|
|
187
|
+
name: "Folder C1",
|
|
188
|
+
parentFolder: null,
|
|
189
|
+
}),
|
|
190
|
+
]);
|
|
191
|
+
void reactorA.execute(docB.header.id, "main", [
|
|
192
|
+
driveDocumentModelModule.actions.setDriveIcon({ icon: "icon-b1" }),
|
|
193
|
+
driveDocumentModelModule.actions.addFolder({
|
|
194
|
+
id: "folder-b1",
|
|
195
|
+
name: "Folder B1",
|
|
196
|
+
parentFolder: null,
|
|
197
|
+
}),
|
|
198
|
+
]);
|
|
199
|
+
void reactorB.execute(docD.header.id, "main", [
|
|
200
|
+
driveDocumentModelModule.actions.setDriveName({ name: "Drive D1" }),
|
|
201
|
+
driveDocumentModelModule.actions.updateNode({
|
|
202
|
+
id: docD.header.id,
|
|
203
|
+
name: "Updated D1",
|
|
204
|
+
}),
|
|
205
|
+
]);
|
|
206
|
+
await waitForMutatesA;
|
|
207
|
+
await waitForMutatesB;
|
|
208
|
+
const documents = [
|
|
209
|
+
{ id: docA.header.id, name: "docA" },
|
|
210
|
+
{ id: docB.header.id, name: "docB" },
|
|
211
|
+
{ id: docC.header.id, name: "docC" },
|
|
212
|
+
{ id: docD.header.id, name: "docD" },
|
|
213
|
+
];
|
|
214
|
+
for (const doc of documents) {
|
|
215
|
+
const resultA = await reactorA.getOperations(doc.id, {
|
|
216
|
+
branch: "main",
|
|
217
|
+
});
|
|
218
|
+
const opsA = Object.values(resultA).flatMap((scope) => scope.results);
|
|
219
|
+
const resultB = await reactorB.getOperations(doc.id, {
|
|
220
|
+
branch: "main",
|
|
221
|
+
});
|
|
222
|
+
const opsB = Object.values(resultB).flatMap((scope) => scope.results);
|
|
223
|
+
expect(opsA.length).toBeGreaterThan(0);
|
|
224
|
+
expect(opsB.length).toBe(opsA.length);
|
|
225
|
+
for (let i = 0; i < opsA.length; i++) {
|
|
226
|
+
expect(opsB[i]).toEqual(opsA[i]);
|
|
227
|
+
}
|
|
228
|
+
const docFromA = await reactorA.get(doc.id, { branch: "main" });
|
|
229
|
+
const docFromB = await reactorB.get(doc.id, { branch: "main" });
|
|
230
|
+
expect(docFromA.document).toEqual(docFromB.document);
|
|
231
|
+
}
|
|
232
|
+
}, 30000);
|
|
233
|
+
it("should handle concurrent modifications to the same document from both reactors", async () => {
|
|
234
|
+
const doc = driveDocumentModelModule.utils.createDocument();
|
|
235
|
+
const readyPromise = waitForOperationsReady(eventBusB, doc.header.id);
|
|
236
|
+
const createJob = await reactorA.create(doc);
|
|
237
|
+
await waitForJobCompletion(reactorA, createJob.id);
|
|
238
|
+
await readyPromise;
|
|
239
|
+
const docOnB = await reactorB.get(doc.header.id, { branch: "main" });
|
|
240
|
+
expect(docOnB.document).toBeDefined();
|
|
241
|
+
void reactorA.execute(doc.header.id, "main", [
|
|
242
|
+
driveDocumentModelModule.actions.setDriveName({ name: "Name from A" }),
|
|
243
|
+
]);
|
|
244
|
+
void reactorB.execute(doc.header.id, "main", [
|
|
245
|
+
driveDocumentModelModule.actions.setDriveName({ name: "Name from B" }),
|
|
246
|
+
]);
|
|
247
|
+
void reactorA.execute(doc.header.id, "main", [
|
|
248
|
+
driveDocumentModelModule.actions.addFolder({
|
|
249
|
+
id: "folder-a",
|
|
250
|
+
name: "Folder from A",
|
|
251
|
+
parentFolder: null,
|
|
252
|
+
}),
|
|
253
|
+
]);
|
|
254
|
+
void reactorB.execute(doc.header.id, "main", [
|
|
255
|
+
driveDocumentModelModule.actions.addFolder({
|
|
256
|
+
id: "folder-b",
|
|
257
|
+
name: "Folder from B",
|
|
258
|
+
parentFolder: null,
|
|
259
|
+
}),
|
|
260
|
+
]);
|
|
261
|
+
const startTime = Date.now();
|
|
262
|
+
const timeout = 15000;
|
|
263
|
+
let synced = false;
|
|
264
|
+
while (Date.now() - startTime < timeout) {
|
|
265
|
+
const resultA = await reactorA.getOperations(doc.header.id, {
|
|
266
|
+
branch: "main",
|
|
267
|
+
});
|
|
268
|
+
const opsA = Object.values(resultA).flatMap((scope) => scope.results);
|
|
269
|
+
const resultB = await reactorB.getOperations(doc.header.id, {
|
|
270
|
+
branch: "main",
|
|
271
|
+
});
|
|
272
|
+
const opsB = Object.values(resultB).flatMap((scope) => scope.results);
|
|
273
|
+
if (opsA.length > 1 && opsB.length > 1 && opsA.length === opsB.length) {
|
|
274
|
+
synced = true;
|
|
275
|
+
break;
|
|
276
|
+
}
|
|
277
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
278
|
+
}
|
|
279
|
+
expect(synced).toBe(true);
|
|
280
|
+
const resultA = await reactorA.getOperations(doc.header.id, {
|
|
281
|
+
branch: "main",
|
|
282
|
+
});
|
|
283
|
+
const opsA = Object.values(resultA).flatMap((scope) => scope.results);
|
|
284
|
+
const resultB = await reactorB.getOperations(doc.header.id, {
|
|
285
|
+
branch: "main",
|
|
286
|
+
});
|
|
287
|
+
const opsB = Object.values(resultB).flatMap((scope) => scope.results);
|
|
288
|
+
expect(opsA.length).toBeGreaterThan(0);
|
|
289
|
+
expect(opsB.length).toBe(opsA.length);
|
|
290
|
+
for (let i = 0; i < opsA.length; i++) {
|
|
291
|
+
expect(opsB[i]).toEqual(opsA[i]);
|
|
292
|
+
}
|
|
293
|
+
const docFromA = await reactorA.get(doc.header.id, { branch: "main" });
|
|
294
|
+
const docFromB = await reactorB.get(doc.header.id, { branch: "main" });
|
|
295
|
+
expect(docFromA.document).toEqual(docFromB.document);
|
|
296
|
+
}, 20000);
|
|
297
|
+
});
|
|
298
|
+
//# sourceMappingURL=two-reactor-gql-sync.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ISyncManager } from "@powerhousedao/reactor";
|
|
2
|
+
type SyncManagerRegistry = Map<string, ISyncManager>;
|
|
3
|
+
/**
|
|
4
|
+
* Creates a mock fetch function that routes GraphQL sync operations
|
|
5
|
+
* directly to the resolver functions, bypassing the network.
|
|
6
|
+
*
|
|
7
|
+
* This enables integration testing of GqlChannel without running
|
|
8
|
+
* an actual GraphQL server.
|
|
9
|
+
*/
|
|
10
|
+
export declare function createResolverBridge(syncManagers: SyncManagerRegistry): typeof fetch;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=gql-resolver-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gql-resolver-bridge.d.ts","sourceRoot":"","sources":["../../../test/utils/gql-resolver-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAO3D,KAAK,mBAAmB,GAAG,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AA8BrD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,mBAAmB,GAChC,OAAO,KAAK,CAgFd"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { touchChannel, pollSyncEnvelopes, pushSyncEnvelope, } from "../../src/graphql/reactor/resolvers.js";
|
|
2
|
+
function createMockResponse(data) {
|
|
3
|
+
const body = JSON.stringify({ data });
|
|
4
|
+
return new Response(body, {
|
|
5
|
+
status: 200,
|
|
6
|
+
headers: { "Content-Type": "application/json" },
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
function extractSyncManagerFromUrl(url, registry) {
|
|
10
|
+
const urlObj = new URL(url);
|
|
11
|
+
const reactorName = urlObj.hostname.toLowerCase();
|
|
12
|
+
const syncManager = registry.get(reactorName);
|
|
13
|
+
if (!syncManager) {
|
|
14
|
+
throw new Error(`SyncManager not found for reactor: ${reactorName}`);
|
|
15
|
+
}
|
|
16
|
+
return syncManager;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Creates a mock fetch function that routes GraphQL sync operations
|
|
20
|
+
* directly to the resolver functions, bypassing the network.
|
|
21
|
+
*
|
|
22
|
+
* This enables integration testing of GqlChannel without running
|
|
23
|
+
* an actual GraphQL server.
|
|
24
|
+
*/
|
|
25
|
+
export function createResolverBridge(syncManagers) {
|
|
26
|
+
return async (input, init) => {
|
|
27
|
+
let url;
|
|
28
|
+
if (typeof input === "string") {
|
|
29
|
+
url = input;
|
|
30
|
+
}
|
|
31
|
+
else if (input instanceof URL) {
|
|
32
|
+
url = input.href;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
url = input.url;
|
|
36
|
+
}
|
|
37
|
+
if (!init?.body) {
|
|
38
|
+
throw new Error("GraphQL request must have a body");
|
|
39
|
+
}
|
|
40
|
+
const body = JSON.parse(init.body);
|
|
41
|
+
const syncManager = extractSyncManagerFromUrl(url, syncManagers);
|
|
42
|
+
if (body.query.includes("pollSyncEnvelopes")) {
|
|
43
|
+
const variables = body.variables;
|
|
44
|
+
const result = await pollSyncEnvelopes(syncManager, variables);
|
|
45
|
+
return createMockResponse({ pollSyncEnvelopes: result });
|
|
46
|
+
}
|
|
47
|
+
if (body.query.includes("pushSyncEnvelope")) {
|
|
48
|
+
const variables = body.variables;
|
|
49
|
+
const result = await pushSyncEnvelope(syncManager, variables);
|
|
50
|
+
return createMockResponse({ pushSyncEnvelope: result });
|
|
51
|
+
}
|
|
52
|
+
if (body.query.includes("touchChannel")) {
|
|
53
|
+
const variables = body.variables;
|
|
54
|
+
const result = await touchChannel(syncManager, variables);
|
|
55
|
+
return createMockResponse({ touchChannel: result });
|
|
56
|
+
}
|
|
57
|
+
throw new Error(`Unknown GraphQL operation in query: ${body.query}`);
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=gql-resolver-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gql-resolver-bridge.js","sourceRoot":"","sources":["../../../test/utils/gql-resolver-bridge.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,wCAAwC,CAAC;AAShD,SAAS,kBAAkB,CAAI,IAAO;IACpC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;QACxB,MAAM,EAAE,GAAG;QACX,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;KAChD,CAAC,CAAC;AACL,CAAC;AAED,SAAS,yBAAyB,CAChC,GAAW,EACX,QAA6B;IAE7B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;IAElD,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC9C,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,sCAAsC,WAAW,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAClC,YAAiC;IAEjC,OAAO,KAAK,EACV,KAAwB,EACxB,IAAkB,EACC,EAAE;QACrB,IAAI,GAAW,CAAC;QAChB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,GAAG,GAAG,KAAK,CAAC;QACd,CAAC;aAAM,IAAI,KAAK,YAAY,GAAG,EAAE,CAAC;YAChC,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;QAClB,CAAC;QAED,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAc,CAAmB,CAAC;QAC/D,MAAM,WAAW,GAAG,yBAAyB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAEjE,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,SAGtB,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YAE/D,OAAO,kBAAkB,CAAC,EAAE,iBAAiB,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,SAmBtB,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YAE9D,OAAO,kBAAkB,CAAC,EAAE,gBAAgB,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YACxC,MAAM,SAAS,GAAG,IAAI,CAAC,SAWtB,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YAE1D,OAAO,kBAAkB,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,uCAAuC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACvE,CAAC,CAAC;AACJ,CAAC"}
|