@enbox/dwn-sdk-js 0.0.2 → 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 +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,9 +1,9 @@
1
1
  import type { GeneralJws } from '../types/jws-types.js';
2
2
  import type { KeyValues } from '../types/query-types.js';
3
3
  import type { MessageInterface } from '../types/message-interface.js';
4
+ import type { MessageSigner } from '../types/signer.js';
4
5
  import type { MessageStore } from '../types/message-store.js';
5
- import type { PublicJwk } from '../types/jose-types.js';
6
- import type { Signer } from '../types/signer.js';
6
+ import type { PublicKeyJwk } from '../types/jose-types.js';
7
7
  import type {
8
8
  DataEncodedRecordsWriteMessage,
9
9
  EncryptedKey,
@@ -62,20 +62,31 @@ export type RecordsWriteOptions = {
62
62
  /**
63
63
  * The signer of the message, which is commonly the author, but can also be a delegate.
64
64
  */
65
- signer?: Signer;
65
+ signer?: MessageSigner;
66
66
 
67
67
  /**
68
68
  * The delegated grant invoked to sign on behalf of the logical author, which is the grantor of the delegated grant.
69
69
  */
70
70
  delegatedGrant?: DataEncodedRecordsWriteMessage;
71
71
 
72
- attestationSigners?: Signer[];
72
+ attestationSigners?: MessageSigner[];
73
73
  encryptionInput?: EncryptionInput;
74
74
  permissionGrantId?: string;
75
+
76
+ /**
77
+ * The author's ProtocolPath-derived public key for key delivery.
78
+ * When set, this is attached to the authorization model so the DWN owner
79
+ * can encrypt context keys back to the author without querying the
80
+ * author's DWN.
81
+ */
82
+ authorKeyDeliveryPublicKey?: {
83
+ rootKeyId: string;
84
+ publicKeyJwk: PublicKeyJwk;
85
+ };
75
86
  };
76
87
 
77
88
  /**
78
- * Input that describes how data is encrypted as spec-ed in TP18 (https://github.com/TBD54566975/technical-proposals/pull/6).
89
+ * Input that describes how data is encrypted as spec-ed in TP18.
79
90
  */
80
91
  export type EncryptionInput = {
81
92
  /**
@@ -118,7 +129,7 @@ export type KeyEncryptionInput = {
118
129
  /**
119
130
  * Public key to be used to encrypt the symmetric key.
120
131
  */
121
- publicKey: PublicJwk;
132
+ publicKey: PublicKeyJwk;
122
133
 
123
134
  /**
124
135
  * Algorithm used for encrypting the symmetric key. Uses {EncryptionAlgorithm.EciesSecp256k1} if not given.
@@ -144,14 +155,14 @@ export type CreateFromOptions = {
144
155
  /**
145
156
  * The signer of the message, which is commonly the author, but can also be a delegate.
146
157
  */
147
- signer?: Signer;
158
+ signer?: MessageSigner;
148
159
 
149
160
  /**
150
161
  * The delegated grant to sign on behalf of the logical author, which is the grantor (`grantedBy`) of the delegated grant.
151
162
  */
152
163
  delegatedGrant?: DataEncodedRecordsWriteMessage;
153
164
 
154
- attestationSigners?: Signer[];
165
+ attestationSigners?: MessageSigner[];
155
166
  encryptionInput?: EncryptionInput;
156
167
  protocolRole?: string;
157
168
  };
@@ -280,6 +291,14 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
280
291
  // Make a copy so that the stored copy is not subject to external, unexpected modification.
281
292
  const message = JSON.parse(JSON.stringify(recordsWriteMessage)) as RecordsWriteMessage;
282
293
 
294
+ // Validate the message against the JSON schema.
295
+ // We strip internal properties that the MessageStore may attach to stored messages
296
+ // but are not part of the RecordsWrite JSON schema:
297
+ // - `encodedData`: base64url-encoded payload for small records
298
+ // - `initialWrite`: the initial RecordsWrite when this message is an update
299
+ const { encodedData: _, initialWrite: __, ...messageToValidate } = message as RecordsWriteMessage & Record<string, unknown>;
300
+ Message.validateJsonSchema(messageToValidate);
301
+
283
302
  // asynchronous checks that are required by the constructor to initialize members properly
284
303
 
285
304
  await Message.validateSignatureStructure(message.authorization.signature, message.descriptor, 'RecordsWriteSignaturePayload');
@@ -335,21 +354,22 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
335
354
  const currentTime = Time.getCurrentTimestamp();
336
355
 
337
356
  const descriptor: RecordsWriteDescriptor = {
338
- interface : DwnInterfaceName.Records,
339
- method : DwnMethodName.Write,
340
- protocol : options.protocol !== undefined ? normalizeProtocolUrl(options.protocol) : undefined,
341
- protocolPath : options.protocolPath,
342
- recipient : options.recipient,
343
- schema : options.schema !== undefined ? normalizeSchemaUrl(options.schema) : undefined,
344
- tags : options.tags,
345
- parentId : RecordsWrite.getRecordIdFromContextId(options.parentContextId),
357
+ interface : DwnInterfaceName.Records,
358
+ method : DwnMethodName.Write,
359
+ protocol : options.protocol !== undefined ? normalizeProtocolUrl(options.protocol) : undefined,
360
+ protocolPath : options.protocolPath,
361
+ recipient : options.recipient,
362
+ schema : options.schema !== undefined ? normalizeSchemaUrl(options.schema) : undefined,
363
+ tags : options.tags,
364
+ parentId : RecordsWrite.getRecordIdFromContextId(options.parentContextId),
346
365
  dataCid,
347
366
  dataSize,
348
- dateCreated : options.dateCreated ?? currentTime,
349
- messageTimestamp : options.messageTimestamp ?? currentTime,
350
- published : options.published,
351
- datePublished : options.datePublished,
352
- dataFormat : options.dataFormat
367
+ dateCreated : options.dateCreated ?? currentTime,
368
+ messageTimestamp : options.messageTimestamp ?? currentTime,
369
+ published : options.published,
370
+ datePublished : options.datePublished,
371
+ dataFormat : options.dataFormat,
372
+ permissionGrantId : options.permissionGrantId,
353
373
  };
354
374
 
355
375
  // generate `datePublished` if the message is to be published but `datePublished` is not given
@@ -385,10 +405,11 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
385
405
 
386
406
  if (options.signer !== undefined) {
387
407
  await recordsWrite.sign({
388
- signer : options.signer,
389
- delegatedGrant : options.delegatedGrant,
390
- permissionGrantId : options.permissionGrantId,
391
- protocolRole : options.protocolRole
408
+ signer : options.signer,
409
+ delegatedGrant : options.delegatedGrant,
410
+ permissionGrantId : options.permissionGrantId,
411
+ protocolRole : options.protocolRole,
412
+ authorKeyDeliveryPublicKey : options.authorKeyDeliveryPublicKey,
392
413
  });
393
414
  }
394
415
 
@@ -477,26 +498,65 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
477
498
 
478
499
  /**
479
500
  * Encrypts the symmetric encryption key using the public keys given and attach the resulting `encryption` property to the RecordsWrite.
501
+ *
502
+ * @param options.append - When `true`, appends new `keyEncryption` entries to the existing
503
+ * `encryption` property instead of replacing it. Requires `this._message.encryption` to
504
+ * already exist (i.e., the record must already be encrypted). This is used for the reactive
505
+ * root-record upgrade: adding a ProtocolContext `keyEncryption` entry alongside an existing
506
+ * ProtocolPath entry so both the owner and context key holders can decrypt.
480
507
  */
481
- public async encryptSymmetricEncryptionKey(encryptionInput: EncryptionInput): Promise<void> {
482
- this._message.encryption = await RecordsWrite.createEncryptionProperty(this._message.descriptor, encryptionInput);
508
+ public async encryptSymmetricEncryptionKey(
509
+ encryptionInput: EncryptionInput,
510
+ options?: { append?: boolean },
511
+ ): Promise<void> {
512
+ if (options?.append) {
513
+ if (!this._message.encryption) {
514
+ throw new DwnError(
515
+ DwnErrorCode.RecordsWriteMissingEncryption,
516
+ 'Cannot append keyEncryption entries: record does not have an existing `encryption` property.'
517
+ );
518
+ }
483
519
 
484
- // opportunity here to re-sign instead of remove
485
- delete this._message.authorization;
486
- this._signaturePayload = undefined;
487
- this._author = undefined;
520
+ // Build only the new keyEncryption entries (reuses createEncryptionProperty for ECIES logic)
521
+ const newEncryption = await RecordsWrite.createEncryptionProperty(this._message.descriptor, encryptionInput);
522
+ if (newEncryption) {
523
+ this._message.encryption.keyEncryption.push(...newEncryption.keyEncryption);
524
+ }
525
+
526
+ // In append mode, preserve the author's identity and authorization so
527
+ // that signAsOwner() can be called afterwards. The author's signature
528
+ // payload will have a stale encryptionCid (since we just appended new
529
+ // keyEncryption entries), but the owner's signature vouches for the
530
+ // updated state. validateIntegrity() skips the encryptionCid check on
531
+ // the author's signature when an ownerSignature is present.
532
+ //
533
+ // NOTE: An alternative design would deliver the DEK out-of-band via the
534
+ // key-delivery protocol (as a field on the contextKey record) instead of
535
+ // mutating the record's encryption property. That avoids the stale
536
+ // encryptionCid issue entirely but adds complexity to the read path and
537
+ // the contextKey schema. We chose the in-record approach because it keeps
538
+ // records self-contained and the read/decrypt path unchanged.
539
+ } else {
540
+ this._message.encryption = await RecordsWrite.createEncryptionProperty(this._message.descriptor, encryptionInput);
541
+
542
+ // Full replacement invalidates the authorization — caller must re-sign.
543
+ delete this._message.authorization;
544
+ this._signaturePayload = undefined;
545
+ this._author = undefined;
546
+ }
488
547
  }
489
548
 
490
549
  /**
491
550
  * Signs the RecordsWrite, the signer is commonly the author, but can also be a delegate.
492
551
  */
493
552
  public async sign(options: {
494
- signer: Signer,
553
+ signer: MessageSigner,
495
554
  delegatedGrant?: DataEncodedRecordsWriteMessage,
496
555
  permissionGrantId?: string,
497
- protocolRole?: string
556
+ protocolRole?: string,
557
+ authorKeyDeliveryPublicKey?: { rootKeyId: string; publicKeyJwk: PublicKeyJwk },
498
558
  }): Promise<void> {
499
- const { signer, delegatedGrant, permissionGrantId, protocolRole } = options;
559
+ const { signer, delegatedGrant, permissionGrantId, protocolRole, authorKeyDeliveryPublicKey } = options;
500
560
 
501
561
  // compute delegated grant ID and author if delegated grant is given
502
562
  let delegatedGrantId;
@@ -545,6 +605,10 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
545
605
  this._message.authorization.authorDelegatedGrant = delegatedGrant;
546
606
  }
547
607
 
608
+ if (authorKeyDeliveryPublicKey !== undefined) {
609
+ this._message.authorization.authorKeyDeliveryPublicKey = authorKeyDeliveryPublicKey;
610
+ }
611
+
548
612
  // there is opportunity to optimize here as the payload is constructed within `createAuthorization(...)`
549
613
  this._signaturePayload = Jws.decodePlainObjectPayload(signature);
550
614
  this._author = authorDid;
@@ -555,7 +619,7 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
555
619
  * This is used when the DWN owner wants to retain a copy of a message that the owner did not author.
556
620
  * NOTE: requires the `RecordsWrite` to already have the author's signature.
557
621
  */
558
- public async signAsOwner(signer: Signer): Promise<void> {
622
+ public async signAsOwner(signer: MessageSigner): Promise<void> {
559
623
  if (this._author === undefined) {
560
624
  throw new DwnError(
561
625
  DwnErrorCode.RecordsWriteSignAsOwnerUnknownAuthor,
@@ -577,7 +641,7 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
577
641
  * This is used when a DWN owner-delegate wants to retain a copy of a message that the owner did not author.
578
642
  * NOTE: requires the `RecordsWrite` to already have the author's signature.
579
643
  */
580
- public async signAsOwnerDelegate(signer: Signer, delegatedGrant: DataEncodedRecordsWriteMessage): Promise<void> {
644
+ public async signAsOwnerDelegate(signer: MessageSigner, delegatedGrant: DataEncodedRecordsWriteMessage): Promise<void> {
581
645
  if (this._author === undefined) {
582
646
  throw new DwnError(
583
647
  DwnErrorCode.RecordsWriteSignAsOwnerDelegateUnknownAuthor,
@@ -661,8 +725,14 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
661
725
  }
662
726
  }
663
727
 
664
- // if `encryption` is given in message, make sure the correct `encryptionCid` is in the payload of the message signature
665
- if (signaturePayload.encryptionCid !== undefined) {
728
+ // If `encryption` is given in message, make sure the correct `encryptionCid`
729
+ // is in the payload of the message signature — UNLESS the message has an
730
+ // ownerSignature. When the DWN owner appends keyEncryption entries to an
731
+ // externally-authored record (reactive root-record upgrade), the author's
732
+ // encryptionCid becomes stale. The owner's signature vouches for the
733
+ // updated encryption property, so the mismatch is expected and safe.
734
+ const hasOwnerSignature = this.message.authorization?.ownerSignature !== undefined;
735
+ if (signaturePayload.encryptionCid !== undefined && !hasOwnerSignature) {
666
736
  const expectedEncryptionCid = await Cid.computeCid(this.message.encryption);
667
737
  const actualEncryptionCid = signaturePayload.encryptionCid;
668
738
  if (actualEncryptionCid !== expectedEncryptionCid) {
@@ -696,7 +766,7 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
696
766
  return;
697
767
  }
698
768
 
699
- // TODO: multi-attesters to be unblocked by #205 - Revisit database interfaces (https://github.com/TBD54566975/dwn-sdk-js/issues/205)
769
+ // TODO: multi-attesters to be unblocked by #205 - Revisit database interfaces (https://github.com/enboxorg/enbox/issues/205)
700
770
  if (message.attestation.signatures.length !== 1) {
701
771
  throw new DwnError(
702
772
  DwnErrorCode.RecordsWriteAttestationIntegrityMoreThanOneSignature,
@@ -742,8 +812,7 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
742
812
  throw new DwnError(DwnErrorCode.RecordsWriteGetEntryIdUndefinedAuthor, 'Property `author` is needed to compute entry ID.');
743
813
  }
744
814
 
745
- const entryIdInput = { ...descriptor };
746
- (entryIdInput as any).author = author;
815
+ const entryIdInput: Record<string, unknown> = { ...descriptor, author };
747
816
 
748
817
  const cid = await Cid.computeCid(entryIdInput);
749
818
  return cid;
@@ -783,7 +852,7 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
783
852
  }
784
853
 
785
854
  // add additional indexes to optional values if given
786
- // TODO: index multi-attesters to be unblocked by #205 - Revisit database interfaces (https://github.com/TBD54566975/dwn-sdk-js/issues/205)
855
+ // TODO: index multi-attesters to be unblocked by #205 - Revisit database interfaces (https://github.com/enboxorg/enbox/issues/205)
787
856
  if (this.attesters.length > 0) { indexes.attester = this.attesters[0]; }
788
857
  if (message.contextId !== undefined) { indexes.contextId = message.contextId; }
789
858
 
@@ -907,7 +976,7 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
907
976
  /**
908
977
  * Creates the `attestation` property of a RecordsWrite message if given signature inputs; returns `undefined` otherwise.
909
978
  */
910
- public static async createAttestation(descriptorCid: string, signers?: Signer[]): Promise<GeneralJws | undefined> {
979
+ public static async createAttestation(descriptorCid: string, signers?: MessageSigner[]): Promise<GeneralJws | undefined> {
911
980
  if (signers === undefined || signers.length === 0) {
912
981
  return undefined;
913
982
  }
@@ -928,7 +997,7 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
928
997
  descriptorCid: string,
929
998
  attestation: GeneralJws | undefined,
930
999
  encryption: EncryptionProperty | undefined,
931
- signer: Signer,
1000
+ signer: MessageSigner,
932
1001
  delegatedGrantId?: string,
933
1002
  permissionGrantId?: string,
934
1003
  protocolRole?: string
@@ -988,8 +1057,8 @@ export class RecordsWrite implements MessageInterface<RecordsWriteMessage> {
988
1057
  for (const descriptorPropertyName of descriptorPropertyNames) {
989
1058
  // if property is supposed to be immutable
990
1059
  if (mutableDescriptorProperties.indexOf(descriptorPropertyName) === -1) {
991
- const valueInExistingWrite = (existingWriteMessage.descriptor as any)[descriptorPropertyName];
992
- const valueInNewMessage = (newMessage.descriptor as any)[descriptorPropertyName];
1060
+ const valueInExistingWrite = (existingWriteMessage.descriptor as Record<string, unknown>)[descriptorPropertyName];
1061
+ const valueInNewMessage = (newMessage.descriptor as Record<string, unknown>)[descriptorPropertyName];
993
1062
  if (valueInNewMessage !== valueInExistingWrite) {
994
1063
  throw new DwnError(
995
1064
  DwnErrorCode.RecordsWriteImmutablePropertyChanged,
@@ -1,19 +1,20 @@
1
1
  import * as Ed25519 from '@noble/ed25519';
2
- import type { PrivateJwk, PublicJwk, SignatureAlgorithm } from '../../../types/jose-types.js';
2
+ import type { JwkParamsOkpPrivate, JwkParamsOkpPublic } from '@enbox/crypto';
3
+ import type { PrivateKeyJwk, PublicKeyJwk, SignatureAlgorithm } from '../../../types/jose-types.js';
3
4
 
4
5
  import { Encoder } from '../../../utils/encoder.js';
5
6
  import { DwnError, DwnErrorCode } from '../../../core/dwn-error.js';
6
7
 
7
- function validateKey(jwk: PrivateJwk | PublicJwk): void {
8
- if (jwk.kty !== 'OKP' || jwk.crv !== 'Ed25519') {
8
+ function validateKey(jwk: PrivateKeyJwk | PublicKeyJwk): void {
9
+ if (jwk.kty !== 'OKP' || (jwk as JwkParamsOkpPublic).crv !== 'Ed25519') {
9
10
  throw new DwnError(DwnErrorCode.Ed25519InvalidJwk, 'invalid jwk. kty MUST be OKP. crv MUST be Ed25519');
10
11
  }
11
12
  }
12
13
 
13
- function publicKeyToJwk(publicKeyBytes: Uint8Array): PublicJwk {
14
+ function publicKeyToJwk(publicKeyBytes: Uint8Array): PublicKeyJwk {
14
15
  const x = Encoder.bytesToBase64Url(publicKeyBytes);
15
16
 
16
- const publicJwk: PublicJwk = {
17
+ const publicJwk: PublicKeyJwk = {
17
18
  alg : 'EdDSA',
18
19
  kty : 'OKP',
19
20
  crv : 'Ed25519',
@@ -24,35 +25,35 @@ function publicKeyToJwk(publicKeyBytes: Uint8Array): PublicJwk {
24
25
  }
25
26
 
26
27
  export const ed25519: SignatureAlgorithm = {
27
- sign: async (content: Uint8Array, privateJwk: PrivateJwk): Promise<Uint8Array> => {
28
+ sign: async (content: Uint8Array, privateJwk: PrivateKeyJwk): Promise<Uint8Array> => {
28
29
  validateKey(privateJwk);
29
30
 
30
- const privateKeyBytes = Encoder.base64UrlToBytes(privateJwk.d);
31
+ const privateKeyBytes = Encoder.base64UrlToBytes((privateJwk as JwkParamsOkpPrivate).d);
31
32
 
32
33
  return Ed25519.signAsync(content, privateKeyBytes);
33
34
  },
34
35
 
35
- verify: async (content: Uint8Array, signature: Uint8Array, publicJwk: PublicJwk): Promise<boolean> => {
36
+ verify: async (content: Uint8Array, signature: Uint8Array, publicJwk: PublicKeyJwk): Promise<boolean> => {
36
37
  validateKey(publicJwk);
37
38
 
38
- const publicKeyBytes = Encoder.base64UrlToBytes(publicJwk.x);
39
+ const publicKeyBytes = Encoder.base64UrlToBytes((publicJwk as JwkParamsOkpPublic).x);
39
40
 
40
41
  return Ed25519.verifyAsync(signature, content, publicKeyBytes);
41
42
  },
42
43
 
43
- generateKeyPair: async (): Promise<{publicJwk: PublicJwk, privateJwk: PrivateJwk}> => {
44
+ generateKeyPair: async (): Promise<{publicJwk: PublicKeyJwk, privateJwk: PrivateKeyJwk}> => {
44
45
  const privateKeyBytes = Ed25519.utils.randomPrivateKey();
45
46
  const publicKeyBytes = await Ed25519.getPublicKeyAsync(privateKeyBytes);
46
47
 
47
48
  const d = Encoder.bytesToBase64Url(privateKeyBytes);
48
49
 
49
50
  const publicJwk = publicKeyToJwk(publicKeyBytes);
50
- const privateJwk: PrivateJwk = { ...publicJwk, d };
51
+ const privateJwk: PrivateKeyJwk = { ...publicJwk, d };
51
52
 
52
53
  return { publicJwk, privateJwk };
53
54
  },
54
55
 
55
- publicKeyToJwk: async (publicKeyBytes: Uint8Array): Promise<PublicJwk> => {
56
+ publicKeyToJwk: async (publicKeyBytes: Uint8Array): Promise<PublicKeyJwk> => {
56
57
  return publicKeyToJwk(publicKeyBytes);
57
58
  }
58
59
  };
@@ -4,8 +4,13 @@ import { ed25519 } from './ed25519.js';
4
4
  import { Secp256k1 } from '../../../utils/secp256k1.js';
5
5
  import { Secp256r1 } from '../../../utils/secp256r1.js';
6
6
 
7
+ /**
8
+ * Curves supported by the DWN for signing and verification.
9
+ */
10
+ export type SupportedCurve = 'Ed25519' | 'secp256k1' | 'P-256';
11
+
7
12
  // the key should be the appropriate `crv` value
8
- export const signatureAlgorithms: Record<string, SignatureAlgorithm> = {
13
+ export const signatureAlgorithms: Record<SupportedCurve, SignatureAlgorithm> = {
9
14
  'Ed25519' : ed25519,
10
15
  'secp256k1' : {
11
16
  sign : Secp256k1.sign,
@@ -1,5 +1,5 @@
1
1
  import type { GeneralJws } from '../../../types/jws-types.js';
2
- import type { Signer } from '../../../types/signer.js';
2
+ import type { MessageSigner } from '../../../types/signer.js';
3
3
 
4
4
  import { Encoder } from '../../../utils/encoder.js';
5
5
 
@@ -10,7 +10,7 @@ export class GeneralJwsBuilder {
10
10
  this.jws = jws;
11
11
  }
12
12
 
13
- static async create(payload: Uint8Array, signers: Signer[] = []): Promise<GeneralJwsBuilder> {
13
+ static async create(payload: Uint8Array, signers: MessageSigner[] = []): Promise<GeneralJwsBuilder> {
14
14
  const jws: GeneralJws = {
15
15
  payload : Encoder.bytesToBase64Url(payload),
16
16
  signatures : []
@@ -25,7 +25,7 @@ export class GeneralJwsBuilder {
25
25
  return builder;
26
26
  }
27
27
 
28
- async addSignature(signer: Signer): Promise<void> {
28
+ async addSignature(signer: MessageSigner): Promise<void> {
29
29
  const protectedHeader = {
30
30
  kid : signer.keyId,
31
31
  alg : signer.algorithm
@@ -1,6 +1,6 @@
1
1
  import type { Cache } from '../../../types/cache.js';
2
2
  import type { GeneralJws } from '../../../types/jws-types.js';
3
- import type { PublicJwk } from '../../../types/jose-types.js';
3
+ import type { PublicKeyJwk } from '../../../types/jose-types.js';
4
4
  import type { DidResolver, DidVerificationMethod } from '@enbox/dids';
5
5
 
6
6
  import { Jws } from '../../../utils/jws.js';
@@ -80,7 +80,7 @@ export class GeneralJwsVerifier {
80
80
  /**
81
81
  * Gets the public key given a fully qualified key ID (`kid`) by resolving the DID to its DID Document.
82
82
  */
83
- private static async getPublicKey(kid: string, didResolver: DidResolver): Promise<PublicJwk> {
83
+ private static async getPublicKey(kid: string, didResolver: DidResolver): Promise<PublicKeyJwk> {
84
84
  // `resolve` throws exception if DID is invalid, DID method is not supported,
85
85
  // or resolving DID fails
86
86
  const did = Jws.extractDid(kid);
@@ -107,6 +107,6 @@ export class GeneralJwsVerifier {
107
107
 
108
108
  const { publicKeyJwk: publicJwk } = verificationMethod;
109
109
 
110
- return publicJwk as PublicJwk;
110
+ return publicJwk as PublicKeyJwk;
111
111
  }
112
112
  }
@@ -3,6 +3,7 @@ import type { PermissionConditions, PermissionGrantData, PermissionScope } from
3
3
 
4
4
  import { Encoder } from '../utils/encoder.js';
5
5
  import { Message } from '../core/message.js';
6
+ import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
6
7
 
7
8
 
8
9
  /**
@@ -60,11 +61,61 @@ export class PermissionGrant {
60
61
  */
61
62
  public readonly conditions?: PermissionConditions;
62
63
 
64
+ /**
65
+ * Parses a `DataEncodedRecordsWriteMessage` into a `PermissionGrant`.
66
+ * Validates that the message contains required structural fields:
67
+ * `encodedData`, `authorization` (for grantor extraction), `descriptor.recipient` (grantee),
68
+ * and that the decoded data contains `scope` and `dateExpires`.
69
+ * @throws {DwnError} if any required field is missing.
70
+ */
63
71
  public static async parse(message: DataEncodedRecordsWriteMessage): Promise<PermissionGrant> {
72
+ PermissionGrant.validateMessage(message);
64
73
  const permissionGrant = new PermissionGrant(message);
65
74
  return permissionGrant;
66
75
  }
67
76
 
77
+ /**
78
+ * Validates that the message has the required structural fields for a permission grant.
79
+ */
80
+ private static validateMessage(message: DataEncodedRecordsWriteMessage): void {
81
+ if (message.encodedData === undefined || message.encodedData === null) {
82
+ throw new DwnError(
83
+ DwnErrorCode.PermissionGrantParseMissingEncodedData,
84
+ 'permission grant message is missing encodedData'
85
+ );
86
+ }
87
+
88
+ if (Message.getSigner(message) === undefined) {
89
+ throw new DwnError(
90
+ DwnErrorCode.PermissionGrantParseMissingAuthorization,
91
+ 'permission grant message is missing authorization (unable to extract grantor)'
92
+ );
93
+ }
94
+
95
+ if (message.descriptor.recipient === undefined) {
96
+ throw new DwnError(
97
+ DwnErrorCode.PermissionGrantParseMissingRecipient,
98
+ 'permission grant message is missing descriptor.recipient (grantee)'
99
+ );
100
+ }
101
+
102
+ const grantData = Encoder.base64UrlToObject(message.encodedData) as Partial<PermissionGrantData>;
103
+
104
+ if (grantData.scope === undefined) {
105
+ throw new DwnError(
106
+ DwnErrorCode.PermissionGrantParseMissingScope,
107
+ 'permission grant data is missing required property `scope`'
108
+ );
109
+ }
110
+
111
+ if (grantData.dateExpires === undefined) {
112
+ throw new DwnError(
113
+ DwnErrorCode.PermissionGrantParseMissingDateExpires,
114
+ 'permission grant data is missing required property `dateExpires`'
115
+ );
116
+ }
117
+ }
118
+
68
119
  private constructor(message: DataEncodedRecordsWriteMessage) {
69
120
  // properties derived from the generic DWN message properties
70
121
  this.id = message.recordId;
@@ -3,6 +3,7 @@ import type { PermissionConditions, PermissionRequestData, PermissionScope } fro
3
3
 
4
4
  import { Encoder } from '../utils/encoder.js';
5
5
  import { Message } from '../core/message.js';
6
+ import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
6
7
 
7
8
 
8
9
  /**
@@ -41,11 +42,47 @@ export class PermissionRequest {
41
42
  */
42
43
  public readonly conditions?: PermissionConditions;
43
44
 
45
+ /**
46
+ * Parses a `DataEncodedRecordsWriteMessage` into a `PermissionRequest`.
47
+ * Validates that the message contains required structural fields:
48
+ * `encodedData`, `authorization` (for requester extraction),
49
+ * and that the decoded data contains `scope`.
50
+ * @throws {DwnError} if any required field is missing.
51
+ */
44
52
  public static async parse(message: DataEncodedRecordsWriteMessage): Promise<PermissionRequest> {
53
+ PermissionRequest.validateMessage(message);
45
54
  const permissionRequest = new PermissionRequest(message);
46
55
  return permissionRequest;
47
56
  }
48
57
 
58
+ /**
59
+ * Validates that the message has the required structural fields for a permission request.
60
+ */
61
+ private static validateMessage(message: DataEncodedRecordsWriteMessage): void {
62
+ if (message.encodedData === undefined || message.encodedData === null) {
63
+ throw new DwnError(
64
+ DwnErrorCode.PermissionRequestParseMissingEncodedData,
65
+ 'permission request message is missing encodedData'
66
+ );
67
+ }
68
+
69
+ if (Message.getSigner(message) === undefined) {
70
+ throw new DwnError(
71
+ DwnErrorCode.PermissionRequestParseMissingAuthorization,
72
+ 'permission request message is missing authorization (unable to extract requester)'
73
+ );
74
+ }
75
+
76
+ const requestData = Encoder.base64UrlToObject(message.encodedData) as Partial<PermissionRequestData>;
77
+
78
+ if (requestData.scope === undefined) {
79
+ throw new DwnError(
80
+ DwnErrorCode.PermissionRequestParseMissingScope,
81
+ 'permission request data is missing required property `scope`'
82
+ );
83
+ }
84
+ }
85
+
49
86
  private constructor(message: DataEncodedRecordsWriteMessage) {
50
87
  // properties derived from the generic DWN message properties
51
88
  this.id = message.recordId;
@@ -1,7 +1,7 @@
1
1
  import type { GenericMessage } from '../types/message-types.js';
2
+ import type { MessageSigner } from '../types/signer.js';
2
3
  import type { MessageStore } from '../types/message-store.js';
3
4
  import type { ProtocolDefinition } from '../types/protocols-types.js';
4
- import type { Signer } from '../types/signer.js';
5
5
  import type { DataEncodedRecordsWriteMessage, RecordsWriteMessage } from '../types/records-types.js';
6
6
  import type { PermissionConditions, PermissionGrantData, PermissionRequestData, PermissionRevocationData, PermissionScope, RecordsPermissionScope } from '../types/permission-types.js';
7
7
 
@@ -22,7 +22,7 @@ export type PermissionRequestCreateOptions = {
22
22
  /**
23
23
  * The signer of the request.
24
24
  */
25
- signer?: Signer;
25
+ signer?: MessageSigner;
26
26
 
27
27
  dateRequested?: string;
28
28
 
@@ -41,7 +41,7 @@ export type PermissionGrantCreateOptions = {
41
41
  /**
42
42
  * The signer of the grant.
43
43
  */
44
- signer?: Signer;
44
+ signer?: MessageSigner;
45
45
  grantedTo: string;
46
46
  dateGranted?: string;
47
47
 
@@ -65,7 +65,7 @@ export type PermissionRevocationCreateOptions = {
65
65
  /**
66
66
  * The signer of the grant.
67
67
  */
68
- signer?: Signer;
68
+ signer?: MessageSigner;
69
69
  /**
70
70
  * The PermissionGrant this revocation is for.
71
71
  */
@@ -138,7 +138,7 @@ export class PermissionsProtocol {
138
138
  {
139
139
  who : 'recipient',
140
140
  of : 'grant',
141
- can : ['read', 'query']
141
+ can : ['read']
142
142
  }
143
143
  ],
144
144
  revocation: {
@@ -1,15 +1,23 @@
1
1
  import * as precompiledValidators from '../generated/precompiled-validators.js';
2
2
  import { DwnError, DwnErrorCode } from './core/dwn-error.js';
3
3
 
4
+ /** AJV-style validate function with an optional `errors` array after invocation. */
5
+ interface ValidateError {
6
+ instancePath: string;
7
+ message: string;
8
+ keyword: string;
9
+ params: Record<string, unknown>;
10
+ }
11
+ type ValidateFn = ((payload: unknown) => boolean) & { errors?: ValidateError[] };
12
+
4
13
  /**
5
14
  * Validates the given payload using JSON schema keyed by the given schema name. Throws if the given payload fails validation.
6
15
  * @param schemaName the schema name use to look up the JSON schema to be used for schema validation.
7
16
  * The list of schema names can be found in compile-validators.js
8
17
  * @param payload javascript object to be validated
9
18
  */
10
- export function validateJsonSchema(schemaName: string, payload: any): void {
11
- // const validateFn = validator.getSchema(schemaName);
12
- const validateFn = (precompiledValidators as any)[schemaName];
19
+ export function validateJsonSchema(schemaName: string, payload: unknown): void {
20
+ const validateFn = (precompiledValidators as Record<string, ValidateFn>)[schemaName];
13
21
 
14
22
  if (!validateFn) {
15
23
  throw new DwnError(DwnErrorCode.SchemaValidatorSchemaNotFound, `schema for ${schemaName} not found.`);