@enbox/dwn-sdk-js 0.4.6 → 0.4.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 (375) hide show
  1. package/README.md +3 -1
  2. package/dist/browser.mjs +19 -78
  3. package/dist/browser.mjs.map +4 -4
  4. package/dist/esm/generated/precompiled-validators.js +2324 -1525
  5. package/dist/esm/generated/precompiled-validators.js.map +1 -1
  6. package/dist/esm/src/core/constants.js +50 -0
  7. package/dist/esm/src/core/constants.js.map +1 -1
  8. package/dist/esm/src/core/dwn-error.js +29 -11
  9. package/dist/esm/src/core/dwn-error.js.map +1 -1
  10. package/dist/esm/src/core/encryption-control.js +785 -0
  11. package/dist/esm/src/core/encryption-control.js.map +1 -0
  12. package/dist/esm/src/core/message.js +6 -0
  13. package/dist/esm/src/core/message.js.map +1 -1
  14. package/dist/esm/src/core/messages-grant-authorization.js +36 -5
  15. package/dist/esm/src/core/messages-grant-authorization.js.map +1 -1
  16. package/dist/esm/src/core/protocol-authorization-action.js +3 -12
  17. package/dist/esm/src/core/protocol-authorization-action.js.map +1 -1
  18. package/dist/esm/src/core/protocol-authorization-validation.js +31 -30
  19. package/dist/esm/src/core/protocol-authorization-validation.js.map +1 -1
  20. package/dist/esm/src/core/protocol-authorization.js +6 -0
  21. package/dist/esm/src/core/protocol-authorization.js.map +1 -1
  22. package/dist/esm/src/core/recording-validation-state-reader.js +3 -3
  23. package/dist/esm/src/core/recording-validation-state-reader.js.map +1 -1
  24. package/dist/esm/src/core/replication-apply.js +62 -108
  25. package/dist/esm/src/core/replication-apply.js.map +1 -1
  26. package/dist/esm/src/core/validation-state-reader.js +5 -6
  27. package/dist/esm/src/core/validation-state-reader.js.map +1 -1
  28. package/dist/esm/src/dwn.js +1 -2
  29. package/dist/esm/src/dwn.js.map +1 -1
  30. package/dist/esm/src/event-stream/event-emitter-wake-publisher.js +11 -11
  31. package/dist/esm/src/event-stream/event-emitter-wake-publisher.js.map +1 -1
  32. package/dist/esm/src/handlers/messages-query.js +6 -16
  33. package/dist/esm/src/handlers/messages-query.js.map +1 -1
  34. package/dist/esm/src/handlers/messages-read.js +4 -3
  35. package/dist/esm/src/handlers/messages-read.js.map +1 -1
  36. package/dist/esm/src/handlers/messages-subscribe.js +26 -30
  37. package/dist/esm/src/handlers/messages-subscribe.js.map +1 -1
  38. package/dist/esm/src/handlers/protocols-configure.js +6 -4
  39. package/dist/esm/src/handlers/protocols-configure.js.map +1 -1
  40. package/dist/esm/src/handlers/records-count.js +85 -10
  41. package/dist/esm/src/handlers/records-count.js.map +1 -1
  42. package/dist/esm/src/handlers/records-delete.js +11 -0
  43. package/dist/esm/src/handlers/records-delete.js.map +1 -1
  44. package/dist/esm/src/handlers/records-query.js +140 -18
  45. package/dist/esm/src/handlers/records-query.js.map +1 -1
  46. package/dist/esm/src/handlers/records-read.js +20 -4
  47. package/dist/esm/src/handlers/records-read.js.map +1 -1
  48. package/dist/esm/src/handlers/records-subscribe.js +127 -11
  49. package/dist/esm/src/handlers/records-subscribe.js.map +1 -1
  50. package/dist/esm/src/handlers/records-write.js +15 -0
  51. package/dist/esm/src/handlers/records-write.js.map +1 -1
  52. package/dist/esm/src/index.js +8 -11
  53. package/dist/esm/src/index.js.map +1 -1
  54. package/dist/esm/src/interfaces/protocols-configure.js +66 -9
  55. package/dist/esm/src/interfaces/protocols-configure.js.map +1 -1
  56. package/dist/esm/src/interfaces/records-write.js +43 -36
  57. package/dist/esm/src/interfaces/records-write.js.map +1 -1
  58. package/dist/esm/src/jose/algorithms/signing/ed25519.js +5 -5
  59. package/dist/esm/src/jose/algorithms/signing/ed25519.js.map +1 -1
  60. package/dist/esm/src/jose/jws/general/verifier.js +1 -1
  61. package/dist/esm/src/jose/jws/general/verifier.js.map +1 -1
  62. package/dist/esm/src/protocols/encryption.js +60 -270
  63. package/dist/esm/src/protocols/encryption.js.map +1 -1
  64. package/dist/esm/src/store/blockstore-level.js +14 -23
  65. package/dist/esm/src/store/blockstore-level.js.map +1 -1
  66. package/dist/esm/src/store/blockstore-mock.js +10 -27
  67. package/dist/esm/src/store/blockstore-mock.js.map +1 -1
  68. package/dist/esm/src/store/blockstore-utils.js +45 -0
  69. package/dist/esm/src/store/blockstore-utils.js.map +1 -0
  70. package/dist/esm/src/store/blockstore.js +2 -0
  71. package/dist/esm/src/store/blockstore.js.map +1 -0
  72. package/dist/esm/src/store/data-store-level.js +4 -12
  73. package/dist/esm/src/store/data-store-level.js.map +1 -1
  74. package/dist/esm/src/store/level.js +7 -0
  75. package/dist/esm/src/store/level.js.map +1 -0
  76. package/dist/esm/src/types/encryption-types.js +4 -1
  77. package/dist/esm/src/types/encryption-types.js.map +1 -1
  78. package/dist/esm/src/utils/data-stream.js +25 -0
  79. package/dist/esm/src/utils/data-stream.js.map +1 -1
  80. package/dist/esm/src/utils/encryption.js +107 -19
  81. package/dist/esm/src/utils/encryption.js.map +1 -1
  82. package/dist/esm/src/utils/grant-key-coverage.js +180 -0
  83. package/dist/esm/src/utils/grant-key-coverage.js.map +1 -0
  84. package/dist/esm/src/utils/hd-key.js +1 -2
  85. package/dist/esm/src/utils/hd-key.js.map +1 -1
  86. package/dist/esm/src/utils/jws.js +7 -1
  87. package/dist/esm/src/utils/jws.js.map +1 -1
  88. package/dist/esm/src/utils/memory-cache.js +29 -8
  89. package/dist/esm/src/utils/memory-cache.js.map +1 -1
  90. package/dist/esm/src/utils/protocols.js +27 -0
  91. package/dist/esm/src/utils/protocols.js.map +1 -1
  92. package/dist/esm/src/utils/record-limit-occupancy.js +23 -3
  93. package/dist/esm/src/utils/record-limit-occupancy.js.map +1 -1
  94. package/dist/esm/src/utils/records.js +29 -0
  95. package/dist/esm/src/utils/records.js.map +1 -1
  96. package/dist/esm/src/utils/secp256k1.js +12 -11
  97. package/dist/esm/src/utils/secp256k1.js.map +1 -1
  98. package/dist/esm/src/utils/secp256r1.js +12 -20
  99. package/dist/esm/src/utils/secp256r1.js.map +1 -1
  100. package/dist/esm/src/utils/time.js +103 -25
  101. package/dist/esm/src/utils/time.js.map +1 -1
  102. package/dist/esm/tests/core/constants.spec.js +35 -0
  103. package/dist/esm/tests/core/constants.spec.js.map +1 -0
  104. package/dist/esm/tests/core/encryption-control.spec.js +100 -0
  105. package/dist/esm/tests/core/encryption-control.spec.js.map +1 -0
  106. package/dist/esm/tests/core/message.spec.js +35 -0
  107. package/dist/esm/tests/core/message.spec.js.map +1 -1
  108. package/dist/esm/tests/core/protocol-authorization.spec.js +1 -1
  109. package/dist/esm/tests/core/protocol-authorization.spec.js.map +1 -1
  110. package/dist/esm/tests/core/replication-apply.spec.js +157 -74
  111. package/dist/esm/tests/core/replication-apply.spec.js.map +1 -1
  112. package/dist/esm/tests/core/replication-replay-property.spec.js +2 -1
  113. package/dist/esm/tests/core/replication-replay-property.spec.js.map +1 -1
  114. package/dist/esm/tests/core/validation-read-closure.spec.js +14 -28
  115. package/dist/esm/tests/core/validation-read-closure.spec.js.map +1 -1
  116. package/dist/esm/tests/core/validation-state-reader.spec.js +19 -23
  117. package/dist/esm/tests/core/validation-state-reader.spec.js.map +1 -1
  118. package/dist/esm/tests/dwn.spec.js +2 -1
  119. package/dist/esm/tests/dwn.spec.js.map +1 -1
  120. package/dist/esm/tests/event-emitter-wake-publisher.spec.js +51 -0
  121. package/dist/esm/tests/event-emitter-wake-publisher.spec.js.map +1 -0
  122. package/dist/esm/tests/features/protocol-composition.spec.js +1 -1
  123. package/dist/esm/tests/features/protocol-composition.spec.js.map +1 -1
  124. package/dist/esm/tests/features/records-record-limit.spec.js +1 -1
  125. package/dist/esm/tests/features/records-record-limit.spec.js.map +1 -1
  126. package/dist/esm/tests/fuzz/encryption.fuzz.spec.js +9 -1
  127. package/dist/esm/tests/fuzz/encryption.fuzz.spec.js.map +1 -1
  128. package/dist/esm/tests/fuzz/process-message.fuzz.spec.js +1 -1
  129. package/dist/esm/tests/fuzz/process-message.fuzz.spec.js.map +1 -1
  130. package/dist/esm/tests/fuzz/protocols-utils.fuzz.spec.js +29 -1
  131. package/dist/esm/tests/fuzz/protocols-utils.fuzz.spec.js.map +1 -1
  132. package/dist/esm/tests/fuzz/secp256k1.fuzz.spec.js +2 -2
  133. package/dist/esm/tests/fuzz/secp256k1.fuzz.spec.js.map +1 -1
  134. package/dist/esm/tests/fuzz/time.fuzz.spec.js +7 -1
  135. package/dist/esm/tests/fuzz/time.fuzz.spec.js.map +1 -1
  136. package/dist/esm/tests/handlers/messages-query.spec.js +123 -11
  137. package/dist/esm/tests/handlers/messages-query.spec.js.map +1 -1
  138. package/dist/esm/tests/handlers/messages-read.spec.js +95 -0
  139. package/dist/esm/tests/handlers/messages-read.spec.js.map +1 -1
  140. package/dist/esm/tests/handlers/messages-subscribe.spec.js +90 -0
  141. package/dist/esm/tests/handlers/messages-subscribe.spec.js.map +1 -1
  142. package/dist/esm/tests/handlers/protocols-configure.spec.js +66 -0
  143. package/dist/esm/tests/handlers/protocols-configure.spec.js.map +1 -1
  144. package/dist/esm/tests/handlers/records-count.spec.js +370 -0
  145. package/dist/esm/tests/handlers/records-count.spec.js.map +1 -1
  146. package/dist/esm/tests/handlers/records-delete.spec.js +70 -1
  147. package/dist/esm/tests/handlers/records-delete.spec.js.map +1 -1
  148. package/dist/esm/tests/handlers/records-query.spec.js +562 -1
  149. package/dist/esm/tests/handlers/records-query.spec.js.map +1 -1
  150. package/dist/esm/tests/handlers/records-read.spec.js +140 -2
  151. package/dist/esm/tests/handlers/records-read.spec.js.map +1 -1
  152. package/dist/esm/tests/handlers/records-subscribe.spec.js +241 -1
  153. package/dist/esm/tests/handlers/records-subscribe.spec.js.map +1 -1
  154. package/dist/esm/tests/handlers/records-write.spec.js +1187 -29
  155. package/dist/esm/tests/handlers/records-write.spec.js.map +1 -1
  156. package/dist/esm/tests/interfaces/protocols-configure.spec.js +290 -2
  157. package/dist/esm/tests/interfaces/protocols-configure.spec.js.map +1 -1
  158. package/dist/esm/tests/interfaces/records-write.spec.js +47 -5
  159. package/dist/esm/tests/interfaces/records-write.spec.js.map +1 -1
  160. package/dist/esm/tests/protocols/encryption.spec.js +187 -452
  161. package/dist/esm/tests/protocols/encryption.spec.js.map +1 -1
  162. package/dist/esm/tests/scenarios/end-to-end-tests.spec.js +13 -27
  163. package/dist/esm/tests/scenarios/end-to-end-tests.spec.js.map +1 -1
  164. package/dist/esm/tests/store/blockstore-level.spec.js +33 -10
  165. package/dist/esm/tests/store/blockstore-level.spec.js.map +1 -1
  166. package/dist/esm/tests/store/blockstore-mock.spec.js +31 -7
  167. package/dist/esm/tests/store/blockstore-mock.spec.js.map +1 -1
  168. package/dist/esm/tests/store/blockstore-utils.spec.js +115 -0
  169. package/dist/esm/tests/store/blockstore-utils.spec.js.map +1 -0
  170. package/dist/esm/tests/store/index-level.spec.js +3 -3
  171. package/dist/esm/tests/store/index-level.spec.js.map +1 -1
  172. package/dist/esm/tests/test-stores.js +2 -1
  173. package/dist/esm/tests/test-stores.js.map +1 -1
  174. package/dist/esm/tests/utils/cid.spec.js +15 -0
  175. package/dist/esm/tests/utils/cid.spec.js.map +1 -1
  176. package/dist/esm/tests/utils/data-stream.spec.js +30 -0
  177. package/dist/esm/tests/utils/data-stream.spec.js.map +1 -1
  178. package/dist/esm/tests/utils/encryption-control-test-utils.js +111 -0
  179. package/dist/esm/tests/utils/encryption-control-test-utils.js.map +1 -0
  180. package/dist/esm/tests/utils/encryption.spec.js +198 -5
  181. package/dist/esm/tests/utils/encryption.spec.js.map +1 -1
  182. package/dist/esm/tests/utils/grant-key-coverage.spec.js +262 -0
  183. package/dist/esm/tests/utils/grant-key-coverage.spec.js.map +1 -0
  184. package/dist/esm/tests/utils/memory-cache.spec.js +12 -0
  185. package/dist/esm/tests/utils/memory-cache.spec.js.map +1 -1
  186. package/dist/esm/tests/utils/secp256r1.spec.js +2 -2
  187. package/dist/esm/tests/utils/secp256r1.spec.js.map +1 -1
  188. package/dist/esm/tests/utils/test-data-generator.js +2 -1
  189. package/dist/esm/tests/utils/test-data-generator.js.map +1 -1
  190. package/dist/esm/tests/utils/test-validation-state-reader.js +1 -1
  191. package/dist/esm/tests/utils/test-validation-state-reader.js.map +1 -1
  192. package/dist/esm/tests/utils/time.spec.js +26 -0
  193. package/dist/esm/tests/utils/time.spec.js.map +1 -1
  194. package/dist/esm/tests/validation/json-schemas/encryption/audience.spec.js +45 -0
  195. package/dist/esm/tests/validation/json-schemas/encryption/audience.spec.js.map +1 -0
  196. package/dist/esm/tests/validation/json-schemas/encryption/delivery.spec.js +47 -0
  197. package/dist/esm/tests/validation/json-schemas/encryption/delivery.spec.js.map +1 -0
  198. package/dist/esm/tests/validation/json-schemas/encryption/wrapped-grant-key-envelope.spec.js +43 -0
  199. package/dist/esm/tests/validation/json-schemas/encryption/wrapped-grant-key-envelope.spec.js.map +1 -0
  200. package/dist/esm/tests/validation/json-schemas/protocols/protocols-configure.spec.js +152 -0
  201. package/dist/esm/tests/validation/json-schemas/protocols/protocols-configure.spec.js.map +1 -1
  202. package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js +46 -1
  203. package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js.map +1 -1
  204. package/dist/types/generated/precompiled-validators.d.ts +20 -4
  205. package/dist/types/generated/precompiled-validators.d.ts.map +1 -1
  206. package/dist/types/src/core/constants.d.ts +39 -0
  207. package/dist/types/src/core/constants.d.ts.map +1 -1
  208. package/dist/types/src/core/dwn-error.d.ts +29 -11
  209. package/dist/types/src/core/dwn-error.d.ts.map +1 -1
  210. package/dist/types/src/core/encryption-control.d.ts +128 -0
  211. package/dist/types/src/core/encryption-control.d.ts.map +1 -0
  212. package/dist/types/src/core/message.d.ts +4 -0
  213. package/dist/types/src/core/message.d.ts.map +1 -1
  214. package/dist/types/src/core/messages-grant-authorization.d.ts +11 -0
  215. package/dist/types/src/core/messages-grant-authorization.d.ts.map +1 -1
  216. package/dist/types/src/core/protocol-authorization-action.d.ts.map +1 -1
  217. package/dist/types/src/core/protocol-authorization-validation.d.ts.map +1 -1
  218. package/dist/types/src/core/protocol-authorization.d.ts.map +1 -1
  219. package/dist/types/src/core/recording-validation-state-reader.d.ts +2 -3
  220. package/dist/types/src/core/recording-validation-state-reader.d.ts.map +1 -1
  221. package/dist/types/src/core/replication-apply.d.ts +10 -1
  222. package/dist/types/src/core/replication-apply.d.ts.map +1 -1
  223. package/dist/types/src/core/validation-state-reader.d.ts +2 -3
  224. package/dist/types/src/core/validation-state-reader.d.ts.map +1 -1
  225. package/dist/types/src/dwn.d.ts.map +1 -1
  226. package/dist/types/src/event-stream/event-emitter-wake-publisher.d.ts +1 -1
  227. package/dist/types/src/event-stream/event-emitter-wake-publisher.d.ts.map +1 -1
  228. package/dist/types/src/handlers/messages-query.d.ts.map +1 -1
  229. package/dist/types/src/handlers/messages-read.d.ts.map +1 -1
  230. package/dist/types/src/handlers/messages-subscribe.d.ts.map +1 -1
  231. package/dist/types/src/handlers/protocols-configure.d.ts +1 -0
  232. package/dist/types/src/handlers/protocols-configure.d.ts.map +1 -1
  233. package/dist/types/src/handlers/records-count.d.ts +2 -0
  234. package/dist/types/src/handlers/records-count.d.ts.map +1 -1
  235. package/dist/types/src/handlers/records-delete.d.ts.map +1 -1
  236. package/dist/types/src/handlers/records-query.d.ts +3 -0
  237. package/dist/types/src/handlers/records-query.d.ts.map +1 -1
  238. package/dist/types/src/handlers/records-read.d.ts.map +1 -1
  239. package/dist/types/src/handlers/records-subscribe.d.ts +2 -0
  240. package/dist/types/src/handlers/records-subscribe.d.ts.map +1 -1
  241. package/dist/types/src/handlers/records-write.d.ts.map +1 -1
  242. package/dist/types/src/index.d.ts +12 -18
  243. package/dist/types/src/index.d.ts.map +1 -1
  244. package/dist/types/src/interfaces/protocols-configure.d.ts +13 -1
  245. package/dist/types/src/interfaces/protocols-configure.d.ts.map +1 -1
  246. package/dist/types/src/interfaces/records-write.d.ts +5 -1
  247. package/dist/types/src/interfaces/records-write.d.ts.map +1 -1
  248. package/dist/types/src/jose/algorithms/signing/ed25519.d.ts.map +1 -1
  249. package/dist/types/src/protocols/encryption.d.ts +15 -19
  250. package/dist/types/src/protocols/encryption.d.ts.map +1 -1
  251. package/dist/types/src/store/blockstore-level.d.ts +11 -11
  252. package/dist/types/src/store/blockstore-level.d.ts.map +1 -1
  253. package/dist/types/src/store/blockstore-mock.d.ts +12 -12
  254. package/dist/types/src/store/blockstore-mock.d.ts.map +1 -1
  255. package/dist/types/src/store/blockstore-utils.d.ts +23 -0
  256. package/dist/types/src/store/blockstore-utils.d.ts.map +1 -0
  257. package/dist/types/src/store/blockstore.d.ts +3 -0
  258. package/dist/types/src/store/blockstore.d.ts.map +1 -0
  259. package/dist/types/src/store/data-store-level.d.ts.map +1 -1
  260. package/dist/types/src/store/level.d.ts +13 -0
  261. package/dist/types/src/store/level.d.ts.map +1 -0
  262. package/dist/types/src/types/cache.d.ts +2 -2
  263. package/dist/types/src/types/cache.d.ts.map +1 -1
  264. package/dist/types/src/types/encryption-types.d.ts +31 -2
  265. package/dist/types/src/types/encryption-types.d.ts.map +1 -1
  266. package/dist/types/src/types/validation-state-reader.d.ts +3 -5
  267. package/dist/types/src/types/validation-state-reader.d.ts.map +1 -1
  268. package/dist/types/src/utils/data-stream.d.ts +5 -0
  269. package/dist/types/src/utils/data-stream.d.ts.map +1 -1
  270. package/dist/types/src/utils/encryption.d.ts +53 -24
  271. package/dist/types/src/utils/encryption.d.ts.map +1 -1
  272. package/dist/types/src/utils/grant-key-coverage.d.ts +36 -0
  273. package/dist/types/src/utils/grant-key-coverage.d.ts.map +1 -0
  274. package/dist/types/src/utils/hd-key.d.ts.map +1 -1
  275. package/dist/types/src/utils/jws.d.ts.map +1 -1
  276. package/dist/types/src/utils/memory-cache.d.ts +4 -2
  277. package/dist/types/src/utils/memory-cache.d.ts.map +1 -1
  278. package/dist/types/src/utils/protocols.d.ts +11 -0
  279. package/dist/types/src/utils/protocols.d.ts.map +1 -1
  280. package/dist/types/src/utils/record-limit-occupancy.d.ts +7 -0
  281. package/dist/types/src/utils/record-limit-occupancy.d.ts.map +1 -1
  282. package/dist/types/src/utils/records.d.ts +2 -0
  283. package/dist/types/src/utils/records.d.ts.map +1 -1
  284. package/dist/types/src/utils/secp256k1.d.ts.map +1 -1
  285. package/dist/types/src/utils/secp256r1.d.ts.map +1 -1
  286. package/dist/types/src/utils/time.d.ts +21 -13
  287. package/dist/types/src/utils/time.d.ts.map +1 -1
  288. package/dist/types/tests/core/constants.spec.d.ts +2 -0
  289. package/dist/types/tests/core/constants.spec.d.ts.map +1 -0
  290. package/dist/types/tests/core/encryption-control.spec.d.ts +2 -0
  291. package/dist/types/tests/core/encryption-control.spec.d.ts.map +1 -0
  292. package/dist/types/tests/dwn.spec.d.ts.map +1 -1
  293. package/dist/types/tests/event-emitter-wake-publisher.spec.d.ts +2 -0
  294. package/dist/types/tests/event-emitter-wake-publisher.spec.d.ts.map +1 -0
  295. package/dist/types/tests/handlers/messages-query.spec.d.ts.map +1 -1
  296. package/dist/types/tests/handlers/messages-read.spec.d.ts.map +1 -1
  297. package/dist/types/tests/handlers/messages-subscribe.spec.d.ts.map +1 -1
  298. package/dist/types/tests/handlers/protocols-configure.spec.d.ts.map +1 -1
  299. package/dist/types/tests/handlers/records-count.spec.d.ts.map +1 -1
  300. package/dist/types/tests/handlers/records-delete.spec.d.ts.map +1 -1
  301. package/dist/types/tests/handlers/records-query.spec.d.ts.map +1 -1
  302. package/dist/types/tests/handlers/records-read.spec.d.ts.map +1 -1
  303. package/dist/types/tests/handlers/records-subscribe.spec.d.ts.map +1 -1
  304. package/dist/types/tests/handlers/records-write.spec.d.ts.map +1 -1
  305. package/dist/types/tests/scenarios/end-to-end-tests.spec.d.ts.map +1 -1
  306. package/dist/types/tests/store/blockstore-utils.spec.d.ts +2 -0
  307. package/dist/types/tests/store/blockstore-utils.spec.d.ts.map +1 -0
  308. package/dist/types/tests/test-stores.d.ts.map +1 -1
  309. package/dist/types/tests/utils/encryption-control-test-utils.d.ts +46 -0
  310. package/dist/types/tests/utils/encryption-control-test-utils.d.ts.map +1 -0
  311. package/dist/types/tests/utils/grant-key-coverage.spec.d.ts +2 -0
  312. package/dist/types/tests/utils/grant-key-coverage.spec.d.ts.map +1 -0
  313. package/dist/types/tests/utils/test-data-generator.d.ts.map +1 -1
  314. package/dist/types/tests/validation/json-schemas/encryption/audience.spec.d.ts +2 -0
  315. package/dist/types/tests/validation/json-schemas/encryption/audience.spec.d.ts.map +1 -0
  316. package/dist/types/tests/validation/json-schemas/encryption/delivery.spec.d.ts +2 -0
  317. package/dist/types/tests/validation/json-schemas/encryption/delivery.spec.d.ts.map +1 -0
  318. package/dist/types/tests/validation/json-schemas/encryption/wrapped-grant-key-envelope.spec.d.ts +2 -0
  319. package/dist/types/tests/validation/json-schemas/encryption/wrapped-grant-key-envelope.spec.d.ts.map +1 -0
  320. package/package.json +47 -28
  321. package/src/core/constants.ts +61 -0
  322. package/src/core/dwn-error.ts +29 -11
  323. package/src/core/encryption-control.ts +1249 -0
  324. package/src/core/message.ts +7 -0
  325. package/src/core/messages-grant-authorization.ts +60 -9
  326. package/src/core/protocol-authorization-action.ts +3 -13
  327. package/src/core/protocol-authorization-validation.ts +66 -46
  328. package/src/core/protocol-authorization.ts +7 -0
  329. package/src/core/recording-validation-state-reader.ts +4 -5
  330. package/src/core/replication-apply.ts +77 -133
  331. package/src/core/validation-state-reader.ts +6 -8
  332. package/src/dwn.ts +1 -2
  333. package/src/event-stream/event-emitter-wake-publisher.ts +10 -14
  334. package/src/handlers/messages-query.ts +6 -22
  335. package/src/handlers/messages-read.ts +4 -3
  336. package/src/handlers/messages-subscribe.ts +34 -30
  337. package/src/handlers/protocols-configure.ts +7 -4
  338. package/src/handlers/records-count.ts +111 -10
  339. package/src/handlers/records-delete.ts +15 -0
  340. package/src/handlers/records-query.ts +176 -20
  341. package/src/handlers/records-read.ts +19 -6
  342. package/src/handlers/records-subscribe.ts +158 -8
  343. package/src/handlers/records-write.ts +19 -0
  344. package/src/index.ts +50 -22
  345. package/src/interfaces/protocols-configure.ts +102 -11
  346. package/src/interfaces/records-write.ts +49 -43
  347. package/src/jose/algorithms/signing/ed25519.ts +7 -6
  348. package/src/jose/jws/general/verifier.ts +3 -3
  349. package/src/protocols/encryption.ts +94 -411
  350. package/src/store/blockstore-level.ts +33 -37
  351. package/src/store/blockstore-mock.ts +24 -38
  352. package/src/store/blockstore-utils.ts +85 -0
  353. package/src/store/blockstore.ts +8 -0
  354. package/src/store/data-store-level.ts +5 -12
  355. package/src/store/level.ts +19 -0
  356. package/src/types/cache.ts +3 -3
  357. package/src/types/encryption-types.ts +39 -2
  358. package/src/types/validation-state-reader.ts +3 -5
  359. package/src/utils/data-stream.ts +29 -1
  360. package/src/utils/encryption.ts +190 -60
  361. package/src/utils/grant-key-coverage.ts +303 -0
  362. package/src/utils/hd-key.ts +1 -2
  363. package/src/utils/jws.ts +8 -2
  364. package/src/utils/memory-cache.ts +42 -11
  365. package/src/utils/protocols.ts +32 -0
  366. package/src/utils/record-limit-occupancy.ts +34 -5
  367. package/src/utils/records.ts +36 -2
  368. package/src/utils/secp256k1.ts +12 -12
  369. package/src/utils/secp256r1.ts +12 -22
  370. package/src/utils/time.ts +145 -27
  371. package/dist/esm/tests/validation/json-schemas/encryption/audience-key.spec.js +0 -40
  372. package/dist/esm/tests/validation/json-schemas/encryption/audience-key.spec.js.map +0 -1
  373. package/dist/types/tests/validation/json-schemas/encryption/audience-key.spec.d.ts +0 -2
  374. package/dist/types/tests/validation/json-schemas/encryption/audience-key.spec.d.ts.map +0 -1
  375. package/src/types/mitt.d.ts +0 -28
@@ -1,3 +1,4 @@
1
+ import type { EncryptionControlPath } from './constants.js';
1
2
  import type { GenericMessage } from '../types/message-types.js';
2
3
  import type { ProgressToken } from '../types/subscriptions.js';
3
4
  import type { ProtocolDefinition } from '../types/protocols-types.js';
@@ -9,7 +10,8 @@ import { EncryptionProtocol } from '../protocols/encryption.js';
9
10
  import { Message } from './message.js';
10
11
  import { ROLE_AUDIENCE_DERIVATION_SCHEME } from '../utils/encryption.js';
11
12
  import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
12
- import { isCrossProtocolRef, parseCrossProtocolRef } from '../utils/protocols.js';
13
+ import { ENCRYPTION_CONTROL_AUDIENCE_PATH, ENCRYPTION_CONTROL_DELIVERY_PATH } from './constants.js';
14
+ import { getRoleAudienceContextId, getRoleContextPrefix, isCrossProtocolRef, parseCrossProtocolRef } from '../utils/protocols.js';
13
15
 
14
16
  export type ReplicationApplyOptions = {
15
17
  dataStream?: ReadableStream<Uint8Array>;
@@ -42,14 +44,6 @@ export type ReplicationApplyResultContext = {
42
44
  missingAncestorRecordIds?: string[];
43
45
  };
44
46
 
45
- type AudienceDependencyTags = {
46
- protocol: string;
47
- contextId: string;
48
- role: string;
49
- epoch: number;
50
- keyId: string;
51
- };
52
-
53
47
  export type DependencyRef =
54
48
  | { type: 'Protocol'; protocol: string; messageCid?: string; terminal?: boolean }
55
49
  | { type: 'InitialWrite'; recordId: string; protocol?: string; messageCid?: string; terminal?: boolean }
@@ -59,7 +53,16 @@ export type DependencyRef =
59
53
  | { type: 'Grant'; permissionGrantId: string; messageCid?: string; terminal?: boolean }
60
54
  | {
61
55
  type: 'EncryptionProtocol';
62
- protocolPath: 'audienceEpoch' | 'audienceKey' | 'grantKey';
56
+ protocolPath: 'grantKey';
57
+ tags?: Record<string, string | number>;
58
+ recipient?: string;
59
+ messageCid?: string;
60
+ terminal?: boolean;
61
+ }
62
+ | {
63
+ type: 'EncryptionControl';
64
+ protocol: string;
65
+ protocolPath: EncryptionControlPath;
63
66
  tags?: Record<string, string | number>;
64
67
  recipient?: string;
65
68
  messageCid?: string;
@@ -197,14 +200,13 @@ function dependencyRefsFromStatus(
197
200
  case DwnErrorCode.GrantAuthorizationGrantMissing:
198
201
  return toRefList(grantDependencyFromMessage(message));
199
202
  case DwnErrorCode.ProtocolAuthorizationMatchingRoleRecordNotFound:
200
- case DwnErrorCode.EncryptionProtocolValidateAudienceWriterUnauthorized:
201
203
  return toRefList(roleDependencyFromMessage(message, context));
202
- case DwnErrorCode.EncryptionProtocolValidateAudienceEpochMissing:
203
- return toRefList(encryptionProtocolDependencyFromMessage(message, EncryptionProtocol.audienceEpochPath));
204
- case DwnErrorCode.ProtocolAuthorizationEncryptionRoleAudienceEpochMissing:
205
- return toRefList(encryptionProtocolDependencyFromRoleAudienceEntry(message, detail));
206
- case DwnErrorCode.EncryptionProtocolValidateAudienceKeyRoleRecordMissing:
207
- return toRefList(roleDependencyFromEncryptionAudienceRecipient(message));
204
+ case DwnErrorCode.ProtocolAuthorizationEncryptionRoleAudienceMissing:
205
+ return encryptionAudienceDependenciesFromRoleAudienceEntries(message);
206
+ case DwnErrorCode.EncryptionControlValidateDeliveryAudienceMissing:
207
+ return toRefList(encryptionAudienceDependencyFromDelivery(message));
208
+ case DwnErrorCode.EncryptionControlValidateDeliveryRecipientRoleRecordMissing:
209
+ return toRefList(roleDependencyFromEncryptionControlDeliveryRecipient(message));
208
210
  case DwnErrorCode.RecordsWriteMissingDataInPrevious:
209
211
  case DwnErrorCode.RecordsWriteMissingEncodedDataInPrevious:
210
212
  return toRefList(recordDataDependencyFromMessage(message));
@@ -373,11 +375,6 @@ function recordDataDependencyFromMessage(message: GenericMessage): DependencyRef
373
375
  }
374
376
 
375
377
  function roleDependencyFromMessage(message: GenericMessage, context: ReplicationApplyResultContext): DependencyRef | undefined {
376
- const encryptionRoleDependency = roleDependencyFromEncryptionAudienceWriter(message, context);
377
- if (encryptionRoleDependency !== undefined) {
378
- return encryptionRoleDependency;
379
- }
380
-
381
378
  const descriptor = message.descriptor as Record<string, unknown>;
382
379
  const filter = descriptor.filter as Record<string, unknown> | undefined;
383
380
  const protocol = descriptor.protocol ?? filter?.protocol;
@@ -405,10 +402,7 @@ function roleDependencyFromMessage(message: GenericMessage, context: Replication
405
402
  } else if (typeof filter?.contextId === 'string') {
406
403
  contextId = filter.contextId;
407
404
  }
408
- const roleSegments = roleProtocolPath.split('/').length - 1;
409
- const contextPrefix = roleSegments > 0 && contextId !== undefined
410
- ? contextId.split('/').slice(0, roleSegments).join('/')
411
- : undefined;
405
+ const contextPrefix = getRoleContextPrefix(roleProtocolPath, contextId);
412
406
 
413
407
  return {
414
408
  type : 'Role',
@@ -419,20 +413,9 @@ function roleDependencyFromMessage(message: GenericMessage, context: Replication
419
413
  };
420
414
  }
421
415
 
422
- function encryptionProtocolDependencyFromMessage(
423
- message: GenericMessage,
424
- protocolPath: Extract<DependencyRef, { type: 'EncryptionProtocol' }>['protocolPath'],
425
- ): DependencyRef | undefined {
426
- const tags = encryptionAudienceTagsFromMessage(message);
427
- return tags === undefined
428
- ? undefined
429
- : { type: 'EncryptionProtocol', protocolPath, tags };
430
- }
431
-
432
- function encryptionProtocolDependencyFromRoleAudienceEntry(
416
+ function encryptionAudienceDependenciesFromRoleAudienceEntries(
433
417
  message: GenericMessage,
434
- detail: string,
435
- ): DependencyRef | undefined {
418
+ ): Extract<DependencyRef, { type: 'EncryptionControl' }>[] {
436
419
  const descriptor = message.descriptor as Record<string, unknown>;
437
420
  const messageContextId = (message as { contextId?: unknown }).contextId;
438
421
  const contextId = typeof messageContextId === 'string' ? messageContextId : descriptor.contextId;
@@ -442,113 +425,97 @@ function encryptionProtocolDependencyFromRoleAudienceEntry(
442
425
  };
443
426
  }).encryption?.keyEncryption;
444
427
  if (typeof contextId !== 'string' || !Array.isArray(keyEncryption)) {
445
- return undefined;
428
+ return [];
446
429
  }
447
430
 
448
- const missingRole = /role '([^']+)'/.exec(detail)?.[1];
449
- const entry = keyEncryption.find((candidate): boolean =>
431
+ const refs: Extract<DependencyRef, { type: 'EncryptionControl' }>[] = [];
432
+ const sourceEntries = keyEncryption.filter((candidate): boolean =>
450
433
  candidate.derivationScheme === ROLE_AUDIENCE_DERIVATION_SCHEME &&
451
434
  typeof candidate.protocol === 'string' &&
452
- typeof candidate.role === 'string' &&
453
- (missingRole === undefined || candidate.role === missingRole) &&
454
- typeof candidate.epoch === 'number' &&
435
+ typeof candidate.rolePath === 'string' &&
455
436
  typeof candidate.keyId === 'string'
456
437
  );
457
- if (entry === undefined) {
458
- return undefined;
459
- }
438
+ for (const sourceEntry of sourceEntries) {
439
+ const rolePath = sourceEntry.rolePath as string;
440
+ const audienceContextId = getRoleAudienceContextId(rolePath, contextId);
441
+ if (audienceContextId === undefined) {
442
+ continue;
443
+ }
460
444
 
461
- const role = entry.role as string;
462
- const audienceContextId = roleAudienceContextId(role, contextId);
463
- if (audienceContextId === undefined) {
464
- return undefined;
445
+ refs.push({
446
+ type : 'EncryptionControl',
447
+ protocol : sourceEntry.protocol as string,
448
+ protocolPath : ENCRYPTION_CONTROL_AUDIENCE_PATH,
449
+ tags : {
450
+ protocol : sourceEntry.protocol as string,
451
+ rolePath,
452
+ contextId : audienceContextId,
453
+ keyId : sourceEntry.keyId as string,
454
+ },
455
+ });
465
456
  }
466
457
 
467
- return {
468
- type : 'EncryptionProtocol',
469
- protocolPath : EncryptionProtocol.audienceEpochPath,
470
- tags : {
471
- protocol : entry.protocol as string,
472
- contextId : audienceContextId,
473
- role,
474
- epoch : entry.epoch as number,
475
- keyId : entry.keyId as string,
476
- },
477
- };
458
+ return refs;
478
459
  }
479
460
 
480
- function roleDependencyFromEncryptionAudienceRecipient(message: GenericMessage): DependencyRef | undefined {
481
- const tags = encryptionAudienceTagsFromMessage(message);
482
- const recipient = (message.descriptor as Record<string, unknown>).recipient;
483
- if (tags === undefined || typeof recipient !== 'string') {
461
+ function encryptionAudienceDependencyFromDelivery(
462
+ message: GenericMessage,
463
+ ): Extract<DependencyRef, { type: 'EncryptionControl' }> | undefined {
464
+ const descriptor = message.descriptor as Record<string, unknown>;
465
+ if (descriptor.protocolPath !== ENCRYPTION_CONTROL_DELIVERY_PATH) {
484
466
  return undefined;
485
467
  }
486
468
 
487
- return {
488
- type : 'Role',
489
- protocol : tags.protocol,
490
- protocolPath : tags.role,
491
- recipient,
492
- ...(tags.contextId === '' ? {} : { contextPrefix: tags.contextId }),
493
- };
494
- }
495
-
496
- function roleDependencyFromEncryptionAudienceWriter(
497
- message: GenericMessage,
498
- context: ReplicationApplyResultContext,
499
- ): DependencyRef | undefined {
500
- const tags = encryptionAudienceTagsFromMessage(message);
501
- const protocolRole = getSignaturePayload(message)?.protocolRole;
502
- const recipient = Message.getAuthor(message);
503
- if (tags === undefined || typeof protocolRole !== 'string' || recipient === undefined) {
469
+ const tags = descriptor.tags;
470
+ if (!isRecordObject(tags)) {
504
471
  return undefined;
505
472
  }
506
473
 
507
- let roleProtocol = tags.protocol;
508
- let roleProtocolPath = protocolRole;
509
- if (isCrossProtocolRef(protocolRole)) {
510
- const parsed = parseCrossProtocolRef(protocolRole);
511
- const referencedProtocol = parsed === undefined ? undefined : context.protocolDefinition?.uses?.[parsed.alias];
512
- if (parsed === undefined || referencedProtocol === undefined) {
513
- return undefined;
514
- }
515
-
516
- roleProtocol = referencedProtocol;
517
- roleProtocolPath = parsed.protocolPath;
474
+ const { protocol, rolePath, contextId, keyId } = tags;
475
+ if (
476
+ typeof protocol !== 'string' ||
477
+ typeof rolePath !== 'string' ||
478
+ typeof contextId !== 'string' ||
479
+ typeof keyId !== 'string'
480
+ ) {
481
+ return undefined;
518
482
  }
519
483
 
520
- const contextPrefix = roleContextPrefix(roleProtocolPath, tags.contextId);
521
484
  return {
522
- type : 'Role',
523
- protocol : roleProtocol,
524
- protocolPath : roleProtocolPath,
525
- recipient,
526
- ...(contextPrefix === undefined ? {} : { contextPrefix }),
485
+ type : 'EncryptionControl',
486
+ protocol,
487
+ protocolPath : ENCRYPTION_CONTROL_AUDIENCE_PATH,
488
+ tags : { protocol, rolePath, contextId, keyId },
527
489
  };
528
490
  }
529
491
 
530
- function encryptionAudienceTagsFromMessage(message: GenericMessage): AudienceDependencyTags | undefined {
531
- if (!isEncryptionProtocolMessage(message)) {
492
+ function roleDependencyFromEncryptionControlDeliveryRecipient(message: GenericMessage): DependencyRef | undefined {
493
+ const descriptor = message.descriptor as Record<string, unknown>;
494
+ if (descriptor.protocolPath !== ENCRYPTION_CONTROL_DELIVERY_PATH || typeof descriptor.recipient !== 'string') {
532
495
  return undefined;
533
496
  }
534
497
 
535
- const tags = (message.descriptor as Record<string, unknown>).tags;
498
+ const tags = descriptor.tags;
536
499
  if (!isRecordObject(tags)) {
537
500
  return undefined;
538
501
  }
539
502
 
540
- const { protocol, contextId, role, epoch, keyId } = tags;
503
+ const { protocol, rolePath, contextId } = tags;
541
504
  if (
542
505
  typeof protocol !== 'string' ||
543
- typeof contextId !== 'string' ||
544
- typeof role !== 'string' ||
545
- typeof epoch !== 'number' ||
546
- typeof keyId !== 'string'
506
+ typeof rolePath !== 'string' ||
507
+ typeof contextId !== 'string'
547
508
  ) {
548
509
  return undefined;
549
510
  }
550
511
 
551
- return { protocol, contextId, role, epoch, keyId };
512
+ return {
513
+ type : 'Role',
514
+ protocol,
515
+ protocolPath : rolePath,
516
+ recipient : descriptor.recipient,
517
+ ...(contextId === '' ? {} : { contextPrefix: contextId }),
518
+ };
552
519
  }
553
520
 
554
521
  function dependencyProtocolFromMessage(message: GenericMessage): string | undefined {
@@ -570,29 +537,6 @@ function isEncryptionProtocolMessage(message: GenericMessage): boolean {
570
537
  descriptor.protocol === EncryptionProtocol.uri;
571
538
  }
572
539
 
573
- function roleContextPrefix(rolePath: string, contextId: string): string | undefined {
574
- const roleSegments = rolePath.split('/').length - 1;
575
- if (roleSegments === 0 || contextId === '') {
576
- return undefined;
577
- }
578
-
579
- return contextId.split('/').slice(0, roleSegments).join('/');
580
- }
581
-
582
- function roleAudienceContextId(rolePath: string, contextId: string): string | undefined {
583
- const roleSegments = rolePath.split('/').length - 1;
584
- if (roleSegments === 0) {
585
- return '';
586
- }
587
-
588
- const contextSegments = contextId.split('/');
589
- if (contextSegments.length < roleSegments) {
590
- return undefined;
591
- }
592
-
593
- return contextSegments.slice(0, roleSegments).join('/');
594
- }
595
-
596
540
  function isRecordObject(value: unknown): value is Record<string, unknown> {
597
541
  return typeof value === 'object' && value !== null;
598
542
  }
@@ -7,7 +7,7 @@ import type { ValidationStateReader } from '../types/validation-state-reader.js'
7
7
  import type { DataEncodedRecordsWriteMessage, RecordsWriteMessage } from '../types/records-types.js';
8
8
  import type { ProtocolDefinition, ProtocolsConfigureMessage } from '../types/protocols-types.js';
9
9
 
10
- import { ENCRYPTION_PROTOCOL_URI } from './constants.js';
10
+ import { ENCRYPTION_CONTROL_AUDIENCE_PATH } from './constants.js';
11
11
  import { FilterUtility } from '../utils/filter.js';
12
12
  import { PermissionGrant } from '../protocols/permission-grant.js';
13
13
  import { PermissionsProtocol } from '../protocols/permissions.js';
@@ -167,24 +167,22 @@ export class StoreValidationStateReader implements ValidationStateReader {
167
167
  }
168
168
 
169
169
  /** @inheritdoc */
170
- public async queryAudienceEpochs(input: {
170
+ public async queryAudienceRecords(input: {
171
171
  tenant: string;
172
172
  protocol: string;
173
+ rolePath: string;
173
174
  contextId: string;
174
- role: string;
175
- epoch: number;
176
175
  keyId?: string;
177
176
  }): Promise<RecordsWriteMessage[]> {
178
177
  const filter: Filter = {
179
178
  interface : DwnInterfaceName.Records,
180
179
  method : DwnMethodName.Write,
181
180
  isLatestBaseState : true,
182
- protocol : ENCRYPTION_PROTOCOL_URI,
183
- protocolPath : 'audienceEpoch',
181
+ protocol : input.protocol,
182
+ protocolPath : ENCRYPTION_CONTROL_AUDIENCE_PATH,
184
183
  'tag.protocol' : input.protocol,
184
+ 'tag.rolePath' : input.rolePath,
185
185
  'tag.contextId' : input.contextId,
186
- 'tag.role' : input.role,
187
- 'tag.epoch' : input.epoch,
188
186
  };
189
187
 
190
188
  if (input.keyId !== undefined) {
package/src/dwn.ts CHANGED
@@ -495,8 +495,7 @@ export class Dwn {
495
495
  ): Promise<ProtocolDefinition | undefined> {
496
496
  const detail = reply.status.detail ?? '';
497
497
  if (
498
- !detail.startsWith(`${DwnErrorCode.ProtocolAuthorizationMatchingRoleRecordNotFound}:`) &&
499
- !detail.startsWith(`${DwnErrorCode.EncryptionProtocolValidateAudienceWriterUnauthorized}:`)
498
+ !detail.startsWith(`${DwnErrorCode.ProtocolAuthorizationMatchingRoleRecordNotFound}:`)
500
499
  ) {
501
500
  return undefined;
502
501
  }
@@ -1,11 +1,5 @@
1
1
  import type { Wake, WakePublisher } from '../types/subscriptions.js';
2
2
 
3
- import mitt from 'mitt';
4
-
5
- const WAKE_CHANNEL = 'wake';
6
-
7
- type WakeEvents = Record<string, Wake>;
8
-
9
3
  export type WakeListener = (wake: Wake) => void;
10
4
 
11
5
  /**
@@ -13,22 +7,24 @@ export type WakeListener = (wake: Wake) => void;
13
7
  * failures must not affect the write path that already committed the row.
14
8
  */
15
9
  export class EventEmitterWakePublisher implements WakePublisher {
16
- private readonly emitter = mitt<WakeEvents>();
10
+ private readonly listeners = new Set<WakeListener>();
17
11
 
18
12
  public publish(wake: Wake): void {
19
- try {
20
- this.emitter.emit(WAKE_CHANNEL, wake);
21
- } catch {
22
- // Best-effort by contract.
13
+ for (const listener of Array.from(this.listeners)) {
14
+ try {
15
+ listener(wake);
16
+ } catch {
17
+ // Best-effort by contract.
18
+ }
23
19
  }
24
20
  }
25
21
 
26
22
  public subscribe(listener: WakeListener): () => void {
27
- this.emitter.on(WAKE_CHANNEL, listener);
28
- return (): void => { this.emitter.off(WAKE_CHANNEL, listener); };
23
+ this.listeners.add(listener);
24
+ return (): void => { this.listeners.delete(listener); };
29
25
  }
30
26
 
31
27
  public clear(): void {
32
- this.emitter.all.clear();
28
+ this.listeners.clear();
33
29
  }
34
30
  }
@@ -79,28 +79,12 @@ export class MessagesQueryHandler implements MethodHandler {
79
79
  tenant: string,
80
80
  messagesQuery: MessagesQuery,
81
81
  ): Promise<void> {
82
- if (messagesQuery.author === tenant) {
83
- return;
84
- }
85
-
86
- const permissionGrantIds = Message.getPermissionGrantIds(messagesQuery.signaturePayload!);
87
- if (messagesQuery.author !== undefined && permissionGrantIds.length > 0) {
88
- const permissionGrants = await MessagesGrantAuthorization.fetchPermissionGrants(
89
- tenant,
90
- this.deps.validationStateReader,
91
- permissionGrantIds
92
- );
93
- await MessagesGrantAuthorization.authorizeQueryOrSubscribe({
94
- incomingMessage : messagesQuery.message,
95
- expectedGrantor : tenant,
96
- expectedGrantee : messagesQuery.author,
97
- permissionGrants,
98
- validationStateReader : this.deps.validationStateReader
99
- });
100
- return;
101
- }
102
-
103
- throw new DwnError(DwnErrorCode.MessagesQueryAuthorizationFailed, 'message failed authorization');
82
+ await MessagesGrantAuthorization.authorizeQueryOrSubscribeInvocation({
83
+ tenant : tenant,
84
+ incomingMessage : messagesQuery.message,
85
+ validationStateReader : this.deps.validationStateReader,
86
+ failureCode : DwnErrorCode.MessagesQueryAuthorizationFailed,
87
+ });
104
88
  }
105
89
 
106
90
  private static asReplicationFeedReader(candidate: unknown): ReplicationFeedReader | undefined {
@@ -80,19 +80,20 @@ export class MessagesReadHandler implements MethodHandler {
80
80
  deps: HandlerDependencies
81
81
  ): Promise<void> {
82
82
 
83
- if (messagesRead.author === tenant) {
83
+ const requester = Message.getRequester(messagesRead.message);
84
+ if (messagesRead.author === tenant && requester === tenant) {
84
85
  // If the author is the tenant, no further authorization is needed
85
86
  return;
86
87
  }
87
88
 
88
89
  const permissionGrantIds = Message.getPermissionGrantIds(messagesRead.signaturePayload!);
89
- if (messagesRead.author !== undefined && permissionGrantIds.length > 0) {
90
+ if (requester !== undefined && permissionGrantIds.length > 0) {
90
91
  const permissionGrants = await MessagesGrantAuthorization.fetchPermissionGrants(tenant, deps.validationStateReader, permissionGrantIds);
91
92
  await MessagesGrantAuthorization.authorizeMessagesRead({
92
93
  messagesReadMessage : messagesRead.message,
93
94
  messageToRead : matchedMessage,
94
95
  expectedGrantor : tenant,
95
- expectedGrantee : messagesRead.author,
96
+ expectedGrantee : requester,
96
97
  permissionGrants,
97
98
  validationStateReader : deps.validationStateReader
98
99
  });
@@ -63,8 +63,8 @@ export class MessagesSubscribeHandler implements MethodHandler {
63
63
 
64
64
  const guardedHandler = MessagesSubscribeHandler.createAuthorizationGuard({
65
65
  authorization,
66
+ deps: this.deps,
66
67
  messagesSubscribe,
67
- validationStateReader: this.deps.validationStateReader,
68
68
  subscriptionHandler,
69
69
  });
70
70
 
@@ -100,39 +100,31 @@ export class MessagesSubscribeHandler implements MethodHandler {
100
100
  messagesSubscribe: MessagesSubscribe,
101
101
  deps: HandlerDependencies
102
102
  ): Promise<MessagesSubscribeAuthorization> {
103
- // if `MessagesSubscribe` author is the same as the target tenant, we can directly grant access
104
- if (messagesSubscribe.author === tenant) {
103
+ const grantSet = await MessagesGrantAuthorization.authorizeQueryOrSubscribeInvocation({
104
+ tenant : tenant,
105
+ incomingMessage : messagesSubscribe.message,
106
+ validationStateReader : deps.validationStateReader,
107
+ failureCode : DwnErrorCode.MessagesSubscribeAuthorizationFailed,
108
+ });
109
+ if (grantSet === undefined) {
105
110
  return { kind: 'owner' };
106
111
  }
107
112
 
108
- const permissionGrantIds = Message.getPermissionGrantIds(messagesSubscribe.signaturePayload!);
109
- if (messagesSubscribe.author !== undefined && permissionGrantIds.length > 0) {
110
- const permissionGrants = await MessagesGrantAuthorization.fetchPermissionGrants(tenant, deps.validationStateReader, permissionGrantIds);
111
- await MessagesGrantAuthorization.authorizeQueryOrSubscribe({
112
- incomingMessage : messagesSubscribe.message,
113
- expectedGrantor : tenant,
114
- expectedGrantee : messagesSubscribe.author,
115
- permissionGrants,
116
- validationStateReader : deps.validationStateReader
117
- });
118
- return {
119
- kind : 'delegate',
120
- expectedGrantor : tenant,
121
- expectedGrantee : messagesSubscribe.author,
122
- permissionGrants,
123
- };
124
- } else {
125
- throw new DwnError(DwnErrorCode.MessagesSubscribeAuthorizationFailed, 'message failed authorization');
126
- }
113
+ return {
114
+ kind : 'delegate',
115
+ expectedGrantor : tenant,
116
+ expectedGrantee : grantSet.requester,
117
+ permissionGrants : grantSet.permissionGrants,
118
+ };
127
119
  }
128
120
 
129
121
  private static createAuthorizationGuard(input: {
130
122
  authorization: MessagesSubscribeAuthorization;
123
+ deps: HandlerDependencies;
131
124
  messagesSubscribe: MessagesSubscribe;
132
- validationStateReader: HandlerDependencies['validationStateReader'];
133
125
  subscriptionHandler: SubscriptionListener;
134
126
  }): GuardedSubscriptionHandler {
135
- const { authorization, messagesSubscribe, validationStateReader, subscriptionHandler } = input;
127
+ const { authorization, deps, messagesSubscribe, subscriptionHandler } = input;
136
128
  if (authorization.kind === 'owner') {
137
129
  return {
138
130
  listener : subscriptionHandler,
@@ -153,7 +145,7 @@ export class MessagesSubscribeHandler implements MethodHandler {
153
145
  Promise.resolve(subscription?.close()).catch(() => {});
154
146
  };
155
147
 
156
- const emitTerminalAuthorizationError = (cursor: SubscriptionEvent['cursor']): void => {
148
+ const emitTerminalDeliveryError = (cursor: SubscriptionEvent['cursor'], code: DwnErrorCode, detail: string): void => {
157
149
  if (terminalErrorEmitted) {
158
150
  return;
159
151
  }
@@ -162,8 +154,8 @@ export class MessagesSubscribeHandler implements MethodHandler {
162
154
  type : 'error',
163
155
  cursor,
164
156
  error : {
165
- code : DwnErrorCode.MessagesSubscribeDeliveryAuthorizationFailed,
166
- detail : 'subscription authorization failed during delivery',
157
+ code,
158
+ detail,
167
159
  },
168
160
  });
169
161
  };
@@ -181,11 +173,23 @@ export class MessagesSubscribeHandler implements MethodHandler {
181
173
  expectedGrantor : authorization.expectedGrantor,
182
174
  expectedGrantee : authorization.expectedGrantee,
183
175
  permissionGrants : authorization.permissionGrants,
184
- validationStateReader,
176
+ validationStateReader : deps.validationStateReader,
185
177
  deliveryTimestamp : Time.getCurrentTimestamp(),
186
178
  });
187
- } catch {
188
- emitTerminalAuthorizationError(subMessage.cursor);
179
+ } catch (error) {
180
+ if (error instanceof DwnError) {
181
+ emitTerminalDeliveryError(
182
+ subMessage.cursor,
183
+ DwnErrorCode.MessagesSubscribeDeliveryAuthorizationFailed,
184
+ 'subscription authorization failed during delivery',
185
+ );
186
+ } else {
187
+ emitTerminalDeliveryError(
188
+ subMessage.cursor,
189
+ DwnErrorCode.MessagesSubscribeDeliveryFailed,
190
+ 'subscription delivery failed',
191
+ );
192
+ }
189
193
  closeSubscription();
190
194
  return;
191
195
  }
@@ -126,8 +126,7 @@ export class ProtocolsConfigureHandler implements MethodHandler {
126
126
  // re-index previously-latest messages as no longer the latest base state.
127
127
  for (const existingMessage of existingMessages) {
128
128
  if (existingMessage !== newestMessage) {
129
- const existingProtocolsConfigure = await ProtocolsConfigure.parse(existingMessage as ProtocolsConfigureMessage);
130
- const updatedIndexes = ProtocolsConfigureHandler.constructIndexes(existingProtocolsConfigure, false);
129
+ const updatedIndexes = ProtocolsConfigureHandler.constructIndexesFromMessage(existingMessage as ProtocolsConfigureMessage, false);
131
130
  const existingCid = await Message.getCid(existingMessage);
132
131
 
133
132
  await this.deps.messageStore.updateIndexes(tenant, existingCid, updatedIndexes);
@@ -140,9 +139,13 @@ export class ProtocolsConfigureHandler implements MethodHandler {
140
139
  };
141
140
 
142
141
  static constructIndexes(protocolsConfigure: ProtocolsConfigure, isLatestBaseState: boolean): { [key: string]: string | boolean } {
142
+ return ProtocolsConfigureHandler.constructIndexesFromMessage(protocolsConfigure.message, isLatestBaseState);
143
+ }
144
+
145
+ private static constructIndexesFromMessage(message: ProtocolsConfigureMessage, isLatestBaseState: boolean): { [key: string]: string | boolean } {
143
146
  // strip out `definition` as it is not indexable
144
- const { definition, ...propertiesToIndex } = protocolsConfigure.message.descriptor;
145
- const { author } = protocolsConfigure;
147
+ const { definition, ...propertiesToIndex } = message.descriptor;
148
+ const author = Message.getAuthor(message);
146
149
 
147
150
  const indexes: { [key: string]: string | boolean } = {
148
151
  ...propertiesToIndex,