@enbox/dwn-sdk-js 0.0.1 → 0.0.3

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 +26 -45
  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
@@ -1,7 +1,7 @@
1
1
  import type { MessageStore } from '../types/message-store.js';
2
2
  import type { PermissionGrant } from '../protocols/permission-grant.js';
3
3
  import type { PermissionConditions, RecordsPermissionScope } from '../types/permission-types.js';
4
- import type { RecordsDeleteMessage, RecordsQueryMessage, RecordsReadMessage, RecordsSubscribeMessage, RecordsWriteMessage } from '../types/records-types.js';
4
+ import type { RecordsCountMessage, RecordsDeleteMessage, RecordsQueryMessage, RecordsReadMessage, RecordsSubscribeMessage, RecordsWriteMessage } from '../types/records-types.js';
5
5
 
6
6
  import { GrantAuthorization } from './grant-authorization.js';
7
7
  import { PermissionConditionPublication } from '../types/permission-types.js';
@@ -69,7 +69,7 @@ export class RecordsGrantAuthorization {
69
69
  * @param messageStore Used to check if the grant has been revoked.
70
70
  */
71
71
  public static async authorizeQueryOrSubscribe(input: {
72
- incomingMessage: RecordsQueryMessage | RecordsSubscribeMessage,
72
+ incomingMessage: RecordsCountMessage | RecordsQueryMessage | RecordsSubscribeMessage,
73
73
  expectedGrantor: string,
74
74
  expectedGrantee: string,
75
75
  permissionGrant: PermissionGrant,
@@ -90,6 +90,7 @@ export class ResumableTaskManager {
90
90
 
91
91
  /**
92
92
  * Repeatedly retry the given tasks until all are completed successfully.
93
+ * Tasks are processed sequentially to avoid concurrent database write contention (e.g. SQLite's single-writer lock).
93
94
  */
94
95
  private async retryTasksUntilCompletion(resumableTasks: ManagedResumableTask[]): Promise<void> {
95
96
 
@@ -98,17 +99,15 @@ export class ResumableTaskManager {
98
99
  const managedTasksCopy = managedTasks;
99
100
  managedTasks = [];
100
101
 
101
- const allTaskPromises = managedTasksCopy.map(async (managedTask) => {
102
+ for (const managedTask of managedTasksCopy) {
102
103
  try {
103
104
  await this.runWithAutomaticTimeoutExtension(managedTask);
104
105
  } catch (error) {
105
106
  console.error('Error while running resumable task:', error);
106
- console.error('Resumable task:', resumableTasks);
107
+ console.error('Resumable task:', managedTask);
107
108
  managedTasks.push(managedTask);
108
109
  }
109
- });
110
-
111
- await Promise.all(allTaskPromises);
110
+ }
112
111
  }
113
112
  }
114
113
  }
package/src/dwn.ts CHANGED
@@ -1,27 +1,27 @@
1
1
 
2
2
  import type { DataStore } from './types/data-store.js';
3
3
  import type { DidResolver } from '@enbox/dids';
4
- import type { EventLog } from './types/event-log.js';
5
4
  import type { EventStream } from './types/subscriptions.js';
6
5
  import type { MessageStore } from './types/message-store.js';
7
6
  import type { MethodHandler } from './types/method-handler.js';
8
- import type { Readable } from 'readable-stream';
9
7
  import type { ResumableTaskStore } from './types/resumable-task-store.js';
8
+ import type { StateIndex } from './types/state-index.js';
10
9
  import type { TenantGate } from './core/tenant-gate.js';
11
10
  import type { UnionMessageReply } from './core/message-reply.js';
12
11
  import type { GenericMessage, GenericMessageReply } from './types/message-types.js';
13
- import type { MessagesQueryMessage, MessagesQueryReply, MessagesReadMessage, MessagesReadReply, MessagesSubscribeMessage, MessagesSubscribeMessageOptions, MessagesSubscribeReply, MessageSubscriptionHandler } from './types/messages-types.js';
12
+ import type { MessagesReadMessage, MessagesReadReply, MessagesSubscribeMessage, MessagesSubscribeMessageOptions, MessagesSubscribeReply, MessagesSyncMessage, MessagesSyncReply, MessageSubscriptionHandler } from './types/messages-types.js';
14
13
  import type { ProtocolsConfigureMessage, ProtocolsQueryMessage, ProtocolsQueryReply } from './types/protocols-types.js';
15
- import type { RecordsDeleteMessage, RecordsQueryMessage, RecordsQueryReply, RecordsReadMessage, RecordsReadReply, RecordsSubscribeMessage, RecordsSubscribeMessageOptions, RecordsSubscribeReply, RecordSubscriptionHandler, RecordsWriteMessage, RecordsWriteMessageOptions } from './types/records-types.js';
14
+ import type { RecordsCountMessage, RecordsCountReply, RecordsDeleteMessage, RecordsQueryMessage, RecordsQueryReply, RecordsReadMessage, RecordsReadReply, RecordsSubscribeMessage, RecordsSubscribeMessageOptions, RecordsSubscribeReply, RecordSubscriptionHandler, RecordsWriteMessage, RecordsWriteMessageOptions } from './types/records-types.js';
16
15
 
17
16
  import { AllowAllTenantGate } from './core/tenant-gate.js';
18
17
  import { Message } from './core/message.js';
19
18
  import { messageReplyFromError } from './core/message-reply.js';
20
- import { MessagesQueryHandler } from './handlers/messages-query.js';
21
19
  import { MessagesReadHandler } from './handlers/messages-read.js';
22
20
  import { MessagesSubscribeHandler } from './handlers/messages-subscribe.js';
21
+ import { MessagesSyncHandler } from './handlers/messages-sync.js';
23
22
  import { ProtocolsConfigureHandler } from './handlers/protocols-configure.js';
24
23
  import { ProtocolsQueryHandler } from './handlers/protocols-query.js';
24
+ import { RecordsCountHandler } from './handlers/records-count.js';
25
25
  import { RecordsDeleteHandler } from './handlers/records-delete.js';
26
26
  import { RecordsQueryHandler } from './handlers/records-query.js';
27
27
  import { RecordsReadHandler } from './handlers/records-read.js';
@@ -38,7 +38,7 @@ export class Dwn {
38
38
  private messageStore: MessageStore;
39
39
  private dataStore: DataStore;
40
40
  private resumableTaskStore: ResumableTaskStore;
41
- private eventLog: EventLog;
41
+ private stateIndex: StateIndex;
42
42
  private tenantGate: TenantGate;
43
43
  private eventStream?: EventStream;
44
44
  private storageController: StorageController;
@@ -51,12 +51,12 @@ export class Dwn {
51
51
  this.messageStore = config.messageStore;
52
52
  this.dataStore = config.dataStore;
53
53
  this.resumableTaskStore = config.resumableTaskStore;
54
- this.eventLog = config.eventLog;
54
+ this.stateIndex = config.stateIndex;
55
55
  this.eventStream = config.eventStream;
56
56
  this.storageController = new StorageController({
57
57
  messageStore : this.messageStore,
58
58
  dataStore : this.dataStore,
59
- eventLog : this.eventLog,
59
+ stateIndex : this.stateIndex,
60
60
  eventStream : this.eventStream
61
61
  });
62
62
  this.resumableTaskManager = new ResumableTaskManager(
@@ -65,11 +65,6 @@ export class Dwn {
65
65
  );
66
66
 
67
67
  this.methodHandlers = {
68
- [DwnInterfaceName.Messages + DwnMethodName.Query]: new MessagesQueryHandler(
69
- this.didResolver,
70
- this.messageStore,
71
- this.eventLog,
72
- ),
73
68
  [DwnInterfaceName.Messages + DwnMethodName.Read]: new MessagesReadHandler(
74
69
  this.didResolver,
75
70
  this.messageStore,
@@ -80,10 +75,15 @@ export class Dwn {
80
75
  this.messageStore,
81
76
  this.eventStream,
82
77
  ),
78
+ [DwnInterfaceName.Messages + DwnMethodName.Sync]: new MessagesSyncHandler(
79
+ this.didResolver,
80
+ this.messageStore,
81
+ this.stateIndex,
82
+ ),
83
83
  [DwnInterfaceName.Protocols + DwnMethodName.Configure]: new ProtocolsConfigureHandler(
84
84
  this.didResolver,
85
85
  this.messageStore,
86
- this.eventLog,
86
+ this.stateIndex,
87
87
  this.eventStream
88
88
  ),
89
89
  [DwnInterfaceName.Protocols + DwnMethodName.Query]: new ProtocolsQueryHandler(
@@ -91,6 +91,10 @@ export class Dwn {
91
91
  this.messageStore,
92
92
  this.dataStore
93
93
  ),
94
+ [DwnInterfaceName.Records + DwnMethodName.Count]: new RecordsCountHandler(
95
+ this.didResolver,
96
+ this.messageStore,
97
+ ),
94
98
  [DwnInterfaceName.Records + DwnMethodName.Delete]: new RecordsDeleteHandler(
95
99
  this.didResolver,
96
100
  this.messageStore,
@@ -115,7 +119,7 @@ export class Dwn {
115
119
  this.didResolver,
116
120
  this.messageStore,
117
121
  this.dataStore,
118
- this.eventLog,
122
+ this.stateIndex,
119
123
  this.eventStream
120
124
  )
121
125
  };
@@ -143,7 +147,7 @@ export class Dwn {
143
147
  await this.messageStore.open();
144
148
  await this.dataStore.open();
145
149
  await this.resumableTaskStore.open();
146
- await this.eventLog.open();
150
+ await this.stateIndex.open();
147
151
  await this.eventStream?.open();
148
152
 
149
153
  await this.resumableTaskManager.resumeTasksAndWaitForCompletion();
@@ -154,19 +158,20 @@ export class Dwn {
154
158
  await this.messageStore.close();
155
159
  await this.dataStore.close();
156
160
  await this.resumableTaskStore.close();
157
- await this.eventLog.close();
161
+ await this.stateIndex.close();
158
162
  }
159
163
 
160
164
  /**
161
165
  * Processes the given DWN message and returns with a reply.
162
166
  * @param tenant The tenant DID to route the given message to.
163
167
  */
164
- public async processMessage(tenant: string, rawMessage: MessagesQueryMessage): Promise<MessagesQueryReply>;
165
168
  public async processMessage(
166
169
  tenant: string, rawMessage: MessagesSubscribeMessage, options?: MessagesSubscribeMessageOptions): Promise<MessagesSubscribeReply>;
167
170
  public async processMessage(tenant: string, rawMessage: MessagesReadMessage): Promise<MessagesReadReply>;
171
+ public async processMessage(tenant: string, rawMessage: MessagesSyncMessage): Promise<MessagesSyncReply>;
168
172
  public async processMessage(tenant: string, rawMessage: ProtocolsConfigureMessage): Promise<GenericMessageReply>;
169
173
  public async processMessage(tenant: string, rawMessage: ProtocolsQueryMessage): Promise<ProtocolsQueryReply>;
174
+ public async processMessage(tenant: string, rawMessage: RecordsCountMessage): Promise<RecordsCountReply>;
170
175
  public async processMessage(tenant: string, rawMessage: RecordsDeleteMessage): Promise<GenericMessageReply>;
171
176
  public async processMessage(tenant: string, rawMessage: RecordsQueryMessage): Promise<RecordsQueryReply>;
172
177
  public async processMessage(
@@ -243,7 +248,7 @@ export class Dwn {
243
248
  * MessageOptions that are used when processing a message.
244
249
  */
245
250
  export interface MessageOptions {
246
- dataStream?: Readable;
251
+ dataStream?: ReadableStream<Uint8Array>;
247
252
  subscriptionHandler?: MessageSubscriptionHandler | RecordSubscriptionHandler;
248
253
  };
249
254
 
@@ -259,6 +264,6 @@ export type DwnConfig = {
259
264
 
260
265
  messageStore: MessageStore;
261
266
  dataStore: DataStore;
262
- eventLog: EventLog;
267
+ stateIndex: StateIndex;
263
268
  resumableTaskStore: ResumableTaskStore;
264
269
  };
@@ -6,9 +6,11 @@ export enum DwnInterfaceName {
6
6
 
7
7
  export enum DwnMethodName {
8
8
  Configure = 'Configure',
9
+ Count = 'Count',
10
+ Delete = 'Delete',
9
11
  Query = 'Query',
10
12
  Read = 'Read',
11
- Write = 'Write',
12
- Delete = 'Delete',
13
- Subscribe = 'Subscribe'
13
+ Subscribe = 'Subscribe',
14
+ Sync = 'Sync',
15
+ Write = 'Write'
14
16
  }
@@ -75,7 +75,7 @@ export class MessagesSubscribeHandler implements MethodHandler {
75
75
  return;
76
76
  } else if (messagesSubscribe.author !== undefined && messagesSubscribe.signaturePayload!.permissionGrantId !== undefined) {
77
77
  const permissionGrant = await PermissionsProtocol.fetchGrant(tenant, messageStore, messagesSubscribe.signaturePayload!.permissionGrantId);
78
- await MessagesGrantAuthorization.authorizeQueryOrSubscribe({
78
+ await MessagesGrantAuthorization.authorizeSubscribeOrSync({
79
79
  incomingMessage : messagesSubscribe.message,
80
80
  expectedGrantor : tenant,
81
81
  expectedGrantee : messagesSubscribe.author,
@@ -0,0 +1,129 @@
1
+ import type { DidResolver } from '@enbox/dids';
2
+ import type { MessageStore } from '../types/message-store.js';
3
+ import type { MethodHandler } from '../types/method-handler.js';
4
+ import type { StateIndex } from '../types/state-index.js';
5
+ import type { MessagesSyncMessage, MessagesSyncReply } from '../types/messages-types.js';
6
+
7
+ import { authenticate } from '../core/auth.js';
8
+ import { hashToHex } from '../smt/smt-utils.js';
9
+ import { messageReplyFromError } from '../core/message-reply.js';
10
+ import { MessagesGrantAuthorization } from '../core/messages-grant-authorization.js';
11
+ import { MessagesSync } from '../interfaces/messages-sync.js';
12
+ import { PermissionsProtocol } from '../protocols/permissions.js';
13
+ import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
14
+
15
+
16
+ export class MessagesSyncHandler implements MethodHandler {
17
+
18
+ constructor(
19
+ private didResolver: DidResolver,
20
+ private messageStore: MessageStore,
21
+ private stateIndex: StateIndex,
22
+ ) { }
23
+
24
+ public async handle({
25
+ tenant,
26
+ message
27
+ }: { tenant: string, message: MessagesSyncMessage }): Promise<MessagesSyncReply> {
28
+ let messagesSync: MessagesSync;
29
+
30
+ try {
31
+ messagesSync = await MessagesSync.parse(message);
32
+ } catch (e) {
33
+ return messageReplyFromError(e, 400);
34
+ }
35
+
36
+ try {
37
+ await authenticate(message.authorization, this.didResolver);
38
+ await MessagesSyncHandler.authorizeMessagesSync(tenant, messagesSync, this.messageStore);
39
+ } catch (e) {
40
+ return messageReplyFromError(e, 401);
41
+ }
42
+
43
+ const { action, protocol, prefix } = message.descriptor;
44
+
45
+ try {
46
+ switch (action) {
47
+ case 'root': {
48
+ const rootHash = protocol !== undefined
49
+ ? await this.stateIndex.getProtocolRoot(tenant, protocol)
50
+ : await this.stateIndex.getRoot(tenant);
51
+ return {
52
+ status : { code: 200, detail: 'OK' },
53
+ root : hashToHex(rootHash),
54
+ };
55
+ }
56
+
57
+ case 'subtree': {
58
+ const bitPath = MessagesSyncHandler.parseBitPrefix(prefix!);
59
+ const hash = protocol !== undefined
60
+ ? await this.stateIndex.getProtocolSubtreeHash(tenant, protocol, bitPath)
61
+ : await this.stateIndex.getSubtreeHash(tenant, bitPath);
62
+ return {
63
+ status : { code: 200, detail: 'OK' },
64
+ hash : hashToHex(hash),
65
+ };
66
+ }
67
+
68
+ case 'leaves': {
69
+ const bitPath = MessagesSyncHandler.parseBitPrefix(prefix!);
70
+ const leaves = protocol !== undefined
71
+ ? await this.stateIndex.getProtocolLeaves(tenant, protocol, bitPath)
72
+ : await this.stateIndex.getLeaves(tenant, bitPath);
73
+ return {
74
+ status : { code: 200, detail: 'OK' },
75
+ entries : leaves,
76
+ };
77
+ }
78
+
79
+ default: {
80
+ return {
81
+ status: { code: 400, detail: `Unknown action: ${action as string}` },
82
+ };
83
+ }
84
+ }
85
+ } catch (e) {
86
+ return messageReplyFromError(e, 500);
87
+ }
88
+ }
89
+
90
+ /**
91
+ * Parse a bit prefix string (e.g. "0110101") into a boolean array.
92
+ */
93
+ private static parseBitPrefix(prefix: string): boolean[] {
94
+ if (!/^[01]*$/.test(prefix)) {
95
+ throw new DwnError(
96
+ DwnErrorCode.MessagesSyncInvalidPrefix,
97
+ `Invalid prefix: must contain only '0' and '1' characters, got: ${prefix}`
98
+ );
99
+ }
100
+ if (prefix.length > 256) {
101
+ throw new DwnError(
102
+ DwnErrorCode.MessagesSyncInvalidPrefix,
103
+ `Invalid prefix: length must be <= 256, got: ${prefix.length}`
104
+ );
105
+ }
106
+ return Array.from(prefix, (ch): boolean => ch === '1');
107
+ }
108
+
109
+ private static async authorizeMessagesSync(
110
+ tenant: string,
111
+ messagesSync: MessagesSync,
112
+ messageStore: MessageStore
113
+ ): Promise<void> {
114
+ if (messagesSync.author === tenant) {
115
+ return;
116
+ } else if (messagesSync.author !== undefined && messagesSync.signaturePayload!.permissionGrantId !== undefined) {
117
+ const permissionGrant = await PermissionsProtocol.fetchGrant(tenant, messageStore, messagesSync.signaturePayload!.permissionGrantId);
118
+ await MessagesGrantAuthorization.authorizeSubscribeOrSync({
119
+ incomingMessage : messagesSync.message,
120
+ expectedGrantor : tenant,
121
+ expectedGrantee : messagesSync.author,
122
+ permissionGrant,
123
+ messageStore
124
+ });
125
+ } else {
126
+ throw new DwnError(DwnErrorCode.MessagesSyncAuthorizationFailed, 'message failed authorization');
127
+ }
128
+ }
129
+ }
@@ -1,10 +1,10 @@
1
1
  import type { DidResolver } from '@enbox/dids';
2
- import type { EventLog } from '../types/event-log.js';
3
2
  import type { EventStream } from '../types/subscriptions.js';
4
3
  import type { GenericMessageReply } from '../types/message-types.js';
5
4
  import type { MessageStore } from '../types//message-store.js';
6
5
  import type { MethodHandler } from '../types/method-handler.js';
7
- import type { ProtocolsConfigureMessage } from '../types/protocols-types.js';
6
+ import type { StateIndex } from '../types/state-index.js';
7
+ import type { ProtocolDefinition, ProtocolsConfigureMessage } from '../types/protocols-types.js';
8
8
 
9
9
  import { authenticate } from '../core/auth.js';
10
10
  import { Message } from '../core/message.js';
@@ -14,13 +14,14 @@ import { ProtocolsConfigure } from '../interfaces/protocols-configure.js';
14
14
  import { ProtocolsGrantAuthorization } from '../core/protocols-grant-authorization.js';
15
15
  import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
16
16
  import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
17
+ import { getRuleSetAtPath, parseCrossProtocolRef } from '../utils/protocols.js';
17
18
 
18
19
  export class ProtocolsConfigureHandler implements MethodHandler {
19
20
 
20
21
  constructor(
21
22
  private didResolver: DidResolver,
22
23
  private messageStore: MessageStore,
23
- private eventLog: EventLog,
24
+ private stateIndex: StateIndex,
24
25
  private eventStream?: EventStream
25
26
  ) { }
26
27
 
@@ -43,6 +44,16 @@ export class ProtocolsConfigureHandler implements MethodHandler {
43
44
  return messageReplyFromError(e, 401);
44
45
  }
45
46
 
47
+ // validate composition dependencies: all `uses` protocols must already be installed,
48
+ // `$ref` paths must exist in the referenced protocols, and cross-protocol roles must exist.
49
+ try {
50
+ await ProtocolsConfigureHandler.validateCompositionDependencies(
51
+ tenant, message.descriptor.definition, this.messageStore
52
+ );
53
+ } catch (e) {
54
+ return messageReplyFromError(e, 400);
55
+ }
56
+
46
57
  // attempt to get existing protocol
47
58
  const query = {
48
59
  interface : DwnInterfaceName.Protocols,
@@ -62,11 +73,11 @@ export class ProtocolsConfigureHandler implements MethodHandler {
62
73
  // write the incoming message to DB if incoming message is newest
63
74
  let messageReply: GenericMessageReply;
64
75
  if (incomingMessageIsNewest) {
65
- const indexes = ProtocolsConfigureHandler.constructIndexes(protocolsConfigure);
76
+ const indexes = ProtocolsConfigureHandler.constructIndexes(protocolsConfigure, true);
66
77
 
67
78
  await this.messageStore.put(tenant, message, indexes);
68
79
  const messageCid = await Message.getCid(message);
69
- await this.eventLog.append(tenant, messageCid, indexes);
80
+ await this.stateIndex.insert(tenant, messageCid, indexes);
70
81
 
71
82
  // only emit if the event stream is set
72
83
  if (this.eventStream !== undefined) {
@@ -77,28 +88,35 @@ export class ProtocolsConfigureHandler implements MethodHandler {
77
88
  status: { code: 202, detail: 'Accepted' }
78
89
  };
79
90
  } else {
91
+ // incoming message is older — still store it as a historical version (not the latest)
92
+ const indexes = ProtocolsConfigureHandler.constructIndexes(protocolsConfigure, false);
93
+
94
+ await this.messageStore.put(tenant, message, indexes);
95
+ const messageCid = await Message.getCid(message);
96
+ await this.stateIndex.insert(tenant, messageCid, indexes);
97
+
80
98
  messageReply = {
81
- status: { code: 409, detail: 'Conflict' }
99
+ status: { code: 202, detail: 'Accepted' }
82
100
  };
83
101
  }
84
102
 
85
- // delete all existing records that are smaller
86
- const deletedMessageCids: string[] = [];
87
- for (const message of existingMessages) {
88
- if (await Message.isNewer(newestMessage, message)) {
89
- const messageCid = await Message.getCid(message);
90
- deletedMessageCids.push(messageCid);
103
+ // re-index previously-latest messages as no longer the latest base state.
104
+ // We must delete and re-put (not just put) to properly replace old index entries.
105
+ for (const existingMessage of existingMessages) {
106
+ if (existingMessage !== newestMessage) {
107
+ const existingProtocolsConfigure = await ProtocolsConfigure.parse(existingMessage as ProtocolsConfigureMessage);
108
+ const updatedIndexes = ProtocolsConfigureHandler.constructIndexes(existingProtocolsConfigure, false);
109
+ const existingCid = await Message.getCid(existingMessage);
91
110
 
92
- await this.messageStore.delete(tenant, messageCid);
111
+ await this.messageStore.delete(tenant, existingCid);
112
+ await this.messageStore.put(tenant, existingMessage, updatedIndexes);
93
113
  }
94
114
  }
95
115
 
96
- await this.eventLog.deleteEventsByCid(tenant, deletedMessageCids);
97
-
98
116
  return messageReply;
99
117
  };
100
118
 
101
- static constructIndexes(protocolsConfigure: ProtocolsConfigure): { [key: string]: string | boolean } {
119
+ static constructIndexes(protocolsConfigure: ProtocolsConfigure, isLatestBaseState: boolean): { [key: string]: string | boolean } {
102
120
  // strip out `definition` as it is not indexable
103
121
  const { definition, ...propertiesToIndex } = protocolsConfigure.message.descriptor;
104
122
  const { author } = protocolsConfigure;
@@ -107,7 +125,8 @@ export class ProtocolsConfigureHandler implements MethodHandler {
107
125
  ...propertiesToIndex,
108
126
  author : author!,
109
127
  protocol : definition.protocol, // retain protocol url from `definition`,
110
- published : definition.published // retain published state from definition
128
+ published : definition.published, // retain published state from definition
129
+ isLatestBaseState,
111
130
  };
112
131
 
113
132
  return indexes;
@@ -134,4 +153,163 @@ export class ProtocolsConfigureHandler implements MethodHandler {
134
153
  throw new DwnError(DwnErrorCode.ProtocolsConfigureAuthorizationFailed, 'message failed authorization');
135
154
  }
136
155
  }
156
+
157
+ /**
158
+ * Validates composition dependencies at install time:
159
+ * 1. All `uses` protocols must already be installed for the tenant.
160
+ * 2. Each `$ref` path must exist in the referenced protocol's structure.
161
+ * 3. Cross-protocol role references must point to valid role paths in the referenced protocol.
162
+ *
163
+ * This is a no-op if the protocol definition has no `uses` map.
164
+ */
165
+ private static async validateCompositionDependencies(
166
+ tenant: string, definition: ProtocolDefinition, messageStore: MessageStore
167
+ ): Promise<void> {
168
+ const { uses } = definition;
169
+ if (uses === undefined) {
170
+ return;
171
+ }
172
+
173
+ // Fetch all referenced protocol definitions
174
+ const referencedDefinitions = new Map<string, ProtocolDefinition>();
175
+ for (const alias in uses) {
176
+ const protocolUri = uses[alias];
177
+ const refDefinition = await ProtocolsConfigureHandler.fetchInstalledProtocolDefinition(tenant, protocolUri, messageStore);
178
+
179
+ if (refDefinition === undefined) {
180
+ throw new DwnError(
181
+ DwnErrorCode.ProtocolsConfigureComposedProtocolNotInstalled,
182
+ `composed protocol '${protocolUri}' (alias '${alias}') is not installed for tenant '${tenant}'.`
183
+ );
184
+ }
185
+
186
+ referencedDefinitions.set(alias, refDefinition);
187
+ }
188
+
189
+ // Walk the structure and validate all $ref paths and cross-protocol role references
190
+ ProtocolsConfigureHandler.validateRefsAndRolesRecursively(definition.structure, '', referencedDefinitions);
191
+ }
192
+
193
+ /**
194
+ * Fetches the latest installed protocol definition for the given protocol URI.
195
+ * @returns The protocol definition, or `undefined` if not installed.
196
+ */
197
+ private static async fetchInstalledProtocolDefinition(
198
+ tenant: string, protocolUri: string, messageStore: MessageStore
199
+ ): Promise<ProtocolDefinition | undefined> {
200
+ const query = {
201
+ interface : DwnInterfaceName.Protocols,
202
+ method : DwnMethodName.Configure,
203
+ protocol : protocolUri,
204
+ isLatestBaseState : true
205
+ };
206
+ const { messages } = await messageStore.query(tenant, [query]);
207
+
208
+ if (messages.length === 0) {
209
+ return undefined;
210
+ }
211
+
212
+ return (messages[0] as ProtocolsConfigureMessage).descriptor.definition;
213
+ }
214
+
215
+ /**
216
+ * Recursively walks the structure tree to validate:
217
+ * - `$ref` type paths exist in the referenced protocol's structure
218
+ * - Cross-protocol `role` references point to valid `$role: true` paths in the referenced protocol
219
+ */
220
+ private static validateRefsAndRolesRecursively(
221
+ ruleSet: { [key: string]: any },
222
+ protocolPath: string,
223
+ referencedDefinitions: Map<string, ProtocolDefinition>
224
+ ): void {
225
+ for (const key in ruleSet) {
226
+ if (key.startsWith('$')) {
227
+ continue;
228
+ }
229
+
230
+ const childRuleSet = ruleSet[key];
231
+ const childProtocolPath = protocolPath === '' ? key : `${protocolPath}/${key}`;
232
+
233
+ // Validate $ref path exists in the referenced protocol
234
+ if (childRuleSet.$ref !== undefined) {
235
+ const parsed = parseCrossProtocolRef(childRuleSet.$ref);
236
+ if (parsed !== undefined) {
237
+ const refDefinition = referencedDefinitions.get(parsed.alias);
238
+ if (refDefinition === undefined) {
239
+ // Defensive: alias was validated by validateRefNode() and definition was fetched by validateCompositionDependencies()
240
+ throw new DwnError(
241
+ DwnErrorCode.ProtocolsConfigureInvalidRefAlias,
242
+ `'$ref' alias '${parsed.alias}' at protocol path '${childProtocolPath}' ` +
243
+ `was not found in the referenced definitions map.`
244
+ );
245
+ }
246
+
247
+ const targetRuleSet = getRuleSetAtPath(parsed.protocolPath, refDefinition.structure);
248
+ if (targetRuleSet === undefined) {
249
+ throw new DwnError(
250
+ DwnErrorCode.ProtocolsConfigureInvalidRefProtocolPath,
251
+ `'$ref' at protocol path '${childProtocolPath}' references type path '${parsed.protocolPath}' ` +
252
+ `which does not exist in protocol '${refDefinition.protocol}'.`
253
+ );
254
+ }
255
+ }
256
+ }
257
+
258
+ // Validate cross-protocol references in $actions (roles and `of` paths)
259
+ const actionRules = childRuleSet.$actions ?? [];
260
+ for (const actionRule of actionRules) {
261
+ // Validate cross-protocol role references
262
+ if (actionRule.role !== undefined) {
263
+ const parsed = parseCrossProtocolRef(actionRule.role);
264
+ if (parsed !== undefined) {
265
+ const refDefinition = referencedDefinitions.get(parsed.alias);
266
+ if (refDefinition === undefined) {
267
+ throw new DwnError(
268
+ DwnErrorCode.ProtocolsConfigureInvalidCrossProtocolRole,
269
+ `cross-protocol role alias '${parsed.alias}' in '${actionRule.role}' at protocol path '${childProtocolPath}' ` +
270
+ `was not found in the referenced definitions map.`
271
+ );
272
+ }
273
+
274
+ // Check that the role path exists and is marked $role: true in the referenced protocol
275
+ const roleRuleSet = getRuleSetAtPath(parsed.protocolPath, refDefinition.structure);
276
+ if (roleRuleSet === undefined || !roleRuleSet.$role) {
277
+ throw new DwnError(
278
+ DwnErrorCode.ProtocolsConfigureInvalidCrossProtocolRole,
279
+ `cross-protocol role '${actionRule.role}' at protocol path '${childProtocolPath}' ` +
280
+ `does not point to a valid role ($role: true) in protocol '${refDefinition.protocol}'.`
281
+ );
282
+ }
283
+ }
284
+ }
285
+
286
+ // Validate cross-protocol `of` references: the path must exist in the referenced protocol's structure
287
+ if (actionRule.of !== undefined) {
288
+ const parsed = parseCrossProtocolRef(actionRule.of);
289
+ if (parsed !== undefined) {
290
+ const refDefinition = referencedDefinitions.get(parsed.alias);
291
+ if (refDefinition === undefined) {
292
+ throw new DwnError(
293
+ DwnErrorCode.ProtocolsConfigureInvalidCrossProtocolOf,
294
+ `cross-protocol 'of' alias '${parsed.alias}' in '${actionRule.of}' at protocol path '${childProtocolPath}' ` +
295
+ `was not found in the referenced definitions map.`
296
+ );
297
+ }
298
+
299
+ const ofRuleSet = getRuleSetAtPath(parsed.protocolPath, refDefinition.structure);
300
+ if (ofRuleSet === undefined) {
301
+ throw new DwnError(
302
+ DwnErrorCode.ProtocolsConfigureInvalidCrossProtocolOf,
303
+ `cross-protocol 'of' reference '${actionRule.of}' at protocol path '${childProtocolPath}' ` +
304
+ `does not point to a valid type path in protocol '${refDefinition.protocol}'.`
305
+ );
306
+ }
307
+ }
308
+ }
309
+ }
310
+
311
+ // Recurse into children
312
+ ProtocolsConfigureHandler.validateRefsAndRolesRecursively(childRuleSet, childProtocolPath, referencedDefinitions);
313
+ }
314
+ }
137
315
  }
@@ -52,8 +52,9 @@ export class ProtocolsQueryHandler implements MethodHandler {
52
52
 
53
53
  const query = {
54
54
  ...message.descriptor.filter,
55
- interface : DwnInterfaceName.Protocols,
56
- method : DwnMethodName.Configure
55
+ interface : DwnInterfaceName.Protocols,
56
+ method : DwnMethodName.Configure,
57
+ isLatestBaseState : true,
57
58
  };
58
59
  removeUndefinedProperties(query);
59
60
 
@@ -72,9 +73,10 @@ export class ProtocolsQueryHandler implements MethodHandler {
72
73
  // fetch all published `ProtocolConfigure` matching the query
73
74
  const filter = {
74
75
  ...protocolsQuery.message.descriptor.filter,
75
- interface : DwnInterfaceName.Protocols,
76
- method : DwnMethodName.Configure,
77
- published : true
76
+ interface : DwnInterfaceName.Protocols,
77
+ method : DwnMethodName.Configure,
78
+ published : true,
79
+ isLatestBaseState : true,
78
80
  };
79
81
  const { messages: publishedProtocolsConfigure } = await this.messageStore.query(tenant, [ filter ]);
80
82
  return publishedProtocolsConfigure as ProtocolsConfigureMessage[];