@powerhousedao/reactor 6.0.0-dev.7 → 6.0.0-dev.78

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 (376) hide show
  1. package/dist/src/cache/collection-membership-cache.d.ts +13 -0
  2. package/dist/src/cache/collection-membership-cache.d.ts.map +1 -0
  3. package/dist/src/cache/document-meta-cache.d.ts.map +1 -1
  4. package/dist/src/cache/kysely-operation-index.d.ts +6 -1
  5. package/dist/src/cache/kysely-operation-index.d.ts.map +1 -1
  6. package/dist/src/cache/kysely-write-cache.d.ts +9 -2
  7. package/dist/src/cache/kysely-write-cache.d.ts.map +1 -1
  8. package/dist/src/cache/operation-index-types.d.ts +16 -2
  9. package/dist/src/cache/operation-index-types.d.ts.map +1 -1
  10. package/dist/src/cache/write/interfaces.d.ts +7 -2
  11. package/dist/src/cache/write/interfaces.d.ts.map +1 -1
  12. package/dist/src/client/reactor-client.d.ts +13 -10
  13. package/dist/src/client/reactor-client.d.ts.map +1 -1
  14. package/dist/src/client/types.d.ts +25 -6
  15. package/dist/src/client/types.d.ts.map +1 -1
  16. package/dist/src/core/reactor-builder.d.ts +23 -10
  17. package/dist/src/core/reactor-builder.d.ts.map +1 -1
  18. package/dist/src/core/reactor-client-builder.d.ts +5 -4
  19. package/dist/src/core/reactor-client-builder.d.ts.map +1 -1
  20. package/dist/src/core/reactor.d.ts +20 -80
  21. package/dist/src/core/reactor.d.ts.map +1 -1
  22. package/dist/src/core/types.d.ts +64 -28
  23. package/dist/src/core/types.d.ts.map +1 -1
  24. package/dist/src/core/utils.d.ts +39 -3
  25. package/dist/src/core/utils.d.ts.map +1 -1
  26. package/dist/src/events/types.d.ts +35 -10
  27. package/dist/src/events/types.d.ts.map +1 -1
  28. package/dist/src/executor/document-action-handler.d.ts +37 -0
  29. package/dist/src/executor/document-action-handler.d.ts.map +1 -0
  30. package/dist/src/executor/signature-verifier.d.ts +9 -0
  31. package/dist/src/executor/signature-verifier.d.ts.map +1 -0
  32. package/dist/src/executor/simple-job-executor-manager.d.ts +6 -1
  33. package/dist/src/executor/simple-job-executor-manager.d.ts.map +1 -1
  34. package/dist/src/executor/simple-job-executor.d.ts +6 -46
  35. package/dist/src/executor/simple-job-executor.d.ts.map +1 -1
  36. package/dist/src/executor/types.d.ts +1 -3
  37. package/dist/src/executor/types.d.ts.map +1 -1
  38. package/dist/src/executor/util.d.ts +12 -2
  39. package/dist/src/executor/util.d.ts.map +1 -1
  40. package/dist/src/index.d.ts +11 -9
  41. package/dist/src/index.d.ts.map +1 -1
  42. package/dist/src/index.js +20208 -61
  43. package/dist/src/job-tracker/in-memory-job-tracker.d.ts +4 -3
  44. package/dist/src/job-tracker/in-memory-job-tracker.d.ts.map +1 -1
  45. package/dist/src/job-tracker/interfaces.d.ts +3 -1
  46. package/dist/src/job-tracker/interfaces.d.ts.map +1 -1
  47. package/dist/src/logging/console.d.ts +1 -22
  48. package/dist/src/logging/console.d.ts.map +1 -1
  49. package/dist/src/logging/types.d.ts +1 -11
  50. package/dist/src/logging/types.d.ts.map +1 -1
  51. package/dist/src/processors/index.d.ts +1 -1
  52. package/dist/src/processors/index.d.ts.map +1 -1
  53. package/dist/src/processors/processor-manager.d.ts +19 -6
  54. package/dist/src/processors/processor-manager.d.ts.map +1 -1
  55. package/dist/src/processors/relational/types.d.ts +2 -0
  56. package/dist/src/processors/relational/types.d.ts.map +1 -0
  57. package/dist/src/processors/relational/utils.d.ts +2 -0
  58. package/dist/src/processors/relational/utils.d.ts.map +1 -0
  59. package/dist/src/processors/utils.d.ts +3 -2
  60. package/dist/src/processors/utils.d.ts.map +1 -1
  61. package/dist/src/queue/job-execution-handle.d.ts +3 -0
  62. package/dist/src/queue/job-execution-handle.d.ts.map +1 -1
  63. package/dist/src/queue/queue.d.ts +30 -1
  64. package/dist/src/queue/queue.d.ts.map +1 -1
  65. package/dist/src/queue/types.d.ts +4 -3
  66. package/dist/src/queue/types.d.ts.map +1 -1
  67. package/dist/src/read-models/base-read-model.d.ts +11 -9
  68. package/dist/src/read-models/base-read-model.d.ts.map +1 -1
  69. package/dist/src/read-models/coordinator.d.ts +2 -2
  70. package/dist/src/read-models/coordinator.d.ts.map +1 -1
  71. package/dist/src/read-models/document-view.d.ts +7 -4
  72. package/dist/src/read-models/document-view.d.ts.map +1 -1
  73. package/dist/src/read-models/interfaces.d.ts +1 -1
  74. package/dist/src/read-models/interfaces.d.ts.map +1 -1
  75. package/dist/src/read-models/types.d.ts +16 -0
  76. package/dist/src/read-models/types.d.ts.map +1 -1
  77. package/dist/src/registry/document-model-resolver.d.ts +29 -0
  78. package/dist/src/registry/document-model-resolver.d.ts.map +1 -0
  79. package/dist/src/registry/implementation.d.ts +4 -0
  80. package/dist/src/registry/implementation.d.ts.map +1 -1
  81. package/dist/src/registry/index.d.ts +3 -1
  82. package/dist/src/registry/index.d.ts.map +1 -1
  83. package/dist/src/registry/interfaces.d.ts +8 -0
  84. package/dist/src/registry/interfaces.d.ts.map +1 -1
  85. package/dist/src/shared/awaiter.d.ts +2 -2
  86. package/dist/src/shared/awaiter.d.ts.map +1 -1
  87. package/dist/src/shared/collect-all-pages.d.ts +7 -0
  88. package/dist/src/shared/collect-all-pages.d.ts.map +1 -0
  89. package/dist/src/shared/drive-url.d.ts +15 -0
  90. package/dist/src/shared/drive-url.d.ts.map +1 -0
  91. package/dist/src/shared/errors.d.ts +9 -0
  92. package/dist/src/shared/errors.d.ts.map +1 -1
  93. package/dist/src/shared/factories.d.ts +6 -2
  94. package/dist/src/shared/factories.d.ts.map +1 -1
  95. package/dist/src/shared/types.d.ts +32 -6
  96. package/dist/src/shared/types.d.ts.map +1 -1
  97. package/dist/src/signer/passthrough-signer.d.ts +1 -1
  98. package/dist/src/signer/passthrough-signer.d.ts.map +1 -1
  99. package/dist/src/storage/interfaces.d.ts +238 -124
  100. package/dist/src/storage/interfaces.d.ts.map +1 -1
  101. package/dist/src/storage/kysely/document-indexer.d.ts +17 -18
  102. package/dist/src/storage/kysely/document-indexer.d.ts.map +1 -1
  103. package/dist/src/storage/kysely/store.d.ts +5 -4
  104. package/dist/src/storage/kysely/store.d.ts.map +1 -1
  105. package/dist/src/storage/kysely/sync-cursor-storage.d.ts +1 -1
  106. package/dist/src/storage/kysely/sync-cursor-storage.d.ts.map +1 -1
  107. package/dist/src/storage/kysely/sync-dead-letter-storage.d.ts +17 -0
  108. package/dist/src/storage/kysely/sync-dead-letter-storage.d.ts.map +1 -0
  109. package/dist/src/storage/kysely/types.d.ts +22 -0
  110. package/dist/src/storage/kysely/types.d.ts.map +1 -1
  111. package/dist/src/storage/migrations/011_add_cursor_type_column.d.ts +3 -0
  112. package/dist/src/storage/migrations/011_add_cursor_type_column.d.ts.map +1 -0
  113. package/dist/src/storage/migrations/012_add_source_remote_column.d.ts +3 -0
  114. package/dist/src/storage/migrations/012_add_source_remote_column.d.ts.map +1 -0
  115. package/dist/src/storage/migrations/013_create_sync_dead_letters_table.d.ts +3 -0
  116. package/dist/src/storage/migrations/013_create_sync_dead_letters_table.d.ts.map +1 -0
  117. package/dist/src/storage/migrations/014_create_processor_cursor_table.d.ts +3 -0
  118. package/dist/src/storage/migrations/014_create_processor_cursor_table.d.ts.map +1 -0
  119. package/dist/src/storage/migrations/migrator.d.ts.map +1 -1
  120. package/dist/src/subs/default-error-handler.d.ts.map +1 -1
  121. package/dist/src/subs/subscription-notification-read-model.d.ts +3 -2
  122. package/dist/src/subs/subscription-notification-read-model.d.ts.map +1 -1
  123. package/dist/src/sync/batch-aggregator.d.ts +25 -0
  124. package/dist/src/sync/batch-aggregator.d.ts.map +1 -0
  125. package/dist/src/sync/buffered-mailbox.d.ts +36 -0
  126. package/dist/src/sync/buffered-mailbox.d.ts.map +1 -0
  127. package/dist/src/sync/channels/gql-req-channel.d.ts +121 -0
  128. package/dist/src/sync/channels/gql-req-channel.d.ts.map +1 -0
  129. package/dist/src/sync/channels/gql-request-channel-factory.d.ts +32 -0
  130. package/dist/src/sync/channels/gql-request-channel-factory.d.ts.map +1 -0
  131. package/dist/src/sync/channels/gql-res-channel.d.ts +31 -0
  132. package/dist/src/sync/channels/gql-res-channel.d.ts.map +1 -0
  133. package/dist/src/sync/channels/gql-response-channel-factory.d.ts +13 -0
  134. package/dist/src/sync/channels/gql-response-channel-factory.d.ts.map +1 -0
  135. package/dist/src/sync/channels/index.d.ts +6 -4
  136. package/dist/src/sync/channels/index.d.ts.map +1 -1
  137. package/dist/src/sync/channels/interval-poll-timer.d.ts +40 -0
  138. package/dist/src/sync/channels/interval-poll-timer.d.ts.map +1 -0
  139. package/dist/src/sync/channels/poll-timer.d.ts +14 -0
  140. package/dist/src/sync/channels/poll-timer.d.ts.map +1 -0
  141. package/dist/src/sync/channels/utils.d.ts +15 -1
  142. package/dist/src/sync/channels/utils.d.ts.map +1 -1
  143. package/dist/src/sync/index.d.ts +11 -7
  144. package/dist/src/sync/index.d.ts.map +1 -1
  145. package/dist/src/sync/interfaces.d.ts +42 -19
  146. package/dist/src/sync/interfaces.d.ts.map +1 -1
  147. package/dist/src/sync/mailbox.d.ts +51 -12
  148. package/dist/src/sync/mailbox.d.ts.map +1 -1
  149. package/dist/src/sync/sync-awaiter.d.ts +34 -0
  150. package/dist/src/sync/sync-awaiter.d.ts.map +1 -0
  151. package/dist/src/sync/sync-builder.d.ts +5 -1
  152. package/dist/src/sync/sync-builder.d.ts.map +1 -1
  153. package/dist/src/sync/sync-manager.d.ts +22 -8
  154. package/dist/src/sync/sync-manager.d.ts.map +1 -1
  155. package/dist/src/sync/sync-operation.d.ts +4 -2
  156. package/dist/src/sync/sync-operation.d.ts.map +1 -1
  157. package/dist/src/sync/sync-status-tracker.d.ts +31 -0
  158. package/dist/src/sync/sync-status-tracker.d.ts.map +1 -0
  159. package/dist/src/sync/types.d.ts +107 -2
  160. package/dist/src/sync/types.d.ts.map +1 -1
  161. package/dist/src/sync/utils.d.ts +37 -2
  162. package/dist/src/sync/utils.d.ts.map +1 -1
  163. package/dist/src/utils/reshuffle.d.ts +22 -5
  164. package/dist/src/utils/reshuffle.d.ts.map +1 -1
  165. package/package.json +24 -20
  166. package/dist/src/actions/index.js +0 -76
  167. package/dist/src/actions/index.js.map +0 -1
  168. package/dist/src/cache/buffer/ring-buffer.js +0 -69
  169. package/dist/src/cache/buffer/ring-buffer.js.map +0 -1
  170. package/dist/src/cache/document-meta-cache-types.js +0 -2
  171. package/dist/src/cache/document-meta-cache-types.js.map +0 -1
  172. package/dist/src/cache/document-meta-cache.js +0 -128
  173. package/dist/src/cache/document-meta-cache.js.map +0 -1
  174. package/dist/src/cache/index.js +0 -2
  175. package/dist/src/cache/index.js.map +0 -1
  176. package/dist/src/cache/kysely-operation-index.js +0 -250
  177. package/dist/src/cache/kysely-operation-index.js.map +0 -1
  178. package/dist/src/cache/kysely-write-cache.js +0 -388
  179. package/dist/src/cache/kysely-write-cache.js.map +0 -1
  180. package/dist/src/cache/lru/lru-tracker.js +0 -96
  181. package/dist/src/cache/lru/lru-tracker.js.map +0 -1
  182. package/dist/src/cache/operation-index-types.js +0 -4
  183. package/dist/src/cache/operation-index-types.js.map +0 -1
  184. package/dist/src/cache/write/interfaces.js +0 -2
  185. package/dist/src/cache/write/interfaces.js.map +0 -1
  186. package/dist/src/cache/write-cache-types.js +0 -2
  187. package/dist/src/cache/write-cache-types.js.map +0 -1
  188. package/dist/src/client/reactor-client.js +0 -406
  189. package/dist/src/client/reactor-client.js.map +0 -1
  190. package/dist/src/client/types.js +0 -14
  191. package/dist/src/client/types.js.map +0 -1
  192. package/dist/src/core/reactor-builder.js +0 -231
  193. package/dist/src/core/reactor-builder.js.map +0 -1
  194. package/dist/src/core/reactor-client-builder.js +0 -123
  195. package/dist/src/core/reactor-client-builder.js.map +0 -1
  196. package/dist/src/core/reactor.js +0 -981
  197. package/dist/src/core/reactor.js.map +0 -1
  198. package/dist/src/core/types.js +0 -2
  199. package/dist/src/core/types.js.map +0 -1
  200. package/dist/src/core/utils.js +0 -171
  201. package/dist/src/core/utils.js.map +0 -1
  202. package/dist/src/events/event-bus.js +0 -53
  203. package/dist/src/events/event-bus.js.map +0 -1
  204. package/dist/src/events/interfaces.js +0 -2
  205. package/dist/src/events/interfaces.js.map +0 -1
  206. package/dist/src/events/types.js +0 -28
  207. package/dist/src/events/types.js.map +0 -1
  208. package/dist/src/executor/interfaces.js +0 -2
  209. package/dist/src/executor/interfaces.js.map +0 -1
  210. package/dist/src/executor/simple-job-executor-manager.js +0 -233
  211. package/dist/src/executor/simple-job-executor-manager.js.map +0 -1
  212. package/dist/src/executor/simple-job-executor.js +0 -898
  213. package/dist/src/executor/simple-job-executor.js.map +0 -1
  214. package/dist/src/executor/types.js +0 -11
  215. package/dist/src/executor/types.js.map +0 -1
  216. package/dist/src/executor/util.js +0 -184
  217. package/dist/src/executor/util.js.map +0 -1
  218. package/dist/src/index.js.map +0 -1
  219. package/dist/src/job-tracker/in-memory-job-tracker.js +0 -112
  220. package/dist/src/job-tracker/in-memory-job-tracker.js.map +0 -1
  221. package/dist/src/job-tracker/index.js +0 -2
  222. package/dist/src/job-tracker/index.js.map +0 -1
  223. package/dist/src/job-tracker/interfaces.js +0 -2
  224. package/dist/src/job-tracker/interfaces.js.map +0 -1
  225. package/dist/src/logging/console.js +0 -108
  226. package/dist/src/logging/console.js.map +0 -1
  227. package/dist/src/logging/types.js +0 -2
  228. package/dist/src/logging/types.js.map +0 -1
  229. package/dist/src/processors/index.js +0 -2
  230. package/dist/src/processors/index.js.map +0 -1
  231. package/dist/src/processors/processor-manager.js +0 -165
  232. package/dist/src/processors/processor-manager.js.map +0 -1
  233. package/dist/src/processors/types.d.ts +0 -63
  234. package/dist/src/processors/types.d.ts.map +0 -1
  235. package/dist/src/processors/types.js +0 -2
  236. package/dist/src/processors/types.js.map +0 -1
  237. package/dist/src/processors/utils.js +0 -58
  238. package/dist/src/processors/utils.js.map +0 -1
  239. package/dist/src/queue/interfaces.js +0 -2
  240. package/dist/src/queue/interfaces.js.map +0 -1
  241. package/dist/src/queue/job-execution-handle.js +0 -62
  242. package/dist/src/queue/job-execution-handle.js.map +0 -1
  243. package/dist/src/queue/queue.js +0 -384
  244. package/dist/src/queue/queue.js.map +0 -1
  245. package/dist/src/queue/types.js +0 -19
  246. package/dist/src/queue/types.js.map +0 -1
  247. package/dist/src/read-models/base-read-model.js +0 -143
  248. package/dist/src/read-models/base-read-model.js.map +0 -1
  249. package/dist/src/read-models/coordinator.js +0 -72
  250. package/dist/src/read-models/coordinator.js.map +0 -1
  251. package/dist/src/read-models/document-view.js +0 -375
  252. package/dist/src/read-models/document-view.js.map +0 -1
  253. package/dist/src/read-models/interfaces.js +0 -2
  254. package/dist/src/read-models/interfaces.js.map +0 -1
  255. package/dist/src/read-models/types.js +0 -2
  256. package/dist/src/read-models/types.js.map +0 -1
  257. package/dist/src/registry/implementation.js +0 -216
  258. package/dist/src/registry/implementation.js.map +0 -1
  259. package/dist/src/registry/index.js +0 -2
  260. package/dist/src/registry/index.js.map +0 -1
  261. package/dist/src/registry/interfaces.js +0 -2
  262. package/dist/src/registry/interfaces.js.map +0 -1
  263. package/dist/src/shared/awaiter.js +0 -123
  264. package/dist/src/shared/awaiter.js.map +0 -1
  265. package/dist/src/shared/consistency-tracker.js +0 -123
  266. package/dist/src/shared/consistency-tracker.js.map +0 -1
  267. package/dist/src/shared/errors.js +0 -75
  268. package/dist/src/shared/errors.js.map +0 -1
  269. package/dist/src/shared/factories.js +0 -33
  270. package/dist/src/shared/factories.js.map +0 -1
  271. package/dist/src/shared/types.js +0 -38
  272. package/dist/src/shared/types.js.map +0 -1
  273. package/dist/src/shared/utils.js +0 -8
  274. package/dist/src/shared/utils.js.map +0 -1
  275. package/dist/src/signer/passthrough-signer.js +0 -19
  276. package/dist/src/signer/passthrough-signer.js.map +0 -1
  277. package/dist/src/signer/types.js +0 -2
  278. package/dist/src/signer/types.js.map +0 -1
  279. package/dist/src/storage/consistency-aware-legacy-storage.d.ts +0 -33
  280. package/dist/src/storage/consistency-aware-legacy-storage.d.ts.map +0 -1
  281. package/dist/src/storage/consistency-aware-legacy-storage.js +0 -65
  282. package/dist/src/storage/consistency-aware-legacy-storage.js.map +0 -1
  283. package/dist/src/storage/index.js +0 -3
  284. package/dist/src/storage/index.js.map +0 -1
  285. package/dist/src/storage/interfaces.js +0 -19
  286. package/dist/src/storage/interfaces.js.map +0 -1
  287. package/dist/src/storage/kysely/document-indexer.js +0 -350
  288. package/dist/src/storage/kysely/document-indexer.js.map +0 -1
  289. package/dist/src/storage/kysely/keyframe-store.js +0 -64
  290. package/dist/src/storage/kysely/keyframe-store.js.map +0 -1
  291. package/dist/src/storage/kysely/store.js +0 -233
  292. package/dist/src/storage/kysely/store.js.map +0 -1
  293. package/dist/src/storage/kysely/sync-cursor-storage.js +0 -93
  294. package/dist/src/storage/kysely/sync-cursor-storage.js.map +0 -1
  295. package/dist/src/storage/kysely/sync-remote-storage.js +0 -133
  296. package/dist/src/storage/kysely/sync-remote-storage.js.map +0 -1
  297. package/dist/src/storage/kysely/types.js +0 -2
  298. package/dist/src/storage/kysely/types.js.map +0 -1
  299. package/dist/src/storage/migrations/001_create_operation_table.js +0 -41
  300. package/dist/src/storage/migrations/001_create_operation_table.js.map +0 -1
  301. package/dist/src/storage/migrations/002_create_keyframe_table.js +0 -27
  302. package/dist/src/storage/migrations/002_create_keyframe_table.js.map +0 -1
  303. package/dist/src/storage/migrations/003_create_document_table.js +0 -10
  304. package/dist/src/storage/migrations/003_create_document_table.js.map +0 -1
  305. package/dist/src/storage/migrations/004_create_document_relationship_table.js +0 -35
  306. package/dist/src/storage/migrations/004_create_document_relationship_table.js.map +0 -1
  307. package/dist/src/storage/migrations/005_create_indexer_state_table.js +0 -10
  308. package/dist/src/storage/migrations/005_create_indexer_state_table.js.map +0 -1
  309. package/dist/src/storage/migrations/006_create_document_snapshot_table.js +0 -49
  310. package/dist/src/storage/migrations/006_create_document_snapshot_table.js.map +0 -1
  311. package/dist/src/storage/migrations/007_create_slug_mapping_table.js +0 -24
  312. package/dist/src/storage/migrations/007_create_slug_mapping_table.js.map +0 -1
  313. package/dist/src/storage/migrations/008_create_view_state_table.js +0 -10
  314. package/dist/src/storage/migrations/008_create_view_state_table.js.map +0 -1
  315. package/dist/src/storage/migrations/009_create_operation_index_tables.js +0 -50
  316. package/dist/src/storage/migrations/009_create_operation_index_tables.js.map +0 -1
  317. package/dist/src/storage/migrations/010_create_sync_tables.js +0 -43
  318. package/dist/src/storage/migrations/010_create_sync_tables.js.map +0 -1
  319. package/dist/src/storage/migrations/index.js +0 -3
  320. package/dist/src/storage/migrations/index.js.map +0 -1
  321. package/dist/src/storage/migrations/migrator.js +0 -78
  322. package/dist/src/storage/migrations/migrator.js.map +0 -1
  323. package/dist/src/storage/migrations/run-migrations.js +0 -58
  324. package/dist/src/storage/migrations/run-migrations.js.map +0 -1
  325. package/dist/src/storage/migrations/types.js +0 -2
  326. package/dist/src/storage/migrations/types.js.map +0 -1
  327. package/dist/src/storage/txn.js +0 -42
  328. package/dist/src/storage/txn.js.map +0 -1
  329. package/dist/src/subs/default-error-handler.js +0 -27
  330. package/dist/src/subs/default-error-handler.js.map +0 -1
  331. package/dist/src/subs/react-subscription-manager.js +0 -185
  332. package/dist/src/subs/react-subscription-manager.js.map +0 -1
  333. package/dist/src/subs/subscription-notification-read-model.js +0 -62
  334. package/dist/src/subs/subscription-notification-read-model.js.map +0 -1
  335. package/dist/src/subs/types.js +0 -2
  336. package/dist/src/subs/types.js.map +0 -1
  337. package/dist/src/sync/channels/composite-channel-factory.d.ts +0 -30
  338. package/dist/src/sync/channels/composite-channel-factory.d.ts.map +0 -1
  339. package/dist/src/sync/channels/composite-channel-factory.js +0 -87
  340. package/dist/src/sync/channels/composite-channel-factory.js.map +0 -1
  341. package/dist/src/sync/channels/gql-channel-factory.d.ts +0 -25
  342. package/dist/src/sync/channels/gql-channel-factory.d.ts.map +0 -1
  343. package/dist/src/sync/channels/gql-channel-factory.js +0 -76
  344. package/dist/src/sync/channels/gql-channel-factory.js.map +0 -1
  345. package/dist/src/sync/channels/gql-channel.d.ts +0 -118
  346. package/dist/src/sync/channels/gql-channel.d.ts.map +0 -1
  347. package/dist/src/sync/channels/gql-channel.js +0 -423
  348. package/dist/src/sync/channels/gql-channel.js.map +0 -1
  349. package/dist/src/sync/channels/index.js +0 -6
  350. package/dist/src/sync/channels/index.js.map +0 -1
  351. package/dist/src/sync/channels/polling-channel.d.ts +0 -39
  352. package/dist/src/sync/channels/polling-channel.d.ts.map +0 -1
  353. package/dist/src/sync/channels/polling-channel.js +0 -72
  354. package/dist/src/sync/channels/polling-channel.js.map +0 -1
  355. package/dist/src/sync/channels/utils.js +0 -96
  356. package/dist/src/sync/channels/utils.js.map +0 -1
  357. package/dist/src/sync/errors.js +0 -17
  358. package/dist/src/sync/errors.js.map +0 -1
  359. package/dist/src/sync/index.js +0 -9
  360. package/dist/src/sync/index.js.map +0 -1
  361. package/dist/src/sync/interfaces.js +0 -2
  362. package/dist/src/sync/interfaces.js.map +0 -1
  363. package/dist/src/sync/mailbox.js +0 -59
  364. package/dist/src/sync/mailbox.js.map +0 -1
  365. package/dist/src/sync/sync-builder.js +0 -39
  366. package/dist/src/sync/sync-builder.js.map +0 -1
  367. package/dist/src/sync/sync-manager.js +0 -266
  368. package/dist/src/sync/sync-manager.js.map +0 -1
  369. package/dist/src/sync/sync-operation.js +0 -63
  370. package/dist/src/sync/sync-operation.js.map +0 -1
  371. package/dist/src/sync/types.js +0 -16
  372. package/dist/src/sync/types.js.map +0 -1
  373. package/dist/src/sync/utils.js +0 -78
  374. package/dist/src/sync/utils.js.map +0 -1
  375. package/dist/src/utils/reshuffle.js +0 -47
  376. package/dist/src/utils/reshuffle.js.map +0 -1
@@ -1,981 +0,0 @@
1
- import { addRelationshipAction, createDocumentAction, deleteDocumentAction, removeRelationshipAction, upgradeDocumentAction, } from "#actions/index.js";
2
- import { AbortError } from "document-drive";
3
- import { v4 as uuidv4 } from "uuid";
4
- import { createMutableShutdownStatus } from "../shared/factories.js";
5
- import { JobStatus } from "../shared/types.js";
6
- import { matchesScope } from "../shared/utils.js";
7
- import { filterByType, getSharedScope, signAction, signActions, toErrorInfo, topologicalSort, validateActionScopes, validateBatchRequest, } from "./utils.js";
8
- /**
9
- * This class implements the IReactor interface and serves as the main entry point
10
- * for the new Reactor architecture.
11
- */
12
- export class Reactor {
13
- logger;
14
- driveServer;
15
- documentStorage;
16
- shutdownStatus;
17
- setShutdown;
18
- queue;
19
- jobTracker;
20
- readModelCoordinator;
21
- features;
22
- documentView;
23
- _documentIndexer;
24
- operationStore;
25
- constructor(logger, driveServer, documentStorage, queue, jobTracker, readModelCoordinator, features, documentView, documentIndexer, operationStore) {
26
- // Store required dependencies
27
- this.logger = logger;
28
- this.driveServer = driveServer;
29
- this.documentStorage = documentStorage;
30
- this.queue = queue;
31
- this.jobTracker = jobTracker;
32
- this.readModelCoordinator = readModelCoordinator;
33
- this.features = features;
34
- this.documentView = documentView;
35
- this._documentIndexer = documentIndexer;
36
- this.operationStore = operationStore;
37
- // Create mutable shutdown status using factory method
38
- const [status, setter] = createMutableShutdownStatus(false);
39
- this.shutdownStatus = status;
40
- this.setShutdown = setter;
41
- this.logger.verbose("Reactor({ legacyStorage: @legacy })", features.legacyStorageEnabled);
42
- this.readModelCoordinator.start();
43
- }
44
- /**
45
- * Signals that the reactor should shutdown.
46
- */
47
- kill() {
48
- this.logger.verbose("kill()");
49
- // Mark the reactor as shutdown
50
- this.setShutdown(true);
51
- // Stop the read model coordinator
52
- this.readModelCoordinator.stop();
53
- // Stop the job tracker
54
- this.jobTracker.shutdown();
55
- return this.shutdownStatus;
56
- }
57
- /**
58
- * Retrieves a list of document model specifications
59
- */
60
- getDocumentModels(namespace, paging, signal) {
61
- this.logger.verbose("getDocumentModels(@namespace, @paging)", namespace, paging);
62
- // Get document model modules from the drive server + filter
63
- const modules = this.driveServer.getDocumentModelModules();
64
- const filteredModels = modules.filter((module) => !namespace || module.documentModel.global.id.startsWith(namespace));
65
- // Apply paging
66
- const startIndex = paging ? parseInt(paging.cursor) || 0 : 0;
67
- const limit = paging?.limit || filteredModels.length;
68
- const pagedModels = filteredModels.slice(startIndex, startIndex + limit);
69
- // Create paged results
70
- const hasMore = startIndex + limit < filteredModels.length;
71
- const nextCursor = hasMore ? String(startIndex + limit) : undefined;
72
- // even thought this is currently synchronous, they could have passed in an already-aborted signal
73
- if (signal?.aborted) {
74
- throw new AbortError();
75
- }
76
- return Promise.resolve({
77
- results: pagedModels,
78
- options: paging || { cursor: "0", limit: filteredModels.length },
79
- nextCursor,
80
- next: hasMore
81
- ? () => this.getDocumentModels(namespace, { cursor: nextCursor, limit }, signal)
82
- : undefined,
83
- });
84
- }
85
- /**
86
- * Retrieves a specific PHDocument by id
87
- */
88
- async get(id, view, consistencyToken, signal) {
89
- this.logger.verbose("get(@id, @view)", id, view);
90
- if (this.features.legacyStorageEnabled) {
91
- const document = await this.documentStorage.get(id, consistencyToken, signal);
92
- if (signal?.aborted) {
93
- throw new AbortError();
94
- }
95
- const childIds = await this.documentStorage.getChildren(id, consistencyToken, signal);
96
- if (signal?.aborted) {
97
- throw new AbortError();
98
- }
99
- for (const scope in document.state) {
100
- if (!matchesScope(view, scope)) {
101
- delete document.state[scope];
102
- }
103
- }
104
- return {
105
- document,
106
- childIds,
107
- };
108
- }
109
- else {
110
- const document = await this.documentView.get(id, view, consistencyToken, signal);
111
- if (signal?.aborted) {
112
- throw new AbortError();
113
- }
114
- const relationships = await this._documentIndexer.getOutgoing(id, ["child"], consistencyToken, signal);
115
- if (signal?.aborted) {
116
- throw new AbortError();
117
- }
118
- const childIds = relationships.map((rel) => rel.targetId);
119
- return {
120
- document,
121
- childIds,
122
- };
123
- }
124
- }
125
- /**
126
- * Retrieves a specific PHDocument by slug
127
- */
128
- async getBySlug(slug, view, consistencyToken, signal) {
129
- this.logger.verbose("getBySlug(@slug, @view)", slug, view);
130
- if (this.features.legacyStorageEnabled) {
131
- let ids;
132
- try {
133
- ids = await this.documentStorage.resolveIds([slug], consistencyToken, signal);
134
- }
135
- catch (error) {
136
- if (error instanceof Error && error.message.includes("not found")) {
137
- throw new Error(`Document not found with slug: ${slug}`);
138
- }
139
- throw error;
140
- }
141
- if (ids.length === 0 || !ids[0]) {
142
- throw new Error(`Document not found with slug: ${slug}`);
143
- }
144
- return await this.get(ids[0], view, consistencyToken, signal);
145
- }
146
- else {
147
- const documentId = await this.documentView.resolveSlug(slug, view, consistencyToken, signal);
148
- if (!documentId) {
149
- throw new Error(`Document not found with slug: ${slug}`);
150
- }
151
- return await this.get(documentId, view, consistencyToken, signal);
152
- }
153
- }
154
- /**
155
- * Retrieves a specific PHDocument by identifier (either id or slug)
156
- */
157
- async getByIdOrSlug(identifier, view, consistencyToken, signal) {
158
- this.logger.verbose("getByIdOrSlug(@identifier, @view)", identifier, view);
159
- if (this.features.legacyStorageEnabled) {
160
- try {
161
- return await this.get(identifier, view, consistencyToken, signal);
162
- }
163
- catch {
164
- try {
165
- const ids = await this.documentStorage.resolveIds([identifier], consistencyToken, signal);
166
- if (ids.length === 0 || !ids[0]) {
167
- throw new Error(`Document not found: ${identifier}`);
168
- }
169
- return await this.get(ids[0], view, consistencyToken, signal);
170
- }
171
- catch {
172
- throw new Error(`Document not found: ${identifier}`);
173
- }
174
- }
175
- }
176
- else {
177
- const document = await this.documentView.getByIdOrSlug(identifier, view, consistencyToken, signal);
178
- if (signal?.aborted) {
179
- throw new AbortError();
180
- }
181
- const relationships = await this._documentIndexer.getOutgoing(document.header.id, ["child"], consistencyToken, signal);
182
- if (signal?.aborted) {
183
- throw new AbortError();
184
- }
185
- const childIds = relationships.map((rel) => rel.targetId);
186
- return {
187
- document,
188
- childIds,
189
- };
190
- }
191
- }
192
- /**
193
- * Retrieves the operations for a document
194
- */
195
- async getOperations(documentId, view, paging, consistencyToken, signal) {
196
- this.logger.verbose("getOperations(@documentId, @view, @paging)", documentId, view, paging);
197
- if (this.features.legacyStorageEnabled) {
198
- // Use storage directly to get the document
199
- const document = await this.documentStorage.get(documentId, consistencyToken, signal);
200
- if (signal?.aborted) {
201
- throw new AbortError();
202
- }
203
- const operations = document.operations;
204
- const result = {};
205
- // apply view filter, per scope -- this will be removed when we pass the viewfilter along
206
- // to the underlying store, but is here now for the interface.
207
- for (const scope in operations) {
208
- if (matchesScope(view, scope)) {
209
- const scopeOperations = operations[scope];
210
- // apply paging too
211
- const startIndex = paging ? parseInt(paging.cursor) || 0 : 0;
212
- const limit = paging?.limit || scopeOperations.length;
213
- const pagedOperations = scopeOperations.slice(startIndex, startIndex + limit);
214
- result[scope] = {
215
- results: pagedOperations,
216
- options: { cursor: String(startIndex + limit), limit },
217
- };
218
- }
219
- }
220
- return Promise.resolve(result);
221
- }
222
- else {
223
- // Use operation store to get operations
224
- const branch = view?.branch || "main";
225
- // Get all scopes for this document
226
- const revisions = await this.operationStore.getRevisions(documentId, branch, signal);
227
- if (signal?.aborted) {
228
- throw new AbortError();
229
- }
230
- const allScopes = Object.keys(revisions.revision);
231
- const result = {};
232
- // Filter scopes based on view filter and query operations for each
233
- for (const scope of allScopes) {
234
- if (!matchesScope(view, scope)) {
235
- continue;
236
- }
237
- if (signal?.aborted) {
238
- throw new AbortError();
239
- }
240
- // Get operations for this scope
241
- const scopeResult = await this.operationStore.getSince(documentId, scope, branch, -1, paging, signal);
242
- // Transform to Reactor's PagedResults format
243
- const currentCursor = paging?.cursor ? parseInt(paging.cursor) : 0;
244
- const currentLimit = paging?.limit || 100;
245
- result[scope] = {
246
- results: scopeResult.items,
247
- options: {
248
- cursor: scopeResult.nextCursor || String(currentCursor),
249
- limit: currentLimit,
250
- },
251
- nextCursor: scopeResult.nextCursor,
252
- next: scopeResult.hasMore
253
- ? async () => {
254
- const nextPage = await this.getOperations(documentId, view, {
255
- cursor: scopeResult.nextCursor,
256
- limit: currentLimit,
257
- }, consistencyToken, signal);
258
- return nextPage[scope];
259
- }
260
- : undefined,
261
- };
262
- }
263
- return result;
264
- }
265
- }
266
- /**
267
- * Filters documents by criteria and returns a list of them
268
- */
269
- async find(search, view, paging, consistencyToken, signal) {
270
- this.logger.verbose("find(@search, @view, @paging)", search, view, paging);
271
- let results;
272
- if (search.ids) {
273
- if (search.slugs && search.slugs.length > 0) {
274
- throw new Error("Cannot use both ids and slugs in the same search");
275
- }
276
- results = await this.findByIds(search.ids, view, paging, consistencyToken, signal);
277
- if (search.type) {
278
- results = filterByType(results, search.type);
279
- }
280
- }
281
- else if (search.slugs) {
282
- results = await this.findBySlugs(search.slugs, view, paging, consistencyToken, signal);
283
- if (search.type) {
284
- results = filterByType(results, search.type);
285
- }
286
- }
287
- else if (search.parentId) {
288
- results = await this.findByParentId(search.parentId, view, paging, signal);
289
- if (search.type) {
290
- results = filterByType(results, search.type);
291
- }
292
- }
293
- else if (search.type) {
294
- results = await this.findByType(search.type, view, paging, consistencyToken, signal);
295
- }
296
- else {
297
- throw new Error("No search criteria provided");
298
- }
299
- if (signal?.aborted) {
300
- throw new AbortError();
301
- }
302
- return results;
303
- }
304
- /**
305
- * Creates a document
306
- */
307
- async create(document, signer, signal, meta) {
308
- this.logger.verbose("create(@id, @type, @slug)", document.header.id, document.header.documentType, document.header.slug);
309
- const createdAtUtcIso = new Date().toISOString();
310
- if (signal?.aborted) {
311
- throw new AbortError();
312
- }
313
- const createInput = {
314
- model: document.header.documentType,
315
- version: 0,
316
- documentId: document.header.id,
317
- signing: {
318
- signature: document.header.id,
319
- publicKey: document.header.sig.publicKey,
320
- nonce: document.header.sig.nonce,
321
- createdAtUtcIso: document.header.createdAtUtcIso,
322
- documentType: document.header.documentType,
323
- },
324
- slug: document.header.slug,
325
- name: document.header.name,
326
- branch: document.header.branch,
327
- meta: document.header.meta,
328
- protocolVersions: document.header.protocolVersions ?? {
329
- "base-reducer": 2,
330
- },
331
- };
332
- const createAction = createDocumentAction(createInput);
333
- const upgradeAction = upgradeDocumentAction({
334
- documentId: document.header.id,
335
- model: document.header.documentType,
336
- fromVersion: 0,
337
- toVersion: document.state.document.version,
338
- initialState: document.state,
339
- });
340
- // Sign actions if signer is provided
341
- let actions = [createAction, upgradeAction];
342
- if (signer) {
343
- actions = await signActions(actions, signer, signal);
344
- }
345
- // Create a single job with both CREATE_DOCUMENT and UPGRADE_DOCUMENT actions
346
- const job = {
347
- id: uuidv4(),
348
- kind: "mutation",
349
- documentId: document.header.id,
350
- scope: "document",
351
- branch: "main",
352
- actions,
353
- operations: [],
354
- createdAt: new Date().toISOString(),
355
- queueHint: [],
356
- maxRetries: 3,
357
- errorHistory: [],
358
- meta,
359
- };
360
- // Create job info and register with tracker
361
- const jobInfo = {
362
- id: job.id,
363
- status: JobStatus.PENDING,
364
- createdAtUtcIso,
365
- consistencyToken: {
366
- version: 1,
367
- createdAtUtcIso,
368
- coordinates: [],
369
- },
370
- meta,
371
- };
372
- this.jobTracker.registerJob(jobInfo);
373
- // Enqueue the job
374
- await this.queue.enqueue(job);
375
- return jobInfo;
376
- }
377
- /**
378
- * Deletes a document
379
- */
380
- async deleteDocument(id, signer, signal, meta) {
381
- this.logger.verbose("deleteDocument(@id)", id);
382
- const createdAtUtcIso = new Date().toISOString();
383
- if (signal?.aborted) {
384
- throw new AbortError();
385
- }
386
- let action = deleteDocumentAction(id);
387
- // Sign action if signer is provided
388
- if (signer) {
389
- action = await signAction(action, signer, signal);
390
- }
391
- const job = {
392
- id: uuidv4(),
393
- kind: "mutation",
394
- documentId: id,
395
- scope: "document",
396
- branch: "main",
397
- actions: [action],
398
- operations: [],
399
- createdAt: new Date().toISOString(),
400
- queueHint: [],
401
- maxRetries: 3,
402
- errorHistory: [],
403
- meta,
404
- };
405
- const jobInfo = {
406
- id: job.id,
407
- status: JobStatus.PENDING,
408
- createdAtUtcIso,
409
- consistencyToken: {
410
- version: 1,
411
- createdAtUtcIso,
412
- coordinates: [],
413
- },
414
- meta,
415
- };
416
- this.jobTracker.registerJob(jobInfo);
417
- await this.queue.enqueue(job);
418
- return jobInfo;
419
- }
420
- /**
421
- * Applies a list of actions to a document
422
- */
423
- async execute(docId, branch, actions, signal, meta) {
424
- this.logger.verbose("execute(@docId, @branch, @actions)", docId, branch, actions);
425
- if (signal?.aborted) {
426
- throw new AbortError();
427
- }
428
- const createdAtUtcIso = new Date().toISOString();
429
- // Determine scope from first action (all actions should have the same scope)
430
- const scope = actions.length > 0 ? actions[0].scope || "global" : "global";
431
- // Create a single job with all actions
432
- const job = {
433
- id: uuidv4(),
434
- kind: "mutation",
435
- documentId: docId,
436
- scope: scope,
437
- branch: branch,
438
- actions: actions,
439
- operations: [],
440
- createdAt: new Date().toISOString(),
441
- queueHint: [],
442
- maxRetries: 3,
443
- errorHistory: [],
444
- meta,
445
- };
446
- // Create job info and register with tracker
447
- const jobInfo = {
448
- id: job.id,
449
- status: JobStatus.PENDING,
450
- createdAtUtcIso,
451
- consistencyToken: {
452
- version: 1,
453
- createdAtUtcIso,
454
- coordinates: [],
455
- },
456
- meta,
457
- };
458
- this.jobTracker.registerJob(jobInfo);
459
- // Enqueue the job
460
- await this.queue.enqueue(job);
461
- if (signal?.aborted) {
462
- throw new AbortError();
463
- }
464
- return jobInfo;
465
- }
466
- /**
467
- * Imports pre-existing operations that were produced by another reactor.
468
- * This function may cause a reshuffle, which will generate additional
469
- * operations.
470
- */
471
- async load(docId, branch, operations, signal, meta) {
472
- this.logger.verbose("load(@docId, @branch, @count, @operations)", docId, branch, operations.length, operations);
473
- if (signal?.aborted) {
474
- throw new AbortError();
475
- }
476
- if (operations.length === 0) {
477
- throw new Error("load requires at least one operation");
478
- }
479
- // validate the operations
480
- const scope = getSharedScope(operations);
481
- operations.forEach((operation, index) => {
482
- if (!operation.timestampUtcMs) {
483
- throw new Error(`Operation at position ${index} is missing timestampUtcMs`);
484
- }
485
- });
486
- const createdAtUtcIso = new Date().toISOString();
487
- const job = {
488
- id: uuidv4(),
489
- kind: "load",
490
- documentId: docId,
491
- scope,
492
- branch,
493
- actions: [],
494
- operations,
495
- createdAt: createdAtUtcIso,
496
- queueHint: [],
497
- maxRetries: 3,
498
- errorHistory: [],
499
- meta,
500
- };
501
- const jobInfo = {
502
- id: job.id,
503
- status: JobStatus.PENDING,
504
- createdAtUtcIso,
505
- consistencyToken: {
506
- version: 1,
507
- createdAtUtcIso,
508
- coordinates: [],
509
- },
510
- meta,
511
- };
512
- this.jobTracker.registerJob(jobInfo);
513
- await this.queue.enqueue(job);
514
- if (signal?.aborted) {
515
- throw new AbortError();
516
- }
517
- return jobInfo;
518
- }
519
- /**
520
- * Applies multiple mutations across documents with dependency management
521
- */
522
- async executeBatch(request, signal, meta) {
523
- this.logger.verbose("executeBatch(@count jobs)", request.jobs.length);
524
- if (signal?.aborted) {
525
- throw new AbortError();
526
- }
527
- validateBatchRequest(request.jobs);
528
- for (const jobPlan of request.jobs) {
529
- validateActionScopes(jobPlan);
530
- }
531
- const createdAtUtcIso = new Date().toISOString();
532
- const planKeyToJobId = new Map();
533
- for (const jobPlan of request.jobs) {
534
- planKeyToJobId.set(jobPlan.key, uuidv4());
535
- }
536
- const jobInfos = new Map();
537
- for (const jobPlan of request.jobs) {
538
- const jobId = planKeyToJobId.get(jobPlan.key);
539
- const jobInfo = {
540
- id: jobId,
541
- status: JobStatus.PENDING,
542
- createdAtUtcIso,
543
- consistencyToken: {
544
- version: 1,
545
- createdAtUtcIso,
546
- coordinates: [],
547
- },
548
- meta,
549
- };
550
- this.jobTracker.registerJob(jobInfo);
551
- jobInfos.set(jobPlan.key, jobInfo);
552
- }
553
- const sortedKeys = topologicalSort(request.jobs);
554
- const enqueuedKeys = [];
555
- try {
556
- for (const key of sortedKeys) {
557
- if (signal?.aborted) {
558
- throw new AbortError();
559
- }
560
- const jobPlan = request.jobs.find((j) => j.key === key);
561
- const jobId = planKeyToJobId.get(key);
562
- const queueHint = jobPlan.dependsOn.map((depKey) => planKeyToJobId.get(depKey));
563
- const job = {
564
- id: jobId,
565
- kind: "mutation",
566
- documentId: jobPlan.documentId,
567
- scope: jobPlan.scope,
568
- branch: jobPlan.branch,
569
- actions: jobPlan.actions,
570
- operations: [],
571
- createdAt: createdAtUtcIso,
572
- queueHint,
573
- maxRetries: 3,
574
- errorHistory: [],
575
- meta,
576
- };
577
- await this.queue.enqueue(job);
578
- enqueuedKeys.push(key);
579
- }
580
- }
581
- catch (error) {
582
- for (const key of enqueuedKeys) {
583
- const jobId = planKeyToJobId.get(key);
584
- try {
585
- await this.queue.remove(jobId);
586
- }
587
- catch {
588
- // Ignore removal errors during cleanup
589
- }
590
- }
591
- for (const jobInfo of jobInfos.values()) {
592
- this.jobTracker.markFailed(jobInfo.id, toErrorInfo("Batch enqueue failed"));
593
- }
594
- throw error;
595
- }
596
- const result = {
597
- jobs: Object.fromEntries(jobInfos),
598
- };
599
- return result;
600
- }
601
- /**
602
- * Adds multiple documents as children to another
603
- */
604
- async addChildren(parentId, documentIds, branch = "main", signer, signal) {
605
- this.logger.verbose("addChildren(@parentId, @count children, @branch)", parentId, documentIds.length, branch);
606
- if (signal?.aborted) {
607
- throw new AbortError();
608
- }
609
- let actions = documentIds.map((childId) => addRelationshipAction(parentId, childId, "child"));
610
- // Sign actions if signer is provided
611
- if (signer) {
612
- actions = await signActions(actions, signer, signal);
613
- }
614
- return await this.execute(parentId, branch, actions, signal);
615
- }
616
- /**
617
- * Removes multiple documents as children from another
618
- */
619
- async removeChildren(parentId, documentIds, branch = "main", signer, signal) {
620
- this.logger.verbose("removeChildren(@parentId, @count children, @branch)", parentId, documentIds.length, branch);
621
- if (signal?.aborted) {
622
- throw new AbortError();
623
- }
624
- let actions = documentIds.map((childId) => removeRelationshipAction(parentId, childId, "child"));
625
- // Sign actions if signer is provided
626
- if (signer) {
627
- actions = await signActions(actions, signer, signal);
628
- }
629
- return await this.execute(parentId, branch, actions, signal);
630
- }
631
- /**
632
- * Retrieves the status of a job
633
- */
634
- getJobStatus(jobId, signal) {
635
- this.logger.verbose("getJobStatus(@jobId)", jobId);
636
- if (signal?.aborted) {
637
- throw new AbortError();
638
- }
639
- const jobInfo = this.jobTracker.getJobStatus(jobId);
640
- if (!jobInfo) {
641
- // Job not found - return FAILED status with appropriate error
642
- const now = new Date().toISOString();
643
- return Promise.resolve({
644
- id: jobId,
645
- status: JobStatus.FAILED,
646
- createdAtUtcIso: now,
647
- completedAtUtcIso: now,
648
- error: toErrorInfo("Job not found"),
649
- consistencyToken: {
650
- version: 1,
651
- createdAtUtcIso: now,
652
- coordinates: [],
653
- },
654
- });
655
- }
656
- return Promise.resolve(jobInfo);
657
- }
658
- /**
659
- * Finds documents by their IDs
660
- */
661
- async findByIds(ids, view, paging, consistencyToken, signal) {
662
- this.logger.verbose("findByIds(@count ids)", ids.length);
663
- if (consistencyToken) {
664
- await this.documentView.waitForConsistency(consistencyToken, undefined, signal);
665
- }
666
- if (this.features.legacyStorageEnabled) {
667
- const documents = [];
668
- // Fetch each document by ID using storage directly
669
- for (const id of ids) {
670
- if (signal?.aborted) {
671
- throw new AbortError();
672
- }
673
- let document;
674
- try {
675
- document = await this.documentStorage.get(id, consistencyToken, signal);
676
- }
677
- catch {
678
- // Skip documents that don't exist or can't be accessed
679
- // This matches the behavior expected from a search operation
680
- continue;
681
- }
682
- // Apply view filter - This will be removed when we pass the viewfilter along
683
- // to the underlying store, but is here now for the interface.
684
- for (const scope in document.state) {
685
- if (!matchesScope(view, scope)) {
686
- delete document.state[scope];
687
- }
688
- }
689
- documents.push(document);
690
- }
691
- if (signal?.aborted) {
692
- throw new AbortError();
693
- }
694
- // Apply paging
695
- const startIndex = paging ? parseInt(paging.cursor) || 0 : 0;
696
- const limit = paging?.limit || documents.length;
697
- const pagedDocuments = documents.slice(startIndex, startIndex + limit);
698
- // Create paged results
699
- const hasMore = startIndex + limit < documents.length;
700
- const nextCursor = hasMore ? String(startIndex + limit) : undefined;
701
- return {
702
- results: pagedDocuments,
703
- options: paging || { cursor: "0", limit: documents.length },
704
- nextCursor,
705
- next: hasMore
706
- ? () => this.findByIds(ids, view, { cursor: nextCursor, limit }, consistencyToken, signal)
707
- : undefined,
708
- };
709
- }
710
- else {
711
- const documents = [];
712
- // Fetch each document by ID using documentView
713
- for (const id of ids) {
714
- if (signal?.aborted) {
715
- throw new AbortError();
716
- }
717
- try {
718
- const document = await this.documentView.get(id, view, undefined, signal);
719
- documents.push(document);
720
- }
721
- catch {
722
- // Skip documents that don't exist or can't be accessed
723
- continue;
724
- }
725
- }
726
- if (signal?.aborted) {
727
- throw new AbortError();
728
- }
729
- // Apply paging
730
- const startIndex = paging ? parseInt(paging.cursor) || 0 : 0;
731
- const limit = paging?.limit || documents.length;
732
- const pagedDocuments = documents.slice(startIndex, startIndex + limit);
733
- // Create paged results
734
- const hasMore = startIndex + limit < documents.length;
735
- const nextCursor = hasMore ? String(startIndex + limit) : undefined;
736
- return {
737
- results: pagedDocuments,
738
- options: paging || { cursor: "0", limit: documents.length },
739
- nextCursor,
740
- next: hasMore
741
- ? () => this.findByIds(ids, view, { cursor: nextCursor, limit }, consistencyToken, signal)
742
- : undefined,
743
- };
744
- }
745
- }
746
- /**
747
- * Finds documents by their slugs
748
- */
749
- async findBySlugs(slugs, view, paging, consistencyToken, signal) {
750
- this.logger.verbose("findBySlugs(@count slugs)", slugs.length);
751
- if (consistencyToken) {
752
- await this.documentView.waitForConsistency(consistencyToken, undefined, signal);
753
- }
754
- if (this.features.legacyStorageEnabled) {
755
- const documents = [];
756
- // Use storage to resolve slugs to IDs
757
- let ids;
758
- try {
759
- ids = await this.documentStorage.resolveIds(slugs, consistencyToken, signal);
760
- }
761
- catch {
762
- // If slug resolution fails, return empty results
763
- // This matches the behavior expected from a search operation
764
- ids = [];
765
- }
766
- // Fetch each document by resolved ID
767
- for (const id of ids) {
768
- if (signal?.aborted) {
769
- throw new AbortError();
770
- }
771
- let document;
772
- try {
773
- document = await this.documentStorage.get(id, consistencyToken, signal);
774
- }
775
- catch {
776
- // Skip documents that don't exist or can't be accessed
777
- continue;
778
- }
779
- // Apply view filter - This will be removed when we pass the viewfilter along
780
- // to the underlying store, but is here now for the interface.
781
- for (const scope in document.state) {
782
- if (!matchesScope(view, scope)) {
783
- delete document.state[scope];
784
- }
785
- }
786
- documents.push(document);
787
- }
788
- if (signal?.aborted) {
789
- throw new AbortError();
790
- }
791
- // Apply paging - this will be removed when we pass the paging along
792
- // to the underlying store, but is here now for the interface.
793
- const startIndex = paging ? parseInt(paging.cursor) || 0 : 0;
794
- const limit = paging?.limit || documents.length;
795
- const pagedDocuments = documents.slice(startIndex, startIndex + limit);
796
- // Create paged results
797
- const hasMore = startIndex + limit < documents.length;
798
- const nextCursor = hasMore ? String(startIndex + limit) : undefined;
799
- return {
800
- results: pagedDocuments,
801
- options: paging || { cursor: "0", limit: documents.length },
802
- nextCursor,
803
- next: hasMore
804
- ? () => this.findBySlugs(slugs, view, { cursor: nextCursor, limit }, consistencyToken, signal)
805
- : undefined,
806
- };
807
- }
808
- else {
809
- const documents = [];
810
- // Resolve each slug to a document ID
811
- const documentIds = [];
812
- for (const slug of slugs) {
813
- if (signal?.aborted) {
814
- throw new AbortError();
815
- }
816
- const documentId = await this.documentView.resolveSlug(slug, view, undefined, signal);
817
- if (documentId) {
818
- documentIds.push(documentId);
819
- }
820
- }
821
- // Fetch each document
822
- for (const documentId of documentIds) {
823
- if (signal?.aborted) {
824
- throw new AbortError();
825
- }
826
- try {
827
- const document = await this.documentView.get(documentId, view, undefined, signal);
828
- documents.push(document);
829
- }
830
- catch {
831
- // Skip documents that don't exist or can't be accessed
832
- continue;
833
- }
834
- }
835
- if (signal?.aborted) {
836
- throw new AbortError();
837
- }
838
- // Apply paging
839
- const startIndex = paging ? parseInt(paging.cursor) || 0 : 0;
840
- const limit = paging?.limit || documents.length;
841
- const pagedDocuments = documents.slice(startIndex, startIndex + limit);
842
- // Create paged results
843
- const hasMore = startIndex + limit < documents.length;
844
- const nextCursor = hasMore ? String(startIndex + limit) : undefined;
845
- return {
846
- results: pagedDocuments,
847
- options: paging || { cursor: "0", limit: documents.length },
848
- nextCursor,
849
- next: hasMore
850
- ? () => this.findBySlugs(slugs, view, { cursor: nextCursor, limit }, consistencyToken, signal)
851
- : undefined,
852
- };
853
- }
854
- }
855
- /**
856
- * Finds documents by parent ID
857
- */
858
- async findByParentId(parentId, view, paging, signal) {
859
- this.logger.verbose("findByParentId(@parentId)", parentId);
860
- // Get child relationships from indexer
861
- const relationships = await this._documentIndexer.getOutgoing(parentId, ["child"], undefined, signal);
862
- if (signal?.aborted) {
863
- throw new AbortError();
864
- }
865
- const documents = [];
866
- // Fetch each child document using the appropriate storage method
867
- for (const relationship of relationships) {
868
- if (signal?.aborted) {
869
- throw new AbortError();
870
- }
871
- try {
872
- let document;
873
- if (this.features.legacyStorageEnabled) {
874
- document = await this.documentStorage.get(relationship.targetId);
875
- // Apply view filter for legacy storage
876
- for (const scope in document.state) {
877
- if (!matchesScope(view, scope)) {
878
- delete document.state[scope];
879
- }
880
- }
881
- }
882
- else {
883
- document = await this.documentView.get(relationship.targetId, view, undefined, signal);
884
- }
885
- documents.push(document);
886
- }
887
- catch {
888
- // Skip documents that don't exist or can't be accessed
889
- continue;
890
- }
891
- }
892
- if (signal?.aborted) {
893
- throw new AbortError();
894
- }
895
- // Apply paging
896
- const startIndex = paging ? parseInt(paging.cursor) || 0 : 0;
897
- const limit = paging?.limit || documents.length;
898
- const pagedDocuments = documents.slice(startIndex, startIndex + limit);
899
- // Create paged results
900
- const hasMore = startIndex + limit < documents.length;
901
- const nextCursor = hasMore ? String(startIndex + limit) : undefined;
902
- return {
903
- results: pagedDocuments,
904
- options: paging || { cursor: "0", limit: documents.length },
905
- nextCursor,
906
- next: hasMore
907
- ? () => this.findByParentId(parentId, view, { cursor: nextCursor, limit }, signal)
908
- : undefined,
909
- };
910
- }
911
- /**
912
- * Finds documents by type
913
- */
914
- async findByType(type, view, paging, consistencyToken, signal) {
915
- this.logger.verbose("findByType(@type)", type);
916
- if (consistencyToken) {
917
- await this.documentView.waitForConsistency(consistencyToken, undefined, signal);
918
- }
919
- if (this.features.legacyStorageEnabled) {
920
- const documents = [];
921
- // Use storage's findByType method directly
922
- const cursor = paging?.cursor;
923
- const limit = paging?.limit || 100;
924
- // Get document IDs of the specified type
925
- const { documents: documentIds, nextCursor } = await this.documentStorage.findByType(type, limit, cursor, consistencyToken, signal);
926
- if (signal?.aborted) {
927
- throw new AbortError();
928
- }
929
- // Fetch each document by its ID
930
- for (const documentId of documentIds) {
931
- if (signal?.aborted) {
932
- throw new AbortError();
933
- }
934
- let document;
935
- try {
936
- document = await this.documentStorage.get(documentId, consistencyToken, signal);
937
- }
938
- catch {
939
- // Skip documents that can't be retrieved
940
- continue;
941
- }
942
- // Apply view filter
943
- for (const scope in document.state) {
944
- if (!matchesScope(view, scope)) {
945
- delete document.state[scope];
946
- }
947
- }
948
- documents.push(document);
949
- }
950
- if (signal?.aborted) {
951
- throw new AbortError();
952
- }
953
- // Results are already paged from the storage layer
954
- return {
955
- results: documents,
956
- options: paging || { cursor: cursor || "0", limit },
957
- nextCursor,
958
- next: nextCursor
959
- ? async () => this.findByType(type, view, { cursor: nextCursor, limit }, consistencyToken, signal)
960
- : undefined,
961
- };
962
- }
963
- else {
964
- const result = await this.documentView.findByType(type, view, paging, consistencyToken, signal);
965
- if (signal?.aborted) {
966
- throw new AbortError();
967
- }
968
- const cursor = paging?.cursor;
969
- const limit = paging?.limit || 100;
970
- return {
971
- results: result.items,
972
- options: paging || { cursor: cursor || "0", limit },
973
- nextCursor: result.nextCursor,
974
- next: result.nextCursor
975
- ? async () => this.findByType(type, view, { cursor: result.nextCursor, limit }, consistencyToken, signal)
976
- : undefined,
977
- };
978
- }
979
- }
980
- }
981
- //# sourceMappingURL=reactor.js.map