@enbox/dwn-sdk-js 0.4.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (513) hide show
  1. package/README.md +4 -4
  2. package/dist/browser.mjs +8 -8
  3. package/dist/browser.mjs.map +4 -4
  4. package/dist/esm/generated/precompiled-validators.js +799 -885
  5. package/dist/esm/generated/precompiled-validators.js.map +1 -1
  6. package/dist/esm/src/core/dwn-constant.js +5 -0
  7. package/dist/esm/src/core/dwn-constant.js.map +1 -1
  8. package/dist/esm/src/core/dwn-error.js +12 -4
  9. package/dist/esm/src/core/dwn-error.js.map +1 -1
  10. package/dist/esm/src/core/grant-authorization.js +9 -18
  11. package/dist/esm/src/core/grant-authorization.js.map +1 -1
  12. package/dist/esm/src/core/message-reply.js.map +1 -1
  13. package/dist/esm/src/core/messages-grant-authorization.js +28 -45
  14. package/dist/esm/src/core/messages-grant-authorization.js.map +1 -1
  15. package/dist/esm/src/core/protocol-authorization-action.js +25 -27
  16. package/dist/esm/src/core/protocol-authorization-action.js.map +1 -1
  17. package/dist/esm/src/core/protocol-authorization-validation.js +30 -68
  18. package/dist/esm/src/core/protocol-authorization-validation.js.map +1 -1
  19. package/dist/esm/src/core/protocol-authorization.js +44 -118
  20. package/dist/esm/src/core/protocol-authorization.js.map +1 -1
  21. package/dist/esm/src/core/protocols-grant-authorization.js +5 -5
  22. package/dist/esm/src/core/protocols-grant-authorization.js.map +1 -1
  23. package/dist/esm/src/core/recording-validation-state-reader.js +84 -0
  24. package/dist/esm/src/core/recording-validation-state-reader.js.map +1 -0
  25. package/dist/esm/src/core/records-grant-authorization.js +11 -11
  26. package/dist/esm/src/core/records-grant-authorization.js.map +1 -1
  27. package/dist/esm/src/core/replication-apply.js +123 -28
  28. package/dist/esm/src/core/replication-apply.js.map +1 -1
  29. package/dist/esm/src/core/resumable-task-manager.js +5 -4
  30. package/dist/esm/src/core/resumable-task-manager.js.map +1 -1
  31. package/dist/esm/src/core/validation-state-reader.js +237 -0
  32. package/dist/esm/src/core/validation-state-reader.js.map +1 -0
  33. package/dist/esm/src/dwn.js +165 -132
  34. package/dist/esm/src/dwn.js.map +1 -1
  35. package/dist/esm/src/enums/dwn-interface-method.js +0 -1
  36. package/dist/esm/src/enums/dwn-interface-method.js.map +1 -1
  37. package/dist/esm/src/event-stream/durable-event-log.js +365 -0
  38. package/dist/esm/src/event-stream/durable-event-log.js.map +1 -0
  39. package/dist/esm/src/event-stream/event-emitter-wake-publisher.js +25 -0
  40. package/dist/esm/src/event-stream/event-emitter-wake-publisher.js.map +1 -0
  41. package/dist/esm/src/handlers/messages-query.js +159 -0
  42. package/dist/esm/src/handlers/messages-query.js.map +1 -0
  43. package/dist/esm/src/handlers/messages-read.js +5 -5
  44. package/dist/esm/src/handlers/messages-read.js.map +1 -1
  45. package/dist/esm/src/handlers/messages-subscribe.js +8 -8
  46. package/dist/esm/src/handlers/messages-subscribe.js.map +1 -1
  47. package/dist/esm/src/handlers/protocols-configure.js +30 -49
  48. package/dist/esm/src/handlers/protocols-configure.js.map +1 -1
  49. package/dist/esm/src/handlers/protocols-query.js +1 -1
  50. package/dist/esm/src/handlers/protocols-query.js.map +1 -1
  51. package/dist/esm/src/handlers/records-count.js +20 -11
  52. package/dist/esm/src/handlers/records-count.js.map +1 -1
  53. package/dist/esm/src/handlers/records-delete.js +20 -16
  54. package/dist/esm/src/handlers/records-delete.js.map +1 -1
  55. package/dist/esm/src/handlers/records-query.js +35 -11
  56. package/dist/esm/src/handlers/records-query.js.map +1 -1
  57. package/dist/esm/src/handlers/records-read.js +52 -42
  58. package/dist/esm/src/handlers/records-read.js.map +1 -1
  59. package/dist/esm/src/handlers/records-subscribe.js +107 -11
  60. package/dist/esm/src/handlers/records-subscribe.js.map +1 -1
  61. package/dist/esm/src/handlers/records-write.js +62 -116
  62. package/dist/esm/src/handlers/records-write.js.map +1 -1
  63. package/dist/esm/src/index.js +6 -7
  64. package/dist/esm/src/index.js.map +1 -1
  65. package/dist/esm/src/interfaces/{messages-sync.js → messages-query.js} +21 -15
  66. package/dist/esm/src/interfaces/messages-query.js.map +1 -0
  67. package/dist/esm/src/interfaces/protocols-configure.js +7 -3
  68. package/dist/esm/src/interfaces/protocols-configure.js.map +1 -1
  69. package/dist/esm/src/interfaces/protocols-query.js +3 -4
  70. package/dist/esm/src/interfaces/protocols-query.js.map +1 -1
  71. package/dist/esm/src/interfaces/records-count.js +4 -3
  72. package/dist/esm/src/interfaces/records-count.js.map +1 -1
  73. package/dist/esm/src/interfaces/records-delete.js +21 -4
  74. package/dist/esm/src/interfaces/records-delete.js.map +1 -1
  75. package/dist/esm/src/interfaces/records-query.js +4 -3
  76. package/dist/esm/src/interfaces/records-query.js.map +1 -1
  77. package/dist/esm/src/interfaces/records-read.js +3 -3
  78. package/dist/esm/src/interfaces/records-read.js.map +1 -1
  79. package/dist/esm/src/interfaces/records-subscribe.js +4 -3
  80. package/dist/esm/src/interfaces/records-subscribe.js.map +1 -1
  81. package/dist/esm/src/interfaces/records-write.js +27 -13
  82. package/dist/esm/src/interfaces/records-write.js.map +1 -1
  83. package/dist/esm/src/protocols/permissions.js +27 -34
  84. package/dist/esm/src/protocols/permissions.js.map +1 -1
  85. package/dist/esm/src/store/index-level.js +24 -9
  86. package/dist/esm/src/store/index-level.js.map +1 -1
  87. package/dist/esm/src/store/level-wrapper.js +7 -0
  88. package/dist/esm/src/store/level-wrapper.js.map +1 -1
  89. package/dist/esm/src/store/message-store-level.js +536 -42
  90. package/dist/esm/src/store/message-store-level.js.map +1 -1
  91. package/dist/esm/src/store/storage-controller.js +58 -49
  92. package/dist/esm/src/store/storage-controller.js.map +1 -1
  93. package/dist/esm/src/types/message-types.js.map +1 -1
  94. package/dist/esm/src/types/validation-state-reader.js +2 -0
  95. package/dist/esm/src/types/validation-state-reader.js.map +1 -0
  96. package/dist/esm/src/utils/messages.js +17 -0
  97. package/dist/esm/src/utils/messages.js.map +1 -1
  98. package/dist/esm/src/utils/record-limit-occupancy.js +244 -0
  99. package/dist/esm/src/utils/record-limit-occupancy.js.map +1 -0
  100. package/dist/esm/src/utils/records.js +50 -14
  101. package/dist/esm/src/utils/records.js.map +1 -1
  102. package/dist/esm/src/utils/replication.js +85 -0
  103. package/dist/esm/src/utils/replication.js.map +1 -0
  104. package/dist/esm/tests/core/grant-authorization.spec.js +4 -4
  105. package/dist/esm/tests/core/grant-authorization.spec.js.map +1 -1
  106. package/dist/esm/tests/core/process-message-parity.spec.js +222 -0
  107. package/dist/esm/tests/core/process-message-parity.spec.js.map +1 -0
  108. package/dist/esm/tests/core/protocol-authorization.spec.js +5 -2
  109. package/dist/esm/tests/core/protocol-authorization.spec.js.map +1 -1
  110. package/dist/esm/tests/core/records-grant-authorization.spec.js +5 -5
  111. package/dist/esm/tests/core/records-grant-authorization.spec.js.map +1 -1
  112. package/dist/esm/tests/core/replication-apply.spec.js +55 -1
  113. package/dist/esm/tests/core/replication-apply.spec.js.map +1 -1
  114. package/dist/esm/tests/core/replication-replay-property.spec.js +350 -0
  115. package/dist/esm/tests/core/replication-replay-property.spec.js.map +1 -0
  116. package/dist/esm/tests/core/validation-read-closure.spec.js +469 -0
  117. package/dist/esm/tests/core/validation-read-closure.spec.js.map +1 -0
  118. package/dist/esm/tests/core/validation-state-reader.spec.js +716 -0
  119. package/dist/esm/tests/core/validation-state-reader.spec.js.map +1 -0
  120. package/dist/esm/tests/durable-event-log.spec.js +373 -0
  121. package/dist/esm/tests/durable-event-log.spec.js.map +1 -0
  122. package/dist/esm/tests/dwn.spec.js +504 -35
  123. package/dist/esm/tests/dwn.spec.js.map +1 -1
  124. package/dist/esm/tests/features/author-delegated-grant.spec.js +9 -6
  125. package/dist/esm/tests/features/author-delegated-grant.spec.js.map +1 -1
  126. package/dist/esm/tests/features/owner-delegated-grant.spec.js +1 -4
  127. package/dist/esm/tests/features/owner-delegated-grant.spec.js.map +1 -1
  128. package/dist/esm/tests/features/owner-signature.spec.js +1 -4
  129. package/dist/esm/tests/features/owner-signature.spec.js.map +1 -1
  130. package/dist/esm/tests/features/permissions.spec.js +165 -4
  131. package/dist/esm/tests/features/permissions.spec.js.map +1 -1
  132. package/dist/esm/tests/features/protocol-composition.spec.js +8 -11
  133. package/dist/esm/tests/features/protocol-composition.spec.js.map +1 -1
  134. package/dist/esm/tests/features/protocol-create-action.spec.js +1 -4
  135. package/dist/esm/tests/features/protocol-create-action.spec.js.map +1 -1
  136. package/dist/esm/tests/features/protocol-delete-action.spec.js +3 -5
  137. package/dist/esm/tests/features/protocol-delete-action.spec.js.map +1 -1
  138. package/dist/esm/tests/features/protocol-update-action.spec.js +3 -6
  139. package/dist/esm/tests/features/protocol-update-action.spec.js.map +1 -1
  140. package/dist/esm/tests/features/records-delivery.spec.js +1 -4
  141. package/dist/esm/tests/features/records-delivery.spec.js.map +1 -1
  142. package/dist/esm/tests/features/records-immutable.spec.js +1 -4
  143. package/dist/esm/tests/features/records-immutable.spec.js.map +1 -1
  144. package/dist/esm/tests/features/records-nested-query-scope.spec.js +281 -0
  145. package/dist/esm/tests/features/records-nested-query-scope.spec.js.map +1 -0
  146. package/dist/esm/tests/features/records-prune-cross-protocol.spec.js +3 -7
  147. package/dist/esm/tests/features/records-prune-cross-protocol.spec.js.map +1 -1
  148. package/dist/esm/tests/features/records-prune.spec.js +11 -22
  149. package/dist/esm/tests/features/records-prune.spec.js.map +1 -1
  150. package/dist/esm/tests/features/records-record-limit.spec.js +441 -231
  151. package/dist/esm/tests/features/records-record-limit.spec.js.map +1 -1
  152. package/dist/esm/tests/features/records-squash.spec.js +6 -4
  153. package/dist/esm/tests/features/records-squash.spec.js.map +1 -1
  154. package/dist/esm/tests/features/records-tags.spec.js +1 -4
  155. package/dist/esm/tests/features/records-tags.spec.js.map +1 -1
  156. package/dist/esm/tests/features/resumable-tasks.spec.js +3 -5
  157. package/dist/esm/tests/features/resumable-tasks.spec.js.map +1 -1
  158. package/dist/esm/tests/fuzz/message-store.fuzz.spec.js +1 -2
  159. package/dist/esm/tests/fuzz/message-store.fuzz.spec.js.map +1 -1
  160. package/dist/esm/tests/fuzz/process-message.fuzz.spec.js +2 -4
  161. package/dist/esm/tests/fuzz/process-message.fuzz.spec.js.map +1 -1
  162. package/dist/esm/tests/fuzz/schema-validation.fuzz.spec.js +1 -1
  163. package/dist/esm/tests/fuzz/schema-validation.fuzz.spec.js.map +1 -1
  164. package/dist/esm/tests/handlers/messages-query.spec.js +246 -0
  165. package/dist/esm/tests/handlers/messages-query.spec.js.map +1 -0
  166. package/dist/esm/tests/handlers/messages-read.spec.js +2 -5
  167. package/dist/esm/tests/handlers/messages-read.spec.js.map +1 -1
  168. package/dist/esm/tests/handlers/messages-subscribe.spec.js +3 -14
  169. package/dist/esm/tests/handlers/messages-subscribe.spec.js.map +1 -1
  170. package/dist/esm/tests/handlers/protocols-configure.spec.js +27 -26
  171. package/dist/esm/tests/handlers/protocols-configure.spec.js.map +1 -1
  172. package/dist/esm/tests/handlers/protocols-query.spec.js +1 -4
  173. package/dist/esm/tests/handlers/protocols-query.spec.js.map +1 -1
  174. package/dist/esm/tests/handlers/records-count.spec.js +1 -4
  175. package/dist/esm/tests/handlers/records-count.spec.js.map +1 -1
  176. package/dist/esm/tests/handlers/records-delete.spec.js +312 -30
  177. package/dist/esm/tests/handlers/records-delete.spec.js.map +1 -1
  178. package/dist/esm/tests/handlers/records-query.spec.js +32 -9
  179. package/dist/esm/tests/handlers/records-query.spec.js.map +1 -1
  180. package/dist/esm/tests/handlers/records-read.spec.js +4 -4
  181. package/dist/esm/tests/handlers/records-read.spec.js.map +1 -1
  182. package/dist/esm/tests/handlers/records-subscribe.spec.js +33 -14
  183. package/dist/esm/tests/handlers/records-subscribe.spec.js.map +1 -1
  184. package/dist/esm/tests/handlers/records-write.spec.js +82 -36
  185. package/dist/esm/tests/handlers/records-write.spec.js.map +1 -1
  186. package/dist/esm/tests/interfaces/records-delete.spec.js +69 -2
  187. package/dist/esm/tests/interfaces/records-delete.spec.js.map +1 -1
  188. package/dist/esm/tests/interfaces/records-write.spec.js +4 -3
  189. package/dist/esm/tests/interfaces/records-write.spec.js.map +1 -1
  190. package/dist/esm/tests/protocols/permissions.spec.js +55 -6
  191. package/dist/esm/tests/protocols/permissions.spec.js.map +1 -1
  192. package/dist/esm/tests/scenarios/aggregator.spec.js +1 -4
  193. package/dist/esm/tests/scenarios/aggregator.spec.js.map +1 -1
  194. package/dist/esm/tests/scenarios/deleted-record.spec.js +1 -4
  195. package/dist/esm/tests/scenarios/deleted-record.spec.js.map +1 -1
  196. package/dist/esm/tests/scenarios/end-to-end-tests.spec.js +1 -4
  197. package/dist/esm/tests/scenarios/end-to-end-tests.spec.js.map +1 -1
  198. package/dist/esm/tests/scenarios/nested-roles.spec.js +1 -4
  199. package/dist/esm/tests/scenarios/nested-roles.spec.js.map +1 -1
  200. package/dist/esm/tests/scenarios/subscriptions.spec.js +1 -4
  201. package/dist/esm/tests/scenarios/subscriptions.spec.js.map +1 -1
  202. package/dist/esm/tests/store/message-store-level.spec.js +361 -5
  203. package/dist/esm/tests/store/message-store-level.spec.js.map +1 -1
  204. package/dist/esm/tests/store/message-store.spec.js +60 -0
  205. package/dist/esm/tests/store/message-store.spec.js.map +1 -1
  206. package/dist/esm/tests/test-event-stream.js +7 -3
  207. package/dist/esm/tests/test-event-stream.js.map +1 -1
  208. package/dist/esm/tests/test-stores.js +19 -9
  209. package/dist/esm/tests/test-stores.js.map +1 -1
  210. package/dist/esm/tests/test-suite.js +4 -2
  211. package/dist/esm/tests/test-suite.js.map +1 -1
  212. package/dist/esm/tests/utils/test-data-generator.js +25 -0
  213. package/dist/esm/tests/utils/test-data-generator.js.map +1 -1
  214. package/dist/esm/tests/utils/test-stub-generator.js.map +1 -1
  215. package/dist/esm/tests/utils/test-validation-state-reader.js +16 -0
  216. package/dist/esm/tests/utils/test-validation-state-reader.js.map +1 -0
  217. package/dist/types/generated/precompiled-validators.d.ts +6 -6
  218. package/dist/types/generated/precompiled-validators.d.ts.map +1 -1
  219. package/dist/types/src/core/core-protocol.d.ts +3 -3
  220. package/dist/types/src/core/core-protocol.d.ts.map +1 -1
  221. package/dist/types/src/core/dwn-constant.d.ts +5 -0
  222. package/dist/types/src/core/dwn-constant.d.ts.map +1 -1
  223. package/dist/types/src/core/dwn-error.d.ts +12 -4
  224. package/dist/types/src/core/dwn-error.d.ts.map +1 -1
  225. package/dist/types/src/core/grant-authorization.d.ts +5 -5
  226. package/dist/types/src/core/grant-authorization.d.ts.map +1 -1
  227. package/dist/types/src/core/message-reply.d.ts +5 -4
  228. package/dist/types/src/core/message-reply.d.ts.map +1 -1
  229. package/dist/types/src/core/messages-grant-authorization.d.ts +12 -14
  230. package/dist/types/src/core/messages-grant-authorization.d.ts.map +1 -1
  231. package/dist/types/src/core/protocol-authorization-action.d.ts +4 -5
  232. package/dist/types/src/core/protocol-authorization-action.d.ts.map +1 -1
  233. package/dist/types/src/core/protocol-authorization-validation.d.ts +13 -16
  234. package/dist/types/src/core/protocol-authorization-validation.d.ts.map +1 -1
  235. package/dist/types/src/core/protocol-authorization.d.ts +8 -33
  236. package/dist/types/src/core/protocol-authorization.d.ts.map +1 -1
  237. package/dist/types/src/core/protocols-grant-authorization.d.ts +4 -4
  238. package/dist/types/src/core/protocols-grant-authorization.d.ts.map +1 -1
  239. package/dist/types/src/core/recording-validation-state-reader.d.ts +75 -0
  240. package/dist/types/src/core/recording-validation-state-reader.d.ts.map +1 -0
  241. package/dist/types/src/core/records-grant-authorization.d.ts +8 -8
  242. package/dist/types/src/core/records-grant-authorization.d.ts.map +1 -1
  243. package/dist/types/src/core/replication-apply.d.ts +36 -0
  244. package/dist/types/src/core/replication-apply.d.ts.map +1 -1
  245. package/dist/types/src/core/resumable-task-manager.d.ts +1 -1
  246. package/dist/types/src/core/resumable-task-manager.d.ts.map +1 -1
  247. package/dist/types/src/core/validation-state-reader.d.ts +79 -0
  248. package/dist/types/src/core/validation-state-reader.d.ts.map +1 -0
  249. package/dist/types/src/dwn.d.ts +33 -20
  250. package/dist/types/src/dwn.d.ts.map +1 -1
  251. package/dist/types/src/enums/dwn-interface-method.d.ts +0 -1
  252. package/dist/types/src/enums/dwn-interface-method.d.ts.map +1 -1
  253. package/dist/types/src/event-stream/durable-event-log.d.ts +69 -0
  254. package/dist/types/src/event-stream/durable-event-log.d.ts.map +1 -0
  255. package/dist/types/src/event-stream/event-emitter-wake-publisher.d.ts +13 -0
  256. package/dist/types/src/event-stream/event-emitter-wake-publisher.d.ts.map +1 -0
  257. package/dist/types/src/handlers/messages-query.d.ts +20 -0
  258. package/dist/types/src/handlers/messages-query.d.ts.map +1 -0
  259. package/dist/types/src/handlers/messages-read.d.ts +1 -1
  260. package/dist/types/src/handlers/messages-read.d.ts.map +1 -1
  261. package/dist/types/src/handlers/messages-subscribe.d.ts.map +1 -1
  262. package/dist/types/src/handlers/protocols-configure.d.ts +0 -5
  263. package/dist/types/src/handlers/protocols-configure.d.ts.map +1 -1
  264. package/dist/types/src/handlers/records-count.d.ts +2 -1
  265. package/dist/types/src/handlers/records-count.d.ts.map +1 -1
  266. package/dist/types/src/handlers/records-delete.d.ts +2 -2
  267. package/dist/types/src/handlers/records-delete.d.ts.map +1 -1
  268. package/dist/types/src/handlers/records-query.d.ts +1 -1
  269. package/dist/types/src/handlers/records-query.d.ts.map +1 -1
  270. package/dist/types/src/handlers/records-read.d.ts +2 -1
  271. package/dist/types/src/handlers/records-read.d.ts.map +1 -1
  272. package/dist/types/src/handlers/records-subscribe.d.ts +4 -5
  273. package/dist/types/src/handlers/records-subscribe.d.ts.map +1 -1
  274. package/dist/types/src/handlers/records-write.d.ts +3 -11
  275. package/dist/types/src/handlers/records-write.d.ts.map +1 -1
  276. package/dist/types/src/index.d.ts +14 -16
  277. package/dist/types/src/index.d.ts.map +1 -1
  278. package/dist/types/src/interfaces/messages-query.d.ts +23 -0
  279. package/dist/types/src/interfaces/messages-query.d.ts.map +1 -0
  280. package/dist/types/src/interfaces/protocols-configure.d.ts +3 -3
  281. package/dist/types/src/interfaces/protocols-configure.d.ts.map +1 -1
  282. package/dist/types/src/interfaces/protocols-query.d.ts +2 -2
  283. package/dist/types/src/interfaces/protocols-query.d.ts.map +1 -1
  284. package/dist/types/src/interfaces/records-count.d.ts +3 -3
  285. package/dist/types/src/interfaces/records-count.d.ts.map +1 -1
  286. package/dist/types/src/interfaces/records-delete.d.ts +11 -3
  287. package/dist/types/src/interfaces/records-delete.d.ts.map +1 -1
  288. package/dist/types/src/interfaces/records-query.d.ts +3 -3
  289. package/dist/types/src/interfaces/records-query.d.ts.map +1 -1
  290. package/dist/types/src/interfaces/records-read.d.ts +3 -3
  291. package/dist/types/src/interfaces/records-read.d.ts.map +1 -1
  292. package/dist/types/src/interfaces/records-subscribe.d.ts +3 -3
  293. package/dist/types/src/interfaces/records-subscribe.d.ts.map +1 -1
  294. package/dist/types/src/interfaces/records-write.d.ts +15 -7
  295. package/dist/types/src/interfaces/records-write.d.ts.map +1 -1
  296. package/dist/types/src/protocols/permissions.d.ts +9 -12
  297. package/dist/types/src/protocols/permissions.d.ts.map +1 -1
  298. package/dist/types/src/store/index-level.d.ts +10 -1
  299. package/dist/types/src/store/index-level.d.ts.map +1 -1
  300. package/dist/types/src/store/level-wrapper.d.ts +5 -0
  301. package/dist/types/src/store/level-wrapper.d.ts.map +1 -1
  302. package/dist/types/src/store/message-store-level.d.ts +94 -14
  303. package/dist/types/src/store/message-store-level.d.ts.map +1 -1
  304. package/dist/types/src/store/storage-controller.d.ts +17 -14
  305. package/dist/types/src/store/storage-controller.d.ts.map +1 -1
  306. package/dist/types/src/types/message-store.d.ts +29 -1
  307. package/dist/types/src/types/message-store.d.ts.map +1 -1
  308. package/dist/types/src/types/message-types.d.ts +2 -0
  309. package/dist/types/src/types/message-types.d.ts.map +1 -1
  310. package/dist/types/src/types/messages-types.d.ts +21 -37
  311. package/dist/types/src/types/messages-types.d.ts.map +1 -1
  312. package/dist/types/src/types/method-handler.d.ts +2 -2
  313. package/dist/types/src/types/method-handler.d.ts.map +1 -1
  314. package/dist/types/src/types/permission-types.d.ts +1 -1
  315. package/dist/types/src/types/subscriptions.d.ts +50 -39
  316. package/dist/types/src/types/subscriptions.d.ts.map +1 -1
  317. package/dist/types/src/types/validation-state-reader.d.ts +116 -0
  318. package/dist/types/src/types/validation-state-reader.d.ts.map +1 -0
  319. package/dist/types/src/utils/messages.d.ts +10 -0
  320. package/dist/types/src/utils/messages.d.ts.map +1 -1
  321. package/dist/types/src/utils/record-limit-occupancy.d.ts +40 -0
  322. package/dist/types/src/utils/record-limit-occupancy.d.ts.map +1 -0
  323. package/dist/types/src/utils/records.d.ts +25 -3
  324. package/dist/types/src/utils/records.d.ts.map +1 -1
  325. package/dist/types/src/utils/replication.d.ts +22 -0
  326. package/dist/types/src/utils/replication.d.ts.map +1 -0
  327. package/dist/types/tests/core/process-message-parity.spec.d.ts +2 -0
  328. package/dist/types/tests/core/process-message-parity.spec.d.ts.map +1 -0
  329. package/dist/types/tests/core/replication-replay-property.spec.d.ts +2 -0
  330. package/dist/types/tests/core/replication-replay-property.spec.d.ts.map +1 -0
  331. package/dist/types/tests/core/validation-read-closure.spec.d.ts +2 -0
  332. package/dist/types/tests/core/validation-read-closure.spec.d.ts.map +1 -0
  333. package/dist/types/tests/core/validation-state-reader.spec.d.ts +2 -0
  334. package/dist/types/tests/core/validation-state-reader.spec.d.ts.map +1 -0
  335. package/dist/types/tests/durable-event-log.spec.d.ts +2 -0
  336. package/dist/types/tests/durable-event-log.spec.d.ts.map +1 -0
  337. package/dist/types/tests/dwn.spec.d.ts.map +1 -1
  338. package/dist/types/tests/features/author-delegated-grant.spec.d.ts.map +1 -1
  339. package/dist/types/tests/features/owner-delegated-grant.spec.d.ts.map +1 -1
  340. package/dist/types/tests/features/owner-signature.spec.d.ts.map +1 -1
  341. package/dist/types/tests/features/permissions.spec.d.ts.map +1 -1
  342. package/dist/types/tests/features/protocol-composition.spec.d.ts.map +1 -1
  343. package/dist/types/tests/features/protocol-create-action.spec.d.ts.map +1 -1
  344. package/dist/types/tests/features/protocol-delete-action.spec.d.ts.map +1 -1
  345. package/dist/types/tests/features/protocol-update-action.spec.d.ts.map +1 -1
  346. package/dist/types/tests/features/records-delivery.spec.d.ts.map +1 -1
  347. package/dist/types/tests/features/records-immutable.spec.d.ts.map +1 -1
  348. package/dist/types/tests/features/records-nested-query-scope.spec.d.ts +2 -0
  349. package/dist/types/tests/features/records-nested-query-scope.spec.d.ts.map +1 -0
  350. package/dist/types/tests/features/records-prune-cross-protocol.spec.d.ts.map +1 -1
  351. package/dist/types/tests/features/records-prune.spec.d.ts.map +1 -1
  352. package/dist/types/tests/features/records-record-limit.spec.d.ts.map +1 -1
  353. package/dist/types/tests/features/records-squash.spec.d.ts.map +1 -1
  354. package/dist/types/tests/features/records-tags.spec.d.ts.map +1 -1
  355. package/dist/types/tests/features/resumable-tasks.spec.d.ts.map +1 -1
  356. package/dist/types/tests/handlers/messages-query.spec.d.ts +2 -0
  357. package/dist/types/tests/handlers/messages-query.spec.d.ts.map +1 -0
  358. package/dist/types/tests/handlers/messages-read.spec.d.ts.map +1 -1
  359. package/dist/types/tests/handlers/messages-subscribe.spec.d.ts.map +1 -1
  360. package/dist/types/tests/handlers/protocols-configure.spec.d.ts.map +1 -1
  361. package/dist/types/tests/handlers/protocols-query.spec.d.ts.map +1 -1
  362. package/dist/types/tests/handlers/records-count.spec.d.ts.map +1 -1
  363. package/dist/types/tests/handlers/records-delete.spec.d.ts.map +1 -1
  364. package/dist/types/tests/handlers/records-query.spec.d.ts.map +1 -1
  365. package/dist/types/tests/handlers/records-read.spec.d.ts.map +1 -1
  366. package/dist/types/tests/handlers/records-subscribe.spec.d.ts.map +1 -1
  367. package/dist/types/tests/handlers/records-write.spec.d.ts.map +1 -1
  368. package/dist/types/tests/scenarios/deleted-record.spec.d.ts.map +1 -1
  369. package/dist/types/tests/scenarios/end-to-end-tests.spec.d.ts.map +1 -1
  370. package/dist/types/tests/scenarios/nested-roles.spec.d.ts.map +1 -1
  371. package/dist/types/tests/scenarios/subscriptions.spec.d.ts.map +1 -1
  372. package/dist/types/tests/store/message-store.spec.d.ts.map +1 -1
  373. package/dist/types/tests/test-event-stream.d.ts +1 -1
  374. package/dist/types/tests/test-event-stream.d.ts.map +1 -1
  375. package/dist/types/tests/test-stores.d.ts +5 -4
  376. package/dist/types/tests/test-stores.d.ts.map +1 -1
  377. package/dist/types/tests/test-suite.d.ts +1 -2
  378. package/dist/types/tests/test-suite.d.ts.map +1 -1
  379. package/dist/types/tests/utils/test-data-generator.d.ts +20 -1
  380. package/dist/types/tests/utils/test-data-generator.d.ts.map +1 -1
  381. package/dist/types/tests/utils/test-validation-state-reader.d.ts +15 -0
  382. package/dist/types/tests/utils/test-validation-state-reader.d.ts.map +1 -0
  383. package/package.json +2 -2
  384. package/src/core/core-protocol.ts +3 -3
  385. package/src/core/dwn-constant.ts +7 -1
  386. package/src/core/dwn-error.ts +12 -4
  387. package/src/core/grant-authorization.ts +11 -20
  388. package/src/core/message-reply.ts +6 -5
  389. package/src/core/messages-grant-authorization.ts +37 -70
  390. package/src/core/protocol-authorization-action.ts +29 -38
  391. package/src/core/protocol-authorization-validation.ts +39 -96
  392. package/src/core/protocol-authorization.ts +56 -202
  393. package/src/core/protocols-grant-authorization.ts +9 -9
  394. package/src/core/recording-validation-state-reader.ts +130 -0
  395. package/src/core/records-grant-authorization.ts +16 -16
  396. package/src/core/replication-apply.ts +172 -32
  397. package/src/core/resumable-task-manager.ts +10 -8
  398. package/src/core/validation-state-reader.ts +350 -0
  399. package/src/dwn.ts +285 -192
  400. package/src/enums/dwn-interface-method.ts +0 -1
  401. package/src/event-stream/durable-event-log.ts +509 -0
  402. package/src/event-stream/event-emitter-wake-publisher.ts +34 -0
  403. package/src/handlers/messages-query.ts +203 -0
  404. package/src/handlers/messages-read.ts +9 -10
  405. package/src/handlers/messages-subscribe.ts +12 -13
  406. package/src/handlers/protocols-configure.ts +37 -58
  407. package/src/handlers/protocols-query.ts +1 -1
  408. package/src/handlers/records-count.ts +24 -17
  409. package/src/handlers/records-delete.ts +29 -27
  410. package/src/handlers/records-query.ts +38 -17
  411. package/src/handlers/records-read.ts +63 -50
  412. package/src/handlers/records-subscribe.ts +132 -19
  413. package/src/handlers/records-write.ts +77 -168
  414. package/src/index.ts +14 -17
  415. package/src/interfaces/messages-query.ts +70 -0
  416. package/src/interfaces/protocols-configure.ts +12 -4
  417. package/src/interfaces/protocols-query.ts +4 -5
  418. package/src/interfaces/records-count.ts +9 -4
  419. package/src/interfaces/records-delete.ts +25 -5
  420. package/src/interfaces/records-query.ts +9 -4
  421. package/src/interfaces/records-read.ts +4 -4
  422. package/src/interfaces/records-subscribe.ts +9 -4
  423. package/src/interfaces/records-write.ts +41 -13
  424. package/src/protocols/permissions.ts +32 -52
  425. package/src/store/index-level.ts +30 -9
  426. package/src/store/level-wrapper.ts +9 -1
  427. package/src/store/message-store-level.ts +757 -47
  428. package/src/store/storage-controller.ts +74 -63
  429. package/src/types/message-store.ts +45 -2
  430. package/src/types/message-types.ts +3 -1
  431. package/src/types/messages-types.ts +26 -45
  432. package/src/types/method-handler.ts +3 -3
  433. package/src/types/permission-types.ts +1 -1
  434. package/src/types/subscriptions.ts +53 -42
  435. package/src/types/validation-state-reader.ts +127 -0
  436. package/src/utils/messages.ts +25 -1
  437. package/src/utils/record-limit-occupancy.ts +377 -0
  438. package/src/utils/records.ts +69 -13
  439. package/src/utils/replication.ts +122 -0
  440. package/dist/esm/src/core/record-chain.js +0 -64
  441. package/dist/esm/src/core/record-chain.js.map +0 -1
  442. package/dist/esm/src/event-stream/event-emitter-event-log.js +0 -334
  443. package/dist/esm/src/event-stream/event-emitter-event-log.js.map +0 -1
  444. package/dist/esm/src/handlers/messages-sync.js +0 -278
  445. package/dist/esm/src/handlers/messages-sync.js.map +0 -1
  446. package/dist/esm/src/interfaces/messages-sync.js.map +0 -1
  447. package/dist/esm/src/smt/smt-store-level.js +0 -103
  448. package/dist/esm/src/smt/smt-store-level.js.map +0 -1
  449. package/dist/esm/src/smt/smt-store-memory.js +0 -41
  450. package/dist/esm/src/smt/smt-store-memory.js.map +0 -1
  451. package/dist/esm/src/smt/smt-utils.js +0 -129
  452. package/dist/esm/src/smt/smt-utils.js.map +0 -1
  453. package/dist/esm/src/smt/sparse-merkle-tree.js +0 -577
  454. package/dist/esm/src/smt/sparse-merkle-tree.js.map +0 -1
  455. package/dist/esm/src/state-index/state-index-level.js +0 -191
  456. package/dist/esm/src/state-index/state-index-level.js.map +0 -1
  457. package/dist/esm/src/types/smt-types.js +0 -5
  458. package/dist/esm/src/types/smt-types.js.map +0 -1
  459. package/dist/esm/src/types/state-index.js +0 -2
  460. package/dist/esm/src/types/state-index.js.map +0 -1
  461. package/dist/esm/tests/event-emitter-event-log.spec.js +0 -499
  462. package/dist/esm/tests/event-emitter-event-log.spec.js.map +0 -1
  463. package/dist/esm/tests/handlers/messages-sync.spec.js +0 -1088
  464. package/dist/esm/tests/handlers/messages-sync.spec.js.map +0 -1
  465. package/dist/esm/tests/smt/smt-store-level.spec.js +0 -132
  466. package/dist/esm/tests/smt/smt-store-level.spec.js.map +0 -1
  467. package/dist/esm/tests/smt/sparse-merkle-tree.spec.js +0 -732
  468. package/dist/esm/tests/smt/sparse-merkle-tree.spec.js.map +0 -1
  469. package/dist/esm/tests/state-index/state-index-level.spec.js +0 -245
  470. package/dist/esm/tests/state-index/state-index-level.spec.js.map +0 -1
  471. package/dist/types/src/core/record-chain.d.ts +0 -24
  472. package/dist/types/src/core/record-chain.d.ts.map +0 -1
  473. package/dist/types/src/event-stream/event-emitter-event-log.d.ts +0 -80
  474. package/dist/types/src/event-stream/event-emitter-event-log.d.ts.map +0 -1
  475. package/dist/types/src/handlers/messages-sync.d.ts +0 -39
  476. package/dist/types/src/handlers/messages-sync.d.ts.map +0 -1
  477. package/dist/types/src/interfaces/messages-sync.d.ts +0 -20
  478. package/dist/types/src/interfaces/messages-sync.d.ts.map +0 -1
  479. package/dist/types/src/smt/smt-store-level.d.ts +0 -32
  480. package/dist/types/src/smt/smt-store-level.d.ts.map +0 -1
  481. package/dist/types/src/smt/smt-store-memory.d.ts +0 -22
  482. package/dist/types/src/smt/smt-store-memory.d.ts.map +0 -1
  483. package/dist/types/src/smt/smt-utils.d.ts +0 -58
  484. package/dist/types/src/smt/smt-utils.d.ts.map +0 -1
  485. package/dist/types/src/smt/sparse-merkle-tree.d.ts +0 -124
  486. package/dist/types/src/smt/sparse-merkle-tree.d.ts.map +0 -1
  487. package/dist/types/src/state-index/state-index-level.d.ts +0 -83
  488. package/dist/types/src/state-index/state-index-level.d.ts.map +0 -1
  489. package/dist/types/src/types/smt-types.d.ts +0 -81
  490. package/dist/types/src/types/smt-types.d.ts.map +0 -1
  491. package/dist/types/src/types/state-index.d.ts +0 -90
  492. package/dist/types/src/types/state-index.d.ts.map +0 -1
  493. package/dist/types/tests/event-emitter-event-log.spec.d.ts +0 -2
  494. package/dist/types/tests/event-emitter-event-log.spec.d.ts.map +0 -1
  495. package/dist/types/tests/handlers/messages-sync.spec.d.ts +0 -2
  496. package/dist/types/tests/handlers/messages-sync.spec.d.ts.map +0 -1
  497. package/dist/types/tests/smt/smt-store-level.spec.d.ts +0 -2
  498. package/dist/types/tests/smt/smt-store-level.spec.d.ts.map +0 -1
  499. package/dist/types/tests/smt/sparse-merkle-tree.spec.d.ts +0 -2
  500. package/dist/types/tests/smt/sparse-merkle-tree.spec.d.ts.map +0 -1
  501. package/dist/types/tests/state-index/state-index-level.spec.d.ts +0 -2
  502. package/dist/types/tests/state-index/state-index-level.spec.d.ts.map +0 -1
  503. package/src/core/record-chain.ts +0 -99
  504. package/src/event-stream/event-emitter-event-log.ts +0 -430
  505. package/src/handlers/messages-sync.ts +0 -403
  506. package/src/interfaces/messages-sync.ts +0 -69
  507. package/src/smt/smt-store-level.ts +0 -143
  508. package/src/smt/smt-store-memory.ts +0 -53
  509. package/src/smt/smt-utils.ts +0 -149
  510. package/src/smt/sparse-merkle-tree.ts +0 -698
  511. package/src/state-index/state-index-level.ts +0 -239
  512. package/src/types/smt-types.ts +0 -95
  513. package/src/types/state-index.ts +0 -100
@@ -1,403 +0,0 @@
1
- import type { GenericMessage } from '../types/message-types.js';
2
- import type { MessageStore } from '../types/message-store.js';
3
- import type { StateIndex } from '../types/state-index.js';
4
- import type { HandlerDependencies, MethodHandler } from '../types/method-handler.js';
5
- import type { MessagesSyncDiffEntry, MessagesSyncMessage, MessagesSyncReply } from '../types/messages-types.js';
6
-
7
- import { authenticate } from '../core/auth.js';
8
- import { DwnConstant } from '../core/dwn-constant.js';
9
- import { Encoder } from '../utils/encoder.js';
10
- import { hashToHex } from '../smt/smt-utils.js';
11
- import { Message } from '../core/message.js';
12
- import { messageReplyFromError } from '../core/message-reply.js';
13
- import { MessagesGrantAuthorization } from '../core/messages-grant-authorization.js';
14
- import { MessagesSync } from '../interfaces/messages-sync.js';
15
- import { Records } from '../utils/records.js';
16
- import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
17
-
18
- /**
19
- * Maximum inline data size for diff responses, aligned with the
20
- * {@link DwnConstant.maxDataSizeAllowedToBeEncoded} threshold.
21
- */
22
- const DEFAULT_MAX_INLINE_DATA_SIZE = DwnConstant.maxDataSizeAllowedToBeEncoded;
23
-
24
- type StoredMessageWithEncodedData = GenericMessage & { encodedData?: string };
25
-
26
- export class MessagesSyncHandler implements MethodHandler {
27
-
28
- private _defaultHashHexCache?: Map<number, string>;
29
-
30
- constructor(private readonly deps: HandlerDependencies) { }
31
-
32
- public async handle({
33
- tenant,
34
- message
35
- }: { tenant: string, message: MessagesSyncMessage }): Promise<MessagesSyncReply> {
36
- let messagesSync: MessagesSync;
37
-
38
- try {
39
- messagesSync = await MessagesSync.parse(message);
40
- } catch (e) {
41
- return messageReplyFromError(e, 400);
42
- }
43
-
44
- try {
45
- await authenticate(message.authorization, this.deps.didResolver);
46
- await MessagesSyncHandler.authorizeMessagesSync(tenant, messagesSync, this.deps.messageStore);
47
- } catch (e) {
48
- return messageReplyFromError(e, 401);
49
- }
50
-
51
- try {
52
- switch (message.descriptor.action) {
53
- case 'root':
54
- return await this.handleRoot(tenant, message);
55
-
56
- case 'subtree':
57
- return await this.handleSubtree(tenant, message);
58
-
59
- case 'leaves':
60
- return await this.handleLeaves(tenant, message);
61
-
62
- case 'diff':
63
- return await this.handleDiff(tenant, message);
64
-
65
- default:
66
- return {
67
- status: { code: 400, detail: `Unknown action: ${message.descriptor.action as string}` },
68
- };
69
- }
70
- } catch (e) {
71
- return messageReplyFromError(e, 500);
72
- }
73
- }
74
-
75
- private async handleRoot(
76
- tenant: string,
77
- message: MessagesSyncMessage,
78
- ): Promise<MessagesSyncReply> {
79
- const root = hashToHex(await this.getIndexedRootHash(tenant, message.descriptor.protocol));
80
- return {
81
- status: { code: 200, detail: 'OK' },
82
- root,
83
- };
84
- }
85
-
86
- private async handleSubtree(
87
- tenant: string,
88
- message: MessagesSyncMessage,
89
- ): Promise<MessagesSyncReply> {
90
- const bitPath = MessagesSyncHandler.parseBitPrefix(message.descriptor.prefix!);
91
- const hash = await MessagesSyncHandler.getIndexedSubtreeHash(
92
- this.deps.stateIndex!,
93
- tenant,
94
- message.descriptor.protocol,
95
- bitPath,
96
- );
97
-
98
- return {
99
- status : { code: 200, detail: 'OK' },
100
- hash : hashToHex(hash),
101
- };
102
- }
103
-
104
- private async handleLeaves(
105
- tenant: string,
106
- message: MessagesSyncMessage,
107
- ): Promise<MessagesSyncReply> {
108
- const bitPath = MessagesSyncHandler.parseBitPrefix(message.descriptor.prefix!);
109
- const leaves = await MessagesSyncHandler.getIndexedLeaves(
110
- this.deps.stateIndex!,
111
- tenant,
112
- message.descriptor.protocol,
113
- bitPath,
114
- );
115
-
116
- return {
117
- status : { code: 200, detail: 'OK' },
118
- entries : leaves,
119
- };
120
- }
121
-
122
- /**
123
- * Computes a single-round diff between the client's sparse Merkle tree view
124
- * and this DWN's full/protocol StateIndex tree.
125
- */
126
- private async handleDiff(
127
- tenant: string,
128
- message: MessagesSyncMessage,
129
- ): Promise<MessagesSyncReply> {
130
- const { protocol, hashes: clientHashes, depth } = message.descriptor;
131
-
132
- if (!clientHashes || depth === undefined) {
133
- return {
134
- status: { code: 400, detail: 'diff action requires hashes and depth' },
135
- };
136
- }
137
-
138
- const onlyRemoteCids: string[] = [];
139
- const onlyLocalPrefixes: string[] = [];
140
- const defaultHashHex = await this.getDefaultHashHex(depth);
141
- const allPrefixes = new Set<string>();
142
-
143
- for (const [prefix, hash] of Object.entries(clientHashes)) {
144
- if (hash !== defaultHashHex) {
145
- allPrefixes.add(prefix);
146
- }
147
- }
148
-
149
- const serverHashes = await this.collectSubtreeHashes(tenant, protocol, depth);
150
- for (const prefix of Object.keys(serverHashes)) {
151
- allPrefixes.add(prefix);
152
- }
153
-
154
- for (const prefix of allPrefixes) {
155
- const clientHash = clientHashes[prefix];
156
- const serverHash = serverHashes[prefix];
157
-
158
- if (clientHash === serverHash) {
159
- continue;
160
- }
161
-
162
- if (serverHash === undefined) {
163
- onlyLocalPrefixes.push(prefix);
164
- continue;
165
- }
166
-
167
- const bitPath = MessagesSyncHandler.parseBitPrefix(prefix);
168
- const serverLeaves = await MessagesSyncHandler.getIndexedLeaves(
169
- this.deps.stateIndex!,
170
- tenant,
171
- protocol,
172
- bitPath,
173
- );
174
-
175
- onlyRemoteCids.push(...serverLeaves);
176
- if (clientHash !== undefined) {
177
- onlyLocalPrefixes.push(prefix);
178
- }
179
- }
180
-
181
- return {
182
- status : { code: 200, detail: 'OK' },
183
- onlyRemote : await this.buildDiffEntries(tenant, onlyRemoteCids),
184
- onlyLocal : onlyLocalPrefixes,
185
- };
186
- }
187
-
188
- private async getIndexedRootHash(
189
- tenant: string,
190
- protocol: string | undefined
191
- ): Promise<Uint8Array> {
192
- if (protocol === undefined) {
193
- return this.deps.stateIndex!.getRoot(tenant);
194
- }
195
-
196
- return this.deps.stateIndex!.getProtocolRoot(tenant, protocol);
197
- }
198
-
199
- /**
200
- * Walks this DWN's StateIndex tree to the requested depth and returns only
201
- * non-empty subtree hashes keyed by bit prefix.
202
- */
203
- private async collectSubtreeHashes(
204
- tenant: string,
205
- protocol: string | undefined,
206
- depth: number,
207
- ): Promise<Record<string, string>> {
208
- const result: Record<string, string> = {};
209
-
210
- const walk = async (prefix: string, currentDepth: number): Promise<void> => {
211
- const bitPath = MessagesSyncHandler.parseBitPrefix(prefix);
212
- const hash = await MessagesSyncHandler.getIndexedSubtreeHash(
213
- this.deps.stateIndex!,
214
- tenant,
215
- protocol,
216
- bitPath,
217
- );
218
- const hexHash = hashToHex(hash);
219
- const defaultHashHex = await this.getDefaultHashHex(currentDepth);
220
-
221
- if (hexHash === defaultHashHex) {
222
- return;
223
- }
224
-
225
- if (currentDepth >= depth) {
226
- result[prefix] = hexHash;
227
- return;
228
- }
229
-
230
- await Promise.all([
231
- walk(prefix + '0', currentDepth + 1),
232
- walk(prefix + '1', currentDepth + 1),
233
- ]);
234
- };
235
-
236
- await walk('', 0);
237
- return result;
238
- }
239
-
240
- private static async getIndexedLeaves(
241
- stateIndex: StateIndex,
242
- tenant: string,
243
- protocol: string | undefined,
244
- bitPath: boolean[]
245
- ): Promise<string[]> {
246
- if (protocol === undefined) {
247
- return stateIndex.getLeaves(tenant, bitPath);
248
- }
249
-
250
- return stateIndex.getProtocolLeaves(tenant, protocol, bitPath);
251
- }
252
-
253
- private static async getIndexedSubtreeHash(
254
- stateIndex: StateIndex,
255
- tenant: string,
256
- protocol: string | undefined,
257
- bitPath: boolean[]
258
- ): Promise<Uint8Array> {
259
- if (protocol === undefined) {
260
- return stateIndex.getSubtreeHash(tenant, bitPath);
261
- }
262
-
263
- return stateIndex.getProtocolSubtreeHash(tenant, protocol, bitPath);
264
- }
265
-
266
- private async getDefaultHashHex(depth: number): Promise<string> {
267
- if (this._defaultHashHexCache === undefined) {
268
- const { initDefaultHashes } = await import('../smt/smt-utils.js');
269
- const defaults = await initDefaultHashes();
270
- this._defaultHashHexCache = new Map<number, string>();
271
- for (let d = 0; d <= 256; d++) {
272
- this._defaultHashHexCache.set(d, hashToHex(defaults[d]));
273
- }
274
- }
275
- return this._defaultHashHexCache.get(depth) ?? '';
276
- }
277
-
278
- /**
279
- * Builds diff entries and inlines data when it is small enough for the
280
- * MessagesSync response. Large record data remains fetch-by-CID.
281
- */
282
- private async buildDiffEntries(
283
- tenant: string,
284
- messageCids: string[],
285
- ): Promise<MessagesSyncDiffEntry[]> {
286
- const entries: MessagesSyncDiffEntry[] = [];
287
-
288
- for (const messageCid of messageCids) {
289
- const { message, encodedData: inlineData, data } = await this.readMessageByCid(tenant, messageCid);
290
- if (!message) {
291
- continue;
292
- }
293
-
294
- const entry: MessagesSyncDiffEntry = { messageCid, message };
295
-
296
- if (inlineData) {
297
- entry.encodedData = inlineData;
298
- } else if (data) {
299
- const bytes = await MessagesSyncHandler.streamToBytes(data);
300
- if (bytes.byteLength <= DEFAULT_MAX_INLINE_DATA_SIZE) {
301
- entry.encodedData = Encoder.bytesToBase64Url(bytes);
302
- }
303
- }
304
-
305
- entries.push(entry);
306
- }
307
-
308
- return entries;
309
- }
310
-
311
- private async readMessageByCid(
312
- tenant: string,
313
- messageCid: string,
314
- ): Promise<{ message?: GenericMessage; encodedData?: string; data?: ReadableStream<Uint8Array> }> {
315
- const storedMessage = await this.deps.messageStore.get(tenant, messageCid);
316
- if (!storedMessage) {
317
- return {};
318
- }
319
-
320
- let inlineEncodedData: string | undefined;
321
- if (MessagesSyncHandler.hasEncodedData(storedMessage)) {
322
- inlineEncodedData = storedMessage.encodedData;
323
- delete storedMessage.encodedData;
324
- }
325
-
326
- let data: ReadableStream<Uint8Array> | undefined;
327
- if (inlineEncodedData === undefined && Records.isRecordsWrite(storedMessage)) {
328
- const { dataCid, dataSize } = storedMessage.descriptor;
329
- if (dataSize <= DEFAULT_MAX_INLINE_DATA_SIZE && this.deps.dataStore) {
330
- const dataResult = await this.deps.dataStore.get(tenant, storedMessage.recordId, dataCid);
331
- data = dataResult?.dataStream;
332
- }
333
- }
334
-
335
- return { message: storedMessage, encodedData: inlineEncodedData, data };
336
- }
337
-
338
- private static hasEncodedData(message: GenericMessage): message is StoredMessageWithEncodedData {
339
- return 'encodedData' in message && typeof message.encodedData === 'string';
340
- }
341
-
342
- private static async streamToBytes(stream: ReadableStream<Uint8Array>): Promise<Uint8Array> {
343
- const reader = stream.getReader();
344
- const chunks: Uint8Array[] = [];
345
- let totalSize = 0;
346
-
347
- for (;;) {
348
- const { done, value } = await reader.read();
349
- if (done) { break; }
350
- chunks.push(value);
351
- totalSize += value.byteLength;
352
- }
353
-
354
- const result = new Uint8Array(totalSize);
355
- let offset = 0;
356
- for (const chunk of chunks) {
357
- result.set(chunk, offset);
358
- offset += chunk.byteLength;
359
- }
360
- return result;
361
- }
362
-
363
- private static parseBitPrefix(prefix: string): boolean[] {
364
- if (!/^[01]*$/.test(prefix)) {
365
- throw new DwnError(
366
- DwnErrorCode.MessagesSyncInvalidPrefix,
367
- `Invalid prefix: must contain only '0' and '1' characters, got: ${prefix}`
368
- );
369
- }
370
- if (prefix.length > 256) {
371
- throw new DwnError(
372
- DwnErrorCode.MessagesSyncInvalidPrefix,
373
- `Invalid prefix: length must be <= 256, got: ${prefix.length}`
374
- );
375
- }
376
- return Array.from(prefix, (ch): boolean => ch === '1');
377
- }
378
-
379
- private static async authorizeMessagesSync(
380
- tenant: string,
381
- messagesSync: MessagesSync,
382
- messageStore: MessageStore
383
- ): Promise<void> {
384
- if (messagesSync.author === tenant) {
385
- return;
386
- }
387
-
388
- const permissionGrantIds = Message.getPermissionGrantIds(messagesSync.signaturePayload!);
389
- if (messagesSync.author !== undefined && permissionGrantIds.length > 0) {
390
- const permissionGrants = await MessagesGrantAuthorization.fetchPermissionGrants(tenant, messageStore, permissionGrantIds);
391
- await MessagesGrantAuthorization.authorizeSubscribeOrSync({
392
- incomingMessage : messagesSync.message,
393
- expectedGrantor : tenant,
394
- expectedGrantee : messagesSync.author,
395
- permissionGrants,
396
- messageStore
397
- });
398
- return;
399
- }
400
-
401
- throw new DwnError(DwnErrorCode.MessagesSyncAuthorizationFailed, 'message failed authorization');
402
- }
403
- }
@@ -1,69 +0,0 @@
1
- import type { MessageSigner } from '../types/signer.js';
2
- import type { MessagesSyncAction, MessagesSyncDescriptor, MessagesSyncMessage } from '../types/messages-types.js';
3
-
4
- import { AbstractMessage } from '../core/abstract-message.js';
5
- import { Message } from '../core/message.js';
6
- import { removeUndefinedProperties } from '@enbox/common';
7
- import { Time } from '../utils/time.js';
8
- import { validateProtocolUrlNormalized } from '../utils/url.js';
9
- import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
10
-
11
- export type MessagesSyncOptions = {
12
- signer : MessageSigner;
13
- action : MessagesSyncAction;
14
- protocol? : string;
15
- prefix? : string;
16
- messageTimestamp? : string;
17
- permissionGrantIds? : string[];
18
- /** For `action: 'diff'`: client's subtree hashes at `depth`. */
19
- hashes? : Record<string, string>;
20
- /** For `action: 'diff'`: bit depth at which hashes were computed. */
21
- depth? : number;
22
- };
23
-
24
- export class MessagesSync extends AbstractMessage<MessagesSyncMessage> {
25
-
26
- public static async parse(message: MessagesSyncMessage): Promise<MessagesSync> {
27
- Message.validateJsonSchema(message);
28
- await Message.validateSignatureStructure(message.authorization.signature, message.descriptor);
29
-
30
- if (message.descriptor.protocol !== undefined) {
31
- validateProtocolUrlNormalized(message.descriptor.protocol);
32
- }
33
-
34
- return new MessagesSync(message);
35
- }
36
-
37
- public static async create(options: MessagesSyncOptions): Promise<MessagesSync> {
38
- const permissionGrantInvocation = Message.normalizePermissionGrantInvocation({
39
- permissionGrantIds: options.permissionGrantIds
40
- });
41
-
42
- const descriptor: MessagesSyncDescriptor = {
43
- interface : DwnInterfaceName.Messages,
44
- method : DwnMethodName.Sync,
45
- messageTimestamp : options.messageTimestamp ?? Time.getCurrentTimestamp(),
46
- action : options.action,
47
- protocol : options.protocol,
48
- prefix : options.prefix,
49
- hashes : options.hashes,
50
- depth : options.depth,
51
- ...permissionGrantInvocation,
52
- };
53
-
54
- removeUndefinedProperties(descriptor);
55
-
56
- const { signer } = options;
57
- const authorization = await Message.createAuthorization({
58
- descriptor,
59
- signer,
60
- ...permissionGrantInvocation
61
- });
62
-
63
- const message = { descriptor, authorization };
64
-
65
- Message.validateJsonSchema(message);
66
-
67
- return new MessagesSync(message);
68
- }
69
- }
@@ -1,143 +0,0 @@
1
- /**
2
- * LevelDB-backed implementation of SMTNodeStore.
3
- *
4
- * Storage layout:
5
- * - Nodes are stored under the 'nodes' sublevel, keyed by hex-encoded hash
6
- * - The root hash is stored under the 'meta' sublevel with key 'root'
7
- * - Node values are JSON-serialized, with Uint8Array fields encoded as hex strings
8
- *
9
- * This store wraps a LevelWrapper sublevel provided by the parent (e.g. StateIndexLevel).
10
- * The parent manages the LevelDB lifecycle; open()/close() here only handle partition setup.
11
- */
12
-
13
- import type { Hash, SMTInternalNode, SMTLeafNode, SMTNode, SMTNodeStore } from '../types/smt-types.js';
14
-
15
- import type { LevelWrapper } from '../store/level-wrapper.js';
16
-
17
- import { hashToHex, hexToHash } from './smt-utils.js';
18
-
19
- type SerializedInternalNode = {
20
- type : 'internal';
21
- leftHash : string;
22
- rightHash : string;
23
- };
24
-
25
- type SerializedLeafNode = {
26
- type : 'leaf';
27
- keyHash : string;
28
- valueCid : string;
29
- };
30
-
31
- type SerializedNode = SerializedInternalNode | SerializedLeafNode;
32
-
33
- export class SMTStoreLevel implements SMTNodeStore {
34
- private readonly db: LevelWrapper<string>;
35
- private nodesPartition!: LevelWrapper<string>;
36
- private metaPartition!: LevelWrapper<string>;
37
- private initialized = false;
38
-
39
- constructor(sublevel: LevelWrapper<string>) {
40
- this.db = sublevel;
41
- }
42
-
43
- async open(): Promise<void> {
44
- this.nodesPartition = await this.db.partition('nodes');
45
- this.metaPartition = await this.db.partition('meta');
46
- this.initialized = true;
47
- }
48
-
49
- async close(): Promise<void> {
50
- this.initialized = false;
51
- }
52
-
53
- async clear(): Promise<void> {
54
- await this.db.clear();
55
- // Re-create partitions after clear
56
- this.nodesPartition = await this.db.partition('nodes');
57
- this.metaPartition = await this.db.partition('meta');
58
- }
59
-
60
- async getNode(hash: Hash): Promise<SMTNode | undefined> {
61
- this.ensureInitialized();
62
-
63
- const key = hashToHex(hash);
64
- const value = await this.nodesPartition.get(key);
65
- if (value === undefined) {
66
- return undefined;
67
- }
68
-
69
- return this.deserializeNode(JSON.parse(value) as SerializedNode);
70
- }
71
-
72
- async putNode(hash: Hash, node: SMTNode): Promise<void> {
73
- this.ensureInitialized();
74
-
75
- const key = hashToHex(hash);
76
- const serialized = this.serializeNode(node);
77
- await this.nodesPartition.put(key, JSON.stringify(serialized));
78
- }
79
-
80
- async deleteNode(hash: Hash): Promise<void> {
81
- this.ensureInitialized();
82
-
83
- const key = hashToHex(hash);
84
- await this.nodesPartition.delete(key);
85
- }
86
-
87
- async getRoot(): Promise<Hash | undefined> {
88
- this.ensureInitialized();
89
-
90
- const rootHex = await this.metaPartition.get('root');
91
- if (rootHex === undefined) {
92
- return undefined;
93
- }
94
-
95
- return hexToHash(rootHex);
96
- }
97
-
98
- async setRoot(hash: Hash): Promise<void> {
99
- this.ensureInitialized();
100
-
101
- await this.metaPartition.put('root', hashToHex(hash));
102
- }
103
-
104
- private ensureInitialized(): void {
105
- if (!this.initialized) {
106
- throw new Error('SMTStoreLevel not initialized. Call open() first.');
107
- }
108
- }
109
-
110
- private serializeNode(node: SMTNode): SerializedNode {
111
- if (node.type === 'internal') {
112
- return {
113
- type : 'internal',
114
- leftHash : hashToHex(node.leftHash),
115
- rightHash : hashToHex(node.rightHash),
116
- };
117
- }
118
-
119
- return {
120
- type : 'leaf',
121
- keyHash : hashToHex(node.keyHash),
122
- valueCid : node.valueCid,
123
- };
124
- }
125
-
126
- private deserializeNode(serialized: SerializedNode): SMTNode {
127
- if (serialized.type === 'internal') {
128
- const node: SMTInternalNode = {
129
- type : 'internal',
130
- leftHash : hexToHash(serialized.leftHash),
131
- rightHash : hexToHash(serialized.rightHash),
132
- };
133
- return node;
134
- }
135
-
136
- const node: SMTLeafNode = {
137
- type : 'leaf',
138
- keyHash : hexToHash(serialized.keyHash),
139
- valueCid : serialized.valueCid,
140
- };
141
- return node;
142
- }
143
- }
@@ -1,53 +0,0 @@
1
- /**
2
- * In-memory implementation of SMTNodeStore.
3
- * Useful for tests and lightweight/ephemeral use cases.
4
- */
5
-
6
- import type { Hash, SMTNode, SMTNodeStore } from '../types/smt-types.js';
7
-
8
- import { hashToHex } from './smt-utils.js';
9
-
10
- export class SMTStoreMemory implements SMTNodeStore {
11
- private readonly nodes: Map<string, SMTNode> = new Map();
12
- private root: Hash | undefined;
13
-
14
- async open(): Promise<void> {
15
- // no-op for in-memory store
16
- }
17
-
18
- async close(): Promise<void> {
19
- // no-op for in-memory store
20
- }
21
-
22
- async clear(): Promise<void> {
23
- this.nodes.clear();
24
- this.root = undefined;
25
- }
26
-
27
- async getNode(hash: Hash): Promise<SMTNode | undefined> {
28
- return this.nodes.get(hashToHex(hash));
29
- }
30
-
31
- async putNode(hash: Hash, node: SMTNode): Promise<void> {
32
- this.nodes.set(hashToHex(hash), node);
33
- }
34
-
35
- async deleteNode(hash: Hash): Promise<void> {
36
- this.nodes.delete(hashToHex(hash));
37
- }
38
-
39
- async getRoot(): Promise<Hash | undefined> {
40
- return this.root;
41
- }
42
-
43
- async setRoot(hash: Hash): Promise<void> {
44
- this.root = hash;
45
- }
46
-
47
- /**
48
- * Get the number of nodes currently stored (useful for tests).
49
- */
50
- get size(): number {
51
- return this.nodes.size;
52
- }
53
- }