@powerhousedao/reactor 4.1.0-dev.12 → 4.1.0-dev.121

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