@enbox/dwn-sdk-js 0.0.6 → 0.0.7

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