@enbox/dwn-sdk-js 0.4.6 → 0.4.7

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 (371) 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 +1997 -1517
  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 +28 -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 +7 -10
  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 +32 -274
  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 +116 -472
  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/protocols/protocols-configure.spec.js +152 -0
  199. package/dist/esm/tests/validation/json-schemas/protocols/protocols-configure.spec.js.map +1 -1
  200. package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js +46 -1
  201. package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js.map +1 -1
  202. package/dist/types/generated/precompiled-validators.d.ts +4 -4
  203. package/dist/types/generated/precompiled-validators.d.ts.map +1 -1
  204. package/dist/types/src/core/constants.d.ts +39 -0
  205. package/dist/types/src/core/constants.d.ts.map +1 -1
  206. package/dist/types/src/core/dwn-error.d.ts +28 -11
  207. package/dist/types/src/core/dwn-error.d.ts.map +1 -1
  208. package/dist/types/src/core/encryption-control.d.ts +128 -0
  209. package/dist/types/src/core/encryption-control.d.ts.map +1 -0
  210. package/dist/types/src/core/message.d.ts +4 -0
  211. package/dist/types/src/core/message.d.ts.map +1 -1
  212. package/dist/types/src/core/messages-grant-authorization.d.ts +11 -0
  213. package/dist/types/src/core/messages-grant-authorization.d.ts.map +1 -1
  214. package/dist/types/src/core/protocol-authorization-action.d.ts.map +1 -1
  215. package/dist/types/src/core/protocol-authorization-validation.d.ts.map +1 -1
  216. package/dist/types/src/core/protocol-authorization.d.ts.map +1 -1
  217. package/dist/types/src/core/recording-validation-state-reader.d.ts +2 -3
  218. package/dist/types/src/core/recording-validation-state-reader.d.ts.map +1 -1
  219. package/dist/types/src/core/replication-apply.d.ts +10 -1
  220. package/dist/types/src/core/replication-apply.d.ts.map +1 -1
  221. package/dist/types/src/core/validation-state-reader.d.ts +2 -3
  222. package/dist/types/src/core/validation-state-reader.d.ts.map +1 -1
  223. package/dist/types/src/dwn.d.ts.map +1 -1
  224. package/dist/types/src/event-stream/event-emitter-wake-publisher.d.ts +1 -1
  225. package/dist/types/src/event-stream/event-emitter-wake-publisher.d.ts.map +1 -1
  226. package/dist/types/src/handlers/messages-query.d.ts.map +1 -1
  227. package/dist/types/src/handlers/messages-read.d.ts.map +1 -1
  228. package/dist/types/src/handlers/messages-subscribe.d.ts.map +1 -1
  229. package/dist/types/src/handlers/protocols-configure.d.ts +1 -0
  230. package/dist/types/src/handlers/protocols-configure.d.ts.map +1 -1
  231. package/dist/types/src/handlers/records-count.d.ts +2 -0
  232. package/dist/types/src/handlers/records-count.d.ts.map +1 -1
  233. package/dist/types/src/handlers/records-delete.d.ts.map +1 -1
  234. package/dist/types/src/handlers/records-query.d.ts +3 -0
  235. package/dist/types/src/handlers/records-query.d.ts.map +1 -1
  236. package/dist/types/src/handlers/records-read.d.ts.map +1 -1
  237. package/dist/types/src/handlers/records-subscribe.d.ts +2 -0
  238. package/dist/types/src/handlers/records-subscribe.d.ts.map +1 -1
  239. package/dist/types/src/handlers/records-write.d.ts.map +1 -1
  240. package/dist/types/src/index.d.ts +10 -17
  241. package/dist/types/src/index.d.ts.map +1 -1
  242. package/dist/types/src/interfaces/protocols-configure.d.ts +13 -1
  243. package/dist/types/src/interfaces/protocols-configure.d.ts.map +1 -1
  244. package/dist/types/src/interfaces/records-write.d.ts +5 -1
  245. package/dist/types/src/interfaces/records-write.d.ts.map +1 -1
  246. package/dist/types/src/jose/algorithms/signing/ed25519.d.ts.map +1 -1
  247. package/dist/types/src/protocols/encryption.d.ts +2 -19
  248. package/dist/types/src/protocols/encryption.d.ts.map +1 -1
  249. package/dist/types/src/store/blockstore-level.d.ts +11 -11
  250. package/dist/types/src/store/blockstore-level.d.ts.map +1 -1
  251. package/dist/types/src/store/blockstore-mock.d.ts +12 -12
  252. package/dist/types/src/store/blockstore-mock.d.ts.map +1 -1
  253. package/dist/types/src/store/blockstore-utils.d.ts +23 -0
  254. package/dist/types/src/store/blockstore-utils.d.ts.map +1 -0
  255. package/dist/types/src/store/blockstore.d.ts +3 -0
  256. package/dist/types/src/store/blockstore.d.ts.map +1 -0
  257. package/dist/types/src/store/data-store-level.d.ts.map +1 -1
  258. package/dist/types/src/store/level.d.ts +13 -0
  259. package/dist/types/src/store/level.d.ts.map +1 -0
  260. package/dist/types/src/types/cache.d.ts +2 -2
  261. package/dist/types/src/types/cache.d.ts.map +1 -1
  262. package/dist/types/src/types/encryption-types.d.ts +31 -2
  263. package/dist/types/src/types/encryption-types.d.ts.map +1 -1
  264. package/dist/types/src/types/validation-state-reader.d.ts +3 -5
  265. package/dist/types/src/types/validation-state-reader.d.ts.map +1 -1
  266. package/dist/types/src/utils/data-stream.d.ts +5 -0
  267. package/dist/types/src/utils/data-stream.d.ts.map +1 -1
  268. package/dist/types/src/utils/encryption.d.ts +53 -24
  269. package/dist/types/src/utils/encryption.d.ts.map +1 -1
  270. package/dist/types/src/utils/grant-key-coverage.d.ts +36 -0
  271. package/dist/types/src/utils/grant-key-coverage.d.ts.map +1 -0
  272. package/dist/types/src/utils/hd-key.d.ts.map +1 -1
  273. package/dist/types/src/utils/jws.d.ts.map +1 -1
  274. package/dist/types/src/utils/memory-cache.d.ts +4 -2
  275. package/dist/types/src/utils/memory-cache.d.ts.map +1 -1
  276. package/dist/types/src/utils/protocols.d.ts +11 -0
  277. package/dist/types/src/utils/protocols.d.ts.map +1 -1
  278. package/dist/types/src/utils/record-limit-occupancy.d.ts +7 -0
  279. package/dist/types/src/utils/record-limit-occupancy.d.ts.map +1 -1
  280. package/dist/types/src/utils/records.d.ts +2 -0
  281. package/dist/types/src/utils/records.d.ts.map +1 -1
  282. package/dist/types/src/utils/secp256k1.d.ts.map +1 -1
  283. package/dist/types/src/utils/secp256r1.d.ts.map +1 -1
  284. package/dist/types/src/utils/time.d.ts +21 -13
  285. package/dist/types/src/utils/time.d.ts.map +1 -1
  286. package/dist/types/tests/core/constants.spec.d.ts +2 -0
  287. package/dist/types/tests/core/constants.spec.d.ts.map +1 -0
  288. package/dist/types/tests/core/encryption-control.spec.d.ts +2 -0
  289. package/dist/types/tests/core/encryption-control.spec.d.ts.map +1 -0
  290. package/dist/types/tests/dwn.spec.d.ts.map +1 -1
  291. package/dist/types/tests/event-emitter-wake-publisher.spec.d.ts +2 -0
  292. package/dist/types/tests/event-emitter-wake-publisher.spec.d.ts.map +1 -0
  293. package/dist/types/tests/handlers/messages-query.spec.d.ts.map +1 -1
  294. package/dist/types/tests/handlers/messages-read.spec.d.ts.map +1 -1
  295. package/dist/types/tests/handlers/messages-subscribe.spec.d.ts.map +1 -1
  296. package/dist/types/tests/handlers/protocols-configure.spec.d.ts.map +1 -1
  297. package/dist/types/tests/handlers/records-count.spec.d.ts.map +1 -1
  298. package/dist/types/tests/handlers/records-delete.spec.d.ts.map +1 -1
  299. package/dist/types/tests/handlers/records-query.spec.d.ts.map +1 -1
  300. package/dist/types/tests/handlers/records-read.spec.d.ts.map +1 -1
  301. package/dist/types/tests/handlers/records-subscribe.spec.d.ts.map +1 -1
  302. package/dist/types/tests/handlers/records-write.spec.d.ts.map +1 -1
  303. package/dist/types/tests/scenarios/end-to-end-tests.spec.d.ts.map +1 -1
  304. package/dist/types/tests/store/blockstore-utils.spec.d.ts +2 -0
  305. package/dist/types/tests/store/blockstore-utils.spec.d.ts.map +1 -0
  306. package/dist/types/tests/test-stores.d.ts.map +1 -1
  307. package/dist/types/tests/utils/encryption-control-test-utils.d.ts +46 -0
  308. package/dist/types/tests/utils/encryption-control-test-utils.d.ts.map +1 -0
  309. package/dist/types/tests/utils/grant-key-coverage.spec.d.ts +2 -0
  310. package/dist/types/tests/utils/grant-key-coverage.spec.d.ts.map +1 -0
  311. package/dist/types/tests/utils/test-data-generator.d.ts.map +1 -1
  312. package/dist/types/tests/validation/json-schemas/encryption/audience.spec.d.ts +2 -0
  313. package/dist/types/tests/validation/json-schemas/encryption/audience.spec.d.ts.map +1 -0
  314. package/dist/types/tests/validation/json-schemas/encryption/delivery.spec.d.ts +2 -0
  315. package/dist/types/tests/validation/json-schemas/encryption/delivery.spec.d.ts.map +1 -0
  316. package/package.json +47 -28
  317. package/src/core/constants.ts +61 -0
  318. package/src/core/dwn-error.ts +28 -11
  319. package/src/core/encryption-control.ts +1249 -0
  320. package/src/core/message.ts +7 -0
  321. package/src/core/messages-grant-authorization.ts +60 -9
  322. package/src/core/protocol-authorization-action.ts +3 -13
  323. package/src/core/protocol-authorization-validation.ts +66 -46
  324. package/src/core/protocol-authorization.ts +7 -0
  325. package/src/core/recording-validation-state-reader.ts +4 -5
  326. package/src/core/replication-apply.ts +77 -133
  327. package/src/core/validation-state-reader.ts +6 -8
  328. package/src/dwn.ts +1 -2
  329. package/src/event-stream/event-emitter-wake-publisher.ts +10 -14
  330. package/src/handlers/messages-query.ts +6 -22
  331. package/src/handlers/messages-read.ts +4 -3
  332. package/src/handlers/messages-subscribe.ts +34 -30
  333. package/src/handlers/protocols-configure.ts +7 -4
  334. package/src/handlers/records-count.ts +111 -10
  335. package/src/handlers/records-delete.ts +15 -0
  336. package/src/handlers/records-query.ts +176 -20
  337. package/src/handlers/records-read.ts +19 -6
  338. package/src/handlers/records-subscribe.ts +158 -8
  339. package/src/handlers/records-write.ts +19 -0
  340. package/src/index.ts +48 -21
  341. package/src/interfaces/protocols-configure.ts +102 -11
  342. package/src/interfaces/records-write.ts +49 -43
  343. package/src/jose/algorithms/signing/ed25519.ts +7 -6
  344. package/src/jose/jws/general/verifier.ts +3 -3
  345. package/src/protocols/encryption.ts +50 -420
  346. package/src/store/blockstore-level.ts +33 -37
  347. package/src/store/blockstore-mock.ts +24 -38
  348. package/src/store/blockstore-utils.ts +85 -0
  349. package/src/store/blockstore.ts +8 -0
  350. package/src/store/data-store-level.ts +5 -12
  351. package/src/store/level.ts +19 -0
  352. package/src/types/cache.ts +3 -3
  353. package/src/types/encryption-types.ts +39 -2
  354. package/src/types/validation-state-reader.ts +3 -5
  355. package/src/utils/data-stream.ts +29 -1
  356. package/src/utils/encryption.ts +190 -60
  357. package/src/utils/grant-key-coverage.ts +303 -0
  358. package/src/utils/hd-key.ts +1 -2
  359. package/src/utils/jws.ts +8 -2
  360. package/src/utils/memory-cache.ts +42 -11
  361. package/src/utils/protocols.ts +32 -0
  362. package/src/utils/record-limit-occupancy.ts +34 -5
  363. package/src/utils/records.ts +36 -2
  364. package/src/utils/secp256k1.ts +12 -12
  365. package/src/utils/secp256r1.ts +12 -22
  366. package/src/utils/time.ts +145 -27
  367. package/dist/esm/tests/validation/json-schemas/encryption/audience-key.spec.js +0 -40
  368. package/dist/esm/tests/validation/json-schemas/encryption/audience-key.spec.js.map +0 -1
  369. package/dist/types/tests/validation/json-schemas/encryption/audience-key.spec.d.ts +0 -2
  370. package/dist/types/tests/validation/json-schemas/encryption/audience-key.spec.d.ts.map +0 -1
  371. package/src/types/mitt.d.ts +0 -28
@@ -10,19 +10,25 @@ import { DateSort } from '../../src/types/records-types.js';
10
10
  import { DwnConstant } from '../../src/core/dwn-constant.js';
11
11
  import { DwnErrorCode } from '../../src/core/dwn-error.js';
12
12
  import { Encoder } from '../../src/utils/encoder.js';
13
+ import { Encryption } from '../../src/utils/encryption.js';
14
+ import { EncryptionControlDeliveryRecipientAuthority } from '../../src/types/encryption-types.js';
13
15
  import { Jws } from '../../src/utils/jws.js';
14
16
  import { Message } from '../../src/core/message.js';
15
17
  import { PermissionsProtocol } from '../../src/protocols/permissions.js';
16
18
  import { RecordsQuery } from '../../src/interfaces/records-query.js';
17
19
  import { RecordsQueryHandler } from '../../src/handlers/records-query.js';
20
+ import { RecordsRead } from '../../src/interfaces/records-read.js';
18
21
  import { RecordsWriteHandler } from '../../src/handlers/records-write.js';
19
22
  import { TestEventLog } from '../test-event-stream.js';
20
23
  import { TestStores } from '../test-stores.js';
21
24
  import { TestStubGenerator } from '../utils/test-stub-generator.js';
22
- import { CoreProtocolRegistry, DataStoreLevel, Dwn, MessageStoreLevel, ProtocolsConfigure, RecordsWrite, Time } from '../../src/index.js';
25
+ import { CoreProtocolRegistry, Dwn, ProtocolsConfigure, RecordsWrite, Time } from '../../src/index.js';
26
+ import { createAudienceControlWrite, createDeliveryControlWrite, installEncryptedProtocol, processControlWrite } from '../utils/encryption-control-test-utils.js';
27
+ import { DataStoreLevel, MessageStoreLevel } from '../../src/store/level.js';
23
28
  import { defaultTestProtocolDefinition, TestDataGenerator } from '../utils/test-data-generator.js';
24
29
  import { DidKey, UniversalResolver } from '@enbox/dids';
25
30
  import { DwnInterfaceName, DwnMethodName } from '../../src/enums/dwn-interface-method.js';
31
+ import { ENCRYPTION_CONTROL_AUDIENCE_PATH, ENCRYPTION_CONTROL_DELIVERY_PATH } from '../../src/core/constants.js';
26
32
  import { createTestValidationStateReader } from '../utils/test-validation-state-reader.js';
27
33
  export function testRecordsQueryHandler() {
28
34
  describe('RecordsQueryHandler.handle()', () => {
@@ -57,6 +63,64 @@ export function testRecordsQueryHandler() {
57
63
  afterAll(async () => {
58
64
  await dwn.close();
59
65
  });
66
+ async function installAudienceProjectionProtocol(author, protocol) {
67
+ const protocolDefinition = {
68
+ protocol,
69
+ published: false,
70
+ types: {
71
+ member: { schema: 'http://member-schema', dataFormats: ['application/json'] },
72
+ },
73
+ structure: {
74
+ member: {
75
+ $role: true,
76
+ $actions: [{ who: 'anyone', can: ['create'] }],
77
+ },
78
+ },
79
+ };
80
+ const encryptedDefinition = await installEncryptedProtocol(dwn, author, protocolDefinition);
81
+ return {
82
+ protocolDefinition,
83
+ encryptedDefinition,
84
+ roleRuleSet: encryptedDefinition.structure.member,
85
+ };
86
+ }
87
+ async function createAudienceControlWriteWithFreshKey(input) {
88
+ const audienceKeyPersona = await TestDataGenerator.generateDidKeyPersona();
89
+ const publicKeyJwk = audienceKeyPersona.encryptionKeyPair.publicJwk;
90
+ const keyId = await Encryption.getKeyId(publicKeyJwk);
91
+ return createAudienceControlWrite({
92
+ author: input.author,
93
+ dateCreated: input.dateCreated,
94
+ delegatedGrant: input.delegatedGrant,
95
+ payloadOverrides: { keyId, publicKeyJwk },
96
+ protocol: input.protocol,
97
+ rolePath: 'member',
98
+ roleRuleSet: input.roleRuleSet,
99
+ signer: input.signer,
100
+ tags: { keyId },
101
+ });
102
+ }
103
+ async function queryAudienceRecordIds(input) {
104
+ const tags = {
105
+ protocol: input.protocol,
106
+ rolePath: 'member',
107
+ contextId: '',
108
+ };
109
+ if (input.keyId !== undefined) {
110
+ tags.keyId = input.keyId;
111
+ }
112
+ const query = await RecordsQuery.create({
113
+ filter: {
114
+ protocol: input.protocol,
115
+ protocolPath: ENCRYPTION_CONTROL_AUDIENCE_PATH,
116
+ tags,
117
+ },
118
+ signer: Jws.createSigner(input.requester),
119
+ });
120
+ const reply = await dwn.processMessage(input.tenant, query.message);
121
+ expect(reply.status.code).toBe(200);
122
+ return reply.entries?.map(entry => entry.recordId) ?? [];
123
+ }
60
124
  it('should reject when published is set to false with a dateSort set to sorting by `PublishedAscending` or `PublishedDescending`', async () => {
61
125
  const alice = await TestDataGenerator.generatePersona();
62
126
  TestStubGenerator.stubDidResolver(didResolver, [alice]);
@@ -129,6 +193,503 @@ export function testRecordsQueryHandler() {
129
193
  expect(reply2.status.code).toBe(200);
130
194
  expect(reply2.entries?.length).toBe(1); // only 1 entry should match the query
131
195
  });
196
+ it('should allow exact-tuple audience control queries without broad enumeration', async () => {
197
+ const alice = await TestDataGenerator.generateDidKeyPersona();
198
+ const bob = await TestDataGenerator.generateDidKeyPersona();
199
+ const protocolDefinition = {
200
+ protocol: 'http://encryption-control-query-audience.xyz',
201
+ published: false,
202
+ types: {
203
+ member: { schema: 'http://member-schema', dataFormats: ['application/json'] },
204
+ },
205
+ structure: {
206
+ member: { $role: true },
207
+ },
208
+ };
209
+ const encryptedDefinition = await installEncryptedProtocol(dwn, alice, protocolDefinition);
210
+ const audience = await createAudienceControlWrite({
211
+ author: alice,
212
+ protocol: protocolDefinition.protocol,
213
+ rolePath: 'member',
214
+ roleRuleSet: encryptedDefinition.structure.member,
215
+ });
216
+ await processControlWrite(dwn, alice.did, audience);
217
+ const exactQuery = await RecordsQuery.create({
218
+ filter: {
219
+ protocol: protocolDefinition.protocol,
220
+ protocolPath: ENCRYPTION_CONTROL_AUDIENCE_PATH,
221
+ tags: {
222
+ protocol: protocolDefinition.protocol,
223
+ rolePath: 'member',
224
+ contextId: '',
225
+ },
226
+ },
227
+ signer: Jws.createSigner(bob),
228
+ });
229
+ const exactReply = await dwn.processMessage(alice.did, exactQuery.message);
230
+ expect(exactReply.status.code).toBe(200);
231
+ expect(exactReply.entries?.map(entry => entry.recordId)).toEqual([audience.recordsWrite.message.recordId]);
232
+ const broadQuery = await RecordsQuery.create({
233
+ filter: { protocol: protocolDefinition.protocol },
234
+ signer: Jws.createSigner(bob),
235
+ });
236
+ const broadReply = await dwn.processMessage(alice.did, broadQuery.message);
237
+ expect(broadReply.status.code).toBe(200);
238
+ expect(broadReply.entries?.map(entry => entry.recordId)).not.toContain(audience.recordsWrite.message.recordId);
239
+ });
240
+ it('should allow grant-backed audience control enumeration', async () => {
241
+ const alice = await TestDataGenerator.generateDidKeyPersona();
242
+ const bob = await TestDataGenerator.generateDidKeyPersona();
243
+ const protocolDefinition = {
244
+ protocol: 'http://encryption-control-query-grant-enumeration.xyz',
245
+ published: false,
246
+ types: {
247
+ member: { schema: 'http://member-schema', dataFormats: ['application/json'] },
248
+ },
249
+ structure: {
250
+ member: { $role: true },
251
+ },
252
+ };
253
+ const encryptedDefinition = await installEncryptedProtocol(dwn, alice, protocolDefinition);
254
+ const audience = await createAudienceControlWrite({
255
+ author: alice,
256
+ protocol: protocolDefinition.protocol,
257
+ rolePath: 'member',
258
+ roleRuleSet: encryptedDefinition.structure.member,
259
+ });
260
+ await processControlWrite(dwn, alice.did, audience);
261
+ const grant = await TestDataGenerator.generateGrantCreate({
262
+ author: alice,
263
+ grantedTo: bob,
264
+ scope: {
265
+ interface: DwnInterfaceName.Records,
266
+ method: DwnMethodName.Read,
267
+ protocol: protocolDefinition.protocol,
268
+ },
269
+ });
270
+ expect((await dwn.processMessage(alice.did, grant.message, { dataStream: grant.dataStream })).status.code).toBe(202);
271
+ const query = await RecordsQuery.create({
272
+ filter: { protocol: protocolDefinition.protocol },
273
+ permissionGrantId: grant.message.recordId,
274
+ signer: Jws.createSigner(bob),
275
+ });
276
+ const reply = await dwn.processMessage(alice.did, query.message);
277
+ expect(reply.status.code).toBe(200);
278
+ expect(reply.entries?.map(entry => entry.recordId)).toContain(audience.recordsWrite.message.recordId);
279
+ });
280
+ it('should hide stale audience control records from delegated broad queries', async () => {
281
+ const alice = await TestDataGenerator.generateDidKeyPersona();
282
+ const bob = await TestDataGenerator.generateDidKeyPersona();
283
+ const protocolDefinition = {
284
+ protocol: 'http://encryption-control-query-stale-audience.xyz',
285
+ published: false,
286
+ types: {
287
+ member: { schema: 'http://member-schema', dataFormats: ['application/json'] },
288
+ },
289
+ structure: {
290
+ member: { $role: true },
291
+ },
292
+ };
293
+ const encryptedDefinition = await installEncryptedProtocol(dwn, alice, protocolDefinition);
294
+ const audience = await createAudienceControlWrite({
295
+ author: alice,
296
+ protocol: protocolDefinition.protocol,
297
+ rolePath: 'member',
298
+ roleRuleSet: encryptedDefinition.structure.member,
299
+ });
300
+ await processControlWrite(dwn, alice.did, audience);
301
+ await installEncryptedProtocol(dwn, alice, {
302
+ ...protocolDefinition,
303
+ structure: {
304
+ member: {},
305
+ },
306
+ });
307
+ const grant = await TestDataGenerator.generateGrantCreate({
308
+ author: alice,
309
+ grantedTo: bob,
310
+ delegated: true,
311
+ scope: {
312
+ interface: DwnInterfaceName.Records,
313
+ method: DwnMethodName.Read,
314
+ protocol: protocolDefinition.protocol,
315
+ },
316
+ });
317
+ expect((await dwn.processMessage(alice.did, grant.message, { dataStream: grant.dataStream })).status.code).toBe(202);
318
+ const query = await RecordsQuery.create({
319
+ delegatedGrant: grant.dataEncodedMessage,
320
+ filter: { protocol: protocolDefinition.protocol },
321
+ signer: Jws.createSigner(bob),
322
+ });
323
+ const reply = await dwn.processMessage(alice.did, query.message);
324
+ expect(reply.status.code).toBe(200);
325
+ expect(reply.entries?.map(entry => entry.recordId)).not.toContain(audience.recordsWrite.message.recordId);
326
+ });
327
+ it('should project current audience records deterministically across ingestion order', async () => {
328
+ const alice = await TestDataGenerator.generateDidKeyPersona();
329
+ const bob = await TestDataGenerator.generateDidKeyPersona();
330
+ const carol = await TestDataGenerator.generateDidKeyPersona();
331
+ const { protocolDefinition, roleRuleSet } = await installAudienceProjectionProtocol(alice, 'http://encryption-control-query-current-deterministic.xyz');
332
+ const dateCreated = Time.createOffsetTimestamp({ seconds: 1 });
333
+ const firstAudience = await createAudienceControlWriteWithFreshKey({
334
+ author: bob,
335
+ dateCreated,
336
+ protocol: protocolDefinition.protocol,
337
+ roleRuleSet,
338
+ });
339
+ const secondAudience = await createAudienceControlWriteWithFreshKey({
340
+ author: carol,
341
+ dateCreated,
342
+ protocol: protocolDefinition.protocol,
343
+ roleRuleSet,
344
+ });
345
+ const expectedRecordId = [firstAudience.recordsWrite.message.recordId, secondAudience.recordsWrite.message.recordId].sort()[0];
346
+ await processControlWrite(dwn, alice.did, firstAudience);
347
+ await processControlWrite(dwn, alice.did, secondAudience);
348
+ const firstOrderRecordIds = await queryAudienceRecordIds({
349
+ tenant: alice.did,
350
+ requester: alice,
351
+ protocol: protocolDefinition.protocol,
352
+ });
353
+ await messageStore.clear();
354
+ await dataStore.clear();
355
+ await resumableTaskStore.clear();
356
+ await installEncryptedProtocol(dwn, alice, {
357
+ ...protocolDefinition,
358
+ structure: {
359
+ member: {
360
+ $role: true,
361
+ $actions: [{ who: 'anyone', can: ['create'] }],
362
+ },
363
+ },
364
+ });
365
+ await processControlWrite(dwn, alice.did, secondAudience);
366
+ await processControlWrite(dwn, alice.did, firstAudience);
367
+ const secondOrderRecordIds = await queryAudienceRecordIds({
368
+ tenant: alice.did,
369
+ requester: alice,
370
+ protocol: protocolDefinition.protocol,
371
+ });
372
+ expect(firstOrderRecordIds).toEqual([expectedRecordId]);
373
+ expect(secondOrderRecordIds).toEqual([expectedRecordId]);
374
+ });
375
+ it('should prefer tenant-signed audience records and treat author-delegated mints as non-tenant', async () => {
376
+ const alice = await TestDataGenerator.generateDidKeyPersona();
377
+ const bob = await TestDataGenerator.generateDidKeyPersona();
378
+ const carol = await TestDataGenerator.generateDidKeyPersona();
379
+ const { protocolDefinition, roleRuleSet } = await installAudienceProjectionProtocol(alice, 'http://encryption-control-query-current-tenant-precedence.xyz');
380
+ const nonTenantAudience = await createAudienceControlWriteWithFreshKey({
381
+ author: bob,
382
+ dateCreated: Time.createOffsetTimestamp({ seconds: 1 }),
383
+ protocol: protocolDefinition.protocol,
384
+ roleRuleSet,
385
+ });
386
+ await processControlWrite(dwn, alice.did, nonTenantAudience);
387
+ const grant = await TestDataGenerator.generateGrantCreate({
388
+ author: alice,
389
+ grantedTo: carol,
390
+ delegated: true,
391
+ scope: {
392
+ interface: DwnInterfaceName.Records,
393
+ method: DwnMethodName.Write,
394
+ protocol: protocolDefinition.protocol,
395
+ protocolPath: 'member',
396
+ },
397
+ });
398
+ expect((await dwn.processMessage(alice.did, grant.message, { dataStream: grant.dataStream })).status.code).toBe(202);
399
+ const delegatedAudience = await createAudienceControlWriteWithFreshKey({
400
+ author: alice,
401
+ dateCreated: Time.createOffsetTimestamp({ seconds: 2 }),
402
+ delegatedGrant: grant.dataEncodedMessage,
403
+ protocol: protocolDefinition.protocol,
404
+ roleRuleSet,
405
+ signer: carol,
406
+ });
407
+ await processControlWrite(dwn, alice.did, delegatedAudience);
408
+ expect(await queryAudienceRecordIds({
409
+ tenant: alice.did,
410
+ requester: alice,
411
+ protocol: protocolDefinition.protocol,
412
+ })).toEqual([nonTenantAudience.recordsWrite.message.recordId]);
413
+ const tenantAudience = await createAudienceControlWriteWithFreshKey({
414
+ author: alice,
415
+ dateCreated: Time.createOffsetTimestamp({ seconds: 3 }),
416
+ protocol: protocolDefinition.protocol,
417
+ roleRuleSet,
418
+ });
419
+ await processControlWrite(dwn, alice.did, tenantAudience);
420
+ expect(await queryAudienceRecordIds({
421
+ tenant: alice.did,
422
+ requester: alice,
423
+ protocol: protocolDefinition.protocol,
424
+ })).toEqual([tenantAudience.recordsWrite.message.recordId]);
425
+ const pagedQuery = await RecordsQuery.create({
426
+ filter: {
427
+ protocol: protocolDefinition.protocol,
428
+ protocolPath: ENCRYPTION_CONTROL_AUDIENCE_PATH,
429
+ tags: {
430
+ protocol: protocolDefinition.protocol,
431
+ rolePath: 'member',
432
+ contextId: '',
433
+ },
434
+ },
435
+ pagination: { limit: 1 },
436
+ signer: Jws.createSigner(alice),
437
+ });
438
+ const pagedReply = await dwn.processMessage(alice.did, pagedQuery.message);
439
+ expect(pagedReply.status.code).toBe(200);
440
+ expect(pagedReply.entries?.map(entry => entry.recordId)).toEqual([tenantAudience.recordsWrite.message.recordId]);
441
+ });
442
+ it('should use oldest dateCreated for non-tenant audience projection and make later floods inert', async () => {
443
+ const alice = await TestDataGenerator.generateDidKeyPersona();
444
+ const { protocolDefinition, roleRuleSet } = await installAudienceProjectionProtocol(alice, 'http://encryption-control-query-current-date-order.xyz');
445
+ const oldestAuthor = await TestDataGenerator.generateDidKeyPersona();
446
+ const oldestAudience = await createAudienceControlWriteWithFreshKey({
447
+ author: oldestAuthor,
448
+ dateCreated: Time.createOffsetTimestamp({ seconds: 1 }),
449
+ protocol: protocolDefinition.protocol,
450
+ roleRuleSet,
451
+ });
452
+ await processControlWrite(dwn, alice.did, oldestAudience);
453
+ for (let i = 0; i < 8; i++) {
454
+ const floodAuthor = await TestDataGenerator.generateDidKeyPersona();
455
+ const floodAudience = await createAudienceControlWriteWithFreshKey({
456
+ author: floodAuthor,
457
+ dateCreated: Time.createOffsetTimestamp({ seconds: i + 2 }),
458
+ protocol: protocolDefinition.protocol,
459
+ roleRuleSet,
460
+ });
461
+ await processControlWrite(dwn, alice.did, floodAudience);
462
+ }
463
+ expect(await queryAudienceRecordIds({
464
+ tenant: alice.did,
465
+ requester: alice,
466
+ protocol: protocolDefinition.protocol,
467
+ })).toEqual([oldestAudience.recordsWrite.message.recordId]);
468
+ });
469
+ it('should bypass current-key projection for exact keyId queries and RecordsRead by recordId', async () => {
470
+ const alice = await TestDataGenerator.generateDidKeyPersona();
471
+ const bob = await TestDataGenerator.generateDidKeyPersona();
472
+ const { protocolDefinition, roleRuleSet } = await installAudienceProjectionProtocol(alice, 'http://encryption-control-query-current-exact-bypass.xyz');
473
+ const loserAudience = await createAudienceControlWriteWithFreshKey({
474
+ author: bob,
475
+ dateCreated: Time.createOffsetTimestamp({ seconds: 1 }),
476
+ protocol: protocolDefinition.protocol,
477
+ roleRuleSet,
478
+ });
479
+ await processControlWrite(dwn, alice.did, loserAudience);
480
+ const tenantAudience = await createAudienceControlWriteWithFreshKey({
481
+ author: alice,
482
+ dateCreated: Time.createOffsetTimestamp({ seconds: 2 }),
483
+ protocol: protocolDefinition.protocol,
484
+ roleRuleSet,
485
+ });
486
+ await processControlWrite(dwn, alice.did, tenantAudience);
487
+ expect(await queryAudienceRecordIds({
488
+ tenant: alice.did,
489
+ requester: alice,
490
+ protocol: protocolDefinition.protocol,
491
+ keyId: loserAudience.keyId,
492
+ })).toEqual([loserAudience.recordsWrite.message.recordId]);
493
+ const recordsRead = await RecordsRead.create({
494
+ filter: { recordId: loserAudience.recordsWrite.message.recordId },
495
+ signer: Jws.createSigner(alice),
496
+ });
497
+ const readReply = await dwn.processMessage(alice.did, recordsRead.message);
498
+ expect(readReply.status.code).toBe(200);
499
+ expect(readReply.entry?.recordsWrite?.recordId).toBe(loserAudience.recordsWrite.message.recordId);
500
+ });
501
+ it('should not inject a current audience record that does not match an enumeration filter', async () => {
502
+ const alice = await TestDataGenerator.generateDidKeyPersona();
503
+ const bob = await TestDataGenerator.generateDidKeyPersona();
504
+ const { protocolDefinition, roleRuleSet } = await installAudienceProjectionProtocol(alice, 'http://encryption-control-query-current-range-filter.xyz');
505
+ const currentDateCreated = Time.createOffsetTimestamp({ seconds: 1 });
506
+ const loserDateCreated = Time.createOffsetTimestamp({ seconds: 2 });
507
+ const currentAudience = await createAudienceControlWriteWithFreshKey({
508
+ author: alice,
509
+ dateCreated: currentDateCreated,
510
+ protocol: protocolDefinition.protocol,
511
+ roleRuleSet,
512
+ });
513
+ await processControlWrite(dwn, alice.did, currentAudience);
514
+ const loserAudience = await createAudienceControlWriteWithFreshKey({
515
+ author: bob,
516
+ dateCreated: loserDateCreated,
517
+ protocol: protocolDefinition.protocol,
518
+ roleRuleSet,
519
+ });
520
+ await processControlWrite(dwn, alice.did, loserAudience);
521
+ const rangeFilter = {
522
+ protocol: protocolDefinition.protocol,
523
+ protocolPath: ENCRYPTION_CONTROL_AUDIENCE_PATH,
524
+ dateCreated: { from: loserDateCreated },
525
+ tags: {
526
+ protocol: protocolDefinition.protocol,
527
+ rolePath: 'member',
528
+ contextId: '',
529
+ },
530
+ };
531
+ const rangeQuery = await RecordsQuery.create({
532
+ filter: rangeFilter,
533
+ signer: Jws.createSigner(alice),
534
+ });
535
+ const rangeReply = await dwn.processMessage(alice.did, rangeQuery.message);
536
+ expect(rangeReply.status.code).toBe(200);
537
+ expect(rangeReply.entries?.map(entry => entry.recordId)).toEqual([]);
538
+ const exactLoserQuery = await RecordsQuery.create({
539
+ filter: {
540
+ ...rangeFilter,
541
+ tags: {
542
+ ...rangeFilter.tags,
543
+ keyId: loserAudience.keyId,
544
+ },
545
+ },
546
+ signer: Jws.createSigner(alice),
547
+ });
548
+ const exactLoserReply = await dwn.processMessage(alice.did, exactLoserQuery.message);
549
+ expect(exactLoserReply.status.code).toBe(200);
550
+ expect(exactLoserReply.entries?.map(entry => entry.recordId)).toEqual([loserAudience.recordsWrite.message.recordId]);
551
+ });
552
+ it('should return delivery control records only to the recipient', async () => {
553
+ const alice = await TestDataGenerator.generateDidKeyPersona();
554
+ const bob = await TestDataGenerator.generateDidKeyPersona();
555
+ const carol = await TestDataGenerator.generateDidKeyPersona();
556
+ const bobDelegate = await TestDataGenerator.generateDidKeyPersona();
557
+ const protocolDefinition = {
558
+ protocol: 'http://encryption-control-query-delivery.xyz',
559
+ published: false,
560
+ types: {
561
+ member: { schema: 'http://member-schema', dataFormats: ['application/json'] },
562
+ message: { schema: 'http://message-schema', dataFormats: ['application/json'] },
563
+ },
564
+ structure: {
565
+ member: { $role: true },
566
+ message: {
567
+ $actions: [{ role: 'member', can: ['read'] }],
568
+ },
569
+ },
570
+ };
571
+ const encryptedDefinition = await installEncryptedProtocol(dwn, alice, protocolDefinition);
572
+ const roleRuleSet = encryptedDefinition.structure.member;
573
+ const audience = await createAudienceControlWrite({
574
+ author: alice,
575
+ protocol: protocolDefinition.protocol,
576
+ rolePath: 'member',
577
+ roleRuleSet,
578
+ });
579
+ await processControlWrite(dwn, alice.did, audience);
580
+ const roleRecord = await TestDataGenerator.generateRecordsWrite({
581
+ author: alice,
582
+ data: Encoder.stringToBytes('bob is a member'),
583
+ dataFormat: 'application/json',
584
+ protocol: protocolDefinition.protocol,
585
+ protocolPath: 'member',
586
+ recipient: bob.did,
587
+ schema: 'http://member-schema',
588
+ });
589
+ expect((await dwn.processMessage(alice.did, roleRecord.message, { dataStream: roleRecord.dataStream })).status.code).toBe(202);
590
+ const delivery = await createDeliveryControlWrite({
591
+ author: alice,
592
+ keyId: audience.keyId,
593
+ protocol: protocolDefinition.protocol,
594
+ recipient: bob.did,
595
+ recipientAuthority: EncryptionControlDeliveryRecipientAuthority.RoleHolder,
596
+ rolePath: 'member',
597
+ roleRuleSet,
598
+ });
599
+ await processControlWrite(dwn, alice.did, delivery);
600
+ const bobQuery = await RecordsQuery.create({
601
+ filter: { protocol: protocolDefinition.protocol, protocolPath: ENCRYPTION_CONTROL_DELIVERY_PATH },
602
+ signer: Jws.createSigner(bob),
603
+ });
604
+ const bobReply = await dwn.processMessage(alice.did, bobQuery.message);
605
+ expect(bobReply.status.code).toBe(200);
606
+ expect(bobReply.entries?.map(entry => entry.recordId)).toContain(delivery.recordsWrite.message.recordId);
607
+ const carolQuery = await RecordsQuery.create({
608
+ filter: { protocol: protocolDefinition.protocol, protocolPath: ENCRYPTION_CONTROL_DELIVERY_PATH },
609
+ signer: Jws.createSigner(carol),
610
+ });
611
+ const carolReply = await dwn.processMessage(alice.did, carolQuery.message);
612
+ expect(carolReply.status.code).toBe(200);
613
+ expect(carolReply.entries?.map(entry => entry.recordId)).not.toContain(delivery.recordsWrite.message.recordId);
614
+ const carolGrant = await TestDataGenerator.generateGrantCreate({
615
+ author: alice,
616
+ grantedTo: carol,
617
+ delegated: true,
618
+ scope: {
619
+ interface: DwnInterfaceName.Records,
620
+ method: DwnMethodName.Read,
621
+ protocol: protocolDefinition.protocol,
622
+ },
623
+ });
624
+ expect((await dwn.processMessage(alice.did, carolGrant.message, { dataStream: carolGrant.dataStream })).status.code).toBe(202);
625
+ const delegatedCarolQuery = await RecordsQuery.create({
626
+ delegatedGrant: carolGrant.dataEncodedMessage,
627
+ filter: { protocol: protocolDefinition.protocol, protocolPath: ENCRYPTION_CONTROL_DELIVERY_PATH },
628
+ signer: Jws.createSigner(carol),
629
+ });
630
+ const delegatedCarolReply = await dwn.processMessage(alice.did, delegatedCarolQuery.message);
631
+ expect(delegatedCarolReply.status.code).toBe(200);
632
+ expect(delegatedCarolReply.entries?.map(entry => entry.recordId)).not.toContain(delivery.recordsWrite.message.recordId);
633
+ const bobDelegateGrant = await TestDataGenerator.generateGrantCreate({
634
+ author: bob,
635
+ grantedTo: bobDelegate,
636
+ delegated: true,
637
+ scope: {
638
+ interface: DwnInterfaceName.Records,
639
+ method: DwnMethodName.Read,
640
+ protocol: protocolDefinition.protocol,
641
+ protocolPath: 'message',
642
+ },
643
+ });
644
+ const delegatedBobQuery = await RecordsQuery.create({
645
+ delegatedGrant: bobDelegateGrant.dataEncodedMessage,
646
+ filter: {
647
+ recipient: bob.did,
648
+ protocol: protocolDefinition.protocol,
649
+ protocolPath: ENCRYPTION_CONTROL_DELIVERY_PATH,
650
+ tags: {
651
+ protocol: protocolDefinition.protocol,
652
+ rolePath: 'member',
653
+ contextId: '',
654
+ keyId: audience.keyId,
655
+ },
656
+ },
657
+ signer: Jws.createSigner(bobDelegate),
658
+ });
659
+ const delegatedBobReply = await dwn.processMessage(alice.did, delegatedBobQuery.message);
660
+ expect(delegatedBobReply.status.code).toBe(200);
661
+ expect(delegatedBobReply.entries?.map(entry => entry.recordId)).toContain(delivery.recordsWrite.message.recordId);
662
+ const carolRoleRecord = await TestDataGenerator.generateRecordsWrite({
663
+ author: alice,
664
+ data: Encoder.stringToBytes('carol is a member'),
665
+ dataFormat: 'application/json',
666
+ protocol: protocolDefinition.protocol,
667
+ protocolPath: 'member',
668
+ recipient: carol.did,
669
+ schema: 'http://member-schema',
670
+ });
671
+ expect((await dwn.processMessage(alice.did, carolRoleRecord.message, { dataStream: carolRoleRecord.dataStream })).status.code).toBe(202);
672
+ const carolDelivery = await createDeliveryControlWrite({
673
+ author: alice,
674
+ keyId: audience.keyId,
675
+ protocol: protocolDefinition.protocol,
676
+ recipient: carol.did,
677
+ recipientAuthority: EncryptionControlDeliveryRecipientAuthority.RoleHolder,
678
+ rolePath: 'member',
679
+ roleRuleSet,
680
+ });
681
+ await processControlWrite(dwn, alice.did, carolDelivery);
682
+ const pagedDelegatedCarolQuery = await RecordsQuery.create({
683
+ dateSort: DateSort.CreatedAscending,
684
+ delegatedGrant: carolGrant.dataEncodedMessage,
685
+ filter: { protocol: protocolDefinition.protocol, protocolPath: ENCRYPTION_CONTROL_DELIVERY_PATH },
686
+ pagination: { limit: 1 },
687
+ signer: Jws.createSigner(carol),
688
+ });
689
+ const pagedDelegatedCarolReply = await dwn.processMessage(alice.did, pagedDelegatedCarolQuery.message);
690
+ expect(pagedDelegatedCarolReply.status.code).toBe(200);
691
+ expect(pagedDelegatedCarolReply.entries?.map(entry => entry.recordId)).toEqual([carolDelivery.recordsWrite.message.recordId]);
692
+ });
132
693
  it('should return `encodedData` if data size is within the spec threshold', async () => {
133
694
  const data = TestDataGenerator.randomBytes(DwnConstant.maxDataSizeAllowedToBeEncoded); // within/on threshold
134
695
  const alice = await TestDataGenerator.generateDidKeyPersona();