@powerhousedao/reactor-api 6.0.0-dev.5 → 6.0.0-dev.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/dist/codegen.js +1 -1
  2. package/dist/codegen.js.map +1 -1
  3. package/dist/src/config.d.ts +1 -2
  4. package/dist/src/config.d.ts.map +1 -1
  5. package/dist/src/config.js +1 -5
  6. package/dist/src/config.js.map +1 -1
  7. package/dist/src/graphql/auth/subgraph.js +1 -1
  8. package/dist/src/graphql/auth/subgraph.js.map +1 -1
  9. package/dist/src/graphql/base-subgraph.d.ts +2 -2
  10. package/dist/src/graphql/base-subgraph.d.ts.map +1 -1
  11. package/dist/src/graphql/base-subgraph.js.map +1 -1
  12. package/dist/src/graphql/document-model-subgraph.d.ts +95 -43
  13. package/dist/src/graphql/document-model-subgraph.d.ts.map +1 -1
  14. package/dist/src/graphql/document-model-subgraph.js +570 -79
  15. package/dist/src/graphql/document-model-subgraph.js.map +1 -1
  16. package/dist/src/graphql/drive-subgraph.d.ts.map +1 -1
  17. package/dist/src/graphql/drive-subgraph.js +1 -0
  18. package/dist/src/graphql/drive-subgraph.js.map +1 -1
  19. package/dist/src/graphql/graphql-manager.d.ts +7 -2
  20. package/dist/src/graphql/graphql-manager.d.ts.map +1 -1
  21. package/dist/src/graphql/graphql-manager.js +130 -42
  22. package/dist/src/graphql/graphql-manager.js.map +1 -1
  23. package/dist/src/graphql/index.d.ts +1 -0
  24. package/dist/src/graphql/index.d.ts.map +1 -1
  25. package/dist/src/graphql/index.js +1 -0
  26. package/dist/src/graphql/index.js.map +1 -1
  27. package/dist/src/graphql/reactor/adapters.d.ts +10 -2
  28. package/dist/src/graphql/reactor/adapters.d.ts.map +1 -1
  29. package/dist/src/graphql/reactor/adapters.js +35 -1
  30. package/dist/src/graphql/reactor/adapters.js.map +1 -1
  31. package/dist/src/graphql/reactor/factory.d.ts +12 -1
  32. package/dist/src/graphql/reactor/factory.d.ts.map +1 -1
  33. package/dist/src/graphql/reactor/factory.js +1 -1
  34. package/dist/src/graphql/reactor/factory.js.map +1 -1
  35. package/dist/src/graphql/reactor/gen/graphql.d.ts +187 -27
  36. package/dist/src/graphql/reactor/gen/graphql.d.ts.map +1 -1
  37. package/dist/src/graphql/reactor/gen/graphql.js +124 -9
  38. package/dist/src/graphql/reactor/gen/graphql.js.map +1 -1
  39. package/dist/src/graphql/reactor/index.d.ts +1 -1
  40. package/dist/src/graphql/reactor/index.d.ts.map +1 -1
  41. package/dist/src/graphql/reactor/index.js +1 -1
  42. package/dist/src/graphql/reactor/index.js.map +1 -1
  43. package/dist/src/graphql/reactor/operations.graphql +80 -0
  44. package/dist/src/graphql/reactor/requester.with-zod.d.ts.map +1 -1
  45. package/dist/src/graphql/reactor/requester.with-zod.js +104 -38
  46. package/dist/src/graphql/reactor/requester.with-zod.js.map +1 -1
  47. package/dist/src/graphql/reactor/resolvers.d.ts +48 -24
  48. package/dist/src/graphql/reactor/resolvers.d.ts.map +1 -1
  49. package/dist/src/graphql/reactor/resolvers.js +134 -70
  50. package/dist/src/graphql/reactor/resolvers.js.map +1 -1
  51. package/dist/src/graphql/reactor/schema.graphql +59 -29
  52. package/dist/src/graphql/reactor/subgraph.d.ts.map +1 -1
  53. package/dist/src/graphql/reactor/subgraph.js +97 -111
  54. package/dist/src/graphql/reactor/subgraph.js.map +1 -1
  55. package/dist/src/graphql/reactor/validation.d.ts +24 -0
  56. package/dist/src/graphql/reactor/validation.d.ts.map +1 -1
  57. package/dist/src/graphql/reactor/validation.js +15 -0
  58. package/dist/src/graphql/reactor/validation.js.map +1 -1
  59. package/dist/src/graphql/system/index.d.ts +0 -1
  60. package/dist/src/graphql/system/index.d.ts.map +1 -1
  61. package/dist/src/graphql/system/index.js +0 -1
  62. package/dist/src/graphql/system/index.js.map +1 -1
  63. package/dist/src/graphql/types.d.ts +3 -3
  64. package/dist/src/graphql/types.d.ts.map +1 -1
  65. package/dist/src/graphql/utils.d.ts.map +1 -1
  66. package/dist/src/graphql/utils.js +7 -3
  67. package/dist/src/graphql/utils.js.map +1 -1
  68. package/dist/src/packages/import-loader.d.ts +5 -3
  69. package/dist/src/packages/import-loader.d.ts.map +1 -1
  70. package/dist/src/packages/import-loader.js +19 -10
  71. package/dist/src/packages/import-loader.js.map +1 -1
  72. package/dist/src/packages/package-manager.d.ts +2 -2
  73. package/dist/src/packages/package-manager.d.ts.map +1 -1
  74. package/dist/src/packages/package-manager.js.map +1 -1
  75. package/dist/src/packages/types.d.ts +8 -4
  76. package/dist/src/packages/types.d.ts.map +1 -1
  77. package/dist/src/packages/util.d.ts +3 -2
  78. package/dist/src/packages/util.d.ts.map +1 -1
  79. package/dist/src/packages/util.js +1 -1
  80. package/dist/src/packages/util.js.map +1 -1
  81. package/dist/src/packages/vite-loader.d.ts +7 -6
  82. package/dist/src/packages/vite-loader.d.ts.map +1 -1
  83. package/dist/src/packages/vite-loader.js +21 -8
  84. package/dist/src/packages/vite-loader.js.map +1 -1
  85. package/dist/src/server.d.ts +16 -7
  86. package/dist/src/server.d.ts.map +1 -1
  87. package/dist/src/server.js +117 -59
  88. package/dist/src/server.js.map +1 -1
  89. package/dist/src/services/auth.service.d.ts.map +1 -1
  90. package/dist/src/services/auth.service.js +11 -20
  91. package/dist/src/services/auth.service.js.map +1 -1
  92. package/dist/src/tracing.js +1 -1
  93. package/dist/src/tracing.js.map +1 -1
  94. package/dist/src/types.d.ts +5 -5
  95. package/dist/src/types.d.ts.map +1 -1
  96. package/dist/src/utils/create-schema.d.ts +21 -1
  97. package/dist/src/utils/create-schema.d.ts.map +1 -1
  98. package/dist/src/utils/create-schema.js +290 -16
  99. package/dist/src/utils/create-schema.js.map +1 -1
  100. package/dist/src/utils/drive-url.d.ts +2 -0
  101. package/dist/src/utils/drive-url.d.ts.map +1 -0
  102. package/dist/src/utils/drive-url.js +3 -0
  103. package/dist/src/utils/drive-url.js.map +1 -0
  104. package/dist/src/utils/index.d.ts +1 -0
  105. package/dist/src/utils/index.d.ts.map +1 -1
  106. package/dist/src/utils/index.js +1 -0
  107. package/dist/src/utils/index.js.map +1 -1
  108. package/dist/test/connect-switchboard-sync.test.d.ts +2 -0
  109. package/dist/test/connect-switchboard-sync.test.d.ts.map +1 -0
  110. package/dist/test/connect-switchboard-sync.test.js +578 -0
  111. package/dist/test/connect-switchboard-sync.test.js.map +1 -0
  112. package/dist/test/document-drive-subgraph.test.d.ts +2 -0
  113. package/dist/test/document-drive-subgraph.test.d.ts.map +1 -0
  114. package/dist/test/document-drive-subgraph.test.js +186 -0
  115. package/dist/test/document-drive-subgraph.test.js.map +1 -0
  116. package/dist/test/document-model-subgraph-legacy-permissions.test.d.ts +2 -0
  117. package/dist/test/document-model-subgraph-legacy-permissions.test.d.ts.map +1 -0
  118. package/dist/test/document-model-subgraph-legacy-permissions.test.js +518 -0
  119. package/dist/test/document-model-subgraph-legacy-permissions.test.js.map +1 -0
  120. package/dist/test/document-model-subgraph-permissions.test.d.ts +2 -0
  121. package/dist/test/document-model-subgraph-permissions.test.d.ts.map +1 -0
  122. package/dist/test/document-model-subgraph-permissions.test.js +635 -0
  123. package/dist/test/document-model-subgraph-permissions.test.js.map +1 -0
  124. package/dist/test/document-model-subgraph.test.d.ts +2 -0
  125. package/dist/test/document-model-subgraph.test.d.ts.map +1 -0
  126. package/dist/test/document-model-subgraph.test.js +441 -0
  127. package/dist/test/document-model-subgraph.test.js.map +1 -0
  128. package/dist/test/drive-info-endpoint.test.d.ts +2 -0
  129. package/dist/test/drive-info-endpoint.test.d.ts.map +1 -0
  130. package/dist/test/drive-info-endpoint.test.js +123 -0
  131. package/dist/test/drive-info-endpoint.test.js.map +1 -0
  132. package/dist/test/permissions-integration.test.js +4 -4
  133. package/dist/test/permissions-integration.test.js.map +1 -1
  134. package/dist/test/push-backfill.test.d.ts +2 -0
  135. package/dist/test/push-backfill.test.d.ts.map +1 -0
  136. package/dist/test/push-backfill.test.js +295 -0
  137. package/dist/test/push-backfill.test.js.map +1 -0
  138. package/dist/test/reactor-client.test.js +4 -4
  139. package/dist/test/reactor-client.test.js.map +1 -1
  140. package/dist/test/reactor-resolvers.test.js +4 -8
  141. package/dist/test/reactor-resolvers.test.js.map +1 -1
  142. package/dist/test/reactor-subgraph-permissions.test.js +4 -7
  143. package/dist/test/reactor-subgraph-permissions.test.js.map +1 -1
  144. package/dist/test/subscriptions.test.js +2 -0
  145. package/dist/test/subscriptions.test.js.map +1 -1
  146. package/dist/test/utils/gql-resolver-bridge.d.ts.map +1 -1
  147. package/dist/test/utils/gql-resolver-bridge.js +28 -6
  148. package/dist/test/utils/gql-resolver-bridge.js.map +1 -1
  149. package/dist/tsconfig.tsbuildinfo +1 -1
  150. package/package.json +45 -35
  151. package/dist/src/graphql/system/system-subgraph.d.ts +0 -49
  152. package/dist/src/graphql/system/system-subgraph.d.ts.map +0 -1
  153. package/dist/src/graphql/system/system-subgraph.js +0 -130
  154. package/dist/src/graphql/system/system-subgraph.js.map +0 -1
  155. package/dist/test/system.test.d.ts +0 -2
  156. package/dist/test/system.test.d.ts.map +0 -1
  157. package/dist/test/system.test.js +0 -211
  158. package/dist/test/system.test.js.map +0 -1
  159. package/dist/test/three-reactor-gql-sync.test.d.ts +0 -2
  160. package/dist/test/three-reactor-gql-sync.test.d.ts.map +0 -1
  161. package/dist/test/three-reactor-gql-sync.test.js +0 -368
  162. package/dist/test/three-reactor-gql-sync.test.js.map +0 -1
  163. package/dist/test/two-reactor-gql-sync.test.d.ts +0 -2
  164. package/dist/test/two-reactor-gql-sync.test.d.ts.map +0 -1
  165. package/dist/test/two-reactor-gql-sync.test.js +0 -348
  166. package/dist/test/two-reactor-gql-sync.test.js.map +0 -1
@@ -0,0 +1,578 @@
1
+ import { ConsoleLogger, driveCollectionId, EventBus, GqlRequestChannelFactory, GqlResponseChannelFactory, InMemoryQueue, JobStatus, ReactorBuilder, ReactorEventTypes, SyncBuilder, } from "@powerhousedao/reactor";
2
+ import { driveDocumentModelModule } from "document-drive";
3
+ import { afterEach, describe, expect, it } from "vitest";
4
+ import { createResolverBridge } from "./utils/gql-resolver-bridge.js";
5
+ async function setupConnectSwitchboard() {
6
+ const syncManagerRegistry = new Map();
7
+ const resolverBridge = createResolverBridge(syncManagerRegistry);
8
+ const logger = new ConsoleLogger(["test"]);
9
+ const connectEventBus = new EventBus();
10
+ const switchboardEventBus = new EventBus();
11
+ const connectQueue = new InMemoryQueue(connectEventBus);
12
+ const switchboardQueue = new InMemoryQueue(switchboardEventBus);
13
+ // Both reactors need to handle "gql" (for active polling) and "polling"
14
+ // (for touchChannel-created response channels) in bidirectional sync tests.
15
+ function createCompositeFactory(queue) {
16
+ const request = new GqlRequestChannelFactory(logger, undefined, queue);
17
+ const response = new GqlResponseChannelFactory(logger);
18
+ return {
19
+ instance(...args) {
20
+ const [remoteId, remoteName, config, cursorStorage] = args;
21
+ if (config.type === "polling") {
22
+ return response.instance(remoteId, remoteName, config, cursorStorage);
23
+ }
24
+ return request.instance(...args);
25
+ },
26
+ };
27
+ }
28
+ const connectModule = await new ReactorBuilder()
29
+ .withEventBus(connectEventBus)
30
+ .withQueue(connectQueue)
31
+ .withDocumentModels([
32
+ driveDocumentModelModule,
33
+ ])
34
+ .withSync(new SyncBuilder().withChannelFactory(createCompositeFactory(connectQueue)))
35
+ .buildModule();
36
+ const switchboardModule = await new ReactorBuilder()
37
+ .withEventBus(switchboardEventBus)
38
+ .withQueue(switchboardQueue)
39
+ .withDocumentModels([
40
+ driveDocumentModelModule,
41
+ ])
42
+ .withSync(new SyncBuilder().withChannelFactory(createCompositeFactory(switchboardQueue)))
43
+ .buildModule();
44
+ const switchboardSyncManager = switchboardModule.syncModule.syncManager;
45
+ syncManagerRegistry.set("switchboard", switchboardSyncManager);
46
+ const connectSyncManager = connectModule.syncModule.syncManager;
47
+ syncManagerRegistry.set("connect", connectSyncManager);
48
+ return {
49
+ connectReactor: connectModule.reactor,
50
+ switchboardReactor: switchboardModule.reactor,
51
+ connectModule,
52
+ switchboardModule,
53
+ connectEventBus,
54
+ switchboardEventBus,
55
+ connectSyncManager,
56
+ switchboardSyncManager,
57
+ resolverBridge,
58
+ };
59
+ }
60
+ async function setupSyncForDrive(connectSyncManager, driveId, resolverBridge) {
61
+ const collectionId = driveCollectionId("main", driveId);
62
+ await connectSyncManager.add(`switchboard-${driveId}`, collectionId, {
63
+ type: "gql",
64
+ parameters: {
65
+ url: "http://switchboard/graphql",
66
+ pollIntervalMs: 100,
67
+ retryBaseDelayMs: 50,
68
+ fetchFn: resolverBridge,
69
+ },
70
+ }, {
71
+ documentId: [],
72
+ scope: [],
73
+ branch: "main",
74
+ });
75
+ }
76
+ async function waitForJobCompletion(reactor, jobId, timeoutMs = 10000) {
77
+ const start = Date.now();
78
+ while (Date.now() - start < timeoutMs) {
79
+ const status = await reactor.getJobStatus(jobId);
80
+ if (status.status === JobStatus.READ_READY ||
81
+ status.status === JobStatus.FAILED) {
82
+ if (status.status === JobStatus.FAILED) {
83
+ throw new Error(`Job ${jobId} failed: ${status.error?.message ?? "unknown"}`);
84
+ }
85
+ return;
86
+ }
87
+ await new Promise((resolve) => setTimeout(resolve, 50));
88
+ }
89
+ throw new Error(`Timed out waiting for job ${jobId}`);
90
+ }
91
+ function waitForOperationsReady(eventBus, documentId, timeoutMs = 15000) {
92
+ return new Promise((resolve, reject) => {
93
+ let unsubscribe;
94
+ const timer = setTimeout(() => {
95
+ unsubscribe?.();
96
+ reject(new Error(`Timed out waiting for operations on document ${documentId}`));
97
+ }, timeoutMs);
98
+ unsubscribe = eventBus.subscribe(ReactorEventTypes.JOB_READ_READY, (_type, event) => {
99
+ const matchesDocument = event.operations.some((op) => op.context.documentId === documentId);
100
+ if (matchesDocument) {
101
+ clearTimeout(timer);
102
+ unsubscribe?.();
103
+ resolve();
104
+ }
105
+ });
106
+ });
107
+ }
108
+ async function setupSyncForDriveOnSwitchboard(switchboardSyncManager, driveId, resolverBridge) {
109
+ const collectionId = driveCollectionId("main", driveId);
110
+ await switchboardSyncManager.add(`connect-${driveId}`, collectionId, {
111
+ type: "gql",
112
+ parameters: {
113
+ url: "http://connect/graphql",
114
+ pollIntervalMs: 100,
115
+ retryBaseDelayMs: 50,
116
+ fetchFn: resolverBridge,
117
+ },
118
+ }, { documentId: [], scope: [], branch: "main" });
119
+ }
120
+ function waitForSyncStabilization(eventBuses, quietPeriodMs = 500, timeoutMs = 15000) {
121
+ return new Promise((resolve, reject) => {
122
+ let lastActivityTime = Date.now();
123
+ const unsubscribes = [];
124
+ const timer = setTimeout(() => {
125
+ cleanup();
126
+ reject(new Error("Timed out waiting for sync stabilization"));
127
+ }, timeoutMs);
128
+ const checkQuiet = setInterval(() => {
129
+ if (Date.now() - lastActivityTime >= quietPeriodMs) {
130
+ cleanup();
131
+ resolve();
132
+ }
133
+ }, 50);
134
+ function cleanup() {
135
+ clearTimeout(timer);
136
+ clearInterval(checkQuiet);
137
+ for (const unsub of unsubscribes)
138
+ unsub();
139
+ }
140
+ for (const bus of eventBuses) {
141
+ const unsub = bus.subscribe(ReactorEventTypes.JOB_READ_READY, () => {
142
+ lastActivityTime = Date.now();
143
+ });
144
+ unsubscribes.push(unsub);
145
+ }
146
+ });
147
+ }
148
+ describe("Connect-Switchboard Sync", () => {
149
+ let connectReactor;
150
+ let switchboardReactor;
151
+ let connectModule;
152
+ let switchboardModule;
153
+ let connectEventBus;
154
+ let switchboardEventBus;
155
+ let connectSyncManager;
156
+ let switchboardSyncManager;
157
+ let resolverBridge;
158
+ afterEach(() => {
159
+ connectReactor.kill();
160
+ switchboardReactor.kill();
161
+ });
162
+ it("should sync operation from Connect to Switchboard", async () => {
163
+ const setup = await setupConnectSwitchboard();
164
+ connectReactor = setup.connectReactor;
165
+ switchboardReactor = setup.switchboardReactor;
166
+ connectModule = setup.connectModule;
167
+ switchboardModule = setup.switchboardModule;
168
+ connectEventBus = setup.connectEventBus;
169
+ switchboardEventBus = setup.switchboardEventBus;
170
+ connectSyncManager = setup.connectSyncManager;
171
+ switchboardSyncManager = setup.switchboardSyncManager;
172
+ resolverBridge = setup.resolverBridge;
173
+ const document = driveDocumentModelModule.utils.createDocument({
174
+ global: {
175
+ name: "Test Drive???",
176
+ icon: null,
177
+ nodes: [],
178
+ },
179
+ });
180
+ const documentId = document.header.id;
181
+ await setupSyncForDrive(connectSyncManager, documentId, resolverBridge);
182
+ const readyOnSwitchboard = waitForOperationsReady(switchboardEventBus, documentId);
183
+ const jobInfo = await connectReactor.create(document);
184
+ await waitForJobCompletion(connectReactor, jobInfo.id);
185
+ await readyOnSwitchboard;
186
+ const connectOps = await connectReactor.getOperations(documentId, {
187
+ branch: "main",
188
+ });
189
+ const switchboardOps = await switchboardReactor.getOperations(documentId, {
190
+ branch: "main",
191
+ });
192
+ const connectOpsList = Object.values(connectOps).flatMap((scope) => scope.results);
193
+ const switchboardOpsList = Object.values(switchboardOps).flatMap((scope) => scope.results);
194
+ expect(connectOpsList.length).toBeGreaterThan(0);
195
+ expect(switchboardOpsList.length).toBe(connectOpsList.length);
196
+ for (let i = 0; i < connectOpsList.length; i++) {
197
+ expect(switchboardOpsList[i]).toEqual(connectOpsList[i]);
198
+ }
199
+ const connectDoc = await connectReactor.get(documentId, {
200
+ branch: "main",
201
+ });
202
+ const switchboardDoc = await switchboardReactor.get(documentId, {
203
+ branch: "main",
204
+ });
205
+ expect(connectDoc.state).toEqual(switchboardDoc.state);
206
+ }, 30000);
207
+ it("should sync operation from Switchboard to Connect", async () => {
208
+ const setup = await setupConnectSwitchboard();
209
+ connectReactor = setup.connectReactor;
210
+ switchboardReactor = setup.switchboardReactor;
211
+ connectModule = setup.connectModule;
212
+ switchboardModule = setup.switchboardModule;
213
+ connectEventBus = setup.connectEventBus;
214
+ switchboardEventBus = setup.switchboardEventBus;
215
+ connectSyncManager = setup.connectSyncManager;
216
+ switchboardSyncManager = setup.switchboardSyncManager;
217
+ resolverBridge = setup.resolverBridge;
218
+ const document = driveDocumentModelModule.utils.createDocument({
219
+ global: {
220
+ name: "Test Drive???",
221
+ icon: null,
222
+ nodes: [],
223
+ },
224
+ });
225
+ const documentId = document.header.id;
226
+ // Need a document on Connect first to set up the sync channel
227
+ await setupSyncForDrive(connectSyncManager, documentId, resolverBridge);
228
+ // Create document on Switchboard
229
+ const readyOnConnect = waitForOperationsReady(connectEventBus, documentId);
230
+ const jobInfo = await switchboardReactor.create(document);
231
+ await waitForJobCompletion(switchboardReactor, jobInfo.id);
232
+ // Connect polls Switchboard's outbox
233
+ await readyOnConnect;
234
+ const connectOps = await connectReactor.getOperations(documentId, {
235
+ branch: "main",
236
+ });
237
+ const switchboardOps = await switchboardReactor.getOperations(documentId, {
238
+ branch: "main",
239
+ });
240
+ const connectOpsList = Object.values(connectOps).flatMap((scope) => scope.results);
241
+ const switchboardOpsList = Object.values(switchboardOps).flatMap((scope) => scope.results);
242
+ expect(switchboardOpsList.length).toBeGreaterThan(0);
243
+ expect(connectOpsList.length).toBe(switchboardOpsList.length);
244
+ for (let i = 0; i < switchboardOpsList.length; i++) {
245
+ expect(connectOpsList[i]).toEqual(switchboardOpsList[i]);
246
+ }
247
+ const connectDoc = await connectReactor.get(documentId, {
248
+ branch: "main",
249
+ });
250
+ const switchboardDoc = await switchboardReactor.get(documentId, {
251
+ branch: "main",
252
+ });
253
+ expect(connectDoc.state).toEqual(switchboardDoc.state);
254
+ }, 30000);
255
+ it("should sync mutations from Connect to Switchboard", async () => {
256
+ const setup = await setupConnectSwitchboard();
257
+ connectReactor = setup.connectReactor;
258
+ switchboardReactor = setup.switchboardReactor;
259
+ connectModule = setup.connectModule;
260
+ switchboardModule = setup.switchboardModule;
261
+ connectEventBus = setup.connectEventBus;
262
+ switchboardEventBus = setup.switchboardEventBus;
263
+ connectSyncManager = setup.connectSyncManager;
264
+ switchboardSyncManager = setup.switchboardSyncManager;
265
+ resolverBridge = setup.resolverBridge;
266
+ const document = driveDocumentModelModule.utils.createDocument();
267
+ const documentId = document.header.id;
268
+ await setupSyncForDrive(connectSyncManager, documentId, resolverBridge);
269
+ // Step 1: Create document on Connect, sync to Switchboard
270
+ const createReady = waitForOperationsReady(switchboardEventBus, documentId);
271
+ const createJob = await connectReactor.create(document);
272
+ await waitForJobCompletion(connectReactor, createJob.id);
273
+ await createReady;
274
+ // Step 2: Mutate on Connect
275
+ const mutationReady = waitForOperationsReady(switchboardEventBus, documentId);
276
+ const mutateJob = await connectReactor.execute(documentId, "main", [
277
+ driveDocumentModelModule.actions.setDriveName({ name: "Synced Drive" }),
278
+ ]);
279
+ await waitForJobCompletion(connectReactor, mutateJob.id);
280
+ await mutationReady;
281
+ // Step 3: Verify
282
+ const connectDoc = await connectReactor.get(documentId, {
283
+ branch: "main",
284
+ });
285
+ const switchboardDoc = await switchboardReactor.get(documentId, {
286
+ branch: "main",
287
+ });
288
+ expect(connectDoc.state).toEqual(switchboardDoc.state);
289
+ const state = connectDoc.state;
290
+ expect(state.global.name).toBe("Synced Drive");
291
+ }, 30000);
292
+ describe("sourceRemote echo prevention", () => {
293
+ it("local mutations always have sourceRemote=''", async () => {
294
+ const setup = await setupConnectSwitchboard();
295
+ connectReactor = setup.connectReactor;
296
+ switchboardReactor = setup.switchboardReactor;
297
+ connectModule = setup.connectModule;
298
+ switchboardModule = setup.switchboardModule;
299
+ connectEventBus = setup.connectEventBus;
300
+ switchboardEventBus = setup.switchboardEventBus;
301
+ connectSyncManager = setup.connectSyncManager;
302
+ switchboardSyncManager = setup.switchboardSyncManager;
303
+ resolverBridge = setup.resolverBridge;
304
+ const document = driveDocumentModelModule.utils.createDocument({
305
+ global: { name: "Local Test", icon: null, nodes: [] },
306
+ });
307
+ const documentId = document.header.id;
308
+ const createJob = await connectReactor.create(document);
309
+ await waitForJobCompletion(connectReactor, createJob.id);
310
+ const mutateJob = await connectReactor.execute(documentId, "main", [
311
+ driveDocumentModelModule.actions.setDriveName({
312
+ name: "Local Mutation",
313
+ }),
314
+ ]);
315
+ await waitForJobCompletion(connectReactor, mutateJob.id);
316
+ const indexResult = await connectModule.operationIndex.get(documentId);
317
+ const entries = indexResult.results;
318
+ expect(entries.length).toBeGreaterThan(0);
319
+ for (const entry of entries) {
320
+ expect(entry.sourceRemote).toBe("");
321
+ }
322
+ }, 30000);
323
+ it("trivial append operations are not echoed back to source", async () => {
324
+ const setup = await setupConnectSwitchboard();
325
+ connectReactor = setup.connectReactor;
326
+ switchboardReactor = setup.switchboardReactor;
327
+ connectModule = setup.connectModule;
328
+ switchboardModule = setup.switchboardModule;
329
+ connectEventBus = setup.connectEventBus;
330
+ switchboardEventBus = setup.switchboardEventBus;
331
+ connectSyncManager = setup.connectSyncManager;
332
+ switchboardSyncManager = setup.switchboardSyncManager;
333
+ resolverBridge = setup.resolverBridge;
334
+ const document = driveDocumentModelModule.utils.createDocument({
335
+ global: { name: "Echo Test", icon: null, nodes: [] },
336
+ });
337
+ const documentId = document.header.id;
338
+ await setupSyncForDrive(connectSyncManager, documentId, resolverBridge);
339
+ await setupSyncForDriveOnSwitchboard(switchboardSyncManager, documentId, resolverBridge);
340
+ const createOnSwitchboard = waitForOperationsReady(switchboardEventBus, documentId);
341
+ const createJob = await connectReactor.create(document);
342
+ await waitForJobCompletion(connectReactor, createJob.id);
343
+ await createOnSwitchboard;
344
+ const mutationOnSwitchboard = waitForOperationsReady(switchboardEventBus, documentId);
345
+ const mutateJob = await connectReactor.execute(documentId, "main", [
346
+ driveDocumentModelModule.actions.setDriveName({ name: "No Echo" }),
347
+ ]);
348
+ await waitForJobCompletion(connectReactor, mutateJob.id);
349
+ await mutationOnSwitchboard;
350
+ // Inspect Switchboard's sourceRemote values to understand the mechanism
351
+ const switchboardIndex = await switchboardModule.operationIndex.get(documentId);
352
+ const switchboardEntries = switchboardIndex.results;
353
+ const remoteEntries = switchboardEntries.filter((e) => e.sourceRemote !== "");
354
+ expect(remoteEntries.length).toBeGreaterThan(0);
355
+ // Verify the sourceRemote value on Switchboard.
356
+ // Push-delivered ops get sourceRemote from the touchChannel resolver,
357
+ // which uses the sender's remote name (e.g., "switchboard-{driveId}").
358
+ // The outbox filters by excludeSourceRemote = remote.name
359
+ // (e.g., "connect-{driveId}"). These don't match for push-delivered
360
+ // ops, so echo prevention relies on dedup rather than outbox filtering.
361
+ const sourceRemoteValues = [
362
+ ...new Set(remoteEntries.map((e) => e.sourceRemote)),
363
+ ];
364
+ const connectRemoteName = `connect-${documentId}`;
365
+ const pushSourceRemoteMatchesOutboxFilter = sourceRemoteValues.every((v) => v === connectRemoteName);
366
+ // Verify the outbox filter behavior: query with the actual
367
+ // excludeSourceRemote used by Switchboard's connect-{driveId} remote
368
+ const collectionId = driveCollectionId("main", documentId);
369
+ const filteredIndex = await switchboardModule.operationIndex.find(collectionId, 0, { excludeSourceRemote: connectRemoteName });
370
+ if (!pushSourceRemoteMatchesOutboxFilter) {
371
+ // Known issue: push-delivered ops have a different sourceRemote
372
+ // than the outbox filter expects. The outbox filter does NOT
373
+ // catch these ops; echo prevention relies on dedup instead.
374
+ // The filtered result will include remote ops that should have
375
+ // been filtered out.
376
+ expect(filteredIndex.results.length).toBeGreaterThan(0);
377
+ }
378
+ const connectIndexBefore = await connectModule.operationIndex.get(documentId);
379
+ const connectCountBefore = connectIndexBefore.results.length;
380
+ await waitForSyncStabilization([connectEventBus, switchboardEventBus]);
381
+ const connectIndexAfter = await connectModule.operationIndex.get(documentId);
382
+ const connectCountAfter = connectIndexAfter.results.length;
383
+ expect(connectCountAfter).toBe(connectCountBefore);
384
+ const connectEntries = connectIndexAfter.results;
385
+ for (const entry of connectEntries) {
386
+ expect(entry.sourceRemote).toBe("");
387
+ }
388
+ const connectDoc = await connectReactor.get(documentId, {
389
+ branch: "main",
390
+ });
391
+ const switchboardDoc = await switchboardReactor.get(documentId, {
392
+ branch: "main",
393
+ });
394
+ expect(connectDoc.state).toEqual(switchboardDoc.state);
395
+ }, 30000);
396
+ it("all-duplicate load job completes without wedging the queue", async () => {
397
+ const setup = await setupConnectSwitchboard();
398
+ connectReactor = setup.connectReactor;
399
+ switchboardReactor = setup.switchboardReactor;
400
+ connectModule = setup.connectModule;
401
+ switchboardModule = setup.switchboardModule;
402
+ connectEventBus = setup.connectEventBus;
403
+ switchboardEventBus = setup.switchboardEventBus;
404
+ connectSyncManager = setup.connectSyncManager;
405
+ switchboardSyncManager = setup.switchboardSyncManager;
406
+ resolverBridge = setup.resolverBridge;
407
+ const document = driveDocumentModelModule.utils.createDocument({
408
+ global: { name: "Wedge Test", icon: null, nodes: [] },
409
+ });
410
+ const documentId = document.header.id;
411
+ // Unidirectional sync: Connect -> Switchboard
412
+ await setupSyncForDrive(connectSyncManager, documentId, resolverBridge);
413
+ const createOnSwitchboard = waitForOperationsReady(switchboardEventBus, documentId);
414
+ const createJob = await connectReactor.create(document);
415
+ await waitForJobCompletion(connectReactor, createJob.id);
416
+ await createOnSwitchboard;
417
+ // Mutate on Connect, sync mutation to Switchboard (produces global-scope ops)
418
+ const mutationOnSwitchboard = waitForOperationsReady(switchboardEventBus, documentId);
419
+ const mutateJob = await connectReactor.execute(documentId, "main", [
420
+ driveDocumentModelModule.actions.setDriveName({
421
+ name: "Wedge Mutated",
422
+ }),
423
+ ]);
424
+ await waitForJobCompletion(connectReactor, mutateJob.id);
425
+ await mutationOnSwitchboard;
426
+ // Record Switchboard's index count
427
+ const indexBefore = await switchboardModule.operationIndex.get(documentId);
428
+ const countBefore = indexBefore.results.length;
429
+ expect(countBefore).toBeGreaterThan(0);
430
+ // Get Switchboard's global-scope operations (already stored)
431
+ const switchboardOps = await switchboardReactor.getOperations(documentId, { branch: "main" });
432
+ const globalOps = switchboardOps["global"]?.results ?? [];
433
+ expect(globalOps.length).toBeGreaterThan(0);
434
+ // Load exact duplicates into Switchboard via reactor.load().
435
+ // All ops already exist, so executor dedup filters them all out.
436
+ // Before the P0 fix, the load job would hang forever because
437
+ // JOB_WRITE_READY was not emitted for empty operationsWithContext.
438
+ const loadJob = await switchboardReactor.load(documentId, "main", globalOps);
439
+ await waitForJobCompletion(switchboardReactor, loadJob.id);
440
+ // Verify the job reached READ_READY (not stuck at RUNNING)
441
+ const jobStatus = await switchboardReactor.getJobStatus(loadJob.id);
442
+ expect(jobStatus.status).toBe(JobStatus.READ_READY);
443
+ // Verify no new index entries were created
444
+ const indexAfter = await switchboardModule.operationIndex.get(documentId);
445
+ expect(indexAfter.results.length).toBe(countBefore);
446
+ }, 30000);
447
+ it("executor-level dedup rejects duplicate operations via load", async () => {
448
+ const setup = await setupConnectSwitchboard();
449
+ connectReactor = setup.connectReactor;
450
+ switchboardReactor = setup.switchboardReactor;
451
+ connectModule = setup.connectModule;
452
+ switchboardModule = setup.switchboardModule;
453
+ connectEventBus = setup.connectEventBus;
454
+ switchboardEventBus = setup.switchboardEventBus;
455
+ connectSyncManager = setup.connectSyncManager;
456
+ switchboardSyncManager = setup.switchboardSyncManager;
457
+ resolverBridge = setup.resolverBridge;
458
+ const document = driveDocumentModelModule.utils.createDocument({
459
+ global: { name: "Dedup Test", icon: null, nodes: [] },
460
+ });
461
+ const documentId = document.header.id;
462
+ // Unidirectional sync: Connect -> Switchboard
463
+ await setupSyncForDrive(connectSyncManager, documentId, resolverBridge);
464
+ const createOnSwitchboard = waitForOperationsReady(switchboardEventBus, documentId);
465
+ const createJob = await connectReactor.create(document);
466
+ await waitForJobCompletion(connectReactor, createJob.id);
467
+ await createOnSwitchboard;
468
+ // Mutate on Connect, sync mutation to Switchboard
469
+ const mutationOnSwitchboard = waitForOperationsReady(switchboardEventBus, documentId);
470
+ const mutateJob = await connectReactor.execute(documentId, "main", [
471
+ driveDocumentModelModule.actions.setDriveName({ name: "Dedup" }),
472
+ ]);
473
+ await waitForJobCompletion(connectReactor, mutateJob.id);
474
+ await mutationOnSwitchboard;
475
+ // Verify ops are synced
476
+ const switchboardOps = await switchboardReactor.getOperations(documentId, { branch: "main" });
477
+ const globalOps = switchboardOps["global"]?.results ?? [];
478
+ expect(globalOps.length).toBeGreaterThan(0);
479
+ // Record Switchboard's index count
480
+ const indexBefore = await switchboardModule.operationIndex.get(documentId);
481
+ const countBefore = indexBefore.results.length;
482
+ expect(countBefore).toBeGreaterThan(0);
483
+ // Load exact same operations again via reactor.load().
484
+ // This exercises the executor's existingActionIds.has(op.action.id) dedup,
485
+ // NOT cursor advancement (which only trims the outbox on subsequent polls).
486
+ const loadJob = await switchboardReactor.load(documentId, "main", globalOps);
487
+ await waitForJobCompletion(switchboardReactor, loadJob.id);
488
+ // Verify job completed
489
+ const jobStatus = await switchboardReactor.getJobStatus(loadJob.id);
490
+ expect(jobStatus.status).toBe(JobStatus.READ_READY);
491
+ // Verify index count unchanged (executor dedup rejected all ops)
492
+ const indexAfter = await switchboardModule.operationIndex.get(documentId);
493
+ expect(indexAfter.results.length).toBe(countBefore);
494
+ }, 30000);
495
+ it("reshuffle operations converge and terminate", async () => {
496
+ const setup = await setupConnectSwitchboard();
497
+ connectReactor = setup.connectReactor;
498
+ switchboardReactor = setup.switchboardReactor;
499
+ connectModule = setup.connectModule;
500
+ switchboardModule = setup.switchboardModule;
501
+ connectEventBus = setup.connectEventBus;
502
+ switchboardEventBus = setup.switchboardEventBus;
503
+ connectSyncManager = setup.connectSyncManager;
504
+ switchboardSyncManager = setup.switchboardSyncManager;
505
+ resolverBridge = setup.resolverBridge;
506
+ const document = driveDocumentModelModule.utils.createDocument();
507
+ const documentId = document.header.id;
508
+ // Unidirectional sync first: Connect -> Switchboard
509
+ await setupSyncForDrive(connectSyncManager, documentId, resolverBridge);
510
+ // Create document on Connect, sync to Switchboard
511
+ const createOnSwitchboard = waitForOperationsReady(switchboardEventBus, documentId);
512
+ const createJob = await connectReactor.create(document);
513
+ await waitForJobCompletion(connectReactor, createJob.id);
514
+ await createOnSwitchboard;
515
+ // Remove sync to prevent polling from loading T1 as a trivial append
516
+ // (preserving sourceRemote) before Connect creates T2.
517
+ await connectSyncManager.remove(`switchboard-${documentId}`);
518
+ // Mutate on Switchboard first (earlier timestamp T1)
519
+ const switchboardMutateJob = await switchboardReactor.execute(documentId, "main", [
520
+ driveDocumentModelModule.actions.setDriveName({
521
+ name: "Switchboard Mutation",
522
+ }),
523
+ ]);
524
+ await waitForJobCompletion(switchboardReactor, switchboardMutateJob.id);
525
+ // Wait to ensure Connect's mutation gets a later timestamp T2
526
+ await new Promise((r) => setTimeout(r, 10));
527
+ // Mutate on Connect (later timestamp T2 > T1)
528
+ const connectMutateJob = await connectReactor.execute(documentId, "main", [
529
+ driveDocumentModelModule.actions.setDriveName({
530
+ name: "Connect Mutation",
531
+ }),
532
+ ]);
533
+ await waitForJobCompletion(connectReactor, connectMutateJob.id);
534
+ // Get Switchboard's global-scope operations
535
+ const switchboardOps = await switchboardReactor.getOperations(documentId, { branch: "main" });
536
+ const switchboardGlobalOps = switchboardOps["global"]?.results ?? [];
537
+ // Load Switchboard's ops into Connect via reactor.load().
538
+ // Switchboard's T1 mutation triggers getConflicting() which finds
539
+ // Connect's T2 operation -> skipCount > 0 -> reshuffle deterministically.
540
+ const loadJob = await connectReactor.load(documentId, "main", switchboardGlobalOps);
541
+ await waitForJobCompletion(connectReactor, loadJob.id);
542
+ // After reshuffle, all Connect index entries should have sourceRemote=""
543
+ // (reshuffle sets effectiveSourceRemote="" to broadcast to all remotes)
544
+ const connectIndex = await connectModule.operationIndex.get(documentId);
545
+ const connectEntries = connectIndex.results;
546
+ for (const entry of connectEntries) {
547
+ expect(entry.sourceRemote).toBe("");
548
+ }
549
+ // Verify Connect's state reflects the reshuffle result
550
+ const connectDoc = await connectReactor.get(documentId, {
551
+ branch: "main",
552
+ });
553
+ expect(connectDoc.state).toBeDefined();
554
+ // Re-establish Connect->Switchboard sync for bidirectional convergence test
555
+ await setupSyncForDrive(connectSyncManager, documentId, resolverBridge);
556
+ // Now set up bidirectional sync and verify echo termination
557
+ await setupSyncForDriveOnSwitchboard(switchboardSyncManager, documentId, resolverBridge);
558
+ await waitForSyncStabilization([connectEventBus, switchboardEventBus], 1000, 20000);
559
+ // States should converge
560
+ const connectDocFinal = await connectReactor.get(documentId, {
561
+ branch: "main",
562
+ });
563
+ const switchboardDocFinal = await switchboardReactor.get(documentId, {
564
+ branch: "main",
565
+ });
566
+ expect(connectDocFinal.state).toEqual(switchboardDocFinal.state);
567
+ // Verify operation counts stabilized (echo terminated)
568
+ const connectCountAfterSync = (await connectModule.operationIndex.get(documentId)).results.length;
569
+ const switchboardCountAfterSync = (await switchboardModule.operationIndex.get(documentId)).results.length;
570
+ await new Promise((r) => setTimeout(r, 1000));
571
+ const connectCountFinal = (await connectModule.operationIndex.get(documentId)).results.length;
572
+ const switchboardCountFinal = (await switchboardModule.operationIndex.get(documentId)).results.length;
573
+ expect(connectCountFinal).toBe(connectCountAfterSync);
574
+ expect(switchboardCountFinal).toBe(switchboardCountAfterSync);
575
+ }, 30000);
576
+ });
577
+ });
578
+ //# sourceMappingURL=connect-switchboard-sync.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect-switchboard-sync.test.js","sourceRoot":"","sources":["../../test/connect-switchboard-sync.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=document-drive-subgraph.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-drive-subgraph.test.d.ts","sourceRoot":"","sources":["../../test/document-drive-subgraph.test.ts"],"names":[],"mappings":""}