@enbox/dwn-sdk-js 0.3.9 → 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 (525) hide show
  1. package/README.md +4 -4
  2. package/dist/browser.mjs +11 -11
  3. package/dist/browser.mjs.map +4 -4
  4. package/dist/esm/generated/precompiled-validators.js +783 -1206
  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 +13 -7
  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 -61
  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 +31 -69
  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 +295 -0
  28. package/dist/esm/src/core/replication-apply.js.map +1 -0
  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 +261 -16
  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 +7 -8
  64. package/dist/esm/src/index.js.map +1 -1
  65. package/dist/esm/src/interfaces/messages-query.js +49 -0
  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 +274 -0
  113. package/dist/esm/tests/core/replication-apply.spec.js.map +1 -0
  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 +620 -14
  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 +84 -38
  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 -4
  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 +13 -7
  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 -15
  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 +129 -0
  244. package/dist/types/src/core/replication-apply.d.ts.map +1 -0
  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 +47 -13
  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 +16 -18
  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 -55
  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-apply.spec.d.ts +2 -0
  330. package/dist/types/tests/core/replication-apply.spec.d.ts.map +1 -0
  331. package/dist/types/tests/core/replication-replay-property.spec.d.ts +2 -0
  332. package/dist/types/tests/core/replication-replay-property.spec.d.ts.map +1 -0
  333. package/dist/types/tests/core/validation-read-closure.spec.d.ts +2 -0
  334. package/dist/types/tests/core/validation-read-closure.spec.d.ts.map +1 -0
  335. package/dist/types/tests/core/validation-state-reader.spec.d.ts +2 -0
  336. package/dist/types/tests/core/validation-state-reader.spec.d.ts.map +1 -0
  337. package/dist/types/tests/durable-event-log.spec.d.ts +2 -0
  338. package/dist/types/tests/durable-event-log.spec.d.ts.map +1 -0
  339. package/dist/types/tests/dwn.spec.d.ts.map +1 -1
  340. package/dist/types/tests/features/author-delegated-grant.spec.d.ts.map +1 -1
  341. package/dist/types/tests/features/owner-delegated-grant.spec.d.ts.map +1 -1
  342. package/dist/types/tests/features/owner-signature.spec.d.ts.map +1 -1
  343. package/dist/types/tests/features/permissions.spec.d.ts.map +1 -1
  344. package/dist/types/tests/features/protocol-composition.spec.d.ts.map +1 -1
  345. package/dist/types/tests/features/protocol-create-action.spec.d.ts.map +1 -1
  346. package/dist/types/tests/features/protocol-delete-action.spec.d.ts.map +1 -1
  347. package/dist/types/tests/features/protocol-update-action.spec.d.ts.map +1 -1
  348. package/dist/types/tests/features/records-delivery.spec.d.ts.map +1 -1
  349. package/dist/types/tests/features/records-immutable.spec.d.ts.map +1 -1
  350. package/dist/types/tests/features/records-nested-query-scope.spec.d.ts +2 -0
  351. package/dist/types/tests/features/records-nested-query-scope.spec.d.ts.map +1 -0
  352. package/dist/types/tests/features/records-prune-cross-protocol.spec.d.ts.map +1 -1
  353. package/dist/types/tests/features/records-prune.spec.d.ts.map +1 -1
  354. package/dist/types/tests/features/records-record-limit.spec.d.ts.map +1 -1
  355. package/dist/types/tests/features/records-squash.spec.d.ts.map +1 -1
  356. package/dist/types/tests/features/records-tags.spec.d.ts.map +1 -1
  357. package/dist/types/tests/features/resumable-tasks.spec.d.ts.map +1 -1
  358. package/dist/types/tests/handlers/messages-query.spec.d.ts +2 -0
  359. package/dist/types/tests/handlers/messages-query.spec.d.ts.map +1 -0
  360. package/dist/types/tests/handlers/messages-read.spec.d.ts.map +1 -1
  361. package/dist/types/tests/handlers/messages-subscribe.spec.d.ts.map +1 -1
  362. package/dist/types/tests/handlers/protocols-configure.spec.d.ts.map +1 -1
  363. package/dist/types/tests/handlers/protocols-query.spec.d.ts.map +1 -1
  364. package/dist/types/tests/handlers/records-count.spec.d.ts.map +1 -1
  365. package/dist/types/tests/handlers/records-delete.spec.d.ts.map +1 -1
  366. package/dist/types/tests/handlers/records-query.spec.d.ts.map +1 -1
  367. package/dist/types/tests/handlers/records-read.spec.d.ts.map +1 -1
  368. package/dist/types/tests/handlers/records-subscribe.spec.d.ts.map +1 -1
  369. package/dist/types/tests/handlers/records-write.spec.d.ts.map +1 -1
  370. package/dist/types/tests/scenarios/deleted-record.spec.d.ts.map +1 -1
  371. package/dist/types/tests/scenarios/end-to-end-tests.spec.d.ts.map +1 -1
  372. package/dist/types/tests/scenarios/nested-roles.spec.d.ts.map +1 -1
  373. package/dist/types/tests/scenarios/subscriptions.spec.d.ts.map +1 -1
  374. package/dist/types/tests/store/message-store.spec.d.ts.map +1 -1
  375. package/dist/types/tests/test-event-stream.d.ts +1 -1
  376. package/dist/types/tests/test-event-stream.d.ts.map +1 -1
  377. package/dist/types/tests/test-stores.d.ts +5 -4
  378. package/dist/types/tests/test-stores.d.ts.map +1 -1
  379. package/dist/types/tests/test-suite.d.ts +1 -2
  380. package/dist/types/tests/test-suite.d.ts.map +1 -1
  381. package/dist/types/tests/utils/test-data-generator.d.ts +20 -1
  382. package/dist/types/tests/utils/test-data-generator.d.ts.map +1 -1
  383. package/dist/types/tests/utils/test-validation-state-reader.d.ts +15 -0
  384. package/dist/types/tests/utils/test-validation-state-reader.d.ts.map +1 -0
  385. package/package.json +2 -2
  386. package/src/core/core-protocol.ts +3 -3
  387. package/src/core/dwn-constant.ts +7 -1
  388. package/src/core/dwn-error.ts +13 -7
  389. package/src/core/grant-authorization.ts +11 -20
  390. package/src/core/message-reply.ts +6 -5
  391. package/src/core/messages-grant-authorization.ts +37 -100
  392. package/src/core/protocol-authorization-action.ts +29 -38
  393. package/src/core/protocol-authorization-validation.ts +41 -98
  394. package/src/core/protocol-authorization.ts +56 -202
  395. package/src/core/protocols-grant-authorization.ts +9 -9
  396. package/src/core/recording-validation-state-reader.ts +130 -0
  397. package/src/core/records-grant-authorization.ts +16 -16
  398. package/src/core/replication-apply.ts +412 -0
  399. package/src/core/resumable-task-manager.ts +10 -8
  400. package/src/core/validation-state-reader.ts +350 -0
  401. package/src/dwn.ts +417 -30
  402. package/src/enums/dwn-interface-method.ts +0 -1
  403. package/src/event-stream/durable-event-log.ts +509 -0
  404. package/src/event-stream/event-emitter-wake-publisher.ts +34 -0
  405. package/src/handlers/messages-query.ts +203 -0
  406. package/src/handlers/messages-read.ts +9 -10
  407. package/src/handlers/messages-subscribe.ts +12 -13
  408. package/src/handlers/protocols-configure.ts +37 -58
  409. package/src/handlers/protocols-query.ts +1 -1
  410. package/src/handlers/records-count.ts +24 -17
  411. package/src/handlers/records-delete.ts +29 -27
  412. package/src/handlers/records-query.ts +38 -17
  413. package/src/handlers/records-read.ts +63 -50
  414. package/src/handlers/records-subscribe.ts +132 -19
  415. package/src/handlers/records-write.ts +77 -168
  416. package/src/index.ts +16 -20
  417. package/src/interfaces/messages-query.ts +70 -0
  418. package/src/interfaces/protocols-configure.ts +12 -4
  419. package/src/interfaces/protocols-query.ts +4 -5
  420. package/src/interfaces/records-count.ts +9 -4
  421. package/src/interfaces/records-delete.ts +25 -5
  422. package/src/interfaces/records-query.ts +9 -4
  423. package/src/interfaces/records-read.ts +4 -4
  424. package/src/interfaces/records-subscribe.ts +9 -4
  425. package/src/interfaces/records-write.ts +41 -13
  426. package/src/protocols/permissions.ts +32 -52
  427. package/src/store/index-level.ts +30 -9
  428. package/src/store/level-wrapper.ts +9 -1
  429. package/src/store/message-store-level.ts +757 -47
  430. package/src/store/storage-controller.ts +74 -63
  431. package/src/types/message-store.ts +45 -2
  432. package/src/types/message-types.ts +3 -1
  433. package/src/types/messages-types.ts +26 -65
  434. package/src/types/method-handler.ts +3 -3
  435. package/src/types/permission-types.ts +1 -1
  436. package/src/types/subscriptions.ts +53 -42
  437. package/src/types/validation-state-reader.ts +127 -0
  438. package/src/utils/messages.ts +25 -1
  439. package/src/utils/record-limit-occupancy.ts +377 -0
  440. package/src/utils/records.ts +69 -13
  441. package/src/utils/replication.ts +122 -0
  442. package/dist/esm/src/core/record-chain.js +0 -64
  443. package/dist/esm/src/core/record-chain.js.map +0 -1
  444. package/dist/esm/src/event-stream/event-emitter-event-log.js +0 -334
  445. package/dist/esm/src/event-stream/event-emitter-event-log.js.map +0 -1
  446. package/dist/esm/src/handlers/messages-sync.js +0 -581
  447. package/dist/esm/src/handlers/messages-sync.js.map +0 -1
  448. package/dist/esm/src/interfaces/messages-sync.js +0 -54
  449. package/dist/esm/src/interfaces/messages-sync.js.map +0 -1
  450. package/dist/esm/src/smt/smt-store-level.js +0 -103
  451. package/dist/esm/src/smt/smt-store-level.js.map +0 -1
  452. package/dist/esm/src/smt/smt-store-memory.js +0 -41
  453. package/dist/esm/src/smt/smt-store-memory.js.map +0 -1
  454. package/dist/esm/src/smt/smt-utils.js +0 -129
  455. package/dist/esm/src/smt/smt-utils.js.map +0 -1
  456. package/dist/esm/src/smt/sparse-merkle-tree.js +0 -577
  457. package/dist/esm/src/smt/sparse-merkle-tree.js.map +0 -1
  458. package/dist/esm/src/state-index/state-index-level.js +0 -191
  459. package/dist/esm/src/state-index/state-index-level.js.map +0 -1
  460. package/dist/esm/src/sync/records-projection.js +0 -228
  461. package/dist/esm/src/sync/records-projection.js.map +0 -1
  462. package/dist/esm/src/types/smt-types.js +0 -5
  463. package/dist/esm/src/types/smt-types.js.map +0 -1
  464. package/dist/esm/src/types/state-index.js +0 -2
  465. package/dist/esm/src/types/state-index.js.map +0 -1
  466. package/dist/esm/tests/event-emitter-event-log.spec.js +0 -499
  467. package/dist/esm/tests/event-emitter-event-log.spec.js.map +0 -1
  468. package/dist/esm/tests/handlers/messages-sync.spec.js +0 -1771
  469. package/dist/esm/tests/handlers/messages-sync.spec.js.map +0 -1
  470. package/dist/esm/tests/smt/smt-store-level.spec.js +0 -132
  471. package/dist/esm/tests/smt/smt-store-level.spec.js.map +0 -1
  472. package/dist/esm/tests/smt/sparse-merkle-tree.spec.js +0 -732
  473. package/dist/esm/tests/smt/sparse-merkle-tree.spec.js.map +0 -1
  474. package/dist/esm/tests/state-index/state-index-level.spec.js +0 -245
  475. package/dist/esm/tests/state-index/state-index-level.spec.js.map +0 -1
  476. package/dist/esm/tests/sync/records-projection.spec.js +0 -245
  477. package/dist/esm/tests/sync/records-projection.spec.js.map +0 -1
  478. package/dist/types/src/core/record-chain.d.ts +0 -24
  479. package/dist/types/src/core/record-chain.d.ts.map +0 -1
  480. package/dist/types/src/event-stream/event-emitter-event-log.d.ts +0 -80
  481. package/dist/types/src/event-stream/event-emitter-event-log.d.ts.map +0 -1
  482. package/dist/types/src/handlers/messages-sync.d.ts +0 -83
  483. package/dist/types/src/handlers/messages-sync.d.ts.map +0 -1
  484. package/dist/types/src/interfaces/messages-sync.d.ts +0 -23
  485. package/dist/types/src/interfaces/messages-sync.d.ts.map +0 -1
  486. package/dist/types/src/smt/smt-store-level.d.ts +0 -32
  487. package/dist/types/src/smt/smt-store-level.d.ts.map +0 -1
  488. package/dist/types/src/smt/smt-store-memory.d.ts +0 -22
  489. package/dist/types/src/smt/smt-store-memory.d.ts.map +0 -1
  490. package/dist/types/src/smt/smt-utils.d.ts +0 -58
  491. package/dist/types/src/smt/smt-utils.d.ts.map +0 -1
  492. package/dist/types/src/smt/sparse-merkle-tree.d.ts +0 -124
  493. package/dist/types/src/smt/sparse-merkle-tree.d.ts.map +0 -1
  494. package/dist/types/src/state-index/state-index-level.d.ts +0 -83
  495. package/dist/types/src/state-index/state-index-level.d.ts.map +0 -1
  496. package/dist/types/src/sync/records-projection.d.ts +0 -98
  497. package/dist/types/src/sync/records-projection.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/dist/types/tests/sync/records-projection.spec.d.ts +0 -2
  513. package/dist/types/tests/sync/records-projection.spec.d.ts.map +0 -1
  514. package/src/core/record-chain.ts +0 -99
  515. package/src/event-stream/event-emitter-event-log.ts +0 -430
  516. package/src/handlers/messages-sync.ts +0 -896
  517. package/src/interfaces/messages-sync.ts +0 -86
  518. package/src/smt/smt-store-level.ts +0 -143
  519. package/src/smt/smt-store-memory.ts +0 -53
  520. package/src/smt/smt-utils.ts +0 -149
  521. package/src/smt/sparse-merkle-tree.ts +0 -698
  522. package/src/state-index/state-index-level.ts +0 -239
  523. package/src/sync/records-projection.ts +0 -328
  524. package/src/types/smt-types.ts +0 -95
  525. package/src/types/state-index.ts +0 -100
package/src/dwn.ts CHANGED
@@ -1,37 +1,70 @@
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
4
  import type { MessageStore } from './types/message-store.js';
4
5
  import type { ResumableTaskStore } from './types/resumable-task-store.js';
5
- import type { StateIndex } from './types/state-index.js';
6
6
  import type { TenantGate } from './core/tenant-gate.js';
7
7
  import type { UnionMessageReply } from './core/message-reply.js';
8
+ import type { ValidationStateReader } from './types/validation-state-reader.js';
8
9
  import type { EventLog, SubscriptionListener } from './types/subscriptions.js';
9
10
  import type { GenericMessage, GenericMessageReply } from './types/message-types.js';
10
11
  import type { HandlerDependencies, MethodHandler } from './types/method-handler.js';
11
- import type { MessagesReadMessage, MessagesReadReply, MessagesSubscribeMessage, MessagesSubscribeMessageOptions, MessagesSubscribeReply, MessagesSyncMessage, MessagesSyncReply } from './types/messages-types.js';
12
- import type { ProtocolsConfigureMessage, ProtocolsQueryMessage, ProtocolsQueryReply } from './types/protocols-types.js';
13
- import type { RecordsCountMessage, RecordsCountReply, RecordsDeleteMessage, RecordsQueryMessage, RecordsQueryReply, RecordsReadMessage, RecordsReadReply, RecordsSubscribeMessage, RecordsSubscribeMessageOptions, RecordsSubscribeReply, RecordsWriteMessage, RecordsWriteMessageOptions } from './types/records-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';
21
+ import type { ProtocolDefinition, ProtocolsConfigureMessage, ProtocolsQueryMessage, ProtocolsQueryReply } from './types/protocols-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';
37
+ import type { ReplicationApplyOptions, ReplicationApplyResult } from './core/replication-apply.js';
14
38
 
15
39
  import { AllowAllTenantGate } from './core/tenant-gate.js';
40
+ import { Cid } from './utils/cid.js';
16
41
  import { CoreProtocolRegistry } from './core/core-protocol.js';
42
+ import { DataStream } from './utils/data-stream.js';
43
+ import { DwnConstant } from './core/dwn-constant.js';
17
44
  import { Message } from './core/message.js';
18
45
  import { messageReplyFromError } from './core/message-reply.js';
46
+ import { MessagesQueryHandler } from './handlers/messages-query.js';
19
47
  import { MessagesReadHandler } from './handlers/messages-read.js';
20
48
  import { MessagesSubscribeHandler } from './handlers/messages-subscribe.js';
21
- import { MessagesSyncHandler } from './handlers/messages-sync.js';
22
49
  import { PermissionsProtocol } from './protocols/permissions.js';
23
50
  import { ProtocolsConfigureHandler } from './handlers/protocols-configure.js';
24
51
  import { ProtocolsQueryHandler } from './handlers/protocols-query.js';
52
+ import { Records } from './utils/records.js';
25
53
  import { RecordsCountHandler } from './handlers/records-count.js';
54
+ import { RecordsDelete } from './interfaces/records-delete.js';
26
55
  import { RecordsDeleteHandler } from './handlers/records-delete.js';
27
56
  import { RecordsQueryHandler } from './handlers/records-query.js';
28
57
  import { RecordsReadHandler } from './handlers/records-read.js';
29
58
  import { RecordsSubscribeHandler } from './handlers/records-subscribe.js';
59
+ import { RecordsWrite } from './interfaces/records-write.js';
30
60
  import { RecordsWriteHandler } from './handlers/records-write.js';
31
61
  import { ResumableTaskManager } from './core/resumable-task-manager.js';
32
62
  import { StorageController } from './store/storage-controller.js';
63
+ import { StoreValidationStateReader } from './core/validation-state-reader.js';
33
64
  import { DidDht, DidJwk, DidKey, DidResolverCacheMemory, DidWeb, UniversalResolver } from '@enbox/dids';
65
+ import { DwnError, DwnErrorCode } from './core/dwn-error.js';
34
66
  import { DwnInterfaceName, DwnMethodName } from './enums/dwn-interface-method.js';
67
+ import { missingAncestorRecordIdsFromReply, replicationApplyResultFromReply } from './core/replication-apply.js';
35
68
 
36
69
  /**
37
70
  * Structural shape for `DidResolver` implementations that expose
@@ -45,18 +78,29 @@ type LifecycleResolver = {
45
78
  close: () => Promise<void>;
46
79
  };
47
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
+
48
92
  export class Dwn {
49
93
  private readonly methodHandlers: { [key:string]: MethodHandler };
50
94
  private readonly didResolver: DidResolver;
51
95
  private readonly messageStore: MessageStore;
52
96
  private readonly dataStore: DataStore;
53
97
  private readonly resumableTaskStore: ResumableTaskStore;
54
- private readonly stateIndex: StateIndex;
55
98
  private readonly tenantGate: TenantGate;
56
99
  private readonly eventLog?: EventLog;
57
100
  private readonly storageController: StorageController;
58
101
  private readonly resumableTaskManager: ResumableTaskManager;
59
102
  private readonly _coreProtocols: CoreProtocolRegistry;
103
+ private readonly validationStateReader: ValidationStateReader;
60
104
 
61
105
  /** Whether the DWN owns the resolver's lifecycle (i.e., created it via defaults). */
62
106
  private readonly ownsResolver: boolean;
@@ -68,41 +112,46 @@ export class Dwn {
68
112
  this.messageStore = config.messageStore;
69
113
  this.dataStore = config.dataStore;
70
114
  this.resumableTaskStore = config.resumableTaskStore;
71
- 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;
72
127
 
73
128
  this.eventLog = config.eventLog;
74
129
 
75
130
  this.storageController = new StorageController({
76
131
  messageStore : this.messageStore,
77
132
  dataStore : this.dataStore,
78
- stateIndex : this.stateIndex,
79
- eventLog : this.eventLog
80
133
  });
81
134
  this.resumableTaskManager = new ResumableTaskManager(
82
135
  config.resumableTaskStore,
83
136
  this.storageController
84
137
  );
85
138
 
86
- // Initialize the core protocol registry with built-in system protocols.
87
- this._coreProtocols = new CoreProtocolRegistry();
88
- this._coreProtocols.register(new PermissionsProtocol());
89
-
90
139
  // Build the shared dependency bag once; every handler receives the same object
91
140
  // and accesses only the dependencies it needs.
92
141
  const deps: HandlerDependencies = {
93
- didResolver : this.didResolver,
94
- messageStore : this.messageStore,
95
- dataStore : this.dataStore,
96
- stateIndex : this.stateIndex,
97
- resumableTaskManager : this.resumableTaskManager,
98
- coreProtocols : this._coreProtocols,
99
- 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,
100
149
  };
101
150
 
102
151
  this.methodHandlers = {
103
152
  [DwnInterfaceName.Messages + DwnMethodName.Read] : new MessagesReadHandler(deps),
153
+ [DwnInterfaceName.Messages + DwnMethodName.Query] : new MessagesQueryHandler(deps),
104
154
  [DwnInterfaceName.Messages + DwnMethodName.Subscribe] : new MessagesSubscribeHandler(deps),
105
- [DwnInterfaceName.Messages + DwnMethodName.Sync] : new MessagesSyncHandler(deps),
106
155
  [DwnInterfaceName.Protocols + DwnMethodName.Configure] : new ProtocolsConfigureHandler(deps),
107
156
  [DwnInterfaceName.Protocols + DwnMethodName.Query] : new ProtocolsQueryHandler(deps),
108
157
  [DwnInterfaceName.Records + DwnMethodName.Count] : new RecordsCountHandler(deps),
@@ -148,7 +197,6 @@ export class Dwn {
148
197
  await this.messageStore.open();
149
198
  await this.dataStore.open();
150
199
  await this.resumableTaskStore.open();
151
- await this.stateIndex.open();
152
200
  await this.eventLog?.open();
153
201
 
154
202
  await this.resumableTaskManager.resumeTasksAndWaitForCompletion();
@@ -159,7 +207,6 @@ export class Dwn {
159
207
  await this.messageStore.close();
160
208
  await this.dataStore.close();
161
209
  await this.resumableTaskStore.close();
162
- await this.stateIndex.close();
163
210
 
164
211
  // Close the resolver's cache if the DWN owns it.
165
212
  const lifecycleResolver = this.didResolver as Partial<LifecycleResolver>;
@@ -179,15 +226,14 @@ export class Dwn {
179
226
 
180
227
  /**
181
228
  * Returns the internal storage components for advanced operations that
182
- * cannot be expressed through the standard `processMessage()` pipeline
183
- * (e.g., owner-upgrade of externally authored encrypted records).
229
+ * cannot be expressed through the standard `processMessage()` pipeline.
184
230
  *
185
231
  * Callers are responsible for maintaining consistency across stores.
186
232
  */
187
- public get storage(): { messageStore: MessageStore; stateIndex: StateIndex; eventLog: EventLog | undefined } {
233
+ public get storage(): DwnStorage {
188
234
  return {
235
+ dataStore : this.dataStore,
189
236
  messageStore : this.messageStore,
190
- stateIndex : this.stateIndex,
191
237
  eventLog : this.eventLog,
192
238
  };
193
239
  }
@@ -199,7 +245,7 @@ export class Dwn {
199
245
  public async processMessage(
200
246
  tenant: string, rawMessage: MessagesSubscribeMessage, options?: MessagesSubscribeMessageOptions): Promise<MessagesSubscribeReply>;
201
247
  public async processMessage(tenant: string, rawMessage: MessagesReadMessage): Promise<MessagesReadReply>;
202
- public async processMessage(tenant: string, rawMessage: MessagesSyncMessage): Promise<MessagesSyncReply>;
248
+ public async processMessage(tenant: string, rawMessage: MessagesQueryMessage): Promise<MessagesQueryReply>;
203
249
  public async processMessage(tenant: string, rawMessage: ProtocolsConfigureMessage): Promise<GenericMessageReply>;
204
250
  public async processMessage(tenant: string, rawMessage: ProtocolsQueryMessage): Promise<ProtocolsQueryReply>;
205
251
  public async processMessage(tenant: string, rawMessage: RecordsCountMessage): Promise<RecordsCountReply>;
@@ -223,12 +269,347 @@ export class Dwn {
223
269
  tenant,
224
270
  message: rawMessage,
225
271
  dataStream,
226
- subscriptionHandler
272
+ subscriptionHandler,
227
273
  });
228
274
 
229
275
  return methodHandlerReply;
230
276
  }
231
277
 
278
+ /**
279
+ * Applies a message obtained through replication and returns a structured
280
+ * outcome instead of an HTTP-like handler status. Normal authoring still
281
+ * uses `processMessage`; sync uses this entry point so missing local
282
+ * dependencies can be fetched and retried without treating the replicated
283
+ * message as permanently invalid.
284
+ */
285
+ public async applyReplicatedMessage(
286
+ tenant: string,
287
+ rawMessage: GenericMessage,
288
+ options: ReplicationApplyOptions = {},
289
+ ): Promise<ReplicationApplyResult> {
290
+ const tenantError = await this.validateTenant(tenant);
291
+ if (tenantError !== undefined) {
292
+ return { kind: 'Deferred', reason: 'tenant-inactive' };
293
+ }
294
+
295
+ const integrityError = await this.validateMessageIntegrity(rawMessage);
296
+ if (integrityError !== undefined) {
297
+ return { kind: 'Invalid', reason: integrityError.status.detail };
298
+ }
299
+
300
+ if (await this.replicatedMessageAlreadyStored(tenant, rawMessage)) {
301
+ return { kind: 'Duplicate' };
302
+ }
303
+
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
+
310
+ const protocolDefinition = await this.getReplicationApplyProtocolDefinition(tenant, rawMessage, reply);
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;
487
+ }
488
+
489
+ private async getReplicationApplyProtocolDefinition(
490
+ tenant: string,
491
+ message: GenericMessage,
492
+ reply: { status: { detail?: string } },
493
+ ): Promise<ProtocolDefinition | undefined> {
494
+ const detail = reply.status.detail ?? '';
495
+ if (!detail.startsWith(`${DwnErrorCode.ProtocolAuthorizationMatchingRoleRecordNotFound}:`)) {
496
+ return undefined;
497
+ }
498
+
499
+ const lookup = Dwn.getReplicationApplyProtocolDefinitionLookup(message);
500
+ if (lookup === undefined) {
501
+ return undefined;
502
+ }
503
+
504
+ try {
505
+ return await this.validationStateReader.fetchProtocolDefinition(
506
+ tenant,
507
+ lookup.protocol,
508
+ lookup.messageTimestamp,
509
+ );
510
+ } catch {
511
+ return undefined;
512
+ }
513
+ }
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
+
529
+ private static getMessageProtocolForReplicationApply(message: GenericMessage): string | undefined {
530
+ const descriptor = message.descriptor as { protocol?: unknown; filter?: { protocol?: unknown } };
531
+ if (typeof descriptor.protocol === 'string') {
532
+ return descriptor.protocol;
533
+ }
534
+ if (typeof descriptor.filter?.protocol === 'string') {
535
+ return descriptor.filter.protocol;
536
+ }
537
+ }
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
+
544
+ private async replicatedMessageAlreadyStored(
545
+ tenant: string,
546
+ message: GenericMessage,
547
+ ): Promise<boolean> {
548
+ const existingMessages = await this.getExistingMessagesForReplicationDedup(tenant, message);
549
+ if (existingMessages.length === 0) {
550
+ return false;
551
+ }
552
+
553
+ const incomingCid = await Message.getCid(message);
554
+ for (const existing of existingMessages) {
555
+ if (await Message.getCid(existing) !== incomingCid) {
556
+ continue;
557
+ }
558
+
559
+ return true;
560
+ }
561
+
562
+ return false;
563
+ }
564
+
565
+ private async getExistingMessagesForReplicationDedup(
566
+ tenant: string,
567
+ message: GenericMessage,
568
+ ): Promise<GenericMessage[]> {
569
+ const { descriptor } = message;
570
+ if (descriptor.interface === DwnInterfaceName.Records && descriptor.method === DwnMethodName.Write) {
571
+ const recordId = (message as { recordId?: unknown }).recordId;
572
+ if (typeof recordId !== 'string') {
573
+ return [];
574
+ }
575
+
576
+ const { messages } = await this.messageStore.query(tenant, [{
577
+ interface: DwnInterfaceName.Records,
578
+ recordId,
579
+ }]);
580
+ return messages;
581
+ }
582
+
583
+ if (descriptor.interface === DwnInterfaceName.Records && descriptor.method === DwnMethodName.Delete) {
584
+ const recordId = (descriptor as { recordId?: unknown }).recordId;
585
+ if (typeof recordId !== 'string') {
586
+ return [];
587
+ }
588
+
589
+ const { messages } = await this.messageStore.query(tenant, [{
590
+ interface: DwnInterfaceName.Records,
591
+ recordId,
592
+ }]);
593
+ return messages;
594
+ }
595
+
596
+ if (descriptor.interface === DwnInterfaceName.Protocols && descriptor.method === DwnMethodName.Configure) {
597
+ const protocol = (descriptor as { definition?: { protocol?: unknown } }).definition?.protocol;
598
+ if (typeof protocol !== 'string') {
599
+ return [];
600
+ }
601
+
602
+ const { messages } = await this.messageStore.query(tenant, [{
603
+ interface : DwnInterfaceName.Protocols,
604
+ method : DwnMethodName.Configure,
605
+ protocol,
606
+ }]);
607
+ return messages;
608
+ }
609
+
610
+ return [];
611
+ }
612
+
232
613
  /**
233
614
  * Checks tenant gate to see if tenant is allowed.
234
615
  * @param tenant The tenant DID to route the given message to.
@@ -304,8 +685,14 @@ export type DwnConfig = {
304
685
  */
305
686
  eventLog?: EventLog;
306
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
+
307
695
  messageStore: MessageStore;
308
696
  dataStore: DataStore;
309
- stateIndex: StateIndex;
310
697
  resumableTaskStore: ResumableTaskStore;
311
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
  }