@powerhousedao/reactor-api 6.0.0-dev.153 → 6.0.0-dev.154

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