@enbox/dwn-sdk-js 0.4.0 → 0.4.2

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 (522) hide show
  1. package/README.md +4 -4
  2. package/dist/browser.mjs +3 -10
  3. package/dist/browser.mjs.map +4 -4
  4. package/dist/esm/generated/precompiled-validators.js +799 -885
  5. package/dist/esm/generated/precompiled-validators.js.map +1 -1
  6. package/dist/esm/src/core/dwn-constant.js +5 -0
  7. package/dist/esm/src/core/dwn-constant.js.map +1 -1
  8. package/dist/esm/src/core/dwn-error.js +12 -4
  9. package/dist/esm/src/core/dwn-error.js.map +1 -1
  10. package/dist/esm/src/core/grant-authorization.js +9 -18
  11. package/dist/esm/src/core/grant-authorization.js.map +1 -1
  12. package/dist/esm/src/core/message-reply.js.map +1 -1
  13. package/dist/esm/src/core/messages-grant-authorization.js +28 -45
  14. package/dist/esm/src/core/messages-grant-authorization.js.map +1 -1
  15. package/dist/esm/src/core/protocol-authorization-action.js +25 -27
  16. package/dist/esm/src/core/protocol-authorization-action.js.map +1 -1
  17. package/dist/esm/src/core/protocol-authorization-validation.js +34 -89
  18. package/dist/esm/src/core/protocol-authorization-validation.js.map +1 -1
  19. package/dist/esm/src/core/protocol-authorization.js +44 -118
  20. package/dist/esm/src/core/protocol-authorization.js.map +1 -1
  21. package/dist/esm/src/core/protocols-grant-authorization.js +5 -5
  22. package/dist/esm/src/core/protocols-grant-authorization.js.map +1 -1
  23. package/dist/esm/src/core/recording-validation-state-reader.js +84 -0
  24. package/dist/esm/src/core/recording-validation-state-reader.js.map +1 -0
  25. package/dist/esm/src/core/records-grant-authorization.js +11 -11
  26. package/dist/esm/src/core/records-grant-authorization.js.map +1 -1
  27. package/dist/esm/src/core/replication-apply.js +123 -28
  28. package/dist/esm/src/core/replication-apply.js.map +1 -1
  29. package/dist/esm/src/core/resumable-task-manager.js +5 -4
  30. package/dist/esm/src/core/resumable-task-manager.js.map +1 -1
  31. package/dist/esm/src/core/validation-state-reader.js +237 -0
  32. package/dist/esm/src/core/validation-state-reader.js.map +1 -0
  33. package/dist/esm/src/dwn.js +165 -132
  34. package/dist/esm/src/dwn.js.map +1 -1
  35. package/dist/esm/src/enums/dwn-interface-method.js +0 -1
  36. package/dist/esm/src/enums/dwn-interface-method.js.map +1 -1
  37. package/dist/esm/src/event-stream/durable-event-log.js +365 -0
  38. package/dist/esm/src/event-stream/durable-event-log.js.map +1 -0
  39. package/dist/esm/src/event-stream/event-emitter-wake-publisher.js +25 -0
  40. package/dist/esm/src/event-stream/event-emitter-wake-publisher.js.map +1 -0
  41. package/dist/esm/src/handlers/messages-query.js +159 -0
  42. package/dist/esm/src/handlers/messages-query.js.map +1 -0
  43. package/dist/esm/src/handlers/messages-read.js +5 -5
  44. package/dist/esm/src/handlers/messages-read.js.map +1 -1
  45. package/dist/esm/src/handlers/messages-subscribe.js +8 -8
  46. package/dist/esm/src/handlers/messages-subscribe.js.map +1 -1
  47. package/dist/esm/src/handlers/protocols-configure.js +30 -49
  48. package/dist/esm/src/handlers/protocols-configure.js.map +1 -1
  49. package/dist/esm/src/handlers/protocols-query.js +1 -1
  50. package/dist/esm/src/handlers/protocols-query.js.map +1 -1
  51. package/dist/esm/src/handlers/records-count.js +20 -11
  52. package/dist/esm/src/handlers/records-count.js.map +1 -1
  53. package/dist/esm/src/handlers/records-delete.js +20 -16
  54. package/dist/esm/src/handlers/records-delete.js.map +1 -1
  55. package/dist/esm/src/handlers/records-query.js +35 -11
  56. package/dist/esm/src/handlers/records-query.js.map +1 -1
  57. package/dist/esm/src/handlers/records-read.js +52 -42
  58. package/dist/esm/src/handlers/records-read.js.map +1 -1
  59. package/dist/esm/src/handlers/records-subscribe.js +107 -11
  60. package/dist/esm/src/handlers/records-subscribe.js.map +1 -1
  61. package/dist/esm/src/handlers/records-write.js +62 -116
  62. package/dist/esm/src/handlers/records-write.js.map +1 -1
  63. package/dist/esm/src/index.js +6 -7
  64. package/dist/esm/src/index.js.map +1 -1
  65. package/dist/esm/src/interfaces/{messages-sync.js → messages-query.js} +21 -15
  66. package/dist/esm/src/interfaces/messages-query.js.map +1 -0
  67. package/dist/esm/src/interfaces/protocols-configure.js +12 -9
  68. package/dist/esm/src/interfaces/protocols-configure.js.map +1 -1
  69. package/dist/esm/src/interfaces/protocols-query.js +3 -4
  70. package/dist/esm/src/interfaces/protocols-query.js.map +1 -1
  71. package/dist/esm/src/interfaces/records-count.js +4 -3
  72. package/dist/esm/src/interfaces/records-count.js.map +1 -1
  73. package/dist/esm/src/interfaces/records-delete.js +21 -4
  74. package/dist/esm/src/interfaces/records-delete.js.map +1 -1
  75. package/dist/esm/src/interfaces/records-query.js +4 -3
  76. package/dist/esm/src/interfaces/records-query.js.map +1 -1
  77. package/dist/esm/src/interfaces/records-read.js +3 -3
  78. package/dist/esm/src/interfaces/records-read.js.map +1 -1
  79. package/dist/esm/src/interfaces/records-subscribe.js +4 -3
  80. package/dist/esm/src/interfaces/records-subscribe.js.map +1 -1
  81. package/dist/esm/src/interfaces/records-write.js +27 -13
  82. package/dist/esm/src/interfaces/records-write.js.map +1 -1
  83. package/dist/esm/src/protocols/permissions.js +27 -34
  84. package/dist/esm/src/protocols/permissions.js.map +1 -1
  85. package/dist/esm/src/store/index-level.js +24 -9
  86. package/dist/esm/src/store/index-level.js.map +1 -1
  87. package/dist/esm/src/store/level-wrapper.js +7 -0
  88. package/dist/esm/src/store/level-wrapper.js.map +1 -1
  89. package/dist/esm/src/store/message-store-level.js +536 -42
  90. package/dist/esm/src/store/message-store-level.js.map +1 -1
  91. package/dist/esm/src/store/storage-controller.js +58 -49
  92. package/dist/esm/src/store/storage-controller.js.map +1 -1
  93. package/dist/esm/src/types/message-types.js.map +1 -1
  94. package/dist/esm/src/types/validation-state-reader.js +2 -0
  95. package/dist/esm/src/types/validation-state-reader.js.map +1 -0
  96. package/dist/esm/src/utils/messages.js +17 -0
  97. package/dist/esm/src/utils/messages.js.map +1 -1
  98. package/dist/esm/src/utils/protocol-tags.js +262 -0
  99. package/dist/esm/src/utils/protocol-tags.js.map +1 -0
  100. package/dist/esm/src/utils/record-limit-occupancy.js +244 -0
  101. package/dist/esm/src/utils/record-limit-occupancy.js.map +1 -0
  102. package/dist/esm/src/utils/records.js +50 -14
  103. package/dist/esm/src/utils/records.js.map +1 -1
  104. package/dist/esm/src/utils/replication.js +85 -0
  105. package/dist/esm/src/utils/replication.js.map +1 -0
  106. package/dist/esm/tests/core/grant-authorization.spec.js +4 -4
  107. package/dist/esm/tests/core/grant-authorization.spec.js.map +1 -1
  108. package/dist/esm/tests/core/process-message-parity.spec.js +222 -0
  109. package/dist/esm/tests/core/process-message-parity.spec.js.map +1 -0
  110. package/dist/esm/tests/core/protocol-authorization.spec.js +5 -2
  111. package/dist/esm/tests/core/protocol-authorization.spec.js.map +1 -1
  112. package/dist/esm/tests/core/records-grant-authorization.spec.js +5 -5
  113. package/dist/esm/tests/core/records-grant-authorization.spec.js.map +1 -1
  114. package/dist/esm/tests/core/replication-apply.spec.js +55 -1
  115. package/dist/esm/tests/core/replication-apply.spec.js.map +1 -1
  116. package/dist/esm/tests/core/replication-replay-property.spec.js +350 -0
  117. package/dist/esm/tests/core/replication-replay-property.spec.js.map +1 -0
  118. package/dist/esm/tests/core/validation-read-closure.spec.js +469 -0
  119. package/dist/esm/tests/core/validation-read-closure.spec.js.map +1 -0
  120. package/dist/esm/tests/core/validation-state-reader.spec.js +716 -0
  121. package/dist/esm/tests/core/validation-state-reader.spec.js.map +1 -0
  122. package/dist/esm/tests/durable-event-log.spec.js +373 -0
  123. package/dist/esm/tests/durable-event-log.spec.js.map +1 -0
  124. package/dist/esm/tests/dwn.spec.js +504 -35
  125. package/dist/esm/tests/dwn.spec.js.map +1 -1
  126. package/dist/esm/tests/features/author-delegated-grant.spec.js +9 -6
  127. package/dist/esm/tests/features/author-delegated-grant.spec.js.map +1 -1
  128. package/dist/esm/tests/features/owner-delegated-grant.spec.js +1 -4
  129. package/dist/esm/tests/features/owner-delegated-grant.spec.js.map +1 -1
  130. package/dist/esm/tests/features/owner-signature.spec.js +1 -4
  131. package/dist/esm/tests/features/owner-signature.spec.js.map +1 -1
  132. package/dist/esm/tests/features/permissions.spec.js +165 -4
  133. package/dist/esm/tests/features/permissions.spec.js.map +1 -1
  134. package/dist/esm/tests/features/protocol-composition.spec.js +8 -11
  135. package/dist/esm/tests/features/protocol-composition.spec.js.map +1 -1
  136. package/dist/esm/tests/features/protocol-create-action.spec.js +1 -4
  137. package/dist/esm/tests/features/protocol-create-action.spec.js.map +1 -1
  138. package/dist/esm/tests/features/protocol-delete-action.spec.js +3 -5
  139. package/dist/esm/tests/features/protocol-delete-action.spec.js.map +1 -1
  140. package/dist/esm/tests/features/protocol-update-action.spec.js +3 -6
  141. package/dist/esm/tests/features/protocol-update-action.spec.js.map +1 -1
  142. package/dist/esm/tests/features/records-delivery.spec.js +1 -4
  143. package/dist/esm/tests/features/records-delivery.spec.js.map +1 -1
  144. package/dist/esm/tests/features/records-immutable.spec.js +1 -4
  145. package/dist/esm/tests/features/records-immutable.spec.js.map +1 -1
  146. package/dist/esm/tests/features/records-nested-query-scope.spec.js +281 -0
  147. package/dist/esm/tests/features/records-nested-query-scope.spec.js.map +1 -0
  148. package/dist/esm/tests/features/records-prune-cross-protocol.spec.js +3 -7
  149. package/dist/esm/tests/features/records-prune-cross-protocol.spec.js.map +1 -1
  150. package/dist/esm/tests/features/records-prune.spec.js +11 -22
  151. package/dist/esm/tests/features/records-prune.spec.js.map +1 -1
  152. package/dist/esm/tests/features/records-record-limit.spec.js +441 -231
  153. package/dist/esm/tests/features/records-record-limit.spec.js.map +1 -1
  154. package/dist/esm/tests/features/records-squash.spec.js +6 -4
  155. package/dist/esm/tests/features/records-squash.spec.js.map +1 -1
  156. package/dist/esm/tests/features/records-tags.spec.js +1 -4
  157. package/dist/esm/tests/features/records-tags.spec.js.map +1 -1
  158. package/dist/esm/tests/features/resumable-tasks.spec.js +3 -5
  159. package/dist/esm/tests/features/resumable-tasks.spec.js.map +1 -1
  160. package/dist/esm/tests/fuzz/message-store.fuzz.spec.js +1 -2
  161. package/dist/esm/tests/fuzz/message-store.fuzz.spec.js.map +1 -1
  162. package/dist/esm/tests/fuzz/process-message.fuzz.spec.js +2 -4
  163. package/dist/esm/tests/fuzz/process-message.fuzz.spec.js.map +1 -1
  164. package/dist/esm/tests/fuzz/schema-validation.fuzz.spec.js +1 -1
  165. package/dist/esm/tests/fuzz/schema-validation.fuzz.spec.js.map +1 -1
  166. package/dist/esm/tests/handlers/messages-query.spec.js +246 -0
  167. package/dist/esm/tests/handlers/messages-query.spec.js.map +1 -0
  168. package/dist/esm/tests/handlers/messages-read.spec.js +2 -5
  169. package/dist/esm/tests/handlers/messages-read.spec.js.map +1 -1
  170. package/dist/esm/tests/handlers/messages-subscribe.spec.js +3 -14
  171. package/dist/esm/tests/handlers/messages-subscribe.spec.js.map +1 -1
  172. package/dist/esm/tests/handlers/protocols-configure.spec.js +27 -26
  173. package/dist/esm/tests/handlers/protocols-configure.spec.js.map +1 -1
  174. package/dist/esm/tests/handlers/protocols-query.spec.js +1 -4
  175. package/dist/esm/tests/handlers/protocols-query.spec.js.map +1 -1
  176. package/dist/esm/tests/handlers/records-count.spec.js +1 -4
  177. package/dist/esm/tests/handlers/records-count.spec.js.map +1 -1
  178. package/dist/esm/tests/handlers/records-delete.spec.js +312 -30
  179. package/dist/esm/tests/handlers/records-delete.spec.js.map +1 -1
  180. package/dist/esm/tests/handlers/records-query.spec.js +32 -9
  181. package/dist/esm/tests/handlers/records-query.spec.js.map +1 -1
  182. package/dist/esm/tests/handlers/records-read.spec.js +4 -4
  183. package/dist/esm/tests/handlers/records-read.spec.js.map +1 -1
  184. package/dist/esm/tests/handlers/records-subscribe.spec.js +33 -14
  185. package/dist/esm/tests/handlers/records-subscribe.spec.js.map +1 -1
  186. package/dist/esm/tests/handlers/records-write.spec.js +82 -36
  187. package/dist/esm/tests/handlers/records-write.spec.js.map +1 -1
  188. package/dist/esm/tests/interfaces/records-delete.spec.js +69 -2
  189. package/dist/esm/tests/interfaces/records-delete.spec.js.map +1 -1
  190. package/dist/esm/tests/interfaces/records-write.spec.js +4 -3
  191. package/dist/esm/tests/interfaces/records-write.spec.js.map +1 -1
  192. package/dist/esm/tests/protocols/permissions.spec.js +55 -6
  193. package/dist/esm/tests/protocols/permissions.spec.js.map +1 -1
  194. package/dist/esm/tests/scenarios/aggregator.spec.js +1 -4
  195. package/dist/esm/tests/scenarios/aggregator.spec.js.map +1 -1
  196. package/dist/esm/tests/scenarios/deleted-record.spec.js +1 -4
  197. package/dist/esm/tests/scenarios/deleted-record.spec.js.map +1 -1
  198. package/dist/esm/tests/scenarios/end-to-end-tests.spec.js +1 -4
  199. package/dist/esm/tests/scenarios/end-to-end-tests.spec.js.map +1 -1
  200. package/dist/esm/tests/scenarios/nested-roles.spec.js +1 -4
  201. package/dist/esm/tests/scenarios/nested-roles.spec.js.map +1 -1
  202. package/dist/esm/tests/scenarios/subscriptions.spec.js +1 -4
  203. package/dist/esm/tests/scenarios/subscriptions.spec.js.map +1 -1
  204. package/dist/esm/tests/store/message-store-level.spec.js +361 -5
  205. package/dist/esm/tests/store/message-store-level.spec.js.map +1 -1
  206. package/dist/esm/tests/store/message-store.spec.js +60 -0
  207. package/dist/esm/tests/store/message-store.spec.js.map +1 -1
  208. package/dist/esm/tests/test-event-stream.js +7 -3
  209. package/dist/esm/tests/test-event-stream.js.map +1 -1
  210. package/dist/esm/tests/test-stores.js +19 -9
  211. package/dist/esm/tests/test-stores.js.map +1 -1
  212. package/dist/esm/tests/test-suite.js +4 -2
  213. package/dist/esm/tests/test-suite.js.map +1 -1
  214. package/dist/esm/tests/utils/protocol-tags.spec.js +96 -0
  215. package/dist/esm/tests/utils/protocol-tags.spec.js.map +1 -0
  216. package/dist/esm/tests/utils/test-data-generator.js +25 -0
  217. package/dist/esm/tests/utils/test-data-generator.js.map +1 -1
  218. package/dist/esm/tests/utils/test-stub-generator.js.map +1 -1
  219. package/dist/esm/tests/utils/test-validation-state-reader.js +16 -0
  220. package/dist/esm/tests/utils/test-validation-state-reader.js.map +1 -0
  221. package/dist/types/generated/precompiled-validators.d.ts +6 -6
  222. package/dist/types/generated/precompiled-validators.d.ts.map +1 -1
  223. package/dist/types/src/core/core-protocol.d.ts +3 -3
  224. package/dist/types/src/core/core-protocol.d.ts.map +1 -1
  225. package/dist/types/src/core/dwn-constant.d.ts +5 -0
  226. package/dist/types/src/core/dwn-constant.d.ts.map +1 -1
  227. package/dist/types/src/core/dwn-error.d.ts +12 -4
  228. package/dist/types/src/core/dwn-error.d.ts.map +1 -1
  229. package/dist/types/src/core/grant-authorization.d.ts +5 -5
  230. package/dist/types/src/core/grant-authorization.d.ts.map +1 -1
  231. package/dist/types/src/core/message-reply.d.ts +5 -4
  232. package/dist/types/src/core/message-reply.d.ts.map +1 -1
  233. package/dist/types/src/core/messages-grant-authorization.d.ts +12 -14
  234. package/dist/types/src/core/messages-grant-authorization.d.ts.map +1 -1
  235. package/dist/types/src/core/protocol-authorization-action.d.ts +4 -5
  236. package/dist/types/src/core/protocol-authorization-action.d.ts.map +1 -1
  237. package/dist/types/src/core/protocol-authorization-validation.d.ts +14 -17
  238. package/dist/types/src/core/protocol-authorization-validation.d.ts.map +1 -1
  239. package/dist/types/src/core/protocol-authorization.d.ts +8 -33
  240. package/dist/types/src/core/protocol-authorization.d.ts.map +1 -1
  241. package/dist/types/src/core/protocols-grant-authorization.d.ts +4 -4
  242. package/dist/types/src/core/protocols-grant-authorization.d.ts.map +1 -1
  243. package/dist/types/src/core/recording-validation-state-reader.d.ts +75 -0
  244. package/dist/types/src/core/recording-validation-state-reader.d.ts.map +1 -0
  245. package/dist/types/src/core/records-grant-authorization.d.ts +8 -8
  246. package/dist/types/src/core/records-grant-authorization.d.ts.map +1 -1
  247. package/dist/types/src/core/replication-apply.d.ts +36 -0
  248. package/dist/types/src/core/replication-apply.d.ts.map +1 -1
  249. package/dist/types/src/core/resumable-task-manager.d.ts +1 -1
  250. package/dist/types/src/core/resumable-task-manager.d.ts.map +1 -1
  251. package/dist/types/src/core/validation-state-reader.d.ts +79 -0
  252. package/dist/types/src/core/validation-state-reader.d.ts.map +1 -0
  253. package/dist/types/src/dwn.d.ts +33 -20
  254. package/dist/types/src/dwn.d.ts.map +1 -1
  255. package/dist/types/src/enums/dwn-interface-method.d.ts +0 -1
  256. package/dist/types/src/enums/dwn-interface-method.d.ts.map +1 -1
  257. package/dist/types/src/event-stream/durable-event-log.d.ts +69 -0
  258. package/dist/types/src/event-stream/durable-event-log.d.ts.map +1 -0
  259. package/dist/types/src/event-stream/event-emitter-wake-publisher.d.ts +13 -0
  260. package/dist/types/src/event-stream/event-emitter-wake-publisher.d.ts.map +1 -0
  261. package/dist/types/src/handlers/messages-query.d.ts +20 -0
  262. package/dist/types/src/handlers/messages-query.d.ts.map +1 -0
  263. package/dist/types/src/handlers/messages-read.d.ts +1 -1
  264. package/dist/types/src/handlers/messages-read.d.ts.map +1 -1
  265. package/dist/types/src/handlers/messages-subscribe.d.ts.map +1 -1
  266. package/dist/types/src/handlers/protocols-configure.d.ts +0 -5
  267. package/dist/types/src/handlers/protocols-configure.d.ts.map +1 -1
  268. package/dist/types/src/handlers/records-count.d.ts +2 -1
  269. package/dist/types/src/handlers/records-count.d.ts.map +1 -1
  270. package/dist/types/src/handlers/records-delete.d.ts +2 -2
  271. package/dist/types/src/handlers/records-delete.d.ts.map +1 -1
  272. package/dist/types/src/handlers/records-query.d.ts +1 -1
  273. package/dist/types/src/handlers/records-query.d.ts.map +1 -1
  274. package/dist/types/src/handlers/records-read.d.ts +2 -1
  275. package/dist/types/src/handlers/records-read.d.ts.map +1 -1
  276. package/dist/types/src/handlers/records-subscribe.d.ts +4 -5
  277. package/dist/types/src/handlers/records-subscribe.d.ts.map +1 -1
  278. package/dist/types/src/handlers/records-write.d.ts +3 -11
  279. package/dist/types/src/handlers/records-write.d.ts.map +1 -1
  280. package/dist/types/src/index.d.ts +14 -16
  281. package/dist/types/src/index.d.ts.map +1 -1
  282. package/dist/types/src/interfaces/messages-query.d.ts +23 -0
  283. package/dist/types/src/interfaces/messages-query.d.ts.map +1 -0
  284. package/dist/types/src/interfaces/protocols-configure.d.ts +3 -3
  285. package/dist/types/src/interfaces/protocols-configure.d.ts.map +1 -1
  286. package/dist/types/src/interfaces/protocols-query.d.ts +2 -2
  287. package/dist/types/src/interfaces/protocols-query.d.ts.map +1 -1
  288. package/dist/types/src/interfaces/records-count.d.ts +3 -3
  289. package/dist/types/src/interfaces/records-count.d.ts.map +1 -1
  290. package/dist/types/src/interfaces/records-delete.d.ts +11 -3
  291. package/dist/types/src/interfaces/records-delete.d.ts.map +1 -1
  292. package/dist/types/src/interfaces/records-query.d.ts +3 -3
  293. package/dist/types/src/interfaces/records-query.d.ts.map +1 -1
  294. package/dist/types/src/interfaces/records-read.d.ts +3 -3
  295. package/dist/types/src/interfaces/records-read.d.ts.map +1 -1
  296. package/dist/types/src/interfaces/records-subscribe.d.ts +3 -3
  297. package/dist/types/src/interfaces/records-subscribe.d.ts.map +1 -1
  298. package/dist/types/src/interfaces/records-write.d.ts +15 -7
  299. package/dist/types/src/interfaces/records-write.d.ts.map +1 -1
  300. package/dist/types/src/protocols/permissions.d.ts +9 -12
  301. package/dist/types/src/protocols/permissions.d.ts.map +1 -1
  302. package/dist/types/src/store/index-level.d.ts +10 -1
  303. package/dist/types/src/store/index-level.d.ts.map +1 -1
  304. package/dist/types/src/store/level-wrapper.d.ts +5 -0
  305. package/dist/types/src/store/level-wrapper.d.ts.map +1 -1
  306. package/dist/types/src/store/message-store-level.d.ts +94 -14
  307. package/dist/types/src/store/message-store-level.d.ts.map +1 -1
  308. package/dist/types/src/store/storage-controller.d.ts +17 -14
  309. package/dist/types/src/store/storage-controller.d.ts.map +1 -1
  310. package/dist/types/src/types/message-store.d.ts +29 -1
  311. package/dist/types/src/types/message-store.d.ts.map +1 -1
  312. package/dist/types/src/types/message-types.d.ts +2 -0
  313. package/dist/types/src/types/message-types.d.ts.map +1 -1
  314. package/dist/types/src/types/messages-types.d.ts +21 -37
  315. package/dist/types/src/types/messages-types.d.ts.map +1 -1
  316. package/dist/types/src/types/method-handler.d.ts +2 -2
  317. package/dist/types/src/types/method-handler.d.ts.map +1 -1
  318. package/dist/types/src/types/permission-types.d.ts +1 -1
  319. package/dist/types/src/types/subscriptions.d.ts +50 -39
  320. package/dist/types/src/types/subscriptions.d.ts.map +1 -1
  321. package/dist/types/src/types/validation-state-reader.d.ts +116 -0
  322. package/dist/types/src/types/validation-state-reader.d.ts.map +1 -0
  323. package/dist/types/src/utils/messages.d.ts +10 -0
  324. package/dist/types/src/utils/messages.d.ts.map +1 -1
  325. package/dist/types/src/utils/protocol-tags.d.ts +15 -0
  326. package/dist/types/src/utils/protocol-tags.d.ts.map +1 -0
  327. package/dist/types/src/utils/record-limit-occupancy.d.ts +40 -0
  328. package/dist/types/src/utils/record-limit-occupancy.d.ts.map +1 -0
  329. package/dist/types/src/utils/records.d.ts +25 -3
  330. package/dist/types/src/utils/records.d.ts.map +1 -1
  331. package/dist/types/src/utils/replication.d.ts +22 -0
  332. package/dist/types/src/utils/replication.d.ts.map +1 -0
  333. package/dist/types/tests/core/process-message-parity.spec.d.ts +2 -0
  334. package/dist/types/tests/core/process-message-parity.spec.d.ts.map +1 -0
  335. package/dist/types/tests/core/replication-replay-property.spec.d.ts +2 -0
  336. package/dist/types/tests/core/replication-replay-property.spec.d.ts.map +1 -0
  337. package/dist/types/tests/core/validation-read-closure.spec.d.ts +2 -0
  338. package/dist/types/tests/core/validation-read-closure.spec.d.ts.map +1 -0
  339. package/dist/types/tests/core/validation-state-reader.spec.d.ts +2 -0
  340. package/dist/types/tests/core/validation-state-reader.spec.d.ts.map +1 -0
  341. package/dist/types/tests/durable-event-log.spec.d.ts +2 -0
  342. package/dist/types/tests/durable-event-log.spec.d.ts.map +1 -0
  343. package/dist/types/tests/dwn.spec.d.ts.map +1 -1
  344. package/dist/types/tests/features/author-delegated-grant.spec.d.ts.map +1 -1
  345. package/dist/types/tests/features/owner-delegated-grant.spec.d.ts.map +1 -1
  346. package/dist/types/tests/features/owner-signature.spec.d.ts.map +1 -1
  347. package/dist/types/tests/features/permissions.spec.d.ts.map +1 -1
  348. package/dist/types/tests/features/protocol-composition.spec.d.ts.map +1 -1
  349. package/dist/types/tests/features/protocol-create-action.spec.d.ts.map +1 -1
  350. package/dist/types/tests/features/protocol-delete-action.spec.d.ts.map +1 -1
  351. package/dist/types/tests/features/protocol-update-action.spec.d.ts.map +1 -1
  352. package/dist/types/tests/features/records-delivery.spec.d.ts.map +1 -1
  353. package/dist/types/tests/features/records-immutable.spec.d.ts.map +1 -1
  354. package/dist/types/tests/features/records-nested-query-scope.spec.d.ts +2 -0
  355. package/dist/types/tests/features/records-nested-query-scope.spec.d.ts.map +1 -0
  356. package/dist/types/tests/features/records-prune-cross-protocol.spec.d.ts.map +1 -1
  357. package/dist/types/tests/features/records-prune.spec.d.ts.map +1 -1
  358. package/dist/types/tests/features/records-record-limit.spec.d.ts.map +1 -1
  359. package/dist/types/tests/features/records-squash.spec.d.ts.map +1 -1
  360. package/dist/types/tests/features/records-tags.spec.d.ts.map +1 -1
  361. package/dist/types/tests/features/resumable-tasks.spec.d.ts.map +1 -1
  362. package/dist/types/tests/handlers/messages-query.spec.d.ts +2 -0
  363. package/dist/types/tests/handlers/messages-query.spec.d.ts.map +1 -0
  364. package/dist/types/tests/handlers/messages-read.spec.d.ts.map +1 -1
  365. package/dist/types/tests/handlers/messages-subscribe.spec.d.ts.map +1 -1
  366. package/dist/types/tests/handlers/protocols-configure.spec.d.ts.map +1 -1
  367. package/dist/types/tests/handlers/protocols-query.spec.d.ts.map +1 -1
  368. package/dist/types/tests/handlers/records-count.spec.d.ts.map +1 -1
  369. package/dist/types/tests/handlers/records-delete.spec.d.ts.map +1 -1
  370. package/dist/types/tests/handlers/records-query.spec.d.ts.map +1 -1
  371. package/dist/types/tests/handlers/records-read.spec.d.ts.map +1 -1
  372. package/dist/types/tests/handlers/records-subscribe.spec.d.ts.map +1 -1
  373. package/dist/types/tests/handlers/records-write.spec.d.ts.map +1 -1
  374. package/dist/types/tests/scenarios/deleted-record.spec.d.ts.map +1 -1
  375. package/dist/types/tests/scenarios/end-to-end-tests.spec.d.ts.map +1 -1
  376. package/dist/types/tests/scenarios/nested-roles.spec.d.ts.map +1 -1
  377. package/dist/types/tests/scenarios/subscriptions.spec.d.ts.map +1 -1
  378. package/dist/types/tests/store/message-store.spec.d.ts.map +1 -1
  379. package/dist/types/tests/test-event-stream.d.ts +1 -1
  380. package/dist/types/tests/test-event-stream.d.ts.map +1 -1
  381. package/dist/types/tests/test-stores.d.ts +5 -4
  382. package/dist/types/tests/test-stores.d.ts.map +1 -1
  383. package/dist/types/tests/test-suite.d.ts +1 -2
  384. package/dist/types/tests/test-suite.d.ts.map +1 -1
  385. package/dist/types/tests/utils/protocol-tags.spec.d.ts +2 -0
  386. package/dist/types/tests/utils/protocol-tags.spec.d.ts.map +1 -0
  387. package/dist/types/tests/utils/test-data-generator.d.ts +20 -1
  388. package/dist/types/tests/utils/test-data-generator.d.ts.map +1 -1
  389. package/dist/types/tests/utils/test-validation-state-reader.d.ts +15 -0
  390. package/dist/types/tests/utils/test-validation-state-reader.d.ts.map +1 -0
  391. package/package.json +2 -2
  392. package/src/core/core-protocol.ts +3 -3
  393. package/src/core/dwn-constant.ts +7 -1
  394. package/src/core/dwn-error.ts +12 -4
  395. package/src/core/grant-authorization.ts +11 -20
  396. package/src/core/message-reply.ts +6 -5
  397. package/src/core/messages-grant-authorization.ts +37 -70
  398. package/src/core/protocol-authorization-action.ts +29 -38
  399. package/src/core/protocol-authorization-validation.ts +47 -121
  400. package/src/core/protocol-authorization.ts +56 -202
  401. package/src/core/protocols-grant-authorization.ts +9 -9
  402. package/src/core/recording-validation-state-reader.ts +130 -0
  403. package/src/core/records-grant-authorization.ts +16 -16
  404. package/src/core/replication-apply.ts +172 -32
  405. package/src/core/resumable-task-manager.ts +10 -8
  406. package/src/core/validation-state-reader.ts +350 -0
  407. package/src/dwn.ts +285 -192
  408. package/src/enums/dwn-interface-method.ts +0 -1
  409. package/src/event-stream/durable-event-log.ts +509 -0
  410. package/src/event-stream/event-emitter-wake-publisher.ts +34 -0
  411. package/src/handlers/messages-query.ts +203 -0
  412. package/src/handlers/messages-read.ts +9 -10
  413. package/src/handlers/messages-subscribe.ts +12 -13
  414. package/src/handlers/protocols-configure.ts +37 -58
  415. package/src/handlers/protocols-query.ts +1 -1
  416. package/src/handlers/records-count.ts +24 -17
  417. package/src/handlers/records-delete.ts +29 -27
  418. package/src/handlers/records-query.ts +38 -17
  419. package/src/handlers/records-read.ts +63 -50
  420. package/src/handlers/records-subscribe.ts +132 -19
  421. package/src/handlers/records-write.ts +77 -168
  422. package/src/index.ts +14 -17
  423. package/src/interfaces/messages-query.ts +70 -0
  424. package/src/interfaces/protocols-configure.ts +20 -10
  425. package/src/interfaces/protocols-query.ts +4 -5
  426. package/src/interfaces/records-count.ts +9 -4
  427. package/src/interfaces/records-delete.ts +25 -5
  428. package/src/interfaces/records-query.ts +9 -4
  429. package/src/interfaces/records-read.ts +4 -4
  430. package/src/interfaces/records-subscribe.ts +9 -4
  431. package/src/interfaces/records-write.ts +41 -13
  432. package/src/protocols/permissions.ts +32 -52
  433. package/src/store/index-level.ts +30 -9
  434. package/src/store/level-wrapper.ts +9 -1
  435. package/src/store/message-store-level.ts +757 -47
  436. package/src/store/storage-controller.ts +74 -63
  437. package/src/types/message-store.ts +45 -2
  438. package/src/types/message-types.ts +3 -1
  439. package/src/types/messages-types.ts +26 -45
  440. package/src/types/method-handler.ts +3 -3
  441. package/src/types/permission-types.ts +1 -1
  442. package/src/types/subscriptions.ts +53 -42
  443. package/src/types/validation-state-reader.ts +127 -0
  444. package/src/utils/messages.ts +25 -1
  445. package/src/utils/protocol-tags.ts +366 -0
  446. package/src/utils/record-limit-occupancy.ts +377 -0
  447. package/src/utils/records.ts +69 -13
  448. package/src/utils/replication.ts +122 -0
  449. package/dist/esm/src/core/record-chain.js +0 -64
  450. package/dist/esm/src/core/record-chain.js.map +0 -1
  451. package/dist/esm/src/event-stream/event-emitter-event-log.js +0 -334
  452. package/dist/esm/src/event-stream/event-emitter-event-log.js.map +0 -1
  453. package/dist/esm/src/handlers/messages-sync.js +0 -278
  454. package/dist/esm/src/handlers/messages-sync.js.map +0 -1
  455. package/dist/esm/src/interfaces/messages-sync.js.map +0 -1
  456. package/dist/esm/src/smt/smt-store-level.js +0 -103
  457. package/dist/esm/src/smt/smt-store-level.js.map +0 -1
  458. package/dist/esm/src/smt/smt-store-memory.js +0 -41
  459. package/dist/esm/src/smt/smt-store-memory.js.map +0 -1
  460. package/dist/esm/src/smt/smt-utils.js +0 -129
  461. package/dist/esm/src/smt/smt-utils.js.map +0 -1
  462. package/dist/esm/src/smt/sparse-merkle-tree.js +0 -577
  463. package/dist/esm/src/smt/sparse-merkle-tree.js.map +0 -1
  464. package/dist/esm/src/state-index/state-index-level.js +0 -191
  465. package/dist/esm/src/state-index/state-index-level.js.map +0 -1
  466. package/dist/esm/src/types/smt-types.js +0 -5
  467. package/dist/esm/src/types/smt-types.js.map +0 -1
  468. package/dist/esm/src/types/state-index.js +0 -2
  469. package/dist/esm/src/types/state-index.js.map +0 -1
  470. package/dist/esm/tests/event-emitter-event-log.spec.js +0 -499
  471. package/dist/esm/tests/event-emitter-event-log.spec.js.map +0 -1
  472. package/dist/esm/tests/handlers/messages-sync.spec.js +0 -1088
  473. package/dist/esm/tests/handlers/messages-sync.spec.js.map +0 -1
  474. package/dist/esm/tests/smt/smt-store-level.spec.js +0 -132
  475. package/dist/esm/tests/smt/smt-store-level.spec.js.map +0 -1
  476. package/dist/esm/tests/smt/sparse-merkle-tree.spec.js +0 -732
  477. package/dist/esm/tests/smt/sparse-merkle-tree.spec.js.map +0 -1
  478. package/dist/esm/tests/state-index/state-index-level.spec.js +0 -245
  479. package/dist/esm/tests/state-index/state-index-level.spec.js.map +0 -1
  480. package/dist/types/src/core/record-chain.d.ts +0 -24
  481. package/dist/types/src/core/record-chain.d.ts.map +0 -1
  482. package/dist/types/src/event-stream/event-emitter-event-log.d.ts +0 -80
  483. package/dist/types/src/event-stream/event-emitter-event-log.d.ts.map +0 -1
  484. package/dist/types/src/handlers/messages-sync.d.ts +0 -39
  485. package/dist/types/src/handlers/messages-sync.d.ts.map +0 -1
  486. package/dist/types/src/interfaces/messages-sync.d.ts +0 -20
  487. package/dist/types/src/interfaces/messages-sync.d.ts.map +0 -1
  488. package/dist/types/src/smt/smt-store-level.d.ts +0 -32
  489. package/dist/types/src/smt/smt-store-level.d.ts.map +0 -1
  490. package/dist/types/src/smt/smt-store-memory.d.ts +0 -22
  491. package/dist/types/src/smt/smt-store-memory.d.ts.map +0 -1
  492. package/dist/types/src/smt/smt-utils.d.ts +0 -58
  493. package/dist/types/src/smt/smt-utils.d.ts.map +0 -1
  494. package/dist/types/src/smt/sparse-merkle-tree.d.ts +0 -124
  495. package/dist/types/src/smt/sparse-merkle-tree.d.ts.map +0 -1
  496. package/dist/types/src/state-index/state-index-level.d.ts +0 -83
  497. package/dist/types/src/state-index/state-index-level.d.ts.map +0 -1
  498. package/dist/types/src/types/smt-types.d.ts +0 -81
  499. package/dist/types/src/types/smt-types.d.ts.map +0 -1
  500. package/dist/types/src/types/state-index.d.ts +0 -90
  501. package/dist/types/src/types/state-index.d.ts.map +0 -1
  502. package/dist/types/tests/event-emitter-event-log.spec.d.ts +0 -2
  503. package/dist/types/tests/event-emitter-event-log.spec.d.ts.map +0 -1
  504. package/dist/types/tests/handlers/messages-sync.spec.d.ts +0 -2
  505. package/dist/types/tests/handlers/messages-sync.spec.d.ts.map +0 -1
  506. package/dist/types/tests/smt/smt-store-level.spec.d.ts +0 -2
  507. package/dist/types/tests/smt/smt-store-level.spec.d.ts.map +0 -1
  508. package/dist/types/tests/smt/sparse-merkle-tree.spec.d.ts +0 -2
  509. package/dist/types/tests/smt/sparse-merkle-tree.spec.d.ts.map +0 -1
  510. package/dist/types/tests/state-index/state-index-level.spec.d.ts +0 -2
  511. package/dist/types/tests/state-index/state-index-level.spec.d.ts.map +0 -1
  512. package/src/core/record-chain.ts +0 -99
  513. package/src/event-stream/event-emitter-event-log.ts +0 -430
  514. package/src/handlers/messages-sync.ts +0 -403
  515. package/src/interfaces/messages-sync.ts +0 -69
  516. package/src/smt/smt-store-level.ts +0 -143
  517. package/src/smt/smt-store-memory.ts +0 -53
  518. package/src/smt/smt-utils.ts +0 -149
  519. package/src/smt/sparse-merkle-tree.ts +0 -698
  520. package/src/state-index/state-index-level.ts +0 -239
  521. package/src/types/smt-types.ts +0 -95
  522. package/src/types/state-index.ts +0 -100
@@ -1,6 +1,6 @@
1
- import type { MessageStore } from '../types/message-store.js';
2
1
  import type { PermissionGrant } from '../protocols/permission-grant.js';
3
2
  import type { ProtocolScope } from '../utils/permission-scope.js';
3
+ import type { ValidationStateReader } from '../types/validation-state-reader.js';
4
4
  import type { PermissionConditions, RecordsPermissionScope } from '../types/permission-types.js';
5
5
  import type { RecordsCountMessage, RecordsDeleteMessage, RecordsQueryMessage, RecordsReadMessage, RecordsSubscribeMessage, RecordsWriteMessage } from '../types/records-types.js';
6
6
 
@@ -18,10 +18,10 @@ export class RecordsGrantAuthorization {
18
18
  expectedGrantor: string,
19
19
  expectedGrantee: string,
20
20
  permissionGrant: PermissionGrant,
21
- messageStore: MessageStore,
21
+ validationStateReader: ValidationStateReader,
22
22
  }): Promise<void> {
23
23
  const {
24
- recordsWriteMessage, expectedGrantor, expectedGrantee, permissionGrant, messageStore
24
+ recordsWriteMessage, expectedGrantor, expectedGrantee, permissionGrant, validationStateReader
25
25
  } = input;
26
26
 
27
27
  await GrantAuthorization.performBaseValidation({
@@ -29,7 +29,7 @@ export class RecordsGrantAuthorization {
29
29
  expectedGrantor,
30
30
  expectedGrantee,
31
31
  permissionGrant,
32
- messageStore
32
+ validationStateReader
33
33
  });
34
34
 
35
35
  // NOTE: validated the invoked permission is for Records in GrantAuthorization.performBaseValidation()
@@ -40,7 +40,7 @@ export class RecordsGrantAuthorization {
40
40
 
41
41
  /**
42
42
  * Authorizes a RecordsReadMessage using the given permission grant.
43
- * @param messageStore Used to check if the given grant has been revoked.
43
+ * @param validationStateReader Used to check if the given grant has been revoked.
44
44
  */
45
45
  public static async authorizeRead(input: {
46
46
  recordsReadMessage: RecordsReadMessage,
@@ -48,10 +48,10 @@ export class RecordsGrantAuthorization {
48
48
  expectedGrantor: string,
49
49
  expectedGrantee: string,
50
50
  permissionGrant: PermissionGrant,
51
- messageStore: MessageStore,
51
+ validationStateReader: ValidationStateReader,
52
52
  }): Promise<void> {
53
53
  const {
54
- recordsReadMessage, recordsWriteMessageToBeRead, expectedGrantor, expectedGrantee, permissionGrant, messageStore
54
+ recordsReadMessage, recordsWriteMessageToBeRead, expectedGrantor, expectedGrantee, permissionGrant, validationStateReader
55
55
  } = input;
56
56
 
57
57
  await GrantAuthorization.performBaseValidation({
@@ -59,7 +59,7 @@ export class RecordsGrantAuthorization {
59
59
  expectedGrantor,
60
60
  expectedGrantee,
61
61
  permissionGrant,
62
- messageStore
62
+ validationStateReader
63
63
  });
64
64
 
65
65
  // NOTE: validated the invoked permission is for Records in GrantAuthorization.performBaseValidation()
@@ -68,17 +68,17 @@ export class RecordsGrantAuthorization {
68
68
 
69
69
  /**
70
70
  * Authorizes the scope of a permission grant for RecordsQuery or RecordsSubscribe.
71
- * @param messageStore Used to check if the grant has been revoked.
71
+ * @param validationStateReader Used to check if the grant has been revoked.
72
72
  */
73
73
  public static async authorizeQueryOrSubscribe(input: {
74
74
  incomingMessage: RecordsCountMessage | RecordsQueryMessage | RecordsSubscribeMessage,
75
75
  expectedGrantor: string,
76
76
  expectedGrantee: string,
77
77
  permissionGrant: PermissionGrant,
78
- messageStore: MessageStore,
78
+ validationStateReader: ValidationStateReader,
79
79
  }): Promise<void> {
80
80
  const {
81
- incomingMessage, expectedGrantor, expectedGrantee, permissionGrant, messageStore
81
+ incomingMessage, expectedGrantor, expectedGrantee, permissionGrant, validationStateReader
82
82
  } = input;
83
83
 
84
84
  await GrantAuthorization.performBaseValidation({
@@ -86,7 +86,7 @@ export class RecordsGrantAuthorization {
86
86
  expectedGrantor,
87
87
  expectedGrantee,
88
88
  permissionGrant,
89
- messageStore
89
+ validationStateReader
90
90
  });
91
91
 
92
92
  // The grant's protocol must match the query/subscribe filter's protocol.
@@ -107,7 +107,7 @@ export class RecordsGrantAuthorization {
107
107
 
108
108
  /**
109
109
  * Authorizes the scope of a permission grant for RecordsDelete.
110
- * @param messageStore Used to check if the grant has been revoked.
110
+ * @param validationStateReader Used to check if the grant has been revoked.
111
111
  */
112
112
  public static async authorizeDelete(input: {
113
113
  recordsDeleteMessage: RecordsDeleteMessage,
@@ -115,10 +115,10 @@ export class RecordsGrantAuthorization {
115
115
  expectedGrantor: string,
116
116
  expectedGrantee: string,
117
117
  permissionGrant: PermissionGrant,
118
- messageStore: MessageStore,
118
+ validationStateReader: ValidationStateReader,
119
119
  }): Promise<void> {
120
120
  const {
121
- recordsDeleteMessage, recordsWriteToDelete, expectedGrantor, expectedGrantee, permissionGrant, messageStore
121
+ recordsDeleteMessage, recordsWriteToDelete, expectedGrantor, expectedGrantee, permissionGrant, validationStateReader
122
122
  } = input;
123
123
 
124
124
  await GrantAuthorization.performBaseValidation({
@@ -126,7 +126,7 @@ export class RecordsGrantAuthorization {
126
126
  expectedGrantor,
127
127
  expectedGrantee,
128
128
  permissionGrant,
129
- messageStore
129
+ validationStateReader
130
130
  });
131
131
 
132
132
  // NOTE: validated the invoked permission is for Records in GrantAuthorization.performBaseValidation()
@@ -1,5 +1,7 @@
1
1
  import type { GenericMessage } from '../types/message-types.js';
2
+ import type { ProgressToken } from '../types/subscriptions.js';
2
3
  import type { ProtocolDefinition } from '../types/protocols-types.js';
4
+ import type { ValidationStateReader } from '../types/validation-state-reader.js';
3
5
 
4
6
  import { DwnErrorCode } from './dwn-error.js';
5
7
  import { Encoder } from '../utils/encoder.js';
@@ -12,7 +14,13 @@ export type ReplicationApplyOptions = {
12
14
  };
13
15
 
14
16
  export type ReplicationApplyResult =
15
- | { kind: 'Applied' }
17
+ | {
18
+ kind: 'Applied';
19
+ /** True when the local store retained dependency ancestry but did not advance latest state. */
20
+ ancestryOnly?: true;
21
+ /** Local admission position, when the receiving store has a durable replication log. */
22
+ position?: ProgressToken;
23
+ }
16
24
  | { kind: 'Duplicate' }
17
25
  | { kind: 'Superseded' }
18
26
  | { kind: 'Incomplete'; missing: DependencyRef[] }
@@ -21,6 +29,15 @@ export type ReplicationApplyResult =
21
29
 
22
30
  export type ReplicationApplyResultContext = {
23
31
  protocolDefinition?: ProtocolDefinition;
32
+
33
+ /**
34
+ * Complete set of locally-missing ancestor recordIds for a missing-ancestor failure
35
+ * (immediate parent or record-chain construction), ordered root-first with the failure-named
36
+ * ancestor last, as computed by `missingAncestorRecordIdsFromReply()`. When present, the
37
+ * resulting `Incomplete` carries one ref per entry so the entire ancestry resolves in a
38
+ * single fetch pass instead of one ancestry level per retry.
39
+ */
40
+ missingAncestorRecordIds?: string[];
24
41
  };
25
42
 
26
43
  export type DependencyRef =
@@ -42,13 +59,17 @@ export type DependencyRef =
42
59
  */
43
60
  export function replicationApplyResultFromReply(
44
61
  message: GenericMessage,
45
- reply: { status: { code: number; detail?: string } },
62
+ reply: { status: { code: number; detail?: string }; position?: ProgressToken },
46
63
  context: ReplicationApplyResultContext = {},
47
64
  ): ReplicationApplyResult {
48
65
  const { code, detail = '' } = reply.status;
49
66
 
50
67
  if (code === 202 || code === 204) {
51
- return { kind: 'Applied' };
68
+ return {
69
+ kind: 'Applied',
70
+ ...(code === 204 ? { ancestryOnly: true as const } : {}),
71
+ ...(reply.position === undefined ? {} : { position: reply.position }),
72
+ };
52
73
  }
53
74
 
54
75
  if (code === 409) {
@@ -63,9 +84,9 @@ export function replicationApplyResultFromReply(
63
84
  return { kind: 'Deferred', reason: 'resolver-unavailable' };
64
85
  }
65
86
 
66
- const missing = dependencyRefFromStatus(message, code, detail, context);
67
- if (missing !== undefined) {
68
- return { kind: 'Incomplete', missing: [missing] };
87
+ const missing = dependencyRefsFromStatus(message, code, detail, context);
88
+ if (missing.length > 0) {
89
+ return { kind: 'Incomplete', missing };
69
90
  }
70
91
 
71
92
  if (code >= 500) {
@@ -75,40 +96,107 @@ export function replicationApplyResultFromReply(
75
96
  return { kind: 'Invalid', reason: detail || `replicated message rejected with status ${code}` };
76
97
  }
77
98
 
78
- function dependencyRefFromStatus(
99
+ /**
100
+ * Computes the complete set of locally-missing ancestor recordIds for a replicated message that
101
+ * failed on a missing ancestor — either the immediate parent referential check
102
+ * (`ProtocolAuthorizationParentRecordNotFound`) or record-chain construction
103
+ * (`ProtocolAuthorizationParentNotFoundConstructingRecordChain`).
104
+ *
105
+ * Both failures name a single ancestor, but the message's `contextId` names the full ancestor
106
+ * recordId chain, so every segment the failed check could not reach is presence-checked here and
107
+ * all absent segments are returned in one batch (ordered root-first, named ancestor last).
108
+ * Feeding the result to `replicationApplyResultFromReply()` via `ReplicationApplyResultContext`
109
+ * lets sync fetch the entire ancestry in a single pass instead of one level per retry.
110
+ *
111
+ * @returns the missing ancestor recordIds, or `undefined` when the reply is not a
112
+ * missing-ancestor failure or the chain cannot be determined from the message (callers
113
+ * then fall back to emitting the single ancestor named by the failure).
114
+ */
115
+ export async function missingAncestorRecordIdsFromReply(
116
+ tenant: string,
117
+ message: GenericMessage,
118
+ reply: { status: { detail?: string } },
119
+ validationStateReader: ValidationStateReader,
120
+ ): Promise<string[] | undefined> {
121
+ const detail = reply.status.detail ?? '';
122
+ const errorCode = getDwnErrorCode(detail);
123
+
124
+ let namedRecordId: string | undefined;
125
+ if (errorCode === DwnErrorCode.ProtocolAuthorizationParentRecordNotFound) {
126
+ namedRecordId = parentRecordIdFromMessage(message, detail);
127
+ } else if (errorCode === DwnErrorCode.ProtocolAuthorizationParentNotFoundConstructingRecordChain) {
128
+ namedRecordId = ancestorRecordIdFromDetail(detail);
129
+ } else {
130
+ return undefined;
131
+ }
132
+
133
+ const contextId = (message as { contextId?: unknown }).contextId;
134
+ if (namedRecordId === undefined || typeof contextId !== 'string') {
135
+ return undefined;
136
+ }
137
+
138
+ // `contextId` is the ancestor recordId chain ending with the record's own recordId. The failed
139
+ // check stopped at `namedRecordId`, so every segment below it is locally present; only the
140
+ // segments above it (closer to the root) still need a presence check. Presence means an initial
141
+ // write exists — exactly what record-chain construction reads for the segments above the
142
+ // immediate parent.
143
+ const ancestorRecordIds = contextId.split('/').slice(0, -1);
144
+ const namedIndex = ancestorRecordIds.indexOf(namedRecordId);
145
+ if (namedIndex === -1) {
146
+ return undefined;
147
+ }
148
+
149
+ const missingRecordIds: string[] = [];
150
+ for (const ancestorRecordId of ancestorRecordIds.slice(0, namedIndex)) {
151
+ const initialWrite = await validationStateReader.fetchInitialWrite(tenant, ancestorRecordId);
152
+ if (initialWrite === undefined) {
153
+ missingRecordIds.push(ancestorRecordId);
154
+ }
155
+ }
156
+ missingRecordIds.push(namedRecordId);
157
+
158
+ return missingRecordIds;
159
+ }
160
+
161
+ function dependencyRefsFromStatus(
79
162
  message: GenericMessage,
80
163
  code: number,
81
164
  detail: string,
82
165
  context: ReplicationApplyResultContext,
83
- ): DependencyRef | undefined {
166
+ ): DependencyRef[] {
84
167
  const errorCode = getDwnErrorCode(detail);
85
168
  switch (errorCode) {
86
169
  case DwnErrorCode.ProtocolAuthorizationProtocolNotFound:
87
170
  case DwnErrorCode.ProtocolsConfigureComposedProtocolNotInstalled:
88
- return protocolDependencyFromMessage(message, detail);
171
+ return toRefList(protocolDependencyFromMessage(message, detail));
89
172
  case DwnErrorCode.ProtocolAuthorizationParentRecordNotFound:
173
+ return parentDependenciesFromMessage(message, detail, context);
90
174
  case DwnErrorCode.ProtocolAuthorizationCrossProtocolParentNotFound:
91
- return parentDependencyFromMessage(message, detail);
175
+ return toRefList(parentDependencyFromMessage(message, detail));
92
176
  case DwnErrorCode.ProtocolAuthorizationParentNotFoundConstructingRecordChain:
93
- return ancestorDependencyFromMessage(message, detail);
177
+ return ancestorDependenciesFromMessage(message, detail, context);
94
178
  case DwnErrorCode.RecordsWriteGetInitialWriteNotFound:
95
- return initialWriteDependencyFromMessage(message);
179
+ return toRefList(initialWriteDependencyFromMessage(message));
96
180
  case DwnErrorCode.GrantAuthorizationGrantMissing:
97
- return grantDependencyFromMessage(message);
181
+ return toRefList(grantDependencyFromMessage(message));
98
182
  case DwnErrorCode.ProtocolAuthorizationMatchingRoleRecordNotFound:
99
- return roleDependencyFromMessage(message, context);
183
+ return toRefList(roleDependencyFromMessage(message, context));
100
184
  case DwnErrorCode.RecordsWriteMissingDataInPrevious:
101
185
  case DwnErrorCode.RecordsWriteMissingEncodedDataInPrevious:
102
- return recordDataDependencyFromMessage(message);
186
+ return toRefList(recordDataDependencyFromMessage(message));
103
187
  default:
104
188
  break;
105
189
  }
106
190
 
107
191
  if (code === 404 && isRecordsDelete(message)) {
108
- return { type: 'InitialWrite', recordId: getRecordsDeleteRecordId(message) };
192
+ return [{ type: 'InitialWrite', recordId: getRecordsDeleteRecordId(message) }];
109
193
  }
110
194
 
111
- return undefined;
195
+ return [];
196
+ }
197
+
198
+ function toRefList(ref: DependencyRef | undefined): DependencyRef[] {
199
+ return ref === undefined ? [] : [ref];
112
200
  }
113
201
 
114
202
  function getDwnErrorCode(detail: string): string | undefined {
@@ -130,32 +218,84 @@ function protocolDependencyFromMessage(message: GenericMessage, detail: string):
130
218
  return typeof protocol === 'string' ? { type: 'Protocol', protocol } : undefined;
131
219
  }
132
220
 
133
- function parentDependencyFromMessage(message: GenericMessage, detail: string): DependencyRef | undefined {
221
+ /**
222
+ * Emits the refs for an immediate-parent referential failure. The missing parent keeps its
223
+ * existing `Parent` ref; when the apply context carries the layer-batched missing-ancestor set
224
+ * (see `missingAncestorRecordIdsFromReply()`), an `Ancestor` ref is additionally emitted for
225
+ * every locally-absent segment above the parent, so the entire ancestry resolves in a single
226
+ * fetch pass instead of one level per retry.
227
+ */
228
+ function parentDependenciesFromMessage(
229
+ message: GenericMessage,
230
+ detail: string,
231
+ context: ReplicationApplyResultContext,
232
+ ): DependencyRef[] {
233
+ const parentRef = parentDependencyFromMessage(message, detail);
234
+ if (parentRef === undefined) {
235
+ return [];
236
+ }
237
+
238
+ const protocol = (message.descriptor as Record<string, unknown>).protocol;
239
+ const protocolProperty = typeof protocol === 'string' ? { protocol } : {};
240
+ const ancestorRefs = (context.missingAncestorRecordIds ?? [])
241
+ .filter((recordId): boolean => recordId !== parentRef.recordId)
242
+ .map((recordId): DependencyRef => ({ type: 'Ancestor', recordId, ...protocolProperty }));
243
+
244
+ return [...ancestorRefs, parentRef];
245
+ }
246
+
247
+ function parentDependencyFromMessage(
248
+ message: GenericMessage,
249
+ detail: string,
250
+ ): Extract<DependencyRef, { type: 'Parent' }> | undefined {
134
251
  const descriptor = message.descriptor as Record<string, unknown>;
135
- const parentId = typeof descriptor.parentId === 'string'
136
- ? descriptor.parentId
137
- : /parent record '([^']+)'/.exec(detail)?.[1];
252
+ const parentId = parentRecordIdFromMessage(message, detail);
138
253
  const protocol = /in protocol '([^']+)'/.exec(detail)?.[1] ?? descriptor.protocol;
139
254
 
140
- if (typeof parentId !== 'string' || typeof protocol !== 'string') {
255
+ if (parentId === undefined || typeof protocol !== 'string') {
141
256
  return undefined;
142
257
  }
143
258
 
144
259
  return { type: 'Parent', recordId: parentId, protocol };
145
260
  }
146
261
 
147
- function ancestorDependencyFromMessage(message: GenericMessage, detail: string): DependencyRef | undefined {
148
- const recordId = /ID ([^ ]+)/.exec(detail)?.[1];
149
- if (recordId === undefined) {
150
- return undefined;
151
- }
262
+ function parentRecordIdFromMessage(message: GenericMessage, detail: string): string | undefined {
263
+ const descriptor = message.descriptor as Record<string, unknown>;
264
+ return typeof descriptor.parentId === 'string'
265
+ ? descriptor.parentId
266
+ : /parent record '([^']+)'/.exec(detail)?.[1];
267
+ }
152
268
 
269
+ /**
270
+ * Emits `Ancestor` refs for a record-chain construction failure. When the apply context carries
271
+ * the layer-batched missing-ancestor set (see `missingAncestorRecordIdsFromReply()`), one ref is
272
+ * emitted per missing segment so the entire ancestry resolves in a single fetch pass; otherwise
273
+ * falls back to the single ancestor named by the failure detail (e.g. for messages that carry no
274
+ * `contextId` chain).
275
+ */
276
+ function ancestorDependenciesFromMessage(
277
+ message: GenericMessage,
278
+ detail: string,
279
+ context: ReplicationApplyResultContext,
280
+ ): DependencyRef[] {
153
281
  const protocol = (message.descriptor as Record<string, unknown>).protocol;
154
- return {
155
- type: 'Ancestor',
156
- recordId,
157
- ...(typeof protocol === 'string' ? { protocol } : {}),
158
- };
282
+ const protocolProperty = typeof protocol === 'string' ? { protocol } : {};
283
+
284
+ const batchedRecordIds = context.missingAncestorRecordIds;
285
+ if (batchedRecordIds !== undefined && batchedRecordIds.length > 0) {
286
+ return batchedRecordIds.map((recordId): DependencyRef => ({ type: 'Ancestor', recordId, ...protocolProperty }));
287
+ }
288
+
289
+ const namedRecordId = ancestorRecordIdFromDetail(detail);
290
+ if (namedRecordId === undefined) {
291
+ return [];
292
+ }
293
+
294
+ return [{ type: 'Ancestor', recordId: namedRecordId, ...protocolProperty }];
295
+ }
296
+
297
+ function ancestorRecordIdFromDetail(detail: string): string | undefined {
298
+ return /ID ([^ ]+)/.exec(detail)?.[1];
159
299
  }
160
300
 
161
301
  function initialWriteDependencyFromMessage(message: GenericMessage): DependencyRef | undefined {
@@ -11,6 +11,7 @@ export type ResumableTask = {
11
11
  data: any;
12
12
  };
13
13
 
14
+ type ResumableTaskHandler = (taskData: any) => Promise<unknown>;
14
15
 
15
16
  export class ResumableTaskManager {
16
17
 
@@ -20,34 +21,34 @@ export class ResumableTaskManager {
20
21
  public static readonly timeoutExtensionFrequencyInSeconds = 30;
21
22
 
22
23
  private resumableTaskBatchSize = 100;
23
- private readonly resumableTaskHandlers: { [key:string]: (taskData: any) => Promise<void> };
24
+ private readonly resumableTaskHandlers: { [key:string]: ResumableTaskHandler };
24
25
 
25
26
  public constructor(private readonly resumableTaskStore: ResumableTaskStore, storageController: StorageController) {
26
27
  // assign resumable task handlers
27
28
  this.resumableTaskHandlers = {
28
29
  // NOTE: The arrow function is IMPORTANT here, else the `this` context will be lost within the invoked method.
29
30
  // e.g. code within performRecordsDelete() won't know `this` refers to the `storageController` instance.
30
- [ResumableTaskName.RecordsDelete] : async (task): Promise<void> => await storageController.performRecordsDelete(task),
31
- [ResumableTaskName.RecordsSquash] : async (task): Promise<void> => await storageController.performRecordsSquash(task),
31
+ [ResumableTaskName.RecordsDelete] : async (task): Promise<unknown> => storageController.performRecordsDelete(task),
32
+ [ResumableTaskName.RecordsSquash] : async (task): Promise<unknown> => storageController.performRecordsSquash(task),
32
33
  };
33
34
  }
34
35
 
35
36
  /**
36
37
  * Runs a new resumable task.
37
38
  */
38
- public async run(task: ResumableTask): Promise<void> {
39
+ public async run<T = unknown>(task: ResumableTask): Promise<T> {
39
40
  const timeoutInSeconds = ResumableTaskManager.timeoutExtensionFrequencyInSeconds * 2; // give ample time for extension to take place
40
41
 
41
42
  // register the new resumable task before running it so that it can be resumed if it times out for any reason
42
43
  const managedResumableTask = await this.resumableTaskStore.register(task, timeoutInSeconds);
43
- await this.runWithAutomaticTimeoutExtension(managedResumableTask);
44
+ return this.runWithAutomaticTimeoutExtension<T>(managedResumableTask);
44
45
  }
45
46
 
46
47
  /**
47
48
  * Runs a resumable task with automatic timeout extension.
48
49
  * Deletes the task from the resumable task store once it is completed.
49
50
  */
50
- private async runWithAutomaticTimeoutExtension(managedTask: ManagedResumableTask): Promise<void> {
51
+ private async runWithAutomaticTimeoutExtension<T = unknown>(managedTask: ManagedResumableTask): Promise<T> {
51
52
  const timeoutInSeconds = ResumableTaskManager.timeoutExtensionFrequencyInSeconds * 2; // give ample time for extension to take place
52
53
 
53
54
  let timer!: ReturnType<typeof setInterval>;
@@ -58,8 +59,9 @@ export class ResumableTaskManager {
58
59
  }, ResumableTaskManager.timeoutExtensionFrequencyInSeconds * 1000);
59
60
 
60
61
  const handler = this.resumableTaskHandlers[managedTask.task.name];
61
- await handler(managedTask.task.data);
62
+ const result = await handler(managedTask.task.data) as T;
62
63
  await this.resumableTaskStore.delete(managedTask.id);
64
+ return result;
63
65
  } finally {
64
66
  ResumableTaskManager.clearTimeoutExtensionTimer(timer);
65
67
  }
@@ -112,4 +114,4 @@ export class ResumableTaskManager {
112
114
  }
113
115
  }
114
116
  }
115
- }
117
+ }