@enbox/dwn-sdk-js 0.0.2 → 0.0.4

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 (601) hide show
  1. package/README.md +52 -301
  2. package/dist/bundles/dwn.js +19 -21
  3. package/dist/esm/generated/precompiled-validators.js +2764 -1773
  4. package/dist/esm/generated/precompiled-validators.js.map +1 -1
  5. package/dist/esm/src/core/dwn-error.js +27 -3
  6. package/dist/esm/src/core/dwn-error.js.map +1 -1
  7. package/dist/esm/src/core/message.js.map +1 -1
  8. package/dist/esm/src/core/messages-grant-authorization.js +17 -6
  9. package/dist/esm/src/core/messages-grant-authorization.js.map +1 -1
  10. package/dist/esm/src/core/protocol-authorization.js +245 -69
  11. package/dist/esm/src/core/protocol-authorization.js.map +1 -1
  12. package/dist/esm/src/core/resumable-task-manager.js +4 -4
  13. package/dist/esm/src/core/resumable-task-manager.js.map +1 -1
  14. package/dist/esm/src/dwn.js +10 -8
  15. package/dist/esm/src/dwn.js.map +1 -1
  16. package/dist/esm/src/enums/dwn-interface-method.js +4 -2
  17. package/dist/esm/src/enums/dwn-interface-method.js.map +1 -1
  18. package/dist/esm/src/event-stream/event-emitter-stream.js.map +1 -0
  19. package/dist/esm/src/handlers/messages-subscribe.js +1 -1
  20. package/dist/esm/src/handlers/messages-subscribe.js.map +1 -1
  21. package/dist/esm/src/handlers/messages-sync.js +116 -0
  22. package/dist/esm/src/handlers/messages-sync.js.map +1 -0
  23. package/dist/esm/src/handlers/protocols-configure.js +149 -16
  24. package/dist/esm/src/handlers/protocols-configure.js.map +1 -1
  25. package/dist/esm/src/handlers/protocols-query.js +2 -2
  26. package/dist/esm/src/handlers/protocols-query.js.map +1 -1
  27. package/dist/esm/src/handlers/records-count.js +143 -0
  28. package/dist/esm/src/handlers/records-count.js.map +1 -0
  29. package/dist/esm/src/handlers/records-query.js +4 -0
  30. package/dist/esm/src/handlers/records-query.js.map +1 -1
  31. package/dist/esm/src/handlers/records-read.js +4 -6
  32. package/dist/esm/src/handlers/records-read.js.map +1 -1
  33. package/dist/esm/src/handlers/records-write.js +17 -18
  34. package/dist/esm/src/handlers/records-write.js.map +1 -1
  35. package/dist/esm/src/index.js +9 -5
  36. package/dist/esm/src/index.js.map +1 -1
  37. package/dist/esm/src/interfaces/messages-read.js +2 -7
  38. package/dist/esm/src/interfaces/messages-read.js.map +1 -1
  39. package/dist/esm/src/interfaces/messages-subscribe.js +1 -0
  40. package/dist/esm/src/interfaces/messages-subscribe.js.map +1 -1
  41. package/dist/esm/src/interfaces/{messages-query.js → messages-sync.js} +11 -12
  42. package/dist/esm/src/interfaces/messages-sync.js.map +1 -0
  43. package/dist/esm/src/interfaces/protocols-configure.js +153 -30
  44. package/dist/esm/src/interfaces/protocols-configure.js.map +1 -1
  45. package/dist/esm/src/interfaces/protocols-query.js +1 -0
  46. package/dist/esm/src/interfaces/protocols-query.js.map +1 -1
  47. package/dist/esm/src/interfaces/records-count.js +91 -0
  48. package/dist/esm/src/interfaces/records-count.js.map +1 -0
  49. package/dist/esm/src/interfaces/records-read.js +15 -1
  50. package/dist/esm/src/interfaces/records-read.js.map +1 -1
  51. package/dist/esm/src/interfaces/records-write.js +64 -15
  52. package/dist/esm/src/interfaces/records-write.js.map +1 -1
  53. package/dist/esm/src/jose/algorithms/signing/ed25519.js.map +1 -1
  54. package/dist/esm/src/jose/algorithms/signing/signature-algorithms.js.map +1 -1
  55. package/dist/esm/src/jose/jws/general/builder.js.map +1 -1
  56. package/dist/esm/src/jose/jws/general/verifier.js.map +1 -1
  57. package/dist/esm/src/protocols/permission-grant.js +30 -0
  58. package/dist/esm/src/protocols/permission-grant.js.map +1 -1
  59. package/dist/esm/src/protocols/permission-request.js +24 -0
  60. package/dist/esm/src/protocols/permission-request.js.map +1 -1
  61. package/dist/esm/src/protocols/permissions.js +1 -1
  62. package/dist/esm/src/protocols/permissions.js.map +1 -1
  63. package/dist/esm/src/schema-validator.js +0 -1
  64. package/dist/esm/src/schema-validator.js.map +1 -1
  65. package/dist/esm/src/smt/smt-store-level.js +125 -0
  66. package/dist/esm/src/smt/smt-store-level.js.map +1 -0
  67. package/dist/esm/src/smt/smt-store-memory.js +67 -0
  68. package/dist/esm/src/smt/smt-store-memory.js.map +1 -0
  69. package/dist/esm/src/smt/smt-utils.js +146 -0
  70. package/dist/esm/src/smt/smt-utils.js.map +1 -0
  71. package/dist/esm/src/smt/sparse-merkle-tree.js +622 -0
  72. package/dist/esm/src/smt/sparse-merkle-tree.js.map +1 -0
  73. package/dist/esm/src/state-index/state-index-level.js +228 -0
  74. package/dist/esm/src/state-index/state-index-level.js.map +1 -0
  75. package/dist/esm/src/store/data-store-level.js +6 -6
  76. package/dist/esm/src/store/data-store-level.js.map +1 -1
  77. package/dist/esm/src/store/index-level.js +375 -17
  78. package/dist/esm/src/store/index-level.js.map +1 -1
  79. package/dist/esm/src/store/message-store-level.js +56 -0
  80. package/dist/esm/src/store/message-store-level.js.map +1 -1
  81. package/dist/esm/src/store/storage-controller.js +19 -16
  82. package/dist/esm/src/store/storage-controller.js.map +1 -1
  83. package/dist/esm/src/types/encryption-types.js +2 -0
  84. package/dist/esm/src/types/encryption-types.js.map +1 -0
  85. package/dist/esm/src/types/message-types.js.map +1 -1
  86. package/dist/esm/src/types/protocols-types.js +0 -2
  87. package/dist/esm/src/types/protocols-types.js.map +1 -1
  88. package/dist/esm/src/types/records-types.js +2 -0
  89. package/dist/esm/src/types/records-types.js.map +1 -1
  90. package/dist/esm/src/types/smt-types.js +5 -0
  91. package/dist/esm/src/types/smt-types.js.map +1 -0
  92. package/dist/esm/src/types/state-index.js +2 -0
  93. package/dist/esm/src/types/state-index.js.map +1 -0
  94. package/dist/esm/src/utils/cid.js +2 -1
  95. package/dist/esm/src/utils/cid.js.map +1 -1
  96. package/dist/esm/src/utils/data-stream.js +84 -29
  97. package/dist/esm/src/utils/data-stream.js.map +1 -1
  98. package/dist/esm/src/utils/encryption.js +22 -31
  99. package/dist/esm/src/utils/encryption.js.map +1 -1
  100. package/dist/esm/src/utils/hd-key.js +3 -3
  101. package/dist/esm/src/utils/hd-key.js.map +1 -1
  102. package/dist/esm/src/utils/jws.js +4 -4
  103. package/dist/esm/src/utils/jws.js.map +1 -1
  104. package/dist/esm/src/utils/private-key-signer.js +4 -3
  105. package/dist/esm/src/utils/private-key-signer.js.map +1 -1
  106. package/dist/esm/src/utils/protocols.js +82 -9
  107. package/dist/esm/src/utils/protocols.js.map +1 -1
  108. package/dist/esm/src/utils/records.js +82 -26
  109. package/dist/esm/src/utils/records.js.map +1 -1
  110. package/dist/esm/src/utils/secp256k1.js +4 -3
  111. package/dist/esm/src/utils/secp256k1.js.map +1 -1
  112. package/dist/esm/src/utils/secp256r1.js +3 -2
  113. package/dist/esm/src/utils/secp256r1.js.map +1 -1
  114. package/dist/esm/src/utils/time.js +1 -1
  115. package/dist/esm/src/utils/url.js +1 -1
  116. package/dist/esm/src/utils/url.js.map +1 -1
  117. package/dist/esm/tests/core/auth.spec.js +2 -2
  118. package/dist/esm/tests/core/auth.spec.js.map +1 -1
  119. package/dist/esm/tests/core/message-reply.spec.js +3 -3
  120. package/dist/esm/tests/core/message-reply.spec.js.map +1 -1
  121. package/dist/esm/tests/core/message.spec.js +13 -13
  122. package/dist/esm/tests/core/message.spec.js.map +1 -1
  123. package/dist/esm/tests/core/protocol-authorization.spec.js +3 -3
  124. package/dist/esm/tests/core/protocol-authorization.spec.js.map +1 -1
  125. package/dist/esm/tests/dwn.spec.js +27 -37
  126. package/dist/esm/tests/dwn.spec.js.map +1 -1
  127. package/dist/esm/tests/{event-log → event-stream}/event-emitter-stream.spec.js +14 -15
  128. package/dist/esm/tests/event-stream/event-emitter-stream.spec.js.map +1 -0
  129. package/dist/esm/tests/{event-log → event-stream}/event-stream.spec.js +13 -15
  130. package/dist/esm/tests/event-stream/event-stream.spec.js.map +1 -0
  131. package/dist/esm/tests/features/author-delegated-grant.spec.js +281 -135
  132. package/dist/esm/tests/features/author-delegated-grant.spec.js.map +1 -1
  133. package/dist/esm/tests/features/owner-delegated-grant.spec.js +57 -59
  134. package/dist/esm/tests/features/owner-delegated-grant.spec.js.map +1 -1
  135. package/dist/esm/tests/features/owner-signature.spec.js +32 -34
  136. package/dist/esm/tests/features/owner-signature.spec.js.map +1 -1
  137. package/dist/esm/tests/features/permissions.spec.js +73 -95
  138. package/dist/esm/tests/features/permissions.spec.js.map +1 -1
  139. package/dist/esm/tests/features/protocol-composition.spec.js +1645 -0
  140. package/dist/esm/tests/features/protocol-composition.spec.js.map +1 -0
  141. package/dist/esm/tests/features/protocol-create-action.spec.js +25 -27
  142. package/dist/esm/tests/features/protocol-create-action.spec.js.map +1 -1
  143. package/dist/esm/tests/features/protocol-delete-action.spec.js +42 -44
  144. package/dist/esm/tests/features/protocol-delete-action.spec.js.map +1 -1
  145. package/dist/esm/tests/features/protocol-update-action.spec.js +53 -55
  146. package/dist/esm/tests/features/protocol-update-action.spec.js.map +1 -1
  147. package/dist/esm/tests/features/records-prune.spec.js +126 -100
  148. package/dist/esm/tests/features/records-prune.spec.js.map +1 -1
  149. package/dist/esm/tests/features/records-tags.spec.js +272 -272
  150. package/dist/esm/tests/features/records-tags.spec.js.map +1 -1
  151. package/dist/esm/tests/features/resumable-tasks.spec.js +35 -37
  152. package/dist/esm/tests/features/resumable-tasks.spec.js.map +1 -1
  153. package/dist/esm/tests/handlers/messages-read.spec.js +112 -112
  154. package/dist/esm/tests/handlers/messages-read.spec.js.map +1 -1
  155. package/dist/esm/tests/handlers/messages-subscribe.spec.js +78 -76
  156. package/dist/esm/tests/handlers/messages-subscribe.spec.js.map +1 -1
  157. package/dist/esm/tests/handlers/messages-sync.spec.js +528 -0
  158. package/dist/esm/tests/handlers/messages-sync.spec.js.map +1 -0
  159. package/dist/esm/tests/handlers/protocols-configure.spec.js +545 -152
  160. package/dist/esm/tests/handlers/protocols-configure.spec.js.map +1 -1
  161. package/dist/esm/tests/handlers/protocols-query.spec.js +70 -72
  162. package/dist/esm/tests/handlers/protocols-query.spec.js.map +1 -1
  163. package/dist/esm/tests/handlers/records-count.spec.js +313 -0
  164. package/dist/esm/tests/handlers/records-count.spec.js.map +1 -0
  165. package/dist/esm/tests/handlers/records-delete.spec.js +106 -109
  166. package/dist/esm/tests/handlers/records-delete.spec.js.map +1 -1
  167. package/dist/esm/tests/handlers/records-query.spec.js +863 -463
  168. package/dist/esm/tests/handlers/records-query.spec.js.map +1 -1
  169. package/dist/esm/tests/handlers/records-read.spec.js +439 -209
  170. package/dist/esm/tests/handlers/records-read.spec.js.map +1 -1
  171. package/dist/esm/tests/handlers/records-subscribe.spec.js +292 -97
  172. package/dist/esm/tests/handlers/records-subscribe.spec.js.map +1 -1
  173. package/dist/esm/tests/handlers/records-write.spec.js +481 -483
  174. package/dist/esm/tests/handlers/records-write.spec.js.map +1 -1
  175. package/dist/esm/tests/interfaces/messages-get.spec.js +31 -11
  176. package/dist/esm/tests/interfaces/messages-get.spec.js.map +1 -1
  177. package/dist/esm/tests/interfaces/messages-subscribe.spec.js +5 -5
  178. package/dist/esm/tests/interfaces/messages-subscribe.spec.js.map +1 -1
  179. package/dist/esm/tests/interfaces/protocols-configure.spec.js +64 -134
  180. package/dist/esm/tests/interfaces/protocols-configure.spec.js.map +1 -1
  181. package/dist/esm/tests/interfaces/protocols-query.spec.js +4 -6
  182. package/dist/esm/tests/interfaces/protocols-query.spec.js.map +1 -1
  183. package/dist/esm/tests/interfaces/records-delete.spec.js +3 -5
  184. package/dist/esm/tests/interfaces/records-delete.spec.js.map +1 -1
  185. package/dist/esm/tests/interfaces/records-query.spec.js +9 -11
  186. package/dist/esm/tests/interfaces/records-query.spec.js.map +1 -1
  187. package/dist/esm/tests/interfaces/records-read.spec.js +76 -7
  188. package/dist/esm/tests/interfaces/records-read.spec.js.map +1 -1
  189. package/dist/esm/tests/interfaces/records-subscribe.spec.js +7 -9
  190. package/dist/esm/tests/interfaces/records-subscribe.spec.js.map +1 -1
  191. package/dist/esm/tests/interfaces/records-write.spec.js +244 -48
  192. package/dist/esm/tests/interfaces/records-write.spec.js.map +1 -1
  193. package/dist/esm/tests/jose/jws/general.spec.js +15 -18
  194. package/dist/esm/tests/jose/jws/general.spec.js.map +1 -1
  195. package/dist/esm/tests/protocols/permission-grant.spec.js +114 -0
  196. package/dist/esm/tests/protocols/permission-grant.spec.js.map +1 -0
  197. package/dist/esm/tests/protocols/permission-request.spec.js +43 -7
  198. package/dist/esm/tests/protocols/permission-request.spec.js.map +1 -1
  199. package/dist/esm/tests/protocols/permissions.spec.js +9 -11
  200. package/dist/esm/tests/protocols/permissions.spec.js.map +1 -1
  201. package/dist/esm/tests/scenarios/aggregator.spec.js +90 -92
  202. package/dist/esm/tests/scenarios/aggregator.spec.js.map +1 -1
  203. package/dist/esm/tests/scenarios/deleted-record.spec.js +17 -19
  204. package/dist/esm/tests/scenarios/deleted-record.spec.js.map +1 -1
  205. package/dist/esm/tests/scenarios/end-to-end-tests.spec.js +27 -29
  206. package/dist/esm/tests/scenarios/end-to-end-tests.spec.js.map +1 -1
  207. package/dist/esm/tests/scenarios/nested-roles.spec.js +37 -39
  208. package/dist/esm/tests/scenarios/nested-roles.spec.js.map +1 -1
  209. package/dist/esm/tests/scenarios/subscriptions.spec.js +163 -163
  210. package/dist/esm/tests/scenarios/subscriptions.spec.js.map +1 -1
  211. package/dist/esm/tests/smt/smt-store-level.spec.js +143 -0
  212. package/dist/esm/tests/smt/smt-store-level.spec.js.map +1 -0
  213. package/dist/esm/tests/smt/sparse-merkle-tree.spec.js +741 -0
  214. package/dist/esm/tests/smt/sparse-merkle-tree.spec.js.map +1 -0
  215. package/dist/esm/tests/state-index/state-index-level.spec.js +254 -0
  216. package/dist/esm/tests/state-index/state-index-level.spec.js.map +1 -0
  217. package/dist/esm/tests/store/blockstore-level.spec.js +136 -0
  218. package/dist/esm/tests/store/blockstore-level.spec.js.map +1 -0
  219. package/dist/esm/tests/store/blockstore-mock.spec.js +29 -28
  220. package/dist/esm/tests/store/blockstore-mock.spec.js.map +1 -1
  221. package/dist/esm/tests/store/data-store-level.spec.js +23 -25
  222. package/dist/esm/tests/store/data-store-level.spec.js.map +1 -1
  223. package/dist/esm/tests/store/index-level.spec.js +544 -194
  224. package/dist/esm/tests/store/index-level.spec.js.map +1 -1
  225. package/dist/esm/tests/store/message-store-level.spec.js +4 -4
  226. package/dist/esm/tests/store/message-store-level.spec.js.map +1 -1
  227. package/dist/esm/tests/store/message-store.spec.js +147 -73
  228. package/dist/esm/tests/store/message-store.spec.js.map +1 -1
  229. package/dist/esm/tests/store-dependent-tests.spec.js +1 -0
  230. package/dist/esm/tests/store-dependent-tests.spec.js.map +1 -1
  231. package/dist/esm/tests/test-stores.js +5 -5
  232. package/dist/esm/tests/test-stores.js.map +1 -1
  233. package/dist/esm/tests/test-suite.js +9 -8
  234. package/dist/esm/tests/test-suite.js.map +1 -1
  235. package/dist/esm/tests/utils/cid.spec.js +8 -11
  236. package/dist/esm/tests/utils/cid.spec.js.map +1 -1
  237. package/dist/esm/tests/utils/data-stream.spec.js +167 -13
  238. package/dist/esm/tests/utils/data-stream.spec.js.map +1 -1
  239. package/dist/esm/tests/utils/encryption-callbacks.spec.js +233 -0
  240. package/dist/esm/tests/utils/encryption-callbacks.spec.js.map +1 -0
  241. package/dist/esm/tests/utils/encryption.spec.js +34 -85
  242. package/dist/esm/tests/utils/encryption.spec.js.map +1 -1
  243. package/dist/esm/tests/utils/filters.spec.js +67 -69
  244. package/dist/esm/tests/utils/filters.spec.js.map +1 -1
  245. package/dist/esm/tests/utils/hd-key.spec.js +3 -3
  246. package/dist/esm/tests/utils/hd-key.spec.js.map +1 -1
  247. package/dist/esm/tests/utils/jws.spec.js +54 -3
  248. package/dist/esm/tests/utils/jws.spec.js.map +1 -1
  249. package/dist/esm/tests/utils/memory-cache.spec.js +6 -9
  250. package/dist/esm/tests/utils/memory-cache.spec.js.map +1 -1
  251. package/dist/esm/tests/utils/messages.spec.js +63 -29
  252. package/dist/esm/tests/utils/messages.spec.js.map +1 -1
  253. package/dist/esm/tests/utils/object.spec.js +3 -3
  254. package/dist/esm/tests/utils/object.spec.js.map +1 -1
  255. package/dist/esm/tests/utils/poller.js +1 -1
  256. package/dist/esm/tests/utils/poller.js.map +1 -1
  257. package/dist/esm/tests/utils/private-key-signer.spec.js +6 -6
  258. package/dist/esm/tests/utils/private-key-signer.spec.js.map +1 -1
  259. package/dist/esm/tests/utils/records.spec.js +37 -5
  260. package/dist/esm/tests/utils/records.spec.js.map +1 -1
  261. package/dist/esm/tests/utils/secp256k1.spec.js +7 -7
  262. package/dist/esm/tests/utils/secp256k1.spec.js.map +1 -1
  263. package/dist/esm/tests/utils/secp256r1.spec.js +7 -7
  264. package/dist/esm/tests/utils/secp256r1.spec.js.map +1 -1
  265. package/dist/esm/tests/utils/test-data-generator.js +47 -28
  266. package/dist/esm/tests/utils/test-data-generator.js.map +1 -1
  267. package/dist/esm/tests/utils/time.spec.js +7 -7
  268. package/dist/esm/tests/utils/time.spec.js.map +1 -1
  269. package/dist/esm/tests/utils/url.spec.js +25 -27
  270. package/dist/esm/tests/utils/url.spec.js.map +1 -1
  271. package/dist/esm/tests/validation/json-schemas/definitions.spec.js +4 -4
  272. package/dist/esm/tests/validation/json-schemas/definitions.spec.js.map +1 -1
  273. package/dist/esm/tests/validation/json-schemas/jwk/general-jwk.spec.js +15 -3
  274. package/dist/esm/tests/validation/json-schemas/jwk/general-jwk.spec.js.map +1 -1
  275. package/dist/esm/tests/validation/json-schemas/jwk/public-jwk.spec.js +8 -8
  276. package/dist/esm/tests/validation/json-schemas/jwk/public-jwk.spec.js.map +1 -1
  277. package/dist/esm/tests/validation/json-schemas/jwk-verification-method.spec.js +8 -18
  278. package/dist/esm/tests/validation/json-schemas/jwk-verification-method.spec.js.map +1 -1
  279. package/dist/esm/tests/validation/json-schemas/protocols/protocols-configure.spec.js +3 -3
  280. package/dist/esm/tests/validation/json-schemas/protocols/protocols-configure.spec.js.map +1 -1
  281. package/dist/esm/tests/validation/json-schemas/records/records-query.spec.js +9 -9
  282. package/dist/esm/tests/validation/json-schemas/records/records-query.spec.js.map +1 -1
  283. package/dist/esm/tests/validation/json-schemas/records/records-read.spec.js +106 -0
  284. package/dist/esm/tests/validation/json-schemas/records/records-read.spec.js.map +1 -0
  285. package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js +18 -18
  286. package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js.map +1 -1
  287. package/dist/esm/tests/vectors/protocol-definitions/email.json +1 -1
  288. package/dist/esm/tests/vectors/protocol-definitions/friend-role.json +2 -4
  289. package/dist/esm/tests/vectors/protocol-definitions/slack.json +2 -6
  290. package/dist/esm/tests/vectors/protocol-definitions/thread-role.json +2 -6
  291. package/dist/types/generated/precompiled-validators.d.ts +82 -64
  292. package/dist/types/generated/precompiled-validators.d.ts.map +1 -1
  293. package/dist/types/src/core/dwn-error.d.ts +27 -3
  294. package/dist/types/src/core/dwn-error.d.ts.map +1 -1
  295. package/dist/types/src/core/message-reply.d.ts +1 -1
  296. package/dist/types/src/core/message.d.ts +3 -3
  297. package/dist/types/src/core/message.d.ts.map +1 -1
  298. package/dist/types/src/core/messages-grant-authorization.d.ts +4 -4
  299. package/dist/types/src/core/messages-grant-authorization.d.ts.map +1 -1
  300. package/dist/types/src/core/protocol-authorization.d.ts +43 -2
  301. package/dist/types/src/core/protocol-authorization.d.ts.map +1 -1
  302. package/dist/types/src/core/records-grant-authorization.d.ts +2 -2
  303. package/dist/types/src/core/records-grant-authorization.d.ts.map +1 -1
  304. package/dist/types/src/core/resumable-task-manager.d.ts +1 -0
  305. package/dist/types/src/core/resumable-task-manager.d.ts.map +1 -1
  306. package/dist/types/src/dwn.d.ts +8 -8
  307. package/dist/types/src/dwn.d.ts.map +1 -1
  308. package/dist/types/src/enums/dwn-interface-method.d.ts +5 -3
  309. package/dist/types/src/enums/dwn-interface-method.d.ts.map +1 -1
  310. package/dist/types/src/event-stream/event-emitter-stream.d.ts.map +1 -0
  311. package/dist/types/src/handlers/messages-sync.d.ts +21 -0
  312. package/dist/types/src/handlers/messages-sync.d.ts.map +1 -0
  313. package/dist/types/src/handlers/protocols-configure.d.ts +24 -4
  314. package/dist/types/src/handlers/protocols-configure.d.ts.map +1 -1
  315. package/dist/types/src/handlers/protocols-query.d.ts.map +1 -1
  316. package/dist/types/src/handlers/records-count.d.ts +43 -0
  317. package/dist/types/src/handlers/records-count.d.ts.map +1 -0
  318. package/dist/types/src/handlers/records-query.d.ts.map +1 -1
  319. package/dist/types/src/handlers/records-read.d.ts.map +1 -1
  320. package/dist/types/src/handlers/records-write.d.ts +5 -5
  321. package/dist/types/src/handlers/records-write.d.ts.map +1 -1
  322. package/dist/types/src/index.d.ts +72 -37
  323. package/dist/types/src/index.d.ts.map +1 -1
  324. package/dist/types/src/interfaces/messages-read.d.ts +2 -2
  325. package/dist/types/src/interfaces/messages-read.d.ts.map +1 -1
  326. package/dist/types/src/interfaces/messages-subscribe.d.ts +2 -2
  327. package/dist/types/src/interfaces/messages-subscribe.d.ts.map +1 -1
  328. package/dist/types/src/interfaces/messages-sync.d.ts +16 -0
  329. package/dist/types/src/interfaces/messages-sync.d.ts.map +1 -0
  330. package/dist/types/src/interfaces/protocols-configure.d.ts +22 -2
  331. package/dist/types/src/interfaces/protocols-configure.d.ts.map +1 -1
  332. package/dist/types/src/interfaces/protocols-query.d.ts +2 -2
  333. package/dist/types/src/interfaces/protocols-query.d.ts.map +1 -1
  334. package/dist/types/src/interfaces/records-count.d.ts +27 -0
  335. package/dist/types/src/interfaces/records-count.d.ts.map +1 -0
  336. package/dist/types/src/interfaces/records-delete.d.ts +2 -2
  337. package/dist/types/src/interfaces/records-delete.d.ts.map +1 -1
  338. package/dist/types/src/interfaces/records-query.d.ts +2 -2
  339. package/dist/types/src/interfaces/records-query.d.ts.map +1 -1
  340. package/dist/types/src/interfaces/records-read.d.ts +4 -2
  341. package/dist/types/src/interfaces/records-read.d.ts.map +1 -1
  342. package/dist/types/src/interfaces/records-subscribe.d.ts +2 -2
  343. package/dist/types/src/interfaces/records-subscribe.d.ts.map +1 -1
  344. package/dist/types/src/interfaces/records-write.d.ts +37 -15
  345. package/dist/types/src/interfaces/records-write.d.ts.map +1 -1
  346. package/dist/types/src/jose/algorithms/signing/ed25519.d.ts.map +1 -1
  347. package/dist/types/src/jose/algorithms/signing/signature-algorithms.d.ts +5 -1
  348. package/dist/types/src/jose/algorithms/signing/signature-algorithms.d.ts.map +1 -1
  349. package/dist/types/src/jose/jws/general/builder.d.ts +3 -3
  350. package/dist/types/src/jose/jws/general/builder.d.ts.map +1 -1
  351. package/dist/types/src/protocols/permission-grant.d.ts +11 -0
  352. package/dist/types/src/protocols/permission-grant.d.ts.map +1 -1
  353. package/dist/types/src/protocols/permission-request.d.ts +11 -0
  354. package/dist/types/src/protocols/permission-request.d.ts.map +1 -1
  355. package/dist/types/src/protocols/permissions.d.ts +4 -4
  356. package/dist/types/src/protocols/permissions.d.ts.map +1 -1
  357. package/dist/types/src/schema-validator.d.ts +1 -1
  358. package/dist/types/src/schema-validator.d.ts.map +1 -1
  359. package/dist/types/src/smt/smt-store-level.d.ts +32 -0
  360. package/dist/types/src/smt/smt-store-level.d.ts.map +1 -0
  361. package/dist/types/src/smt/smt-store-memory.d.ts +22 -0
  362. package/dist/types/src/smt/smt-store-memory.d.ts.map +1 -0
  363. package/dist/types/src/smt/smt-utils.d.ts +58 -0
  364. package/dist/types/src/smt/smt-utils.d.ts.map +1 -0
  365. package/dist/types/src/smt/sparse-merkle-tree.d.ts +124 -0
  366. package/dist/types/src/smt/sparse-merkle-tree.d.ts.map +1 -0
  367. package/dist/types/src/state-index/state-index-level.d.ts +83 -0
  368. package/dist/types/src/state-index/state-index-level.d.ts.map +1 -0
  369. package/dist/types/src/store/data-store-level.d.ts +1 -2
  370. package/dist/types/src/store/data-store-level.d.ts.map +1 -1
  371. package/dist/types/src/store/index-level.d.ts +98 -2
  372. package/dist/types/src/store/index-level.d.ts.map +1 -1
  373. package/dist/types/src/store/level-wrapper.d.ts.map +1 -1
  374. package/dist/types/src/store/message-store-level.d.ts +5 -0
  375. package/dist/types/src/store/message-store-level.d.ts.map +1 -1
  376. package/dist/types/src/store/storage-controller.d.ts +7 -7
  377. package/dist/types/src/store/storage-controller.d.ts.map +1 -1
  378. package/dist/types/src/types/data-store.d.ts +2 -3
  379. package/dist/types/src/types/data-store.d.ts.map +1 -1
  380. package/dist/types/src/types/encryption-types.d.ts +48 -0
  381. package/dist/types/src/types/encryption-types.d.ts.map +1 -0
  382. package/dist/types/src/types/jose-types.d.ts +9 -40
  383. package/dist/types/src/types/jose-types.d.ts.map +1 -1
  384. package/dist/types/src/types/message-store.d.ts +5 -0
  385. package/dist/types/src/types/message-store.d.ts.map +1 -1
  386. package/dist/types/src/types/message-types.d.ts +19 -0
  387. package/dist/types/src/types/message-types.d.ts.map +1 -1
  388. package/dist/types/src/types/messages-types.d.ts +16 -11
  389. package/dist/types/src/types/messages-types.d.ts.map +1 -1
  390. package/dist/types/src/types/method-handler.d.ts +1 -2
  391. package/dist/types/src/types/method-handler.d.ts.map +1 -1
  392. package/dist/types/src/types/permission-types.d.ts +2 -2
  393. package/dist/types/src/types/permission-types.d.ts.map +1 -1
  394. package/dist/types/src/types/protocols-types.d.ts +49 -5
  395. package/dist/types/src/types/protocols-types.d.ts.map +1 -1
  396. package/dist/types/src/types/records-types.d.ts +23 -7
  397. package/dist/types/src/types/records-types.d.ts.map +1 -1
  398. package/dist/types/src/types/signer.d.ts +1 -1
  399. package/dist/types/src/types/signer.d.ts.map +1 -1
  400. package/dist/types/src/types/smt-types.d.ts +81 -0
  401. package/dist/types/src/types/smt-types.d.ts.map +1 -0
  402. package/dist/types/src/types/state-index.d.ts +90 -0
  403. package/dist/types/src/types/state-index.d.ts.map +1 -0
  404. package/dist/types/src/utils/cid.d.ts +1 -2
  405. package/dist/types/src/utils/cid.d.ts.map +1 -1
  406. package/dist/types/src/utils/data-stream.d.ts +14 -7
  407. package/dist/types/src/utils/data-stream.d.ts.map +1 -1
  408. package/dist/types/src/utils/encryption.d.ts +2 -3
  409. package/dist/types/src/utils/encryption.d.ts.map +1 -1
  410. package/dist/types/src/utils/hd-key.d.ts +4 -4
  411. package/dist/types/src/utils/hd-key.d.ts.map +1 -1
  412. package/dist/types/src/utils/jws.d.ts +7 -7
  413. package/dist/types/src/utils/jws.d.ts.map +1 -1
  414. package/dist/types/src/utils/private-key-signer.d.ts +4 -4
  415. package/dist/types/src/utils/private-key-signer.d.ts.map +1 -1
  416. package/dist/types/src/utils/protocols.d.ts +46 -3
  417. package/dist/types/src/utils/protocols.d.ts.map +1 -1
  418. package/dist/types/src/utils/records.d.ts +33 -6
  419. package/dist/types/src/utils/records.d.ts.map +1 -1
  420. package/dist/types/src/utils/secp256k1.d.ts +11 -11
  421. package/dist/types/src/utils/secp256k1.d.ts.map +1 -1
  422. package/dist/types/src/utils/secp256r1.d.ts +8 -8
  423. package/dist/types/src/utils/secp256r1.d.ts.map +1 -1
  424. package/dist/types/src/utils/time.d.ts +1 -1
  425. package/dist/types/tests/dwn.spec.d.ts.map +1 -1
  426. package/dist/types/tests/event-stream/event-emitter-stream.spec.d.ts.map +1 -0
  427. package/dist/types/tests/event-stream/event-stream.spec.d.ts.map +1 -0
  428. package/dist/types/tests/features/author-delegated-grant.spec.d.ts.map +1 -1
  429. package/dist/types/tests/features/owner-delegated-grant.spec.d.ts.map +1 -1
  430. package/dist/types/tests/features/owner-signature.spec.d.ts.map +1 -1
  431. package/dist/types/tests/features/permissions.spec.d.ts.map +1 -1
  432. package/dist/types/tests/features/protocol-composition.spec.d.ts +5 -0
  433. package/dist/types/tests/features/protocol-composition.spec.d.ts.map +1 -0
  434. package/dist/types/tests/features/protocol-create-action.spec.d.ts.map +1 -1
  435. package/dist/types/tests/features/protocol-delete-action.spec.d.ts.map +1 -1
  436. package/dist/types/tests/features/protocol-update-action.spec.d.ts.map +1 -1
  437. package/dist/types/tests/features/records-prune.spec.d.ts.map +1 -1
  438. package/dist/types/tests/features/records-tags.spec.d.ts.map +1 -1
  439. package/dist/types/tests/features/resumable-tasks.spec.d.ts.map +1 -1
  440. package/dist/types/tests/handlers/messages-read.spec.d.ts.map +1 -1
  441. package/dist/types/tests/handlers/messages-subscribe.spec.d.ts.map +1 -1
  442. package/dist/types/tests/handlers/messages-sync.spec.d.ts +2 -0
  443. package/dist/types/tests/handlers/messages-sync.spec.d.ts.map +1 -0
  444. package/dist/types/tests/handlers/protocols-configure.spec.d.ts.map +1 -1
  445. package/dist/types/tests/handlers/protocols-query.spec.d.ts.map +1 -1
  446. package/dist/types/tests/handlers/records-count.spec.d.ts +2 -0
  447. package/dist/types/tests/handlers/records-count.spec.d.ts.map +1 -0
  448. package/dist/types/tests/handlers/records-delete.spec.d.ts.map +1 -1
  449. package/dist/types/tests/handlers/records-query.spec.d.ts.map +1 -1
  450. package/dist/types/tests/handlers/records-read.spec.d.ts.map +1 -1
  451. package/dist/types/tests/handlers/records-subscribe.spec.d.ts.map +1 -1
  452. package/dist/types/tests/handlers/records-write.spec.d.ts.map +1 -1
  453. package/dist/types/tests/protocols/permission-grant.spec.d.ts +2 -0
  454. package/dist/types/tests/protocols/permission-grant.spec.d.ts.map +1 -0
  455. package/dist/types/tests/scenarios/deleted-record.spec.d.ts.map +1 -1
  456. package/dist/types/tests/scenarios/end-to-end-tests.spec.d.ts.map +1 -1
  457. package/dist/types/tests/scenarios/nested-roles.spec.d.ts.map +1 -1
  458. package/dist/types/tests/smt/smt-store-level.spec.d.ts +2 -0
  459. package/dist/types/tests/smt/smt-store-level.spec.d.ts.map +1 -0
  460. package/dist/types/tests/smt/sparse-merkle-tree.spec.d.ts +2 -0
  461. package/dist/types/tests/smt/sparse-merkle-tree.spec.d.ts.map +1 -0
  462. package/dist/types/tests/state-index/state-index-level.spec.d.ts +2 -0
  463. package/dist/types/tests/state-index/state-index-level.spec.d.ts.map +1 -0
  464. package/dist/types/tests/store/blockstore-level.spec.d.ts +2 -0
  465. package/dist/types/tests/store/blockstore-level.spec.d.ts.map +1 -0
  466. package/dist/types/tests/store/message-store.spec.d.ts.map +1 -1
  467. package/dist/types/tests/test-stores.d.ts +4 -4
  468. package/dist/types/tests/test-stores.d.ts.map +1 -1
  469. package/dist/types/tests/test-suite.d.ts +2 -2
  470. package/dist/types/tests/test-suite.d.ts.map +1 -1
  471. package/dist/types/tests/utils/encryption-callbacks.spec.d.ts +2 -0
  472. package/dist/types/tests/utils/encryption-callbacks.spec.d.ts.map +1 -0
  473. package/dist/types/tests/utils/test-data-generator.d.ts +31 -28
  474. package/dist/types/tests/utils/test-data-generator.d.ts.map +1 -1
  475. package/dist/types/tests/validation/json-schemas/records/records-read.spec.d.ts +2 -0
  476. package/dist/types/tests/validation/json-schemas/records/records-read.spec.d.ts.map +1 -0
  477. package/package.json +27 -46
  478. package/src/core/dwn-error.ts +27 -3
  479. package/src/core/message-reply.ts +1 -1
  480. package/src/core/message.ts +5 -5
  481. package/src/core/messages-grant-authorization.ts +22 -8
  482. package/src/core/protocol-authorization.ts +345 -68
  483. package/src/core/records-grant-authorization.ts +2 -2
  484. package/src/core/resumable-task-manager.ts +4 -5
  485. package/src/dwn.ts +25 -20
  486. package/src/enums/dwn-interface-method.ts +5 -3
  487. package/src/handlers/messages-subscribe.ts +1 -1
  488. package/src/handlers/messages-sync.ts +129 -0
  489. package/src/handlers/protocols-configure.ts +195 -17
  490. package/src/handlers/protocols-query.ts +7 -5
  491. package/src/handlers/records-count.ts +184 -0
  492. package/src/handlers/records-query.ts +4 -0
  493. package/src/handlers/records-read.ts +4 -8
  494. package/src/handlers/records-write.ts +20 -21
  495. package/src/index.ts +74 -37
  496. package/src/interfaces/messages-read.ts +6 -5
  497. package/src/interfaces/messages-subscribe.ts +7 -6
  498. package/src/interfaces/messages-sync.ts +59 -0
  499. package/src/interfaces/protocols-configure.ts +211 -33
  500. package/src/interfaces/protocols-query.ts +7 -6
  501. package/src/interfaces/records-count.ts +106 -0
  502. package/src/interfaces/records-delete.ts +2 -2
  503. package/src/interfaces/records-query.ts +2 -2
  504. package/src/interfaces/records-read.ts +26 -3
  505. package/src/interfaces/records-subscribe.ts +2 -2
  506. package/src/interfaces/records-write.ts +115 -46
  507. package/src/jose/algorithms/signing/ed25519.ts +13 -12
  508. package/src/jose/algorithms/signing/signature-algorithms.ts +6 -1
  509. package/src/jose/jws/general/builder.ts +3 -3
  510. package/src/jose/jws/general/verifier.ts +3 -3
  511. package/src/protocols/permission-grant.ts +51 -0
  512. package/src/protocols/permission-request.ts +37 -0
  513. package/src/protocols/permissions.ts +5 -5
  514. package/src/schema-validator.ts +11 -3
  515. package/src/smt/smt-store-level.ts +143 -0
  516. package/src/smt/smt-store-memory.ts +53 -0
  517. package/src/smt/smt-utils.ts +149 -0
  518. package/src/smt/sparse-merkle-tree.ts +698 -0
  519. package/src/state-index/state-index-level.ts +241 -0
  520. package/src/store/data-store-level.ts +8 -7
  521. package/src/store/index-level.ts +415 -19
  522. package/src/store/level-wrapper.ts +1 -1
  523. package/src/store/message-store-level.ts +62 -0
  524. package/src/store/storage-controller.ts +21 -19
  525. package/src/types/data-store.ts +2 -4
  526. package/src/types/encryption-types.ts +52 -0
  527. package/src/types/jose-types.ts +10 -42
  528. package/src/types/message-store.ts +11 -0
  529. package/src/types/message-types.ts +21 -0
  530. package/src/types/messages-types.ts +21 -15
  531. package/src/types/method-handler.ts +1 -2
  532. package/src/types/permission-types.ts +2 -2
  533. package/src/types/protocols-types.ts +55 -6
  534. package/src/types/records-types.ts +26 -7
  535. package/src/types/signer.ts +1 -1
  536. package/src/types/smt-types.ts +95 -0
  537. package/src/types/state-index.ts +100 -0
  538. package/src/utils/cid.ts +3 -4
  539. package/src/utils/data-stream.ts +75 -38
  540. package/src/utils/encryption.ts +24 -39
  541. package/src/utils/hd-key.ts +6 -6
  542. package/src/utils/jws.ts +9 -9
  543. package/src/utils/private-key-signer.ts +9 -8
  544. package/src/utils/protocols.ts +132 -6
  545. package/src/utils/records.ts +118 -29
  546. package/src/utils/secp256k1.ts +23 -21
  547. package/src/utils/secp256r1.ts +17 -15
  548. package/src/utils/time.ts +1 -1
  549. package/src/utils/url.ts +1 -1
  550. package/dist/cjs/index.js +0 -36749
  551. package/dist/cjs/package.json +0 -1
  552. package/dist/esm/src/event-log/event-emitter-stream.js.map +0 -1
  553. package/dist/esm/src/event-log/event-log-level.js +0 -63
  554. package/dist/esm/src/event-log/event-log-level.js.map +0 -1
  555. package/dist/esm/src/handlers/messages-query.js +0 -71
  556. package/dist/esm/src/handlers/messages-query.js.map +0 -1
  557. package/dist/esm/src/interfaces/messages-query.js.map +0 -1
  558. package/dist/esm/src/types/event-log.js +0 -2
  559. package/dist/esm/src/types/event-log.js.map +0 -1
  560. package/dist/esm/tests/event-log/event-emitter-stream.spec.js.map +0 -1
  561. package/dist/esm/tests/event-log/event-log-level.spec.js +0 -44
  562. package/dist/esm/tests/event-log/event-log-level.spec.js.map +0 -1
  563. package/dist/esm/tests/event-log/event-log.spec.js +0 -236
  564. package/dist/esm/tests/event-log/event-log.spec.js.map +0 -1
  565. package/dist/esm/tests/event-log/event-stream.spec.js.map +0 -1
  566. package/dist/esm/tests/handlers/messages-query.spec.js +0 -349
  567. package/dist/esm/tests/handlers/messages-query.spec.js.map +0 -1
  568. package/dist/esm/tests/interfaces/messagess-query.spec.js +0 -127
  569. package/dist/esm/tests/interfaces/messagess-query.spec.js.map +0 -1
  570. package/dist/esm/tests/scenarios/messages-query.spec.js +0 -395
  571. package/dist/esm/tests/scenarios/messages-query.spec.js.map +0 -1
  572. package/dist/types/src/event-log/event-emitter-stream.d.ts.map +0 -1
  573. package/dist/types/src/event-log/event-log-level.d.ts +0 -35
  574. package/dist/types/src/event-log/event-log-level.d.ts.map +0 -1
  575. package/dist/types/src/handlers/messages-query.d.ts +0 -17
  576. package/dist/types/src/handlers/messages-query.d.ts.map +0 -1
  577. package/dist/types/src/interfaces/messages-query.d.ts +0 -16
  578. package/dist/types/src/interfaces/messages-query.d.ts.map +0 -1
  579. package/dist/types/src/types/event-log.d.ts +0 -52
  580. package/dist/types/src/types/event-log.d.ts.map +0 -1
  581. package/dist/types/tests/event-log/event-emitter-stream.spec.d.ts.map +0 -1
  582. package/dist/types/tests/event-log/event-log-level.spec.d.ts +0 -2
  583. package/dist/types/tests/event-log/event-log-level.spec.d.ts.map +0 -1
  584. package/dist/types/tests/event-log/event-log.spec.d.ts +0 -2
  585. package/dist/types/tests/event-log/event-log.spec.d.ts.map +0 -1
  586. package/dist/types/tests/event-log/event-stream.spec.d.ts.map +0 -1
  587. package/dist/types/tests/handlers/messages-query.spec.d.ts +0 -2
  588. package/dist/types/tests/handlers/messages-query.spec.d.ts.map +0 -1
  589. package/dist/types/tests/interfaces/messagess-query.spec.d.ts +0 -2
  590. package/dist/types/tests/interfaces/messagess-query.spec.d.ts.map +0 -1
  591. package/dist/types/tests/scenarios/messages-query.spec.d.ts +0 -2
  592. package/dist/types/tests/scenarios/messages-query.spec.d.ts.map +0 -1
  593. package/src/event-log/event-log-level.ts +0 -72
  594. package/src/handlers/messages-query.ts +0 -67
  595. package/src/interfaces/messages-query.ts +0 -60
  596. package/src/types/event-log.ts +0 -52
  597. /package/dist/esm/src/{event-log → event-stream}/event-emitter-stream.js +0 -0
  598. /package/dist/types/src/{event-log → event-stream}/event-emitter-stream.d.ts +0 -0
  599. /package/dist/types/tests/{event-log → event-stream}/event-emitter-stream.spec.d.ts +0 -0
  600. /package/dist/types/tests/{event-log → event-stream}/event-stream.spec.d.ts +0 -0
  601. /package/src/{event-log → event-stream}/event-emitter-stream.ts +0 -0
@@ -0,0 +1,741 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { afterEach, beforeEach, describe, expect, it } from 'bun:test';
11
+ import { SMTStoreMemory } from '../../src/smt/smt-store-memory.js';
12
+ import { SparseMerkleTree } from '../../src/smt/sparse-merkle-tree.js';
13
+ import { getBit, getDefaultHashes, hashEquals, hashKey, hashLeaf, initDefaultHashes, resetDefaultHashesForTesting, SMT_DEPTH, ZERO_HASH } from '../../src/smt/smt-utils.js';
14
+ describe('SparseMerkleTree', () => {
15
+ let store;
16
+ let smt;
17
+ beforeEach(() => __awaiter(void 0, void 0, void 0, function* () {
18
+ store = new SMTStoreMemory();
19
+ smt = new SparseMerkleTree(store);
20
+ yield smt.initialize();
21
+ }));
22
+ afterEach(() => __awaiter(void 0, void 0, void 0, function* () {
23
+ yield smt.close();
24
+ }));
25
+ describe('initialization', () => {
26
+ it('should return the default empty root for a new tree', () => __awaiter(void 0, void 0, void 0, function* () {
27
+ const root = yield smt.getRoot();
28
+ const defaultHashes = yield initDefaultHashes();
29
+ expect(hashEquals(root, defaultHashes[0])).toBe(true);
30
+ }));
31
+ it('should precompute default hashes for all 256 levels + leaf level', () => __awaiter(void 0, void 0, void 0, function* () {
32
+ const defaultHashes = yield initDefaultHashes();
33
+ expect(defaultHashes.length).toBe(SMT_DEPTH + 1);
34
+ // Leaf level should be zero hash
35
+ expect(hashEquals(defaultHashes[SMT_DEPTH], ZERO_HASH)).toBe(true);
36
+ // Each level should be different from its neighbor
37
+ for (let i = 0; i < SMT_DEPTH; i++) {
38
+ expect(hashEquals(defaultHashes[i], defaultHashes[i + 1])).toBe(false);
39
+ }
40
+ }));
41
+ });
42
+ describe('insert', () => {
43
+ it('should change the root hash after inserting a single element', () => __awaiter(void 0, void 0, void 0, function* () {
44
+ const emptyRoot = yield smt.getRoot();
45
+ yield smt.insert('bafyreigtest1');
46
+ const newRoot = yield smt.getRoot();
47
+ expect(hashEquals(emptyRoot, newRoot)).toBe(false);
48
+ }));
49
+ it('should produce different roots for different values', () => __awaiter(void 0, void 0, void 0, function* () {
50
+ const storeA = new SMTStoreMemory();
51
+ const smtA = new SparseMerkleTree(storeA);
52
+ yield smtA.initialize();
53
+ const storeB = new SMTStoreMemory();
54
+ const smtB = new SparseMerkleTree(storeB);
55
+ yield smtB.initialize();
56
+ yield smtA.insert('bafyreigaaa');
57
+ yield smtB.insert('bafyreigbbb');
58
+ const rootA = yield smtA.getRoot();
59
+ const rootB = yield smtB.getRoot();
60
+ expect(hashEquals(rootA, rootB)).toBe(false);
61
+ yield smtA.close();
62
+ yield smtB.close();
63
+ }));
64
+ it('should produce the same root regardless of insertion order', () => __awaiter(void 0, void 0, void 0, function* () {
65
+ const cids = ['bafyreiA', 'bafyreiB', 'bafyreiC', 'bafyreiD', 'bafyreiE'];
66
+ // Insert in forward order
67
+ const storeA = new SMTStoreMemory();
68
+ const smtA = new SparseMerkleTree(storeA);
69
+ yield smtA.initialize();
70
+ for (const cid of cids) {
71
+ yield smtA.insert(cid);
72
+ }
73
+ // Insert in reverse order
74
+ const storeB = new SMTStoreMemory();
75
+ const smtB = new SparseMerkleTree(storeB);
76
+ yield smtB.initialize();
77
+ for (const cid of [...cids].reverse()) {
78
+ yield smtB.insert(cid);
79
+ }
80
+ const rootA = yield smtA.getRoot();
81
+ const rootB = yield smtB.getRoot();
82
+ expect(hashEquals(rootA, rootB)).toBe(true);
83
+ yield smtA.close();
84
+ yield smtB.close();
85
+ }));
86
+ it('should handle inserting many elements', () => __awaiter(void 0, void 0, void 0, function* () {
87
+ const cids = [];
88
+ for (let i = 0; i < 100; i++) {
89
+ cids.push(`bafyreig-test-${i.toString().padStart(4, '0')}`);
90
+ }
91
+ for (const cid of cids) {
92
+ yield smt.insert(cid);
93
+ }
94
+ // Verify all exist
95
+ for (const cid of cids) {
96
+ expect(yield smt.has(cid)).toBe(true);
97
+ }
98
+ }));
99
+ it('should handle re-inserting the same value (idempotent for same key)', () => __awaiter(void 0, void 0, void 0, function* () {
100
+ yield smt.insert('bafyreigtest1');
101
+ const rootAfterFirst = yield smt.getRoot();
102
+ yield smt.insert('bafyreigtest1');
103
+ const rootAfterSecond = yield smt.getRoot();
104
+ expect(hashEquals(rootAfterFirst, rootAfterSecond)).toBe(true);
105
+ }));
106
+ });
107
+ describe('has', () => {
108
+ it('should return false for an empty tree', () => __awaiter(void 0, void 0, void 0, function* () {
109
+ expect(yield smt.has('bafyreigtest1')).toBe(false);
110
+ }));
111
+ it('should return true for an inserted element', () => __awaiter(void 0, void 0, void 0, function* () {
112
+ yield smt.insert('bafyreigtest1');
113
+ expect(yield smt.has('bafyreigtest1')).toBe(true);
114
+ }));
115
+ it('should return false for an element not in the tree', () => __awaiter(void 0, void 0, void 0, function* () {
116
+ yield smt.insert('bafyreigtest1');
117
+ expect(yield smt.has('bafyreigtest2')).toBe(false);
118
+ }));
119
+ it('should return false after deletion', () => __awaiter(void 0, void 0, void 0, function* () {
120
+ yield smt.insert('bafyreigtest1');
121
+ expect(yield smt.has('bafyreigtest1')).toBe(true);
122
+ yield smt.delete('bafyreigtest1');
123
+ expect(yield smt.has('bafyreigtest1')).toBe(false);
124
+ }));
125
+ });
126
+ describe('delete', () => {
127
+ it('should return to empty root after inserting and deleting a single element', () => __awaiter(void 0, void 0, void 0, function* () {
128
+ const emptyRoot = yield smt.getRoot();
129
+ yield smt.insert('bafyreigtest1');
130
+ const nonEmptyRoot = yield smt.getRoot();
131
+ expect(hashEquals(emptyRoot, nonEmptyRoot)).toBe(false);
132
+ yield smt.delete('bafyreigtest1');
133
+ const rootAfterDelete = yield smt.getRoot();
134
+ expect(hashEquals(emptyRoot, rootAfterDelete)).toBe(true);
135
+ }));
136
+ it('should not change the root when deleting a non-existent element', () => __awaiter(void 0, void 0, void 0, function* () {
137
+ yield smt.insert('bafyreigtest1');
138
+ const rootBefore = yield smt.getRoot();
139
+ yield smt.delete('bafyreigtest2');
140
+ const rootAfter = yield smt.getRoot();
141
+ expect(hashEquals(rootBefore, rootAfter)).toBe(true);
142
+ }));
143
+ it('should produce the same root regardless of insert-delete order', () => __awaiter(void 0, void 0, void 0, function* () {
144
+ // Insert A, B, C then delete B
145
+ const storeA = new SMTStoreMemory();
146
+ const smtA = new SparseMerkleTree(storeA);
147
+ yield smtA.initialize();
148
+ yield smtA.insert('bafyreiA');
149
+ yield smtA.insert('bafyreiB');
150
+ yield smtA.insert('bafyreiC');
151
+ yield smtA.delete('bafyreiB');
152
+ // Insert A, C only (never insert B)
153
+ const storeB = new SMTStoreMemory();
154
+ const smtB = new SparseMerkleTree(storeB);
155
+ yield smtB.initialize();
156
+ yield smtB.insert('bafyreiA');
157
+ yield smtB.insert('bafyreiC');
158
+ const rootA = yield smtA.getRoot();
159
+ const rootB = yield smtB.getRoot();
160
+ expect(hashEquals(rootA, rootB)).toBe(true);
161
+ yield smtA.close();
162
+ yield smtB.close();
163
+ }));
164
+ it('should handle deleting all elements to return to empty state', () => __awaiter(void 0, void 0, void 0, function* () {
165
+ const emptyRoot = yield smt.getRoot();
166
+ const cids = ['bafyreiA', 'bafyreiB', 'bafyreiC'];
167
+ for (const cid of cids) {
168
+ yield smt.insert(cid);
169
+ }
170
+ for (const cid of cids) {
171
+ yield smt.delete(cid);
172
+ }
173
+ const rootAfter = yield smt.getRoot();
174
+ expect(hashEquals(emptyRoot, rootAfter)).toBe(true);
175
+ }));
176
+ it('should handle interleaved inserts and deletes', () => __awaiter(void 0, void 0, void 0, function* () {
177
+ yield smt.insert('bafyreiA');
178
+ yield smt.insert('bafyreiB');
179
+ yield smt.delete('bafyreiA');
180
+ yield smt.insert('bafyreiC');
181
+ yield smt.delete('bafyreiB');
182
+ yield smt.insert('bafyreiD');
183
+ // Should have C and D
184
+ expect(yield smt.has('bafyreiA')).toBe(false);
185
+ expect(yield smt.has('bafyreiB')).toBe(false);
186
+ expect(yield smt.has('bafyreiC')).toBe(true);
187
+ expect(yield smt.has('bafyreiD')).toBe(true);
188
+ }));
189
+ });
190
+ describe('proof', () => {
191
+ it('should generate a proof for an existing element (inclusion)', () => __awaiter(void 0, void 0, void 0, function* () {
192
+ yield smt.insert('bafyreigtest1');
193
+ const proof = yield smt.getProof('bafyreigtest1');
194
+ expect(proof.leafNode).toBeDefined();
195
+ expect(proof.leafNode.valueCid).toBe('bafyreigtest1');
196
+ expect(proof.leafNode.type).toBe('leaf');
197
+ }));
198
+ it('should generate a proof for a non-existent element (non-inclusion)', () => __awaiter(void 0, void 0, void 0, function* () {
199
+ yield smt.insert('bafyreigtest1');
200
+ const proof = yield smt.getProof('bafyreigtest2');
201
+ // Either the leaf is undefined (empty slot) or it's a different key
202
+ if (proof.leafNode !== undefined) {
203
+ // The proof terminates at a leaf with a different key
204
+ const expectedKeyHash = yield hashKey('bafyreigtest2');
205
+ expect(hashEquals(proof.leafNode.keyHash, expectedKeyHash)).toBe(false);
206
+ }
207
+ }));
208
+ it('should generate an empty proof for an empty tree', () => __awaiter(void 0, void 0, void 0, function* () {
209
+ const proof = yield smt.getProof('bafyreigtest1');
210
+ expect(proof.leafNode).toBeUndefined();
211
+ expect(proof.siblings.length).toBe(0);
212
+ }));
213
+ });
214
+ describe('getSubtreeHash', () => {
215
+ it('should return default hash for empty subtree', () => __awaiter(void 0, void 0, void 0, function* () {
216
+ const defaultHashes = yield initDefaultHashes();
217
+ const subtreeHash = yield smt.getSubtreeHash([false]); // left child of root
218
+ expect(hashEquals(subtreeHash, defaultHashes[1])).toBe(true);
219
+ }));
220
+ it('should return different hashes for subtrees with different contents', () => __awaiter(void 0, void 0, void 0, function* () {
221
+ yield smt.insert('bafyreigtest1');
222
+ yield smt.insert('bafyreigtest2');
223
+ const leftHash = yield smt.getSubtreeHash([false]);
224
+ const rightHash = yield smt.getSubtreeHash([true]);
225
+ // At least one should be non-default (elements distributed by hash)
226
+ const defaultHashes = yield initDefaultHashes();
227
+ const leftIsDefault = hashEquals(leftHash, defaultHashes[1]);
228
+ const rightIsDefault = hashEquals(rightHash, defaultHashes[1]);
229
+ expect(leftIsDefault && rightIsDefault).toBe(false);
230
+ }));
231
+ });
232
+ describe('getLeaves', () => {
233
+ it('should return empty array for empty tree', () => __awaiter(void 0, void 0, void 0, function* () {
234
+ const leaves = yield smt.getLeaves([]);
235
+ expect(leaves).toEqual([]);
236
+ }));
237
+ it('should return all leaves for empty prefix', () => __awaiter(void 0, void 0, void 0, function* () {
238
+ const cids = ['bafyreiA', 'bafyreiB', 'bafyreiC'];
239
+ for (const cid of cids) {
240
+ yield smt.insert(cid);
241
+ }
242
+ const leaves = yield smt.getLeaves([]);
243
+ expect(leaves.sort()).toEqual([...cids].sort());
244
+ }));
245
+ it('should return only leaves under the specified prefix', () => __awaiter(void 0, void 0, void 0, function* () {
246
+ // Insert multiple elements and verify prefix filtering works
247
+ const cids = [];
248
+ for (let i = 0; i < 20; i++) {
249
+ cids.push(`bafyreig-prefix-test-${i}`);
250
+ }
251
+ for (const cid of cids) {
252
+ yield smt.insert(cid);
253
+ }
254
+ // Get leaves under left and right subtrees
255
+ const leftLeaves = yield smt.getLeaves([false]);
256
+ const rightLeaves = yield smt.getLeaves([true]);
257
+ // Together they should contain all CIDs
258
+ const allLeaves = [...leftLeaves, ...rightLeaves].sort();
259
+ expect(allLeaves).toEqual([...cids].sort());
260
+ // Neither should be empty (with 20 random-ish hashes, both sides should have elements)
261
+ // (This is probabilistic but 20 elements should reliably split)
262
+ expect(leftLeaves.length).toBeGreaterThan(0);
263
+ expect(rightLeaves.length).toBeGreaterThan(0);
264
+ }));
265
+ });
266
+ describe('diff', () => {
267
+ it('should return empty diff for identical trees', () => __awaiter(void 0, void 0, void 0, function* () {
268
+ const storeB = new SMTStoreMemory();
269
+ const smtB = new SparseMerkleTree(storeB);
270
+ yield smtB.initialize();
271
+ const cids = ['bafyreiA', 'bafyreiB', 'bafyreiC'];
272
+ for (const cid of cids) {
273
+ yield smt.insert(cid);
274
+ yield smtB.insert(cid);
275
+ }
276
+ const diff = yield smt.diff(smtB);
277
+ expect(diff.onlyLocal).toEqual([]);
278
+ expect(diff.onlyRemote).toEqual([]);
279
+ yield smtB.close();
280
+ }));
281
+ it('should return empty diff for two empty trees', () => __awaiter(void 0, void 0, void 0, function* () {
282
+ const storeB = new SMTStoreMemory();
283
+ const smtB = new SparseMerkleTree(storeB);
284
+ yield smtB.initialize();
285
+ const diff = yield smt.diff(smtB);
286
+ expect(diff.onlyLocal).toEqual([]);
287
+ expect(diff.onlyRemote).toEqual([]);
288
+ yield smtB.close();
289
+ }));
290
+ it('should detect elements only in the local tree', () => __awaiter(void 0, void 0, void 0, function* () {
291
+ const storeB = new SMTStoreMemory();
292
+ const smtB = new SparseMerkleTree(storeB);
293
+ yield smtB.initialize();
294
+ yield smt.insert('bafyreiA');
295
+ yield smt.insert('bafyreiB');
296
+ yield smtB.insert('bafyreiA');
297
+ const diff = yield smt.diff(smtB);
298
+ expect(diff.onlyLocal.sort()).toEqual(['bafyreiB']);
299
+ expect(diff.onlyRemote).toEqual([]);
300
+ yield smtB.close();
301
+ }));
302
+ it('should detect elements only in the remote tree', () => __awaiter(void 0, void 0, void 0, function* () {
303
+ const storeB = new SMTStoreMemory();
304
+ const smtB = new SparseMerkleTree(storeB);
305
+ yield smtB.initialize();
306
+ yield smt.insert('bafyreiA');
307
+ yield smtB.insert('bafyreiA');
308
+ yield smtB.insert('bafyreiB');
309
+ const diff = yield smt.diff(smtB);
310
+ expect(diff.onlyLocal).toEqual([]);
311
+ expect(diff.onlyRemote.sort()).toEqual(['bafyreiB']);
312
+ yield smtB.close();
313
+ }));
314
+ it('should detect elements unique to each tree', () => __awaiter(void 0, void 0, void 0, function* () {
315
+ const storeB = new SMTStoreMemory();
316
+ const smtB = new SparseMerkleTree(storeB);
317
+ yield smtB.initialize();
318
+ // Shared
319
+ yield smt.insert('bafyreiShared1');
320
+ yield smtB.insert('bafyreiShared1');
321
+ yield smt.insert('bafyreiShared2');
322
+ yield smtB.insert('bafyreiShared2');
323
+ // Only local
324
+ yield smt.insert('bafyreiLocalOnly1');
325
+ yield smt.insert('bafyreiLocalOnly2');
326
+ // Only remote
327
+ yield smtB.insert('bafyreiRemoteOnly1');
328
+ yield smtB.insert('bafyreiRemoteOnly2');
329
+ yield smtB.insert('bafyreiRemoteOnly3');
330
+ const diff = yield smt.diff(smtB);
331
+ expect(diff.onlyLocal.sort()).toEqual(['bafyreiLocalOnly1', 'bafyreiLocalOnly2'].sort());
332
+ expect(diff.onlyRemote.sort()).toEqual(['bafyreiRemoteOnly1', 'bafyreiRemoteOnly2', 'bafyreiRemoteOnly3'].sort());
333
+ yield smtB.close();
334
+ }));
335
+ it('should detect all differences when trees are completely disjoint', () => __awaiter(void 0, void 0, void 0, function* () {
336
+ const storeB = new SMTStoreMemory();
337
+ const smtB = new SparseMerkleTree(storeB);
338
+ yield smtB.initialize();
339
+ yield smt.insert('bafyreiA');
340
+ yield smt.insert('bafyreiB');
341
+ yield smtB.insert('bafyreiC');
342
+ yield smtB.insert('bafyreiD');
343
+ const diff = yield smt.diff(smtB);
344
+ expect(diff.onlyLocal.sort()).toEqual(['bafyreiA', 'bafyreiB'].sort());
345
+ expect(diff.onlyRemote.sort()).toEqual(['bafyreiC', 'bafyreiD'].sort());
346
+ yield smtB.close();
347
+ }));
348
+ it('should detect differences in larger trees efficiently', () => __awaiter(void 0, void 0, void 0, function* () {
349
+ const storeB = new SMTStoreMemory();
350
+ const smtB = new SparseMerkleTree(storeB);
351
+ yield smtB.initialize();
352
+ // Both trees share 50 elements
353
+ for (let i = 0; i < 50; i++) {
354
+ const cid = `bafyreig-shared-${i.toString().padStart(3, '0')}`;
355
+ yield smt.insert(cid);
356
+ yield smtB.insert(cid);
357
+ }
358
+ // Local has 5 unique elements
359
+ const localOnly = [];
360
+ for (let i = 0; i < 5; i++) {
361
+ const cid = `bafyreig-local-${i}`;
362
+ yield smt.insert(cid);
363
+ localOnly.push(cid);
364
+ }
365
+ // Remote has 3 unique elements
366
+ const remoteOnly = [];
367
+ for (let i = 0; i < 3; i++) {
368
+ const cid = `bafyreig-remote-${i}`;
369
+ yield smtB.insert(cid);
370
+ remoteOnly.push(cid);
371
+ }
372
+ const diff = yield smt.diff(smtB);
373
+ expect(diff.onlyLocal.sort()).toEqual(localOnly.sort());
374
+ expect(diff.onlyRemote.sort()).toEqual(remoteOnly.sort());
375
+ yield smtB.close();
376
+ }));
377
+ it('should handle diff where local tree is empty', () => __awaiter(void 0, void 0, void 0, function* () {
378
+ const storeB = new SMTStoreMemory();
379
+ const smtB = new SparseMerkleTree(storeB);
380
+ yield smtB.initialize();
381
+ yield smtB.insert('bafyreiA');
382
+ yield smtB.insert('bafyreiB');
383
+ const diff = yield smt.diff(smtB);
384
+ expect(diff.onlyLocal).toEqual([]);
385
+ expect(diff.onlyRemote.sort()).toEqual(['bafyreiA', 'bafyreiB'].sort());
386
+ yield smtB.close();
387
+ }));
388
+ it('should handle diff where remote tree is empty', () => __awaiter(void 0, void 0, void 0, function* () {
389
+ const storeB = new SMTStoreMemory();
390
+ const smtB = new SparseMerkleTree(storeB);
391
+ yield smtB.initialize();
392
+ yield smt.insert('bafyreiA');
393
+ yield smt.insert('bafyreiB');
394
+ const diff = yield smt.diff(smtB);
395
+ expect(diff.onlyLocal.sort()).toEqual(['bafyreiA', 'bafyreiB'].sort());
396
+ expect(diff.onlyRemote).toEqual([]);
397
+ yield smtB.close();
398
+ }));
399
+ });
400
+ describe('clear', () => {
401
+ it('should reset the tree to empty state', () => __awaiter(void 0, void 0, void 0, function* () {
402
+ const emptyRoot = yield smt.getRoot();
403
+ yield smt.insert('bafyreiA');
404
+ yield smt.insert('bafyreiB');
405
+ yield smt.clear();
406
+ const rootAfterClear = yield smt.getRoot();
407
+ expect(hashEquals(emptyRoot, rootAfterClear)).toBe(true);
408
+ expect(yield smt.has('bafyreiA')).toBe(false);
409
+ expect(yield smt.has('bafyreiB')).toBe(false);
410
+ }));
411
+ });
412
+ describe('getSubtreeHash with leaf at shallow depth', () => {
413
+ it('should return leaf hash when leaf matches the prefix', () => __awaiter(void 0, void 0, void 0, function* () {
414
+ // Insert a single element — the tree stores it as a leaf near the root
415
+ yield smt.insert('bafyreiA');
416
+ const keyHash = yield hashKey('bafyreiA');
417
+ // Build a deep prefix that follows the leaf's keyHash bits
418
+ const matchingPrefix = [];
419
+ for (let i = 0; i < 8; i++) {
420
+ matchingPrefix.push(getBit(keyHash, i));
421
+ }
422
+ const subtreeHash = yield smt.getSubtreeHash(matchingPrefix);
423
+ // Should be the leaf hash (non-default) since the leaf is under this prefix
424
+ const expectedLeafHash = yield hashLeaf(keyHash, 'bafyreiA');
425
+ expect(hashEquals(subtreeHash, expectedLeafHash)).toBe(true);
426
+ }));
427
+ it('should return default hash when leaf does not match the prefix', () => __awaiter(void 0, void 0, void 0, function* () {
428
+ yield smt.insert('bafyreiA');
429
+ const keyHash = yield hashKey('bafyreiA');
430
+ const defaultHashes = yield initDefaultHashes();
431
+ // Build a prefix that diverges from the leaf's keyHash at bit 0
432
+ const firstBit = getBit(keyHash, 0);
433
+ const nonMatchingPrefix = [!firstBit]; // opposite of the first bit
434
+ const subtreeHash = yield smt.getSubtreeHash(nonMatchingPrefix);
435
+ expect(hashEquals(subtreeHash, defaultHashes[1])).toBe(true);
436
+ }));
437
+ });
438
+ describe('getLeaves with leaf at shallow depth', () => {
439
+ it('should return the leaf CID when leaf matches the prefix', () => __awaiter(void 0, void 0, void 0, function* () {
440
+ yield smt.insert('bafyreiA');
441
+ const keyHash = yield hashKey('bafyreiA');
442
+ // Build a prefix that matches the leaf's keyHash bits
443
+ const matchingPrefix = [];
444
+ for (let i = 0; i < 4; i++) {
445
+ matchingPrefix.push(getBit(keyHash, i));
446
+ }
447
+ const leaves = yield smt.getLeaves(matchingPrefix);
448
+ expect(leaves).toEqual(['bafyreiA']);
449
+ }));
450
+ it('should return empty when leaf does not match the prefix', () => __awaiter(void 0, void 0, void 0, function* () {
451
+ yield smt.insert('bafyreiA');
452
+ const keyHash = yield hashKey('bafyreiA');
453
+ // Build a prefix that diverges from the leaf's keyHash
454
+ const firstBit = getBit(keyHash, 0);
455
+ const nonMatchingPrefix = [!firstBit];
456
+ const leaves = yield smt.getLeaves(nonMatchingPrefix);
457
+ expect(leaves).toEqual([]);
458
+ }));
459
+ });
460
+ describe('proof', () => {
461
+ it('should generate a multi-level proof with sibling hashes', () => __awaiter(void 0, void 0, void 0, function* () {
462
+ // Insert two elements so the tree has internal nodes
463
+ yield smt.insert('bafyreiA');
464
+ yield smt.insert('bafyreiB');
465
+ const proof = yield smt.getProof('bafyreiA');
466
+ expect(proof.leafNode).toBeDefined();
467
+ expect(proof.leafNode.valueCid).toBe('bafyreiA');
468
+ // With two elements, there should be at least one sibling hash
469
+ expect(proof.siblings.length).toBeGreaterThan(0);
470
+ }));
471
+ it('should return empty proof when store node is missing (corrupted store)', () => __awaiter(void 0, void 0, void 0, function* () {
472
+ // Test lines 503-505 of sparse-merkle-tree.ts: getNode returns undefined
473
+ const realStore = new SMTStoreMemory();
474
+ let corruptDuringProof = false;
475
+ const corruptStore = {
476
+ open: () => realStore.open(),
477
+ close: () => realStore.close(),
478
+ clear: () => realStore.clear(),
479
+ getRoot: () => realStore.getRoot(),
480
+ setRoot: (hash) => realStore.setRoot(hash),
481
+ putNode: (hash, node) => realStore.putNode(hash, node),
482
+ deleteNode: (hash) => realStore.deleteNode(hash),
483
+ getNode: (hash) => __awaiter(void 0, void 0, void 0, function* () {
484
+ if (corruptDuringProof) {
485
+ return undefined;
486
+ }
487
+ return realStore.getNode(hash);
488
+ }),
489
+ };
490
+ const corruptSmt = new SparseMerkleTree(corruptStore);
491
+ yield corruptSmt.initialize();
492
+ yield corruptSmt.insert('bafyreiProofCorrupt');
493
+ // Now corrupt the store so getNode returns undefined during proof generation
494
+ corruptDuringProof = true;
495
+ const proof = yield corruptSmt.getProof('bafyreiProofCorrupt');
496
+ // Should return a proof without a leaf node since the node is missing
497
+ expect(proof.leafNode).toBeUndefined();
498
+ expect(proof.siblings).toHaveLength(0);
499
+ corruptDuringProof = false;
500
+ yield corruptSmt.close();
501
+ }));
502
+ });
503
+ describe('diff edge cases', () => {
504
+ it('should detect local leaf not present in remote subtree', () => __awaiter(void 0, void 0, void 0, function* () {
505
+ // We need a scenario where local has a single leaf at a node while remote
506
+ // has an internal subtree at the same position, and the local leaf is NOT
507
+ // in the remote set. This happens when:
508
+ // - Remote has 2+ elements that share a prefix
509
+ // - Local has 1 element with the same prefix but a different CID
510
+ const storeB = new SMTStoreMemory();
511
+ const smtB = new SparseMerkleTree(storeB);
512
+ yield smtB.initialize();
513
+ // Insert many elements into both trees so they develop deep structure
514
+ const sharedCids = [];
515
+ for (let i = 0; i < 30; i++) {
516
+ const cid = `bafyreig-shared-${i}`;
517
+ sharedCids.push(cid);
518
+ yield smt.insert(cid);
519
+ yield smtB.insert(cid);
520
+ }
521
+ // Add unique elements to each side
522
+ const localOnly = 'bafyreig-local-unique-42';
523
+ yield smt.insert(localOnly);
524
+ const remoteOnly = 'bafyreig-remote-unique-99';
525
+ yield smtB.insert(remoteOnly);
526
+ const diff = yield smt.diff(smtB);
527
+ expect(diff.onlyLocal).toContain(localOnly);
528
+ expect(diff.onlyRemote).toContain(remoteOnly);
529
+ yield smtB.close();
530
+ }));
531
+ it('should detect both-are-leaves diff when each tree has one unique element', () => __awaiter(void 0, void 0, void 0, function* () {
532
+ // When each tree has exactly one element, the root IS a leaf hash.
533
+ // diffAtNode at depth 0 encounters two leaf nodes → hits lines 632-643.
534
+ const storeB = new SMTStoreMemory();
535
+ const smtB = new SparseMerkleTree(storeB);
536
+ yield smtB.initialize();
537
+ // Each tree has exactly one unique element (different keys → line 633-636)
538
+ yield smt.insert('bafyreiOnlyInLocal');
539
+ yield smtB.insert('bafyreiOnlyInRemote');
540
+ const diff = yield smt.diff(smtB);
541
+ expect(diff.onlyLocal).toEqual(['bafyreiOnlyInLocal']);
542
+ expect(diff.onlyRemote).toEqual(['bafyreiOnlyInRemote']);
543
+ yield smtB.close();
544
+ }));
545
+ it('should detect both-are-leaves diff with same key but different value', () => __awaiter(void 0, void 0, void 0, function* () {
546
+ // Test lines 637-640: same keyHash, different valueCid.
547
+ // Since keyHash = hash(valueCid), this can't happen organically.
548
+ // We simulate it by directly placing leaf nodes in the store.
549
+ const storeA = new SMTStoreMemory();
550
+ const smtA = new SparseMerkleTree(storeA);
551
+ yield smtA.initialize();
552
+ const storeB = new SMTStoreMemory();
553
+ const smtB = new SparseMerkleTree(storeB);
554
+ yield smtB.initialize();
555
+ // Insert the same CID into both, then manually alter one tree's leaf to have a different valueCid
556
+ // but the same keyHash, by manipulating the store directly.
557
+ const sharedKeyHash = yield hashKey('bafyreiSharedKey');
558
+ const leafHashA = yield hashLeaf(sharedKeyHash, 'valueCidA');
559
+ const leafNodeA = { type: 'leaf', keyHash: sharedKeyHash, valueCid: 'valueCidA' };
560
+ yield storeA.putNode(leafHashA, leafNodeA);
561
+ yield storeA.setRoot(leafHashA);
562
+ const leafHashB = yield hashLeaf(sharedKeyHash, 'valueCidB');
563
+ const leafNodeB = { type: 'leaf', keyHash: sharedKeyHash, valueCid: 'valueCidB' };
564
+ yield storeB.putNode(leafHashB, leafNodeB);
565
+ yield storeB.setRoot(leafHashB);
566
+ const diff = yield smtA.diff(smtB);
567
+ // Same key, different value → both appear as unique
568
+ expect(diff.onlyLocal).toEqual(['valueCidA']);
569
+ expect(diff.onlyRemote).toEqual(['valueCidB']);
570
+ yield smtA.close();
571
+ yield smtB.close();
572
+ }));
573
+ it('should handle diff with selectively corrupted nodes via fallback', () => __awaiter(void 0, void 0, void 0, function* () {
574
+ // To hit lines 687-696, we need both trees to have internal root nodes
575
+ // (so the recursion goes through line 682-684 into children), and then
576
+ // at the child level, one node is missing (getNode returns undefined).
577
+ const realStore = new SMTStoreMemory();
578
+ let corruptDuringDiff = false;
579
+ let lookupCount = 0;
580
+ const corruptStore = {
581
+ open: () => realStore.open(),
582
+ close: () => realStore.close(),
583
+ clear: () => realStore.clear(),
584
+ getRoot: () => realStore.getRoot(),
585
+ setRoot: (hash) => realStore.setRoot(hash),
586
+ putNode: (hash, node) => realStore.putNode(hash, node),
587
+ deleteNode: (hash) => realStore.deleteNode(hash),
588
+ getNode: (hash) => __awaiter(void 0, void 0, void 0, function* () {
589
+ if (corruptDuringDiff) {
590
+ lookupCount++;
591
+ // Return the root node (first lookup) but corrupt child nodes
592
+ if (lookupCount > 1) {
593
+ return undefined;
594
+ }
595
+ }
596
+ return realStore.getNode(hash);
597
+ }),
598
+ };
599
+ // Build the corrupt tree with multiple elements (so root = internal node)
600
+ const corruptSmt = new SparseMerkleTree(corruptStore);
601
+ yield corruptSmt.initialize();
602
+ yield corruptSmt.insert('bafyreiCorrupt1');
603
+ yield corruptSmt.insert('bafyreiCorrupt2');
604
+ yield corruptSmt.insert('bafyreiCorrupt3');
605
+ // Build normal tree with multiple elements (so root = internal node too)
606
+ const normalStore = new SMTStoreMemory();
607
+ const normalSmt = new SparseMerkleTree(normalStore);
608
+ yield normalSmt.initialize();
609
+ yield normalSmt.insert('bafyreiNormal1');
610
+ yield normalSmt.insert('bafyreiNormal2');
611
+ yield normalSmt.insert('bafyreiNormal3');
612
+ // Corrupt the store so child nodes are missing during diff
613
+ corruptDuringDiff = true;
614
+ lookupCount = 0;
615
+ const diff = yield normalSmt.diff(corruptSmt);
616
+ // The diff should still complete — fallback collects leaves from the other side
617
+ // Normal tree's elements should be in onlyLocal
618
+ expect(diff.onlyLocal.sort()).toEqual(['bafyreiNormal1', 'bafyreiNormal2', 'bafyreiNormal3'].sort());
619
+ corruptDuringDiff = false;
620
+ yield corruptSmt.close();
621
+ yield normalSmt.close();
622
+ }));
623
+ it('should handle diff where local node is missing but remote exists', () => __awaiter(void 0, void 0, void 0, function* () {
624
+ // Test lines 689-692: localNode is undefined while remoteNode exists.
625
+ // Both trees need non-default hashes at the SAME child position so the
626
+ // recursion reaches line 628 (both load nodes). We achieve this by sharing
627
+ // elements so both trees have populated subtrees at the same positions.
628
+ const realStore = new SMTStoreMemory();
629
+ let corruptDuringDiff = false;
630
+ let lookupCount = 0;
631
+ const corruptStore = {
632
+ open: () => realStore.open(),
633
+ close: () => realStore.close(),
634
+ clear: () => realStore.clear(),
635
+ getRoot: () => realStore.getRoot(),
636
+ setRoot: (hash) => realStore.setRoot(hash),
637
+ putNode: (hash, node) => realStore.putNode(hash, node),
638
+ deleteNode: (hash) => realStore.deleteNode(hash),
639
+ getNode: (hash) => __awaiter(void 0, void 0, void 0, function* () {
640
+ if (corruptDuringDiff) {
641
+ lookupCount++;
642
+ // Return the root internal node (first lookup) but corrupt children
643
+ if (lookupCount > 1) {
644
+ return undefined;
645
+ }
646
+ }
647
+ return realStore.getNode(hash);
648
+ }),
649
+ };
650
+ // Build corrupt tree (local) with shared + unique elements
651
+ const corruptSmt = new SparseMerkleTree(corruptStore);
652
+ yield corruptSmt.initialize();
653
+ // Add many shared elements so both subtrees (left/right) are populated
654
+ for (let i = 0; i < 20; i++) {
655
+ yield corruptSmt.insert(`bafyreiShared-${i}`);
656
+ }
657
+ yield corruptSmt.insert('bafyreiCorruptOnly');
658
+ // Build normal tree (remote) with the same shared elements + different unique
659
+ const normalStore = new SMTStoreMemory();
660
+ const normalSmt = new SparseMerkleTree(normalStore);
661
+ yield normalSmt.initialize();
662
+ for (let i = 0; i < 20; i++) {
663
+ yield normalSmt.insert(`bafyreiShared-${i}`);
664
+ }
665
+ yield normalSmt.insert('bafyreiNormalOnly');
666
+ // corruptSmt is local, normalSmt is remote
667
+ // The roots differ (different unique elements), both are internal nodes,
668
+ // and both have non-default children at the same positions (shared elements).
669
+ // When diffAtNode recurses into children, localNode will be undefined (corrupt)
670
+ // while remoteNode will be a real internal/leaf node → hits lines 689-692.
671
+ corruptDuringDiff = true;
672
+ lookupCount = 0;
673
+ const diff = yield corruptSmt.diff(normalSmt);
674
+ // The diff should complete. Remote leaves should appear in onlyRemote
675
+ // since the corrupt local can't prove they exist locally.
676
+ expect(diff.onlyRemote.length).toBeGreaterThan(0);
677
+ corruptDuringDiff = false;
678
+ yield corruptSmt.close();
679
+ yield normalSmt.close();
680
+ }));
681
+ });
682
+ describe('node storage efficiency', () => {
683
+ it('should clean up internal nodes after deletion collapses the tree', () => __awaiter(void 0, void 0, void 0, function* () {
684
+ yield smt.insert('bafyreiA');
685
+ yield smt.insert('bafyreiB');
686
+ const sizeAfterInserts = store.size;
687
+ yield smt.delete('bafyreiA');
688
+ yield smt.delete('bafyreiB');
689
+ const sizeAfterDeletes = store.size;
690
+ // After deleting everything, the store should have fewer nodes than after inserts
691
+ expect(sizeAfterDeletes).toBeLessThan(sizeAfterInserts);
692
+ }));
693
+ });
694
+ });
695
+ describe('SMT Utility Functions', () => {
696
+ describe('getDefaultHashes', () => {
697
+ it('should return default hashes after initialization', () => __awaiter(void 0, void 0, void 0, function* () {
698
+ yield initDefaultHashes();
699
+ const hashes = getDefaultHashes();
700
+ expect(hashes).toHaveLength(SMT_DEPTH + 1);
701
+ expect(hashEquals(hashes[SMT_DEPTH], ZERO_HASH)).toBe(true);
702
+ }));
703
+ it('should throw when called before initDefaultHashes()', () => __awaiter(void 0, void 0, void 0, function* () {
704
+ // Reset the module-level cache
705
+ resetDefaultHashesForTesting();
706
+ try {
707
+ getDefaultHashes();
708
+ throw new Error('Expected an error');
709
+ }
710
+ catch (e) {
711
+ expect(e.message).toContain('Default hashes not initialized');
712
+ }
713
+ // Re-initialize so subsequent tests aren't affected
714
+ yield initDefaultHashes();
715
+ }));
716
+ });
717
+ describe('hashEquals', () => {
718
+ it('should return false for hashes of different lengths', () => {
719
+ const a = new Uint8Array(32);
720
+ const b = new Uint8Array(16);
721
+ expect(hashEquals(a, b)).toBe(false);
722
+ });
723
+ });
724
+ describe('hashKey', () => {
725
+ it('should produce consistent hashes for the same input', () => __awaiter(void 0, void 0, void 0, function* () {
726
+ const hash1 = yield hashKey('bafyreigtest');
727
+ const hash2 = yield hashKey('bafyreigtest');
728
+ expect(hashEquals(hash1, hash2)).toBe(true);
729
+ }));
730
+ it('should produce different hashes for different inputs', () => __awaiter(void 0, void 0, void 0, function* () {
731
+ const hash1 = yield hashKey('bafyreigtest1');
732
+ const hash2 = yield hashKey('bafyreigtest2');
733
+ expect(hashEquals(hash1, hash2)).toBe(false);
734
+ }));
735
+ it('should produce 32-byte hashes', () => __awaiter(void 0, void 0, void 0, function* () {
736
+ const hash = yield hashKey('bafyreigtest');
737
+ expect(hash.length).toBe(32);
738
+ }));
739
+ });
740
+ });
741
+ //# sourceMappingURL=sparse-merkle-tree.spec.js.map