@enbox/dwn-sdk-js 0.4.0 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (522) hide show
  1. package/README.md +4 -4
  2. package/dist/browser.mjs +3 -10
  3. package/dist/browser.mjs.map +4 -4
  4. package/dist/esm/generated/precompiled-validators.js +799 -885
  5. package/dist/esm/generated/precompiled-validators.js.map +1 -1
  6. package/dist/esm/src/core/dwn-constant.js +5 -0
  7. package/dist/esm/src/core/dwn-constant.js.map +1 -1
  8. package/dist/esm/src/core/dwn-error.js +12 -4
  9. package/dist/esm/src/core/dwn-error.js.map +1 -1
  10. package/dist/esm/src/core/grant-authorization.js +9 -18
  11. package/dist/esm/src/core/grant-authorization.js.map +1 -1
  12. package/dist/esm/src/core/message-reply.js.map +1 -1
  13. package/dist/esm/src/core/messages-grant-authorization.js +28 -45
  14. package/dist/esm/src/core/messages-grant-authorization.js.map +1 -1
  15. package/dist/esm/src/core/protocol-authorization-action.js +25 -27
  16. package/dist/esm/src/core/protocol-authorization-action.js.map +1 -1
  17. package/dist/esm/src/core/protocol-authorization-validation.js +34 -89
  18. package/dist/esm/src/core/protocol-authorization-validation.js.map +1 -1
  19. package/dist/esm/src/core/protocol-authorization.js +44 -118
  20. package/dist/esm/src/core/protocol-authorization.js.map +1 -1
  21. package/dist/esm/src/core/protocols-grant-authorization.js +5 -5
  22. package/dist/esm/src/core/protocols-grant-authorization.js.map +1 -1
  23. package/dist/esm/src/core/recording-validation-state-reader.js +84 -0
  24. package/dist/esm/src/core/recording-validation-state-reader.js.map +1 -0
  25. package/dist/esm/src/core/records-grant-authorization.js +11 -11
  26. package/dist/esm/src/core/records-grant-authorization.js.map +1 -1
  27. package/dist/esm/src/core/replication-apply.js +123 -28
  28. package/dist/esm/src/core/replication-apply.js.map +1 -1
  29. package/dist/esm/src/core/resumable-task-manager.js +5 -4
  30. package/dist/esm/src/core/resumable-task-manager.js.map +1 -1
  31. package/dist/esm/src/core/validation-state-reader.js +237 -0
  32. package/dist/esm/src/core/validation-state-reader.js.map +1 -0
  33. package/dist/esm/src/dwn.js +165 -132
  34. package/dist/esm/src/dwn.js.map +1 -1
  35. package/dist/esm/src/enums/dwn-interface-method.js +0 -1
  36. package/dist/esm/src/enums/dwn-interface-method.js.map +1 -1
  37. package/dist/esm/src/event-stream/durable-event-log.js +365 -0
  38. package/dist/esm/src/event-stream/durable-event-log.js.map +1 -0
  39. package/dist/esm/src/event-stream/event-emitter-wake-publisher.js +25 -0
  40. package/dist/esm/src/event-stream/event-emitter-wake-publisher.js.map +1 -0
  41. package/dist/esm/src/handlers/messages-query.js +159 -0
  42. package/dist/esm/src/handlers/messages-query.js.map +1 -0
  43. package/dist/esm/src/handlers/messages-read.js +5 -5
  44. package/dist/esm/src/handlers/messages-read.js.map +1 -1
  45. package/dist/esm/src/handlers/messages-subscribe.js +8 -8
  46. package/dist/esm/src/handlers/messages-subscribe.js.map +1 -1
  47. package/dist/esm/src/handlers/protocols-configure.js +30 -49
  48. package/dist/esm/src/handlers/protocols-configure.js.map +1 -1
  49. package/dist/esm/src/handlers/protocols-query.js +1 -1
  50. package/dist/esm/src/handlers/protocols-query.js.map +1 -1
  51. package/dist/esm/src/handlers/records-count.js +20 -11
  52. package/dist/esm/src/handlers/records-count.js.map +1 -1
  53. package/dist/esm/src/handlers/records-delete.js +20 -16
  54. package/dist/esm/src/handlers/records-delete.js.map +1 -1
  55. package/dist/esm/src/handlers/records-query.js +35 -11
  56. package/dist/esm/src/handlers/records-query.js.map +1 -1
  57. package/dist/esm/src/handlers/records-read.js +52 -42
  58. package/dist/esm/src/handlers/records-read.js.map +1 -1
  59. package/dist/esm/src/handlers/records-subscribe.js +107 -11
  60. package/dist/esm/src/handlers/records-subscribe.js.map +1 -1
  61. package/dist/esm/src/handlers/records-write.js +62 -116
  62. package/dist/esm/src/handlers/records-write.js.map +1 -1
  63. package/dist/esm/src/index.js +6 -7
  64. package/dist/esm/src/index.js.map +1 -1
  65. package/dist/esm/src/interfaces/{messages-sync.js → messages-query.js} +21 -15
  66. package/dist/esm/src/interfaces/messages-query.js.map +1 -0
  67. package/dist/esm/src/interfaces/protocols-configure.js +12 -9
  68. package/dist/esm/src/interfaces/protocols-configure.js.map +1 -1
  69. package/dist/esm/src/interfaces/protocols-query.js +3 -4
  70. package/dist/esm/src/interfaces/protocols-query.js.map +1 -1
  71. package/dist/esm/src/interfaces/records-count.js +4 -3
  72. package/dist/esm/src/interfaces/records-count.js.map +1 -1
  73. package/dist/esm/src/interfaces/records-delete.js +21 -4
  74. package/dist/esm/src/interfaces/records-delete.js.map +1 -1
  75. package/dist/esm/src/interfaces/records-query.js +4 -3
  76. package/dist/esm/src/interfaces/records-query.js.map +1 -1
  77. package/dist/esm/src/interfaces/records-read.js +3 -3
  78. package/dist/esm/src/interfaces/records-read.js.map +1 -1
  79. package/dist/esm/src/interfaces/records-subscribe.js +4 -3
  80. package/dist/esm/src/interfaces/records-subscribe.js.map +1 -1
  81. package/dist/esm/src/interfaces/records-write.js +27 -13
  82. package/dist/esm/src/interfaces/records-write.js.map +1 -1
  83. package/dist/esm/src/protocols/permissions.js +27 -34
  84. package/dist/esm/src/protocols/permissions.js.map +1 -1
  85. package/dist/esm/src/store/index-level.js +24 -9
  86. package/dist/esm/src/store/index-level.js.map +1 -1
  87. package/dist/esm/src/store/level-wrapper.js +7 -0
  88. package/dist/esm/src/store/level-wrapper.js.map +1 -1
  89. package/dist/esm/src/store/message-store-level.js +536 -42
  90. package/dist/esm/src/store/message-store-level.js.map +1 -1
  91. package/dist/esm/src/store/storage-controller.js +58 -49
  92. package/dist/esm/src/store/storage-controller.js.map +1 -1
  93. package/dist/esm/src/types/message-types.js.map +1 -1
  94. package/dist/esm/src/types/validation-state-reader.js +2 -0
  95. package/dist/esm/src/types/validation-state-reader.js.map +1 -0
  96. package/dist/esm/src/utils/messages.js +17 -0
  97. package/dist/esm/src/utils/messages.js.map +1 -1
  98. package/dist/esm/src/utils/protocol-tags.js +262 -0
  99. package/dist/esm/src/utils/protocol-tags.js.map +1 -0
  100. package/dist/esm/src/utils/record-limit-occupancy.js +244 -0
  101. package/dist/esm/src/utils/record-limit-occupancy.js.map +1 -0
  102. package/dist/esm/src/utils/records.js +50 -14
  103. package/dist/esm/src/utils/records.js.map +1 -1
  104. package/dist/esm/src/utils/replication.js +85 -0
  105. package/dist/esm/src/utils/replication.js.map +1 -0
  106. package/dist/esm/tests/core/grant-authorization.spec.js +4 -4
  107. package/dist/esm/tests/core/grant-authorization.spec.js.map +1 -1
  108. package/dist/esm/tests/core/process-message-parity.spec.js +222 -0
  109. package/dist/esm/tests/core/process-message-parity.spec.js.map +1 -0
  110. package/dist/esm/tests/core/protocol-authorization.spec.js +5 -2
  111. package/dist/esm/tests/core/protocol-authorization.spec.js.map +1 -1
  112. package/dist/esm/tests/core/records-grant-authorization.spec.js +5 -5
  113. package/dist/esm/tests/core/records-grant-authorization.spec.js.map +1 -1
  114. package/dist/esm/tests/core/replication-apply.spec.js +55 -1
  115. package/dist/esm/tests/core/replication-apply.spec.js.map +1 -1
  116. package/dist/esm/tests/core/replication-replay-property.spec.js +350 -0
  117. package/dist/esm/tests/core/replication-replay-property.spec.js.map +1 -0
  118. package/dist/esm/tests/core/validation-read-closure.spec.js +469 -0
  119. package/dist/esm/tests/core/validation-read-closure.spec.js.map +1 -0
  120. package/dist/esm/tests/core/validation-state-reader.spec.js +716 -0
  121. package/dist/esm/tests/core/validation-state-reader.spec.js.map +1 -0
  122. package/dist/esm/tests/durable-event-log.spec.js +373 -0
  123. package/dist/esm/tests/durable-event-log.spec.js.map +1 -0
  124. package/dist/esm/tests/dwn.spec.js +504 -35
  125. package/dist/esm/tests/dwn.spec.js.map +1 -1
  126. package/dist/esm/tests/features/author-delegated-grant.spec.js +9 -6
  127. package/dist/esm/tests/features/author-delegated-grant.spec.js.map +1 -1
  128. package/dist/esm/tests/features/owner-delegated-grant.spec.js +1 -4
  129. package/dist/esm/tests/features/owner-delegated-grant.spec.js.map +1 -1
  130. package/dist/esm/tests/features/owner-signature.spec.js +1 -4
  131. package/dist/esm/tests/features/owner-signature.spec.js.map +1 -1
  132. package/dist/esm/tests/features/permissions.spec.js +165 -4
  133. package/dist/esm/tests/features/permissions.spec.js.map +1 -1
  134. package/dist/esm/tests/features/protocol-composition.spec.js +8 -11
  135. package/dist/esm/tests/features/protocol-composition.spec.js.map +1 -1
  136. package/dist/esm/tests/features/protocol-create-action.spec.js +1 -4
  137. package/dist/esm/tests/features/protocol-create-action.spec.js.map +1 -1
  138. package/dist/esm/tests/features/protocol-delete-action.spec.js +3 -5
  139. package/dist/esm/tests/features/protocol-delete-action.spec.js.map +1 -1
  140. package/dist/esm/tests/features/protocol-update-action.spec.js +3 -6
  141. package/dist/esm/tests/features/protocol-update-action.spec.js.map +1 -1
  142. package/dist/esm/tests/features/records-delivery.spec.js +1 -4
  143. package/dist/esm/tests/features/records-delivery.spec.js.map +1 -1
  144. package/dist/esm/tests/features/records-immutable.spec.js +1 -4
  145. package/dist/esm/tests/features/records-immutable.spec.js.map +1 -1
  146. package/dist/esm/tests/features/records-nested-query-scope.spec.js +281 -0
  147. package/dist/esm/tests/features/records-nested-query-scope.spec.js.map +1 -0
  148. package/dist/esm/tests/features/records-prune-cross-protocol.spec.js +3 -7
  149. package/dist/esm/tests/features/records-prune-cross-protocol.spec.js.map +1 -1
  150. package/dist/esm/tests/features/records-prune.spec.js +11 -22
  151. package/dist/esm/tests/features/records-prune.spec.js.map +1 -1
  152. package/dist/esm/tests/features/records-record-limit.spec.js +441 -231
  153. package/dist/esm/tests/features/records-record-limit.spec.js.map +1 -1
  154. package/dist/esm/tests/features/records-squash.spec.js +6 -4
  155. package/dist/esm/tests/features/records-squash.spec.js.map +1 -1
  156. package/dist/esm/tests/features/records-tags.spec.js +1 -4
  157. package/dist/esm/tests/features/records-tags.spec.js.map +1 -1
  158. package/dist/esm/tests/features/resumable-tasks.spec.js +3 -5
  159. package/dist/esm/tests/features/resumable-tasks.spec.js.map +1 -1
  160. package/dist/esm/tests/fuzz/message-store.fuzz.spec.js +1 -2
  161. package/dist/esm/tests/fuzz/message-store.fuzz.spec.js.map +1 -1
  162. package/dist/esm/tests/fuzz/process-message.fuzz.spec.js +2 -4
  163. package/dist/esm/tests/fuzz/process-message.fuzz.spec.js.map +1 -1
  164. package/dist/esm/tests/fuzz/schema-validation.fuzz.spec.js +1 -1
  165. package/dist/esm/tests/fuzz/schema-validation.fuzz.spec.js.map +1 -1
  166. package/dist/esm/tests/handlers/messages-query.spec.js +246 -0
  167. package/dist/esm/tests/handlers/messages-query.spec.js.map +1 -0
  168. package/dist/esm/tests/handlers/messages-read.spec.js +2 -5
  169. package/dist/esm/tests/handlers/messages-read.spec.js.map +1 -1
  170. package/dist/esm/tests/handlers/messages-subscribe.spec.js +3 -14
  171. package/dist/esm/tests/handlers/messages-subscribe.spec.js.map +1 -1
  172. package/dist/esm/tests/handlers/protocols-configure.spec.js +27 -26
  173. package/dist/esm/tests/handlers/protocols-configure.spec.js.map +1 -1
  174. package/dist/esm/tests/handlers/protocols-query.spec.js +1 -4
  175. package/dist/esm/tests/handlers/protocols-query.spec.js.map +1 -1
  176. package/dist/esm/tests/handlers/records-count.spec.js +1 -4
  177. package/dist/esm/tests/handlers/records-count.spec.js.map +1 -1
  178. package/dist/esm/tests/handlers/records-delete.spec.js +312 -30
  179. package/dist/esm/tests/handlers/records-delete.spec.js.map +1 -1
  180. package/dist/esm/tests/handlers/records-query.spec.js +32 -9
  181. package/dist/esm/tests/handlers/records-query.spec.js.map +1 -1
  182. package/dist/esm/tests/handlers/records-read.spec.js +4 -4
  183. package/dist/esm/tests/handlers/records-read.spec.js.map +1 -1
  184. package/dist/esm/tests/handlers/records-subscribe.spec.js +33 -14
  185. package/dist/esm/tests/handlers/records-subscribe.spec.js.map +1 -1
  186. package/dist/esm/tests/handlers/records-write.spec.js +82 -36
  187. package/dist/esm/tests/handlers/records-write.spec.js.map +1 -1
  188. package/dist/esm/tests/interfaces/records-delete.spec.js +69 -2
  189. package/dist/esm/tests/interfaces/records-delete.spec.js.map +1 -1
  190. package/dist/esm/tests/interfaces/records-write.spec.js +4 -3
  191. package/dist/esm/tests/interfaces/records-write.spec.js.map +1 -1
  192. package/dist/esm/tests/protocols/permissions.spec.js +55 -6
  193. package/dist/esm/tests/protocols/permissions.spec.js.map +1 -1
  194. package/dist/esm/tests/scenarios/aggregator.spec.js +1 -4
  195. package/dist/esm/tests/scenarios/aggregator.spec.js.map +1 -1
  196. package/dist/esm/tests/scenarios/deleted-record.spec.js +1 -4
  197. package/dist/esm/tests/scenarios/deleted-record.spec.js.map +1 -1
  198. package/dist/esm/tests/scenarios/end-to-end-tests.spec.js +1 -4
  199. package/dist/esm/tests/scenarios/end-to-end-tests.spec.js.map +1 -1
  200. package/dist/esm/tests/scenarios/nested-roles.spec.js +1 -4
  201. package/dist/esm/tests/scenarios/nested-roles.spec.js.map +1 -1
  202. package/dist/esm/tests/scenarios/subscriptions.spec.js +1 -4
  203. package/dist/esm/tests/scenarios/subscriptions.spec.js.map +1 -1
  204. package/dist/esm/tests/store/message-store-level.spec.js +361 -5
  205. package/dist/esm/tests/store/message-store-level.spec.js.map +1 -1
  206. package/dist/esm/tests/store/message-store.spec.js +60 -0
  207. package/dist/esm/tests/store/message-store.spec.js.map +1 -1
  208. package/dist/esm/tests/test-event-stream.js +7 -3
  209. package/dist/esm/tests/test-event-stream.js.map +1 -1
  210. package/dist/esm/tests/test-stores.js +19 -9
  211. package/dist/esm/tests/test-stores.js.map +1 -1
  212. package/dist/esm/tests/test-suite.js +4 -2
  213. package/dist/esm/tests/test-suite.js.map +1 -1
  214. package/dist/esm/tests/utils/protocol-tags.spec.js +96 -0
  215. package/dist/esm/tests/utils/protocol-tags.spec.js.map +1 -0
  216. package/dist/esm/tests/utils/test-data-generator.js +25 -0
  217. package/dist/esm/tests/utils/test-data-generator.js.map +1 -1
  218. package/dist/esm/tests/utils/test-stub-generator.js.map +1 -1
  219. package/dist/esm/tests/utils/test-validation-state-reader.js +16 -0
  220. package/dist/esm/tests/utils/test-validation-state-reader.js.map +1 -0
  221. package/dist/types/generated/precompiled-validators.d.ts +6 -6
  222. package/dist/types/generated/precompiled-validators.d.ts.map +1 -1
  223. package/dist/types/src/core/core-protocol.d.ts +3 -3
  224. package/dist/types/src/core/core-protocol.d.ts.map +1 -1
  225. package/dist/types/src/core/dwn-constant.d.ts +5 -0
  226. package/dist/types/src/core/dwn-constant.d.ts.map +1 -1
  227. package/dist/types/src/core/dwn-error.d.ts +12 -4
  228. package/dist/types/src/core/dwn-error.d.ts.map +1 -1
  229. package/dist/types/src/core/grant-authorization.d.ts +5 -5
  230. package/dist/types/src/core/grant-authorization.d.ts.map +1 -1
  231. package/dist/types/src/core/message-reply.d.ts +5 -4
  232. package/dist/types/src/core/message-reply.d.ts.map +1 -1
  233. package/dist/types/src/core/messages-grant-authorization.d.ts +12 -14
  234. package/dist/types/src/core/messages-grant-authorization.d.ts.map +1 -1
  235. package/dist/types/src/core/protocol-authorization-action.d.ts +4 -5
  236. package/dist/types/src/core/protocol-authorization-action.d.ts.map +1 -1
  237. package/dist/types/src/core/protocol-authorization-validation.d.ts +14 -17
  238. package/dist/types/src/core/protocol-authorization-validation.d.ts.map +1 -1
  239. package/dist/types/src/core/protocol-authorization.d.ts +8 -33
  240. package/dist/types/src/core/protocol-authorization.d.ts.map +1 -1
  241. package/dist/types/src/core/protocols-grant-authorization.d.ts +4 -4
  242. package/dist/types/src/core/protocols-grant-authorization.d.ts.map +1 -1
  243. package/dist/types/src/core/recording-validation-state-reader.d.ts +75 -0
  244. package/dist/types/src/core/recording-validation-state-reader.d.ts.map +1 -0
  245. package/dist/types/src/core/records-grant-authorization.d.ts +8 -8
  246. package/dist/types/src/core/records-grant-authorization.d.ts.map +1 -1
  247. package/dist/types/src/core/replication-apply.d.ts +36 -0
  248. package/dist/types/src/core/replication-apply.d.ts.map +1 -1
  249. package/dist/types/src/core/resumable-task-manager.d.ts +1 -1
  250. package/dist/types/src/core/resumable-task-manager.d.ts.map +1 -1
  251. package/dist/types/src/core/validation-state-reader.d.ts +79 -0
  252. package/dist/types/src/core/validation-state-reader.d.ts.map +1 -0
  253. package/dist/types/src/dwn.d.ts +33 -20
  254. package/dist/types/src/dwn.d.ts.map +1 -1
  255. package/dist/types/src/enums/dwn-interface-method.d.ts +0 -1
  256. package/dist/types/src/enums/dwn-interface-method.d.ts.map +1 -1
  257. package/dist/types/src/event-stream/durable-event-log.d.ts +69 -0
  258. package/dist/types/src/event-stream/durable-event-log.d.ts.map +1 -0
  259. package/dist/types/src/event-stream/event-emitter-wake-publisher.d.ts +13 -0
  260. package/dist/types/src/event-stream/event-emitter-wake-publisher.d.ts.map +1 -0
  261. package/dist/types/src/handlers/messages-query.d.ts +20 -0
  262. package/dist/types/src/handlers/messages-query.d.ts.map +1 -0
  263. package/dist/types/src/handlers/messages-read.d.ts +1 -1
  264. package/dist/types/src/handlers/messages-read.d.ts.map +1 -1
  265. package/dist/types/src/handlers/messages-subscribe.d.ts.map +1 -1
  266. package/dist/types/src/handlers/protocols-configure.d.ts +0 -5
  267. package/dist/types/src/handlers/protocols-configure.d.ts.map +1 -1
  268. package/dist/types/src/handlers/records-count.d.ts +2 -1
  269. package/dist/types/src/handlers/records-count.d.ts.map +1 -1
  270. package/dist/types/src/handlers/records-delete.d.ts +2 -2
  271. package/dist/types/src/handlers/records-delete.d.ts.map +1 -1
  272. package/dist/types/src/handlers/records-query.d.ts +1 -1
  273. package/dist/types/src/handlers/records-query.d.ts.map +1 -1
  274. package/dist/types/src/handlers/records-read.d.ts +2 -1
  275. package/dist/types/src/handlers/records-read.d.ts.map +1 -1
  276. package/dist/types/src/handlers/records-subscribe.d.ts +4 -5
  277. package/dist/types/src/handlers/records-subscribe.d.ts.map +1 -1
  278. package/dist/types/src/handlers/records-write.d.ts +3 -11
  279. package/dist/types/src/handlers/records-write.d.ts.map +1 -1
  280. package/dist/types/src/index.d.ts +14 -16
  281. package/dist/types/src/index.d.ts.map +1 -1
  282. package/dist/types/src/interfaces/messages-query.d.ts +23 -0
  283. package/dist/types/src/interfaces/messages-query.d.ts.map +1 -0
  284. package/dist/types/src/interfaces/protocols-configure.d.ts +3 -3
  285. package/dist/types/src/interfaces/protocols-configure.d.ts.map +1 -1
  286. package/dist/types/src/interfaces/protocols-query.d.ts +2 -2
  287. package/dist/types/src/interfaces/protocols-query.d.ts.map +1 -1
  288. package/dist/types/src/interfaces/records-count.d.ts +3 -3
  289. package/dist/types/src/interfaces/records-count.d.ts.map +1 -1
  290. package/dist/types/src/interfaces/records-delete.d.ts +11 -3
  291. package/dist/types/src/interfaces/records-delete.d.ts.map +1 -1
  292. package/dist/types/src/interfaces/records-query.d.ts +3 -3
  293. package/dist/types/src/interfaces/records-query.d.ts.map +1 -1
  294. package/dist/types/src/interfaces/records-read.d.ts +3 -3
  295. package/dist/types/src/interfaces/records-read.d.ts.map +1 -1
  296. package/dist/types/src/interfaces/records-subscribe.d.ts +3 -3
  297. package/dist/types/src/interfaces/records-subscribe.d.ts.map +1 -1
  298. package/dist/types/src/interfaces/records-write.d.ts +15 -7
  299. package/dist/types/src/interfaces/records-write.d.ts.map +1 -1
  300. package/dist/types/src/protocols/permissions.d.ts +9 -12
  301. package/dist/types/src/protocols/permissions.d.ts.map +1 -1
  302. package/dist/types/src/store/index-level.d.ts +10 -1
  303. package/dist/types/src/store/index-level.d.ts.map +1 -1
  304. package/dist/types/src/store/level-wrapper.d.ts +5 -0
  305. package/dist/types/src/store/level-wrapper.d.ts.map +1 -1
  306. package/dist/types/src/store/message-store-level.d.ts +94 -14
  307. package/dist/types/src/store/message-store-level.d.ts.map +1 -1
  308. package/dist/types/src/store/storage-controller.d.ts +17 -14
  309. package/dist/types/src/store/storage-controller.d.ts.map +1 -1
  310. package/dist/types/src/types/message-store.d.ts +29 -1
  311. package/dist/types/src/types/message-store.d.ts.map +1 -1
  312. package/dist/types/src/types/message-types.d.ts +2 -0
  313. package/dist/types/src/types/message-types.d.ts.map +1 -1
  314. package/dist/types/src/types/messages-types.d.ts +21 -37
  315. package/dist/types/src/types/messages-types.d.ts.map +1 -1
  316. package/dist/types/src/types/method-handler.d.ts +2 -2
  317. package/dist/types/src/types/method-handler.d.ts.map +1 -1
  318. package/dist/types/src/types/permission-types.d.ts +1 -1
  319. package/dist/types/src/types/subscriptions.d.ts +50 -39
  320. package/dist/types/src/types/subscriptions.d.ts.map +1 -1
  321. package/dist/types/src/types/validation-state-reader.d.ts +116 -0
  322. package/dist/types/src/types/validation-state-reader.d.ts.map +1 -0
  323. package/dist/types/src/utils/messages.d.ts +10 -0
  324. package/dist/types/src/utils/messages.d.ts.map +1 -1
  325. package/dist/types/src/utils/protocol-tags.d.ts +15 -0
  326. package/dist/types/src/utils/protocol-tags.d.ts.map +1 -0
  327. package/dist/types/src/utils/record-limit-occupancy.d.ts +40 -0
  328. package/dist/types/src/utils/record-limit-occupancy.d.ts.map +1 -0
  329. package/dist/types/src/utils/records.d.ts +25 -3
  330. package/dist/types/src/utils/records.d.ts.map +1 -1
  331. package/dist/types/src/utils/replication.d.ts +22 -0
  332. package/dist/types/src/utils/replication.d.ts.map +1 -0
  333. package/dist/types/tests/core/process-message-parity.spec.d.ts +2 -0
  334. package/dist/types/tests/core/process-message-parity.spec.d.ts.map +1 -0
  335. package/dist/types/tests/core/replication-replay-property.spec.d.ts +2 -0
  336. package/dist/types/tests/core/replication-replay-property.spec.d.ts.map +1 -0
  337. package/dist/types/tests/core/validation-read-closure.spec.d.ts +2 -0
  338. package/dist/types/tests/core/validation-read-closure.spec.d.ts.map +1 -0
  339. package/dist/types/tests/core/validation-state-reader.spec.d.ts +2 -0
  340. package/dist/types/tests/core/validation-state-reader.spec.d.ts.map +1 -0
  341. package/dist/types/tests/durable-event-log.spec.d.ts +2 -0
  342. package/dist/types/tests/durable-event-log.spec.d.ts.map +1 -0
  343. package/dist/types/tests/dwn.spec.d.ts.map +1 -1
  344. package/dist/types/tests/features/author-delegated-grant.spec.d.ts.map +1 -1
  345. package/dist/types/tests/features/owner-delegated-grant.spec.d.ts.map +1 -1
  346. package/dist/types/tests/features/owner-signature.spec.d.ts.map +1 -1
  347. package/dist/types/tests/features/permissions.spec.d.ts.map +1 -1
  348. package/dist/types/tests/features/protocol-composition.spec.d.ts.map +1 -1
  349. package/dist/types/tests/features/protocol-create-action.spec.d.ts.map +1 -1
  350. package/dist/types/tests/features/protocol-delete-action.spec.d.ts.map +1 -1
  351. package/dist/types/tests/features/protocol-update-action.spec.d.ts.map +1 -1
  352. package/dist/types/tests/features/records-delivery.spec.d.ts.map +1 -1
  353. package/dist/types/tests/features/records-immutable.spec.d.ts.map +1 -1
  354. package/dist/types/tests/features/records-nested-query-scope.spec.d.ts +2 -0
  355. package/dist/types/tests/features/records-nested-query-scope.spec.d.ts.map +1 -0
  356. package/dist/types/tests/features/records-prune-cross-protocol.spec.d.ts.map +1 -1
  357. package/dist/types/tests/features/records-prune.spec.d.ts.map +1 -1
  358. package/dist/types/tests/features/records-record-limit.spec.d.ts.map +1 -1
  359. package/dist/types/tests/features/records-squash.spec.d.ts.map +1 -1
  360. package/dist/types/tests/features/records-tags.spec.d.ts.map +1 -1
  361. package/dist/types/tests/features/resumable-tasks.spec.d.ts.map +1 -1
  362. package/dist/types/tests/handlers/messages-query.spec.d.ts +2 -0
  363. package/dist/types/tests/handlers/messages-query.spec.d.ts.map +1 -0
  364. package/dist/types/tests/handlers/messages-read.spec.d.ts.map +1 -1
  365. package/dist/types/tests/handlers/messages-subscribe.spec.d.ts.map +1 -1
  366. package/dist/types/tests/handlers/protocols-configure.spec.d.ts.map +1 -1
  367. package/dist/types/tests/handlers/protocols-query.spec.d.ts.map +1 -1
  368. package/dist/types/tests/handlers/records-count.spec.d.ts.map +1 -1
  369. package/dist/types/tests/handlers/records-delete.spec.d.ts.map +1 -1
  370. package/dist/types/tests/handlers/records-query.spec.d.ts.map +1 -1
  371. package/dist/types/tests/handlers/records-read.spec.d.ts.map +1 -1
  372. package/dist/types/tests/handlers/records-subscribe.spec.d.ts.map +1 -1
  373. package/dist/types/tests/handlers/records-write.spec.d.ts.map +1 -1
  374. package/dist/types/tests/scenarios/deleted-record.spec.d.ts.map +1 -1
  375. package/dist/types/tests/scenarios/end-to-end-tests.spec.d.ts.map +1 -1
  376. package/dist/types/tests/scenarios/nested-roles.spec.d.ts.map +1 -1
  377. package/dist/types/tests/scenarios/subscriptions.spec.d.ts.map +1 -1
  378. package/dist/types/tests/store/message-store.spec.d.ts.map +1 -1
  379. package/dist/types/tests/test-event-stream.d.ts +1 -1
  380. package/dist/types/tests/test-event-stream.d.ts.map +1 -1
  381. package/dist/types/tests/test-stores.d.ts +5 -4
  382. package/dist/types/tests/test-stores.d.ts.map +1 -1
  383. package/dist/types/tests/test-suite.d.ts +1 -2
  384. package/dist/types/tests/test-suite.d.ts.map +1 -1
  385. package/dist/types/tests/utils/protocol-tags.spec.d.ts +2 -0
  386. package/dist/types/tests/utils/protocol-tags.spec.d.ts.map +1 -0
  387. package/dist/types/tests/utils/test-data-generator.d.ts +20 -1
  388. package/dist/types/tests/utils/test-data-generator.d.ts.map +1 -1
  389. package/dist/types/tests/utils/test-validation-state-reader.d.ts +15 -0
  390. package/dist/types/tests/utils/test-validation-state-reader.d.ts.map +1 -0
  391. package/package.json +2 -2
  392. package/src/core/core-protocol.ts +3 -3
  393. package/src/core/dwn-constant.ts +7 -1
  394. package/src/core/dwn-error.ts +12 -4
  395. package/src/core/grant-authorization.ts +11 -20
  396. package/src/core/message-reply.ts +6 -5
  397. package/src/core/messages-grant-authorization.ts +37 -70
  398. package/src/core/protocol-authorization-action.ts +29 -38
  399. package/src/core/protocol-authorization-validation.ts +47 -121
  400. package/src/core/protocol-authorization.ts +56 -202
  401. package/src/core/protocols-grant-authorization.ts +9 -9
  402. package/src/core/recording-validation-state-reader.ts +130 -0
  403. package/src/core/records-grant-authorization.ts +16 -16
  404. package/src/core/replication-apply.ts +172 -32
  405. package/src/core/resumable-task-manager.ts +10 -8
  406. package/src/core/validation-state-reader.ts +350 -0
  407. package/src/dwn.ts +285 -192
  408. package/src/enums/dwn-interface-method.ts +0 -1
  409. package/src/event-stream/durable-event-log.ts +509 -0
  410. package/src/event-stream/event-emitter-wake-publisher.ts +34 -0
  411. package/src/handlers/messages-query.ts +203 -0
  412. package/src/handlers/messages-read.ts +9 -10
  413. package/src/handlers/messages-subscribe.ts +12 -13
  414. package/src/handlers/protocols-configure.ts +37 -58
  415. package/src/handlers/protocols-query.ts +1 -1
  416. package/src/handlers/records-count.ts +24 -17
  417. package/src/handlers/records-delete.ts +29 -27
  418. package/src/handlers/records-query.ts +38 -17
  419. package/src/handlers/records-read.ts +63 -50
  420. package/src/handlers/records-subscribe.ts +132 -19
  421. package/src/handlers/records-write.ts +77 -168
  422. package/src/index.ts +14 -17
  423. package/src/interfaces/messages-query.ts +70 -0
  424. package/src/interfaces/protocols-configure.ts +20 -10
  425. package/src/interfaces/protocols-query.ts +4 -5
  426. package/src/interfaces/records-count.ts +9 -4
  427. package/src/interfaces/records-delete.ts +25 -5
  428. package/src/interfaces/records-query.ts +9 -4
  429. package/src/interfaces/records-read.ts +4 -4
  430. package/src/interfaces/records-subscribe.ts +9 -4
  431. package/src/interfaces/records-write.ts +41 -13
  432. package/src/protocols/permissions.ts +32 -52
  433. package/src/store/index-level.ts +30 -9
  434. package/src/store/level-wrapper.ts +9 -1
  435. package/src/store/message-store-level.ts +757 -47
  436. package/src/store/storage-controller.ts +74 -63
  437. package/src/types/message-store.ts +45 -2
  438. package/src/types/message-types.ts +3 -1
  439. package/src/types/messages-types.ts +26 -45
  440. package/src/types/method-handler.ts +3 -3
  441. package/src/types/permission-types.ts +1 -1
  442. package/src/types/subscriptions.ts +53 -42
  443. package/src/types/validation-state-reader.ts +127 -0
  444. package/src/utils/messages.ts +25 -1
  445. package/src/utils/protocol-tags.ts +366 -0
  446. package/src/utils/record-limit-occupancy.ts +377 -0
  447. package/src/utils/records.ts +69 -13
  448. package/src/utils/replication.ts +122 -0
  449. package/dist/esm/src/core/record-chain.js +0 -64
  450. package/dist/esm/src/core/record-chain.js.map +0 -1
  451. package/dist/esm/src/event-stream/event-emitter-event-log.js +0 -334
  452. package/dist/esm/src/event-stream/event-emitter-event-log.js.map +0 -1
  453. package/dist/esm/src/handlers/messages-sync.js +0 -278
  454. package/dist/esm/src/handlers/messages-sync.js.map +0 -1
  455. package/dist/esm/src/interfaces/messages-sync.js.map +0 -1
  456. package/dist/esm/src/smt/smt-store-level.js +0 -103
  457. package/dist/esm/src/smt/smt-store-level.js.map +0 -1
  458. package/dist/esm/src/smt/smt-store-memory.js +0 -41
  459. package/dist/esm/src/smt/smt-store-memory.js.map +0 -1
  460. package/dist/esm/src/smt/smt-utils.js +0 -129
  461. package/dist/esm/src/smt/smt-utils.js.map +0 -1
  462. package/dist/esm/src/smt/sparse-merkle-tree.js +0 -577
  463. package/dist/esm/src/smt/sparse-merkle-tree.js.map +0 -1
  464. package/dist/esm/src/state-index/state-index-level.js +0 -191
  465. package/dist/esm/src/state-index/state-index-level.js.map +0 -1
  466. package/dist/esm/src/types/smt-types.js +0 -5
  467. package/dist/esm/src/types/smt-types.js.map +0 -1
  468. package/dist/esm/src/types/state-index.js +0 -2
  469. package/dist/esm/src/types/state-index.js.map +0 -1
  470. package/dist/esm/tests/event-emitter-event-log.spec.js +0 -499
  471. package/dist/esm/tests/event-emitter-event-log.spec.js.map +0 -1
  472. package/dist/esm/tests/handlers/messages-sync.spec.js +0 -1088
  473. package/dist/esm/tests/handlers/messages-sync.spec.js.map +0 -1
  474. package/dist/esm/tests/smt/smt-store-level.spec.js +0 -132
  475. package/dist/esm/tests/smt/smt-store-level.spec.js.map +0 -1
  476. package/dist/esm/tests/smt/sparse-merkle-tree.spec.js +0 -732
  477. package/dist/esm/tests/smt/sparse-merkle-tree.spec.js.map +0 -1
  478. package/dist/esm/tests/state-index/state-index-level.spec.js +0 -245
  479. package/dist/esm/tests/state-index/state-index-level.spec.js.map +0 -1
  480. package/dist/types/src/core/record-chain.d.ts +0 -24
  481. package/dist/types/src/core/record-chain.d.ts.map +0 -1
  482. package/dist/types/src/event-stream/event-emitter-event-log.d.ts +0 -80
  483. package/dist/types/src/event-stream/event-emitter-event-log.d.ts.map +0 -1
  484. package/dist/types/src/handlers/messages-sync.d.ts +0 -39
  485. package/dist/types/src/handlers/messages-sync.d.ts.map +0 -1
  486. package/dist/types/src/interfaces/messages-sync.d.ts +0 -20
  487. package/dist/types/src/interfaces/messages-sync.d.ts.map +0 -1
  488. package/dist/types/src/smt/smt-store-level.d.ts +0 -32
  489. package/dist/types/src/smt/smt-store-level.d.ts.map +0 -1
  490. package/dist/types/src/smt/smt-store-memory.d.ts +0 -22
  491. package/dist/types/src/smt/smt-store-memory.d.ts.map +0 -1
  492. package/dist/types/src/smt/smt-utils.d.ts +0 -58
  493. package/dist/types/src/smt/smt-utils.d.ts.map +0 -1
  494. package/dist/types/src/smt/sparse-merkle-tree.d.ts +0 -124
  495. package/dist/types/src/smt/sparse-merkle-tree.d.ts.map +0 -1
  496. package/dist/types/src/state-index/state-index-level.d.ts +0 -83
  497. package/dist/types/src/state-index/state-index-level.d.ts.map +0 -1
  498. package/dist/types/src/types/smt-types.d.ts +0 -81
  499. package/dist/types/src/types/smt-types.d.ts.map +0 -1
  500. package/dist/types/src/types/state-index.d.ts +0 -90
  501. package/dist/types/src/types/state-index.d.ts.map +0 -1
  502. package/dist/types/tests/event-emitter-event-log.spec.d.ts +0 -2
  503. package/dist/types/tests/event-emitter-event-log.spec.d.ts.map +0 -1
  504. package/dist/types/tests/handlers/messages-sync.spec.d.ts +0 -2
  505. package/dist/types/tests/handlers/messages-sync.spec.d.ts.map +0 -1
  506. package/dist/types/tests/smt/smt-store-level.spec.d.ts +0 -2
  507. package/dist/types/tests/smt/smt-store-level.spec.d.ts.map +0 -1
  508. package/dist/types/tests/smt/sparse-merkle-tree.spec.d.ts +0 -2
  509. package/dist/types/tests/smt/sparse-merkle-tree.spec.d.ts.map +0 -1
  510. package/dist/types/tests/state-index/state-index-level.spec.d.ts +0 -2
  511. package/dist/types/tests/state-index/state-index-level.spec.d.ts.map +0 -1
  512. package/src/core/record-chain.ts +0 -99
  513. package/src/event-stream/event-emitter-event-log.ts +0 -430
  514. package/src/handlers/messages-sync.ts +0 -403
  515. package/src/interfaces/messages-sync.ts +0 -69
  516. package/src/smt/smt-store-level.ts +0 -143
  517. package/src/smt/smt-store-memory.ts +0 -53
  518. package/src/smt/smt-utils.ts +0 -149
  519. package/src/smt/sparse-merkle-tree.ts +0 -698
  520. package/src/state-index/state-index-level.ts +0 -239
  521. package/src/types/smt-types.ts +0 -95
  522. package/src/types/state-index.ts +0 -100
@@ -1,577 +0,0 @@
1
- /**
2
- * Sparse Merkle Tree (SMT) implementation.
3
- *
4
- * A 256-level binary trie where:
5
- * - Keys are SHA-256 hashes of messageCids (uniformly distributed across 2^256 key space)
6
- * - Leaves store the messageCid value
7
- * - Internal nodes store H(leftChild || rightChild)
8
- * - Empty subtrees are represented implicitly via precomputed default hashes
9
- *
10
- * Key properties:
11
- * - Deterministic: the same set of key-value pairs always produces the same root hash
12
- * - O(log n) insert, delete, and proof operations (practically O(256) worst case)
13
- * - Supports inclusion and non-inclusion proofs
14
- * - Root hash provides a fingerprint of the entire set for O(1) comparison
15
- */
16
- import { getBit, hashChildren, hashEquals, hashKey, hashLeaf, initDefaultHashes, SMT_DEPTH } from './smt-utils.js';
17
- export class SparseMerkleTree {
18
- store;
19
- defaultHashes;
20
- constructor(store) {
21
- this.store = store;
22
- }
23
- /**
24
- * Initialize the SMT. Must be called before any operations.
25
- * Opens the store and precomputes default hashes.
26
- */
27
- async initialize() {
28
- await this.store.open();
29
- this.defaultHashes = await initDefaultHashes();
30
- }
31
- /**
32
- * Close the underlying store.
33
- */
34
- async close() {
35
- await this.store.close();
36
- }
37
- /**
38
- * Clear all data from the tree.
39
- */
40
- async clear() {
41
- await this.store.clear();
42
- }
43
- /**
44
- * Get the current root hash. Returns the default empty root if no root is set.
45
- */
46
- async getRoot() {
47
- const root = await this.store.getRoot();
48
- if (root === undefined) {
49
- return this.defaultHashes[0];
50
- }
51
- return root;
52
- }
53
- /**
54
- * Insert a messageCid into the tree.
55
- * The key is SHA-256(messageCid), the value is the messageCid string.
56
- *
57
- * @returns the new root hash after insertion
58
- */
59
- async insert(messageCid) {
60
- const keyHash = await hashKey(messageCid);
61
- const leafHash = await hashLeaf(keyHash, messageCid);
62
- const leafNode = {
63
- type: 'leaf',
64
- keyHash: keyHash,
65
- valueCid: messageCid,
66
- };
67
- // Store the leaf node
68
- await this.store.putNode(leafHash, leafNode);
69
- // Walk down the tree from root to leaf position, collecting the path
70
- const currentRoot = await this.getRoot();
71
- const newRoot = await this.insertAtNode(currentRoot, keyHash, leafHash, leafNode, 0);
72
- await this.store.setRoot(newRoot);
73
- return newRoot;
74
- }
75
- /**
76
- * Delete a messageCid from the tree.
77
- *
78
- * @returns the new root hash after deletion
79
- */
80
- async delete(messageCid) {
81
- const keyHash = await hashKey(messageCid);
82
- const currentRoot = await this.getRoot();
83
- const newRoot = await this.deleteAtNode(currentRoot, keyHash, 0);
84
- await this.store.setRoot(newRoot);
85
- return newRoot;
86
- }
87
- /**
88
- * Check if a messageCid exists in the tree.
89
- */
90
- async has(messageCid) {
91
- const keyHash = await hashKey(messageCid);
92
- const currentRoot = await this.getRoot();
93
- return this.existsAtNode(currentRoot, keyHash, 0);
94
- }
95
- /**
96
- * Generate a membership proof (inclusion or non-inclusion) for a messageCid.
97
- */
98
- async getProof(messageCid) {
99
- const keyHash = await hashKey(messageCid);
100
- const currentRoot = await this.getRoot();
101
- return this.generateProof(currentRoot, keyHash, 0);
102
- }
103
- /**
104
- * Get the hash of a subtree at a given bit prefix.
105
- * Used by the sync protocol for tree walking.
106
- *
107
- * @param prefix - array of booleans representing the path (false=left, true=right)
108
- * @returns the hash of the subtree at that prefix
109
- */
110
- async getSubtreeHash(prefix) {
111
- let currentHash = await this.getRoot();
112
- for (let i = 0; i < prefix.length; i++) {
113
- if (hashEquals(currentHash, this.defaultHashes[i])) {
114
- // Empty subtree — return the default hash at the target depth
115
- return this.defaultHashes[prefix.length];
116
- }
117
- const node = await this.store.getNode(currentHash);
118
- if (node === undefined || node.type === 'leaf') {
119
- // Leaf reached before prefix exhausted — need to compute what the
120
- // subtree hash would be if this leaf were pushed down to the prefix depth.
121
- // For simplicity, if we've hit a leaf, the subtree at this prefix
122
- // either contains this leaf or is empty.
123
- if (node?.type === 'leaf') {
124
- return this.computeSubtreeHashForLeaf(node, i, prefix);
125
- }
126
- return this.defaultHashes[prefix.length];
127
- }
128
- const internalNode = node;
129
- if (prefix[i]) {
130
- currentHash = internalNode.rightHash;
131
- }
132
- else {
133
- currentHash = internalNode.leftHash;
134
- }
135
- }
136
- return currentHash;
137
- }
138
- /**
139
- * Get all leaf messageCids under a given prefix.
140
- * Used by the sync protocol for tree walking.
141
- */
142
- async getLeaves(prefix) {
143
- let currentHash = await this.getRoot();
144
- // Navigate to the subtree at the prefix
145
- for (let i = 0; i < prefix.length; i++) {
146
- if (hashEquals(currentHash, this.defaultHashes[i])) {
147
- return [];
148
- }
149
- const node = await this.store.getNode(currentHash);
150
- if (node === undefined) {
151
- return [];
152
- }
153
- if (node.type === 'leaf') {
154
- // Check if this leaf's key hash matches the prefix
155
- const leafMatchesPrefix = this.leafMatchesPrefix(node.keyHash, prefix);
156
- if (leafMatchesPrefix) {
157
- return [node.valueCid];
158
- }
159
- return [];
160
- }
161
- const internalNode = node;
162
- if (prefix[i]) {
163
- currentHash = internalNode.rightHash;
164
- }
165
- else {
166
- currentHash = internalNode.leftHash;
167
- }
168
- }
169
- // Collect all leaves in this subtree
170
- return this.collectLeaves(currentHash, prefix.length);
171
- }
172
- /**
173
- * Compute a local diff between this tree and another tree's state,
174
- * given access to the other tree instance.
175
- *
176
- * This is used for same-process diffing (e.g., in tests or local operations).
177
- * For remote diffing, the sync protocol exchanges subtree hashes via messages.
178
- */
179
- async diff(other) {
180
- const localRoot = await this.getRoot();
181
- const remoteRoot = await other.getRoot();
182
- if (hashEquals(localRoot, remoteRoot)) {
183
- return { onlyLocal: [], onlyRemote: [] };
184
- }
185
- const onlyLocal = [];
186
- const onlyRemote = [];
187
- await this.diffAtNode(localRoot, remoteRoot, 0, this, other, onlyLocal, onlyRemote);
188
- return { onlyLocal, onlyRemote };
189
- }
190
- // ─── Private methods ──────────────────────────────────────────────────────
191
- /**
192
- * Recursively insert a leaf into the tree, returning the new hash for the subtree at `depth`.
193
- */
194
- async insertAtNode(currentHash, keyHash, leafHash, leafNode, depth) {
195
- // Base case: reached the maximum depth
196
- if (depth >= SMT_DEPTH) {
197
- return leafHash;
198
- }
199
- // If the current subtree is empty (default hash at this depth), just return the leaf hash.
200
- // But we need to handle the case where the leaf might need to be pushed down further
201
- // because we're at an intermediate depth.
202
- if (hashEquals(currentHash, this.defaultHashes[depth])) {
203
- // Place the leaf here — the leaf implicitly represents its position via keyHash
204
- return leafHash;
205
- }
206
- // Load the node at currentHash
207
- const node = await this.store.getNode(currentHash);
208
- if (node === undefined) {
209
- // Shouldn't happen for a well-formed tree, but handle gracefully
210
- return leafHash;
211
- }
212
- if (node.type === 'leaf') {
213
- // There's an existing leaf at this position
214
- if (hashEquals(node.keyHash, keyHash)) {
215
- // Same key — replace the value. Delete old leaf node.
216
- await this.store.deleteNode(currentHash);
217
- return leafHash;
218
- }
219
- // Different key — need to push both leaves down until their paths diverge
220
- return this.splitLeaves(node, currentHash, leafNode, leafHash, depth);
221
- }
222
- // Internal node — recurse into the appropriate child
223
- const internalNode = node;
224
- const goRight = getBit(keyHash, depth);
225
- let newLeftHash;
226
- let newRightHash;
227
- if (goRight) {
228
- newLeftHash = internalNode.leftHash;
229
- newRightHash = await this.insertAtNode(internalNode.rightHash, keyHash, leafHash, leafNode, depth + 1);
230
- }
231
- else {
232
- newLeftHash = await this.insertAtNode(internalNode.leftHash, keyHash, leafHash, leafNode, depth + 1);
233
- newRightHash = internalNode.rightHash;
234
- }
235
- // Compute the new internal node hash
236
- const newHash = await hashChildren(newLeftHash, newRightHash);
237
- // Store the new internal node (if it differs from the old one)
238
- if (!hashEquals(newHash, currentHash)) {
239
- const newNode = {
240
- type: 'internal',
241
- leftHash: newLeftHash,
242
- rightHash: newRightHash,
243
- };
244
- await this.store.putNode(newHash, newNode);
245
- // Clean up old internal node
246
- await this.store.deleteNode(currentHash);
247
- }
248
- return newHash;
249
- }
250
- /**
251
- * When two leaves collide at the same position in the tree, push them down
252
- * until their key paths diverge, creating internal nodes along the way.
253
- *
254
- * For example, if two leaves share the first 3 bits but diverge at bit 3,
255
- * and we're currently at depth 0, we need to create internal nodes at depths
256
- * 0, 1, and 2 (where one child is the chain and the other is a default hash),
257
- * plus the divergence node at depth 3 where the two leaves split.
258
- */
259
- async splitLeaves(existingLeaf, existingLeafHash, newLeaf, newLeafHash, startDepth) {
260
- // Find the depth where the two keys diverge
261
- let divergeDepth = startDepth;
262
- while (divergeDepth < SMT_DEPTH && getBit(existingLeaf.keyHash, divergeDepth) === getBit(newLeaf.keyHash, divergeDepth)) {
263
- divergeDepth++;
264
- }
265
- if (divergeDepth >= SMT_DEPTH) {
266
- // Keys are identical (shouldn't happen with SHA-256 on different inputs)
267
- return newLeafHash;
268
- }
269
- // At the divergence depth, the bits differ — one goes left, the other goes right
270
- const existingGoesRight = getBit(existingLeaf.keyHash, divergeDepth);
271
- let leftHash;
272
- let rightHash;
273
- if (existingGoesRight) {
274
- leftHash = newLeafHash;
275
- rightHash = existingLeafHash;
276
- }
277
- else {
278
- leftHash = existingLeafHash;
279
- rightHash = newLeafHash;
280
- }
281
- // Create the divergence node
282
- let currentHash = await hashChildren(leftHash, rightHash);
283
- await this.store.putNode(currentHash, {
284
- type: 'internal',
285
- leftHash: leftHash,
286
- rightHash: rightHash,
287
- });
288
- // Build internal nodes back up from (divergeDepth - 1) to startDepth.
289
- // At each intermediate depth, one child is the chain (currentHash) and
290
- // the other is the default empty hash for that depth + 1.
291
- for (let d = divergeDepth - 1; d >= startDepth; d--) {
292
- const bit = getBit(existingLeaf.keyHash, d); // both keys share this bit
293
- const defaultChild = this.defaultHashes[d + 1];
294
- let newLeft;
295
- let newRight;
296
- if (bit) {
297
- newLeft = defaultChild;
298
- newRight = currentHash;
299
- }
300
- else {
301
- newLeft = currentHash;
302
- newRight = defaultChild;
303
- }
304
- currentHash = await hashChildren(newLeft, newRight);
305
- await this.store.putNode(currentHash, {
306
- type: 'internal',
307
- leftHash: newLeft,
308
- rightHash: newRight,
309
- });
310
- }
311
- return currentHash;
312
- }
313
- /**
314
- * Recursively delete a key from the tree, returning the new hash for the subtree at `depth`.
315
- */
316
- async deleteAtNode(currentHash, keyHash, depth) {
317
- if (depth >= SMT_DEPTH) {
318
- return this.defaultHashes[SMT_DEPTH];
319
- }
320
- // Empty subtree — nothing to delete
321
- if (hashEquals(currentHash, this.defaultHashes[depth])) {
322
- return currentHash;
323
- }
324
- const node = await this.store.getNode(currentHash);
325
- if (node === undefined) {
326
- return this.defaultHashes[depth];
327
- }
328
- if (node.type === 'leaf') {
329
- if (hashEquals(node.keyHash, keyHash)) {
330
- // Found the leaf to delete
331
- await this.store.deleteNode(currentHash);
332
- return this.defaultHashes[depth];
333
- }
334
- // Wrong leaf — key not in tree
335
- return currentHash;
336
- }
337
- // Internal node — recurse into the appropriate child
338
- const internalNode = node;
339
- const goRight = getBit(keyHash, depth);
340
- let newLeftHash;
341
- let newRightHash;
342
- if (goRight) {
343
- newLeftHash = internalNode.leftHash;
344
- newRightHash = await this.deleteAtNode(internalNode.rightHash, keyHash, depth + 1);
345
- }
346
- else {
347
- newLeftHash = await this.deleteAtNode(internalNode.leftHash, keyHash, depth + 1);
348
- newRightHash = internalNode.rightHash;
349
- }
350
- // If both children are now default (empty), this node becomes empty too
351
- if (hashEquals(newLeftHash, this.defaultHashes[depth + 1]) && hashEquals(newRightHash, this.defaultHashes[depth + 1])) {
352
- await this.store.deleteNode(currentHash);
353
- return this.defaultHashes[depth];
354
- }
355
- // If one child is default and the other is a leaf, collapse upward
356
- // (the internal node is unnecessary — just return the leaf hash directly)
357
- const leftIsDefault = hashEquals(newLeftHash, this.defaultHashes[depth + 1]);
358
- const rightIsDefault = hashEquals(newRightHash, this.defaultHashes[depth + 1]);
359
- if (leftIsDefault || rightIsDefault) {
360
- const survivingHash = leftIsDefault ? newRightHash : newLeftHash;
361
- const survivingNode = await this.store.getNode(survivingHash);
362
- if (survivingNode?.type === 'leaf') {
363
- // Collapse: remove the internal node, return the leaf hash directly
364
- await this.store.deleteNode(currentHash);
365
- return survivingHash;
366
- }
367
- }
368
- // Recompute internal node hash
369
- const newHash = await hashChildren(newLeftHash, newRightHash);
370
- if (!hashEquals(newHash, currentHash)) {
371
- const newNode = {
372
- type: 'internal',
373
- leftHash: newLeftHash,
374
- rightHash: newRightHash,
375
- };
376
- await this.store.putNode(newHash, newNode);
377
- await this.store.deleteNode(currentHash);
378
- }
379
- return newHash;
380
- }
381
- /**
382
- * Check if a key exists at the given node.
383
- */
384
- async existsAtNode(currentHash, keyHash, depth) {
385
- if (depth >= SMT_DEPTH) {
386
- return false;
387
- }
388
- if (hashEquals(currentHash, this.defaultHashes[depth])) {
389
- return false;
390
- }
391
- const node = await this.store.getNode(currentHash);
392
- if (node === undefined) {
393
- return false;
394
- }
395
- if (node.type === 'leaf') {
396
- return hashEquals(node.keyHash, keyHash);
397
- }
398
- const internalNode = node;
399
- const goRight = getBit(keyHash, depth);
400
- if (goRight) {
401
- return this.existsAtNode(internalNode.rightHash, keyHash, depth + 1);
402
- }
403
- else {
404
- return this.existsAtNode(internalNode.leftHash, keyHash, depth + 1);
405
- }
406
- }
407
- /**
408
- * Generate a proof for the given key at the given node.
409
- */
410
- async generateProof(currentHash, keyHash, depth) {
411
- if (depth >= SMT_DEPTH) {
412
- return { siblings: [], leafNode: undefined, depth };
413
- }
414
- if (hashEquals(currentHash, this.defaultHashes[depth])) {
415
- return { siblings: [], leafNode: undefined, depth };
416
- }
417
- const node = await this.store.getNode(currentHash);
418
- if (node === undefined) {
419
- return { siblings: [], leafNode: undefined, depth };
420
- }
421
- if (node.type === 'leaf') {
422
- return { siblings: [], leafNode: node, depth };
423
- }
424
- const internalNode = node;
425
- const goRight = getBit(keyHash, depth);
426
- let childHash;
427
- let siblingHash;
428
- if (goRight) {
429
- childHash = internalNode.rightHash;
430
- siblingHash = internalNode.leftHash;
431
- }
432
- else {
433
- childHash = internalNode.leftHash;
434
- siblingHash = internalNode.rightHash;
435
- }
436
- const childProof = await this.generateProof(childHash, keyHash, depth + 1);
437
- childProof.siblings.unshift(siblingHash);
438
- return childProof;
439
- }
440
- /**
441
- * Compute the subtree hash for a leaf that exists above the target prefix depth.
442
- * The leaf's effective position is determined by its keyHash bits.
443
- */
444
- async computeSubtreeHashForLeaf(leaf, currentDepth, prefix) {
445
- // Check if the leaf's key matches the remaining prefix bits
446
- for (let i = currentDepth; i < prefix.length; i++) {
447
- if (getBit(leaf.keyHash, i) !== prefix[i]) {
448
- // Leaf is not under this prefix
449
- return this.defaultHashes[prefix.length];
450
- }
451
- }
452
- // Leaf is under this prefix — recompute its hash
453
- return await hashLeaf(leaf.keyHash, leaf.valueCid);
454
- }
455
- /**
456
- * Check if a leaf's keyHash matches a given prefix.
457
- */
458
- leafMatchesPrefix(keyHash, prefix) {
459
- for (let i = 0; i < prefix.length; i++) {
460
- if (getBit(keyHash, i) !== prefix[i]) {
461
- return false;
462
- }
463
- }
464
- return true;
465
- }
466
- /**
467
- * Collect all leaf messageCids in the subtree rooted at the given hash.
468
- */
469
- async collectLeaves(nodeHash, depth) {
470
- if (depth >= SMT_DEPTH || hashEquals(nodeHash, this.defaultHashes[depth])) {
471
- return [];
472
- }
473
- const node = await this.store.getNode(nodeHash);
474
- if (node === undefined) {
475
- return [];
476
- }
477
- if (node.type === 'leaf') {
478
- return [node.valueCid];
479
- }
480
- const internalNode = node;
481
- const leftLeaves = await this.collectLeaves(internalNode.leftHash, depth + 1);
482
- const rightLeaves = await this.collectLeaves(internalNode.rightHash, depth + 1);
483
- return [...leftLeaves, ...rightLeaves];
484
- }
485
- /**
486
- * Recursively diff two subtrees, collecting leaves that exist only in one or the other.
487
- */
488
- async diffAtNode(localHash, remoteHash, depth, localTree, remoteTree, onlyLocal, onlyRemote) {
489
- // If hashes match, subtrees are identical — skip
490
- if (hashEquals(localHash, remoteHash)) {
491
- return;
492
- }
493
- // If we've reached max depth, something is wrong — bail out
494
- if (depth >= SMT_DEPTH) {
495
- return;
496
- }
497
- const localIsDefault = hashEquals(localHash, this.defaultHashes[depth]);
498
- const remoteIsDefault = hashEquals(remoteHash, this.defaultHashes[depth]);
499
- // If local is empty but remote is not, all remote leaves are "onlyRemote"
500
- if (localIsDefault && !remoteIsDefault) {
501
- const remoteLeaves = await remoteTree.collectLeaves(remoteHash, depth);
502
- onlyRemote.push(...remoteLeaves);
503
- return;
504
- }
505
- // If remote is empty but local is not, all local leaves are "onlyLocal"
506
- if (!localIsDefault && remoteIsDefault) {
507
- const localLeaves = await localTree.collectLeaves(localHash, depth);
508
- onlyLocal.push(...localLeaves);
509
- return;
510
- }
511
- // Both are non-default and non-equal — load nodes and recurse
512
- const localNode = await localTree.store.getNode(localHash);
513
- const remoteNode = await remoteTree.store.getNode(remoteHash);
514
- // Handle cases where one or both are leaves
515
- if (localNode?.type === 'leaf' && remoteNode?.type === 'leaf') {
516
- if (!hashEquals(localNode.keyHash, remoteNode.keyHash)) {
517
- // Different keys — both are unique to their respective trees
518
- onlyLocal.push(localNode.valueCid);
519
- onlyRemote.push(remoteNode.valueCid);
520
- }
521
- else if (localNode.valueCid !== remoteNode.valueCid) {
522
- // Same key, different value — treat as update
523
- onlyLocal.push(localNode.valueCid);
524
- onlyRemote.push(remoteNode.valueCid);
525
- }
526
- return;
527
- }
528
- // One is a leaf and the other is internal — expand the leaf side
529
- if (localNode?.type === 'leaf') {
530
- // Local is a single leaf; remote is a subtree
531
- // All remote leaves are potentially onlyRemote; check if the local leaf exists in remote
532
- const remoteLeaves = await remoteTree.collectLeaves(remoteHash, depth);
533
- const localCid = localNode.valueCid;
534
- const remoteSet = new Set(remoteLeaves);
535
- if (!remoteSet.has(localCid)) {
536
- onlyLocal.push(localCid);
537
- }
538
- for (const cid of remoteLeaves) {
539
- if (cid !== localCid) {
540
- onlyRemote.push(cid);
541
- }
542
- }
543
- return;
544
- }
545
- if (remoteNode?.type === 'leaf') {
546
- // Remote is a single leaf; local is a subtree
547
- const localLeaves = await localTree.collectLeaves(localHash, depth);
548
- const remoteCid = remoteNode.valueCid;
549
- const localSet = new Set(localLeaves);
550
- if (!localSet.has(remoteCid)) {
551
- onlyRemote.push(remoteCid);
552
- }
553
- for (const cid of localLeaves) {
554
- if (cid !== remoteCid) {
555
- onlyLocal.push(cid);
556
- }
557
- }
558
- return;
559
- }
560
- // Both are internal nodes — recurse into children
561
- if (localNode?.type === 'internal' && remoteNode?.type === 'internal') {
562
- await this.diffAtNode(localNode.leftHash, remoteNode.leftHash, depth + 1, localTree, remoteTree, onlyLocal, onlyRemote);
563
- await this.diffAtNode(localNode.rightHash, remoteNode.rightHash, depth + 1, localTree, remoteTree, onlyLocal, onlyRemote);
564
- return;
565
- }
566
- // Fallback: if a node is missing, collect all from the other side
567
- if (localNode === undefined) {
568
- const remoteLeaves = await remoteTree.collectLeaves(remoteHash, depth);
569
- onlyRemote.push(...remoteLeaves);
570
- }
571
- if (remoteNode === undefined) {
572
- const localLeaves = await localTree.collectLeaves(localHash, depth);
573
- onlyLocal.push(...localLeaves);
574
- }
575
- }
576
- }
577
- //# sourceMappingURL=sparse-merkle-tree.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sparse-merkle-tree.js","sourceRoot":"","sources":["../../../../src/smt/sparse-merkle-tree.ts"],"names":[],"mappings":"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"}