@enbox/dwn-sdk-js 0.4.0 → 0.4.2

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 (522) hide show
  1. package/README.md +4 -4
  2. package/dist/browser.mjs +3 -10
  3. package/dist/browser.mjs.map +4 -4
  4. package/dist/esm/generated/precompiled-validators.js +799 -885
  5. package/dist/esm/generated/precompiled-validators.js.map +1 -1
  6. package/dist/esm/src/core/dwn-constant.js +5 -0
  7. package/dist/esm/src/core/dwn-constant.js.map +1 -1
  8. package/dist/esm/src/core/dwn-error.js +12 -4
  9. package/dist/esm/src/core/dwn-error.js.map +1 -1
  10. package/dist/esm/src/core/grant-authorization.js +9 -18
  11. package/dist/esm/src/core/grant-authorization.js.map +1 -1
  12. package/dist/esm/src/core/message-reply.js.map +1 -1
  13. package/dist/esm/src/core/messages-grant-authorization.js +28 -45
  14. package/dist/esm/src/core/messages-grant-authorization.js.map +1 -1
  15. package/dist/esm/src/core/protocol-authorization-action.js +25 -27
  16. package/dist/esm/src/core/protocol-authorization-action.js.map +1 -1
  17. package/dist/esm/src/core/protocol-authorization-validation.js +34 -89
  18. package/dist/esm/src/core/protocol-authorization-validation.js.map +1 -1
  19. package/dist/esm/src/core/protocol-authorization.js +44 -118
  20. package/dist/esm/src/core/protocol-authorization.js.map +1 -1
  21. package/dist/esm/src/core/protocols-grant-authorization.js +5 -5
  22. package/dist/esm/src/core/protocols-grant-authorization.js.map +1 -1
  23. package/dist/esm/src/core/recording-validation-state-reader.js +84 -0
  24. package/dist/esm/src/core/recording-validation-state-reader.js.map +1 -0
  25. package/dist/esm/src/core/records-grant-authorization.js +11 -11
  26. package/dist/esm/src/core/records-grant-authorization.js.map +1 -1
  27. package/dist/esm/src/core/replication-apply.js +123 -28
  28. package/dist/esm/src/core/replication-apply.js.map +1 -1
  29. package/dist/esm/src/core/resumable-task-manager.js +5 -4
  30. package/dist/esm/src/core/resumable-task-manager.js.map +1 -1
  31. package/dist/esm/src/core/validation-state-reader.js +237 -0
  32. package/dist/esm/src/core/validation-state-reader.js.map +1 -0
  33. package/dist/esm/src/dwn.js +165 -132
  34. package/dist/esm/src/dwn.js.map +1 -1
  35. package/dist/esm/src/enums/dwn-interface-method.js +0 -1
  36. package/dist/esm/src/enums/dwn-interface-method.js.map +1 -1
  37. package/dist/esm/src/event-stream/durable-event-log.js +365 -0
  38. package/dist/esm/src/event-stream/durable-event-log.js.map +1 -0
  39. package/dist/esm/src/event-stream/event-emitter-wake-publisher.js +25 -0
  40. package/dist/esm/src/event-stream/event-emitter-wake-publisher.js.map +1 -0
  41. package/dist/esm/src/handlers/messages-query.js +159 -0
  42. package/dist/esm/src/handlers/messages-query.js.map +1 -0
  43. package/dist/esm/src/handlers/messages-read.js +5 -5
  44. package/dist/esm/src/handlers/messages-read.js.map +1 -1
  45. package/dist/esm/src/handlers/messages-subscribe.js +8 -8
  46. package/dist/esm/src/handlers/messages-subscribe.js.map +1 -1
  47. package/dist/esm/src/handlers/protocols-configure.js +30 -49
  48. package/dist/esm/src/handlers/protocols-configure.js.map +1 -1
  49. package/dist/esm/src/handlers/protocols-query.js +1 -1
  50. package/dist/esm/src/handlers/protocols-query.js.map +1 -1
  51. package/dist/esm/src/handlers/records-count.js +20 -11
  52. package/dist/esm/src/handlers/records-count.js.map +1 -1
  53. package/dist/esm/src/handlers/records-delete.js +20 -16
  54. package/dist/esm/src/handlers/records-delete.js.map +1 -1
  55. package/dist/esm/src/handlers/records-query.js +35 -11
  56. package/dist/esm/src/handlers/records-query.js.map +1 -1
  57. package/dist/esm/src/handlers/records-read.js +52 -42
  58. package/dist/esm/src/handlers/records-read.js.map +1 -1
  59. package/dist/esm/src/handlers/records-subscribe.js +107 -11
  60. package/dist/esm/src/handlers/records-subscribe.js.map +1 -1
  61. package/dist/esm/src/handlers/records-write.js +62 -116
  62. package/dist/esm/src/handlers/records-write.js.map +1 -1
  63. package/dist/esm/src/index.js +6 -7
  64. package/dist/esm/src/index.js.map +1 -1
  65. package/dist/esm/src/interfaces/{messages-sync.js → messages-query.js} +21 -15
  66. package/dist/esm/src/interfaces/messages-query.js.map +1 -0
  67. package/dist/esm/src/interfaces/protocols-configure.js +12 -9
  68. package/dist/esm/src/interfaces/protocols-configure.js.map +1 -1
  69. package/dist/esm/src/interfaces/protocols-query.js +3 -4
  70. package/dist/esm/src/interfaces/protocols-query.js.map +1 -1
  71. package/dist/esm/src/interfaces/records-count.js +4 -3
  72. package/dist/esm/src/interfaces/records-count.js.map +1 -1
  73. package/dist/esm/src/interfaces/records-delete.js +21 -4
  74. package/dist/esm/src/interfaces/records-delete.js.map +1 -1
  75. package/dist/esm/src/interfaces/records-query.js +4 -3
  76. package/dist/esm/src/interfaces/records-query.js.map +1 -1
  77. package/dist/esm/src/interfaces/records-read.js +3 -3
  78. package/dist/esm/src/interfaces/records-read.js.map +1 -1
  79. package/dist/esm/src/interfaces/records-subscribe.js +4 -3
  80. package/dist/esm/src/interfaces/records-subscribe.js.map +1 -1
  81. package/dist/esm/src/interfaces/records-write.js +27 -13
  82. package/dist/esm/src/interfaces/records-write.js.map +1 -1
  83. package/dist/esm/src/protocols/permissions.js +27 -34
  84. package/dist/esm/src/protocols/permissions.js.map +1 -1
  85. package/dist/esm/src/store/index-level.js +24 -9
  86. package/dist/esm/src/store/index-level.js.map +1 -1
  87. package/dist/esm/src/store/level-wrapper.js +7 -0
  88. package/dist/esm/src/store/level-wrapper.js.map +1 -1
  89. package/dist/esm/src/store/message-store-level.js +536 -42
  90. package/dist/esm/src/store/message-store-level.js.map +1 -1
  91. package/dist/esm/src/store/storage-controller.js +58 -49
  92. package/dist/esm/src/store/storage-controller.js.map +1 -1
  93. package/dist/esm/src/types/message-types.js.map +1 -1
  94. package/dist/esm/src/types/validation-state-reader.js +2 -0
  95. package/dist/esm/src/types/validation-state-reader.js.map +1 -0
  96. package/dist/esm/src/utils/messages.js +17 -0
  97. package/dist/esm/src/utils/messages.js.map +1 -1
  98. package/dist/esm/src/utils/protocol-tags.js +262 -0
  99. package/dist/esm/src/utils/protocol-tags.js.map +1 -0
  100. package/dist/esm/src/utils/record-limit-occupancy.js +244 -0
  101. package/dist/esm/src/utils/record-limit-occupancy.js.map +1 -0
  102. package/dist/esm/src/utils/records.js +50 -14
  103. package/dist/esm/src/utils/records.js.map +1 -1
  104. package/dist/esm/src/utils/replication.js +85 -0
  105. package/dist/esm/src/utils/replication.js.map +1 -0
  106. package/dist/esm/tests/core/grant-authorization.spec.js +4 -4
  107. package/dist/esm/tests/core/grant-authorization.spec.js.map +1 -1
  108. package/dist/esm/tests/core/process-message-parity.spec.js +222 -0
  109. package/dist/esm/tests/core/process-message-parity.spec.js.map +1 -0
  110. package/dist/esm/tests/core/protocol-authorization.spec.js +5 -2
  111. package/dist/esm/tests/core/protocol-authorization.spec.js.map +1 -1
  112. package/dist/esm/tests/core/records-grant-authorization.spec.js +5 -5
  113. package/dist/esm/tests/core/records-grant-authorization.spec.js.map +1 -1
  114. package/dist/esm/tests/core/replication-apply.spec.js +55 -1
  115. package/dist/esm/tests/core/replication-apply.spec.js.map +1 -1
  116. package/dist/esm/tests/core/replication-replay-property.spec.js +350 -0
  117. package/dist/esm/tests/core/replication-replay-property.spec.js.map +1 -0
  118. package/dist/esm/tests/core/validation-read-closure.spec.js +469 -0
  119. package/dist/esm/tests/core/validation-read-closure.spec.js.map +1 -0
  120. package/dist/esm/tests/core/validation-state-reader.spec.js +716 -0
  121. package/dist/esm/tests/core/validation-state-reader.spec.js.map +1 -0
  122. package/dist/esm/tests/durable-event-log.spec.js +373 -0
  123. package/dist/esm/tests/durable-event-log.spec.js.map +1 -0
  124. package/dist/esm/tests/dwn.spec.js +504 -35
  125. package/dist/esm/tests/dwn.spec.js.map +1 -1
  126. package/dist/esm/tests/features/author-delegated-grant.spec.js +9 -6
  127. package/dist/esm/tests/features/author-delegated-grant.spec.js.map +1 -1
  128. package/dist/esm/tests/features/owner-delegated-grant.spec.js +1 -4
  129. package/dist/esm/tests/features/owner-delegated-grant.spec.js.map +1 -1
  130. package/dist/esm/tests/features/owner-signature.spec.js +1 -4
  131. package/dist/esm/tests/features/owner-signature.spec.js.map +1 -1
  132. package/dist/esm/tests/features/permissions.spec.js +165 -4
  133. package/dist/esm/tests/features/permissions.spec.js.map +1 -1
  134. package/dist/esm/tests/features/protocol-composition.spec.js +8 -11
  135. package/dist/esm/tests/features/protocol-composition.spec.js.map +1 -1
  136. package/dist/esm/tests/features/protocol-create-action.spec.js +1 -4
  137. package/dist/esm/tests/features/protocol-create-action.spec.js.map +1 -1
  138. package/dist/esm/tests/features/protocol-delete-action.spec.js +3 -5
  139. package/dist/esm/tests/features/protocol-delete-action.spec.js.map +1 -1
  140. package/dist/esm/tests/features/protocol-update-action.spec.js +3 -6
  141. package/dist/esm/tests/features/protocol-update-action.spec.js.map +1 -1
  142. package/dist/esm/tests/features/records-delivery.spec.js +1 -4
  143. package/dist/esm/tests/features/records-delivery.spec.js.map +1 -1
  144. package/dist/esm/tests/features/records-immutable.spec.js +1 -4
  145. package/dist/esm/tests/features/records-immutable.spec.js.map +1 -1
  146. package/dist/esm/tests/features/records-nested-query-scope.spec.js +281 -0
  147. package/dist/esm/tests/features/records-nested-query-scope.spec.js.map +1 -0
  148. package/dist/esm/tests/features/records-prune-cross-protocol.spec.js +3 -7
  149. package/dist/esm/tests/features/records-prune-cross-protocol.spec.js.map +1 -1
  150. package/dist/esm/tests/features/records-prune.spec.js +11 -22
  151. package/dist/esm/tests/features/records-prune.spec.js.map +1 -1
  152. package/dist/esm/tests/features/records-record-limit.spec.js +441 -231
  153. package/dist/esm/tests/features/records-record-limit.spec.js.map +1 -1
  154. package/dist/esm/tests/features/records-squash.spec.js +6 -4
  155. package/dist/esm/tests/features/records-squash.spec.js.map +1 -1
  156. package/dist/esm/tests/features/records-tags.spec.js +1 -4
  157. package/dist/esm/tests/features/records-tags.spec.js.map +1 -1
  158. package/dist/esm/tests/features/resumable-tasks.spec.js +3 -5
  159. package/dist/esm/tests/features/resumable-tasks.spec.js.map +1 -1
  160. package/dist/esm/tests/fuzz/message-store.fuzz.spec.js +1 -2
  161. package/dist/esm/tests/fuzz/message-store.fuzz.spec.js.map +1 -1
  162. package/dist/esm/tests/fuzz/process-message.fuzz.spec.js +2 -4
  163. package/dist/esm/tests/fuzz/process-message.fuzz.spec.js.map +1 -1
  164. package/dist/esm/tests/fuzz/schema-validation.fuzz.spec.js +1 -1
  165. package/dist/esm/tests/fuzz/schema-validation.fuzz.spec.js.map +1 -1
  166. package/dist/esm/tests/handlers/messages-query.spec.js +246 -0
  167. package/dist/esm/tests/handlers/messages-query.spec.js.map +1 -0
  168. package/dist/esm/tests/handlers/messages-read.spec.js +2 -5
  169. package/dist/esm/tests/handlers/messages-read.spec.js.map +1 -1
  170. package/dist/esm/tests/handlers/messages-subscribe.spec.js +3 -14
  171. package/dist/esm/tests/handlers/messages-subscribe.spec.js.map +1 -1
  172. package/dist/esm/tests/handlers/protocols-configure.spec.js +27 -26
  173. package/dist/esm/tests/handlers/protocols-configure.spec.js.map +1 -1
  174. package/dist/esm/tests/handlers/protocols-query.spec.js +1 -4
  175. package/dist/esm/tests/handlers/protocols-query.spec.js.map +1 -1
  176. package/dist/esm/tests/handlers/records-count.spec.js +1 -4
  177. package/dist/esm/tests/handlers/records-count.spec.js.map +1 -1
  178. package/dist/esm/tests/handlers/records-delete.spec.js +312 -30
  179. package/dist/esm/tests/handlers/records-delete.spec.js.map +1 -1
  180. package/dist/esm/tests/handlers/records-query.spec.js +32 -9
  181. package/dist/esm/tests/handlers/records-query.spec.js.map +1 -1
  182. package/dist/esm/tests/handlers/records-read.spec.js +4 -4
  183. package/dist/esm/tests/handlers/records-read.spec.js.map +1 -1
  184. package/dist/esm/tests/handlers/records-subscribe.spec.js +33 -14
  185. package/dist/esm/tests/handlers/records-subscribe.spec.js.map +1 -1
  186. package/dist/esm/tests/handlers/records-write.spec.js +82 -36
  187. package/dist/esm/tests/handlers/records-write.spec.js.map +1 -1
  188. package/dist/esm/tests/interfaces/records-delete.spec.js +69 -2
  189. package/dist/esm/tests/interfaces/records-delete.spec.js.map +1 -1
  190. package/dist/esm/tests/interfaces/records-write.spec.js +4 -3
  191. package/dist/esm/tests/interfaces/records-write.spec.js.map +1 -1
  192. package/dist/esm/tests/protocols/permissions.spec.js +55 -6
  193. package/dist/esm/tests/protocols/permissions.spec.js.map +1 -1
  194. package/dist/esm/tests/scenarios/aggregator.spec.js +1 -4
  195. package/dist/esm/tests/scenarios/aggregator.spec.js.map +1 -1
  196. package/dist/esm/tests/scenarios/deleted-record.spec.js +1 -4
  197. package/dist/esm/tests/scenarios/deleted-record.spec.js.map +1 -1
  198. package/dist/esm/tests/scenarios/end-to-end-tests.spec.js +1 -4
  199. package/dist/esm/tests/scenarios/end-to-end-tests.spec.js.map +1 -1
  200. package/dist/esm/tests/scenarios/nested-roles.spec.js +1 -4
  201. package/dist/esm/tests/scenarios/nested-roles.spec.js.map +1 -1
  202. package/dist/esm/tests/scenarios/subscriptions.spec.js +1 -4
  203. package/dist/esm/tests/scenarios/subscriptions.spec.js.map +1 -1
  204. package/dist/esm/tests/store/message-store-level.spec.js +361 -5
  205. package/dist/esm/tests/store/message-store-level.spec.js.map +1 -1
  206. package/dist/esm/tests/store/message-store.spec.js +60 -0
  207. package/dist/esm/tests/store/message-store.spec.js.map +1 -1
  208. package/dist/esm/tests/test-event-stream.js +7 -3
  209. package/dist/esm/tests/test-event-stream.js.map +1 -1
  210. package/dist/esm/tests/test-stores.js +19 -9
  211. package/dist/esm/tests/test-stores.js.map +1 -1
  212. package/dist/esm/tests/test-suite.js +4 -2
  213. package/dist/esm/tests/test-suite.js.map +1 -1
  214. package/dist/esm/tests/utils/protocol-tags.spec.js +96 -0
  215. package/dist/esm/tests/utils/protocol-tags.spec.js.map +1 -0
  216. package/dist/esm/tests/utils/test-data-generator.js +25 -0
  217. package/dist/esm/tests/utils/test-data-generator.js.map +1 -1
  218. package/dist/esm/tests/utils/test-stub-generator.js.map +1 -1
  219. package/dist/esm/tests/utils/test-validation-state-reader.js +16 -0
  220. package/dist/esm/tests/utils/test-validation-state-reader.js.map +1 -0
  221. package/dist/types/generated/precompiled-validators.d.ts +6 -6
  222. package/dist/types/generated/precompiled-validators.d.ts.map +1 -1
  223. package/dist/types/src/core/core-protocol.d.ts +3 -3
  224. package/dist/types/src/core/core-protocol.d.ts.map +1 -1
  225. package/dist/types/src/core/dwn-constant.d.ts +5 -0
  226. package/dist/types/src/core/dwn-constant.d.ts.map +1 -1
  227. package/dist/types/src/core/dwn-error.d.ts +12 -4
  228. package/dist/types/src/core/dwn-error.d.ts.map +1 -1
  229. package/dist/types/src/core/grant-authorization.d.ts +5 -5
  230. package/dist/types/src/core/grant-authorization.d.ts.map +1 -1
  231. package/dist/types/src/core/message-reply.d.ts +5 -4
  232. package/dist/types/src/core/message-reply.d.ts.map +1 -1
  233. package/dist/types/src/core/messages-grant-authorization.d.ts +12 -14
  234. package/dist/types/src/core/messages-grant-authorization.d.ts.map +1 -1
  235. package/dist/types/src/core/protocol-authorization-action.d.ts +4 -5
  236. package/dist/types/src/core/protocol-authorization-action.d.ts.map +1 -1
  237. package/dist/types/src/core/protocol-authorization-validation.d.ts +14 -17
  238. package/dist/types/src/core/protocol-authorization-validation.d.ts.map +1 -1
  239. package/dist/types/src/core/protocol-authorization.d.ts +8 -33
  240. package/dist/types/src/core/protocol-authorization.d.ts.map +1 -1
  241. package/dist/types/src/core/protocols-grant-authorization.d.ts +4 -4
  242. package/dist/types/src/core/protocols-grant-authorization.d.ts.map +1 -1
  243. package/dist/types/src/core/recording-validation-state-reader.d.ts +75 -0
  244. package/dist/types/src/core/recording-validation-state-reader.d.ts.map +1 -0
  245. package/dist/types/src/core/records-grant-authorization.d.ts +8 -8
  246. package/dist/types/src/core/records-grant-authorization.d.ts.map +1 -1
  247. package/dist/types/src/core/replication-apply.d.ts +36 -0
  248. package/dist/types/src/core/replication-apply.d.ts.map +1 -1
  249. package/dist/types/src/core/resumable-task-manager.d.ts +1 -1
  250. package/dist/types/src/core/resumable-task-manager.d.ts.map +1 -1
  251. package/dist/types/src/core/validation-state-reader.d.ts +79 -0
  252. package/dist/types/src/core/validation-state-reader.d.ts.map +1 -0
  253. package/dist/types/src/dwn.d.ts +33 -20
  254. package/dist/types/src/dwn.d.ts.map +1 -1
  255. package/dist/types/src/enums/dwn-interface-method.d.ts +0 -1
  256. package/dist/types/src/enums/dwn-interface-method.d.ts.map +1 -1
  257. package/dist/types/src/event-stream/durable-event-log.d.ts +69 -0
  258. package/dist/types/src/event-stream/durable-event-log.d.ts.map +1 -0
  259. package/dist/types/src/event-stream/event-emitter-wake-publisher.d.ts +13 -0
  260. package/dist/types/src/event-stream/event-emitter-wake-publisher.d.ts.map +1 -0
  261. package/dist/types/src/handlers/messages-query.d.ts +20 -0
  262. package/dist/types/src/handlers/messages-query.d.ts.map +1 -0
  263. package/dist/types/src/handlers/messages-read.d.ts +1 -1
  264. package/dist/types/src/handlers/messages-read.d.ts.map +1 -1
  265. package/dist/types/src/handlers/messages-subscribe.d.ts.map +1 -1
  266. package/dist/types/src/handlers/protocols-configure.d.ts +0 -5
  267. package/dist/types/src/handlers/protocols-configure.d.ts.map +1 -1
  268. package/dist/types/src/handlers/records-count.d.ts +2 -1
  269. package/dist/types/src/handlers/records-count.d.ts.map +1 -1
  270. package/dist/types/src/handlers/records-delete.d.ts +2 -2
  271. package/dist/types/src/handlers/records-delete.d.ts.map +1 -1
  272. package/dist/types/src/handlers/records-query.d.ts +1 -1
  273. package/dist/types/src/handlers/records-query.d.ts.map +1 -1
  274. package/dist/types/src/handlers/records-read.d.ts +2 -1
  275. package/dist/types/src/handlers/records-read.d.ts.map +1 -1
  276. package/dist/types/src/handlers/records-subscribe.d.ts +4 -5
  277. package/dist/types/src/handlers/records-subscribe.d.ts.map +1 -1
  278. package/dist/types/src/handlers/records-write.d.ts +3 -11
  279. package/dist/types/src/handlers/records-write.d.ts.map +1 -1
  280. package/dist/types/src/index.d.ts +14 -16
  281. package/dist/types/src/index.d.ts.map +1 -1
  282. package/dist/types/src/interfaces/messages-query.d.ts +23 -0
  283. package/dist/types/src/interfaces/messages-query.d.ts.map +1 -0
  284. package/dist/types/src/interfaces/protocols-configure.d.ts +3 -3
  285. package/dist/types/src/interfaces/protocols-configure.d.ts.map +1 -1
  286. package/dist/types/src/interfaces/protocols-query.d.ts +2 -2
  287. package/dist/types/src/interfaces/protocols-query.d.ts.map +1 -1
  288. package/dist/types/src/interfaces/records-count.d.ts +3 -3
  289. package/dist/types/src/interfaces/records-count.d.ts.map +1 -1
  290. package/dist/types/src/interfaces/records-delete.d.ts +11 -3
  291. package/dist/types/src/interfaces/records-delete.d.ts.map +1 -1
  292. package/dist/types/src/interfaces/records-query.d.ts +3 -3
  293. package/dist/types/src/interfaces/records-query.d.ts.map +1 -1
  294. package/dist/types/src/interfaces/records-read.d.ts +3 -3
  295. package/dist/types/src/interfaces/records-read.d.ts.map +1 -1
  296. package/dist/types/src/interfaces/records-subscribe.d.ts +3 -3
  297. package/dist/types/src/interfaces/records-subscribe.d.ts.map +1 -1
  298. package/dist/types/src/interfaces/records-write.d.ts +15 -7
  299. package/dist/types/src/interfaces/records-write.d.ts.map +1 -1
  300. package/dist/types/src/protocols/permissions.d.ts +9 -12
  301. package/dist/types/src/protocols/permissions.d.ts.map +1 -1
  302. package/dist/types/src/store/index-level.d.ts +10 -1
  303. package/dist/types/src/store/index-level.d.ts.map +1 -1
  304. package/dist/types/src/store/level-wrapper.d.ts +5 -0
  305. package/dist/types/src/store/level-wrapper.d.ts.map +1 -1
  306. package/dist/types/src/store/message-store-level.d.ts +94 -14
  307. package/dist/types/src/store/message-store-level.d.ts.map +1 -1
  308. package/dist/types/src/store/storage-controller.d.ts +17 -14
  309. package/dist/types/src/store/storage-controller.d.ts.map +1 -1
  310. package/dist/types/src/types/message-store.d.ts +29 -1
  311. package/dist/types/src/types/message-store.d.ts.map +1 -1
  312. package/dist/types/src/types/message-types.d.ts +2 -0
  313. package/dist/types/src/types/message-types.d.ts.map +1 -1
  314. package/dist/types/src/types/messages-types.d.ts +21 -37
  315. package/dist/types/src/types/messages-types.d.ts.map +1 -1
  316. package/dist/types/src/types/method-handler.d.ts +2 -2
  317. package/dist/types/src/types/method-handler.d.ts.map +1 -1
  318. package/dist/types/src/types/permission-types.d.ts +1 -1
  319. package/dist/types/src/types/subscriptions.d.ts +50 -39
  320. package/dist/types/src/types/subscriptions.d.ts.map +1 -1
  321. package/dist/types/src/types/validation-state-reader.d.ts +116 -0
  322. package/dist/types/src/types/validation-state-reader.d.ts.map +1 -0
  323. package/dist/types/src/utils/messages.d.ts +10 -0
  324. package/dist/types/src/utils/messages.d.ts.map +1 -1
  325. package/dist/types/src/utils/protocol-tags.d.ts +15 -0
  326. package/dist/types/src/utils/protocol-tags.d.ts.map +1 -0
  327. package/dist/types/src/utils/record-limit-occupancy.d.ts +40 -0
  328. package/dist/types/src/utils/record-limit-occupancy.d.ts.map +1 -0
  329. package/dist/types/src/utils/records.d.ts +25 -3
  330. package/dist/types/src/utils/records.d.ts.map +1 -1
  331. package/dist/types/src/utils/replication.d.ts +22 -0
  332. package/dist/types/src/utils/replication.d.ts.map +1 -0
  333. package/dist/types/tests/core/process-message-parity.spec.d.ts +2 -0
  334. package/dist/types/tests/core/process-message-parity.spec.d.ts.map +1 -0
  335. package/dist/types/tests/core/replication-replay-property.spec.d.ts +2 -0
  336. package/dist/types/tests/core/replication-replay-property.spec.d.ts.map +1 -0
  337. package/dist/types/tests/core/validation-read-closure.spec.d.ts +2 -0
  338. package/dist/types/tests/core/validation-read-closure.spec.d.ts.map +1 -0
  339. package/dist/types/tests/core/validation-state-reader.spec.d.ts +2 -0
  340. package/dist/types/tests/core/validation-state-reader.spec.d.ts.map +1 -0
  341. package/dist/types/tests/durable-event-log.spec.d.ts +2 -0
  342. package/dist/types/tests/durable-event-log.spec.d.ts.map +1 -0
  343. package/dist/types/tests/dwn.spec.d.ts.map +1 -1
  344. package/dist/types/tests/features/author-delegated-grant.spec.d.ts.map +1 -1
  345. package/dist/types/tests/features/owner-delegated-grant.spec.d.ts.map +1 -1
  346. package/dist/types/tests/features/owner-signature.spec.d.ts.map +1 -1
  347. package/dist/types/tests/features/permissions.spec.d.ts.map +1 -1
  348. package/dist/types/tests/features/protocol-composition.spec.d.ts.map +1 -1
  349. package/dist/types/tests/features/protocol-create-action.spec.d.ts.map +1 -1
  350. package/dist/types/tests/features/protocol-delete-action.spec.d.ts.map +1 -1
  351. package/dist/types/tests/features/protocol-update-action.spec.d.ts.map +1 -1
  352. package/dist/types/tests/features/records-delivery.spec.d.ts.map +1 -1
  353. package/dist/types/tests/features/records-immutable.spec.d.ts.map +1 -1
  354. package/dist/types/tests/features/records-nested-query-scope.spec.d.ts +2 -0
  355. package/dist/types/tests/features/records-nested-query-scope.spec.d.ts.map +1 -0
  356. package/dist/types/tests/features/records-prune-cross-protocol.spec.d.ts.map +1 -1
  357. package/dist/types/tests/features/records-prune.spec.d.ts.map +1 -1
  358. package/dist/types/tests/features/records-record-limit.spec.d.ts.map +1 -1
  359. package/dist/types/tests/features/records-squash.spec.d.ts.map +1 -1
  360. package/dist/types/tests/features/records-tags.spec.d.ts.map +1 -1
  361. package/dist/types/tests/features/resumable-tasks.spec.d.ts.map +1 -1
  362. package/dist/types/tests/handlers/messages-query.spec.d.ts +2 -0
  363. package/dist/types/tests/handlers/messages-query.spec.d.ts.map +1 -0
  364. package/dist/types/tests/handlers/messages-read.spec.d.ts.map +1 -1
  365. package/dist/types/tests/handlers/messages-subscribe.spec.d.ts.map +1 -1
  366. package/dist/types/tests/handlers/protocols-configure.spec.d.ts.map +1 -1
  367. package/dist/types/tests/handlers/protocols-query.spec.d.ts.map +1 -1
  368. package/dist/types/tests/handlers/records-count.spec.d.ts.map +1 -1
  369. package/dist/types/tests/handlers/records-delete.spec.d.ts.map +1 -1
  370. package/dist/types/tests/handlers/records-query.spec.d.ts.map +1 -1
  371. package/dist/types/tests/handlers/records-read.spec.d.ts.map +1 -1
  372. package/dist/types/tests/handlers/records-subscribe.spec.d.ts.map +1 -1
  373. package/dist/types/tests/handlers/records-write.spec.d.ts.map +1 -1
  374. package/dist/types/tests/scenarios/deleted-record.spec.d.ts.map +1 -1
  375. package/dist/types/tests/scenarios/end-to-end-tests.spec.d.ts.map +1 -1
  376. package/dist/types/tests/scenarios/nested-roles.spec.d.ts.map +1 -1
  377. package/dist/types/tests/scenarios/subscriptions.spec.d.ts.map +1 -1
  378. package/dist/types/tests/store/message-store.spec.d.ts.map +1 -1
  379. package/dist/types/tests/test-event-stream.d.ts +1 -1
  380. package/dist/types/tests/test-event-stream.d.ts.map +1 -1
  381. package/dist/types/tests/test-stores.d.ts +5 -4
  382. package/dist/types/tests/test-stores.d.ts.map +1 -1
  383. package/dist/types/tests/test-suite.d.ts +1 -2
  384. package/dist/types/tests/test-suite.d.ts.map +1 -1
  385. package/dist/types/tests/utils/protocol-tags.spec.d.ts +2 -0
  386. package/dist/types/tests/utils/protocol-tags.spec.d.ts.map +1 -0
  387. package/dist/types/tests/utils/test-data-generator.d.ts +20 -1
  388. package/dist/types/tests/utils/test-data-generator.d.ts.map +1 -1
  389. package/dist/types/tests/utils/test-validation-state-reader.d.ts +15 -0
  390. package/dist/types/tests/utils/test-validation-state-reader.d.ts.map +1 -0
  391. package/package.json +2 -2
  392. package/src/core/core-protocol.ts +3 -3
  393. package/src/core/dwn-constant.ts +7 -1
  394. package/src/core/dwn-error.ts +12 -4
  395. package/src/core/grant-authorization.ts +11 -20
  396. package/src/core/message-reply.ts +6 -5
  397. package/src/core/messages-grant-authorization.ts +37 -70
  398. package/src/core/protocol-authorization-action.ts +29 -38
  399. package/src/core/protocol-authorization-validation.ts +47 -121
  400. package/src/core/protocol-authorization.ts +56 -202
  401. package/src/core/protocols-grant-authorization.ts +9 -9
  402. package/src/core/recording-validation-state-reader.ts +130 -0
  403. package/src/core/records-grant-authorization.ts +16 -16
  404. package/src/core/replication-apply.ts +172 -32
  405. package/src/core/resumable-task-manager.ts +10 -8
  406. package/src/core/validation-state-reader.ts +350 -0
  407. package/src/dwn.ts +285 -192
  408. package/src/enums/dwn-interface-method.ts +0 -1
  409. package/src/event-stream/durable-event-log.ts +509 -0
  410. package/src/event-stream/event-emitter-wake-publisher.ts +34 -0
  411. package/src/handlers/messages-query.ts +203 -0
  412. package/src/handlers/messages-read.ts +9 -10
  413. package/src/handlers/messages-subscribe.ts +12 -13
  414. package/src/handlers/protocols-configure.ts +37 -58
  415. package/src/handlers/protocols-query.ts +1 -1
  416. package/src/handlers/records-count.ts +24 -17
  417. package/src/handlers/records-delete.ts +29 -27
  418. package/src/handlers/records-query.ts +38 -17
  419. package/src/handlers/records-read.ts +63 -50
  420. package/src/handlers/records-subscribe.ts +132 -19
  421. package/src/handlers/records-write.ts +77 -168
  422. package/src/index.ts +14 -17
  423. package/src/interfaces/messages-query.ts +70 -0
  424. package/src/interfaces/protocols-configure.ts +20 -10
  425. package/src/interfaces/protocols-query.ts +4 -5
  426. package/src/interfaces/records-count.ts +9 -4
  427. package/src/interfaces/records-delete.ts +25 -5
  428. package/src/interfaces/records-query.ts +9 -4
  429. package/src/interfaces/records-read.ts +4 -4
  430. package/src/interfaces/records-subscribe.ts +9 -4
  431. package/src/interfaces/records-write.ts +41 -13
  432. package/src/protocols/permissions.ts +32 -52
  433. package/src/store/index-level.ts +30 -9
  434. package/src/store/level-wrapper.ts +9 -1
  435. package/src/store/message-store-level.ts +757 -47
  436. package/src/store/storage-controller.ts +74 -63
  437. package/src/types/message-store.ts +45 -2
  438. package/src/types/message-types.ts +3 -1
  439. package/src/types/messages-types.ts +26 -45
  440. package/src/types/method-handler.ts +3 -3
  441. package/src/types/permission-types.ts +1 -1
  442. package/src/types/subscriptions.ts +53 -42
  443. package/src/types/validation-state-reader.ts +127 -0
  444. package/src/utils/messages.ts +25 -1
  445. package/src/utils/protocol-tags.ts +366 -0
  446. package/src/utils/record-limit-occupancy.ts +377 -0
  447. package/src/utils/records.ts +69 -13
  448. package/src/utils/replication.ts +122 -0
  449. package/dist/esm/src/core/record-chain.js +0 -64
  450. package/dist/esm/src/core/record-chain.js.map +0 -1
  451. package/dist/esm/src/event-stream/event-emitter-event-log.js +0 -334
  452. package/dist/esm/src/event-stream/event-emitter-event-log.js.map +0 -1
  453. package/dist/esm/src/handlers/messages-sync.js +0 -278
  454. package/dist/esm/src/handlers/messages-sync.js.map +0 -1
  455. package/dist/esm/src/interfaces/messages-sync.js.map +0 -1
  456. package/dist/esm/src/smt/smt-store-level.js +0 -103
  457. package/dist/esm/src/smt/smt-store-level.js.map +0 -1
  458. package/dist/esm/src/smt/smt-store-memory.js +0 -41
  459. package/dist/esm/src/smt/smt-store-memory.js.map +0 -1
  460. package/dist/esm/src/smt/smt-utils.js +0 -129
  461. package/dist/esm/src/smt/smt-utils.js.map +0 -1
  462. package/dist/esm/src/smt/sparse-merkle-tree.js +0 -577
  463. package/dist/esm/src/smt/sparse-merkle-tree.js.map +0 -1
  464. package/dist/esm/src/state-index/state-index-level.js +0 -191
  465. package/dist/esm/src/state-index/state-index-level.js.map +0 -1
  466. package/dist/esm/src/types/smt-types.js +0 -5
  467. package/dist/esm/src/types/smt-types.js.map +0 -1
  468. package/dist/esm/src/types/state-index.js +0 -2
  469. package/dist/esm/src/types/state-index.js.map +0 -1
  470. package/dist/esm/tests/event-emitter-event-log.spec.js +0 -499
  471. package/dist/esm/tests/event-emitter-event-log.spec.js.map +0 -1
  472. package/dist/esm/tests/handlers/messages-sync.spec.js +0 -1088
  473. package/dist/esm/tests/handlers/messages-sync.spec.js.map +0 -1
  474. package/dist/esm/tests/smt/smt-store-level.spec.js +0 -132
  475. package/dist/esm/tests/smt/smt-store-level.spec.js.map +0 -1
  476. package/dist/esm/tests/smt/sparse-merkle-tree.spec.js +0 -732
  477. package/dist/esm/tests/smt/sparse-merkle-tree.spec.js.map +0 -1
  478. package/dist/esm/tests/state-index/state-index-level.spec.js +0 -245
  479. package/dist/esm/tests/state-index/state-index-level.spec.js.map +0 -1
  480. package/dist/types/src/core/record-chain.d.ts +0 -24
  481. package/dist/types/src/core/record-chain.d.ts.map +0 -1
  482. package/dist/types/src/event-stream/event-emitter-event-log.d.ts +0 -80
  483. package/dist/types/src/event-stream/event-emitter-event-log.d.ts.map +0 -1
  484. package/dist/types/src/handlers/messages-sync.d.ts +0 -39
  485. package/dist/types/src/handlers/messages-sync.d.ts.map +0 -1
  486. package/dist/types/src/interfaces/messages-sync.d.ts +0 -20
  487. package/dist/types/src/interfaces/messages-sync.d.ts.map +0 -1
  488. package/dist/types/src/smt/smt-store-level.d.ts +0 -32
  489. package/dist/types/src/smt/smt-store-level.d.ts.map +0 -1
  490. package/dist/types/src/smt/smt-store-memory.d.ts +0 -22
  491. package/dist/types/src/smt/smt-store-memory.d.ts.map +0 -1
  492. package/dist/types/src/smt/smt-utils.d.ts +0 -58
  493. package/dist/types/src/smt/smt-utils.d.ts.map +0 -1
  494. package/dist/types/src/smt/sparse-merkle-tree.d.ts +0 -124
  495. package/dist/types/src/smt/sparse-merkle-tree.d.ts.map +0 -1
  496. package/dist/types/src/state-index/state-index-level.d.ts +0 -83
  497. package/dist/types/src/state-index/state-index-level.d.ts.map +0 -1
  498. package/dist/types/src/types/smt-types.d.ts +0 -81
  499. package/dist/types/src/types/smt-types.d.ts.map +0 -1
  500. package/dist/types/src/types/state-index.d.ts +0 -90
  501. package/dist/types/src/types/state-index.d.ts.map +0 -1
  502. package/dist/types/tests/event-emitter-event-log.spec.d.ts +0 -2
  503. package/dist/types/tests/event-emitter-event-log.spec.d.ts.map +0 -1
  504. package/dist/types/tests/handlers/messages-sync.spec.d.ts +0 -2
  505. package/dist/types/tests/handlers/messages-sync.spec.d.ts.map +0 -1
  506. package/dist/types/tests/smt/smt-store-level.spec.d.ts +0 -2
  507. package/dist/types/tests/smt/smt-store-level.spec.d.ts.map +0 -1
  508. package/dist/types/tests/smt/sparse-merkle-tree.spec.d.ts +0 -2
  509. package/dist/types/tests/smt/sparse-merkle-tree.spec.d.ts.map +0 -1
  510. package/dist/types/tests/state-index/state-index-level.spec.d.ts +0 -2
  511. package/dist/types/tests/state-index/state-index-level.spec.d.ts.map +0 -1
  512. package/src/core/record-chain.ts +0 -99
  513. package/src/event-stream/event-emitter-event-log.ts +0 -430
  514. package/src/handlers/messages-sync.ts +0 -403
  515. package/src/interfaces/messages-sync.ts +0 -69
  516. package/src/smt/smt-store-level.ts +0 -143
  517. package/src/smt/smt-store-memory.ts +0 -53
  518. package/src/smt/smt-utils.ts +0 -149
  519. package/src/smt/sparse-merkle-tree.ts +0 -698
  520. package/src/state-index/state-index-level.ts +0 -239
  521. package/src/types/smt-types.ts +0 -95
  522. package/src/types/state-index.ts +0 -100
@@ -1,9 +1,7 @@
1
1
  import type { GenericMessage } from '../types/message-types.js';
2
- import type { MessageStore } from '../types/message-store.js';
3
2
  import type { PermissionGrant } from '../protocols/permission-grant.js';
3
+ import type { ValidationStateReader } from '../types/validation-state-reader.js';
4
4
 
5
- import { Message } from './message.js';
6
- import { PERMISSIONS_REVOCATION_PATH } from './constants.js';
7
5
  import { DwnError, DwnErrorCode } from './dwn-error.js';
8
6
  import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
9
7
 
@@ -17,7 +15,7 @@ export class GrantAuthorization {
17
15
  *
18
16
  * NOTE: Does not validate grant `conditions` or `scope` beyond `interface` and `method`
19
17
  *
20
- * @param messageStore Used to check if the grant has been revoked.
18
+ * @param validationStateReader Used to check if the grant has been revoked.
21
19
  * @throws {DwnError} if validation fails
22
20
  */
23
21
  public static async performBaseValidation(input: {
@@ -25,9 +23,9 @@ export class GrantAuthorization {
25
23
  expectedGrantor: string,
26
24
  expectedGrantee: string,
27
25
  permissionGrant: PermissionGrant,
28
- messageStore: MessageStore,
26
+ validationStateReader: ValidationStateReader,
29
27
  }): Promise<void> {
30
- const { incomingMessage, expectedGrantor, expectedGrantee, permissionGrant, messageStore } = input;
28
+ const { incomingMessage, expectedGrantor, expectedGrantee, permissionGrant, validationStateReader } = input;
31
29
 
32
30
  const incomingMessageDescriptor = incomingMessage.descriptor;
33
31
 
@@ -39,7 +37,7 @@ export class GrantAuthorization {
39
37
  grantedFor,
40
38
  incomingMessageDescriptor.messageTimestamp,
41
39
  permissionGrant,
42
- messageStore
40
+ validationStateReader
43
41
  );
44
42
 
45
43
  // Check grant scope for interface and method
@@ -81,14 +79,14 @@ export class GrantAuthorization {
81
79
  /**
82
80
  * Verify that the incoming message is within the allowed time frame of the grant,
83
81
  * and the grant has not been revoked.
84
- * @param messageStore Used to check if the grant has been revoked.
82
+ * @param validationStateReader Used to check if the grant has been revoked.
85
83
  * @throws {DwnError} if incomingMessage has timestamp for a time in which the grant is not active.
86
84
  */
87
85
  private static async verifyGrantActive(
88
86
  grantedFor: string,
89
87
  incomingMessageTimestamp: string,
90
88
  permissionGrant: PermissionGrant,
91
- messageStore: MessageStore,
89
+ validationStateReader: ValidationStateReader,
92
90
  ): Promise<void> {
93
91
  // Check that incomingMessage is within the grant's time frame
94
92
  if (incomingMessageTimestamp < permissionGrant.dateGranted) {
@@ -107,14 +105,7 @@ export class GrantAuthorization {
107
105
  );
108
106
  }
109
107
 
110
- // Check if grant has been revoked
111
- const query = {
112
- parentId : permissionGrant.id,
113
- protocolPath : PERMISSIONS_REVOCATION_PATH,
114
- isLatestBaseState : true
115
- };
116
- const { messages: revokes } = await messageStore.query(grantedFor, [query]);
117
- const oldestExistingRevoke = await Message.getOldestMessage(revokes);
108
+ const oldestExistingRevoke = await validationStateReader.fetchOldestGrantRevocation(grantedFor, permissionGrant.id);
118
109
 
119
110
  if (oldestExistingRevoke !== undefined && oldestExistingRevoke.descriptor.messageTimestamp <= incomingMessageTimestamp) {
120
111
  throw new DwnError(
@@ -128,7 +119,7 @@ export class GrantAuthorization {
128
119
  * Verify that the `interface` and `method` grant scopes match the incoming message.
129
120
  *
130
121
  * For the Messages interface, a `Read` scope is treated as a unified scope that also authorizes
131
- * `Subscribe` and `Sync` operations.
122
+ * `Query`, `Subscribe`, and `Sync` operations.
132
123
  *
133
124
  * @throws {DwnError} if the `interface` and `method` of the incoming message do not match the scope of the permission grant.
134
125
  */
@@ -145,7 +136,7 @@ export class GrantAuthorization {
145
136
  );
146
137
  }
147
138
 
148
- // Messages.Read is the only valid Messages scope and covers Read, Subscribe, and Sync operations.
139
+ // Messages.Read is the only valid Messages scope and covers Read, Query, and Subscribe operations.
149
140
  // Reject any Messages grant with method !== Read.
150
141
  if (dwnInterface === DwnInterfaceName.Messages) {
151
142
  if (permissionGrant.scope.method !== DwnMethodName.Read) {
@@ -154,7 +145,7 @@ export class GrantAuthorization {
154
145
  `messages permission grant must have method 'Read', got '${permissionGrant.scope.method}' for grant ${permissionGrant.id}`
155
146
  );
156
147
  }
157
- const allowedMethods = [DwnMethodName.Read, DwnMethodName.Subscribe, DwnMethodName.Sync];
148
+ const allowedMethods = [DwnMethodName.Read, DwnMethodName.Query, DwnMethodName.Subscribe];
158
149
  if (!allowedMethods.includes(dwnMethod as DwnMethodName)) {
159
150
  throw new DwnError(
160
151
  DwnErrorCode.GrantAuthorizationMethodMismatch,
@@ -1,8 +1,9 @@
1
- import type { MessagesReadReplyEntry } from '../types/messages-types.js';
2
1
  import type { PaginationCursor } from '../types/query-types.js';
2
+ import type { ProgressToken } from '../types/subscriptions.js';
3
3
  import type { ProtocolsConfigureMessage } from '../types/protocols-types.js';
4
4
  import type { RecordsReadReplyEntry } from '../types/records-types.js';
5
5
  import type { GenericMessageReply, MessageSubscription, QueryResultEntry } from '../types/message-types.js';
6
+ import type { MessagesQueryReplyEntry, MessagesReadReplyEntry } from '../types/messages-types.js';
6
7
 
7
8
  export function messageReplyFromError(e: unknown, code: number): GenericMessageReply {
8
9
 
@@ -23,19 +24,19 @@ export type UnionMessageReply = GenericMessageReply & {
23
24
 
24
25
  /**
25
26
  * Resulting message entries or events returned from the invocation of the corresponding message.
26
- * e.g. the resulting messages from a RecordsQuery, or array of messageCid strings for MessagesSync
27
+ * e.g. the resulting messages from a RecordsQuery or MessagesQuery.
27
28
  * Mutually exclusive with `record`.
28
29
  */
29
- entries?: QueryResultEntry[] | ProtocolsConfigureMessage[] | string[];
30
+ entries?: QueryResultEntry[] | ProtocolsConfigureMessage[] | MessagesQueryReplyEntry[] | string[];
30
31
 
31
32
  /**
32
33
  * A cursor for pagination if applicable (e.g. RecordsQuery).
33
34
  * Mutually exclusive with `record`.
34
35
  */
35
- cursor?: PaginationCursor;
36
+ cursor?: PaginationCursor | ProgressToken;
36
37
 
37
38
  /**
38
39
  * A subscription object if a subscription was requested.
39
40
  */
40
41
  subscription?: MessageSubscription;
41
- };
42
+ };
@@ -1,36 +1,34 @@
1
1
  import type { GenericMessage } from '../types/message-types.js';
2
2
  import type { MessagesPermissionScope } from '../types/permission-types.js';
3
- import type { MessageStore } from '../types/message-store.js';
4
3
  import type { PermissionGrant } from '../protocols/permission-grant.js';
5
4
  import type { ProtocolsConfigureMessage } from '../types/protocols-types.js';
6
5
  import type { ProtocolScope } from '../utils/permission-scope.js';
6
+ import type { ValidationStateReader } from '../types/validation-state-reader.js';
7
7
  import type { DataEncodedRecordsWriteMessage, RecordsDeleteMessage, RecordsWriteMessage } from '../types/records-types.js';
8
- import type { MessagesReadMessage, MessagesSubscribeMessage, MessagesSyncMessage } from '../types/messages-types.js';
8
+ import type { MessagesQueryMessage, MessagesReadMessage, MessagesSubscribeMessage } from '../types/messages-types.js';
9
9
 
10
10
  import { DwnInterfaceName } from '../enums/dwn-interface-method.js';
11
11
  import { GrantAuthorization } from './grant-authorization.js';
12
- import { isRecordsPrimaryProjectionExcludedProtocol } from './constants.js';
13
12
  import { PermissionScopeMatcher } from '../utils/permission-scope.js';
14
13
  import { PermissionsProtocol } from '../protocols/permissions.js';
15
14
  import { Records } from '../utils/records.js';
16
- import { RecordsWrite } from '../interfaces/records-write.js';
17
15
  import { DwnError, DwnErrorCode } from './dwn-error.js';
18
16
 
19
17
  export class MessagesGrantAuthorization {
20
18
 
21
19
  public static async fetchPermissionGrants(
22
20
  tenant: string,
23
- messageStore: MessageStore,
21
+ validationStateReader: ValidationStateReader,
24
22
  permissionGrantIds: string[]
25
23
  ): Promise<PermissionGrant[]> {
26
24
  return Promise.all(
27
- permissionGrantIds.map(permissionGrantId => PermissionsProtocol.fetchGrant(tenant, messageStore, permissionGrantId))
25
+ permissionGrantIds.map(permissionGrantId => validationStateReader.fetchGrant(tenant, permissionGrantId))
28
26
  );
29
27
  }
30
28
 
31
29
  /**
32
30
  * Authorizes a MessagesReadMessage using the given permission grant.
33
- * @param messageStore Used to check if the given grant has been revoked; and to fetch related RecordsWrites if needed.
31
+ * @param validationStateReader Used to check grant revocation and fetch related RecordsWrites if needed.
34
32
  */
35
33
  public static async authorizeMessagesRead(input: {
36
34
  messagesReadMessage: MessagesReadMessage,
@@ -38,10 +36,10 @@ export class MessagesGrantAuthorization {
38
36
  expectedGrantor: string,
39
37
  expectedGrantee: string,
40
38
  permissionGrants: PermissionGrant[],
41
- messageStore: MessageStore,
39
+ validationStateReader: ValidationStateReader,
42
40
  }): Promise<void> {
43
41
  const {
44
- messagesReadMessage, messageToRead, expectedGrantor, expectedGrantee, permissionGrants, messageStore
42
+ messagesReadMessage, messageToRead, expectedGrantor, expectedGrantee, permissionGrants, validationStateReader
45
43
  } = input;
46
44
 
47
45
  await MessagesGrantAuthorization.performBaseValidationForGrantSet({
@@ -49,12 +47,12 @@ export class MessagesGrantAuthorization {
49
47
  expectedGrantor,
50
48
  expectedGrantee,
51
49
  permissionGrants,
52
- messageStore
50
+ validationStateReader
53
51
  });
54
52
 
55
53
  for (const permissionGrant of permissionGrants) {
56
54
  const scope = permissionGrant.scope as MessagesPermissionScope;
57
- if (await MessagesGrantAuthorization.isScopeAuthorized(expectedGrantor, messageToRead, scope, messageStore)) {
55
+ if (await MessagesGrantAuthorization.isScopeAuthorized(expectedGrantor, messageToRead, scope, validationStateReader)) {
58
56
  return;
59
57
  }
60
58
  }
@@ -63,18 +61,18 @@ export class MessagesGrantAuthorization {
63
61
  }
64
62
 
65
63
  /**
66
- * Authorizes the scope of a permission grant for MessagesSubscribe or MessagesSync.
67
- * @param messageStore Used to check if the grant has been revoked.
64
+ * Authorizes the scope of a permission grant for MessagesQuery or MessagesSubscribe.
65
+ * @param validationStateReader Used to check if the grant has been revoked.
68
66
  */
69
- public static async authorizeSubscribeOrSync(input: {
70
- incomingMessage: MessagesSubscribeMessage | MessagesSyncMessage,
67
+ public static async authorizeQueryOrSubscribe(input: {
68
+ incomingMessage: MessagesQueryMessage | MessagesSubscribeMessage,
71
69
  expectedGrantor: string,
72
70
  expectedGrantee: string,
73
71
  permissionGrants: PermissionGrant[],
74
- messageStore: MessageStore,
72
+ validationStateReader: ValidationStateReader,
75
73
  }): Promise<void> {
76
74
  const {
77
- incomingMessage, expectedGrantor, expectedGrantee, permissionGrants, messageStore
75
+ incomingMessage, expectedGrantor, expectedGrantee, permissionGrants, validationStateReader
78
76
  } = input;
79
77
 
80
78
  await MessagesGrantAuthorization.performBaseValidationForGrantSet({
@@ -82,50 +80,19 @@ export class MessagesGrantAuthorization {
82
80
  expectedGrantor,
83
81
  expectedGrantee,
84
82
  permissionGrants,
85
- messageStore
83
+ validationStateReader
86
84
  });
87
85
 
88
86
  const scopes = permissionGrants.map(permissionGrant => permissionGrant.scope as MessagesPermissionScope);
89
87
 
90
- if ('action' in incomingMessage.descriptor) {
91
- MessagesGrantAuthorization.authorizeSyncScope(incomingMessage as MessagesSyncMessage, scopes);
92
- return;
93
- }
94
-
95
- MessagesGrantAuthorization.authorizeSubscribeScope(incomingMessage as MessagesSubscribeMessage, scopes);
96
- }
97
-
98
- private static authorizeSyncScope(
99
- syncMessage: MessagesSyncMessage,
100
- scopes: MessagesPermissionScope[]
101
- ): void {
102
- MessagesGrantAuthorization.authorizeProtocolSyncScope(scopes, syncMessage.descriptor.protocol);
103
- }
104
-
105
- private static authorizeProtocolSyncScope(
106
- scopes: MessagesPermissionScope[],
107
- protocol: string | undefined
108
- ): void {
109
- if (isRecordsPrimaryProjectionExcludedProtocol(protocol)) {
110
- throw new DwnError(
111
- DwnErrorCode.MessagesGrantAuthorizationProtocolSyncInfrastructureProtocol,
112
- `Protocol-scoped MessagesSync cannot authorize infrastructure protocol ${protocol}`
113
- );
114
- }
115
-
116
- if (!MessagesGrantAuthorization.someScopeMatches(scopes, { protocol })) {
117
- throw new DwnError(
118
- DwnErrorCode.MessagesGrantAuthorizationMismatchedProtocol,
119
- `No permission grant scope matches protocol ${protocol}`
120
- );
121
- }
88
+ MessagesGrantAuthorization.authorizeFilterScope(incomingMessage, scopes);
122
89
  }
123
90
 
124
- private static authorizeSubscribeScope(
125
- subscribeMessage: MessagesSubscribeMessage,
91
+ private static authorizeFilterScope(
92
+ messagesMessage: MessagesQueryMessage | MessagesSubscribeMessage,
126
93
  scopes: MessagesPermissionScope[]
127
94
  ): void {
128
- const { filters } = subscribeMessage.descriptor;
95
+ const { filters } = messagesMessage.descriptor;
129
96
 
130
97
  if (filters.length === 0 && !MessagesGrantAuthorization.hasUnscopedGrant(scopes)) {
131
98
  throw new DwnError(
@@ -165,7 +132,7 @@ export class MessagesGrantAuthorization {
165
132
  expectedGrantor: string,
166
133
  expectedGrantee: string,
167
134
  permissionGrants: PermissionGrant[],
168
- messageStore: MessageStore,
135
+ validationStateReader: ValidationStateReader,
169
136
  deliveryTimestamp: string,
170
137
  }): Promise<void> {
171
138
  const {
@@ -173,7 +140,7 @@ export class MessagesGrantAuthorization {
173
140
  expectedGrantor,
174
141
  expectedGrantee,
175
142
  permissionGrants,
176
- messageStore,
143
+ validationStateReader,
177
144
  deliveryTimestamp,
178
145
  } = input;
179
146
 
@@ -185,12 +152,12 @@ export class MessagesGrantAuthorization {
185
152
  },
186
153
  };
187
154
 
188
- await MessagesGrantAuthorization.authorizeSubscribeOrSync({
155
+ await MessagesGrantAuthorization.authorizeQueryOrSubscribe({
189
156
  incomingMessage: deliveryMessage,
190
157
  expectedGrantor,
191
158
  expectedGrantee,
192
159
  permissionGrants,
193
- messageStore,
160
+ validationStateReader,
194
161
  });
195
162
  }
196
163
 
@@ -199,14 +166,14 @@ export class MessagesGrantAuthorization {
199
166
  * unresolved, revoked, expired, or interface/method-mismatched grants fail the request.
200
167
  */
201
168
  private static async performBaseValidationForGrantSet(input: {
202
- incomingMessage: MessagesReadMessage | MessagesSubscribeMessage | MessagesSyncMessage,
169
+ incomingMessage: MessagesQueryMessage | MessagesReadMessage | MessagesSubscribeMessage,
203
170
  expectedGrantor: string,
204
171
  expectedGrantee: string,
205
172
  permissionGrants: PermissionGrant[],
206
- messageStore: MessageStore,
173
+ validationStateReader: ValidationStateReader,
207
174
  }): Promise<void> {
208
175
  const {
209
- incomingMessage, expectedGrantor, expectedGrantee, permissionGrants, messageStore
176
+ incomingMessage, expectedGrantor, expectedGrantee, permissionGrants, validationStateReader
210
177
  } = input;
211
178
 
212
179
  for (const permissionGrant of permissionGrants) {
@@ -215,7 +182,7 @@ export class MessagesGrantAuthorization {
215
182
  expectedGrantor,
216
183
  expectedGrantee,
217
184
  permissionGrant,
218
- messageStore
185
+ validationStateReader
219
186
  });
220
187
  }
221
188
  }
@@ -227,7 +194,7 @@ export class MessagesGrantAuthorization {
227
194
  tenant: string,
228
195
  messageToGet: GenericMessage,
229
196
  incomingScope: MessagesPermissionScope,
230
- messageStore: MessageStore,
197
+ validationStateReader: ValidationStateReader,
231
198
  ): Promise<boolean> {
232
199
  if (incomingScope.protocol === undefined) {
233
200
  return true;
@@ -238,7 +205,7 @@ export class MessagesGrantAuthorization {
238
205
  tenant,
239
206
  messageToGet as RecordsWriteMessage | RecordsDeleteMessage,
240
207
  incomingScope,
241
- messageStore
208
+ validationStateReader
242
209
  );
243
210
  }
244
211
 
@@ -256,12 +223,12 @@ export class MessagesGrantAuthorization {
256
223
  tenant: string,
257
224
  recordsMessage: RecordsWriteMessage | RecordsDeleteMessage,
258
225
  incomingScope: MessagesPermissionScope,
259
- messageStore: MessageStore,
226
+ validationStateReader: ValidationStateReader,
260
227
  ): Promise<boolean> {
261
228
  const recordsWriteMessage = await MessagesGrantAuthorization.getAssociatedRecordsWrite(
262
229
  tenant,
263
230
  recordsMessage,
264
- messageStore
231
+ validationStateReader
265
232
  );
266
233
 
267
234
  if (recordsWriteMessage.descriptor.protocol === PermissionsProtocol.uri) {
@@ -269,7 +236,7 @@ export class MessagesGrantAuthorization {
269
236
  tenant,
270
237
  recordsWriteMessage,
271
238
  incomingScope,
272
- messageStore
239
+ validationStateReader
273
240
  );
274
241
  }
275
242
 
@@ -280,7 +247,7 @@ export class MessagesGrantAuthorization {
280
247
  tenant: string,
281
248
  recordsWriteMessage: RecordsWriteMessage,
282
249
  incomingScope: MessagesPermissionScope,
283
- messageStore: MessageStore,
250
+ validationStateReader: ValidationStateReader,
284
251
  ): Promise<boolean> {
285
252
  if (MessagesGrantAuthorization.isSubtreeScope(incomingScope)) {
286
253
  return false;
@@ -288,7 +255,7 @@ export class MessagesGrantAuthorization {
288
255
 
289
256
  const permissionScope = await PermissionsProtocol.getScopeFromPermissionRecord(
290
257
  tenant,
291
- messageStore,
258
+ validationStateReader,
292
259
  recordsWriteMessage as DataEncodedRecordsWriteMessage
293
260
  );
294
261
 
@@ -309,13 +276,13 @@ export class MessagesGrantAuthorization {
309
276
  private static async getAssociatedRecordsWrite(
310
277
  tenant: string,
311
278
  recordsMessage: RecordsWriteMessage | RecordsDeleteMessage,
312
- messageStore: MessageStore,
279
+ validationStateReader: ValidationStateReader,
313
280
  ): Promise<RecordsWriteMessage> {
314
281
  if (Records.isRecordsWrite(recordsMessage)) {
315
282
  return recordsMessage;
316
283
  }
317
284
 
318
- return RecordsWrite.fetchNewestRecordsWrite(messageStore, tenant, recordsMessage.descriptor.recordId);
285
+ return validationStateReader.fetchNewestRecordsWrite(tenant, recordsMessage.descriptor.recordId);
319
286
  }
320
287
 
321
288
  private static getRecordsScopeTarget(recordsWriteMessage: RecordsWriteMessage): ProtocolScope {
@@ -1,22 +1,18 @@
1
- import type { Filter } from '../types/query-types.js';
2
- import type { MessageStore } from '../types/message-store.js';
3
1
  import type { RecordsCount } from '../interfaces/records-count.js';
4
2
  import type { RecordsDelete } from '../interfaces/records-delete.js';
5
3
  import type { RecordsQuery } from '../interfaces/records-query.js';
6
4
  import type { RecordsRead } from '../interfaces/records-read.js';
7
5
  import type { RecordsSubscribe } from '../interfaces/records-subscribe.js';
8
6
  import type { RecordsWriteMessage } from '../types/records-types.js';
7
+ import type { ValidationStateReader } from '../types/validation-state-reader.js';
9
8
  import type { ProtocolActionRule, ProtocolDefinition, ProtocolRuleSet } from '../types/protocols-types.js';
10
9
 
11
- import { FilterUtility } from '../utils/filter.js';
10
+ import { DwnMethodName } from '../enums/dwn-interface-method.js';
12
11
  import { RecordsWrite } from '../interfaces/records-write.js';
13
12
  import { DwnError, DwnErrorCode } from './dwn-error.js';
14
- import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
15
13
  import { getRuleSetAtPath, isCrossProtocolRef, parseCrossProtocolRef } from '../utils/protocols.js';
16
14
  import { ProtocolAction, ProtocolActor } from '../types/protocols-types.js';
17
15
 
18
- import type { FetchProtocolDefinitionFn } from './protocol-authorization.js';
19
-
20
16
  /**
21
17
  * Check if the incoming message is invoking a role. If so, validate the invoked role.
22
18
  * For cross-protocol role invocation, the role record may live in a different protocol
@@ -28,9 +24,8 @@ export async function verifyInvokedRole(
28
24
  protocolUri: string,
29
25
  contextId: string | undefined,
30
26
  protocolDefinition: ProtocolDefinition,
31
- messageStore: MessageStore,
32
- fetchProtocolDefinition: FetchProtocolDefinitionFn,
33
- governingTimestamp?: string,
27
+ validationStateReader: ValidationStateReader,
28
+ protocolDefinitionTimestamp?: string,
34
29
  ): Promise<void> {
35
30
  const protocolRole = incomingMessage.signaturePayload?.protocolRole;
36
31
 
@@ -64,8 +59,8 @@ export async function verifyInvokedRole(
64
59
  roleProtocolPath = parsed.protocolPath;
65
60
 
66
61
  // Fetch the referenced protocol's definition to validate the role exists
67
- const refDefinition = await fetchProtocolDefinition(
68
- tenant, roleProtocolUri, messageStore, governingTimestamp
62
+ const refDefinition = await validationStateReader.fetchProtocolDefinition(
63
+ tenant, roleProtocolUri, protocolDefinitionTimestamp
69
64
  );
70
65
  const roleRuleSet = getRuleSetAtPath(roleProtocolPath, refDefinition.structure);
71
66
  if (!roleRuleSet?.$role) {
@@ -85,16 +80,6 @@ export async function verifyInvokedRole(
85
80
  }
86
81
  }
87
82
 
88
- // Construct a filter to fetch the invoked role record
89
- const roleRecordFilter: Filter = {
90
- interface : DwnInterfaceName.Records,
91
- method : DwnMethodName.Write,
92
- protocol : roleProtocolUri,
93
- protocolPath : roleProtocolPath,
94
- recipient : incomingMessage.author!,
95
- isLatestBaseState : true,
96
- };
97
-
98
83
  const ancestorSegmentCountOfRolePath = roleProtocolPath.split('/').length - 1;
99
84
  if (contextId === undefined && ancestorSegmentCountOfRolePath > 0) {
100
85
  throw new DwnError(
@@ -103,22 +88,26 @@ export async function verifyInvokedRole(
103
88
  );
104
89
  }
105
90
 
106
- // Compute `contextId` prefix filter for fetching the invoked role record if the role path is not at the root level.
91
+ // Compute `contextId` prefix for fetching the invoked role record if the role path is not at the root level.
107
92
  // e.g. if invoked role path is `Thread/Participant`, and the `contextId` of the message is `threadX/messageY/attachmentZ`,
108
- // then we need to add a prefix filter as `threadX` for the `contextId`
93
+ // then we need to use the prefix `threadX` for the `contextId`
109
94
  // because the `contextId` of the Participant record would be in the form of be `threadX/participantA`
95
+ let contextIdPrefix: string | undefined;
110
96
  if (ancestorSegmentCountOfRolePath > 0) {
111
97
  const contextIdSegments = contextId!.split('/'); // NOTE: currently contextId segment count is never shorter than the role path count.
112
- const contextIdPrefix = contextIdSegments.slice(0, ancestorSegmentCountOfRolePath).join('/');
113
- const contextIdPrefixFilter = FilterUtility.constructPrefixFilterAsRangeFilter(contextIdPrefix);
114
-
115
- roleRecordFilter.contextId = contextIdPrefixFilter;
98
+ contextIdPrefix = contextIdSegments.slice(0, ancestorSegmentCountOfRolePath).join('/');
116
99
  }
117
100
 
101
+ // fetch the invoked role record
102
+ const matchingRoleRecordExists = await validationStateReader.hasMatchingRoleRecord({
103
+ tenant,
104
+ protocol : roleProtocolUri,
105
+ protocolPath : roleProtocolPath,
106
+ recipient : incomingMessage.author!,
107
+ contextIdPrefix,
108
+ });
118
109
 
119
- const { messages: matchingMessages } = await messageStore.query(tenant, [roleRecordFilter]);
120
-
121
- if (matchingMessages.length === 0) {
110
+ if (!matchingRoleRecordExists) {
122
111
  throw new DwnError(
123
112
  DwnErrorCode.ProtocolAuthorizationMatchingRoleRecordNotFound,
124
113
  `No matching role record found for protocol path ${roleProtocolPath}`
@@ -139,14 +128,14 @@ export async function verifyInvokedRole(
139
128
  export async function getActionsSeekingARuleMatch(
140
129
  tenant: string,
141
130
  incomingMessage: RecordsCount | RecordsDelete | RecordsQuery | RecordsRead | RecordsSubscribe | RecordsWrite,
142
- messageStore: MessageStore,
131
+ validationStateReader: ValidationStateReader,
143
132
  ): Promise<ProtocolAction[]> {
144
133
 
145
134
  switch (incomingMessage.message.descriptor.method) {
146
- case DwnMethodName.Delete:
135
+ case DwnMethodName.Delete: {
147
136
  const recordsDelete = incomingMessage as RecordsDelete;
148
137
  const recordId = recordsDelete.message.descriptor.recordId;
149
- const initialWrite = await RecordsWrite.fetchInitialRecordsWrite(messageStore, tenant, recordId);
138
+ const initialWrite = await validationStateReader.fetchInitialRecordsWrite(tenant, recordId);
150
139
 
151
140
  // if there is no initial write, then no action rule can authorize the incoming message, because we won't know who the original author is
152
141
  // NOTE: purely defensive programming: currently not reachable
@@ -155,7 +144,7 @@ export async function getActionsSeekingARuleMatch(
155
144
  return [];
156
145
  }
157
146
 
158
- const actionsThatWouldAuthorizeDelete = [];
147
+ const actionsThatWouldAuthorizeDelete: ProtocolAction[] = [];
159
148
  const prune = recordsDelete.message.descriptor.prune;
160
149
  if (prune) {
161
150
  actionsThatWouldAuthorizeDelete.push(ProtocolAction.CoPrune);
@@ -174,6 +163,7 @@ export async function getActionsSeekingARuleMatch(
174
163
  }
175
164
 
176
165
  return actionsThatWouldAuthorizeDelete;
166
+ }
177
167
 
178
168
  case DwnMethodName.Count:
179
169
  return [ProtocolAction.Read];
@@ -187,7 +177,7 @@ export async function getActionsSeekingARuleMatch(
187
177
  case DwnMethodName.Subscribe:
188
178
  return [ProtocolAction.Read];
189
179
 
190
- case DwnMethodName.Write:
180
+ case DwnMethodName.Write: {
191
181
  const incomingRecordsWrite = incomingMessage as RecordsWrite;
192
182
 
193
183
  if (await incomingRecordsWrite.isInitialWrite()) {
@@ -201,7 +191,7 @@ export async function getActionsSeekingARuleMatch(
201
191
  // else incoming RecordsWrite not an initial write
202
192
 
203
193
  const recordId = (incomingMessage as RecordsWrite).message.recordId;
204
- const initialWrite = await RecordsWrite.fetchInitialRecordsWrite(messageStore, tenant, recordId);
194
+ const initialWrite = await validationStateReader.fetchInitialRecordsWrite(tenant, recordId);
205
195
 
206
196
  // if there is no initial write to update from, then no action rule can authorize the incoming message
207
197
  if (initialWrite === undefined) {
@@ -217,6 +207,7 @@ export async function getActionsSeekingARuleMatch(
217
207
  }
218
208
  }
219
209
  }
210
+ }
220
211
 
221
212
  // purely defensive programming: should not be reachable
222
213
  // setting to empty array will prevent any message from being authorized
@@ -233,11 +224,11 @@ export async function authorizeAgainstAllowedActions(
233
224
  incomingMessage: RecordsCount | RecordsDelete | RecordsQuery | RecordsRead | RecordsSubscribe | RecordsWrite,
234
225
  ruleSet: ProtocolRuleSet,
235
226
  recordChain: RecordsWriteMessage[],
236
- messageStore: MessageStore,
227
+ validationStateReader: ValidationStateReader,
237
228
  protocolDefinition?: ProtocolDefinition,
238
229
  ): Promise<void> {
239
230
  const incomingMessageMethod = incomingMessage.message.descriptor.method;
240
- const actionsSeekingARuleMatch = await getActionsSeekingARuleMatch(tenant, incomingMessage, messageStore);
231
+ const actionsSeekingARuleMatch = await getActionsSeekingARuleMatch(tenant, incomingMessage, validationStateReader);
241
232
  const author = incomingMessage.author;
242
233
  const actionRules = ruleSet.$actions;
243
234