@enbox/dwn-sdk-js 0.0.2 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (601) hide show
  1. package/README.md +52 -301
  2. package/dist/bundles/dwn.js +19 -21
  3. package/dist/esm/generated/precompiled-validators.js +2764 -1773
  4. package/dist/esm/generated/precompiled-validators.js.map +1 -1
  5. package/dist/esm/src/core/dwn-error.js +27 -3
  6. package/dist/esm/src/core/dwn-error.js.map +1 -1
  7. package/dist/esm/src/core/message.js.map +1 -1
  8. package/dist/esm/src/core/messages-grant-authorization.js +17 -6
  9. package/dist/esm/src/core/messages-grant-authorization.js.map +1 -1
  10. package/dist/esm/src/core/protocol-authorization.js +245 -69
  11. package/dist/esm/src/core/protocol-authorization.js.map +1 -1
  12. package/dist/esm/src/core/resumable-task-manager.js +4 -4
  13. package/dist/esm/src/core/resumable-task-manager.js.map +1 -1
  14. package/dist/esm/src/dwn.js +10 -8
  15. package/dist/esm/src/dwn.js.map +1 -1
  16. package/dist/esm/src/enums/dwn-interface-method.js +4 -2
  17. package/dist/esm/src/enums/dwn-interface-method.js.map +1 -1
  18. package/dist/esm/src/event-stream/event-emitter-stream.js.map +1 -0
  19. package/dist/esm/src/handlers/messages-subscribe.js +1 -1
  20. package/dist/esm/src/handlers/messages-subscribe.js.map +1 -1
  21. package/dist/esm/src/handlers/messages-sync.js +116 -0
  22. package/dist/esm/src/handlers/messages-sync.js.map +1 -0
  23. package/dist/esm/src/handlers/protocols-configure.js +149 -16
  24. package/dist/esm/src/handlers/protocols-configure.js.map +1 -1
  25. package/dist/esm/src/handlers/protocols-query.js +2 -2
  26. package/dist/esm/src/handlers/protocols-query.js.map +1 -1
  27. package/dist/esm/src/handlers/records-count.js +143 -0
  28. package/dist/esm/src/handlers/records-count.js.map +1 -0
  29. package/dist/esm/src/handlers/records-query.js +4 -0
  30. package/dist/esm/src/handlers/records-query.js.map +1 -1
  31. package/dist/esm/src/handlers/records-read.js +4 -6
  32. package/dist/esm/src/handlers/records-read.js.map +1 -1
  33. package/dist/esm/src/handlers/records-write.js +17 -18
  34. package/dist/esm/src/handlers/records-write.js.map +1 -1
  35. package/dist/esm/src/index.js +9 -5
  36. package/dist/esm/src/index.js.map +1 -1
  37. package/dist/esm/src/interfaces/messages-read.js +2 -7
  38. package/dist/esm/src/interfaces/messages-read.js.map +1 -1
  39. package/dist/esm/src/interfaces/messages-subscribe.js +1 -0
  40. package/dist/esm/src/interfaces/messages-subscribe.js.map +1 -1
  41. package/dist/esm/src/interfaces/{messages-query.js → messages-sync.js} +11 -12
  42. package/dist/esm/src/interfaces/messages-sync.js.map +1 -0
  43. package/dist/esm/src/interfaces/protocols-configure.js +153 -30
  44. package/dist/esm/src/interfaces/protocols-configure.js.map +1 -1
  45. package/dist/esm/src/interfaces/protocols-query.js +1 -0
  46. package/dist/esm/src/interfaces/protocols-query.js.map +1 -1
  47. package/dist/esm/src/interfaces/records-count.js +91 -0
  48. package/dist/esm/src/interfaces/records-count.js.map +1 -0
  49. package/dist/esm/src/interfaces/records-read.js +15 -1
  50. package/dist/esm/src/interfaces/records-read.js.map +1 -1
  51. package/dist/esm/src/interfaces/records-write.js +64 -15
  52. package/dist/esm/src/interfaces/records-write.js.map +1 -1
  53. package/dist/esm/src/jose/algorithms/signing/ed25519.js.map +1 -1
  54. package/dist/esm/src/jose/algorithms/signing/signature-algorithms.js.map +1 -1
  55. package/dist/esm/src/jose/jws/general/builder.js.map +1 -1
  56. package/dist/esm/src/jose/jws/general/verifier.js.map +1 -1
  57. package/dist/esm/src/protocols/permission-grant.js +30 -0
  58. package/dist/esm/src/protocols/permission-grant.js.map +1 -1
  59. package/dist/esm/src/protocols/permission-request.js +24 -0
  60. package/dist/esm/src/protocols/permission-request.js.map +1 -1
  61. package/dist/esm/src/protocols/permissions.js +1 -1
  62. package/dist/esm/src/protocols/permissions.js.map +1 -1
  63. package/dist/esm/src/schema-validator.js +0 -1
  64. package/dist/esm/src/schema-validator.js.map +1 -1
  65. package/dist/esm/src/smt/smt-store-level.js +125 -0
  66. package/dist/esm/src/smt/smt-store-level.js.map +1 -0
  67. package/dist/esm/src/smt/smt-store-memory.js +67 -0
  68. package/dist/esm/src/smt/smt-store-memory.js.map +1 -0
  69. package/dist/esm/src/smt/smt-utils.js +146 -0
  70. package/dist/esm/src/smt/smt-utils.js.map +1 -0
  71. package/dist/esm/src/smt/sparse-merkle-tree.js +622 -0
  72. package/dist/esm/src/smt/sparse-merkle-tree.js.map +1 -0
  73. package/dist/esm/src/state-index/state-index-level.js +228 -0
  74. package/dist/esm/src/state-index/state-index-level.js.map +1 -0
  75. package/dist/esm/src/store/data-store-level.js +6 -6
  76. package/dist/esm/src/store/data-store-level.js.map +1 -1
  77. package/dist/esm/src/store/index-level.js +375 -17
  78. package/dist/esm/src/store/index-level.js.map +1 -1
  79. package/dist/esm/src/store/message-store-level.js +56 -0
  80. package/dist/esm/src/store/message-store-level.js.map +1 -1
  81. package/dist/esm/src/store/storage-controller.js +19 -16
  82. package/dist/esm/src/store/storage-controller.js.map +1 -1
  83. package/dist/esm/src/types/encryption-types.js +2 -0
  84. package/dist/esm/src/types/encryption-types.js.map +1 -0
  85. package/dist/esm/src/types/message-types.js.map +1 -1
  86. package/dist/esm/src/types/protocols-types.js +0 -2
  87. package/dist/esm/src/types/protocols-types.js.map +1 -1
  88. package/dist/esm/src/types/records-types.js +2 -0
  89. package/dist/esm/src/types/records-types.js.map +1 -1
  90. package/dist/esm/src/types/smt-types.js +5 -0
  91. package/dist/esm/src/types/smt-types.js.map +1 -0
  92. package/dist/esm/src/types/state-index.js +2 -0
  93. package/dist/esm/src/types/state-index.js.map +1 -0
  94. package/dist/esm/src/utils/cid.js +2 -1
  95. package/dist/esm/src/utils/cid.js.map +1 -1
  96. package/dist/esm/src/utils/data-stream.js +84 -29
  97. package/dist/esm/src/utils/data-stream.js.map +1 -1
  98. package/dist/esm/src/utils/encryption.js +22 -31
  99. package/dist/esm/src/utils/encryption.js.map +1 -1
  100. package/dist/esm/src/utils/hd-key.js +3 -3
  101. package/dist/esm/src/utils/hd-key.js.map +1 -1
  102. package/dist/esm/src/utils/jws.js +4 -4
  103. package/dist/esm/src/utils/jws.js.map +1 -1
  104. package/dist/esm/src/utils/private-key-signer.js +4 -3
  105. package/dist/esm/src/utils/private-key-signer.js.map +1 -1
  106. package/dist/esm/src/utils/protocols.js +82 -9
  107. package/dist/esm/src/utils/protocols.js.map +1 -1
  108. package/dist/esm/src/utils/records.js +82 -26
  109. package/dist/esm/src/utils/records.js.map +1 -1
  110. package/dist/esm/src/utils/secp256k1.js +4 -3
  111. package/dist/esm/src/utils/secp256k1.js.map +1 -1
  112. package/dist/esm/src/utils/secp256r1.js +3 -2
  113. package/dist/esm/src/utils/secp256r1.js.map +1 -1
  114. package/dist/esm/src/utils/time.js +1 -1
  115. package/dist/esm/src/utils/url.js +1 -1
  116. package/dist/esm/src/utils/url.js.map +1 -1
  117. package/dist/esm/tests/core/auth.spec.js +2 -2
  118. package/dist/esm/tests/core/auth.spec.js.map +1 -1
  119. package/dist/esm/tests/core/message-reply.spec.js +3 -3
  120. package/dist/esm/tests/core/message-reply.spec.js.map +1 -1
  121. package/dist/esm/tests/core/message.spec.js +13 -13
  122. package/dist/esm/tests/core/message.spec.js.map +1 -1
  123. package/dist/esm/tests/core/protocol-authorization.spec.js +3 -3
  124. package/dist/esm/tests/core/protocol-authorization.spec.js.map +1 -1
  125. package/dist/esm/tests/dwn.spec.js +27 -37
  126. package/dist/esm/tests/dwn.spec.js.map +1 -1
  127. package/dist/esm/tests/{event-log → event-stream}/event-emitter-stream.spec.js +14 -15
  128. package/dist/esm/tests/event-stream/event-emitter-stream.spec.js.map +1 -0
  129. package/dist/esm/tests/{event-log → event-stream}/event-stream.spec.js +13 -15
  130. package/dist/esm/tests/event-stream/event-stream.spec.js.map +1 -0
  131. package/dist/esm/tests/features/author-delegated-grant.spec.js +281 -135
  132. package/dist/esm/tests/features/author-delegated-grant.spec.js.map +1 -1
  133. package/dist/esm/tests/features/owner-delegated-grant.spec.js +57 -59
  134. package/dist/esm/tests/features/owner-delegated-grant.spec.js.map +1 -1
  135. package/dist/esm/tests/features/owner-signature.spec.js +32 -34
  136. package/dist/esm/tests/features/owner-signature.spec.js.map +1 -1
  137. package/dist/esm/tests/features/permissions.spec.js +73 -95
  138. package/dist/esm/tests/features/permissions.spec.js.map +1 -1
  139. package/dist/esm/tests/features/protocol-composition.spec.js +1645 -0
  140. package/dist/esm/tests/features/protocol-composition.spec.js.map +1 -0
  141. package/dist/esm/tests/features/protocol-create-action.spec.js +25 -27
  142. package/dist/esm/tests/features/protocol-create-action.spec.js.map +1 -1
  143. package/dist/esm/tests/features/protocol-delete-action.spec.js +42 -44
  144. package/dist/esm/tests/features/protocol-delete-action.spec.js.map +1 -1
  145. package/dist/esm/tests/features/protocol-update-action.spec.js +53 -55
  146. package/dist/esm/tests/features/protocol-update-action.spec.js.map +1 -1
  147. package/dist/esm/tests/features/records-prune.spec.js +126 -100
  148. package/dist/esm/tests/features/records-prune.spec.js.map +1 -1
  149. package/dist/esm/tests/features/records-tags.spec.js +272 -272
  150. package/dist/esm/tests/features/records-tags.spec.js.map +1 -1
  151. package/dist/esm/tests/features/resumable-tasks.spec.js +35 -37
  152. package/dist/esm/tests/features/resumable-tasks.spec.js.map +1 -1
  153. package/dist/esm/tests/handlers/messages-read.spec.js +112 -112
  154. package/dist/esm/tests/handlers/messages-read.spec.js.map +1 -1
  155. package/dist/esm/tests/handlers/messages-subscribe.spec.js +78 -76
  156. package/dist/esm/tests/handlers/messages-subscribe.spec.js.map +1 -1
  157. package/dist/esm/tests/handlers/messages-sync.spec.js +528 -0
  158. package/dist/esm/tests/handlers/messages-sync.spec.js.map +1 -0
  159. package/dist/esm/tests/handlers/protocols-configure.spec.js +545 -152
  160. package/dist/esm/tests/handlers/protocols-configure.spec.js.map +1 -1
  161. package/dist/esm/tests/handlers/protocols-query.spec.js +70 -72
  162. package/dist/esm/tests/handlers/protocols-query.spec.js.map +1 -1
  163. package/dist/esm/tests/handlers/records-count.spec.js +313 -0
  164. package/dist/esm/tests/handlers/records-count.spec.js.map +1 -0
  165. package/dist/esm/tests/handlers/records-delete.spec.js +106 -109
  166. package/dist/esm/tests/handlers/records-delete.spec.js.map +1 -1
  167. package/dist/esm/tests/handlers/records-query.spec.js +863 -463
  168. package/dist/esm/tests/handlers/records-query.spec.js.map +1 -1
  169. package/dist/esm/tests/handlers/records-read.spec.js +439 -209
  170. package/dist/esm/tests/handlers/records-read.spec.js.map +1 -1
  171. package/dist/esm/tests/handlers/records-subscribe.spec.js +292 -97
  172. package/dist/esm/tests/handlers/records-subscribe.spec.js.map +1 -1
  173. package/dist/esm/tests/handlers/records-write.spec.js +481 -483
  174. package/dist/esm/tests/handlers/records-write.spec.js.map +1 -1
  175. package/dist/esm/tests/interfaces/messages-get.spec.js +31 -11
  176. package/dist/esm/tests/interfaces/messages-get.spec.js.map +1 -1
  177. package/dist/esm/tests/interfaces/messages-subscribe.spec.js +5 -5
  178. package/dist/esm/tests/interfaces/messages-subscribe.spec.js.map +1 -1
  179. package/dist/esm/tests/interfaces/protocols-configure.spec.js +64 -134
  180. package/dist/esm/tests/interfaces/protocols-configure.spec.js.map +1 -1
  181. package/dist/esm/tests/interfaces/protocols-query.spec.js +4 -6
  182. package/dist/esm/tests/interfaces/protocols-query.spec.js.map +1 -1
  183. package/dist/esm/tests/interfaces/records-delete.spec.js +3 -5
  184. package/dist/esm/tests/interfaces/records-delete.spec.js.map +1 -1
  185. package/dist/esm/tests/interfaces/records-query.spec.js +9 -11
  186. package/dist/esm/tests/interfaces/records-query.spec.js.map +1 -1
  187. package/dist/esm/tests/interfaces/records-read.spec.js +76 -7
  188. package/dist/esm/tests/interfaces/records-read.spec.js.map +1 -1
  189. package/dist/esm/tests/interfaces/records-subscribe.spec.js +7 -9
  190. package/dist/esm/tests/interfaces/records-subscribe.spec.js.map +1 -1
  191. package/dist/esm/tests/interfaces/records-write.spec.js +244 -48
  192. package/dist/esm/tests/interfaces/records-write.spec.js.map +1 -1
  193. package/dist/esm/tests/jose/jws/general.spec.js +15 -18
  194. package/dist/esm/tests/jose/jws/general.spec.js.map +1 -1
  195. package/dist/esm/tests/protocols/permission-grant.spec.js +114 -0
  196. package/dist/esm/tests/protocols/permission-grant.spec.js.map +1 -0
  197. package/dist/esm/tests/protocols/permission-request.spec.js +43 -7
  198. package/dist/esm/tests/protocols/permission-request.spec.js.map +1 -1
  199. package/dist/esm/tests/protocols/permissions.spec.js +9 -11
  200. package/dist/esm/tests/protocols/permissions.spec.js.map +1 -1
  201. package/dist/esm/tests/scenarios/aggregator.spec.js +90 -92
  202. package/dist/esm/tests/scenarios/aggregator.spec.js.map +1 -1
  203. package/dist/esm/tests/scenarios/deleted-record.spec.js +17 -19
  204. package/dist/esm/tests/scenarios/deleted-record.spec.js.map +1 -1
  205. package/dist/esm/tests/scenarios/end-to-end-tests.spec.js +27 -29
  206. package/dist/esm/tests/scenarios/end-to-end-tests.spec.js.map +1 -1
  207. package/dist/esm/tests/scenarios/nested-roles.spec.js +37 -39
  208. package/dist/esm/tests/scenarios/nested-roles.spec.js.map +1 -1
  209. package/dist/esm/tests/scenarios/subscriptions.spec.js +163 -163
  210. package/dist/esm/tests/scenarios/subscriptions.spec.js.map +1 -1
  211. package/dist/esm/tests/smt/smt-store-level.spec.js +143 -0
  212. package/dist/esm/tests/smt/smt-store-level.spec.js.map +1 -0
  213. package/dist/esm/tests/smt/sparse-merkle-tree.spec.js +741 -0
  214. package/dist/esm/tests/smt/sparse-merkle-tree.spec.js.map +1 -0
  215. package/dist/esm/tests/state-index/state-index-level.spec.js +254 -0
  216. package/dist/esm/tests/state-index/state-index-level.spec.js.map +1 -0
  217. package/dist/esm/tests/store/blockstore-level.spec.js +136 -0
  218. package/dist/esm/tests/store/blockstore-level.spec.js.map +1 -0
  219. package/dist/esm/tests/store/blockstore-mock.spec.js +29 -28
  220. package/dist/esm/tests/store/blockstore-mock.spec.js.map +1 -1
  221. package/dist/esm/tests/store/data-store-level.spec.js +23 -25
  222. package/dist/esm/tests/store/data-store-level.spec.js.map +1 -1
  223. package/dist/esm/tests/store/index-level.spec.js +544 -194
  224. package/dist/esm/tests/store/index-level.spec.js.map +1 -1
  225. package/dist/esm/tests/store/message-store-level.spec.js +4 -4
  226. package/dist/esm/tests/store/message-store-level.spec.js.map +1 -1
  227. package/dist/esm/tests/store/message-store.spec.js +147 -73
  228. package/dist/esm/tests/store/message-store.spec.js.map +1 -1
  229. package/dist/esm/tests/store-dependent-tests.spec.js +1 -0
  230. package/dist/esm/tests/store-dependent-tests.spec.js.map +1 -1
  231. package/dist/esm/tests/test-stores.js +5 -5
  232. package/dist/esm/tests/test-stores.js.map +1 -1
  233. package/dist/esm/tests/test-suite.js +9 -8
  234. package/dist/esm/tests/test-suite.js.map +1 -1
  235. package/dist/esm/tests/utils/cid.spec.js +8 -11
  236. package/dist/esm/tests/utils/cid.spec.js.map +1 -1
  237. package/dist/esm/tests/utils/data-stream.spec.js +167 -13
  238. package/dist/esm/tests/utils/data-stream.spec.js.map +1 -1
  239. package/dist/esm/tests/utils/encryption-callbacks.spec.js +233 -0
  240. package/dist/esm/tests/utils/encryption-callbacks.spec.js.map +1 -0
  241. package/dist/esm/tests/utils/encryption.spec.js +34 -85
  242. package/dist/esm/tests/utils/encryption.spec.js.map +1 -1
  243. package/dist/esm/tests/utils/filters.spec.js +67 -69
  244. package/dist/esm/tests/utils/filters.spec.js.map +1 -1
  245. package/dist/esm/tests/utils/hd-key.spec.js +3 -3
  246. package/dist/esm/tests/utils/hd-key.spec.js.map +1 -1
  247. package/dist/esm/tests/utils/jws.spec.js +54 -3
  248. package/dist/esm/tests/utils/jws.spec.js.map +1 -1
  249. package/dist/esm/tests/utils/memory-cache.spec.js +6 -9
  250. package/dist/esm/tests/utils/memory-cache.spec.js.map +1 -1
  251. package/dist/esm/tests/utils/messages.spec.js +63 -29
  252. package/dist/esm/tests/utils/messages.spec.js.map +1 -1
  253. package/dist/esm/tests/utils/object.spec.js +3 -3
  254. package/dist/esm/tests/utils/object.spec.js.map +1 -1
  255. package/dist/esm/tests/utils/poller.js +1 -1
  256. package/dist/esm/tests/utils/poller.js.map +1 -1
  257. package/dist/esm/tests/utils/private-key-signer.spec.js +6 -6
  258. package/dist/esm/tests/utils/private-key-signer.spec.js.map +1 -1
  259. package/dist/esm/tests/utils/records.spec.js +37 -5
  260. package/dist/esm/tests/utils/records.spec.js.map +1 -1
  261. package/dist/esm/tests/utils/secp256k1.spec.js +7 -7
  262. package/dist/esm/tests/utils/secp256k1.spec.js.map +1 -1
  263. package/dist/esm/tests/utils/secp256r1.spec.js +7 -7
  264. package/dist/esm/tests/utils/secp256r1.spec.js.map +1 -1
  265. package/dist/esm/tests/utils/test-data-generator.js +47 -28
  266. package/dist/esm/tests/utils/test-data-generator.js.map +1 -1
  267. package/dist/esm/tests/utils/time.spec.js +7 -7
  268. package/dist/esm/tests/utils/time.spec.js.map +1 -1
  269. package/dist/esm/tests/utils/url.spec.js +25 -27
  270. package/dist/esm/tests/utils/url.spec.js.map +1 -1
  271. package/dist/esm/tests/validation/json-schemas/definitions.spec.js +4 -4
  272. package/dist/esm/tests/validation/json-schemas/definitions.spec.js.map +1 -1
  273. package/dist/esm/tests/validation/json-schemas/jwk/general-jwk.spec.js +15 -3
  274. package/dist/esm/tests/validation/json-schemas/jwk/general-jwk.spec.js.map +1 -1
  275. package/dist/esm/tests/validation/json-schemas/jwk/public-jwk.spec.js +8 -8
  276. package/dist/esm/tests/validation/json-schemas/jwk/public-jwk.spec.js.map +1 -1
  277. package/dist/esm/tests/validation/json-schemas/jwk-verification-method.spec.js +8 -18
  278. package/dist/esm/tests/validation/json-schemas/jwk-verification-method.spec.js.map +1 -1
  279. package/dist/esm/tests/validation/json-schemas/protocols/protocols-configure.spec.js +3 -3
  280. package/dist/esm/tests/validation/json-schemas/protocols/protocols-configure.spec.js.map +1 -1
  281. package/dist/esm/tests/validation/json-schemas/records/records-query.spec.js +9 -9
  282. package/dist/esm/tests/validation/json-schemas/records/records-query.spec.js.map +1 -1
  283. package/dist/esm/tests/validation/json-schemas/records/records-read.spec.js +106 -0
  284. package/dist/esm/tests/validation/json-schemas/records/records-read.spec.js.map +1 -0
  285. package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js +18 -18
  286. package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js.map +1 -1
  287. package/dist/esm/tests/vectors/protocol-definitions/email.json +1 -1
  288. package/dist/esm/tests/vectors/protocol-definitions/friend-role.json +2 -4
  289. package/dist/esm/tests/vectors/protocol-definitions/slack.json +2 -6
  290. package/dist/esm/tests/vectors/protocol-definitions/thread-role.json +2 -6
  291. package/dist/types/generated/precompiled-validators.d.ts +82 -64
  292. package/dist/types/generated/precompiled-validators.d.ts.map +1 -1
  293. package/dist/types/src/core/dwn-error.d.ts +27 -3
  294. package/dist/types/src/core/dwn-error.d.ts.map +1 -1
  295. package/dist/types/src/core/message-reply.d.ts +1 -1
  296. package/dist/types/src/core/message.d.ts +3 -3
  297. package/dist/types/src/core/message.d.ts.map +1 -1
  298. package/dist/types/src/core/messages-grant-authorization.d.ts +4 -4
  299. package/dist/types/src/core/messages-grant-authorization.d.ts.map +1 -1
  300. package/dist/types/src/core/protocol-authorization.d.ts +43 -2
  301. package/dist/types/src/core/protocol-authorization.d.ts.map +1 -1
  302. package/dist/types/src/core/records-grant-authorization.d.ts +2 -2
  303. package/dist/types/src/core/records-grant-authorization.d.ts.map +1 -1
  304. package/dist/types/src/core/resumable-task-manager.d.ts +1 -0
  305. package/dist/types/src/core/resumable-task-manager.d.ts.map +1 -1
  306. package/dist/types/src/dwn.d.ts +8 -8
  307. package/dist/types/src/dwn.d.ts.map +1 -1
  308. package/dist/types/src/enums/dwn-interface-method.d.ts +5 -3
  309. package/dist/types/src/enums/dwn-interface-method.d.ts.map +1 -1
  310. package/dist/types/src/event-stream/event-emitter-stream.d.ts.map +1 -0
  311. package/dist/types/src/handlers/messages-sync.d.ts +21 -0
  312. package/dist/types/src/handlers/messages-sync.d.ts.map +1 -0
  313. package/dist/types/src/handlers/protocols-configure.d.ts +24 -4
  314. package/dist/types/src/handlers/protocols-configure.d.ts.map +1 -1
  315. package/dist/types/src/handlers/protocols-query.d.ts.map +1 -1
  316. package/dist/types/src/handlers/records-count.d.ts +43 -0
  317. package/dist/types/src/handlers/records-count.d.ts.map +1 -0
  318. package/dist/types/src/handlers/records-query.d.ts.map +1 -1
  319. package/dist/types/src/handlers/records-read.d.ts.map +1 -1
  320. package/dist/types/src/handlers/records-write.d.ts +5 -5
  321. package/dist/types/src/handlers/records-write.d.ts.map +1 -1
  322. package/dist/types/src/index.d.ts +72 -37
  323. package/dist/types/src/index.d.ts.map +1 -1
  324. package/dist/types/src/interfaces/messages-read.d.ts +2 -2
  325. package/dist/types/src/interfaces/messages-read.d.ts.map +1 -1
  326. package/dist/types/src/interfaces/messages-subscribe.d.ts +2 -2
  327. package/dist/types/src/interfaces/messages-subscribe.d.ts.map +1 -1
  328. package/dist/types/src/interfaces/messages-sync.d.ts +16 -0
  329. package/dist/types/src/interfaces/messages-sync.d.ts.map +1 -0
  330. package/dist/types/src/interfaces/protocols-configure.d.ts +22 -2
  331. package/dist/types/src/interfaces/protocols-configure.d.ts.map +1 -1
  332. package/dist/types/src/interfaces/protocols-query.d.ts +2 -2
  333. package/dist/types/src/interfaces/protocols-query.d.ts.map +1 -1
  334. package/dist/types/src/interfaces/records-count.d.ts +27 -0
  335. package/dist/types/src/interfaces/records-count.d.ts.map +1 -0
  336. package/dist/types/src/interfaces/records-delete.d.ts +2 -2
  337. package/dist/types/src/interfaces/records-delete.d.ts.map +1 -1
  338. package/dist/types/src/interfaces/records-query.d.ts +2 -2
  339. package/dist/types/src/interfaces/records-query.d.ts.map +1 -1
  340. package/dist/types/src/interfaces/records-read.d.ts +4 -2
  341. package/dist/types/src/interfaces/records-read.d.ts.map +1 -1
  342. package/dist/types/src/interfaces/records-subscribe.d.ts +2 -2
  343. package/dist/types/src/interfaces/records-subscribe.d.ts.map +1 -1
  344. package/dist/types/src/interfaces/records-write.d.ts +37 -15
  345. package/dist/types/src/interfaces/records-write.d.ts.map +1 -1
  346. package/dist/types/src/jose/algorithms/signing/ed25519.d.ts.map +1 -1
  347. package/dist/types/src/jose/algorithms/signing/signature-algorithms.d.ts +5 -1
  348. package/dist/types/src/jose/algorithms/signing/signature-algorithms.d.ts.map +1 -1
  349. package/dist/types/src/jose/jws/general/builder.d.ts +3 -3
  350. package/dist/types/src/jose/jws/general/builder.d.ts.map +1 -1
  351. package/dist/types/src/protocols/permission-grant.d.ts +11 -0
  352. package/dist/types/src/protocols/permission-grant.d.ts.map +1 -1
  353. package/dist/types/src/protocols/permission-request.d.ts +11 -0
  354. package/dist/types/src/protocols/permission-request.d.ts.map +1 -1
  355. package/dist/types/src/protocols/permissions.d.ts +4 -4
  356. package/dist/types/src/protocols/permissions.d.ts.map +1 -1
  357. package/dist/types/src/schema-validator.d.ts +1 -1
  358. package/dist/types/src/schema-validator.d.ts.map +1 -1
  359. package/dist/types/src/smt/smt-store-level.d.ts +32 -0
  360. package/dist/types/src/smt/smt-store-level.d.ts.map +1 -0
  361. package/dist/types/src/smt/smt-store-memory.d.ts +22 -0
  362. package/dist/types/src/smt/smt-store-memory.d.ts.map +1 -0
  363. package/dist/types/src/smt/smt-utils.d.ts +58 -0
  364. package/dist/types/src/smt/smt-utils.d.ts.map +1 -0
  365. package/dist/types/src/smt/sparse-merkle-tree.d.ts +124 -0
  366. package/dist/types/src/smt/sparse-merkle-tree.d.ts.map +1 -0
  367. package/dist/types/src/state-index/state-index-level.d.ts +83 -0
  368. package/dist/types/src/state-index/state-index-level.d.ts.map +1 -0
  369. package/dist/types/src/store/data-store-level.d.ts +1 -2
  370. package/dist/types/src/store/data-store-level.d.ts.map +1 -1
  371. package/dist/types/src/store/index-level.d.ts +98 -2
  372. package/dist/types/src/store/index-level.d.ts.map +1 -1
  373. package/dist/types/src/store/level-wrapper.d.ts.map +1 -1
  374. package/dist/types/src/store/message-store-level.d.ts +5 -0
  375. package/dist/types/src/store/message-store-level.d.ts.map +1 -1
  376. package/dist/types/src/store/storage-controller.d.ts +7 -7
  377. package/dist/types/src/store/storage-controller.d.ts.map +1 -1
  378. package/dist/types/src/types/data-store.d.ts +2 -3
  379. package/dist/types/src/types/data-store.d.ts.map +1 -1
  380. package/dist/types/src/types/encryption-types.d.ts +48 -0
  381. package/dist/types/src/types/encryption-types.d.ts.map +1 -0
  382. package/dist/types/src/types/jose-types.d.ts +9 -40
  383. package/dist/types/src/types/jose-types.d.ts.map +1 -1
  384. package/dist/types/src/types/message-store.d.ts +5 -0
  385. package/dist/types/src/types/message-store.d.ts.map +1 -1
  386. package/dist/types/src/types/message-types.d.ts +19 -0
  387. package/dist/types/src/types/message-types.d.ts.map +1 -1
  388. package/dist/types/src/types/messages-types.d.ts +16 -11
  389. package/dist/types/src/types/messages-types.d.ts.map +1 -1
  390. package/dist/types/src/types/method-handler.d.ts +1 -2
  391. package/dist/types/src/types/method-handler.d.ts.map +1 -1
  392. package/dist/types/src/types/permission-types.d.ts +2 -2
  393. package/dist/types/src/types/permission-types.d.ts.map +1 -1
  394. package/dist/types/src/types/protocols-types.d.ts +49 -5
  395. package/dist/types/src/types/protocols-types.d.ts.map +1 -1
  396. package/dist/types/src/types/records-types.d.ts +23 -7
  397. package/dist/types/src/types/records-types.d.ts.map +1 -1
  398. package/dist/types/src/types/signer.d.ts +1 -1
  399. package/dist/types/src/types/signer.d.ts.map +1 -1
  400. package/dist/types/src/types/smt-types.d.ts +81 -0
  401. package/dist/types/src/types/smt-types.d.ts.map +1 -0
  402. package/dist/types/src/types/state-index.d.ts +90 -0
  403. package/dist/types/src/types/state-index.d.ts.map +1 -0
  404. package/dist/types/src/utils/cid.d.ts +1 -2
  405. package/dist/types/src/utils/cid.d.ts.map +1 -1
  406. package/dist/types/src/utils/data-stream.d.ts +14 -7
  407. package/dist/types/src/utils/data-stream.d.ts.map +1 -1
  408. package/dist/types/src/utils/encryption.d.ts +2 -3
  409. package/dist/types/src/utils/encryption.d.ts.map +1 -1
  410. package/dist/types/src/utils/hd-key.d.ts +4 -4
  411. package/dist/types/src/utils/hd-key.d.ts.map +1 -1
  412. package/dist/types/src/utils/jws.d.ts +7 -7
  413. package/dist/types/src/utils/jws.d.ts.map +1 -1
  414. package/dist/types/src/utils/private-key-signer.d.ts +4 -4
  415. package/dist/types/src/utils/private-key-signer.d.ts.map +1 -1
  416. package/dist/types/src/utils/protocols.d.ts +46 -3
  417. package/dist/types/src/utils/protocols.d.ts.map +1 -1
  418. package/dist/types/src/utils/records.d.ts +33 -6
  419. package/dist/types/src/utils/records.d.ts.map +1 -1
  420. package/dist/types/src/utils/secp256k1.d.ts +11 -11
  421. package/dist/types/src/utils/secp256k1.d.ts.map +1 -1
  422. package/dist/types/src/utils/secp256r1.d.ts +8 -8
  423. package/dist/types/src/utils/secp256r1.d.ts.map +1 -1
  424. package/dist/types/src/utils/time.d.ts +1 -1
  425. package/dist/types/tests/dwn.spec.d.ts.map +1 -1
  426. package/dist/types/tests/event-stream/event-emitter-stream.spec.d.ts.map +1 -0
  427. package/dist/types/tests/event-stream/event-stream.spec.d.ts.map +1 -0
  428. package/dist/types/tests/features/author-delegated-grant.spec.d.ts.map +1 -1
  429. package/dist/types/tests/features/owner-delegated-grant.spec.d.ts.map +1 -1
  430. package/dist/types/tests/features/owner-signature.spec.d.ts.map +1 -1
  431. package/dist/types/tests/features/permissions.spec.d.ts.map +1 -1
  432. package/dist/types/tests/features/protocol-composition.spec.d.ts +5 -0
  433. package/dist/types/tests/features/protocol-composition.spec.d.ts.map +1 -0
  434. package/dist/types/tests/features/protocol-create-action.spec.d.ts.map +1 -1
  435. package/dist/types/tests/features/protocol-delete-action.spec.d.ts.map +1 -1
  436. package/dist/types/tests/features/protocol-update-action.spec.d.ts.map +1 -1
  437. package/dist/types/tests/features/records-prune.spec.d.ts.map +1 -1
  438. package/dist/types/tests/features/records-tags.spec.d.ts.map +1 -1
  439. package/dist/types/tests/features/resumable-tasks.spec.d.ts.map +1 -1
  440. package/dist/types/tests/handlers/messages-read.spec.d.ts.map +1 -1
  441. package/dist/types/tests/handlers/messages-subscribe.spec.d.ts.map +1 -1
  442. package/dist/types/tests/handlers/messages-sync.spec.d.ts +2 -0
  443. package/dist/types/tests/handlers/messages-sync.spec.d.ts.map +1 -0
  444. package/dist/types/tests/handlers/protocols-configure.spec.d.ts.map +1 -1
  445. package/dist/types/tests/handlers/protocols-query.spec.d.ts.map +1 -1
  446. package/dist/types/tests/handlers/records-count.spec.d.ts +2 -0
  447. package/dist/types/tests/handlers/records-count.spec.d.ts.map +1 -0
  448. package/dist/types/tests/handlers/records-delete.spec.d.ts.map +1 -1
  449. package/dist/types/tests/handlers/records-query.spec.d.ts.map +1 -1
  450. package/dist/types/tests/handlers/records-read.spec.d.ts.map +1 -1
  451. package/dist/types/tests/handlers/records-subscribe.spec.d.ts.map +1 -1
  452. package/dist/types/tests/handlers/records-write.spec.d.ts.map +1 -1
  453. package/dist/types/tests/protocols/permission-grant.spec.d.ts +2 -0
  454. package/dist/types/tests/protocols/permission-grant.spec.d.ts.map +1 -0
  455. package/dist/types/tests/scenarios/deleted-record.spec.d.ts.map +1 -1
  456. package/dist/types/tests/scenarios/end-to-end-tests.spec.d.ts.map +1 -1
  457. package/dist/types/tests/scenarios/nested-roles.spec.d.ts.map +1 -1
  458. package/dist/types/tests/smt/smt-store-level.spec.d.ts +2 -0
  459. package/dist/types/tests/smt/smt-store-level.spec.d.ts.map +1 -0
  460. package/dist/types/tests/smt/sparse-merkle-tree.spec.d.ts +2 -0
  461. package/dist/types/tests/smt/sparse-merkle-tree.spec.d.ts.map +1 -0
  462. package/dist/types/tests/state-index/state-index-level.spec.d.ts +2 -0
  463. package/dist/types/tests/state-index/state-index-level.spec.d.ts.map +1 -0
  464. package/dist/types/tests/store/blockstore-level.spec.d.ts +2 -0
  465. package/dist/types/tests/store/blockstore-level.spec.d.ts.map +1 -0
  466. package/dist/types/tests/store/message-store.spec.d.ts.map +1 -1
  467. package/dist/types/tests/test-stores.d.ts +4 -4
  468. package/dist/types/tests/test-stores.d.ts.map +1 -1
  469. package/dist/types/tests/test-suite.d.ts +2 -2
  470. package/dist/types/tests/test-suite.d.ts.map +1 -1
  471. package/dist/types/tests/utils/encryption-callbacks.spec.d.ts +2 -0
  472. package/dist/types/tests/utils/encryption-callbacks.spec.d.ts.map +1 -0
  473. package/dist/types/tests/utils/test-data-generator.d.ts +31 -28
  474. package/dist/types/tests/utils/test-data-generator.d.ts.map +1 -1
  475. package/dist/types/tests/validation/json-schemas/records/records-read.spec.d.ts +2 -0
  476. package/dist/types/tests/validation/json-schemas/records/records-read.spec.d.ts.map +1 -0
  477. package/package.json +27 -46
  478. package/src/core/dwn-error.ts +27 -3
  479. package/src/core/message-reply.ts +1 -1
  480. package/src/core/message.ts +5 -5
  481. package/src/core/messages-grant-authorization.ts +22 -8
  482. package/src/core/protocol-authorization.ts +345 -68
  483. package/src/core/records-grant-authorization.ts +2 -2
  484. package/src/core/resumable-task-manager.ts +4 -5
  485. package/src/dwn.ts +25 -20
  486. package/src/enums/dwn-interface-method.ts +5 -3
  487. package/src/handlers/messages-subscribe.ts +1 -1
  488. package/src/handlers/messages-sync.ts +129 -0
  489. package/src/handlers/protocols-configure.ts +195 -17
  490. package/src/handlers/protocols-query.ts +7 -5
  491. package/src/handlers/records-count.ts +184 -0
  492. package/src/handlers/records-query.ts +4 -0
  493. package/src/handlers/records-read.ts +4 -8
  494. package/src/handlers/records-write.ts +20 -21
  495. package/src/index.ts +74 -37
  496. package/src/interfaces/messages-read.ts +6 -5
  497. package/src/interfaces/messages-subscribe.ts +7 -6
  498. package/src/interfaces/messages-sync.ts +59 -0
  499. package/src/interfaces/protocols-configure.ts +211 -33
  500. package/src/interfaces/protocols-query.ts +7 -6
  501. package/src/interfaces/records-count.ts +106 -0
  502. package/src/interfaces/records-delete.ts +2 -2
  503. package/src/interfaces/records-query.ts +2 -2
  504. package/src/interfaces/records-read.ts +26 -3
  505. package/src/interfaces/records-subscribe.ts +2 -2
  506. package/src/interfaces/records-write.ts +115 -46
  507. package/src/jose/algorithms/signing/ed25519.ts +13 -12
  508. package/src/jose/algorithms/signing/signature-algorithms.ts +6 -1
  509. package/src/jose/jws/general/builder.ts +3 -3
  510. package/src/jose/jws/general/verifier.ts +3 -3
  511. package/src/protocols/permission-grant.ts +51 -0
  512. package/src/protocols/permission-request.ts +37 -0
  513. package/src/protocols/permissions.ts +5 -5
  514. package/src/schema-validator.ts +11 -3
  515. package/src/smt/smt-store-level.ts +143 -0
  516. package/src/smt/smt-store-memory.ts +53 -0
  517. package/src/smt/smt-utils.ts +149 -0
  518. package/src/smt/sparse-merkle-tree.ts +698 -0
  519. package/src/state-index/state-index-level.ts +241 -0
  520. package/src/store/data-store-level.ts +8 -7
  521. package/src/store/index-level.ts +415 -19
  522. package/src/store/level-wrapper.ts +1 -1
  523. package/src/store/message-store-level.ts +62 -0
  524. package/src/store/storage-controller.ts +21 -19
  525. package/src/types/data-store.ts +2 -4
  526. package/src/types/encryption-types.ts +52 -0
  527. package/src/types/jose-types.ts +10 -42
  528. package/src/types/message-store.ts +11 -0
  529. package/src/types/message-types.ts +21 -0
  530. package/src/types/messages-types.ts +21 -15
  531. package/src/types/method-handler.ts +1 -2
  532. package/src/types/permission-types.ts +2 -2
  533. package/src/types/protocols-types.ts +55 -6
  534. package/src/types/records-types.ts +26 -7
  535. package/src/types/signer.ts +1 -1
  536. package/src/types/smt-types.ts +95 -0
  537. package/src/types/state-index.ts +100 -0
  538. package/src/utils/cid.ts +3 -4
  539. package/src/utils/data-stream.ts +75 -38
  540. package/src/utils/encryption.ts +24 -39
  541. package/src/utils/hd-key.ts +6 -6
  542. package/src/utils/jws.ts +9 -9
  543. package/src/utils/private-key-signer.ts +9 -8
  544. package/src/utils/protocols.ts +132 -6
  545. package/src/utils/records.ts +118 -29
  546. package/src/utils/secp256k1.ts +23 -21
  547. package/src/utils/secp256r1.ts +17 -15
  548. package/src/utils/time.ts +1 -1
  549. package/src/utils/url.ts +1 -1
  550. package/dist/cjs/index.js +0 -36749
  551. package/dist/cjs/package.json +0 -1
  552. package/dist/esm/src/event-log/event-emitter-stream.js.map +0 -1
  553. package/dist/esm/src/event-log/event-log-level.js +0 -63
  554. package/dist/esm/src/event-log/event-log-level.js.map +0 -1
  555. package/dist/esm/src/handlers/messages-query.js +0 -71
  556. package/dist/esm/src/handlers/messages-query.js.map +0 -1
  557. package/dist/esm/src/interfaces/messages-query.js.map +0 -1
  558. package/dist/esm/src/types/event-log.js +0 -2
  559. package/dist/esm/src/types/event-log.js.map +0 -1
  560. package/dist/esm/tests/event-log/event-emitter-stream.spec.js.map +0 -1
  561. package/dist/esm/tests/event-log/event-log-level.spec.js +0 -44
  562. package/dist/esm/tests/event-log/event-log-level.spec.js.map +0 -1
  563. package/dist/esm/tests/event-log/event-log.spec.js +0 -236
  564. package/dist/esm/tests/event-log/event-log.spec.js.map +0 -1
  565. package/dist/esm/tests/event-log/event-stream.spec.js.map +0 -1
  566. package/dist/esm/tests/handlers/messages-query.spec.js +0 -349
  567. package/dist/esm/tests/handlers/messages-query.spec.js.map +0 -1
  568. package/dist/esm/tests/interfaces/messagess-query.spec.js +0 -127
  569. package/dist/esm/tests/interfaces/messagess-query.spec.js.map +0 -1
  570. package/dist/esm/tests/scenarios/messages-query.spec.js +0 -395
  571. package/dist/esm/tests/scenarios/messages-query.spec.js.map +0 -1
  572. package/dist/types/src/event-log/event-emitter-stream.d.ts.map +0 -1
  573. package/dist/types/src/event-log/event-log-level.d.ts +0 -35
  574. package/dist/types/src/event-log/event-log-level.d.ts.map +0 -1
  575. package/dist/types/src/handlers/messages-query.d.ts +0 -17
  576. package/dist/types/src/handlers/messages-query.d.ts.map +0 -1
  577. package/dist/types/src/interfaces/messages-query.d.ts +0 -16
  578. package/dist/types/src/interfaces/messages-query.d.ts.map +0 -1
  579. package/dist/types/src/types/event-log.d.ts +0 -52
  580. package/dist/types/src/types/event-log.d.ts.map +0 -1
  581. package/dist/types/tests/event-log/event-emitter-stream.spec.d.ts.map +0 -1
  582. package/dist/types/tests/event-log/event-log-level.spec.d.ts +0 -2
  583. package/dist/types/tests/event-log/event-log-level.spec.d.ts.map +0 -1
  584. package/dist/types/tests/event-log/event-log.spec.d.ts +0 -2
  585. package/dist/types/tests/event-log/event-log.spec.d.ts.map +0 -1
  586. package/dist/types/tests/event-log/event-stream.spec.d.ts.map +0 -1
  587. package/dist/types/tests/handlers/messages-query.spec.d.ts +0 -2
  588. package/dist/types/tests/handlers/messages-query.spec.d.ts.map +0 -1
  589. package/dist/types/tests/interfaces/messagess-query.spec.d.ts +0 -2
  590. package/dist/types/tests/interfaces/messagess-query.spec.d.ts.map +0 -1
  591. package/dist/types/tests/scenarios/messages-query.spec.d.ts +0 -2
  592. package/dist/types/tests/scenarios/messages-query.spec.d.ts.map +0 -1
  593. package/src/event-log/event-log-level.ts +0 -72
  594. package/src/handlers/messages-query.ts +0 -67
  595. package/src/interfaces/messages-query.ts +0 -60
  596. package/src/types/event-log.ts +0 -52
  597. /package/dist/esm/src/{event-log → event-stream}/event-emitter-stream.js +0 -0
  598. /package/dist/types/src/{event-log → event-stream}/event-emitter-stream.d.ts +0 -0
  599. /package/dist/types/tests/{event-log → event-stream}/event-emitter-stream.spec.d.ts +0 -0
  600. /package/dist/types/tests/{event-log → event-stream}/event-stream.spec.d.ts +0 -0
  601. /package/src/{event-log → event-stream}/event-emitter-stream.ts +0 -0
@@ -1,7 +1,7 @@
1
1
  import type { DataEncodedRecordsWriteMessage } from '../types/records-types.js';
2
+ import type { MessageSigner } from '../types/signer.js';
2
3
  import type { MessageStore } from '../types/message-store.js';
3
- import type { Signer } from '../types/signer.js';
4
- import type { ProtocolDefinition, ProtocolRuleSet, ProtocolsConfigureDescriptor, ProtocolsConfigureMessage } from '../types/protocols-types.js';
4
+ import type { ProtocolDefinition, ProtocolRuleSet, ProtocolsConfigureDescriptor, ProtocolsConfigureMessage, ProtocolUses } from '../types/protocols-types.js';
5
5
 
6
6
  import { AbstractMessage } from '../core/abstract-message.js';
7
7
  import Ajv from 'ajv/dist/2020.js';
@@ -11,13 +11,14 @@ import { ProtocolsGrantAuthorization } from '../core/protocols-grant-authorizati
11
11
  import { Time } from '../utils/time.js';
12
12
  import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
13
13
  import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
14
+ import { isCrossProtocolRef, parseCrossProtocolRef } from '../utils/protocols.js';
14
15
  import { normalizeProtocolUrl, normalizeSchemaUrl, validateProtocolUrlNormalized, validateSchemaUrlNormalized } from '../utils/url.js';
15
16
  import { ProtocolAction, ProtocolActor } from '../types/protocols-types.js';
16
17
 
17
18
  export type ProtocolsConfigureOptions = {
18
19
  messageTimestamp?: string;
19
20
  definition: ProtocolDefinition;
20
- signer: Signer;
21
+ signer: MessageSigner;
21
22
  /**
22
23
  * The delegated grant invoked to sign on behalf of the logical author, which is the grantor of the delegated grant.
23
24
  */
@@ -40,7 +41,8 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
40
41
  interface : DwnInterfaceName.Protocols,
41
42
  method : DwnMethodName.Configure,
42
43
  messageTimestamp : options.messageTimestamp ?? Time.getCurrentTimestamp(),
43
- definition : ProtocolsConfigure.normalizeDefinition(options.definition)
44
+ definition : ProtocolsConfigure.normalizeDefinition(options.definition),
45
+ ...(options.permissionGrantId !== undefined && { permissionGrantId: options.permissionGrantId }),
44
46
  };
45
47
 
46
48
  const authorization = await Message.createAuthorization({
@@ -77,7 +79,7 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
77
79
  * Performs validation on the given protocol definition that are not easy to do using a JSON schema.
78
80
  */
79
81
  private static validateProtocolDefinition(definition: ProtocolDefinition): void {
80
- const { protocol, types } = definition;
82
+ const { protocol, types, uses } = definition;
81
83
 
82
84
  // validate protocol url
83
85
  validateProtocolUrlNormalized(protocol);
@@ -90,16 +92,57 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
90
92
  }
91
93
  }
92
94
 
93
- // validate `structure
95
+ // validate `uses` — alias names must be simple identifiers, values must be normalized URLs, and no self-references
96
+ if (uses !== undefined) {
97
+ ProtocolsConfigure.validateUses(uses, protocol);
98
+ }
99
+
100
+ // validate `structure`
94
101
  ProtocolsConfigure.validateStructure(definition);
95
102
  }
96
103
 
104
+ /**
105
+ * Validates the `uses` map: alias names must match `^[a-zA-Z][a-zA-Z0-9_-]*$`,
106
+ * values must be normalized protocol URLs, and no alias may reference the protocol itself.
107
+ */
108
+ private static validateUses(uses: ProtocolUses, ownProtocolUri: string): void {
109
+ const aliasPattern = /^[a-zA-Z][a-zA-Z0-9_-]*$/;
110
+
111
+ for (const alias in uses) {
112
+ if (!aliasPattern.test(alias)) {
113
+ throw new DwnError(
114
+ DwnErrorCode.ProtocolsConfigureInvalidUsesAlias,
115
+ `invalid 'uses' alias '${alias}': must match pattern ${aliasPattern.toString()}.`
116
+ );
117
+ }
118
+
119
+ try {
120
+ validateProtocolUrlNormalized(uses[alias]);
121
+ } catch {
122
+ throw new DwnError(
123
+ DwnErrorCode.ProtocolsConfigureInvalidUsesProtocolUrl,
124
+ `invalid 'uses' protocol URL for alias '${alias}': '${uses[alias]}' is not a valid normalized protocol URL.`
125
+ );
126
+ }
127
+
128
+ // reject self-references: a protocol cannot compose itself
129
+ if (uses[alias] === ownProtocolUri) {
130
+ throw new DwnError(
131
+ DwnErrorCode.ProtocolsConfigureInvalidUsesSelfReference,
132
+ `'uses' alias '${alias}' references the protocol's own URI '${ownProtocolUri}'. ` +
133
+ `a protocol cannot compose itself.`
134
+ );
135
+ }
136
+ }
137
+ }
138
+
97
139
  private static validateStructure(definition: ProtocolDefinition): void {
140
+ const { uses } = definition;
98
141
 
99
142
  // gather all declared record types
100
143
  const recordTypes = Object.keys(definition.types);
101
144
 
102
- // gather all roles
145
+ // gather all roles (local roles only — cross-protocol roles are validated by alias existence)
103
146
  const roles = ProtocolsConfigure.fetchAllRolePathsRecursively('', definition.structure, []);
104
147
 
105
148
  // validate the entire rule set structure recursively
@@ -107,7 +150,8 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
107
150
  ruleSet : definition.structure,
108
151
  ruleSetProtocolPath : '',
109
152
  recordTypes,
110
- roles
153
+ roles,
154
+ uses
111
155
  });
112
156
  }
113
157
 
@@ -152,11 +196,24 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
152
196
  * Validates the given rule set structure then recursively validates its nested child rule sets.
153
197
  */
154
198
  private static validateRuleSetRecursively(
155
- input: { ruleSet: ProtocolRuleSet, ruleSetProtocolPath: string, recordTypes: string[], roles: string[] }
199
+ input: { ruleSet: ProtocolRuleSet, ruleSetProtocolPath: string, recordTypes: string[], roles: string[], uses?: ProtocolUses }
156
200
  ): void {
157
- const { ruleSet, ruleSetProtocolPath, recordTypes, roles } = input;
201
+ const { ruleSet, ruleSetProtocolPath, recordTypes, roles, uses } = input;
158
202
 
159
- // Validate $actions in the rule set
203
+ // Validate $ref constraints: $ref is only supported at root level (no `/` in protocol path),
204
+ // and a $ref node is a pure attachment point with no other directives.
205
+ if (ruleSet.$ref !== undefined) {
206
+ if (ruleSetProtocolPath.includes('/')) {
207
+ throw new DwnError(
208
+ DwnErrorCode.ProtocolsConfigureInvalidRefNotAtRoot,
209
+ `'$ref' at protocol path '${ruleSetProtocolPath}' is not allowed: '$ref' nodes are only supported at the root level of the structure.`
210
+ );
211
+ }
212
+
213
+ ProtocolsConfigure.validateRefNode(ruleSet, ruleSetProtocolPath, uses);
214
+ }
215
+
216
+ // Validate $size
160
217
  if (ruleSet.$size !== undefined) {
161
218
  const { min = 0, max } = ruleSet.$size;
162
219
 
@@ -190,20 +247,15 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
190
247
 
191
248
  // Validate the `role` property of an `action` if exists.
192
249
  if (actionRule.role !== undefined) {
193
- // make sure the role contains a valid protocol paths to a role record
194
- if (!roles.includes(actionRule.role)) {
195
- throw new DwnError(
196
- DwnErrorCode.ProtocolsConfigureRoleDoesNotExistAtGivenPath,
197
- `Role in action ${JSON.stringify(actionRule)} for rule set ${ruleSetProtocolPath} does not exist.`
198
- );
250
+ if (isCrossProtocolRef(actionRule.role)) {
251
+ // Cross-protocol role reference: validate alias exists in `uses`
252
+ ProtocolsConfigure.validateCrossProtocolAlias(actionRule.role, uses, ruleSetProtocolPath, 'role');
199
253
  } else {
200
- // it is a role record, we ensure that if any of the `can` actions are 'read' type of actions ('read', 'query', 'subscribe'),
201
- // that they are all present.
202
- const readActions = [ProtocolAction.Read, ProtocolAction.Query, ProtocolAction.Subscribe];
203
- if (readActions.find( action => actionRule.can.includes(action)) && !readActions.every(action => actionRule.can.includes(action))) {
254
+ // Local role: make sure the role contains a valid protocol path to a role record
255
+ if (!roles.includes(actionRule.role)) {
204
256
  throw new DwnError(
205
- DwnErrorCode.ProtocolsConfigureRoleReadActionMissing,
206
- `Role in action ${JSON.stringify(actionRule)} for rule set ${ruleSetProtocolPath} must contain all read actions (${readActions.join(', ')}).`
257
+ DwnErrorCode.ProtocolsConfigureRoleDoesNotExistAtGivenPath,
258
+ `Role in action ${JSON.stringify(actionRule)} for rule set ${ruleSetProtocolPath} does not exist.`
207
259
  );
208
260
  }
209
261
  }
@@ -218,12 +270,11 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
218
270
  }
219
271
 
220
272
  // Validate that if `who === recipient` and `of === undefined`, then `can` can only contain `co-update`, `co-delete`, and `co-prune`.
221
- // We do not allow `read`, `write`, or `query` in the `can` array because:
222
- // - `read` - Recipients are always allowed to `read`.
273
+ // We do not allow `read` or `write` in the `can` array because:
274
+ // - `read` - Recipients are always allowed to read.
223
275
  // - `write` - Entails ability to create and update.
224
276
  // Since `of` is undefined, it implies the recipient of THIS record,
225
277
  // there is no 'recipient' until this record has been created, so it makes no sense to allow recipient to write this record.
226
- // - `query` - Only authorized using roles, so allowing direct recipients to query is outside the scope.
227
278
  if (actionRule.who === ProtocolActor.Recipient && actionRule.of === undefined) {
228
279
 
229
280
  // throw if `can` contains a value that is not `co-update`, `co-delete`, or `co-prune`
@@ -246,7 +297,29 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
246
297
  );
247
298
  }
248
299
 
249
- // validate that if `can` contains `update` or `delete`, it must also contain `create`
300
+ // Validate that `of` points to the current protocol path or an ancestor of it.
301
+ // At runtime, `checkActor()` searches the record chain for a matching `protocolPath` equal to `actionRule.of`.
302
+ // If `of` is not the current path or one of its ancestors, the action rule would silently never authorize anyone.
303
+ if (actionRule.of !== undefined && ruleSetProtocolPath !== '') {
304
+ if (isCrossProtocolRef(actionRule.of)) {
305
+ // Cross-protocol `of` reference: validate alias exists in `uses`
306
+ ProtocolsConfigure.validateCrossProtocolAlias(actionRule.of, uses, ruleSetProtocolPath, 'of');
307
+ } else {
308
+ // Local `of`: must be self or ancestor
309
+ const isSelfOrAncestor = ruleSetProtocolPath === actionRule.of
310
+ || ruleSetProtocolPath.startsWith(actionRule.of + '/');
311
+ if (!isSelfOrAncestor) {
312
+ throw new DwnError(
313
+ DwnErrorCode.ProtocolsConfigureInvalidActionOfNotAnAncestor,
314
+ `'of' value '${actionRule.of}' is not an ancestor of protocol path '${ruleSetProtocolPath}' ` +
315
+ `in action rule ${JSON.stringify(actionRule)}.`
316
+ );
317
+ }
318
+ }
319
+ }
320
+
321
+ // validate that if `can` contains `update`, `delete`, or `prune`, it must also contain `create`
322
+ // because these are author-only actions, and you can only be the author if you can create
250
323
  if (actionRule.can !== undefined) {
251
324
  if (actionRule.can.includes(ProtocolAction.Update) && !actionRule.can.includes(ProtocolAction.Create)) {
252
325
  throw new DwnError(
@@ -261,6 +334,13 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
261
334
  `Action rule ${JSON.stringify(actionRule)} contains 'delete' action but missing the required 'create' action.`
262
335
  );
263
336
  }
337
+
338
+ if (actionRule.can.includes(ProtocolAction.Prune) && !actionRule.can.includes(ProtocolAction.Create)) {
339
+ throw new DwnError(
340
+ DwnErrorCode.ProtocolsConfigureInvalidActionPruneWithoutCreate,
341
+ `Action rule ${JSON.stringify(actionRule)} contains 'prune' action but missing the required 'create' action.`
342
+ );
343
+ }
264
344
  }
265
345
 
266
346
  // Validate that there are no duplicate actors or roles in the remaining action rules:
@@ -273,7 +353,8 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
273
353
  if (actionRule.who === otherActionRule.who && actionRule.of === otherActionRule.of) {
274
354
  throw new DwnError(
275
355
  DwnErrorCode.ProtocolsConfigureDuplicateActorInRuleSet,
276
- `More than one action rule per actor ${actionRule.who} of ${actionRule.of} not allowed within a rule set: ${JSON.stringify(actionRule)}`
356
+ `More than one action rule per actor ${actionRule.who} of ${actionRule.of} ` +
357
+ `not allowed within a rule set: ${JSON.stringify(actionRule)}`
277
358
  );
278
359
  }
279
360
  } else {
@@ -295,15 +376,17 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
295
376
  continue;
296
377
  }
297
378
 
298
- if (!recordTypes.includes(recordType)) {
379
+ const childRuleSet = ruleSet[recordType];
380
+
381
+ // A structure key whose rule set has `$ref` does not need to be in the local `types` map —
382
+ // the type comes from the referenced protocol. All other keys must be in `types`.
383
+ if (childRuleSet.$ref === undefined && !recordTypes.includes(recordType)) {
299
384
  throw new DwnError(
300
385
  DwnErrorCode.ProtocolsConfigureInvalidRuleSetRecordType,
301
386
  `Rule set ${recordType} is not declared as an allowed type in the protocol definition.`
302
387
  );
303
388
  }
304
389
 
305
- const childRuleSet = ruleSet[recordType];
306
-
307
390
  let childRuleSetProtocolPath;
308
391
  if (ruleSetProtocolPath === '') {
309
392
  childRuleSetProtocolPath = recordType; // case of initial definition structure
@@ -315,13 +398,94 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
315
398
  ruleSet : childRuleSet,
316
399
  ruleSetProtocolPath : childRuleSetProtocolPath,
317
400
  recordTypes,
318
- roles
401
+ roles,
402
+ uses
319
403
  });
320
404
  }
321
405
  }
322
406
 
407
+ /**
408
+ * Validates that a `$ref` node is a pure attachment point: it must NOT have
409
+ * `$actions`, `$role`, `$size`, `$tags`, or `$encryption`.
410
+ * Also validates that the `$ref` alias exists in the `uses` map.
411
+ */
412
+ private static validateRefNode(ruleSet: ProtocolRuleSet, ruleSetProtocolPath: string, uses: ProtocolUses | undefined): void {
413
+ const ref = ruleSet.$ref!;
414
+ const parsed = parseCrossProtocolRef(ref);
415
+
416
+ if (parsed === undefined) {
417
+ throw new DwnError(
418
+ DwnErrorCode.ProtocolsConfigureInvalidRefAlias,
419
+ `'$ref' value '${ref}' at protocol path '${ruleSetProtocolPath}' must be in 'alias:typePath' format.`
420
+ );
421
+ }
422
+
423
+ // validate alias exists in `uses`
424
+ if (uses === undefined || uses[parsed.alias] === undefined) {
425
+ throw new DwnError(
426
+ DwnErrorCode.ProtocolsConfigureInvalidRefAlias,
427
+ `'$ref' alias '${parsed.alias}' at protocol path '${ruleSetProtocolPath}' does not exist in the 'uses' map.`
428
+ );
429
+ }
430
+
431
+ // validate that `$ref` nodes do not have other directives
432
+ const forbiddenDirectives = ['$actions', '$role', '$size', '$tags', '$encryption'] as const;
433
+ for (const directive of forbiddenDirectives) {
434
+ if (ruleSet[directive] !== undefined) {
435
+ throw new DwnError(
436
+ DwnErrorCode.ProtocolsConfigureInvalidRefNodeHasDirectives,
437
+ `'$ref' node at protocol path '${ruleSetProtocolPath}' must not have '${directive}'. ` +
438
+ `$ref nodes are pure attachment points — directives belong on child rule sets.`
439
+ );
440
+ }
441
+ }
442
+ }
443
+
444
+ /**
445
+ * Validates that a cross-protocol reference (in `alias:path` format) has a valid alias
446
+ * that exists in the `uses` map.
447
+ * @param ref - The cross-protocol reference string (e.g., "threads:thread/participant")
448
+ * @param uses - The protocol definition's `uses` map
449
+ * @param ruleSetProtocolPath - The current protocol path (for error messages)
450
+ * @param fieldName - The field name ('role' or 'of') for error messages
451
+ */
452
+ private static validateCrossProtocolAlias(
453
+ ref: string, uses: ProtocolUses | undefined, ruleSetProtocolPath: string, fieldName: string
454
+ ): void {
455
+ const parsed = parseCrossProtocolRef(ref);
456
+
457
+ if (parsed === undefined) {
458
+ // should not happen if isCrossProtocolRef() returned true, but guard defensively
459
+ const errorCode = fieldName === 'role'
460
+ ? DwnErrorCode.ProtocolsConfigureInvalidCrossProtocolRole
461
+ : DwnErrorCode.ProtocolsConfigureInvalidCrossProtocolOf;
462
+
463
+ throw new DwnError(
464
+ errorCode,
465
+ `cross-protocol '${fieldName}' reference '${ref}' at protocol path '${ruleSetProtocolPath}' ` +
466
+ `could not be parsed as a valid 'alias:path' format.`
467
+ );
468
+ }
469
+
470
+ if (uses === undefined || uses[parsed.alias] === undefined) {
471
+ const errorCode = fieldName === 'role'
472
+ ? DwnErrorCode.ProtocolsConfigureInvalidCrossProtocolRole
473
+ : DwnErrorCode.ProtocolsConfigureInvalidCrossProtocolOf;
474
+
475
+ throw new DwnError(
476
+ errorCode,
477
+ `cross-protocol '${fieldName}' alias '${parsed.alias}' in '${ref}' at protocol path '${ruleSetProtocolPath}' ` +
478
+ `does not exist in the 'uses' map.`
479
+ );
480
+ }
481
+ }
482
+
323
483
  private static normalizeDefinition(definition: ProtocolDefinition): ProtocolDefinition {
324
- const typesCopy = { ...definition.types };
484
+ // Deep clone types to avoid mutating the caller's nested objects
485
+ const typesCopy: ProtocolDefinition['types'] = {};
486
+ for (const typeName in definition.types) {
487
+ typesCopy[typeName] = { ...definition.types[typeName] };
488
+ }
325
489
 
326
490
  // Normalize schema url
327
491
  for (const typeName in typesCopy) {
@@ -331,10 +495,24 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
331
495
  }
332
496
  }
333
497
 
498
+ // Normalize `uses` protocol URLs (skip invalid URLs — they will be caught by validateUses)
499
+ let usesCopy: ProtocolDefinition['uses'];
500
+ if (definition.uses !== undefined) {
501
+ usesCopy = {};
502
+ for (const alias in definition.uses) {
503
+ try {
504
+ usesCopy[alias] = normalizeProtocolUrl(definition.uses[alias]);
505
+ } catch {
506
+ usesCopy[alias] = definition.uses[alias];
507
+ }
508
+ }
509
+ }
510
+
334
511
  return {
335
512
  ...definition,
336
513
  protocol : normalizeProtocolUrl(definition.protocol),
337
514
  types : typesCopy,
515
+ ...(usesCopy !== undefined && { uses: usesCopy }),
338
516
  };
339
517
  }
340
518
  }
@@ -1,6 +1,6 @@
1
1
  import type { AuthorizationModel } from '../types/message-types.js';
2
+ import type { MessageSigner } from '../types/signer.js';
2
3
  import type { MessageStore } from '../types/message-store.js';
3
- import type { Signer } from '../types/signer.js';
4
4
  import type { ProtocolsQueryDescriptor, ProtocolsQueryFilter, ProtocolsQueryMessage } from '../types/protocols-types.js';
5
5
 
6
6
  import { AbstractMessage } from '../core/abstract-message.js';
@@ -16,7 +16,7 @@ import { normalizeProtocolUrl, validateProtocolUrlNormalized } from '../utils/ur
16
16
  export type ProtocolsQueryOptions = {
17
17
  messageTimestamp?: string;
18
18
  filter?: ProtocolsQueryFilter,
19
- signer?: Signer;
19
+ signer?: MessageSigner;
20
20
  permissionGrantId?: string;
21
21
  };
22
22
 
@@ -38,10 +38,11 @@ export class ProtocolsQuery extends AbstractMessage<ProtocolsQueryMessage> {
38
38
  public static async create(options: ProtocolsQueryOptions): Promise<ProtocolsQuery> {
39
39
 
40
40
  const descriptor: ProtocolsQueryDescriptor = {
41
- interface : DwnInterfaceName.Protocols,
42
- method : DwnMethodName.Query,
43
- messageTimestamp : options.messageTimestamp ?? Time.getCurrentTimestamp(),
44
- filter : options.filter ? ProtocolsQuery.normalizeFilter(options.filter) : undefined,
41
+ interface : DwnInterfaceName.Protocols,
42
+ method : DwnMethodName.Query,
43
+ messageTimestamp : options.messageTimestamp ?? Time.getCurrentTimestamp(),
44
+ filter : options.filter ? ProtocolsQuery.normalizeFilter(options.filter) : undefined,
45
+ permissionGrantId : options.permissionGrantId,
45
46
  };
46
47
 
47
48
  // delete all descriptor properties that are `undefined` else the code will encounter the following IPLD issue when attempting to generate CID:
@@ -0,0 +1,106 @@
1
+ import type { MessageSigner } from '../types/signer.js';
2
+ import type { MessageStore } from '../types/message-store.js';
3
+ import type { DataEncodedRecordsWriteMessage, RecordsCountDescriptor, RecordsCountMessage, RecordsFilter } from '../types/records-types.js';
4
+
5
+ import { AbstractMessage } from '../core/abstract-message.js';
6
+ import { Message } from '../core/message.js';
7
+ import { PermissionGrant } from '../protocols/permission-grant.js';
8
+ import { Records } from '../utils/records.js';
9
+ import { RecordsGrantAuthorization } from '../core/records-grant-authorization.js';
10
+ import { removeUndefinedProperties } from '../utils/object.js';
11
+ import { Time } from '../utils/time.js';
12
+ import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
13
+ import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
14
+ import { validateProtocolUrlNormalized, validateSchemaUrlNormalized } from '../utils/url.js';
15
+
16
+ export type RecordsCountOptions = {
17
+ messageTimestamp?: string;
18
+ filter: RecordsFilter;
19
+ signer?: MessageSigner;
20
+ protocolRole?: string;
21
+
22
+ /**
23
+ * The delegated grant to sign on behalf of the logical author, which is the grantor (`grantedBy`) of the delegated grant.
24
+ */
25
+ delegatedGrant?: DataEncodedRecordsWriteMessage;
26
+ };
27
+
28
+ /**
29
+ * A class representing a RecordsCount DWN message.
30
+ */
31
+ export class RecordsCount extends AbstractMessage<RecordsCountMessage> {
32
+
33
+ public static async parse(message: RecordsCountMessage): Promise<RecordsCount> {
34
+ let signaturePayload;
35
+ if (message.authorization !== undefined) {
36
+ signaturePayload = await Message.validateSignatureStructure(message.authorization.signature, message.descriptor);
37
+ }
38
+
39
+ await Records.validateDelegatedGrantReferentialIntegrity(message, signaturePayload);
40
+
41
+ if (signaturePayload?.protocolRole !== undefined) {
42
+ if (message.descriptor.filter.protocolPath === undefined) {
43
+ throw new DwnError(
44
+ DwnErrorCode.RecordsCountFilterMissingRequiredProperties,
45
+ 'Role-authorized counts must include `protocolPath` in the filter'
46
+ );
47
+ }
48
+ }
49
+
50
+ if (message.descriptor.filter.protocol !== undefined) {
51
+ validateProtocolUrlNormalized(message.descriptor.filter.protocol);
52
+ }
53
+ if (message.descriptor.filter.schema !== undefined) {
54
+ validateSchemaUrlNormalized(message.descriptor.filter.schema);
55
+ }
56
+
57
+ Time.validateTimestamp(message.descriptor.messageTimestamp);
58
+
59
+ return new RecordsCount(message);
60
+ }
61
+
62
+ public static async create(options: RecordsCountOptions): Promise<RecordsCount> {
63
+ const descriptor: RecordsCountDescriptor = {
64
+ interface : DwnInterfaceName.Records,
65
+ method : DwnMethodName.Count,
66
+ messageTimestamp : options.messageTimestamp ?? Time.getCurrentTimestamp(),
67
+ filter : Records.normalizeFilter(options.filter),
68
+ };
69
+
70
+ // delete all descriptor properties that are `undefined` else the code will encounter the following IPLD issue when attempting to generate CID:
71
+ // Error: `undefined` is not supported by the IPLD Data Model and cannot be encoded
72
+ removeUndefinedProperties(descriptor);
73
+
74
+ // only generate the `authorization` property if signature input is given
75
+ const signer = options.signer;
76
+ let authorization;
77
+ if (signer) {
78
+ authorization = await Message.createAuthorization({
79
+ descriptor,
80
+ signer,
81
+ protocolRole : options.protocolRole,
82
+ delegatedGrant : options.delegatedGrant
83
+ });
84
+ }
85
+ const message = { descriptor, authorization };
86
+
87
+ Message.validateJsonSchema(message);
88
+
89
+ return new RecordsCount(message);
90
+ }
91
+
92
+ /**
93
+ * Authorizes the delegate who signed the message.
94
+ * @param messageStore Used to check if the grant has been revoked.
95
+ */
96
+ public async authorizeDelegate(messageStore: MessageStore): Promise<void> {
97
+ const delegatedGrant = await PermissionGrant.parse(this.message.authorization!.authorDelegatedGrant!);
98
+ await RecordsGrantAuthorization.authorizeQueryOrSubscribe({
99
+ incomingMessage : this.message,
100
+ expectedGrantor : this.author!,
101
+ expectedGrantee : this.signer!,
102
+ permissionGrant : delegatedGrant,
103
+ messageStore
104
+ });
105
+ }
106
+ }
@@ -1,6 +1,6 @@
1
1
  import type { KeyValues } from '../types/query-types.js';
2
+ import type { MessageSigner } from '../types/signer.js';
2
3
  import type { MessageStore } from '../types//message-store.js';
3
- import type { Signer } from '../types/signer.js';
4
4
  import type { DataEncodedRecordsWriteMessage, RecordsDeleteDescriptor, RecordsDeleteMessage, RecordsWriteMessage } from '../types/records-types.js';
5
5
 
6
6
  import { AbstractMessage } from '../core/abstract-message.js';
@@ -16,7 +16,7 @@ export type RecordsDeleteOptions = {
16
16
  recordId: string;
17
17
  messageTimestamp?: string;
18
18
  protocolRole?: string;
19
- signer: Signer;
19
+ signer: MessageSigner;
20
20
 
21
21
  /**
22
22
  * Denotes if all the descendent records should be purged. Defaults to `false`.
@@ -1,6 +1,6 @@
1
+ import type { MessageSigner } from '../types/signer.js';
1
2
  import type { MessageStore } from '../types//message-store.js';
2
3
  import type { Pagination } from '../types/message-types.js';
3
- import type { Signer } from '../types/signer.js';
4
4
  import type { DataEncodedRecordsWriteMessage, RecordsFilter, RecordsQueryDescriptor, RecordsQueryMessage } from '../types/records-types.js';
5
5
 
6
6
  import { AbstractMessage } from '../core/abstract-message.js';
@@ -20,7 +20,7 @@ export type RecordsQueryOptions = {
20
20
  filter: RecordsFilter;
21
21
  dateSort?: DateSort;
22
22
  pagination?: Pagination;
23
- signer?: Signer;
23
+ signer?: MessageSigner;
24
24
  protocolRole?: string;
25
25
 
26
26
  /**
@@ -1,20 +1,23 @@
1
+ import type { MessageSigner } from '../types/signer.js';
1
2
  import type { MessageStore } from '../types//message-store.js';
2
- import type { Signer } from '../types/signer.js';
3
3
  import type { DataEncodedRecordsWriteMessage, RecordsFilter , RecordsReadDescriptor, RecordsReadMessage, RecordsWriteMessage } from '../types/records-types.js';
4
4
 
5
5
  import { AbstractMessage } from '../core/abstract-message.js';
6
+ import { DateSort } from '../types/records-types.js';
6
7
  import { Message } from '../core/message.js';
7
8
  import { PermissionGrant } from '../protocols/permission-grant.js';
8
9
  import { Records } from '../utils/records.js';
9
10
  import { RecordsGrantAuthorization } from '../core/records-grant-authorization.js';
10
11
  import { removeUndefinedProperties } from '../utils/object.js';
11
12
  import { Time } from '../utils/time.js';
13
+ import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
12
14
  import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
13
15
 
14
16
  export type RecordsReadOptions = {
15
17
  filter: RecordsFilter;
16
18
  messageTimestamp?: string;
17
- signer?: Signer;
19
+ dateSort?: DateSort;
20
+ signer?: MessageSigner;
18
21
  permissionGrantId?: string;
19
22
  /**
20
23
  * Used when authorizing protocol records.
@@ -31,6 +34,15 @@ export type RecordsReadOptions = {
31
34
  export class RecordsRead extends AbstractMessage<RecordsReadMessage> {
32
35
 
33
36
  public static async parse(message: RecordsReadMessage): Promise<RecordsRead> {
37
+ if (message.descriptor.filter.published === false) {
38
+ if (message.descriptor.dateSort === DateSort.PublishedAscending || message.descriptor.dateSort === DateSort.PublishedDescending) {
39
+ throw new DwnError(
40
+ DwnErrorCode.RecordsReadParseFilterPublishedSortInvalid,
41
+ `reads must not filter for \`published:false\` and sort by ${message.descriptor.dateSort}`
42
+ );
43
+ }
44
+ }
45
+
34
46
  let signaturePayload;
35
47
  if (message.authorization !== undefined) {
36
48
  signaturePayload = await Message.validateSignatureStructure(message.authorization.signature, message.descriptor);
@@ -52,14 +64,25 @@ export class RecordsRead extends AbstractMessage<RecordsReadMessage> {
52
64
  * @throws {DwnError} when a combination of required RecordsReadOptions are missing
53
65
  */
54
66
  public static async create(options: RecordsReadOptions): Promise<RecordsRead> {
55
- const { filter, signer, permissionGrantId, protocolRole } = options;
67
+ const { filter, signer, permissionGrantId, protocolRole, dateSort } = options;
56
68
  const currentTime = Time.getCurrentTimestamp();
57
69
 
70
+ if (options.filter.published === false) {
71
+ if (dateSort === DateSort.PublishedAscending || dateSort === DateSort.PublishedDescending) {
72
+ throw new DwnError(
73
+ DwnErrorCode.RecordsReadCreateFilterPublishedSortInvalid,
74
+ `reads must not filter for \`published:false\` and sort by ${dateSort}`
75
+ );
76
+ }
77
+ }
78
+
58
79
  const descriptor: RecordsReadDescriptor = {
59
80
  interface : DwnInterfaceName.Records,
60
81
  method : DwnMethodName.Read,
61
82
  filter : Records.normalizeFilter(filter),
62
83
  messageTimestamp : options.messageTimestamp ?? currentTime,
84
+ permissionGrantId,
85
+ dateSort,
63
86
  };
64
87
 
65
88
  removeUndefinedProperties(descriptor);
@@ -1,5 +1,5 @@
1
+ import type { MessageSigner } from '../types/signer.js';
1
2
  import type { MessageStore } from '../types/message-store.js';
2
- import type { Signer } from '../types/signer.js';
3
3
  import type { DataEncodedRecordsWriteMessage, RecordsFilter, RecordsSubscribeDescriptor, RecordsSubscribeMessage } from '../types/records-types.js';
4
4
 
5
5
  import { AbstractMessage } from '../core/abstract-message.js';
@@ -16,7 +16,7 @@ import { validateProtocolUrlNormalized, validateSchemaUrlNormalized } from '../u
16
16
  export type RecordsSubscribeOptions = {
17
17
  messageTimestamp?: string;
18
18
  filter: RecordsFilter;
19
- signer?: Signer;
19
+ signer?: MessageSigner;
20
20
  protocolRole?: string;
21
21
 
22
22
  /**