@enbox/dwn-sdk-js 0.4.0 → 0.4.1

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 (513) hide show
  1. package/README.md +4 -4
  2. package/dist/browser.mjs +8 -8
  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 +30 -68
  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 +7 -3
  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/record-limit-occupancy.js +244 -0
  99. package/dist/esm/src/utils/record-limit-occupancy.js.map +1 -0
  100. package/dist/esm/src/utils/records.js +50 -14
  101. package/dist/esm/src/utils/records.js.map +1 -1
  102. package/dist/esm/src/utils/replication.js +85 -0
  103. package/dist/esm/src/utils/replication.js.map +1 -0
  104. package/dist/esm/tests/core/grant-authorization.spec.js +4 -4
  105. package/dist/esm/tests/core/grant-authorization.spec.js.map +1 -1
  106. package/dist/esm/tests/core/process-message-parity.spec.js +222 -0
  107. package/dist/esm/tests/core/process-message-parity.spec.js.map +1 -0
  108. package/dist/esm/tests/core/protocol-authorization.spec.js +5 -2
  109. package/dist/esm/tests/core/protocol-authorization.spec.js.map +1 -1
  110. package/dist/esm/tests/core/records-grant-authorization.spec.js +5 -5
  111. package/dist/esm/tests/core/records-grant-authorization.spec.js.map +1 -1
  112. package/dist/esm/tests/core/replication-apply.spec.js +55 -1
  113. package/dist/esm/tests/core/replication-apply.spec.js.map +1 -1
  114. package/dist/esm/tests/core/replication-replay-property.spec.js +350 -0
  115. package/dist/esm/tests/core/replication-replay-property.spec.js.map +1 -0
  116. package/dist/esm/tests/core/validation-read-closure.spec.js +469 -0
  117. package/dist/esm/tests/core/validation-read-closure.spec.js.map +1 -0
  118. package/dist/esm/tests/core/validation-state-reader.spec.js +716 -0
  119. package/dist/esm/tests/core/validation-state-reader.spec.js.map +1 -0
  120. package/dist/esm/tests/durable-event-log.spec.js +373 -0
  121. package/dist/esm/tests/durable-event-log.spec.js.map +1 -0
  122. package/dist/esm/tests/dwn.spec.js +504 -35
  123. package/dist/esm/tests/dwn.spec.js.map +1 -1
  124. package/dist/esm/tests/features/author-delegated-grant.spec.js +9 -6
  125. package/dist/esm/tests/features/author-delegated-grant.spec.js.map +1 -1
  126. package/dist/esm/tests/features/owner-delegated-grant.spec.js +1 -4
  127. package/dist/esm/tests/features/owner-delegated-grant.spec.js.map +1 -1
  128. package/dist/esm/tests/features/owner-signature.spec.js +1 -4
  129. package/dist/esm/tests/features/owner-signature.spec.js.map +1 -1
  130. package/dist/esm/tests/features/permissions.spec.js +165 -4
  131. package/dist/esm/tests/features/permissions.spec.js.map +1 -1
  132. package/dist/esm/tests/features/protocol-composition.spec.js +8 -11
  133. package/dist/esm/tests/features/protocol-composition.spec.js.map +1 -1
  134. package/dist/esm/tests/features/protocol-create-action.spec.js +1 -4
  135. package/dist/esm/tests/features/protocol-create-action.spec.js.map +1 -1
  136. package/dist/esm/tests/features/protocol-delete-action.spec.js +3 -5
  137. package/dist/esm/tests/features/protocol-delete-action.spec.js.map +1 -1
  138. package/dist/esm/tests/features/protocol-update-action.spec.js +3 -6
  139. package/dist/esm/tests/features/protocol-update-action.spec.js.map +1 -1
  140. package/dist/esm/tests/features/records-delivery.spec.js +1 -4
  141. package/dist/esm/tests/features/records-delivery.spec.js.map +1 -1
  142. package/dist/esm/tests/features/records-immutable.spec.js +1 -4
  143. package/dist/esm/tests/features/records-immutable.spec.js.map +1 -1
  144. package/dist/esm/tests/features/records-nested-query-scope.spec.js +281 -0
  145. package/dist/esm/tests/features/records-nested-query-scope.spec.js.map +1 -0
  146. package/dist/esm/tests/features/records-prune-cross-protocol.spec.js +3 -7
  147. package/dist/esm/tests/features/records-prune-cross-protocol.spec.js.map +1 -1
  148. package/dist/esm/tests/features/records-prune.spec.js +11 -22
  149. package/dist/esm/tests/features/records-prune.spec.js.map +1 -1
  150. package/dist/esm/tests/features/records-record-limit.spec.js +441 -231
  151. package/dist/esm/tests/features/records-record-limit.spec.js.map +1 -1
  152. package/dist/esm/tests/features/records-squash.spec.js +6 -4
  153. package/dist/esm/tests/features/records-squash.spec.js.map +1 -1
  154. package/dist/esm/tests/features/records-tags.spec.js +1 -4
  155. package/dist/esm/tests/features/records-tags.spec.js.map +1 -1
  156. package/dist/esm/tests/features/resumable-tasks.spec.js +3 -5
  157. package/dist/esm/tests/features/resumable-tasks.spec.js.map +1 -1
  158. package/dist/esm/tests/fuzz/message-store.fuzz.spec.js +1 -2
  159. package/dist/esm/tests/fuzz/message-store.fuzz.spec.js.map +1 -1
  160. package/dist/esm/tests/fuzz/process-message.fuzz.spec.js +2 -4
  161. package/dist/esm/tests/fuzz/process-message.fuzz.spec.js.map +1 -1
  162. package/dist/esm/tests/fuzz/schema-validation.fuzz.spec.js +1 -1
  163. package/dist/esm/tests/fuzz/schema-validation.fuzz.spec.js.map +1 -1
  164. package/dist/esm/tests/handlers/messages-query.spec.js +246 -0
  165. package/dist/esm/tests/handlers/messages-query.spec.js.map +1 -0
  166. package/dist/esm/tests/handlers/messages-read.spec.js +2 -5
  167. package/dist/esm/tests/handlers/messages-read.spec.js.map +1 -1
  168. package/dist/esm/tests/handlers/messages-subscribe.spec.js +3 -14
  169. package/dist/esm/tests/handlers/messages-subscribe.spec.js.map +1 -1
  170. package/dist/esm/tests/handlers/protocols-configure.spec.js +27 -26
  171. package/dist/esm/tests/handlers/protocols-configure.spec.js.map +1 -1
  172. package/dist/esm/tests/handlers/protocols-query.spec.js +1 -4
  173. package/dist/esm/tests/handlers/protocols-query.spec.js.map +1 -1
  174. package/dist/esm/tests/handlers/records-count.spec.js +1 -4
  175. package/dist/esm/tests/handlers/records-count.spec.js.map +1 -1
  176. package/dist/esm/tests/handlers/records-delete.spec.js +312 -30
  177. package/dist/esm/tests/handlers/records-delete.spec.js.map +1 -1
  178. package/dist/esm/tests/handlers/records-query.spec.js +32 -9
  179. package/dist/esm/tests/handlers/records-query.spec.js.map +1 -1
  180. package/dist/esm/tests/handlers/records-read.spec.js +4 -4
  181. package/dist/esm/tests/handlers/records-read.spec.js.map +1 -1
  182. package/dist/esm/tests/handlers/records-subscribe.spec.js +33 -14
  183. package/dist/esm/tests/handlers/records-subscribe.spec.js.map +1 -1
  184. package/dist/esm/tests/handlers/records-write.spec.js +82 -36
  185. package/dist/esm/tests/handlers/records-write.spec.js.map +1 -1
  186. package/dist/esm/tests/interfaces/records-delete.spec.js +69 -2
  187. package/dist/esm/tests/interfaces/records-delete.spec.js.map +1 -1
  188. package/dist/esm/tests/interfaces/records-write.spec.js +4 -3
  189. package/dist/esm/tests/interfaces/records-write.spec.js.map +1 -1
  190. package/dist/esm/tests/protocols/permissions.spec.js +55 -6
  191. package/dist/esm/tests/protocols/permissions.spec.js.map +1 -1
  192. package/dist/esm/tests/scenarios/aggregator.spec.js +1 -4
  193. package/dist/esm/tests/scenarios/aggregator.spec.js.map +1 -1
  194. package/dist/esm/tests/scenarios/deleted-record.spec.js +1 -4
  195. package/dist/esm/tests/scenarios/deleted-record.spec.js.map +1 -1
  196. package/dist/esm/tests/scenarios/end-to-end-tests.spec.js +1 -4
  197. package/dist/esm/tests/scenarios/end-to-end-tests.spec.js.map +1 -1
  198. package/dist/esm/tests/scenarios/nested-roles.spec.js +1 -4
  199. package/dist/esm/tests/scenarios/nested-roles.spec.js.map +1 -1
  200. package/dist/esm/tests/scenarios/subscriptions.spec.js +1 -4
  201. package/dist/esm/tests/scenarios/subscriptions.spec.js.map +1 -1
  202. package/dist/esm/tests/store/message-store-level.spec.js +361 -5
  203. package/dist/esm/tests/store/message-store-level.spec.js.map +1 -1
  204. package/dist/esm/tests/store/message-store.spec.js +60 -0
  205. package/dist/esm/tests/store/message-store.spec.js.map +1 -1
  206. package/dist/esm/tests/test-event-stream.js +7 -3
  207. package/dist/esm/tests/test-event-stream.js.map +1 -1
  208. package/dist/esm/tests/test-stores.js +19 -9
  209. package/dist/esm/tests/test-stores.js.map +1 -1
  210. package/dist/esm/tests/test-suite.js +4 -2
  211. package/dist/esm/tests/test-suite.js.map +1 -1
  212. package/dist/esm/tests/utils/test-data-generator.js +25 -0
  213. package/dist/esm/tests/utils/test-data-generator.js.map +1 -1
  214. package/dist/esm/tests/utils/test-stub-generator.js.map +1 -1
  215. package/dist/esm/tests/utils/test-validation-state-reader.js +16 -0
  216. package/dist/esm/tests/utils/test-validation-state-reader.js.map +1 -0
  217. package/dist/types/generated/precompiled-validators.d.ts +6 -6
  218. package/dist/types/generated/precompiled-validators.d.ts.map +1 -1
  219. package/dist/types/src/core/core-protocol.d.ts +3 -3
  220. package/dist/types/src/core/core-protocol.d.ts.map +1 -1
  221. package/dist/types/src/core/dwn-constant.d.ts +5 -0
  222. package/dist/types/src/core/dwn-constant.d.ts.map +1 -1
  223. package/dist/types/src/core/dwn-error.d.ts +12 -4
  224. package/dist/types/src/core/dwn-error.d.ts.map +1 -1
  225. package/dist/types/src/core/grant-authorization.d.ts +5 -5
  226. package/dist/types/src/core/grant-authorization.d.ts.map +1 -1
  227. package/dist/types/src/core/message-reply.d.ts +5 -4
  228. package/dist/types/src/core/message-reply.d.ts.map +1 -1
  229. package/dist/types/src/core/messages-grant-authorization.d.ts +12 -14
  230. package/dist/types/src/core/messages-grant-authorization.d.ts.map +1 -1
  231. package/dist/types/src/core/protocol-authorization-action.d.ts +4 -5
  232. package/dist/types/src/core/protocol-authorization-action.d.ts.map +1 -1
  233. package/dist/types/src/core/protocol-authorization-validation.d.ts +13 -16
  234. package/dist/types/src/core/protocol-authorization-validation.d.ts.map +1 -1
  235. package/dist/types/src/core/protocol-authorization.d.ts +8 -33
  236. package/dist/types/src/core/protocol-authorization.d.ts.map +1 -1
  237. package/dist/types/src/core/protocols-grant-authorization.d.ts +4 -4
  238. package/dist/types/src/core/protocols-grant-authorization.d.ts.map +1 -1
  239. package/dist/types/src/core/recording-validation-state-reader.d.ts +75 -0
  240. package/dist/types/src/core/recording-validation-state-reader.d.ts.map +1 -0
  241. package/dist/types/src/core/records-grant-authorization.d.ts +8 -8
  242. package/dist/types/src/core/records-grant-authorization.d.ts.map +1 -1
  243. package/dist/types/src/core/replication-apply.d.ts +36 -0
  244. package/dist/types/src/core/replication-apply.d.ts.map +1 -1
  245. package/dist/types/src/core/resumable-task-manager.d.ts +1 -1
  246. package/dist/types/src/core/resumable-task-manager.d.ts.map +1 -1
  247. package/dist/types/src/core/validation-state-reader.d.ts +79 -0
  248. package/dist/types/src/core/validation-state-reader.d.ts.map +1 -0
  249. package/dist/types/src/dwn.d.ts +33 -20
  250. package/dist/types/src/dwn.d.ts.map +1 -1
  251. package/dist/types/src/enums/dwn-interface-method.d.ts +0 -1
  252. package/dist/types/src/enums/dwn-interface-method.d.ts.map +1 -1
  253. package/dist/types/src/event-stream/durable-event-log.d.ts +69 -0
  254. package/dist/types/src/event-stream/durable-event-log.d.ts.map +1 -0
  255. package/dist/types/src/event-stream/event-emitter-wake-publisher.d.ts +13 -0
  256. package/dist/types/src/event-stream/event-emitter-wake-publisher.d.ts.map +1 -0
  257. package/dist/types/src/handlers/messages-query.d.ts +20 -0
  258. package/dist/types/src/handlers/messages-query.d.ts.map +1 -0
  259. package/dist/types/src/handlers/messages-read.d.ts +1 -1
  260. package/dist/types/src/handlers/messages-read.d.ts.map +1 -1
  261. package/dist/types/src/handlers/messages-subscribe.d.ts.map +1 -1
  262. package/dist/types/src/handlers/protocols-configure.d.ts +0 -5
  263. package/dist/types/src/handlers/protocols-configure.d.ts.map +1 -1
  264. package/dist/types/src/handlers/records-count.d.ts +2 -1
  265. package/dist/types/src/handlers/records-count.d.ts.map +1 -1
  266. package/dist/types/src/handlers/records-delete.d.ts +2 -2
  267. package/dist/types/src/handlers/records-delete.d.ts.map +1 -1
  268. package/dist/types/src/handlers/records-query.d.ts +1 -1
  269. package/dist/types/src/handlers/records-query.d.ts.map +1 -1
  270. package/dist/types/src/handlers/records-read.d.ts +2 -1
  271. package/dist/types/src/handlers/records-read.d.ts.map +1 -1
  272. package/dist/types/src/handlers/records-subscribe.d.ts +4 -5
  273. package/dist/types/src/handlers/records-subscribe.d.ts.map +1 -1
  274. package/dist/types/src/handlers/records-write.d.ts +3 -11
  275. package/dist/types/src/handlers/records-write.d.ts.map +1 -1
  276. package/dist/types/src/index.d.ts +14 -16
  277. package/dist/types/src/index.d.ts.map +1 -1
  278. package/dist/types/src/interfaces/messages-query.d.ts +23 -0
  279. package/dist/types/src/interfaces/messages-query.d.ts.map +1 -0
  280. package/dist/types/src/interfaces/protocols-configure.d.ts +3 -3
  281. package/dist/types/src/interfaces/protocols-configure.d.ts.map +1 -1
  282. package/dist/types/src/interfaces/protocols-query.d.ts +2 -2
  283. package/dist/types/src/interfaces/protocols-query.d.ts.map +1 -1
  284. package/dist/types/src/interfaces/records-count.d.ts +3 -3
  285. package/dist/types/src/interfaces/records-count.d.ts.map +1 -1
  286. package/dist/types/src/interfaces/records-delete.d.ts +11 -3
  287. package/dist/types/src/interfaces/records-delete.d.ts.map +1 -1
  288. package/dist/types/src/interfaces/records-query.d.ts +3 -3
  289. package/dist/types/src/interfaces/records-query.d.ts.map +1 -1
  290. package/dist/types/src/interfaces/records-read.d.ts +3 -3
  291. package/dist/types/src/interfaces/records-read.d.ts.map +1 -1
  292. package/dist/types/src/interfaces/records-subscribe.d.ts +3 -3
  293. package/dist/types/src/interfaces/records-subscribe.d.ts.map +1 -1
  294. package/dist/types/src/interfaces/records-write.d.ts +15 -7
  295. package/dist/types/src/interfaces/records-write.d.ts.map +1 -1
  296. package/dist/types/src/protocols/permissions.d.ts +9 -12
  297. package/dist/types/src/protocols/permissions.d.ts.map +1 -1
  298. package/dist/types/src/store/index-level.d.ts +10 -1
  299. package/dist/types/src/store/index-level.d.ts.map +1 -1
  300. package/dist/types/src/store/level-wrapper.d.ts +5 -0
  301. package/dist/types/src/store/level-wrapper.d.ts.map +1 -1
  302. package/dist/types/src/store/message-store-level.d.ts +94 -14
  303. package/dist/types/src/store/message-store-level.d.ts.map +1 -1
  304. package/dist/types/src/store/storage-controller.d.ts +17 -14
  305. package/dist/types/src/store/storage-controller.d.ts.map +1 -1
  306. package/dist/types/src/types/message-store.d.ts +29 -1
  307. package/dist/types/src/types/message-store.d.ts.map +1 -1
  308. package/dist/types/src/types/message-types.d.ts +2 -0
  309. package/dist/types/src/types/message-types.d.ts.map +1 -1
  310. package/dist/types/src/types/messages-types.d.ts +21 -37
  311. package/dist/types/src/types/messages-types.d.ts.map +1 -1
  312. package/dist/types/src/types/method-handler.d.ts +2 -2
  313. package/dist/types/src/types/method-handler.d.ts.map +1 -1
  314. package/dist/types/src/types/permission-types.d.ts +1 -1
  315. package/dist/types/src/types/subscriptions.d.ts +50 -39
  316. package/dist/types/src/types/subscriptions.d.ts.map +1 -1
  317. package/dist/types/src/types/validation-state-reader.d.ts +116 -0
  318. package/dist/types/src/types/validation-state-reader.d.ts.map +1 -0
  319. package/dist/types/src/utils/messages.d.ts +10 -0
  320. package/dist/types/src/utils/messages.d.ts.map +1 -1
  321. package/dist/types/src/utils/record-limit-occupancy.d.ts +40 -0
  322. package/dist/types/src/utils/record-limit-occupancy.d.ts.map +1 -0
  323. package/dist/types/src/utils/records.d.ts +25 -3
  324. package/dist/types/src/utils/records.d.ts.map +1 -1
  325. package/dist/types/src/utils/replication.d.ts +22 -0
  326. package/dist/types/src/utils/replication.d.ts.map +1 -0
  327. package/dist/types/tests/core/process-message-parity.spec.d.ts +2 -0
  328. package/dist/types/tests/core/process-message-parity.spec.d.ts.map +1 -0
  329. package/dist/types/tests/core/replication-replay-property.spec.d.ts +2 -0
  330. package/dist/types/tests/core/replication-replay-property.spec.d.ts.map +1 -0
  331. package/dist/types/tests/core/validation-read-closure.spec.d.ts +2 -0
  332. package/dist/types/tests/core/validation-read-closure.spec.d.ts.map +1 -0
  333. package/dist/types/tests/core/validation-state-reader.spec.d.ts +2 -0
  334. package/dist/types/tests/core/validation-state-reader.spec.d.ts.map +1 -0
  335. package/dist/types/tests/durable-event-log.spec.d.ts +2 -0
  336. package/dist/types/tests/durable-event-log.spec.d.ts.map +1 -0
  337. package/dist/types/tests/dwn.spec.d.ts.map +1 -1
  338. package/dist/types/tests/features/author-delegated-grant.spec.d.ts.map +1 -1
  339. package/dist/types/tests/features/owner-delegated-grant.spec.d.ts.map +1 -1
  340. package/dist/types/tests/features/owner-signature.spec.d.ts.map +1 -1
  341. package/dist/types/tests/features/permissions.spec.d.ts.map +1 -1
  342. package/dist/types/tests/features/protocol-composition.spec.d.ts.map +1 -1
  343. package/dist/types/tests/features/protocol-create-action.spec.d.ts.map +1 -1
  344. package/dist/types/tests/features/protocol-delete-action.spec.d.ts.map +1 -1
  345. package/dist/types/tests/features/protocol-update-action.spec.d.ts.map +1 -1
  346. package/dist/types/tests/features/records-delivery.spec.d.ts.map +1 -1
  347. package/dist/types/tests/features/records-immutable.spec.d.ts.map +1 -1
  348. package/dist/types/tests/features/records-nested-query-scope.spec.d.ts +2 -0
  349. package/dist/types/tests/features/records-nested-query-scope.spec.d.ts.map +1 -0
  350. package/dist/types/tests/features/records-prune-cross-protocol.spec.d.ts.map +1 -1
  351. package/dist/types/tests/features/records-prune.spec.d.ts.map +1 -1
  352. package/dist/types/tests/features/records-record-limit.spec.d.ts.map +1 -1
  353. package/dist/types/tests/features/records-squash.spec.d.ts.map +1 -1
  354. package/dist/types/tests/features/records-tags.spec.d.ts.map +1 -1
  355. package/dist/types/tests/features/resumable-tasks.spec.d.ts.map +1 -1
  356. package/dist/types/tests/handlers/messages-query.spec.d.ts +2 -0
  357. package/dist/types/tests/handlers/messages-query.spec.d.ts.map +1 -0
  358. package/dist/types/tests/handlers/messages-read.spec.d.ts.map +1 -1
  359. package/dist/types/tests/handlers/messages-subscribe.spec.d.ts.map +1 -1
  360. package/dist/types/tests/handlers/protocols-configure.spec.d.ts.map +1 -1
  361. package/dist/types/tests/handlers/protocols-query.spec.d.ts.map +1 -1
  362. package/dist/types/tests/handlers/records-count.spec.d.ts.map +1 -1
  363. package/dist/types/tests/handlers/records-delete.spec.d.ts.map +1 -1
  364. package/dist/types/tests/handlers/records-query.spec.d.ts.map +1 -1
  365. package/dist/types/tests/handlers/records-read.spec.d.ts.map +1 -1
  366. package/dist/types/tests/handlers/records-subscribe.spec.d.ts.map +1 -1
  367. package/dist/types/tests/handlers/records-write.spec.d.ts.map +1 -1
  368. package/dist/types/tests/scenarios/deleted-record.spec.d.ts.map +1 -1
  369. package/dist/types/tests/scenarios/end-to-end-tests.spec.d.ts.map +1 -1
  370. package/dist/types/tests/scenarios/nested-roles.spec.d.ts.map +1 -1
  371. package/dist/types/tests/scenarios/subscriptions.spec.d.ts.map +1 -1
  372. package/dist/types/tests/store/message-store.spec.d.ts.map +1 -1
  373. package/dist/types/tests/test-event-stream.d.ts +1 -1
  374. package/dist/types/tests/test-event-stream.d.ts.map +1 -1
  375. package/dist/types/tests/test-stores.d.ts +5 -4
  376. package/dist/types/tests/test-stores.d.ts.map +1 -1
  377. package/dist/types/tests/test-suite.d.ts +1 -2
  378. package/dist/types/tests/test-suite.d.ts.map +1 -1
  379. package/dist/types/tests/utils/test-data-generator.d.ts +20 -1
  380. package/dist/types/tests/utils/test-data-generator.d.ts.map +1 -1
  381. package/dist/types/tests/utils/test-validation-state-reader.d.ts +15 -0
  382. package/dist/types/tests/utils/test-validation-state-reader.d.ts.map +1 -0
  383. package/package.json +2 -2
  384. package/src/core/core-protocol.ts +3 -3
  385. package/src/core/dwn-constant.ts +7 -1
  386. package/src/core/dwn-error.ts +12 -4
  387. package/src/core/grant-authorization.ts +11 -20
  388. package/src/core/message-reply.ts +6 -5
  389. package/src/core/messages-grant-authorization.ts +37 -70
  390. package/src/core/protocol-authorization-action.ts +29 -38
  391. package/src/core/protocol-authorization-validation.ts +39 -96
  392. package/src/core/protocol-authorization.ts +56 -202
  393. package/src/core/protocols-grant-authorization.ts +9 -9
  394. package/src/core/recording-validation-state-reader.ts +130 -0
  395. package/src/core/records-grant-authorization.ts +16 -16
  396. package/src/core/replication-apply.ts +172 -32
  397. package/src/core/resumable-task-manager.ts +10 -8
  398. package/src/core/validation-state-reader.ts +350 -0
  399. package/src/dwn.ts +285 -192
  400. package/src/enums/dwn-interface-method.ts +0 -1
  401. package/src/event-stream/durable-event-log.ts +509 -0
  402. package/src/event-stream/event-emitter-wake-publisher.ts +34 -0
  403. package/src/handlers/messages-query.ts +203 -0
  404. package/src/handlers/messages-read.ts +9 -10
  405. package/src/handlers/messages-subscribe.ts +12 -13
  406. package/src/handlers/protocols-configure.ts +37 -58
  407. package/src/handlers/protocols-query.ts +1 -1
  408. package/src/handlers/records-count.ts +24 -17
  409. package/src/handlers/records-delete.ts +29 -27
  410. package/src/handlers/records-query.ts +38 -17
  411. package/src/handlers/records-read.ts +63 -50
  412. package/src/handlers/records-subscribe.ts +132 -19
  413. package/src/handlers/records-write.ts +77 -168
  414. package/src/index.ts +14 -17
  415. package/src/interfaces/messages-query.ts +70 -0
  416. package/src/interfaces/protocols-configure.ts +12 -4
  417. package/src/interfaces/protocols-query.ts +4 -5
  418. package/src/interfaces/records-count.ts +9 -4
  419. package/src/interfaces/records-delete.ts +25 -5
  420. package/src/interfaces/records-query.ts +9 -4
  421. package/src/interfaces/records-read.ts +4 -4
  422. package/src/interfaces/records-subscribe.ts +9 -4
  423. package/src/interfaces/records-write.ts +41 -13
  424. package/src/protocols/permissions.ts +32 -52
  425. package/src/store/index-level.ts +30 -9
  426. package/src/store/level-wrapper.ts +9 -1
  427. package/src/store/message-store-level.ts +757 -47
  428. package/src/store/storage-controller.ts +74 -63
  429. package/src/types/message-store.ts +45 -2
  430. package/src/types/message-types.ts +3 -1
  431. package/src/types/messages-types.ts +26 -45
  432. package/src/types/method-handler.ts +3 -3
  433. package/src/types/permission-types.ts +1 -1
  434. package/src/types/subscriptions.ts +53 -42
  435. package/src/types/validation-state-reader.ts +127 -0
  436. package/src/utils/messages.ts +25 -1
  437. package/src/utils/record-limit-occupancy.ts +377 -0
  438. package/src/utils/records.ts +69 -13
  439. package/src/utils/replication.ts +122 -0
  440. package/dist/esm/src/core/record-chain.js +0 -64
  441. package/dist/esm/src/core/record-chain.js.map +0 -1
  442. package/dist/esm/src/event-stream/event-emitter-event-log.js +0 -334
  443. package/dist/esm/src/event-stream/event-emitter-event-log.js.map +0 -1
  444. package/dist/esm/src/handlers/messages-sync.js +0 -278
  445. package/dist/esm/src/handlers/messages-sync.js.map +0 -1
  446. package/dist/esm/src/interfaces/messages-sync.js.map +0 -1
  447. package/dist/esm/src/smt/smt-store-level.js +0 -103
  448. package/dist/esm/src/smt/smt-store-level.js.map +0 -1
  449. package/dist/esm/src/smt/smt-store-memory.js +0 -41
  450. package/dist/esm/src/smt/smt-store-memory.js.map +0 -1
  451. package/dist/esm/src/smt/smt-utils.js +0 -129
  452. package/dist/esm/src/smt/smt-utils.js.map +0 -1
  453. package/dist/esm/src/smt/sparse-merkle-tree.js +0 -577
  454. package/dist/esm/src/smt/sparse-merkle-tree.js.map +0 -1
  455. package/dist/esm/src/state-index/state-index-level.js +0 -191
  456. package/dist/esm/src/state-index/state-index-level.js.map +0 -1
  457. package/dist/esm/src/types/smt-types.js +0 -5
  458. package/dist/esm/src/types/smt-types.js.map +0 -1
  459. package/dist/esm/src/types/state-index.js +0 -2
  460. package/dist/esm/src/types/state-index.js.map +0 -1
  461. package/dist/esm/tests/event-emitter-event-log.spec.js +0 -499
  462. package/dist/esm/tests/event-emitter-event-log.spec.js.map +0 -1
  463. package/dist/esm/tests/handlers/messages-sync.spec.js +0 -1088
  464. package/dist/esm/tests/handlers/messages-sync.spec.js.map +0 -1
  465. package/dist/esm/tests/smt/smt-store-level.spec.js +0 -132
  466. package/dist/esm/tests/smt/smt-store-level.spec.js.map +0 -1
  467. package/dist/esm/tests/smt/sparse-merkle-tree.spec.js +0 -732
  468. package/dist/esm/tests/smt/sparse-merkle-tree.spec.js.map +0 -1
  469. package/dist/esm/tests/state-index/state-index-level.spec.js +0 -245
  470. package/dist/esm/tests/state-index/state-index-level.spec.js.map +0 -1
  471. package/dist/types/src/core/record-chain.d.ts +0 -24
  472. package/dist/types/src/core/record-chain.d.ts.map +0 -1
  473. package/dist/types/src/event-stream/event-emitter-event-log.d.ts +0 -80
  474. package/dist/types/src/event-stream/event-emitter-event-log.d.ts.map +0 -1
  475. package/dist/types/src/handlers/messages-sync.d.ts +0 -39
  476. package/dist/types/src/handlers/messages-sync.d.ts.map +0 -1
  477. package/dist/types/src/interfaces/messages-sync.d.ts +0 -20
  478. package/dist/types/src/interfaces/messages-sync.d.ts.map +0 -1
  479. package/dist/types/src/smt/smt-store-level.d.ts +0 -32
  480. package/dist/types/src/smt/smt-store-level.d.ts.map +0 -1
  481. package/dist/types/src/smt/smt-store-memory.d.ts +0 -22
  482. package/dist/types/src/smt/smt-store-memory.d.ts.map +0 -1
  483. package/dist/types/src/smt/smt-utils.d.ts +0 -58
  484. package/dist/types/src/smt/smt-utils.d.ts.map +0 -1
  485. package/dist/types/src/smt/sparse-merkle-tree.d.ts +0 -124
  486. package/dist/types/src/smt/sparse-merkle-tree.d.ts.map +0 -1
  487. package/dist/types/src/state-index/state-index-level.d.ts +0 -83
  488. package/dist/types/src/state-index/state-index-level.d.ts.map +0 -1
  489. package/dist/types/src/types/smt-types.d.ts +0 -81
  490. package/dist/types/src/types/smt-types.d.ts.map +0 -1
  491. package/dist/types/src/types/state-index.d.ts +0 -90
  492. package/dist/types/src/types/state-index.d.ts.map +0 -1
  493. package/dist/types/tests/event-emitter-event-log.spec.d.ts +0 -2
  494. package/dist/types/tests/event-emitter-event-log.spec.d.ts.map +0 -1
  495. package/dist/types/tests/handlers/messages-sync.spec.d.ts +0 -2
  496. package/dist/types/tests/handlers/messages-sync.spec.d.ts.map +0 -1
  497. package/dist/types/tests/smt/smt-store-level.spec.d.ts +0 -2
  498. package/dist/types/tests/smt/smt-store-level.spec.d.ts.map +0 -1
  499. package/dist/types/tests/smt/sparse-merkle-tree.spec.d.ts +0 -2
  500. package/dist/types/tests/smt/sparse-merkle-tree.spec.d.ts.map +0 -1
  501. package/dist/types/tests/state-index/state-index-level.spec.d.ts +0 -2
  502. package/dist/types/tests/state-index/state-index-level.spec.d.ts.map +0 -1
  503. package/src/core/record-chain.ts +0 -99
  504. package/src/event-stream/event-emitter-event-log.ts +0 -430
  505. package/src/handlers/messages-sync.ts +0 -403
  506. package/src/interfaces/messages-sync.ts +0 -69
  507. package/src/smt/smt-store-level.ts +0 -143
  508. package/src/smt/smt-store-memory.ts +0 -53
  509. package/src/smt/smt-utils.ts +0 -149
  510. package/src/smt/sparse-merkle-tree.ts +0 -698
  511. package/src/state-index/state-index-level.ts +0 -239
  512. package/src/types/smt-types.ts +0 -95
  513. package/src/types/state-index.ts +0 -100
package/src/dwn.ts CHANGED
@@ -1,32 +1,55 @@
1
+ import type { CoreProtocol } from './core/core-protocol.js';
1
2
  import type { DataStore } from './types/data-store.js';
2
3
  import type { DidResolver } from '@enbox/dids';
3
- import type { KeyValues } from './types/query-types.js';
4
4
  import type { MessageStore } from './types/message-store.js';
5
5
  import type { ResumableTaskStore } from './types/resumable-task-store.js';
6
- import type { StateIndex } from './types/state-index.js';
7
6
  import type { TenantGate } from './core/tenant-gate.js';
8
7
  import type { UnionMessageReply } from './core/message-reply.js';
9
- import type { EventLog, MessageEvent, SubscriptionListener } from './types/subscriptions.js';
8
+ import type { ValidationStateReader } from './types/validation-state-reader.js';
9
+ import type { EventLog, SubscriptionListener } from './types/subscriptions.js';
10
10
  import type { GenericMessage, GenericMessageReply } from './types/message-types.js';
11
11
  import type { HandlerDependencies, MethodHandler } from './types/method-handler.js';
12
- import type { MessagesReadMessage, MessagesReadReply, MessagesSubscribeMessage, MessagesSubscribeMessageOptions, MessagesSubscribeReply, MessagesSyncMessage, MessagesSyncReply } from './types/messages-types.js';
12
+ import type {
13
+ MessagesQueryMessage,
14
+ MessagesQueryReply,
15
+ MessagesReadMessage,
16
+ MessagesReadReply,
17
+ MessagesSubscribeMessage,
18
+ MessagesSubscribeMessageOptions,
19
+ MessagesSubscribeReply,
20
+ } from './types/messages-types.js';
13
21
  import type { ProtocolDefinition, ProtocolsConfigureMessage, ProtocolsQueryMessage, ProtocolsQueryReply } from './types/protocols-types.js';
14
- import type { RecordsCountMessage, RecordsCountReply, RecordsDeleteMessage, RecordsQueryMessage, RecordsQueryReply, RecordsReadMessage, RecordsReadReply, RecordsSubscribeMessage, RecordsSubscribeMessageOptions, RecordsSubscribeReply, RecordsWriteMessage, RecordsWriteMessageOptions } from './types/records-types.js';
22
+ import type {
23
+ RecordsCountMessage,
24
+ RecordsCountReply,
25
+ RecordsDeleteMessage,
26
+ RecordsQueryMessage,
27
+ RecordsQueryReply,
28
+ RecordsQueryReplyEntry,
29
+ RecordsReadMessage,
30
+ RecordsReadReply,
31
+ RecordsSubscribeMessage,
32
+ RecordsSubscribeMessageOptions,
33
+ RecordsSubscribeReply,
34
+ RecordsWriteMessage,
35
+ RecordsWriteMessageOptions
36
+ } from './types/records-types.js';
15
37
  import type { ReplicationApplyOptions, ReplicationApplyResult } from './core/replication-apply.js';
16
38
 
17
39
  import { AllowAllTenantGate } from './core/tenant-gate.js';
40
+ import { Cid } from './utils/cid.js';
18
41
  import { CoreProtocolRegistry } from './core/core-protocol.js';
19
- import { DwnErrorCode } from './core/dwn-error.js';
42
+ import { DataStream } from './utils/data-stream.js';
43
+ import { DwnConstant } from './core/dwn-constant.js';
20
44
  import { Message } from './core/message.js';
21
45
  import { messageReplyFromError } from './core/message-reply.js';
46
+ import { MessagesQueryHandler } from './handlers/messages-query.js';
22
47
  import { MessagesReadHandler } from './handlers/messages-read.js';
23
48
  import { MessagesSubscribeHandler } from './handlers/messages-subscribe.js';
24
- import { MessagesSyncHandler } from './handlers/messages-sync.js';
25
49
  import { PermissionsProtocol } from './protocols/permissions.js';
26
- import { ProtocolAuthorization } from './core/protocol-authorization.js';
27
- import { ProtocolsConfigure } from './interfaces/protocols-configure.js';
28
50
  import { ProtocolsConfigureHandler } from './handlers/protocols-configure.js';
29
51
  import { ProtocolsQueryHandler } from './handlers/protocols-query.js';
52
+ import { Records } from './utils/records.js';
30
53
  import { RecordsCountHandler } from './handlers/records-count.js';
31
54
  import { RecordsDelete } from './interfaces/records-delete.js';
32
55
  import { RecordsDeleteHandler } from './handlers/records-delete.js';
@@ -35,11 +58,13 @@ import { RecordsReadHandler } from './handlers/records-read.js';
35
58
  import { RecordsSubscribeHandler } from './handlers/records-subscribe.js';
36
59
  import { RecordsWrite } from './interfaces/records-write.js';
37
60
  import { RecordsWriteHandler } from './handlers/records-write.js';
38
- import { replicationApplyResultFromReply } from './core/replication-apply.js';
39
61
  import { ResumableTaskManager } from './core/resumable-task-manager.js';
40
62
  import { StorageController } from './store/storage-controller.js';
63
+ import { StoreValidationStateReader } from './core/validation-state-reader.js';
41
64
  import { DidDht, DidJwk, DidKey, DidResolverCacheMemory, DidWeb, UniversalResolver } from '@enbox/dids';
65
+ import { DwnError, DwnErrorCode } from './core/dwn-error.js';
42
66
  import { DwnInterfaceName, DwnMethodName } from './enums/dwn-interface-method.js';
67
+ import { missingAncestorRecordIdsFromReply, replicationApplyResultFromReply } from './core/replication-apply.js';
43
68
 
44
69
  /**
45
70
  * Structural shape for `DidResolver` implementations that expose
@@ -53,18 +78,29 @@ type LifecycleResolver = {
53
78
  close: () => Promise<void>;
54
79
  };
55
80
 
81
+ type ReplicationApplyProtocolDefinitionLookup = {
82
+ protocol: string;
83
+ messageTimestamp?: string;
84
+ };
85
+
86
+ type DwnStorage = {
87
+ dataStore: DataStore;
88
+ messageStore: MessageStore;
89
+ eventLog: EventLog | undefined;
90
+ };
91
+
56
92
  export class Dwn {
57
93
  private readonly methodHandlers: { [key:string]: MethodHandler };
58
94
  private readonly didResolver: DidResolver;
59
95
  private readonly messageStore: MessageStore;
60
96
  private readonly dataStore: DataStore;
61
97
  private readonly resumableTaskStore: ResumableTaskStore;
62
- private readonly stateIndex: StateIndex;
63
98
  private readonly tenantGate: TenantGate;
64
99
  private readonly eventLog?: EventLog;
65
100
  private readonly storageController: StorageController;
66
101
  private readonly resumableTaskManager: ResumableTaskManager;
67
102
  private readonly _coreProtocols: CoreProtocolRegistry;
103
+ private readonly validationStateReader: ValidationStateReader;
68
104
 
69
105
  /** Whether the DWN owns the resolver's lifecycle (i.e., created it via defaults). */
70
106
  private readonly ownsResolver: boolean;
@@ -76,41 +112,46 @@ export class Dwn {
76
112
  this.messageStore = config.messageStore;
77
113
  this.dataStore = config.dataStore;
78
114
  this.resumableTaskStore = config.resumableTaskStore;
79
- this.stateIndex = config.stateIndex;
115
+
116
+ // Initialize the core protocol registry with built-in system protocols.
117
+ this._coreProtocols = new CoreProtocolRegistry();
118
+ this._coreProtocols.register(new PermissionsProtocol());
119
+
120
+ // The single narrow surface through which validation logic reads state (replay-basis closure).
121
+ const validationStateReader = new StoreValidationStateReader({
122
+ messageStore : this.messageStore,
123
+ dataStore : this.dataStore,
124
+ coreProtocols : this._coreProtocols,
125
+ });
126
+ this.validationStateReader = config.instrumentValidationStateReader?.(validationStateReader) ?? validationStateReader;
80
127
 
81
128
  this.eventLog = config.eventLog;
82
129
 
83
130
  this.storageController = new StorageController({
84
131
  messageStore : this.messageStore,
85
132
  dataStore : this.dataStore,
86
- stateIndex : this.stateIndex,
87
- eventLog : this.eventLog
88
133
  });
89
134
  this.resumableTaskManager = new ResumableTaskManager(
90
135
  config.resumableTaskStore,
91
136
  this.storageController
92
137
  );
93
138
 
94
- // Initialize the core protocol registry with built-in system protocols.
95
- this._coreProtocols = new CoreProtocolRegistry();
96
- this._coreProtocols.register(new PermissionsProtocol());
97
-
98
139
  // Build the shared dependency bag once; every handler receives the same object
99
140
  // and accesses only the dependencies it needs.
100
141
  const deps: HandlerDependencies = {
101
- didResolver : this.didResolver,
102
- messageStore : this.messageStore,
103
- dataStore : this.dataStore,
104
- stateIndex : this.stateIndex,
105
- resumableTaskManager : this.resumableTaskManager,
106
- coreProtocols : this._coreProtocols,
107
- eventLog : this.eventLog,
142
+ didResolver : this.didResolver,
143
+ messageStore : this.messageStore,
144
+ validationStateReader : this.validationStateReader,
145
+ dataStore : this.dataStore,
146
+ resumableTaskManager : this.resumableTaskManager,
147
+ coreProtocols : this._coreProtocols,
148
+ eventLog : this.eventLog,
108
149
  };
109
150
 
110
151
  this.methodHandlers = {
111
152
  [DwnInterfaceName.Messages + DwnMethodName.Read] : new MessagesReadHandler(deps),
153
+ [DwnInterfaceName.Messages + DwnMethodName.Query] : new MessagesQueryHandler(deps),
112
154
  [DwnInterfaceName.Messages + DwnMethodName.Subscribe] : new MessagesSubscribeHandler(deps),
113
- [DwnInterfaceName.Messages + DwnMethodName.Sync] : new MessagesSyncHandler(deps),
114
155
  [DwnInterfaceName.Protocols + DwnMethodName.Configure] : new ProtocolsConfigureHandler(deps),
115
156
  [DwnInterfaceName.Protocols + DwnMethodName.Query] : new ProtocolsQueryHandler(deps),
116
157
  [DwnInterfaceName.Records + DwnMethodName.Count] : new RecordsCountHandler(deps),
@@ -156,7 +197,6 @@ export class Dwn {
156
197
  await this.messageStore.open();
157
198
  await this.dataStore.open();
158
199
  await this.resumableTaskStore.open();
159
- await this.stateIndex.open();
160
200
  await this.eventLog?.open();
161
201
 
162
202
  await this.resumableTaskManager.resumeTasksAndWaitForCompletion();
@@ -167,7 +207,6 @@ export class Dwn {
167
207
  await this.messageStore.close();
168
208
  await this.dataStore.close();
169
209
  await this.resumableTaskStore.close();
170
- await this.stateIndex.close();
171
210
 
172
211
  // Close the resolver's cache if the DWN owns it.
173
212
  const lifecycleResolver = this.didResolver as Partial<LifecycleResolver>;
@@ -187,15 +226,14 @@ export class Dwn {
187
226
 
188
227
  /**
189
228
  * Returns the internal storage components for advanced operations that
190
- * cannot be expressed through the standard `processMessage()` pipeline
191
- * (e.g., owner-upgrade of externally authored encrypted records).
229
+ * cannot be expressed through the standard `processMessage()` pipeline.
192
230
  *
193
231
  * Callers are responsible for maintaining consistency across stores.
194
232
  */
195
- public get storage(): { messageStore: MessageStore; stateIndex: StateIndex; eventLog: EventLog | undefined } {
233
+ public get storage(): DwnStorage {
196
234
  return {
235
+ dataStore : this.dataStore,
197
236
  messageStore : this.messageStore,
198
- stateIndex : this.stateIndex,
199
237
  eventLog : this.eventLog,
200
238
  };
201
239
  }
@@ -207,7 +245,7 @@ export class Dwn {
207
245
  public async processMessage(
208
246
  tenant: string, rawMessage: MessagesSubscribeMessage, options?: MessagesSubscribeMessageOptions): Promise<MessagesSubscribeReply>;
209
247
  public async processMessage(tenant: string, rawMessage: MessagesReadMessage): Promise<MessagesReadReply>;
210
- public async processMessage(tenant: string, rawMessage: MessagesSyncMessage): Promise<MessagesSyncReply>;
248
+ public async processMessage(tenant: string, rawMessage: MessagesQueryMessage): Promise<MessagesQueryReply>;
211
249
  public async processMessage(tenant: string, rawMessage: ProtocolsConfigureMessage): Promise<GenericMessageReply>;
212
250
  public async processMessage(tenant: string, rawMessage: ProtocolsQueryMessage): Promise<ProtocolsQueryReply>;
213
251
  public async processMessage(tenant: string, rawMessage: RecordsCountMessage): Promise<RecordsCountReply>;
@@ -231,7 +269,7 @@ export class Dwn {
231
269
  tenant,
232
270
  message: rawMessage,
233
271
  dataStream,
234
- subscriptionHandler
272
+ subscriptionHandler,
235
273
  });
236
274
 
237
275
  return methodHandlerReply;
@@ -259,13 +297,193 @@ export class Dwn {
259
297
  return { kind: 'Invalid', reason: integrityError.status.detail };
260
298
  }
261
299
 
262
- if (await this.replicatedMessageAlreadyStored(tenant, rawMessage, options)) {
300
+ if (await this.replicatedMessageAlreadyStored(tenant, rawMessage)) {
263
301
  return { kind: 'Duplicate' };
264
302
  }
265
303
 
266
304
  const reply = await this.processMessage(tenant, rawMessage, options);
305
+ const replicatedWriteBeatenByDeleteResult = await this.storeReplicatedWriteBeatenByDelete(tenant, rawMessage, reply, options);
306
+ if (replicatedWriteBeatenByDeleteResult !== undefined) {
307
+ return replicatedWriteBeatenByDeleteResult;
308
+ }
309
+
267
310
  const protocolDefinition = await this.getReplicationApplyProtocolDefinition(tenant, rawMessage, reply);
268
- return replicationApplyResultFromReply(rawMessage, reply, { protocolDefinition });
311
+ const missingAncestorRecordIds = await this.getReplicationApplyMissingAncestors(tenant, rawMessage, reply);
312
+ return replicationApplyResultFromReply(rawMessage, reply, { protocolDefinition, missingAncestorRecordIds });
313
+ }
314
+
315
+ /**
316
+ * Computes the layer-batched missing-ancestor set for a replicated message that failed on a
317
+ * missing ancestor (immediate parent or record-chain construction), so the resulting
318
+ * `Incomplete` names every locally-absent ancestor at once. Returns `undefined`
319
+ * (single-ancestor emission) when the set cannot be computed.
320
+ */
321
+ private async getReplicationApplyMissingAncestors(
322
+ tenant: string,
323
+ message: GenericMessage,
324
+ reply: { status: { detail?: string } },
325
+ ): Promise<string[] | undefined> {
326
+ try {
327
+ return await missingAncestorRecordIdsFromReply(tenant, message, reply, this.validationStateReader);
328
+ } catch {
329
+ return undefined;
330
+ }
331
+ }
332
+
333
+ private async storeReplicatedWriteBeatenByDelete(
334
+ tenant: string,
335
+ message: GenericMessage,
336
+ reply: { status: { detail?: string } },
337
+ options: ReplicationApplyOptions,
338
+ ): Promise<ReplicationApplyResult | undefined> {
339
+ const detail = reply.status.detail ?? '';
340
+ if (!detail.startsWith(`${DwnErrorCode.RecordsWriteNotAllowedAfterDelete}:`) || !Records.isRecordsWrite(message)) {
341
+ return undefined;
342
+ }
343
+
344
+ const query = {
345
+ interface : DwnInterfaceName.Records,
346
+ recordId : message.recordId,
347
+ };
348
+ const { messages: existingMessages } = await this.messageStore.query(tenant, [query]);
349
+ const initialWrite = await RecordsWrite.getInitialWrite(existingMessages);
350
+ const existingDelete = await Records.getNewestRecordsDelete(existingMessages);
351
+ if (existingDelete === undefined) {
352
+ return undefined;
353
+ }
354
+
355
+ const validationReply = await this.validateReplicatedWriteBeatenByDelete(tenant, message, existingMessages, options);
356
+ if (validationReply !== undefined) {
357
+ return replicationApplyResultFromReply(message, validationReply);
358
+ }
359
+
360
+ const recordsWrite = await RecordsWrite.parse(message);
361
+ const storedWriteMessage: RecordsWriteMessage & { encodedData?: string } = { ...message };
362
+ delete storedWriteMessage.encodedData;
363
+ const recordsWriteIndexes = await recordsWrite.constructIndexes(false);
364
+ await this.messageStore.put(tenant, storedWriteMessage, recordsWriteIndexes);
365
+
366
+ const recordsDelete = await RecordsDelete.parse(existingDelete);
367
+ const visibilitySourceWrite = await Records.getNewestRecordsWrite([...existingMessages, storedWriteMessage]) ?? initialWrite;
368
+ const recordsDeleteIndexes = recordsDelete.constructIndexes(initialWrite, visibilitySourceWrite);
369
+ const recordsDeleteCid = await Message.getCid(existingDelete);
370
+ await this.messageStore.updateIndexes(tenant, recordsDeleteCid, recordsDeleteIndexes);
371
+
372
+ return { kind: 'Superseded' };
373
+ }
374
+
375
+ private async validateReplicatedWriteBeatenByDelete(
376
+ tenant: string,
377
+ message: RecordsWriteMessage,
378
+ existingMessages: GenericMessage[],
379
+ options: ReplicationApplyOptions,
380
+ ): Promise<GenericMessageReply | undefined> {
381
+ try {
382
+ await this.validateReplicatedWriteBeatenByDeleteOrThrow(tenant, message, existingMessages, options);
383
+ return undefined;
384
+ } catch (error) {
385
+ const statusCode = error instanceof DwnError
386
+ ? this._coreProtocols.mapErrorToStatusCode(error.code) ?? 400
387
+ : 400;
388
+ return messageReplyFromError(error, statusCode);
389
+ }
390
+ }
391
+
392
+ private async validateReplicatedWriteBeatenByDeleteOrThrow(
393
+ tenant: string,
394
+ message: RecordsWriteMessage,
395
+ existingMessages: GenericMessage[],
396
+ options: ReplicationApplyOptions,
397
+ ): Promise<void> {
398
+ const coreProtocol = message.descriptor.protocol === undefined
399
+ ? undefined
400
+ : this._coreProtocols.get(message.descriptor.protocol);
401
+
402
+ if (coreProtocol?.preProcessWrite !== undefined) {
403
+ await coreProtocol.preProcessWrite(tenant, message, this.validationStateReader);
404
+ }
405
+
406
+ if (options.dataStream !== undefined) {
407
+ await Dwn.validateReplicatedWriteBeatenByDeleteDataStream(message, options.dataStream, coreProtocol);
408
+ return;
409
+ }
410
+
411
+ if (await RecordsWrite.isInitialWrite(message)) {
412
+ return;
413
+ }
414
+
415
+ await this.validateReplicatedWriteBeatenByDeleteExistingData(tenant, message, existingMessages);
416
+ }
417
+
418
+ private static async validateReplicatedWriteBeatenByDeleteDataStream(
419
+ message: RecordsWriteMessage,
420
+ dataStream: ReadableStream<Uint8Array>,
421
+ coreProtocol: CoreProtocol | undefined,
422
+ ): Promise<void> {
423
+ if (message.descriptor.dataSize <= DwnConstant.maxDataSizeAllowedToBeEncoded) {
424
+ const dataBytes = await DataStream.toBytes(dataStream);
425
+ const dataCid = await Cid.computeDagPbCidFromBytes(dataBytes);
426
+ RecordsWrite.validateDataIntegrity(message.descriptor.dataCid, message.descriptor.dataSize, dataCid, dataBytes.length);
427
+
428
+ if (coreProtocol?.validateRecord !== undefined) {
429
+ coreProtocol.validateRecord(message, dataBytes);
430
+ }
431
+
432
+ return;
433
+ }
434
+
435
+ const [dataCidStream, dataSizeStream] = DataStream.duplicateDataStream(dataStream, 2);
436
+ const [dataCid, dataSize] = await Promise.all([
437
+ Cid.computeDagPbCidFromStream(dataCidStream),
438
+ Dwn.getDataStreamByteLength(dataSizeStream),
439
+ ]);
440
+ RecordsWrite.validateDataIntegrity(message.descriptor.dataCid, message.descriptor.dataSize, dataCid, dataSize);
441
+ }
442
+
443
+ private async validateReplicatedWriteBeatenByDeleteExistingData(
444
+ tenant: string,
445
+ message: RecordsWriteMessage,
446
+ existingMessages: GenericMessage[],
447
+ ): Promise<void> {
448
+ const newestExistingWrite = await Records.getNewestRecordsWrite(existingMessages);
449
+ if (newestExistingWrite === undefined) {
450
+ throw new DwnError(
451
+ DwnErrorCode.RecordsWriteGetInitialWriteNotFound,
452
+ `initial write is missing for record ${message.recordId}`
453
+ );
454
+ }
455
+
456
+ const { dataCid, dataSize } = message.descriptor;
457
+ RecordsWrite.validateDataIntegrity(dataCid, dataSize, newestExistingWrite.descriptor.dataCid, newestExistingWrite.descriptor.dataSize);
458
+
459
+ if (dataSize <= DwnConstant.maxDataSizeAllowedToBeEncoded) {
460
+ const newestExistingWriteWithData = newestExistingWrite as RecordsQueryReplyEntry;
461
+ if (newestExistingWriteWithData.encodedData === undefined) {
462
+ throw new DwnError(
463
+ DwnErrorCode.RecordsWriteMissingEncodedDataInPrevious,
464
+ `No dataStream was provided and unable to get data from previous message`
465
+ );
466
+ }
467
+
468
+ return;
469
+ }
470
+
471
+ const priorDataExists = await this.validationStateReader.hasStoredData(tenant, newestExistingWrite.recordId, dataCid);
472
+ if (!priorDataExists) {
473
+ throw new DwnError(
474
+ DwnErrorCode.RecordsWriteMissingDataInPrevious,
475
+ `No dataStream was provided and unable to get data from previous message`
476
+ );
477
+ }
478
+ }
479
+
480
+ private static async getDataStreamByteLength(dataStream: ReadableStream<Uint8Array>): Promise<number> {
481
+ let byteLength = 0;
482
+ for await (const chunk of DataStream.asAsyncIterable(dataStream)) {
483
+ byteLength += chunk.length;
484
+ }
485
+
486
+ return byteLength;
269
487
  }
270
488
 
271
489
  private async getReplicationApplyProtocolDefinition(
@@ -278,24 +496,36 @@ export class Dwn {
278
496
  return undefined;
279
497
  }
280
498
 
281
- const protocol = Dwn.getMessageProtocolForReplicationApply(message);
282
- if (protocol === undefined) {
499
+ const lookup = Dwn.getReplicationApplyProtocolDefinitionLookup(message);
500
+ if (lookup === undefined) {
283
501
  return undefined;
284
502
  }
285
503
 
286
504
  try {
287
- return await ProtocolAuthorization.fetchProtocolDefinition(
505
+ return await this.validationStateReader.fetchProtocolDefinition(
288
506
  tenant,
289
- protocol,
290
- this.messageStore,
291
- message.descriptor.messageTimestamp,
292
- this._coreProtocols,
507
+ lookup.protocol,
508
+ lookup.messageTimestamp,
293
509
  );
294
510
  } catch {
295
511
  return undefined;
296
512
  }
297
513
  }
298
514
 
515
+ private static getReplicationApplyProtocolDefinitionLookup(
516
+ message: GenericMessage,
517
+ ): ReplicationApplyProtocolDefinitionLookup | undefined {
518
+ if (Dwn.isRecordsWriteMessage(message)) {
519
+ return {
520
+ protocol : message.descriptor.protocol,
521
+ messageTimestamp : message.descriptor.messageTimestamp,
522
+ };
523
+ }
524
+
525
+ const protocol = Dwn.getMessageProtocolForReplicationApply(message);
526
+ return protocol === undefined ? undefined : { protocol };
527
+ }
528
+
299
529
  private static getMessageProtocolForReplicationApply(message: GenericMessage): string | undefined {
300
530
  const descriptor = message.descriptor as { protocol?: unknown; filter?: { protocol?: unknown } };
301
531
  if (typeof descriptor.protocol === 'string') {
@@ -306,10 +536,14 @@ export class Dwn {
306
536
  }
307
537
  }
308
538
 
539
+ private static isRecordsWriteMessage(message: GenericMessage): message is RecordsWriteMessage {
540
+ return message.descriptor.interface === DwnInterfaceName.Records &&
541
+ message.descriptor.method === DwnMethodName.Write;
542
+ }
543
+
309
544
  private async replicatedMessageAlreadyStored(
310
545
  tenant: string,
311
546
  message: GenericMessage,
312
- options: ReplicationApplyOptions,
313
547
  ): Promise<boolean> {
314
548
  const existingMessages = await this.getExistingMessagesForReplicationDedup(tenant, message);
315
549
  if (existingMessages.length === 0) {
@@ -322,11 +556,6 @@ export class Dwn {
322
556
  continue;
323
557
  }
324
558
 
325
- if (options.dataStream !== undefined && Dwn.existingReplicatedWriteMayNeedDataCompletion(existing, message)) {
326
- return false;
327
- }
328
-
329
- await this.repairReplicationIndexesForDuplicate(tenant, message, existingMessages, incomingCid);
330
559
  return true;
331
560
  }
332
561
 
@@ -381,148 +610,6 @@ export class Dwn {
381
610
  return [];
382
611
  }
383
612
 
384
- private static existingReplicatedWriteMayNeedDataCompletion(existing: GenericMessage, incoming: GenericMessage): boolean {
385
- if (
386
- incoming.descriptor.interface !== DwnInterfaceName.Records ||
387
- incoming.descriptor.method !== DwnMethodName.Write ||
388
- existing.descriptor.interface !== DwnInterfaceName.Records ||
389
- existing.descriptor.method !== DwnMethodName.Write
390
- ) {
391
- return false;
392
- }
393
-
394
- const existingWrite = existing as { encodedData?: string; descriptor: { dateCreated?: string; messageTimestamp?: string } };
395
- const isInitialWrite = existingWrite.descriptor.dateCreated === existingWrite.descriptor.messageTimestamp;
396
- return isInitialWrite && existingWrite.encodedData === undefined;
397
- }
398
-
399
- private async repairReplicationIndexesForDuplicate(
400
- tenant: string,
401
- message: GenericMessage,
402
- existingMessages: GenericMessage[],
403
- messageCid: string,
404
- ): Promise<void> {
405
- const leaves = await this.stateIndex.getLeaves(tenant, []);
406
- const stateIndexHasMessage = leaves.includes(messageCid);
407
- if (stateIndexHasMessage && this.eventLog === undefined) {
408
- return;
409
- }
410
-
411
- const repair = await this.constructReplicationIndexRepair(tenant, message, existingMessages);
412
- if (repair === undefined) {
413
- return;
414
- }
415
-
416
- if (!stateIndexHasMessage) {
417
- await this.stateIndex.insert(tenant, messageCid, repair.indexes);
418
- }
419
- if (repair.emitEvent && !await this.eventLogHasMessage(tenant, messageCid, repair.indexes)) {
420
- await this.eventLog?.emit(tenant, repair.event, repair.indexes, messageCid);
421
- }
422
- }
423
-
424
- private async eventLogHasMessage(tenant: string, messageCid: string, indexes: KeyValues): Promise<boolean> {
425
- if (this.eventLog === undefined) {
426
- return true;
427
- }
428
-
429
- const { events } = await this.eventLog.read(tenant, { filters: [indexes] });
430
- for (const event of events) {
431
- if (event.messageCid === messageCid || await Message.getCid(event.event.message) === messageCid) {
432
- return true;
433
- }
434
- }
435
- return false;
436
- }
437
-
438
- private async constructReplicationIndexRepair(
439
- tenant: string,
440
- message: GenericMessage,
441
- existingMessages: GenericMessage[],
442
- ): Promise<{ indexes: KeyValues; event: MessageEvent; emitEvent: boolean } | undefined> {
443
- const { descriptor } = message;
444
-
445
- if (descriptor.interface === DwnInterfaceName.Records && descriptor.method === DwnMethodName.Write) {
446
- const isLatest = await Dwn.isNewestStoredMessage(message, existingMessages);
447
- const eventMessage = await Dwn.getStoredMessageForCid(existingMessages, await Message.getCid(message)) ?? message;
448
- const recordsWrite = await RecordsWrite.parse(eventMessage as RecordsWriteMessage);
449
- const indexes = await recordsWrite.constructIndexes(isLatest);
450
- const initialWrite = await this.getInitialWriteForReplicationEvent(tenant, eventMessage as RecordsWriteMessage);
451
- return {
452
- indexes,
453
- event : { message: eventMessage, initialWrite },
454
- emitEvent : isLatest && Dwn.replicatedWriteHasQueryableData(eventMessage),
455
- };
456
- }
457
-
458
- if (descriptor.interface === DwnInterfaceName.Records && descriptor.method === DwnMethodName.Delete) {
459
- const initialWrite = await RecordsWrite.fetchInitialRecordsWriteMessage(
460
- this.messageStore,
461
- tenant,
462
- (message as RecordsDeleteMessage).descriptor.recordId,
463
- );
464
- if (initialWrite === undefined) {
465
- return undefined;
466
- }
467
-
468
- const recordsDelete = await RecordsDelete.parse(message as RecordsDeleteMessage);
469
- const isLatest = await Dwn.isNewestStoredMessage(message, existingMessages);
470
- return {
471
- indexes : recordsDelete.constructIndexes(initialWrite),
472
- event : { message, initialWrite },
473
- emitEvent : isLatest,
474
- };
475
- }
476
-
477
- if (descriptor.interface === DwnInterfaceName.Protocols && descriptor.method === DwnMethodName.Configure) {
478
- const protocolsConfigure = await ProtocolsConfigure.parse(message as ProtocolsConfigureMessage);
479
- const isLatest = await Dwn.isNewestStoredMessage(message, existingMessages);
480
- return {
481
- indexes : ProtocolsConfigureHandler.constructIndexes(protocolsConfigure, isLatest),
482
- event : { message },
483
- emitEvent : isLatest,
484
- };
485
- }
486
-
487
- return undefined;
488
- }
489
-
490
- private static async isNewestStoredMessage(
491
- message: GenericMessage,
492
- existingMessages: GenericMessage[],
493
- ): Promise<boolean> {
494
- const newestMessage = await Message.getNewestMessage(existingMessages);
495
- return newestMessage !== undefined && await Message.getCid(newestMessage) === await Message.getCid(message);
496
- }
497
-
498
- private static async getStoredMessageForCid(existingMessages: GenericMessage[], messageCid: string): Promise<GenericMessage | undefined> {
499
- for (const existingMessage of existingMessages) {
500
- if (await Message.getCid(existingMessage) === messageCid) {
501
- return existingMessage;
502
- }
503
- }
504
- }
505
-
506
- private async getInitialWriteForReplicationEvent(
507
- tenant: string,
508
- message: RecordsWriteMessage,
509
- ): Promise<RecordsWriteMessage | undefined> {
510
- if (await RecordsWrite.isInitialWrite(message)) {
511
- return message;
512
- }
513
-
514
- return RecordsWrite.fetchInitialRecordsWriteMessage(this.messageStore, tenant, message.recordId);
515
- }
516
-
517
- private static replicatedWriteHasQueryableData(message: GenericMessage): boolean {
518
- if (message.descriptor.interface !== DwnInterfaceName.Records || message.descriptor.method !== DwnMethodName.Write) {
519
- return false;
520
- }
521
-
522
- return (message as { encodedData?: unknown }).encodedData !== undefined ||
523
- (message as RecordsWriteMessage).descriptor.dateCreated !== (message as RecordsWriteMessage).descriptor.messageTimestamp;
524
- }
525
-
526
613
  /**
527
614
  * Checks tenant gate to see if tenant is allowed.
528
615
  * @param tenant The tenant DID to route the given message to.
@@ -598,8 +685,14 @@ export type DwnConfig = {
598
685
  */
599
686
  eventLog?: EventLog;
600
687
 
688
+ /**
689
+ * Instrumentation seam: wraps the internally constructed `ValidationStateReader` before it is
690
+ * handed to the handlers (e.g. with a `RecordingValidationStateReader`). Used by the
691
+ * replay-basis closure tests and harnesses to record every validation-time state read.
692
+ */
693
+ instrumentValidationStateReader?: (validationStateReader: ValidationStateReader) => ValidationStateReader;
694
+
601
695
  messageStore: MessageStore;
602
696
  dataStore: DataStore;
603
- stateIndex: StateIndex;
604
697
  resumableTaskStore: ResumableTaskStore;
605
698
  };
@@ -11,6 +11,5 @@ export enum DwnMethodName {
11
11
  Query = 'Query',
12
12
  Read = 'Read',
13
13
  Subscribe = 'Subscribe',
14
- Sync = 'Sync',
15
14
  Write = 'Write'
16
15
  }