@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
@@ -49,6 +49,13 @@ export class Message {
49
49
  return author;
50
50
  }
51
51
 
52
+ /**
53
+ * Gets the DID whose authority is being exercised by the request.
54
+ */
55
+ public static getRequester(message: GenericMessage): string | undefined {
56
+ return Message.isSignedByAuthorDelegate(message) ? Message.getSigner(message) : Message.getAuthor(message);
57
+ }
58
+
52
59
  /**
53
60
  * Validates the given message against the corresponding JSON schema.
54
61
  * @throws {Error} if fails validation.
@@ -10,11 +10,18 @@ import type { MessagesQueryMessage, MessagesReadMessage, MessagesSubscribeMessag
10
10
  import { DwnInterfaceName } from '../enums/dwn-interface-method.js';
11
11
  import { EncryptionProtocol } from '../protocols/encryption.js';
12
12
  import { GrantAuthorization } from './grant-authorization.js';
13
+ import { Jws } from '../utils/jws.js';
14
+ import { Message } from './message.js';
13
15
  import { PermissionScopeMatcher } from '../utils/permission-scope.js';
14
16
  import { PermissionsProtocol } from '../protocols/permissions.js';
15
17
  import { Records } from '../utils/records.js';
16
18
  import { DwnError, DwnErrorCode } from './dwn-error.js';
17
19
 
20
+ export type MessagesQueryOrSubscribeGrantSet = {
21
+ permissionGrants: PermissionGrant[];
22
+ requester: string;
23
+ };
24
+
18
25
  export class MessagesGrantAuthorization {
19
26
 
20
27
  public static async fetchPermissionGrants(
@@ -53,7 +60,12 @@ export class MessagesGrantAuthorization {
53
60
 
54
61
  for (const permissionGrant of permissionGrants) {
55
62
  const scope = permissionGrant.scope as MessagesPermissionScope;
56
- if (await MessagesGrantAuthorization.isScopeAuthorized(expectedGrantor, messageToRead, scope, validationStateReader)) {
63
+ if (await MessagesGrantAuthorization.isScopeAuthorized({
64
+ tenant : expectedGrantor,
65
+ messageToGet : messageToRead,
66
+ incomingScope : scope,
67
+ validationStateReader : validationStateReader,
68
+ })) {
57
69
  return;
58
70
  }
59
71
  }
@@ -89,6 +101,36 @@ export class MessagesGrantAuthorization {
89
101
  MessagesGrantAuthorization.authorizeFilterScope(incomingMessage, scopes);
90
102
  }
91
103
 
104
+ public static async authorizeQueryOrSubscribeInvocation(input: {
105
+ tenant: string;
106
+ incomingMessage: MessagesQueryMessage | MessagesSubscribeMessage;
107
+ validationStateReader: ValidationStateReader;
108
+ failureCode: DwnErrorCode;
109
+ }): Promise<MessagesQueryOrSubscribeGrantSet | undefined> {
110
+ const {
111
+ tenant, incomingMessage, validationStateReader, failureCode
112
+ } = input;
113
+ const requester = Message.getRequester(incomingMessage);
114
+ if (Message.getAuthor(incomingMessage) === tenant && requester === tenant) {
115
+ return undefined;
116
+ }
117
+
118
+ const permissionGrantIds = Message.getPermissionGrantIds(Jws.decodePlainObjectPayload(incomingMessage.authorization.signature));
119
+ if (requester !== undefined && permissionGrantIds.length > 0) {
120
+ const permissionGrants = await MessagesGrantAuthorization.fetchPermissionGrants(tenant, validationStateReader, permissionGrantIds);
121
+ await MessagesGrantAuthorization.authorizeQueryOrSubscribe({
122
+ incomingMessage : incomingMessage,
123
+ expectedGrantor : tenant,
124
+ expectedGrantee : requester,
125
+ permissionGrants : permissionGrants,
126
+ validationStateReader : validationStateReader,
127
+ });
128
+ return { permissionGrants, requester };
129
+ }
130
+
131
+ throw new DwnError(failureCode, 'message failed authorization');
132
+ }
133
+
92
134
  private static authorizeFilterScope(
93
135
  messagesMessage: MessagesQueryMessage | MessagesSubscribeMessage,
94
136
  scopes: MessagesPermissionScope[]
@@ -192,15 +234,16 @@ export class MessagesGrantAuthorization {
192
234
  * Determines whether the given record is inside a grant scope.
193
235
  */
194
236
  private static async isScopeAuthorized(
195
- tenant: string,
196
- messageToGet: GenericMessage,
197
- incomingScope: MessagesPermissionScope,
198
- validationStateReader: ValidationStateReader,
237
+ input: {
238
+ tenant: string;
239
+ messageToGet: GenericMessage;
240
+ incomingScope: MessagesPermissionScope;
241
+ validationStateReader: ValidationStateReader;
242
+ },
199
243
  ): Promise<boolean> {
200
- if (incomingScope.protocol === undefined) {
201
- return true;
202
- }
203
-
244
+ const {
245
+ tenant, messageToGet, incomingScope, validationStateReader
246
+ } = input;
204
247
  if (messageToGet.descriptor.interface === DwnInterfaceName.Records) {
205
248
  return MessagesGrantAuthorization.isRecordsMessageScopeAuthorized(
206
249
  tenant,
@@ -210,6 +253,10 @@ export class MessagesGrantAuthorization {
210
253
  );
211
254
  }
212
255
 
256
+ if (incomingScope.protocol === undefined) {
257
+ return true;
258
+ }
259
+
213
260
  if (messageToGet.descriptor.interface === DwnInterfaceName.Protocols) {
214
261
  return MessagesGrantAuthorization.isProtocolsConfigureScopeAuthorized(
215
262
  messageToGet as ProtocolsConfigureMessage,
@@ -232,6 +279,10 @@ export class MessagesGrantAuthorization {
232
279
  validationStateReader
233
280
  );
234
281
 
282
+ if (incomingScope.protocol === undefined) {
283
+ return true;
284
+ }
285
+
235
286
  if (recordsWriteMessage.descriptor.protocol === PermissionsProtocol.uri) {
236
287
  return MessagesGrantAuthorization.isPermissionRecordScopeAuthorized(
237
288
  tenant,
@@ -10,7 +10,7 @@ import type { ProtocolActionRule, ProtocolDefinition, ProtocolRuleSet } from '..
10
10
  import { DwnMethodName } from '../enums/dwn-interface-method.js';
11
11
  import { RecordsWrite } from '../interfaces/records-write.js';
12
12
  import { DwnError, DwnErrorCode } from './dwn-error.js';
13
- import { getRuleSetAtPath, isCrossProtocolRef, parseCrossProtocolRef } from '../utils/protocols.js';
13
+ import { getRoleContextPrefix, getRuleSetAtPath, isCrossProtocolRef, parseCrossProtocolRef } from '../utils/protocols.js';
14
14
  import { ProtocolAction, ProtocolActor } from '../types/protocols-types.js';
15
15
 
16
16
  /**
@@ -80,24 +80,14 @@ export async function verifyInvokedRole(
80
80
  }
81
81
  }
82
82
 
83
- const ancestorSegmentCountOfRolePath = roleProtocolPath.split('/').length - 1;
84
- if (contextId === undefined && ancestorSegmentCountOfRolePath > 0) {
83
+ const contextIdPrefix = getRoleContextPrefix(roleProtocolPath, contextId);
84
+ if (contextIdPrefix === undefined && roleProtocolPath.includes('/')) {
85
85
  throw new DwnError(
86
86
  DwnErrorCode.ProtocolAuthorizationMissingContextId,
87
87
  'Could not verify role because contextId is missing.'
88
88
  );
89
89
  }
90
90
 
91
- // Compute `contextId` prefix for fetching the invoked role record if the role path is not at the root level.
92
- // e.g. if invoked role path is `Thread/Participant`, and the `contextId` of the message is `threadX/messageY/attachmentZ`,
93
- // then we need to use the prefix `threadX` for the `contextId`
94
- // because the `contextId` of the Participant record would be in the form of be `threadX/participantA`
95
- let contextIdPrefix: string | undefined;
96
- if (ancestorSegmentCountOfRolePath > 0) {
97
- const contextIdSegments = contextId!.split('/'); // NOTE: currently contextId segment count is never shorter than the role path count.
98
- contextIdPrefix = contextIdSegments.slice(0, ancestorSegmentCountOfRolePath).join('/');
99
- }
100
-
101
91
  // fetch the invoked role record
102
92
  const matchingRoleRecordExists = await validationStateReader.hasMatchingRoleRecord({
103
93
  tenant,
@@ -1,6 +1,6 @@
1
1
  import type { RecordsWrite } from '../interfaces/records-write.js';
2
2
  import type { RecordsWriteMessage } from '../types/records-types.js';
3
- import type { RoleAudienceKeyEncryption } from '../utils/encryption.js';
3
+ import type { SourceRoleAudienceKeyEncryption } from '../utils/encryption.js';
4
4
  import type { ValidationStateReader } from '../types/validation-state-reader.js';
5
5
  import type { ProtocolActionRule, ProtocolDefinition, ProtocolRuleSet, ProtocolType, ProtocolTypes } from '../types/protocols-types.js';
6
6
 
@@ -9,9 +9,20 @@ import { Records } from '../utils/records.js';
9
9
  import { validateProtocolTags } from '../utils/protocol-tags.js';
10
10
  import { DwnError, DwnErrorCode } from './dwn-error.js';
11
11
  import { Encryption, ROLE_AUDIENCE_DERIVATION_SCHEME } from '../utils/encryption.js';
12
- import { getRuleSetAtPath, getTypeName, parseCrossProtocolRef } from '../utils/protocols.js';
12
+ import { getRoleAudienceContextId, getRuleSetAtPath, getTypeName, parseCrossProtocolRef } from '../utils/protocols.js';
13
13
  import { ProtocolAction, ProtocolRecordLimitStrategy } from '../types/protocols-types.js';
14
14
 
15
+ type ResolvedRoleAudience = {
16
+ contextId: string;
17
+ protocol: string;
18
+ rolePath: string;
19
+ };
20
+
21
+ type RoleAudienceEntryValidationResult = {
22
+ hasAudience: boolean;
23
+ hasEntry: boolean;
24
+ };
25
+
15
26
  /**
16
27
  * Verifies the `protocolPath` declared in the given message matches the path of actual record chain.
17
28
  * For cross-protocol composition, the parent record may belong to a different protocol (resolved via `$ref` in the composing protocol).
@@ -319,42 +330,73 @@ async function verifyRoleAudienceEncryptionIfNeeded(
319
330
  continue;
320
331
  }
321
332
 
322
- const matchingEntry = inboundMessage.encryption!.keyEncryption.find((entry): entry is RoleAudienceKeyEncryption =>
323
- entry.derivationScheme === ROLE_AUDIENCE_DERIVATION_SCHEME &&
324
- entry.protocol === roleAudience.protocol &&
325
- entry.role === roleAudience.role
333
+ await verifyResolvedRoleAudienceEncryption(tenant, inboundMessage, roleAudience, validationStateReader);
334
+ }
335
+ }
336
+
337
+ async function verifyResolvedRoleAudienceEncryption(
338
+ tenant: string,
339
+ inboundMessage: RecordsWriteMessage,
340
+ roleAudience: ResolvedRoleAudience,
341
+ validationStateReader: ValidationStateReader,
342
+ ): Promise<void> {
343
+ const sourceEntryValidation = await validateSourceRoleAudienceEntry(tenant, roleAudience, inboundMessage, validationStateReader);
344
+ if (sourceEntryValidation.hasAudience) {
345
+ return;
346
+ }
347
+
348
+ if (!sourceEntryValidation.hasEntry) {
349
+ throw new DwnError(
350
+ DwnErrorCode.ProtocolAuthorizationEncryptionRoleAudienceEntryMissing,
351
+ `encrypted record is missing a roleAudience keyEncryption entry for role '${roleAudience.rolePath}'`
326
352
  );
353
+ }
327
354
 
328
- if (matchingEntry === undefined) {
329
- throw new DwnError(
330
- DwnErrorCode.ProtocolAuthorizationEncryptionRoleAudienceEntryMissing,
331
- `encrypted record is missing a roleAudience keyEncryption entry for role '${roleAudience.role}'`
332
- );
333
- }
355
+ throw new DwnError(
356
+ DwnErrorCode.ProtocolAuthorizationEncryptionRoleAudienceMissing,
357
+ `encrypted record references a missing audience for role '${roleAudience.rolePath}'`
358
+ );
359
+ }
334
360
 
335
- const matchingEpochs = await validationStateReader.queryAudienceEpochs({
361
+ async function validateSourceRoleAudienceEntry(
362
+ tenant: string,
363
+ roleAudience: ResolvedRoleAudience,
364
+ inboundMessage: RecordsWriteMessage,
365
+ validationStateReader: ValidationStateReader,
366
+ ): Promise<RoleAudienceEntryValidationResult> {
367
+ const matchingEntries = inboundMessage.encryption!.keyEncryption.filter((entry): entry is SourceRoleAudienceKeyEncryption =>
368
+ entry.derivationScheme === ROLE_AUDIENCE_DERIVATION_SCHEME &&
369
+ entry.protocol === roleAudience.protocol &&
370
+ 'rolePath' in entry &&
371
+ entry.rolePath === roleAudience.rolePath
372
+ );
373
+
374
+ if (matchingEntries.length === 0) {
375
+ return { hasAudience: false, hasEntry: false };
376
+ }
377
+
378
+ for (const matchingEntry of matchingEntries) {
379
+ const matchingAudienceRecords = await validationStateReader.queryAudienceRecords({
336
380
  tenant,
337
381
  protocol : roleAudience.protocol,
338
382
  contextId : roleAudience.contextId,
339
- role : roleAudience.role,
340
- epoch : matchingEntry.epoch,
383
+ rolePath : roleAudience.rolePath,
341
384
  keyId : matchingEntry.keyId,
342
385
  });
343
386
 
344
- if (matchingEpochs.length === 0) {
345
- throw new DwnError(
346
- DwnErrorCode.ProtocolAuthorizationEncryptionRoleAudienceEpochMissing,
347
- `encrypted record references a missing audienceEpoch for role '${roleAudience.role}'`
348
- );
387
+ if (matchingAudienceRecords.length > 0) {
388
+ return { hasAudience: true, hasEntry: true };
349
389
  }
350
390
  }
391
+
392
+ return { hasAudience: false, hasEntry: true };
351
393
  }
352
394
 
353
395
  function resolveRoleAudience(
354
396
  actionRule: ProtocolActionRule,
355
397
  inboundMessage: RecordsWriteMessage,
356
398
  protocolDefinition: ProtocolDefinition,
357
- ): { protocol: string; role: string; contextId: string } | undefined {
399
+ ): ResolvedRoleAudience | undefined {
358
400
  const roleRef = actionRule.role;
359
401
  if (roleRef === undefined) {
360
402
  return undefined;
@@ -364,35 +406,13 @@ function resolveRoleAudience(
364
406
  const protocol = parsed === undefined
365
407
  ? inboundMessage.descriptor.protocol
366
408
  : protocolDefinition.uses?.[parsed.alias];
367
- const role = parsed === undefined ? roleRef : parsed.protocolPath;
409
+ const rolePath = parsed === undefined ? roleRef : parsed.protocolPath;
368
410
  if (protocol === undefined) {
369
411
  return undefined;
370
412
  }
371
413
 
372
- const contextId = getRoleAudienceContextId(inboundMessage, role);
373
- return contextId === undefined ? undefined : { protocol, role, contextId };
374
- }
375
-
376
- function getRoleAudienceContextId(
377
- inboundMessage: RecordsWriteMessage,
378
- rolePath: string,
379
- ): string | undefined {
380
- const parentDepth = rolePath.split('/').length - 1;
381
- if (parentDepth === 0) {
382
- return '';
383
- }
384
-
385
- const contextId = inboundMessage.contextId;
386
- if (typeof contextId !== 'string') {
387
- return undefined;
388
- }
389
-
390
- const contextSegments = contextId.split('/');
391
- if (contextSegments.length < parentDepth) {
392
- return undefined;
393
- }
394
-
395
- return contextSegments.slice(0, parentDepth).join('/');
414
+ const contextId = getRoleAudienceContextId(rolePath, inboundMessage.contextId);
415
+ return contextId === undefined ? undefined : { protocol, rolePath, contextId };
396
416
  }
397
417
 
398
418
  /**
@@ -8,7 +8,9 @@ import type { RecordsWriteMessage } from '../types/records-types.js';
8
8
  import type { ValidationStateReader } from '../types/validation-state-reader.js';
9
9
  import type { ProtocolDefinition, ProtocolRuleSet } from '../types/protocols-types.js';
10
10
 
11
+ import { EncryptionControl } from './encryption-control.js';
11
12
  import { getRuleSetAtPath } from '../utils/protocols.js';
13
+ import { isEncryptionControlPath } from './constants.js';
12
14
  import { DwnError, DwnErrorCode } from './dwn-error.js';
13
15
  import { ProtocolAction, ProtocolActor } from '../types/protocols-types.js';
14
16
 
@@ -35,6 +37,11 @@ export class ProtocolAuthorization {
35
37
  incomingMessage: RecordsWrite,
36
38
  validationStateReader: ValidationStateReader,
37
39
  ): Promise<ProtocolRuleSet> {
40
+ if (isEncryptionControlPath(incomingMessage.message.descriptor.protocolPath)) {
41
+ await EncryptionControl.validateReferentialIntegrity(tenant, incomingMessage, validationStateReader);
42
+ return {};
43
+ }
44
+
38
45
  const protocolDefinitionTimestamp = incomingMessage.message.descriptor.messageTimestamp;
39
46
 
40
47
  // fetch the protocol definition active at the incoming message timestamp
@@ -88,16 +88,15 @@ export class RecordingValidationStateReader implements ValidationStateReader {
88
88
  }
89
89
 
90
90
  /** @inheritdoc */
91
- public async queryAudienceEpochs(input: {
91
+ public async queryAudienceRecords(input: {
92
92
  tenant: string;
93
93
  protocol: string;
94
+ rolePath: string;
94
95
  contextId: string;
95
- role: string;
96
- epoch: number;
97
96
  keyId?: string;
98
97
  }): Promise<RecordsWriteMessage[]> {
99
- this.recordedReads.push({ method: 'queryAudienceEpochs' });
100
- return this.inner.queryAudienceEpochs(input);
98
+ this.recordedReads.push({ method: 'queryAudienceRecords' });
99
+ return this.inner.queryAudienceRecords(input);
101
100
  }
102
101
 
103
102
  /** @inheritdoc */