@enbox/dwn-sdk-js 0.0.6 → 0.0.8

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 (527) hide show
  1. package/dist/browser.mjs +8 -8
  2. package/dist/browser.mjs.map +4 -4
  3. package/dist/esm/generated/precompiled-validators.js +762 -911
  4. package/dist/esm/generated/precompiled-validators.js.map +1 -1
  5. package/dist/esm/src/core/abstract-message.js +4 -0
  6. package/dist/esm/src/core/abstract-message.js.map +1 -1
  7. package/dist/esm/src/core/auth.js +22 -33
  8. package/dist/esm/src/core/auth.js.map +1 -1
  9. package/dist/esm/src/core/constants.js +11 -0
  10. package/dist/esm/src/core/constants.js.map +1 -0
  11. package/dist/esm/src/core/core-protocol.js +44 -0
  12. package/dist/esm/src/core/core-protocol.js.map +1 -0
  13. package/dist/esm/src/core/dwn-constant.js +7 -7
  14. package/dist/esm/src/core/dwn-constant.js.map +1 -1
  15. package/dist/esm/src/core/dwn-error.js +10 -12
  16. package/dist/esm/src/core/dwn-error.js.map +1 -1
  17. package/dist/esm/src/core/grant-authorization.js +50 -52
  18. package/dist/esm/src/core/grant-authorization.js.map +1 -1
  19. package/dist/esm/src/core/message.js +85 -116
  20. package/dist/esm/src/core/message.js.map +1 -1
  21. package/dist/esm/src/core/messages-grant-authorization.js +63 -78
  22. package/dist/esm/src/core/messages-grant-authorization.js.map +1 -1
  23. package/dist/esm/src/core/protocol-authorization-action.js +266 -0
  24. package/dist/esm/src/core/protocol-authorization-action.js.map +1 -0
  25. package/dist/esm/src/core/protocol-authorization-validation.js +321 -0
  26. package/dist/esm/src/core/protocol-authorization-validation.js.map +1 -0
  27. package/dist/esm/src/core/protocol-authorization.js +144 -741
  28. package/dist/esm/src/core/protocol-authorization.js.map +1 -1
  29. package/dist/esm/src/core/protocols-grant-authorization.js +24 -38
  30. package/dist/esm/src/core/protocols-grant-authorization.js.map +1 -1
  31. package/dist/esm/src/core/record-chain.js +64 -0
  32. package/dist/esm/src/core/record-chain.js.map +1 -0
  33. package/dist/esm/src/core/records-grant-authorization.js +53 -72
  34. package/dist/esm/src/core/records-grant-authorization.js.map +1 -1
  35. package/dist/esm/src/core/resumable-task-manager.js +50 -65
  36. package/dist/esm/src/core/resumable-task-manager.js.map +1 -1
  37. package/dist/esm/src/core/tenant-gate.js +2 -13
  38. package/dist/esm/src/core/tenant-gate.js.map +1 -1
  39. package/dist/esm/src/dwn.js +108 -101
  40. package/dist/esm/src/dwn.js.map +1 -1
  41. package/dist/esm/src/event-stream/event-emitter-event-log.js +204 -0
  42. package/dist/esm/src/event-stream/event-emitter-event-log.js.map +1 -0
  43. package/dist/esm/src/handlers/messages-read.js +67 -81
  44. package/dist/esm/src/handlers/messages-read.js.map +1 -1
  45. package/dist/esm/src/handlers/messages-subscribe.js +51 -63
  46. package/dist/esm/src/handlers/messages-subscribe.js.map +1 -1
  47. package/dist/esm/src/handlers/messages-sync.js +75 -89
  48. package/dist/esm/src/handlers/messages-sync.js.map +1 -1
  49. package/dist/esm/src/handlers/protocols-configure.js +153 -163
  50. package/dist/esm/src/handlers/protocols-configure.js.map +1 -1
  51. package/dist/esm/src/handlers/protocols-query.js +52 -55
  52. package/dist/esm/src/handlers/protocols-query.js.map +1 -1
  53. package/dist/esm/src/handlers/records-count.js +97 -85
  54. package/dist/esm/src/handlers/records-count.js.map +1 -1
  55. package/dist/esm/src/handlers/records-delete.js +75 -93
  56. package/dist/esm/src/handlers/records-delete.js.map +1 -1
  57. package/dist/esm/src/handlers/records-query.js +116 -105
  58. package/dist/esm/src/handlers/records-query.js.map +1 -1
  59. package/dist/esm/src/handlers/records-read.js +130 -132
  60. package/dist/esm/src/handlers/records-read.js.map +1 -1
  61. package/dist/esm/src/handlers/records-subscribe.js +164 -104
  62. package/dist/esm/src/handlers/records-subscribe.js.map +1 -1
  63. package/dist/esm/src/handlers/records-write.js +213 -280
  64. package/dist/esm/src/handlers/records-write.js.map +1 -1
  65. package/dist/esm/src/index.js +5 -2
  66. package/dist/esm/src/index.js.map +1 -1
  67. package/dist/esm/src/interfaces/messages-read.js +24 -32
  68. package/dist/esm/src/interfaces/messages-read.js.map +1 -1
  69. package/dist/esm/src/interfaces/messages-subscribe.js +28 -41
  70. package/dist/esm/src/interfaces/messages-subscribe.js.map +1 -1
  71. package/dist/esm/src/interfaces/messages-sync.js +26 -40
  72. package/dist/esm/src/interfaces/messages-sync.js.map +1 -1
  73. package/dist/esm/src/interfaces/protocols-configure.js +87 -65
  74. package/dist/esm/src/interfaces/protocols-configure.js.map +1 -1
  75. package/dist/esm/src/interfaces/protocols-query.js +55 -68
  76. package/dist/esm/src/interfaces/protocols-query.js.map +1 -1
  77. package/dist/esm/src/interfaces/records-count.js +50 -66
  78. package/dist/esm/src/interfaces/records-count.js.map +1 -1
  79. package/dist/esm/src/interfaces/records-delete.js +45 -55
  80. package/dist/esm/src/interfaces/records-delete.js.map +1 -1
  81. package/dist/esm/src/interfaces/records-query.js +60 -76
  82. package/dist/esm/src/interfaces/records-query.js.map +1 -1
  83. package/dist/esm/src/interfaces/records-read.js +51 -67
  84. package/dist/esm/src/interfaces/records-read.js.map +1 -1
  85. package/dist/esm/src/interfaces/records-subscribe.js +53 -68
  86. package/dist/esm/src/interfaces/records-subscribe.js.map +1 -1
  87. package/dist/esm/src/interfaces/records-write-query.js +102 -0
  88. package/dist/esm/src/interfaces/records-write-query.js.map +1 -0
  89. package/dist/esm/src/interfaces/records-write-signing.js +81 -0
  90. package/dist/esm/src/interfaces/records-write-signing.js.map +1 -0
  91. package/dist/esm/src/interfaces/records-write.js +396 -610
  92. package/dist/esm/src/interfaces/records-write.js.map +1 -1
  93. package/dist/esm/src/jose/algorithms/signing/ed25519.js +10 -19
  94. package/dist/esm/src/jose/algorithms/signing/ed25519.js.map +1 -1
  95. package/dist/esm/src/jose/jws/general/builder.js +23 -35
  96. package/dist/esm/src/jose/jws/general/builder.js.map +1 -1
  97. package/dist/esm/src/jose/jws/general/verifier.js +56 -69
  98. package/dist/esm/src/jose/jws/general/verifier.js.map +1 -1
  99. package/dist/esm/src/protocols/permission-grant.js +43 -14
  100. package/dist/esm/src/protocols/permission-grant.js.map +1 -1
  101. package/dist/esm/src/protocols/permission-request.js +28 -14
  102. package/dist/esm/src/protocols/permission-request.js.map +1 -1
  103. package/dist/esm/src/protocols/permissions.js +325 -227
  104. package/dist/esm/src/protocols/permissions.js.map +1 -1
  105. package/dist/esm/src/smt/smt-store-level.js +42 -64
  106. package/dist/esm/src/smt/smt-store-level.js.map +1 -1
  107. package/dist/esm/src/smt/smt-store-memory.js +19 -45
  108. package/dist/esm/src/smt/smt-store-memory.js.map +1 -1
  109. package/dist/esm/src/smt/smt-utils.js +28 -45
  110. package/dist/esm/src/smt/smt-utils.js.map +1 -1
  111. package/dist/esm/src/smt/sparse-merkle-tree.js +426 -471
  112. package/dist/esm/src/smt/sparse-merkle-tree.js.map +1 -1
  113. package/dist/esm/src/state-index/state-index-level.js +113 -150
  114. package/dist/esm/src/state-index/state-index-level.js.map +1 -1
  115. package/dist/esm/src/store/blockstore-level.js +54 -156
  116. package/dist/esm/src/store/blockstore-level.js.map +1 -1
  117. package/dist/esm/src/store/blockstore-mock.js +48 -153
  118. package/dist/esm/src/store/blockstore-mock.js.map +1 -1
  119. package/dist/esm/src/store/data-store-level.js +137 -100
  120. package/dist/esm/src/store/data-store-level.js.map +1 -1
  121. package/dist/esm/src/store/index-level-compound.js +246 -0
  122. package/dist/esm/src/store/index-level-compound.js.map +1 -0
  123. package/dist/esm/src/store/index-level.js +307 -715
  124. package/dist/esm/src/store/index-level.js.map +1 -1
  125. package/dist/esm/src/store/level-wrapper.js +143 -244
  126. package/dist/esm/src/store/level-wrapper.js.map +1 -1
  127. package/dist/esm/src/store/message-store-level.js +71 -94
  128. package/dist/esm/src/store/message-store-level.js.map +1 -1
  129. package/dist/esm/src/store/resumable-task-store-level.js +62 -101
  130. package/dist/esm/src/store/resumable-task-store-level.js.map +1 -1
  131. package/dist/esm/src/store/storage-controller.js +131 -146
  132. package/dist/esm/src/store/storage-controller.js.map +1 -1
  133. package/dist/esm/src/types/permission-types.js.map +1 -1
  134. package/dist/esm/src/types/protocols-types.js +10 -0
  135. package/dist/esm/src/types/protocols-types.js.map +1 -1
  136. package/dist/esm/src/types/records-types.js.map +1 -1
  137. package/dist/esm/src/utils/abort.js +8 -19
  138. package/dist/esm/src/utils/abort.js.map +1 -1
  139. package/dist/esm/src/utils/array.js +15 -49
  140. package/dist/esm/src/utils/array.js.map +1 -1
  141. package/dist/esm/src/utils/cid.js +29 -77
  142. package/dist/esm/src/utils/cid.js.map +1 -1
  143. package/dist/esm/src/utils/data-stream.js +37 -65
  144. package/dist/esm/src/utils/data-stream.js.map +1 -1
  145. package/dist/esm/src/utils/encryption.js +136 -162
  146. package/dist/esm/src/utils/encryption.js.map +1 -1
  147. package/dist/esm/src/utils/filter.js +1 -12
  148. package/dist/esm/src/utils/filter.js.map +1 -1
  149. package/dist/esm/src/utils/hd-key.js +45 -71
  150. package/dist/esm/src/utils/hd-key.js.map +1 -1
  151. package/dist/esm/src/utils/jws.js +9 -20
  152. package/dist/esm/src/utils/jws.js.map +1 -1
  153. package/dist/esm/src/utils/memory-cache.js +12 -23
  154. package/dist/esm/src/utils/memory-cache.js.map +1 -1
  155. package/dist/esm/src/utils/messages.js +21 -33
  156. package/dist/esm/src/utils/messages.js.map +1 -1
  157. package/dist/esm/src/utils/private-key-signer.js +9 -17
  158. package/dist/esm/src/utils/private-key-signer.js.map +1 -1
  159. package/dist/esm/src/utils/protocols.js +62 -70
  160. package/dist/esm/src/utils/protocols.js.map +1 -1
  161. package/dist/esm/src/utils/records.js +103 -166
  162. package/dist/esm/src/utils/records.js.map +1 -1
  163. package/dist/esm/src/utils/secp256k1.js +60 -96
  164. package/dist/esm/src/utils/secp256k1.js.map +1 -1
  165. package/dist/esm/src/utils/secp256r1.js +54 -71
  166. package/dist/esm/src/utils/secp256r1.js.map +1 -1
  167. package/dist/esm/src/utils/time.js +5 -18
  168. package/dist/esm/src/utils/time.js.map +1 -1
  169. package/dist/esm/src/utils/url.js +3 -3
  170. package/dist/esm/src/utils/url.js.map +1 -1
  171. package/dist/esm/tests/core/auth.spec.js +3 -12
  172. package/dist/esm/tests/core/auth.spec.js.map +1 -1
  173. package/dist/esm/tests/core/message.spec.js +50 -59
  174. package/dist/esm/tests/core/message.spec.js.map +1 -1
  175. package/dist/esm/tests/core/protocol-authorization.spec.js +10 -18
  176. package/dist/esm/tests/core/protocol-authorization.spec.js.map +1 -1
  177. package/dist/esm/tests/dwn.spec.js +65 -89
  178. package/dist/esm/tests/dwn.spec.js.map +1 -1
  179. package/dist/esm/tests/event-emitter-event-log.spec.js +305 -0
  180. package/dist/esm/tests/event-emitter-event-log.spec.js.map +1 -0
  181. package/dist/esm/tests/features/author-delegated-grant.spec.js +337 -347
  182. package/dist/esm/tests/features/author-delegated-grant.spec.js.map +1 -1
  183. package/dist/esm/tests/features/owner-delegated-grant.spec.js +160 -172
  184. package/dist/esm/tests/features/owner-delegated-grant.spec.js.map +1 -1
  185. package/dist/esm/tests/features/owner-signature.spec.js +78 -82
  186. package/dist/esm/tests/features/owner-signature.spec.js.map +1 -1
  187. package/dist/esm/tests/features/permissions.spec.js +449 -184
  188. package/dist/esm/tests/features/permissions.spec.js.map +1 -1
  189. package/dist/esm/tests/features/protocol-composition.spec.js +981 -360
  190. package/dist/esm/tests/features/protocol-composition.spec.js.map +1 -1
  191. package/dist/esm/tests/features/protocol-create-action.spec.js +45 -54
  192. package/dist/esm/tests/features/protocol-create-action.spec.js.map +1 -1
  193. package/dist/esm/tests/features/protocol-delete-action.spec.js +99 -108
  194. package/dist/esm/tests/features/protocol-delete-action.spec.js.map +1 -1
  195. package/dist/esm/tests/features/protocol-update-action.spec.js +108 -117
  196. package/dist/esm/tests/features/protocol-update-action.spec.js.map +1 -1
  197. package/dist/esm/tests/features/records-immutable.spec.js +315 -0
  198. package/dist/esm/tests/features/records-immutable.spec.js.map +1 -0
  199. package/dist/esm/tests/features/records-prune.spec.js +178 -194
  200. package/dist/esm/tests/features/records-prune.spec.js.map +1 -1
  201. package/dist/esm/tests/features/records-record-limit.spec.js +542 -0
  202. package/dist/esm/tests/features/records-record-limit.spec.js.map +1 -0
  203. package/dist/esm/tests/features/records-tags.spec.js +456 -463
  204. package/dist/esm/tests/features/records-tags.spec.js.map +1 -1
  205. package/dist/esm/tests/features/resumable-tasks.spec.js +88 -98
  206. package/dist/esm/tests/features/resumable-tasks.spec.js.map +1 -1
  207. package/dist/esm/tests/handlers/messages-read.spec.js +215 -210
  208. package/dist/esm/tests/handlers/messages-read.spec.js.map +1 -1
  209. package/dist/esm/tests/handlers/messages-subscribe.spec.js +309 -171
  210. package/dist/esm/tests/handlers/messages-subscribe.spec.js.map +1 -1
  211. package/dist/esm/tests/handlers/messages-sync.spec.js +272 -199
  212. package/dist/esm/tests/handlers/messages-sync.spec.js.map +1 -1
  213. package/dist/esm/tests/handlers/protocols-configure.spec.js +247 -241
  214. package/dist/esm/tests/handlers/protocols-configure.spec.js.map +1 -1
  215. package/dist/esm/tests/handlers/protocols-query.spec.js +159 -172
  216. package/dist/esm/tests/handlers/protocols-query.spec.js.map +1 -1
  217. package/dist/esm/tests/handlers/records-count.spec.js +101 -105
  218. package/dist/esm/tests/handlers/records-count.spec.js.map +1 -1
  219. package/dist/esm/tests/handlers/records-delete.spec.js +266 -279
  220. package/dist/esm/tests/handlers/records-delete.spec.js.map +1 -1
  221. package/dist/esm/tests/handlers/records-query.spec.js +984 -996
  222. package/dist/esm/tests/handlers/records-query.spec.js.map +1 -1
  223. package/dist/esm/tests/handlers/records-read.spec.js +542 -671
  224. package/dist/esm/tests/handlers/records-read.spec.js.map +1 -1
  225. package/dist/esm/tests/handlers/records-subscribe.spec.js +433 -302
  226. package/dist/esm/tests/handlers/records-subscribe.spec.js.map +1 -1
  227. package/dist/esm/tests/handlers/records-write.spec.js +1216 -1140
  228. package/dist/esm/tests/handlers/records-write.spec.js.map +1 -1
  229. package/dist/esm/tests/interfaces/messages-get.spec.js +39 -48
  230. package/dist/esm/tests/interfaces/messages-get.spec.js.map +1 -1
  231. package/dist/esm/tests/interfaces/messages-subscribe.spec.js +4 -13
  232. package/dist/esm/tests/interfaces/messages-subscribe.spec.js.map +1 -1
  233. package/dist/esm/tests/interfaces/protocols-configure.spec.js +212 -88
  234. package/dist/esm/tests/interfaces/protocols-configure.spec.js.map +1 -1
  235. package/dist/esm/tests/interfaces/protocols-query.spec.js +8 -17
  236. package/dist/esm/tests/interfaces/protocols-query.spec.js.map +1 -1
  237. package/dist/esm/tests/interfaces/records-delete.spec.js +8 -17
  238. package/dist/esm/tests/interfaces/records-delete.spec.js.map +1 -1
  239. package/dist/esm/tests/interfaces/records-query.spec.js +20 -29
  240. package/dist/esm/tests/interfaces/records-query.spec.js.map +1 -1
  241. package/dist/esm/tests/interfaces/records-read.spec.js +42 -51
  242. package/dist/esm/tests/interfaces/records-read.spec.js.map +1 -1
  243. package/dist/esm/tests/interfaces/records-subscribe.spec.js +16 -25
  244. package/dist/esm/tests/interfaces/records-subscribe.spec.js.map +1 -1
  245. package/dist/esm/tests/interfaces/records-write.spec.js +190 -219
  246. package/dist/esm/tests/interfaces/records-write.spec.js.map +1 -1
  247. package/dist/esm/tests/jose/jws/general.spec.js +36 -45
  248. package/dist/esm/tests/jose/jws/general.spec.js.map +1 -1
  249. package/dist/esm/tests/protocols/permission-grant.spec.js +44 -50
  250. package/dist/esm/tests/protocols/permission-grant.spec.js.map +1 -1
  251. package/dist/esm/tests/protocols/permission-request.spec.js +23 -32
  252. package/dist/esm/tests/protocols/permission-request.spec.js.map +1 -1
  253. package/dist/esm/tests/protocols/permissions.spec.js +49 -55
  254. package/dist/esm/tests/protocols/permissions.spec.js.map +1 -1
  255. package/dist/esm/tests/scenarios/aggregator.spec.js +127 -138
  256. package/dist/esm/tests/scenarios/aggregator.spec.js.map +1 -1
  257. package/dist/esm/tests/scenarios/deleted-record.spec.js +372 -36
  258. package/dist/esm/tests/scenarios/deleted-record.spec.js.map +1 -1
  259. package/dist/esm/tests/scenarios/end-to-end-tests.spec.js +55 -64
  260. package/dist/esm/tests/scenarios/end-to-end-tests.spec.js.map +1 -1
  261. package/dist/esm/tests/scenarios/nested-roles.spec.js +66 -76
  262. package/dist/esm/tests/scenarios/nested-roles.spec.js.map +1 -1
  263. package/dist/esm/tests/scenarios/subscriptions.spec.js +451 -354
  264. package/dist/esm/tests/scenarios/subscriptions.spec.js.map +1 -1
  265. package/dist/esm/tests/smt/smt-store-level.spec.js +76 -87
  266. package/dist/esm/tests/smt/smt-store-level.spec.js.map +1 -1
  267. package/dist/esm/tests/smt/sparse-merkle-tree.spec.js +344 -353
  268. package/dist/esm/tests/smt/sparse-merkle-tree.spec.js.map +1 -1
  269. package/dist/esm/tests/state-index/state-index-level.spec.js +117 -126
  270. package/dist/esm/tests/state-index/state-index-level.spec.js.map +1 -1
  271. package/dist/esm/tests/store/blockstore-level.spec.js +44 -99
  272. package/dist/esm/tests/store/blockstore-level.spec.js.map +1 -1
  273. package/dist/esm/tests/store/blockstore-mock.spec.js +40 -120
  274. package/dist/esm/tests/store/blockstore-mock.spec.js.map +1 -1
  275. package/dist/esm/tests/store/data-store-level.spec.js +160 -108
  276. package/dist/esm/tests/store/data-store-level.spec.js.map +1 -1
  277. package/dist/esm/tests/store/index-level.spec.js +404 -414
  278. package/dist/esm/tests/store/index-level.spec.js.map +1 -1
  279. package/dist/esm/tests/store/message-store-level.spec.js +13 -22
  280. package/dist/esm/tests/store/message-store-level.spec.js.map +1 -1
  281. package/dist/esm/tests/store/message-store.spec.js +229 -238
  282. package/dist/esm/tests/store/message-store.spec.js.map +1 -1
  283. package/dist/esm/tests/test-event-stream.js +12 -13
  284. package/dist/esm/tests/test-event-stream.js.map +1 -1
  285. package/dist/esm/tests/test-stores.js +16 -13
  286. package/dist/esm/tests/test-stores.js.map +1 -1
  287. package/dist/esm/tests/test-suite.js +8 -15
  288. package/dist/esm/tests/test-suite.js.map +1 -1
  289. package/dist/esm/tests/utils/cid.spec.js +24 -33
  290. package/dist/esm/tests/utils/cid.spec.js.map +1 -1
  291. package/dist/esm/tests/utils/data-stream.spec.js +48 -57
  292. package/dist/esm/tests/utils/data-stream.spec.js.map +1 -1
  293. package/dist/esm/tests/utils/encryption-callbacks.spec.js +45 -54
  294. package/dist/esm/tests/utils/encryption-callbacks.spec.js.map +1 -1
  295. package/dist/esm/tests/utils/encryption.spec.js +229 -82
  296. package/dist/esm/tests/utils/encryption.spec.js.map +1 -1
  297. package/dist/esm/tests/utils/filters.spec.js +46 -55
  298. package/dist/esm/tests/utils/filters.spec.js.map +1 -1
  299. package/dist/esm/tests/utils/hd-key.spec.js +10 -19
  300. package/dist/esm/tests/utils/hd-key.spec.js.map +1 -1
  301. package/dist/esm/tests/utils/jws.spec.js +3 -12
  302. package/dist/esm/tests/utils/jws.spec.js.map +1 -1
  303. package/dist/esm/tests/utils/memory-cache.spec.js +9 -18
  304. package/dist/esm/tests/utils/memory-cache.spec.js.map +1 -1
  305. package/dist/esm/tests/utils/messages.spec.js +18 -20
  306. package/dist/esm/tests/utils/messages.spec.js.map +1 -1
  307. package/dist/esm/tests/utils/poller.js +22 -33
  308. package/dist/esm/tests/utils/poller.js.map +1 -1
  309. package/dist/esm/tests/utils/private-key-signer.spec.js +15 -24
  310. package/dist/esm/tests/utils/private-key-signer.spec.js.map +1 -1
  311. package/dist/esm/tests/utils/records.spec.js +14 -27
  312. package/dist/esm/tests/utils/records.spec.js.map +1 -1
  313. package/dist/esm/tests/utils/secp256k1.spec.js +16 -25
  314. package/dist/esm/tests/utils/secp256k1.spec.js.map +1 -1
  315. package/dist/esm/tests/utils/secp256r1.spec.js +18 -27
  316. package/dist/esm/tests/utils/secp256r1.spec.js.map +1 -1
  317. package/dist/esm/tests/utils/test-data-generator.js +446 -467
  318. package/dist/esm/tests/utils/test-data-generator.js.map +1 -1
  319. package/dist/esm/tests/validation/json-schemas/definitions.spec.js +2 -11
  320. package/dist/esm/tests/validation/json-schemas/definitions.spec.js.map +1 -1
  321. package/dist/esm/tests/validation/json-schemas/jwk/general-jwk.spec.js +4 -13
  322. package/dist/esm/tests/validation/json-schemas/jwk/general-jwk.spec.js.map +1 -1
  323. package/dist/esm/tests/validation/json-schemas/jwk/public-jwk.spec.js +8 -17
  324. package/dist/esm/tests/validation/json-schemas/jwk/public-jwk.spec.js.map +1 -1
  325. package/dist/esm/tests/validation/json-schemas/jwk-verification-method.spec.js +3 -12
  326. package/dist/esm/tests/validation/json-schemas/jwk-verification-method.spec.js.map +1 -1
  327. package/dist/esm/tests/validation/json-schemas/protocols/protocols-configure.spec.js +4 -13
  328. package/dist/esm/tests/validation/json-schemas/protocols/protocols-configure.spec.js.map +1 -1
  329. package/dist/esm/tests/validation/json-schemas/records/records-query.spec.js +2 -11
  330. package/dist/esm/tests/validation/json-schemas/records/records-query.spec.js.map +1 -1
  331. package/dist/esm/tests/validation/json-schemas/records/records-read.spec.js +2 -11
  332. package/dist/esm/tests/validation/json-schemas/records/records-read.spec.js.map +1 -1
  333. package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js +44 -24
  334. package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js.map +1 -1
  335. package/dist/types/generated/precompiled-validators.d.ts +49 -40
  336. package/dist/types/generated/precompiled-validators.d.ts.map +1 -1
  337. package/dist/types/src/core/constants.d.ts +11 -0
  338. package/dist/types/src/core/constants.d.ts.map +1 -0
  339. package/dist/types/src/core/core-protocol.d.ts +89 -0
  340. package/dist/types/src/core/core-protocol.d.ts.map +1 -0
  341. package/dist/types/src/core/dwn-error.d.ts +9 -12
  342. package/dist/types/src/core/dwn-error.d.ts.map +1 -1
  343. package/dist/types/src/core/grant-authorization.d.ts +6 -2
  344. package/dist/types/src/core/grant-authorization.d.ts.map +1 -1
  345. package/dist/types/src/core/protocol-authorization-action.d.ts +42 -0
  346. package/dist/types/src/core/protocol-authorization-action.d.ts.map +1 -0
  347. package/dist/types/src/core/protocol-authorization-validation.d.ts +81 -0
  348. package/dist/types/src/core/protocol-authorization-validation.d.ts.map +1 -0
  349. package/dist/types/src/core/protocol-authorization.d.ts +24 -106
  350. package/dist/types/src/core/protocol-authorization.d.ts.map +1 -1
  351. package/dist/types/src/core/record-chain.d.ts +24 -0
  352. package/dist/types/src/core/record-chain.d.ts.map +1 -0
  353. package/dist/types/src/core/records-grant-authorization.d.ts.map +1 -1
  354. package/dist/types/src/dwn.d.ts +19 -7
  355. package/dist/types/src/dwn.d.ts.map +1 -1
  356. package/dist/types/src/event-stream/event-emitter-event-log.d.ts +50 -0
  357. package/dist/types/src/event-stream/event-emitter-event-log.d.ts.map +1 -0
  358. package/dist/types/src/handlers/messages-read.d.ts +3 -8
  359. package/dist/types/src/handlers/messages-read.d.ts.map +1 -1
  360. package/dist/types/src/handlers/messages-subscribe.d.ts +6 -10
  361. package/dist/types/src/handlers/messages-subscribe.d.ts.map +1 -1
  362. package/dist/types/src/handlers/messages-sync.d.ts +3 -8
  363. package/dist/types/src/handlers/messages-sync.d.ts.map +1 -1
  364. package/dist/types/src/handlers/protocols-configure.d.ts +3 -10
  365. package/dist/types/src/handlers/protocols-configure.d.ts.map +1 -1
  366. package/dist/types/src/handlers/protocols-query.d.ts +3 -8
  367. package/dist/types/src/handlers/protocols-query.d.ts.map +1 -1
  368. package/dist/types/src/handlers/records-count.d.ts +3 -6
  369. package/dist/types/src/handlers/records-count.d.ts.map +1 -1
  370. package/dist/types/src/handlers/records-delete.d.ts +3 -8
  371. package/dist/types/src/handlers/records-delete.d.ts.map +1 -1
  372. package/dist/types/src/handlers/records-query.d.ts +3 -8
  373. package/dist/types/src/handlers/records-query.d.ts.map +1 -1
  374. package/dist/types/src/handlers/records-read.d.ts +3 -8
  375. package/dist/types/src/handlers/records-read.d.ts.map +1 -1
  376. package/dist/types/src/handlers/records-subscribe.d.ts +8 -10
  377. package/dist/types/src/handlers/records-subscribe.d.ts.map +1 -1
  378. package/dist/types/src/handlers/records-write.d.ts +4 -24
  379. package/dist/types/src/handlers/records-write.d.ts.map +1 -1
  380. package/dist/types/src/index.d.ts +8 -4
  381. package/dist/types/src/index.d.ts.map +1 -1
  382. package/dist/types/src/interfaces/messages-subscribe.d.ts +5 -0
  383. package/dist/types/src/interfaces/messages-subscribe.d.ts.map +1 -1
  384. package/dist/types/src/interfaces/protocols-configure.d.ts.map +1 -1
  385. package/dist/types/src/interfaces/records-subscribe.d.ts +5 -0
  386. package/dist/types/src/interfaces/records-subscribe.d.ts.map +1 -1
  387. package/dist/types/src/interfaces/records-write-query.d.ts +33 -0
  388. package/dist/types/src/interfaces/records-write-query.d.ts.map +1 -0
  389. package/dist/types/src/interfaces/records-write-signing.d.ts +34 -0
  390. package/dist/types/src/interfaces/records-write-signing.d.ts.map +1 -0
  391. package/dist/types/src/interfaces/records-write.d.ts +13 -53
  392. package/dist/types/src/interfaces/records-write.d.ts.map +1 -1
  393. package/dist/types/src/protocols/permission-grant.d.ts +1 -1
  394. package/dist/types/src/protocols/permission-grant.d.ts.map +1 -1
  395. package/dist/types/src/protocols/permission-request.d.ts +1 -1
  396. package/dist/types/src/protocols/permission-request.d.ts.map +1 -1
  397. package/dist/types/src/protocols/permissions.d.ts +40 -3
  398. package/dist/types/src/protocols/permissions.d.ts.map +1 -1
  399. package/dist/types/src/state-index/state-index-level.d.ts.map +1 -1
  400. package/dist/types/src/store/data-store-level.d.ts +20 -4
  401. package/dist/types/src/store/data-store-level.d.ts.map +1 -1
  402. package/dist/types/src/store/index-level-compound.d.ts +70 -0
  403. package/dist/types/src/store/index-level-compound.d.ts.map +1 -0
  404. package/dist/types/src/store/index-level.d.ts +4 -58
  405. package/dist/types/src/store/index-level.d.ts.map +1 -1
  406. package/dist/types/src/store/storage-controller.d.ts +4 -4
  407. package/dist/types/src/store/storage-controller.d.ts.map +1 -1
  408. package/dist/types/src/types/message-types.d.ts +3 -3
  409. package/dist/types/src/types/message-types.d.ts.map +1 -1
  410. package/dist/types/src/types/messages-types.d.ts +12 -3
  411. package/dist/types/src/types/messages-types.d.ts.map +1 -1
  412. package/dist/types/src/types/method-handler.d.ts +24 -3
  413. package/dist/types/src/types/method-handler.d.ts.map +1 -1
  414. package/dist/types/src/types/permission-types.d.ts +7 -0
  415. package/dist/types/src/types/permission-types.d.ts.map +1 -1
  416. package/dist/types/src/types/protocols-types.d.ts +41 -1
  417. package/dist/types/src/types/protocols-types.d.ts.map +1 -1
  418. package/dist/types/src/types/records-types.d.ts +16 -6
  419. package/dist/types/src/types/records-types.d.ts.map +1 -1
  420. package/dist/types/src/types/subscriptions.d.ts +151 -13
  421. package/dist/types/src/types/subscriptions.d.ts.map +1 -1
  422. package/dist/types/src/utils/hd-key.d.ts +1 -9
  423. package/dist/types/src/utils/hd-key.d.ts.map +1 -1
  424. package/dist/types/src/utils/messages.d.ts +7 -5
  425. package/dist/types/src/utils/messages.d.ts.map +1 -1
  426. package/dist/types/src/utils/protocols.d.ts +5 -0
  427. package/dist/types/src/utils/protocols.d.ts.map +1 -1
  428. package/dist/types/src/utils/records.d.ts +1 -11
  429. package/dist/types/src/utils/records.d.ts.map +1 -1
  430. package/dist/types/tests/dwn.spec.d.ts.map +1 -1
  431. package/dist/types/tests/event-emitter-event-log.spec.d.ts +2 -0
  432. package/dist/types/tests/event-emitter-event-log.spec.d.ts.map +1 -0
  433. package/dist/types/tests/features/author-delegated-grant.spec.d.ts.map +1 -1
  434. package/dist/types/tests/features/owner-delegated-grant.spec.d.ts.map +1 -1
  435. package/dist/types/tests/features/owner-signature.spec.d.ts.map +1 -1
  436. package/dist/types/tests/features/permissions.spec.d.ts.map +1 -1
  437. package/dist/types/tests/features/protocol-composition.spec.d.ts.map +1 -1
  438. package/dist/types/tests/features/records-immutable.spec.d.ts +2 -0
  439. package/dist/types/tests/features/records-immutable.spec.d.ts.map +1 -0
  440. package/dist/types/tests/features/records-record-limit.spec.d.ts +2 -0
  441. package/dist/types/tests/features/records-record-limit.spec.d.ts.map +1 -0
  442. package/dist/types/tests/features/records-tags.spec.d.ts.map +1 -1
  443. package/dist/types/tests/features/resumable-tasks.spec.d.ts.map +1 -1
  444. package/dist/types/tests/handlers/messages-read.spec.d.ts.map +1 -1
  445. package/dist/types/tests/handlers/messages-subscribe.spec.d.ts.map +1 -1
  446. package/dist/types/tests/handlers/messages-sync.spec.d.ts.map +1 -1
  447. package/dist/types/tests/handlers/records-count.spec.d.ts.map +1 -1
  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/scenarios/deleted-record.spec.d.ts.map +1 -1
  454. package/dist/types/tests/scenarios/subscriptions.spec.d.ts.map +1 -1
  455. package/dist/types/tests/test-event-stream.d.ts +11 -12
  456. package/dist/types/tests/test-event-stream.d.ts.map +1 -1
  457. package/dist/types/tests/test-suite.d.ts +2 -2
  458. package/dist/types/tests/test-suite.d.ts.map +1 -1
  459. package/dist/types/tests/utils/test-data-generator.d.ts +18 -0
  460. package/dist/types/tests/utils/test-data-generator.d.ts.map +1 -1
  461. package/package.json +5 -4
  462. package/src/core/constants.ts +11 -0
  463. package/src/core/core-protocol.ts +129 -0
  464. package/src/core/dwn-error.ts +15 -12
  465. package/src/core/grant-authorization.ts +20 -3
  466. package/src/core/protocol-authorization-action.ts +377 -0
  467. package/src/core/protocol-authorization-validation.ts +487 -0
  468. package/src/core/protocol-authorization.ts +111 -856
  469. package/src/core/record-chain.ts +99 -0
  470. package/src/core/records-grant-authorization.ts +6 -8
  471. package/src/dwn.ts +58 -73
  472. package/src/event-stream/event-emitter-event-log.ts +283 -0
  473. package/src/handlers/messages-read.ts +8 -9
  474. package/src/handlers/messages-subscribe.ts +24 -28
  475. package/src/handlers/messages-sync.ts +10 -16
  476. package/src/handlers/protocols-configure.ts +47 -32
  477. package/src/handlers/protocols-query.ts +6 -9
  478. package/src/handlers/records-count.ts +11 -10
  479. package/src/handlers/records-delete.ts +12 -21
  480. package/src/handlers/records-query.ts +12 -12
  481. package/src/handlers/records-read.ts +34 -22
  482. package/src/handlers/records-subscribe.ts +47 -26
  483. package/src/handlers/records-write.ts +47 -104
  484. package/src/index.ts +9 -5
  485. package/src/interfaces/messages-subscribe.ts +7 -1
  486. package/src/interfaces/protocols-configure.ts +73 -8
  487. package/src/interfaces/records-count.ts +1 -1
  488. package/src/interfaces/records-delete.ts +1 -1
  489. package/src/interfaces/records-query.ts +1 -1
  490. package/src/interfaces/records-read.ts +1 -1
  491. package/src/interfaces/records-subscribe.ts +8 -1
  492. package/src/interfaces/records-write-query.ts +139 -0
  493. package/src/interfaces/records-write-signing.ts +123 -0
  494. package/src/interfaces/records-write.ts +66 -261
  495. package/src/protocols/permission-grant.ts +1 -1
  496. package/src/protocols/permission-request.ts +1 -1
  497. package/src/protocols/permissions.ts +148 -6
  498. package/src/state-index/state-index-level.ts +5 -7
  499. package/src/store/data-store-level.ts +124 -34
  500. package/src/store/index-level-compound.ts +324 -0
  501. package/src/store/index-level.ts +68 -341
  502. package/src/store/storage-controller.ts +11 -11
  503. package/src/types/message-types.ts +3 -3
  504. package/src/types/messages-types.ts +12 -3
  505. package/src/types/method-handler.ts +26 -4
  506. package/src/types/mitt.d.ts +28 -0
  507. package/src/types/permission-types.ts +7 -0
  508. package/src/types/protocols-types.ts +46 -0
  509. package/src/types/records-types.ts +16 -6
  510. package/src/types/subscriptions.ts +178 -14
  511. package/src/utils/hd-key.ts +0 -9
  512. package/src/utils/messages.ts +17 -37
  513. package/src/utils/protocols.ts +8 -0
  514. package/src/utils/records.ts +8 -59
  515. package/dist/esm/src/event-stream/event-emitter-stream.js +0 -60
  516. package/dist/esm/src/event-stream/event-emitter-stream.js.map +0 -1
  517. package/dist/esm/tests/event-stream/event-emitter-stream.spec.js +0 -77
  518. package/dist/esm/tests/event-stream/event-emitter-stream.spec.js.map +0 -1
  519. package/dist/esm/tests/event-stream/event-stream.spec.js +0 -123
  520. package/dist/esm/tests/event-stream/event-stream.spec.js.map +0 -1
  521. package/dist/types/src/event-stream/event-emitter-stream.d.ts +0 -23
  522. package/dist/types/src/event-stream/event-emitter-stream.d.ts.map +0 -1
  523. package/dist/types/tests/event-stream/event-emitter-stream.spec.d.ts +0 -2
  524. package/dist/types/tests/event-stream/event-emitter-stream.spec.d.ts.map +0 -1
  525. package/dist/types/tests/event-stream/event-stream.spec.d.ts +0 -2
  526. package/dist/types/tests/event-stream/event-stream.spec.d.ts.map +0 -1
  527. package/src/event-stream/event-emitter-stream.ts +0 -69
@@ -1,9 +1,8 @@
1
- import type { DataStore } from '../types/data-store.js';
2
- import type { DidResolver } from '@enbox/dids';
1
+ import type { CoreProtocolRegistry } from '../core/core-protocol.js';
3
2
  import type { MessageStore } from '../types//message-store.js';
4
- import type { MethodHandler } from '../types/method-handler.js';
5
3
  import type { Filter, PaginationCursor } from '../types/query-types.js';
6
4
  import type { GenericMessage, MessageSort } from '../types/message-types.js';
5
+ import type { HandlerDependencies, MethodHandler } from '../types/method-handler.js';
7
6
  import type { RecordsQueryMessage, RecordsQueryReply, RecordsQueryReplyEntry } from '../types/records-types.js';
8
7
 
9
8
  import { authenticate } from '../core/auth.js';
@@ -19,7 +18,7 @@ import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.j
19
18
 
20
19
  export class RecordsQueryHandler implements MethodHandler {
21
20
 
22
- constructor(private didResolver: DidResolver, private messageStore: MessageStore, private dataStore: DataStore) { }
21
+ constructor(private deps: HandlerDependencies) { }
23
22
 
24
23
  public async handle({
25
24
  tenant,
@@ -42,9 +41,9 @@ export class RecordsQueryHandler implements MethodHandler {
42
41
  } else {
43
42
  // authentication and authorization
44
43
  try {
45
- await authenticate(message.authorization!, this.didResolver);
44
+ await authenticate(message.authorization!, this.deps.didResolver);
46
45
 
47
- await RecordsQueryHandler.authorizeRecordsQuery(tenant, recordsQuery, this.messageStore);
46
+ await RecordsQueryHandler.authorizeRecordsQuery(tenant, recordsQuery, this.deps.messageStore, this.deps.coreProtocols);
48
47
  } catch (e) {
49
48
  return messageReplyFromError(e, 401);
50
49
  }
@@ -63,7 +62,7 @@ export class RecordsQueryHandler implements MethodHandler {
63
62
  // attach initial write if returned RecordsWrite is not initial write
64
63
  for (const recordsWrite of recordsWrites) {
65
64
  if (!await RecordsWrite.isInitialWrite(recordsWrite)) {
66
- const initialWriteQueryResult = await this.messageStore.query(
65
+ const initialWriteQueryResult = await this.deps.messageStore.query(
67
66
  tenant,
68
67
  [{ recordId: recordsWrite.recordId, isLatestBaseState: false, method: DwnMethodName.Write }]
69
68
  );
@@ -123,7 +122,7 @@ export class RecordsQueryHandler implements MethodHandler {
123
122
  };
124
123
 
125
124
  const messageSort = this.convertDateSort(dateSort);
126
- return this.messageStore.query(tenant, [ queryFilter ], messageSort, pagination);
125
+ return this.deps.messageStore.query(tenant, [ queryFilter ], messageSort, pagination);
127
126
  }
128
127
 
129
128
  /**
@@ -169,7 +168,7 @@ export class RecordsQueryHandler implements MethodHandler {
169
168
  }
170
169
 
171
170
  const messageSort = this.convertDateSort(dateSort);
172
- return this.messageStore.query(tenant, filters, messageSort, pagination );
171
+ return this.deps.messageStore.query(tenant, filters, messageSort, pagination );
173
172
  }
174
173
 
175
174
  /**
@@ -181,7 +180,7 @@ export class RecordsQueryHandler implements MethodHandler {
181
180
  const { dateSort, pagination } = recordsQuery.message.descriptor;
182
181
  const filter = RecordsQueryHandler.buildPublishedRecordsFilter(recordsQuery);
183
182
  const messageSort = this.convertDateSort(dateSort);
184
- return this.messageStore.query(tenant, [ filter ], messageSort, pagination);
183
+ return this.deps.messageStore.query(tenant, [ filter ], messageSort, pagination);
185
184
  }
186
185
 
187
186
  private static buildPublishedRecordsFilter(recordsQuery: RecordsQuery): Filter {
@@ -249,7 +248,8 @@ export class RecordsQueryHandler implements MethodHandler {
249
248
  private static async authorizeRecordsQuery(
250
249
  tenant: string,
251
250
  recordsQuery: RecordsQuery,
252
- messageStore: MessageStore
251
+ messageStore: MessageStore,
252
+ coreProtocols?: CoreProtocolRegistry,
253
253
  ): Promise<void> {
254
254
 
255
255
  if (Message.isSignedByAuthorDelegate(recordsQuery.message)) {
@@ -260,7 +260,7 @@ export class RecordsQueryHandler implements MethodHandler {
260
260
  // this is because we dynamically filter out records that the caller is not authorized to see.
261
261
  // Currently only run protocol authorization if message deliberately invokes a protocol role.
262
262
  if (Records.shouldProtocolAuthorize(recordsQuery.signaturePayload!)) {
263
- await ProtocolAuthorization.authorizeQueryOrSubscribe(tenant, recordsQuery, messageStore);
263
+ await ProtocolAuthorization.authorizeQueryOrSubscribe(tenant, recordsQuery, messageStore, coreProtocols);
264
264
  }
265
265
  }
266
266
  }
@@ -1,8 +1,7 @@
1
- import type { DataStore } from '../types/data-store.js';
2
- import type { DidResolver } from '@enbox/dids';
1
+ import type { CoreProtocolRegistry } from '../core/core-protocol.js';
3
2
  import type { Filter } from '../types/query-types.js';
4
3
  import type { MessageStore } from '../types//message-store.js';
5
- import type { MethodHandler } from '../types/method-handler.js';
4
+ import type { HandlerDependencies, MethodHandler } from '../types/method-handler.js';
6
5
  import type { RecordsDeleteMessage, RecordsQueryReplyEntry, RecordsReadMessage, RecordsReadReply } from '../types/records-types.js';
7
6
 
8
7
  import { authenticate } from '../core/auth.js';
@@ -21,7 +20,7 @@ import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.j
21
20
 
22
21
  export class RecordsReadHandler implements MethodHandler {
23
22
 
24
- constructor(private didResolver: DidResolver, private messageStore: MessageStore, private dataStore: DataStore) { }
23
+ constructor(private deps: HandlerDependencies) { }
25
24
 
26
25
  public async handle({
27
26
  tenant,
@@ -38,7 +37,7 @@ export class RecordsReadHandler implements MethodHandler {
38
37
  // authentication
39
38
  try {
40
39
  if (recordsRead.author !== undefined) {
41
- await authenticate(message.authorization!, this.didResolver);
40
+ await authenticate(message.authorization!, this.deps.didResolver);
42
41
  }
43
42
  } catch (e) {
44
43
  return messageReplyFromError(e, 401);
@@ -52,7 +51,7 @@ export class RecordsReadHandler implements MethodHandler {
52
51
  ...Records.convertFilter(message.descriptor.filter)
53
52
  };
54
53
  const messageSort = Records.convertDateSort(message.descriptor.dateSort);
55
- const { messages: existingMessages } = await this.messageStore.query(tenant, [ query ], messageSort, { limit: 1 });
54
+ const { messages: existingMessages } = await this.deps.messageStore.query(tenant, [ query ], messageSort, { limit: 1 });
56
55
  if (existingMessages.length === 0) {
57
56
  return {
58
57
  status: { code: 404, detail: 'Not Found' }
@@ -61,24 +60,35 @@ export class RecordsReadHandler implements MethodHandler {
61
60
 
62
61
  const matchedMessage = existingMessages[0];
63
62
 
64
- // if the matched message is a RecordsDelete, we mark the record as not-found and return both the RecordsDelete and the initial RecordsWrite
65
- // TODO: https://github.com/enboxorg/enbox/issues/819:
66
- // Consider performing authorization checks like when records exists before returning RecordsDelete and initial RecordsWrite of a deleted record
63
+ // If the matched message is a RecordsDelete, authorize against the newest RecordsWrite
64
+ // (for parity with the live-record path which authorizes against the latest write),
65
+ // then return 404 with both the RecordsDelete and the initial RecordsWrite.
67
66
  if (matchedMessage.descriptor.method === DwnMethodName.Delete) {
68
67
  const recordsDeleteMessage = matchedMessage as RecordsDeleteMessage;
69
- const initialWrite = await RecordsWrite.fetchInitialRecordsWriteMessage(this.messageStore, tenant, recordsDeleteMessage.descriptor.recordId);
68
+ const recordId = recordsDeleteMessage.descriptor.recordId;
70
69
 
70
+ const initialWrite = await RecordsWrite.fetchInitialRecordsWriteMessage(this.deps.messageStore, tenant, recordId);
71
71
  if (initialWrite === undefined) {
72
72
  return messageReplyFromError(new DwnError(
73
73
  DwnErrorCode.RecordsReadInitialWriteNotFound,
74
- 'Initial write for deleted record not found'
74
+ 'initial write for deleted record not found'
75
75
  ), 400);
76
76
  }
77
77
 
78
- // Perform authorization before returning the delete and initial write messages
79
- const parsedInitialWrite = await RecordsWrite.parse(initialWrite);
78
+ // Authorize against the newest RecordsWrite so that mutable properties like `published`
79
+ // reflect the record's state at the time of deletion, not just the initial write.
80
+ let newestWrite;
80
81
  try {
81
- await RecordsReadHandler.authorizeRecordsRead(tenant, recordsRead, parsedInitialWrite, this.messageStore);
82
+ newestWrite = await RecordsWrite.fetchNewestRecordsWrite(this.deps.messageStore, tenant, recordId);
83
+ } catch {
84
+ // If newest write is not found (should not happen since initial write exists),
85
+ // fall back to the initial write for authorization.
86
+ newestWrite = initialWrite;
87
+ }
88
+ const parsedNewestWrite = await RecordsWrite.parse(newestWrite);
89
+
90
+ try {
91
+ await RecordsReadHandler.authorizeRecordsRead(tenant, recordsRead, parsedNewestWrite, this.deps.messageStore, this.deps.coreProtocols);
82
92
  } catch (error) {
83
93
  return messageReplyFromError(error, 401);
84
94
  }
@@ -87,7 +97,7 @@ export class RecordsReadHandler implements MethodHandler {
87
97
  status : { code: 404, detail: 'Not Found' },
88
98
  entry : {
89
99
  recordsDelete: recordsDeleteMessage,
90
- initialWrite
100
+ initialWrite,
91
101
  }
92
102
  };
93
103
  }
@@ -96,7 +106,10 @@ export class RecordsReadHandler implements MethodHandler {
96
106
  const matchedRecordsWrite = matchedMessage as RecordsQueryReplyEntry;
97
107
 
98
108
  try {
99
- await RecordsReadHandler.authorizeRecordsRead(tenant, recordsRead, await RecordsWrite.parse(matchedRecordsWrite), this.messageStore);
109
+ const parsedWrite = await RecordsWrite.parse(matchedRecordsWrite);
110
+ await RecordsReadHandler.authorizeRecordsRead(
111
+ tenant, recordsRead, parsedWrite, this.deps.messageStore, this.deps.coreProtocols,
112
+ );
100
113
  } catch (error) {
101
114
  return messageReplyFromError(error, 401);
102
115
  }
@@ -107,7 +120,7 @@ export class RecordsReadHandler implements MethodHandler {
107
120
  data = DataStream.fromBytes(dataBytes);
108
121
  delete matchedRecordsWrite.encodedData;
109
122
  } else {
110
- const result = await this.dataStore.get(tenant, matchedRecordsWrite.recordId, matchedRecordsWrite.descriptor.dataCid);
123
+ const result = await this.deps.dataStore!.get(tenant, matchedRecordsWrite.recordId, matchedRecordsWrite.descriptor.dataCid);
111
124
  if (result?.dataStream === undefined) {
112
125
  return {
113
126
  status: { code: 404, detail: 'Not Found' }
@@ -126,7 +139,7 @@ export class RecordsReadHandler implements MethodHandler {
126
139
 
127
140
  // attach initial write if latest RecordsWrite is not initial write
128
141
  if (!await RecordsWrite.isInitialWrite(matchedRecordsWrite)) {
129
- const initialWriteQueryResult = await this.messageStore.query(
142
+ const initialWriteQueryResult = await this.deps.messageStore.query(
130
143
  tenant,
131
144
  [{ recordId: matchedRecordsWrite.recordId, isLatestBaseState: false, method: DwnMethodName.Write }]
132
145
  );
@@ -145,7 +158,8 @@ export class RecordsReadHandler implements MethodHandler {
145
158
  tenant: string,
146
159
  recordsRead: RecordsRead,
147
160
  matchedRecordsWrite: RecordsWrite,
148
- messageStore: MessageStore
161
+ messageStore: MessageStore,
162
+ coreProtocols?: CoreProtocolRegistry,
149
163
  ): Promise<void> {
150
164
  if (Message.isSignedByAuthorDelegate(recordsRead.message)) {
151
165
  await recordsRead.authorizeDelegate(matchedRecordsWrite.message, messageStore);
@@ -174,10 +188,8 @@ export class RecordsReadHandler implements MethodHandler {
174
188
  permissionGrant,
175
189
  messageStore
176
190
  });
177
- } else if (descriptor.protocol !== undefined) {
178
- await ProtocolAuthorization.authorizeRead(tenant, recordsRead, matchedRecordsWrite, messageStore);
179
191
  } else {
180
- throw new DwnError(DwnErrorCode.RecordsReadAuthorizationFailed, 'message failed authorization');
192
+ await ProtocolAuthorization.authorizeRead(tenant, recordsRead, matchedRecordsWrite, messageStore, coreProtocols);
181
193
  }
182
194
  }
183
195
  }
@@ -1,14 +1,13 @@
1
- import type { DidResolver } from '@enbox/dids';
1
+ import type { CoreProtocolRegistry } from '../core/core-protocol.js';
2
2
  import type { MessageSort } from '../types/message-types.js';
3
3
  import type { MessageStore } from '../types//message-store.js';
4
- import type { MethodHandler } from '../types/method-handler.js';
5
- import type { EventListener, EventStream } from '../types/subscriptions.js';
4
+ import type { SubscriptionListener } from '../types/subscriptions.js';
6
5
  import type { Filter, PaginationCursor } from '../types/query-types.js';
7
- import type { RecordEvent, RecordsQueryReplyEntry, RecordsSubscribeMessage, RecordsSubscribeReply, RecordSubscriptionHandler } from '../types/records-types.js';
6
+ import type { HandlerDependencies, MethodHandler } from '../types/method-handler.js';
7
+ import type { RecordsQueryReplyEntry, RecordsSubscribeMessage, RecordsSubscribeReply } from '../types/records-types.js';
8
8
 
9
9
  import { authenticate } from '../core/auth.js';
10
10
  import { DateSort } from '../types/records-types.js';
11
- import { FilterUtility } from '../utils/filter.js';
12
11
  import { Message } from '../core/message.js';
13
12
  import { messageReplyFromError } from '../core/message-reply.js';
14
13
  import { ProtocolAuthorization } from '../core/protocol-authorization.js';
@@ -21,7 +20,7 @@ import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.j
21
20
 
22
21
  export class RecordsSubscribeHandler implements MethodHandler {
23
22
 
24
- constructor(private didResolver: DidResolver, private messageStore: MessageStore, private eventStream?: EventStream) { }
23
+ constructor(private deps: HandlerDependencies) { }
25
24
 
26
25
  public async handle({
27
26
  tenant,
@@ -30,11 +29,11 @@ export class RecordsSubscribeHandler implements MethodHandler {
30
29
  }: {
31
30
  tenant: string,
32
31
  message: RecordsSubscribeMessage,
33
- subscriptionHandler: RecordSubscriptionHandler,
32
+ subscriptionHandler: SubscriptionListener,
34
33
  }): Promise<RecordsSubscribeReply> {
35
- if (this.eventStream === undefined) {
34
+ if (this.deps.eventLog === undefined) {
36
35
  return messageReplyFromError(new DwnError(
37
- DwnErrorCode.RecordsSubscribeEventStreamUnimplemented,
36
+ DwnErrorCode.RecordsSubscribeEventLogUnimplemented,
38
37
  'Subscriptions are not supported'
39
38
  ), 501);
40
39
  }
@@ -59,8 +58,8 @@ export class RecordsSubscribeHandler implements MethodHandler {
59
58
  } else {
60
59
  // authentication and authorization
61
60
  try {
62
- await authenticate(message.authorization!, this.didResolver);
63
- await RecordsSubscribeHandler.authorizeRecordsSubscribe(tenant, recordsSubscribe, this.messageStore);
61
+ await authenticate(message.authorization!, this.deps.didResolver);
62
+ await RecordsSubscribeHandler.authorizeRecordsSubscribe(tenant, recordsSubscribe, this.deps.messageStore, this.deps.coreProtocols);
64
63
  } catch (error) {
65
64
  return messageReplyFromError(error, 401);
66
65
  }
@@ -74,30 +73,51 @@ export class RecordsSubscribeHandler implements MethodHandler {
74
73
  }
75
74
  }
76
75
 
77
- // Step 1: Register event listener FIRST to ensure no events are missed between query and subscribe
78
- const listener: EventListener = (eventTenant, event, eventIndexes):void => {
79
- if (tenant === eventTenant && FilterUtility.matchAnyFilter(eventIndexes, eventFilters)) {
80
- subscriptionHandler(event as RecordEvent);
76
+ const messageCid = await Message.getCid(message);
77
+ const { cursor: eventLogCursor } = recordsSubscribe.message.descriptor;
78
+
79
+ if (eventLogCursor !== undefined) {
80
+ // ---- Cursor mode: catch-up from EventLog + EOSE + live ----
81
+ // All catch-up, buffering, dedup, and EOSE delivery are handled by the
82
+ // EventLog implementation. The handler just passes the cursor and filters.
83
+ // The subscriptionHandler receives SubscriptionMessage (event + EOSE) directly.
84
+
85
+ try {
86
+ const subscription = await this.deps.eventLog!.subscribe(tenant, messageCid, subscriptionHandler, {
87
+ cursor : eventLogCursor,
88
+ filters : eventFilters,
89
+ });
90
+
91
+ return {
92
+ status: { code: 200, detail: 'OK' },
93
+ subscription,
94
+ };
95
+ } catch (error) {
96
+ return messageReplyFromError(error, 500);
81
97
  }
82
- };
98
+ }
83
99
 
84
- const messageCid = await Message.getCid(message);
85
- const subscription = await this.eventStream.subscribe(tenant, messageCid, listener);
100
+ // ---- No cursor: existing behavior (initial snapshot from MessageStore) ----
101
+
102
+ // Step 1: Register event listener FIRST to ensure no events are missed between query and subscribe
103
+ const subscription = await this.deps.eventLog!.subscribe(tenant, messageCid, subscriptionHandler, {
104
+ filters: eventFilters,
105
+ });
86
106
 
87
107
  // Step 2: Query for initial snapshot of matching records
88
108
  let entries: RecordsQueryReplyEntry[];
89
- let cursor: PaginationCursor | undefined;
109
+ let paginationCursor: PaginationCursor | undefined;
90
110
  try {
91
111
  const { dateSort, pagination } = recordsSubscribe.message.descriptor;
92
112
  const messageSort = RecordsSubscribeHandler.convertDateSort(dateSort);
93
- const queryResult = await this.messageStore.query(tenant, queryFilters, messageSort, pagination);
113
+ const queryResult = await this.deps.messageStore.query(tenant, queryFilters, messageSort, pagination);
94
114
  entries = queryResult.messages as RecordsQueryReplyEntry[];
95
- cursor = queryResult.cursor;
115
+ paginationCursor = queryResult.cursor;
96
116
 
97
117
  // attach initialWrite for non-initial writes
98
118
  for (const entry of entries) {
99
119
  if (!await RecordsWrite.isInitialWrite(entry)) {
100
- const initialWriteResult = await this.messageStore.query(
120
+ const initialWriteResult = await this.deps.messageStore.query(
101
121
  tenant,
102
122
  [{ recordId: entry.recordId, isLatestBaseState: false, method: DwnMethodName.Write }]
103
123
  );
@@ -114,10 +134,10 @@ export class RecordsSubscribeHandler implements MethodHandler {
114
134
 
115
135
  // Step 3: Return subscription + initial entries + cursor
116
136
  return {
117
- status: { code: 200, detail: 'OK' },
137
+ status : { code: 200, detail: 'OK' },
118
138
  subscription,
119
139
  entries,
120
- cursor
140
+ cursor : paginationCursor,
121
141
  };
122
142
  }
123
143
 
@@ -300,7 +320,8 @@ export class RecordsSubscribeHandler implements MethodHandler {
300
320
  public static async authorizeRecordsSubscribe(
301
321
  tenant: string,
302
322
  recordsSubscribe: RecordsSubscribe,
303
- messageStore: MessageStore
323
+ messageStore: MessageStore,
324
+ coreProtocols?: CoreProtocolRegistry,
304
325
  ): Promise<void> {
305
326
 
306
327
  if (Message.isSignedByAuthorDelegate(recordsSubscribe.message)) {
@@ -311,7 +332,7 @@ export class RecordsSubscribeHandler implements MethodHandler {
311
332
  // this is because we dynamically filter out records that the caller is not authorized to see.
312
333
  // Currently only run protocol authorization if message deliberately invokes a protocol role.
313
334
  if (Records.shouldProtocolAuthorize(recordsSubscribe.signaturePayload!)) {
314
- await ProtocolAuthorization.authorizeQueryOrSubscribe(tenant, recordsSubscribe, messageStore);
335
+ await ProtocolAuthorization.authorizeQueryOrSubscribe(tenant, recordsSubscribe, messageStore, coreProtocols);
315
336
  }
316
337
  }
317
338
  }
@@ -1,10 +1,6 @@
1
- import type { DataStore } from '../types/data-store.js';
2
- import type { DidResolver } from '@enbox/dids';
3
- import type { EventStream } from '../types/subscriptions.js';
4
1
  import type { GenericMessageReply } from '../types/message-types.js';
5
2
  import type { MessageStore } from '../types/message-store.js';
6
- import type { MethodHandler } from '../types/method-handler.js';
7
- import type { StateIndex } from '../types/state-index.js';
3
+ import type { HandlerDependencies, MethodHandler } from '../types/method-handler.js';
8
4
  import type { RecordsQueryReplyEntry, RecordsWriteMessage } from '../types/records-types.js';
9
5
 
10
6
  import { authenticate } from '../core/auth.js';
@@ -26,13 +22,7 @@ type HandlerArgs = { tenant: string, message: RecordsWriteMessage, dataStream?:
26
22
 
27
23
  export class RecordsWriteHandler implements MethodHandler {
28
24
 
29
- constructor(
30
- private didResolver: DidResolver,
31
- private messageStore: MessageStore,
32
- private dataStore: DataStore,
33
- private stateIndex: StateIndex,
34
- private eventStream?: EventStream
35
- ) { }
25
+ constructor(private deps: HandlerDependencies) { }
36
26
 
37
27
  public async handle({
38
28
  tenant,
@@ -43,18 +33,15 @@ export class RecordsWriteHandler implements MethodHandler {
43
33
  try {
44
34
  recordsWrite = await RecordsWrite.parse(message);
45
35
 
46
- // Protocol-authorized record specific validation
47
- if (message.descriptor.protocol !== undefined) {
48
- await ProtocolAuthorization.validateReferentialIntegrity(tenant, recordsWrite, this.messageStore);
49
- }
36
+ await ProtocolAuthorization.validateReferentialIntegrity(tenant, recordsWrite, this.deps.messageStore, this.deps.coreProtocols);
50
37
  } catch (e) {
51
38
  return messageReplyFromError(e, 400);
52
39
  }
53
40
 
54
41
  // authentication & authorization
55
42
  try {
56
- await authenticate(message.authorization, this.didResolver, message.attestation);
57
- await RecordsWriteHandler.authorizeRecordsWrite(tenant, recordsWrite, this.messageStore);
43
+ await authenticate(message.authorization, this.deps.didResolver, message.attestation);
44
+ await this.authorizeRecordsWrite(tenant, recordsWrite, this.deps.messageStore);
58
45
  } catch (e) {
59
46
  return messageReplyFromError(e, 401);
60
47
  }
@@ -64,7 +51,7 @@ export class RecordsWriteHandler implements MethodHandler {
64
51
  interface : DwnInterfaceName.Records,
65
52
  recordId : message.recordId
66
53
  };
67
- const { messages: existingMessages } = await this.messageStore.query(tenant, [ query ]);
54
+ const { messages: existingMessages } = await this.deps.messageStore.query(tenant, [ query ]);
68
55
 
69
56
  // if the incoming write is not the initial write, then it must not modify any immutable properties defined by the initial write
70
57
  const newMessageIsInitialWrite = await recordsWrite.isInitialWrite();
@@ -95,6 +82,12 @@ export class RecordsWriteHandler implements MethodHandler {
95
82
  };
96
83
  }
97
84
 
85
+ // Look up the core protocol (if any) for the incoming message so that lifecycle hooks
86
+ // can be dispatched generically rather than checking for specific protocol URIs.
87
+ const coreProtocol = message.descriptor.protocol !== undefined
88
+ ? this.deps.coreProtocols?.get(message.descriptor.protocol)
89
+ : undefined;
90
+
98
91
  try {
99
92
  if (newestExistingMessage?.descriptor.method === DwnMethodName.Delete) {
100
93
  throw new DwnError(
@@ -103,11 +96,12 @@ export class RecordsWriteHandler implements MethodHandler {
103
96
  );
104
97
  }
105
98
 
106
- // NOTE: We want to perform additional validation before storing the RecordsWrite.
107
- // This is necessary for core DWN RecordsWrite that needs additional processing and allows us to fail before the storing and post processing.
108
- //
109
- // Example: Ensures that the protocol tag of a permission revocation RecordsWrite and the parent grant's scoped protocol match.
110
- await this.preProcessingForCoreRecordsWrite(tenant, message);
99
+ // Dispatch pre-processing hooks to the core protocol, if applicable.
100
+ // This allows core protocols to perform cross-record validation before storage
101
+ // (e.g. ensuring revocation tag consistency with the parent grant's scoped protocol).
102
+ if (coreProtocol?.preProcessWrite !== undefined) {
103
+ await coreProtocol.preProcessWrite(tenant, message, this.deps.messageStore);
104
+ }
111
105
 
112
106
  // NOTE: We allow isLatestBaseState to be true ONLY if the incoming message comes with data, or if the incoming message is NOT an initial write
113
107
  // This would allow an initial write to be written to the DB without data, but having it not queryable,
@@ -133,14 +127,14 @@ export class RecordsWriteHandler implements MethodHandler {
133
127
  }
134
128
 
135
129
  const indexes = await recordsWrite.constructIndexes(isLatestBaseState);
136
- await this.messageStore.put(tenant, messageWithOptionalEncodedData, indexes);
137
- await this.stateIndex.insert(tenant, await Message.getCid(message), indexes);
130
+ await this.deps.messageStore.put(tenant, messageWithOptionalEncodedData, indexes);
131
+ await this.deps.stateIndex!.insert(tenant, await Message.getCid(message), indexes);
138
132
 
139
133
  // NOTE: We only emit a `RecordsWrite` when the message is the latest base state.
140
134
  // Because we allow a `RecordsWrite` which is not the latest state to be written, but not queried, we shouldn't emit it either.
141
135
  // It will be emitted as a part of a subsequent next write, if it is the latest base state.
142
- if (this.eventStream !== undefined && isLatestBaseState) {
143
- this.eventStream.emit(tenant, { message, initialWrite }, indexes);
136
+ if (this.deps.eventLog !== undefined && isLatestBaseState) {
137
+ await this.deps.eventLog.emit(tenant, { message, initialWrite }, indexes);
144
138
  }
145
139
  } catch (error) {
146
140
  if (error instanceof DwnError) {
@@ -149,8 +143,8 @@ export class RecordsWriteHandler implements MethodHandler {
149
143
  error.code === DwnErrorCode.RecordsWriteNotAllowedAfterDelete ||
150
144
  error.code === DwnErrorCode.RecordsWriteDataCidMismatch ||
151
145
  error.code === DwnErrorCode.RecordsWriteDataSizeMismatch ||
152
- error.code.startsWith('PermissionsProtocolValidate') ||
153
- error.code.startsWith('SchemaValidator')) {
146
+ error.code.startsWith('SchemaValidator') ||
147
+ this.deps.coreProtocols?.mapErrorToStatusCode(error.code) !== undefined) {
154
148
  return messageReplyFromError(error, 400);
155
149
  }
156
150
  }
@@ -170,78 +164,23 @@ export class RecordsWriteHandler implements MethodHandler {
170
164
 
171
165
  // delete all existing messages of the same record that are not newest, except for the initial write
172
166
  await StorageController.deleteAllOlderMessagesButKeepInitialWrite(
173
- tenant, existingMessages, newestMessage, this.messageStore, this.dataStore, this.stateIndex
167
+ tenant, existingMessages, newestMessage, this.deps.messageStore, this.deps.dataStore!, this.deps.stateIndex!
174
168
  );
175
169
 
176
- await this.postProcessingForCoreRecordsWrite(tenant, recordsWrite);
170
+ // Dispatch post-processing hooks to the core protocol, if applicable.
171
+ // This allows core protocols to perform cascading side effects after a successful write
172
+ // (e.g. deleting messages authorized by a revoked grant).
173
+ if (coreProtocol?.postProcessWrite !== undefined) {
174
+ await coreProtocol.postProcessWrite(tenant, recordsWrite, {
175
+ messageStore : this.deps.messageStore,
176
+ dataStore : this.deps.dataStore!,
177
+ stateIndex : this.deps.stateIndex!,
178
+ });
179
+ }
177
180
 
178
181
  return messageReply;
179
182
  };
180
183
 
181
- /**
182
- * Performs additional necessary validation before storing the RecordsWrite if it is a core DWN RecordsWrite that needs additional processing.
183
- * For instance: a Permission revocation RecordsWrite.
184
- */
185
- private async preProcessingForCoreRecordsWrite(tenant: string, recordsWriteMessage: RecordsWriteMessage): Promise<void> {
186
-
187
- // we validate the protocol tag of the revocation message against the grant's scoped protocol
188
- // to do this we will fetch the grant, and compare the the scoped protocol value to the protocol tag of the revocation message
189
- if (recordsWriteMessage.descriptor.protocol === PermissionsProtocol.uri &&
190
- recordsWriteMessage.descriptor.protocolPath === PermissionsProtocol.revocationPath) {
191
-
192
- // get the parentId of the revocation message, which is the permissionGrantId
193
- // fetch the grant in order to get the grant's protocol
194
- const permissionGrantId = recordsWriteMessage.descriptor.parentId!;
195
- const grant = await PermissionsProtocol.fetchGrant(tenant, this.messageStore, permissionGrantId);
196
-
197
- // get the protocol values of the revocation message from the protocol tag and the protocol from the grant scope if they are defined
198
- // compare the two values ensuring they must match
199
- const revokeTagProtocol = recordsWriteMessage.descriptor.tags?.protocol;
200
- const grantProtocol = 'protocol' in grant.scope ? grant.scope.protocol : undefined;
201
- if (grantProtocol !== revokeTagProtocol) {
202
- throw new DwnError(
203
- DwnErrorCode.PermissionsProtocolValidateRevocationProtocolTagMismatch,
204
- `Revocation protocol ${revokeTagProtocol} does not match grant protocol ${grantProtocol}`
205
- );
206
- }
207
- }
208
- }
209
-
210
- private static validateSchemaForCoreRecordsWrite(recordsWriteMessage: RecordsWriteMessage, dataBytes: Uint8Array): void {
211
- if (recordsWriteMessage.descriptor.protocol === PermissionsProtocol.uri) {
212
- PermissionsProtocol.validateSchema(recordsWriteMessage, dataBytes);
213
- }
214
- }
215
-
216
- /**
217
- * Performs additional necessary tasks if the RecordsWrite handled is a core DWN RecordsWrite that need additional processing.
218
- * For instance: a Permission revocation RecordsWrite.
219
- */
220
- private async postProcessingForCoreRecordsWrite(tenant: string, recordsWrite: RecordsWrite): Promise<void> {
221
- // If this message is a Permission revocation, we need to delete all grant-authorized messages with timestamp after revocation
222
- // TODO: https://github.com/enboxorg/enbox/issues/716
223
- // This code is a direct copy and paste from the original PermissionsRevokeHandler (no longer exists),
224
- // but it appears that there was no test for it and it does not look like the code worked:
225
- // - not seeing `permissionGrantId` being an index
226
- // - not seeing `this.dataStore` being called to delete actual data
227
- // - test coverage is missing for the main delete logic
228
- if (recordsWrite.message.descriptor.protocol === PermissionsProtocol.uri &&
229
- recordsWrite.message.descriptor.protocolPath === PermissionsProtocol.revocationPath) {
230
- const permissionGrantId = recordsWrite.message.descriptor.parentId!;
231
- const grantAuthorizedMessagesQuery = {
232
- permissionGrantId,
233
- dateCreated: { gte: recordsWrite.message.descriptor.messageTimestamp },
234
- };
235
- const { messages: grantAuthorizedMessagesAfterRevoke } = await this.messageStore.query(tenant, [ grantAuthorizedMessagesQuery ]);
236
- const grantAuthorizedMessageCidsAfterRevoke: string[] = [];
237
- for (const grantAuthorizedMessage of grantAuthorizedMessagesAfterRevoke) {
238
- const messageCid = await Message.getCid(grantAuthorizedMessage);
239
- await this.messageStore.delete(tenant, messageCid);
240
- }
241
- this.stateIndex.delete(tenant, grantAuthorizedMessageCidsAfterRevoke);
242
- }
243
- }
244
-
245
184
  /**
246
185
  * Returns a `RecordsQueryReplyEntry` with a copy of the incoming message and the incoming data encoded to `Base64URL`.
247
186
  */
@@ -265,7 +204,13 @@ export class RecordsWriteHandler implements MethodHandler {
265
204
  const dataCid = await Cid.computeDagPbCidFromBytes(dataBytes);
266
205
  RecordsWriteHandler.validateDataIntegrity(message.descriptor.dataCid, message.descriptor.dataSize, dataCid, dataBytes.length);
267
206
 
268
- RecordsWriteHandler.validateSchemaForCoreRecordsWrite(message, dataBytes);
207
+ // Dispatch schema validation to the core protocol, if applicable.
208
+ const coreProtocol = message.descriptor.protocol !== undefined
209
+ ? this.deps.coreProtocols?.get(message.descriptor.protocol)
210
+ : undefined;
211
+ if (coreProtocol?.validateRecord !== undefined) {
212
+ coreProtocol.validateRecord(message, dataBytes);
213
+ }
269
214
 
270
215
  messageWithOptionalEncodedData = await this.cloneAndAddEncodedData(message, dataBytes);
271
216
  } else {
@@ -276,13 +221,13 @@ export class RecordsWriteHandler implements MethodHandler {
276
221
  // perform storage and CID computation in parallel
277
222
  const [dataCid, DataStorePutResult] = await Promise.all([
278
223
  Cid.computeDagPbCidFromStream(dataStreamCopy1),
279
- this.dataStore.put(tenant, message.recordId, message.descriptor.dataCid, dataStreamCopy2)
224
+ this.deps.dataStore!.put(tenant, message.recordId, message.descriptor.dataCid, dataStreamCopy2)
280
225
  ]);
281
226
 
282
227
  RecordsWriteHandler.validateDataIntegrity(message.descriptor.dataCid, message.descriptor.dataSize, dataCid, DataStorePutResult.dataSize);
283
228
  } catch (error) {
284
229
  // unwind/delete data if we have issue with storage or the data failed integrity validation
285
- await this.dataStore.delete(tenant, message.recordId, message.descriptor.dataCid);
230
+ await this.deps.dataStore!.delete(tenant, message.recordId, message.descriptor.dataCid);
286
231
 
287
232
  throw error;
288
233
  }
@@ -319,7 +264,7 @@ export class RecordsWriteHandler implements MethodHandler {
319
264
  // else just make sure the data is in the data store
320
265
 
321
266
  // attempt to retrieve the data from the previous message
322
- const DataStoreGetResult = await this.dataStore.get(tenant, newestExistingWrite.recordId, message.descriptor.dataCid);
267
+ const DataStoreGetResult = await this.deps.dataStore!.get(tenant, newestExistingWrite.recordId, message.descriptor.dataCid);
323
268
 
324
269
  if (DataStoreGetResult === undefined) {
325
270
  throw new DwnError(
@@ -361,7 +306,7 @@ export class RecordsWriteHandler implements MethodHandler {
361
306
  }
362
307
  }
363
308
 
364
- private static async authorizeRecordsWrite(tenant: string, recordsWrite: RecordsWrite, messageStore: MessageStore): Promise<void> {
309
+ private async authorizeRecordsWrite(tenant: string, recordsWrite: RecordsWrite, messageStore: MessageStore): Promise<void> {
365
310
  // if owner signature is given (`owner` is not `undefined`), it must be the same as the tenant DID
366
311
  if (recordsWrite.owner !== undefined && recordsWrite.owner !== tenant) {
367
312
  throw new DwnError(
@@ -394,10 +339,8 @@ export class RecordsWriteHandler implements MethodHandler {
394
339
  permissionGrant,
395
340
  messageStore
396
341
  });
397
- } else if (recordsWrite.message.descriptor.protocol !== undefined) {
398
- await ProtocolAuthorization.authorizeWrite(tenant, recordsWrite, messageStore);
399
342
  } else {
400
- throw new DwnError(DwnErrorCode.RecordsWriteAuthorizationFailed, 'message failed authorization');
343
+ await ProtocolAuthorization.authorizeWrite(tenant, recordsWrite, messageStore, this.deps.coreProtocols);
401
344
  }
402
345
  }
403
346
  }