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