@powerhousedao/reactor-api 6.0.0-dev.9 → 6.0.0-dev.91

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 (271) hide show
  1. package/dist/codegen.js +1 -1
  2. package/dist/codegen.js.map +1 -1
  3. package/dist/index.d.ts +4 -2
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +4 -2
  6. package/dist/index.js.map +1 -1
  7. package/dist/src/config.d.ts +1 -2
  8. package/dist/src/config.d.ts.map +1 -1
  9. package/dist/src/config.js +1 -5
  10. package/dist/src/config.js.map +1 -1
  11. package/dist/src/graphql/auth/resolvers.d.ts +17 -0
  12. package/dist/src/graphql/auth/resolvers.d.ts.map +1 -1
  13. package/dist/src/graphql/auth/resolvers.js +54 -0
  14. package/dist/src/graphql/auth/resolvers.js.map +1 -1
  15. package/dist/src/graphql/auth/schema.graphql +27 -5
  16. package/dist/src/graphql/auth/subgraph.d.ts +25 -0
  17. package/dist/src/graphql/auth/subgraph.d.ts.map +1 -1
  18. package/dist/src/graphql/auth/subgraph.js +45 -1
  19. package/dist/src/graphql/auth/subgraph.js.map +1 -1
  20. package/dist/src/graphql/base-subgraph.d.ts +12 -4
  21. package/dist/src/graphql/base-subgraph.d.ts.map +1 -1
  22. package/dist/src/graphql/base-subgraph.js +94 -2
  23. package/dist/src/graphql/base-subgraph.js.map +1 -1
  24. package/dist/src/graphql/document-model-subgraph.d.ts +16 -44
  25. package/dist/src/graphql/document-model-subgraph.d.ts.map +1 -1
  26. package/dist/src/graphql/document-model-subgraph.js +290 -88
  27. package/dist/src/graphql/document-model-subgraph.js.map +1 -1
  28. package/dist/src/graphql/graphql-manager.d.ts +28 -6
  29. package/dist/src/graphql/graphql-manager.d.ts.map +1 -1
  30. package/dist/src/graphql/graphql-manager.js +266 -161
  31. package/dist/src/graphql/graphql-manager.js.map +1 -1
  32. package/dist/src/graphql/index.d.ts +2 -1
  33. package/dist/src/graphql/index.d.ts.map +1 -1
  34. package/dist/src/graphql/index.js +2 -1
  35. package/dist/src/graphql/index.js.map +1 -1
  36. package/dist/src/graphql/packages/index.d.ts +2 -0
  37. package/dist/src/graphql/packages/index.d.ts.map +1 -0
  38. package/dist/src/graphql/packages/index.js +2 -0
  39. package/dist/src/graphql/packages/index.js.map +1 -0
  40. package/dist/src/graphql/packages/resolvers.d.ts +31 -0
  41. package/dist/src/graphql/packages/resolvers.d.ts.map +1 -0
  42. package/dist/src/graphql/packages/resolvers.js +37 -0
  43. package/dist/src/graphql/packages/resolvers.js.map +1 -0
  44. package/dist/src/graphql/packages/schema.graphql +50 -0
  45. package/dist/src/graphql/packages/subgraph.d.ts +55 -0
  46. package/dist/src/graphql/packages/subgraph.d.ts.map +1 -0
  47. package/dist/src/graphql/packages/subgraph.js +73 -0
  48. package/dist/src/graphql/packages/subgraph.js.map +1 -0
  49. package/dist/src/graphql/reactor/adapters.d.ts +10 -2
  50. package/dist/src/graphql/reactor/adapters.d.ts.map +1 -1
  51. package/dist/src/graphql/reactor/adapters.js +35 -1
  52. package/dist/src/graphql/reactor/adapters.js.map +1 -1
  53. package/dist/src/graphql/reactor/factory.d.ts +22 -1
  54. package/dist/src/graphql/reactor/factory.d.ts.map +1 -1
  55. package/dist/src/graphql/reactor/factory.js +1 -1
  56. package/dist/src/graphql/reactor/factory.js.map +1 -1
  57. package/dist/src/graphql/reactor/gen/graphql.d.ts +353 -76
  58. package/dist/src/graphql/reactor/gen/graphql.d.ts.map +1 -1
  59. package/dist/src/graphql/reactor/gen/graphql.js +245 -10
  60. package/dist/src/graphql/reactor/gen/graphql.js.map +1 -1
  61. package/dist/src/graphql/reactor/index.d.ts +1 -1
  62. package/dist/src/graphql/reactor/index.d.ts.map +1 -1
  63. package/dist/src/graphql/reactor/index.js +1 -1
  64. package/dist/src/graphql/reactor/index.js.map +1 -1
  65. package/dist/src/graphql/reactor/operations.graphql +191 -1
  66. package/dist/src/graphql/reactor/requester.with-zod.d.ts.map +1 -1
  67. package/dist/src/graphql/reactor/requester.with-zod.js +114 -38
  68. package/dist/src/graphql/reactor/requester.with-zod.js.map +1 -1
  69. package/dist/src/graphql/reactor/resolvers.d.ts +89 -26
  70. package/dist/src/graphql/reactor/resolvers.d.ts.map +1 -1
  71. package/dist/src/graphql/reactor/resolvers.js +271 -77
  72. package/dist/src/graphql/reactor/resolvers.js.map +1 -1
  73. package/dist/src/graphql/reactor/schema.graphql +75 -30
  74. package/dist/src/graphql/reactor/subgraph.d.ts +2 -31
  75. package/dist/src/graphql/reactor/subgraph.d.ts.map +1 -1
  76. package/dist/src/graphql/reactor/subgraph.js +132 -209
  77. package/dist/src/graphql/reactor/subgraph.js.map +1 -1
  78. package/dist/src/graphql/reactor/validation.d.ts +266 -20
  79. package/dist/src/graphql/reactor/validation.d.ts.map +1 -1
  80. package/dist/src/graphql/reactor/validation.js +98 -4
  81. package/dist/src/graphql/reactor/validation.js.map +1 -1
  82. package/dist/src/graphql/system/index.d.ts +0 -1
  83. package/dist/src/graphql/system/index.d.ts.map +1 -1
  84. package/dist/src/graphql/system/index.js +0 -1
  85. package/dist/src/graphql/system/index.js.map +1 -1
  86. package/dist/src/graphql/types.d.ts +6 -8
  87. package/dist/src/graphql/types.d.ts.map +1 -1
  88. package/dist/src/graphql/utils.d.ts +1 -18
  89. package/dist/src/graphql/utils.d.ts.map +1 -1
  90. package/dist/src/graphql/utils.js +7 -35
  91. package/dist/src/graphql/utils.js.map +1 -1
  92. package/dist/src/migrations/002_add_document_protection.d.ts +4 -0
  93. package/dist/src/migrations/002_add_document_protection.d.ts.map +1 -0
  94. package/dist/src/migrations/002_add_document_protection.js +18 -0
  95. package/dist/src/migrations/002_add_document_protection.js.map +1 -0
  96. package/dist/src/migrations/index.d.ts.map +1 -1
  97. package/dist/src/migrations/index.js +2 -0
  98. package/dist/src/migrations/index.js.map +1 -1
  99. package/dist/src/packages/http-loader.d.ts +68 -0
  100. package/dist/src/packages/http-loader.d.ts.map +1 -0
  101. package/dist/src/packages/http-loader.js +176 -0
  102. package/dist/src/packages/http-loader.js.map +1 -0
  103. package/dist/src/packages/https-hooks.d.mts +23 -0
  104. package/dist/src/packages/https-hooks.d.mts.map +1 -0
  105. package/dist/src/packages/https-hooks.mjs +59 -0
  106. package/dist/src/packages/https-hooks.mjs.map +1 -0
  107. package/dist/src/packages/import-loader.d.ts +5 -3
  108. package/dist/src/packages/import-loader.d.ts.map +1 -1
  109. package/dist/src/packages/import-loader.js +19 -10
  110. package/dist/src/packages/import-loader.js.map +1 -1
  111. package/dist/src/packages/package-manager.d.ts +2 -2
  112. package/dist/src/packages/package-manager.d.ts.map +1 -1
  113. package/dist/src/packages/package-manager.js.map +1 -1
  114. package/dist/src/packages/types.d.ts +9 -4
  115. package/dist/src/packages/types.d.ts.map +1 -1
  116. package/dist/src/packages/util.d.ts +3 -2
  117. package/dist/src/packages/util.d.ts.map +1 -1
  118. package/dist/src/packages/util.js +1 -1
  119. package/dist/src/packages/util.js.map +1 -1
  120. package/dist/src/packages/vite-loader.d.ts +10 -8
  121. package/dist/src/packages/vite-loader.d.ts.map +1 -1
  122. package/dist/src/packages/vite-loader.js +33 -10
  123. package/dist/src/packages/vite-loader.js.map +1 -1
  124. package/dist/src/server.d.ts +14 -11
  125. package/dist/src/server.d.ts.map +1 -1
  126. package/dist/src/server.js +153 -92
  127. package/dist/src/server.js.map +1 -1
  128. package/dist/src/services/auth.service.d.ts +0 -12
  129. package/dist/src/services/auth.service.d.ts.map +1 -1
  130. package/dist/src/services/auth.service.js +13 -40
  131. package/dist/src/services/auth.service.js.map +1 -1
  132. package/dist/src/services/authorization.service.d.ts +70 -0
  133. package/dist/src/services/authorization.service.d.ts.map +1 -0
  134. package/dist/src/services/authorization.service.js +155 -0
  135. package/dist/src/services/authorization.service.js.map +1 -0
  136. package/dist/src/services/document-permission.service.d.ts +47 -7
  137. package/dist/src/services/document-permission.service.d.ts.map +1 -1
  138. package/dist/src/services/document-permission.service.js +162 -7
  139. package/dist/src/services/document-permission.service.js.map +1 -1
  140. package/dist/src/services/package-management.service.d.ts +32 -0
  141. package/dist/src/services/package-management.service.d.ts.map +1 -0
  142. package/dist/src/services/package-management.service.js +95 -0
  143. package/dist/src/services/package-management.service.js.map +1 -0
  144. package/dist/src/services/package-storage.d.ts +23 -0
  145. package/dist/src/services/package-storage.d.ts.map +1 -0
  146. package/dist/src/services/package-storage.js +19 -0
  147. package/dist/src/services/package-storage.js.map +1 -0
  148. package/dist/src/tracing.d.ts.map +1 -1
  149. package/dist/src/tracing.js +19 -1
  150. package/dist/src/tracing.js.map +1 -1
  151. package/dist/src/types.d.ts +5 -5
  152. package/dist/src/types.d.ts.map +1 -1
  153. package/dist/src/utils/auth.d.ts +1 -1
  154. package/dist/src/utils/auth.d.ts.map +1 -1
  155. package/dist/src/utils/auth.js +5 -12
  156. package/dist/src/utils/auth.js.map +1 -1
  157. package/dist/src/utils/create-schema.d.ts +25 -6
  158. package/dist/src/utils/create-schema.d.ts.map +1 -1
  159. package/dist/src/utils/create-schema.js +458 -23
  160. package/dist/src/utils/create-schema.js.map +1 -1
  161. package/dist/src/utils/db.d.ts +8 -0
  162. package/dist/src/utils/db.d.ts.map +1 -1
  163. package/dist/src/utils/db.js.map +1 -1
  164. package/dist/src/utils/drive-url.d.ts +2 -0
  165. package/dist/src/utils/drive-url.d.ts.map +1 -0
  166. package/dist/src/utils/drive-url.js +3 -0
  167. package/dist/src/utils/drive-url.js.map +1 -0
  168. package/dist/src/utils/index.d.ts +1 -0
  169. package/dist/src/utils/index.d.ts.map +1 -1
  170. package/dist/src/utils/index.js +1 -0
  171. package/dist/src/utils/index.js.map +1 -1
  172. package/dist/test/authorization.service.test.d.ts +2 -0
  173. package/dist/test/authorization.service.test.d.ts.map +1 -0
  174. package/dist/test/authorization.service.test.js +252 -0
  175. package/dist/test/authorization.service.test.js.map +1 -0
  176. package/dist/test/connect-switchboard-reshuffle-convergence.test.d.ts +2 -0
  177. package/dist/test/connect-switchboard-reshuffle-convergence.test.d.ts.map +1 -0
  178. package/dist/test/connect-switchboard-reshuffle-convergence.test.js +203 -0
  179. package/dist/test/connect-switchboard-reshuffle-convergence.test.js.map +1 -0
  180. package/dist/test/connect-switchboard-sync.test.d.ts +2 -0
  181. package/dist/test/connect-switchboard-sync.test.d.ts.map +1 -0
  182. package/dist/test/connect-switchboard-sync.test.js +581 -0
  183. package/dist/test/connect-switchboard-sync.test.js.map +1 -0
  184. package/dist/test/document-drive-subgraph.test.d.ts +2 -0
  185. package/dist/test/document-drive-subgraph.test.d.ts.map +1 -0
  186. package/dist/test/document-drive-subgraph.test.js +186 -0
  187. package/dist/test/document-drive-subgraph.test.js.map +1 -0
  188. package/dist/test/document-model-subgraph-permissions.test.d.ts +2 -0
  189. package/dist/test/document-model-subgraph-permissions.test.d.ts.map +1 -0
  190. package/dist/test/document-model-subgraph-permissions.test.js +563 -0
  191. package/dist/test/document-model-subgraph-permissions.test.js.map +1 -0
  192. package/dist/test/drive-info-endpoint.test.d.ts +2 -0
  193. package/dist/test/drive-info-endpoint.test.d.ts.map +1 -0
  194. package/dist/test/drive-info-endpoint.test.js +123 -0
  195. package/dist/test/drive-info-endpoint.test.js.map +1 -0
  196. package/dist/test/fault-injection-sync.test.d.ts +2 -0
  197. package/dist/test/fault-injection-sync.test.d.ts.map +1 -0
  198. package/dist/test/fault-injection-sync.test.js +196 -0
  199. package/dist/test/fault-injection-sync.test.js.map +1 -0
  200. package/dist/test/index.d.ts +0 -1
  201. package/dist/test/index.d.ts.map +1 -1
  202. package/dist/test/index.js +0 -1
  203. package/dist/test/index.js.map +1 -1
  204. package/dist/test/permissions-integration.test.js +6 -20
  205. package/dist/test/permissions-integration.test.js.map +1 -1
  206. package/dist/test/push-backfill.test.d.ts +2 -0
  207. package/dist/test/push-backfill.test.d.ts.map +1 -0
  208. package/dist/test/push-backfill.test.js +298 -0
  209. package/dist/test/push-backfill.test.js.map +1 -0
  210. package/dist/test/reactor-client.test.js +172 -13
  211. package/dist/test/reactor-client.test.js.map +1 -1
  212. package/dist/test/reactor-resolvers.test.js +8 -11
  213. package/dist/test/reactor-resolvers.test.js.map +1 -1
  214. package/dist/test/reactor-subgraph-permissions.test.js +7 -36
  215. package/dist/test/reactor-subgraph-permissions.test.js.map +1 -1
  216. package/dist/test/subscriptions.test.js +2 -0
  217. package/dist/test/subscriptions.test.js.map +1 -1
  218. package/dist/test/utils/gql-resolver-bridge.d.ts +4 -1
  219. package/dist/test/utils/gql-resolver-bridge.d.ts.map +1 -1
  220. package/dist/test/utils/gql-resolver-bridge.js +36 -7
  221. package/dist/test/utils/gql-resolver-bridge.js.map +1 -1
  222. package/dist/tsconfig.tsbuildinfo +1 -1
  223. package/package.json +46 -55
  224. package/dist/src/graphql/drive-subgraph.d.ts +0 -25
  225. package/dist/src/graphql/drive-subgraph.d.ts.map +0 -1
  226. package/dist/src/graphql/drive-subgraph.js +0 -487
  227. package/dist/src/graphql/drive-subgraph.js.map +0 -1
  228. package/dist/src/graphql/system/system-subgraph.d.ts +0 -49
  229. package/dist/src/graphql/system/system-subgraph.d.ts.map +0 -1
  230. package/dist/src/graphql/system/system-subgraph.js +0 -130
  231. package/dist/src/graphql/system/system-subgraph.js.map +0 -1
  232. package/dist/src/sync/types.d.ts +0 -10
  233. package/dist/src/sync/types.d.ts.map +0 -1
  234. package/dist/src/sync/types.js +0 -2
  235. package/dist/src/sync/types.js.map +0 -1
  236. package/dist/src/sync/utils.d.ts +0 -7
  237. package/dist/src/sync/utils.d.ts.map +0 -1
  238. package/dist/src/sync/utils.js +0 -78
  239. package/dist/src/sync/utils.js.map +0 -1
  240. package/dist/test/drive-handlers.d.ts +0 -4
  241. package/dist/test/drive-handlers.d.ts.map +0 -1
  242. package/dist/test/drive-handlers.js +0 -39
  243. package/dist/test/drive-handlers.js.map +0 -1
  244. package/dist/test/drive-subgraph-permissions.test.d.ts +0 -2
  245. package/dist/test/drive-subgraph-permissions.test.d.ts.map +0 -1
  246. package/dist/test/drive-subgraph-permissions.test.js +0 -195
  247. package/dist/test/drive-subgraph-permissions.test.js.map +0 -1
  248. package/dist/test/drive.test.d.ts +0 -2
  249. package/dist/test/drive.test.d.ts.map +0 -1
  250. package/dist/test/drive.test.js +0 -142
  251. package/dist/test/drive.test.js.map +0 -1
  252. package/dist/test/pull-responder-transmitter.test.d.ts +0 -2
  253. package/dist/test/pull-responder-transmitter.test.d.ts.map +0 -1
  254. package/dist/test/pull-responder-transmitter.test.js +0 -220
  255. package/dist/test/pull-responder-transmitter.test.js.map +0 -1
  256. package/dist/test/push-transmitter.test.d.ts +0 -2
  257. package/dist/test/push-transmitter.test.d.ts.map +0 -1
  258. package/dist/test/push-transmitter.test.js +0 -179
  259. package/dist/test/push-transmitter.test.js.map +0 -1
  260. package/dist/test/system.test.d.ts +0 -2
  261. package/dist/test/system.test.d.ts.map +0 -1
  262. package/dist/test/system.test.js +0 -211
  263. package/dist/test/system.test.js.map +0 -1
  264. package/dist/test/three-reactor-gql-sync.test.d.ts +0 -2
  265. package/dist/test/three-reactor-gql-sync.test.d.ts.map +0 -1
  266. package/dist/test/three-reactor-gql-sync.test.js +0 -368
  267. package/dist/test/three-reactor-gql-sync.test.js.map +0 -1
  268. package/dist/test/two-reactor-gql-sync.test.d.ts +0 -2
  269. package/dist/test/two-reactor-gql-sync.test.d.ts.map +0 -1
  270. package/dist/test/two-reactor-gql-sync.test.js +0 -348
  271. package/dist/test/two-reactor-gql-sync.test.js.map +0 -1
@@ -1,348 +0,0 @@
1
- import { CompositeChannelFactory, ConsoleLogger, JobStatus, OperationEventTypes, ReactorBuilder, SyncBuilder, } from "@powerhousedao/reactor";
2
- import { driveDocumentModelModule } from "document-drive";
3
- import { documentModelDocumentModelModule, } from "document-model";
4
- import { afterEach, beforeEach, describe, expect, it } from "vitest";
5
- import { createResolverBridge } from "./utils/gql-resolver-bridge.js";
6
- async function waitForJobCompletion(reactor, jobId, timeoutMs = 5000) {
7
- const startTime = Date.now();
8
- while (Date.now() - startTime < timeoutMs) {
9
- const status = await reactor.getJobStatus(jobId);
10
- if (status.status === JobStatus.READ_MODELS_READY) {
11
- return;
12
- }
13
- if (status.status === JobStatus.FAILED) {
14
- throw new Error(`Job failed: ${status.error?.message || "Unknown"}`);
15
- }
16
- await new Promise((resolve) => setTimeout(resolve, 50));
17
- }
18
- throw new Error(`Job did not complete within ${timeoutMs}ms`);
19
- }
20
- async function waitForOperationsReady(eventBus, documentId, timeoutMs = 5000) {
21
- return new Promise((resolve, reject) => {
22
- const timeout = setTimeout(() => {
23
- unsubscribe();
24
- reject(new Error(`OPERATIONS_READY event for document ${documentId} not received within ${timeoutMs}ms`));
25
- }, timeoutMs);
26
- const unsubscribe = eventBus.subscribe(OperationEventTypes.OPERATIONS_READY, (type, event) => {
27
- const hasDocument = event.operations.some((op) => op.context.documentId === documentId);
28
- if (hasDocument) {
29
- clearTimeout(timeout);
30
- unsubscribe();
31
- resolve();
32
- }
33
- });
34
- });
35
- }
36
- async function waitForMultipleOperationsReady(eventBus, expectedCount, timeoutMs = 10000) {
37
- return new Promise((resolve, reject) => {
38
- let count = 0;
39
- const timeout = setTimeout(() => {
40
- unsubscribe();
41
- reject(new Error(`Expected ${expectedCount} OPERATIONS_READY events but received ${count} within ${timeoutMs}ms`));
42
- }, timeoutMs);
43
- const unsubscribe = eventBus.subscribe(OperationEventTypes.OPERATIONS_READY, () => {
44
- count++;
45
- if (count >= expectedCount) {
46
- clearTimeout(timeout);
47
- unsubscribe();
48
- resolve();
49
- }
50
- });
51
- });
52
- }
53
- async function setupTwoReactorsWithGqlChannel() {
54
- const syncManagerRegistry = new Map();
55
- const resolverBridge = createResolverBridge(syncManagerRegistry);
56
- const logger = new ConsoleLogger(["test"]);
57
- const channelFactoryA = new CompositeChannelFactory(logger);
58
- const channelFactoryB = new CompositeChannelFactory(logger);
59
- const models = [
60
- driveDocumentModelModule,
61
- documentModelDocumentModelModule,
62
- ];
63
- const reactorAModule = await new ReactorBuilder()
64
- .withDocumentModels(models)
65
- .withSync(new SyncBuilder().withChannelFactory(channelFactoryA))
66
- .buildModule();
67
- const reactorA = reactorAModule.reactor;
68
- const eventBusA = reactorAModule.eventBus;
69
- const syncManagerA = reactorAModule.syncModule.syncManager;
70
- const reactorBModule = await new ReactorBuilder()
71
- .withDocumentModels(models)
72
- .withSync(new SyncBuilder().withChannelFactory(channelFactoryB))
73
- .buildModule();
74
- const reactorB = reactorBModule.reactor;
75
- const eventBusB = reactorBModule.eventBus;
76
- const syncManagerB = reactorBModule.syncModule.syncManager;
77
- syncManagerRegistry.set("reactora", syncManagerA);
78
- syncManagerRegistry.set("reactorb", syncManagerB);
79
- const filter = {
80
- documentId: [],
81
- scope: [],
82
- branch: "main",
83
- };
84
- const gqlParamsToB = {
85
- url: "http://reactorB/graphql",
86
- pollIntervalMs: 100,
87
- maxFailures: 10,
88
- retryBaseDelayMs: 50,
89
- fetchFn: resolverBridge,
90
- };
91
- // ReactorA adds remote pointing to B
92
- // touchChannel automatically creates receiving channel on B
93
- await syncManagerA.add("remoteB", "collection1", { type: "gql", parameters: gqlParamsToB }, filter);
94
- return { reactorA, reactorB, eventBusA, eventBusB };
95
- }
96
- describe("Two-Reactor Sync with GqlChannel", () => {
97
- let reactorA;
98
- let reactorB;
99
- let eventBusA;
100
- let eventBusB;
101
- beforeEach(async () => {
102
- const setup = await setupTwoReactorsWithGqlChannel();
103
- reactorA = setup.reactorA;
104
- reactorB = setup.reactorB;
105
- eventBusA = setup.eventBusA;
106
- eventBusB = setup.eventBusB;
107
- });
108
- afterEach(() => {
109
- reactorA.kill();
110
- reactorB.kill();
111
- });
112
- it("should sync operation from ReactorA to ReactorB via GqlChannel", async () => {
113
- const document = driveDocumentModelModule.utils.createDocument();
114
- const readyPromise = waitForOperationsReady(eventBusB, document.header.id);
115
- const jobInfo = await reactorA.create(document);
116
- await waitForJobCompletion(reactorA, jobInfo.id);
117
- const resultA = await reactorA.getOperations(document.header.id, {
118
- branch: "main",
119
- });
120
- const opsA = Object.values(resultA).flatMap((scope) => scope.results);
121
- await readyPromise;
122
- const resultB = await reactorB.getOperations(document.header.id, {
123
- branch: "main",
124
- });
125
- const opsB = Object.values(resultB).flatMap((scope) => scope.results);
126
- expect(opsA.length).toBeGreaterThan(0);
127
- expect(opsB.length).toBe(opsA.length);
128
- for (let i = 0; i < opsA.length; i++) {
129
- expect(opsB[i]).toEqual(opsA[i]);
130
- }
131
- const docA = await reactorA.get(document.header.id, { branch: "main" });
132
- const docB = await reactorB.get(document.header.id, { branch: "main" });
133
- expect(docA.document).toEqual(docB.document);
134
- });
135
- it("should sync operation from ReactorB to ReactorA via GqlChannel", async () => {
136
- const document = driveDocumentModelModule.utils.createDocument();
137
- const readyPromise = waitForOperationsReady(eventBusA, document.header.id);
138
- const jobInfo = await reactorB.create(document);
139
- await waitForJobCompletion(reactorB, jobInfo.id);
140
- const resultB = await reactorB.getOperations(document.header.id, {
141
- branch: "main",
142
- });
143
- const opsB = Object.values(resultB).flatMap((scope) => scope.results);
144
- await readyPromise;
145
- const resultA = await reactorA.getOperations(document.header.id, {
146
- branch: "main",
147
- });
148
- const opsA = Object.values(resultA).flatMap((scope) => scope.results);
149
- expect(opsB.length).toBeGreaterThan(0);
150
- expect(opsA.length).toBe(opsB.length);
151
- for (let i = 0; i < opsB.length; i++) {
152
- expect(opsA[i]).toEqual(opsB[i]);
153
- }
154
- const docA = await reactorA.get(document.header.id, { branch: "main" });
155
- const docB = await reactorB.get(document.header.id, { branch: "main" });
156
- expect(docA.document).toEqual(docB.document);
157
- });
158
- it("should sync multiple documents with concurrent operations from both reactors", async () => {
159
- // Create 4 documents (2 for each reactor)
160
- const docA1 = driveDocumentModelModule.utils.createDocument();
161
- const docA2 = driveDocumentModelModule.utils.createDocument();
162
- const docB1 = driveDocumentModelModule.utils.createDocument();
163
- const docB2 = driveDocumentModelModule.utils.createDocument();
164
- const allDocIds = [
165
- docA1.header.id,
166
- docA2.header.id,
167
- docB1.header.id,
168
- docB2.header.id,
169
- ];
170
- // Set up listeners for docs to sync to the other reactor
171
- const readyOnB_A1 = waitForOperationsReady(eventBusB, docA1.header.id);
172
- const readyOnB_A2 = waitForOperationsReady(eventBusB, docA2.header.id);
173
- const readyOnA_B1 = waitForOperationsReady(eventBusA, docB1.header.id);
174
- const readyOnA_B2 = waitForOperationsReady(eventBusA, docB2.header.id);
175
- // Create documents on their respective reactors
176
- const [jobA1, jobA2] = await Promise.all([
177
- reactorA.create(docA1),
178
- reactorA.create(docA2),
179
- ]);
180
- const [jobB1, jobB2] = await Promise.all([
181
- reactorB.create(docB1),
182
- reactorB.create(docB2),
183
- ]);
184
- // Wait for all creates to complete on source reactors
185
- await Promise.all([
186
- waitForJobCompletion(reactorA, jobA1.id),
187
- waitForJobCompletion(reactorA, jobA2.id),
188
- waitForJobCompletion(reactorB, jobB1.id),
189
- waitForJobCompletion(reactorB, jobB2.id),
190
- ]);
191
- // Wait for all docs to sync to the other reactor
192
- await Promise.all([readyOnB_A1, readyOnB_A2, readyOnA_B1, readyOnA_B2]);
193
- // Now fire concurrent modify operations on each doc
194
- void reactorA.execute(docA1.header.id, "main", [
195
- driveDocumentModelModule.actions.setDriveName({ name: "Drive A1" }),
196
- driveDocumentModelModule.actions.addFolder({
197
- id: "folder-a1",
198
- name: "Folder A1",
199
- parentFolder: null,
200
- }),
201
- ]);
202
- void reactorA.execute(docA2.header.id, "main", [
203
- driveDocumentModelModule.actions.setDriveName({ name: "Drive A2" }),
204
- driveDocumentModelModule.actions.addFolder({
205
- id: "folder-a2",
206
- name: "Folder A2",
207
- parentFolder: null,
208
- }),
209
- ]);
210
- void reactorB.execute(docB1.header.id, "main", [
211
- driveDocumentModelModule.actions.setDriveName({ name: "Drive B1" }),
212
- driveDocumentModelModule.actions.addFolder({
213
- id: "folder-b1",
214
- name: "Folder B1",
215
- parentFolder: null,
216
- }),
217
- ]);
218
- void reactorB.execute(docB2.header.id, "main", [
219
- driveDocumentModelModule.actions.setDriveName({ name: "Drive B2" }),
220
- driveDocumentModelModule.actions.addFolder({
221
- id: "folder-b2",
222
- name: "Folder B2",
223
- parentFolder: null,
224
- }),
225
- ]);
226
- // Poll until all 4 documents are synced on both reactors
227
- const startTime = Date.now();
228
- const timeout = 25000;
229
- let synced = false;
230
- while (Date.now() - startTime < timeout) {
231
- let allDocsSynced = true;
232
- for (const docId of allDocIds) {
233
- try {
234
- const resultA = await reactorA.getOperations(docId, {
235
- branch: "main",
236
- });
237
- const opsA = Object.values(resultA).flatMap((scope) => scope.results);
238
- const resultB = await reactorB.getOperations(docId, {
239
- branch: "main",
240
- });
241
- const opsB = Object.values(resultB).flatMap((scope) => scope.results);
242
- // Each doc should have at least 2 ops (create + execute with actions)
243
- // and both reactors should have same count
244
- if (opsA.length < 2 ||
245
- opsB.length < 2 ||
246
- opsA.length !== opsB.length) {
247
- allDocsSynced = false;
248
- break;
249
- }
250
- }
251
- catch {
252
- // Document may not exist on one reactor yet
253
- allDocsSynced = false;
254
- break;
255
- }
256
- }
257
- if (allDocsSynced) {
258
- synced = true;
259
- break;
260
- }
261
- await new Promise((resolve) => setTimeout(resolve, 100));
262
- }
263
- expect(synced).toBe(true);
264
- // Verify operation equality for all 4 documents
265
- for (const docId of allDocIds) {
266
- const resultA = await reactorA.getOperations(docId, { branch: "main" });
267
- const opsA = Object.values(resultA).flatMap((scope) => scope.results);
268
- const resultB = await reactorB.getOperations(docId, { branch: "main" });
269
- const opsB = Object.values(resultB).flatMap((scope) => scope.results);
270
- expect(opsA.length).toBeGreaterThan(0);
271
- expect(opsB.length).toBe(opsA.length);
272
- for (let i = 0; i < opsA.length; i++) {
273
- expect(opsB[i]).toEqual(opsA[i]);
274
- }
275
- }
276
- // Verify document state equality for all 4 documents
277
- for (const docId of allDocIds) {
278
- const docFromA = await reactorA.get(docId, { branch: "main" });
279
- const docFromB = await reactorB.get(docId, { branch: "main" });
280
- expect(docFromA.document).toEqual(docFromB.document);
281
- }
282
- }, 30000);
283
- it("should handle concurrent modifications to the same document from both reactors", async () => {
284
- const doc = driveDocumentModelModule.utils.createDocument();
285
- const readyPromise = waitForOperationsReady(eventBusB, doc.header.id);
286
- const createJob = await reactorA.create(doc);
287
- await waitForJobCompletion(reactorA, createJob.id);
288
- await readyPromise;
289
- const docOnB = await reactorB.get(doc.header.id, { branch: "main" });
290
- expect(docOnB.document).toBeDefined();
291
- void reactorA.execute(doc.header.id, "main", [
292
- driveDocumentModelModule.actions.setDriveName({ name: "Name from A" }),
293
- ]);
294
- void reactorB.execute(doc.header.id, "main", [
295
- driveDocumentModelModule.actions.setDriveName({ name: "Name from B" }),
296
- ]);
297
- void reactorA.execute(doc.header.id, "main", [
298
- driveDocumentModelModule.actions.addFolder({
299
- id: "folder-a",
300
- name: "Folder from A",
301
- parentFolder: null,
302
- }),
303
- ]);
304
- void reactorB.execute(doc.header.id, "main", [
305
- driveDocumentModelModule.actions.addFolder({
306
- id: "folder-b",
307
- name: "Folder from B",
308
- parentFolder: null,
309
- }),
310
- ]);
311
- const startTime = Date.now();
312
- const timeout = 15000;
313
- let synced = false;
314
- while (Date.now() - startTime < timeout) {
315
- const resultA = await reactorA.getOperations(doc.header.id, {
316
- branch: "main",
317
- });
318
- const opsA = Object.values(resultA).flatMap((scope) => scope.results);
319
- const resultB = await reactorB.getOperations(doc.header.id, {
320
- branch: "main",
321
- });
322
- const opsB = Object.values(resultB).flatMap((scope) => scope.results);
323
- if (opsA.length > 1 && opsB.length > 1 && opsA.length === opsB.length) {
324
- synced = true;
325
- break;
326
- }
327
- await new Promise((resolve) => setTimeout(resolve, 100));
328
- }
329
- expect(synced).toBe(true);
330
- const resultA = await reactorA.getOperations(doc.header.id, {
331
- branch: "main",
332
- });
333
- const opsA = Object.values(resultA).flatMap((scope) => scope.results);
334
- const resultB = await reactorB.getOperations(doc.header.id, {
335
- branch: "main",
336
- });
337
- const opsB = Object.values(resultB).flatMap((scope) => scope.results);
338
- expect(opsA.length).toBeGreaterThan(0);
339
- expect(opsB.length).toBe(opsA.length);
340
- for (let i = 0; i < opsA.length; i++) {
341
- expect(opsB[i]).toEqual(opsA[i]);
342
- }
343
- const docFromA = await reactorA.get(doc.header.id, { branch: "main" });
344
- const docFromB = await reactorB.get(doc.header.id, { branch: "main" });
345
- expect(docFromA.document).toEqual(docFromB.document);
346
- }, 20000);
347
- });
348
- //# sourceMappingURL=two-reactor-gql-sync.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"two-reactor-gql-sync.test.js","sourceRoot":"","sources":["../../test/two-reactor-gql-sync.test.ts"],"names":[],"mappings":"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"}