@enbox/dwn-sdk-js 0.3.9 → 0.4.1

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 (525) hide show
  1. package/README.md +4 -4
  2. package/dist/browser.mjs +11 -11
  3. package/dist/browser.mjs.map +4 -4
  4. package/dist/esm/generated/precompiled-validators.js +783 -1206
  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 +13 -7
  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 -61
  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 +31 -69
  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 +295 -0
  28. package/dist/esm/src/core/replication-apply.js.map +1 -0
  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 +261 -16
  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 +7 -8
  64. package/dist/esm/src/index.js.map +1 -1
  65. package/dist/esm/src/interfaces/messages-query.js +49 -0
  66. package/dist/esm/src/interfaces/messages-query.js.map +1 -0
  67. package/dist/esm/src/interfaces/protocols-configure.js +7 -3
  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/record-limit-occupancy.js +244 -0
  99. package/dist/esm/src/utils/record-limit-occupancy.js.map +1 -0
  100. package/dist/esm/src/utils/records.js +50 -14
  101. package/dist/esm/src/utils/records.js.map +1 -1
  102. package/dist/esm/src/utils/replication.js +85 -0
  103. package/dist/esm/src/utils/replication.js.map +1 -0
  104. package/dist/esm/tests/core/grant-authorization.spec.js +4 -4
  105. package/dist/esm/tests/core/grant-authorization.spec.js.map +1 -1
  106. package/dist/esm/tests/core/process-message-parity.spec.js +222 -0
  107. package/dist/esm/tests/core/process-message-parity.spec.js.map +1 -0
  108. package/dist/esm/tests/core/protocol-authorization.spec.js +5 -2
  109. package/dist/esm/tests/core/protocol-authorization.spec.js.map +1 -1
  110. package/dist/esm/tests/core/records-grant-authorization.spec.js +5 -5
  111. package/dist/esm/tests/core/records-grant-authorization.spec.js.map +1 -1
  112. package/dist/esm/tests/core/replication-apply.spec.js +274 -0
  113. package/dist/esm/tests/core/replication-apply.spec.js.map +1 -0
  114. package/dist/esm/tests/core/replication-replay-property.spec.js +350 -0
  115. package/dist/esm/tests/core/replication-replay-property.spec.js.map +1 -0
  116. package/dist/esm/tests/core/validation-read-closure.spec.js +469 -0
  117. package/dist/esm/tests/core/validation-read-closure.spec.js.map +1 -0
  118. package/dist/esm/tests/core/validation-state-reader.spec.js +716 -0
  119. package/dist/esm/tests/core/validation-state-reader.spec.js.map +1 -0
  120. package/dist/esm/tests/durable-event-log.spec.js +373 -0
  121. package/dist/esm/tests/durable-event-log.spec.js.map +1 -0
  122. package/dist/esm/tests/dwn.spec.js +620 -14
  123. package/dist/esm/tests/dwn.spec.js.map +1 -1
  124. package/dist/esm/tests/features/author-delegated-grant.spec.js +9 -6
  125. package/dist/esm/tests/features/author-delegated-grant.spec.js.map +1 -1
  126. package/dist/esm/tests/features/owner-delegated-grant.spec.js +1 -4
  127. package/dist/esm/tests/features/owner-delegated-grant.spec.js.map +1 -1
  128. package/dist/esm/tests/features/owner-signature.spec.js +1 -4
  129. package/dist/esm/tests/features/owner-signature.spec.js.map +1 -1
  130. package/dist/esm/tests/features/permissions.spec.js +165 -4
  131. package/dist/esm/tests/features/permissions.spec.js.map +1 -1
  132. package/dist/esm/tests/features/protocol-composition.spec.js +8 -11
  133. package/dist/esm/tests/features/protocol-composition.spec.js.map +1 -1
  134. package/dist/esm/tests/features/protocol-create-action.spec.js +1 -4
  135. package/dist/esm/tests/features/protocol-create-action.spec.js.map +1 -1
  136. package/dist/esm/tests/features/protocol-delete-action.spec.js +3 -5
  137. package/dist/esm/tests/features/protocol-delete-action.spec.js.map +1 -1
  138. package/dist/esm/tests/features/protocol-update-action.spec.js +3 -6
  139. package/dist/esm/tests/features/protocol-update-action.spec.js.map +1 -1
  140. package/dist/esm/tests/features/records-delivery.spec.js +1 -4
  141. package/dist/esm/tests/features/records-delivery.spec.js.map +1 -1
  142. package/dist/esm/tests/features/records-immutable.spec.js +1 -4
  143. package/dist/esm/tests/features/records-immutable.spec.js.map +1 -1
  144. package/dist/esm/tests/features/records-nested-query-scope.spec.js +281 -0
  145. package/dist/esm/tests/features/records-nested-query-scope.spec.js.map +1 -0
  146. package/dist/esm/tests/features/records-prune-cross-protocol.spec.js +3 -7
  147. package/dist/esm/tests/features/records-prune-cross-protocol.spec.js.map +1 -1
  148. package/dist/esm/tests/features/records-prune.spec.js +11 -22
  149. package/dist/esm/tests/features/records-prune.spec.js.map +1 -1
  150. package/dist/esm/tests/features/records-record-limit.spec.js +441 -231
  151. package/dist/esm/tests/features/records-record-limit.spec.js.map +1 -1
  152. package/dist/esm/tests/features/records-squash.spec.js +6 -4
  153. package/dist/esm/tests/features/records-squash.spec.js.map +1 -1
  154. package/dist/esm/tests/features/records-tags.spec.js +1 -4
  155. package/dist/esm/tests/features/records-tags.spec.js.map +1 -1
  156. package/dist/esm/tests/features/resumable-tasks.spec.js +3 -5
  157. package/dist/esm/tests/features/resumable-tasks.spec.js.map +1 -1
  158. package/dist/esm/tests/fuzz/message-store.fuzz.spec.js +1 -2
  159. package/dist/esm/tests/fuzz/message-store.fuzz.spec.js.map +1 -1
  160. package/dist/esm/tests/fuzz/process-message.fuzz.spec.js +2 -4
  161. package/dist/esm/tests/fuzz/process-message.fuzz.spec.js.map +1 -1
  162. package/dist/esm/tests/fuzz/schema-validation.fuzz.spec.js +1 -1
  163. package/dist/esm/tests/fuzz/schema-validation.fuzz.spec.js.map +1 -1
  164. package/dist/esm/tests/handlers/messages-query.spec.js +246 -0
  165. package/dist/esm/tests/handlers/messages-query.spec.js.map +1 -0
  166. package/dist/esm/tests/handlers/messages-read.spec.js +2 -5
  167. package/dist/esm/tests/handlers/messages-read.spec.js.map +1 -1
  168. package/dist/esm/tests/handlers/messages-subscribe.spec.js +3 -14
  169. package/dist/esm/tests/handlers/messages-subscribe.spec.js.map +1 -1
  170. package/dist/esm/tests/handlers/protocols-configure.spec.js +27 -26
  171. package/dist/esm/tests/handlers/protocols-configure.spec.js.map +1 -1
  172. package/dist/esm/tests/handlers/protocols-query.spec.js +1 -4
  173. package/dist/esm/tests/handlers/protocols-query.spec.js.map +1 -1
  174. package/dist/esm/tests/handlers/records-count.spec.js +1 -4
  175. package/dist/esm/tests/handlers/records-count.spec.js.map +1 -1
  176. package/dist/esm/tests/handlers/records-delete.spec.js +312 -30
  177. package/dist/esm/tests/handlers/records-delete.spec.js.map +1 -1
  178. package/dist/esm/tests/handlers/records-query.spec.js +32 -9
  179. package/dist/esm/tests/handlers/records-query.spec.js.map +1 -1
  180. package/dist/esm/tests/handlers/records-read.spec.js +4 -4
  181. package/dist/esm/tests/handlers/records-read.spec.js.map +1 -1
  182. package/dist/esm/tests/handlers/records-subscribe.spec.js +33 -14
  183. package/dist/esm/tests/handlers/records-subscribe.spec.js.map +1 -1
  184. package/dist/esm/tests/handlers/records-write.spec.js +84 -38
  185. package/dist/esm/tests/handlers/records-write.spec.js.map +1 -1
  186. package/dist/esm/tests/interfaces/records-delete.spec.js +69 -2
  187. package/dist/esm/tests/interfaces/records-delete.spec.js.map +1 -1
  188. package/dist/esm/tests/interfaces/records-write.spec.js +4 -3
  189. package/dist/esm/tests/interfaces/records-write.spec.js.map +1 -1
  190. package/dist/esm/tests/protocols/permissions.spec.js +55 -6
  191. package/dist/esm/tests/protocols/permissions.spec.js.map +1 -1
  192. package/dist/esm/tests/scenarios/aggregator.spec.js +1 -4
  193. package/dist/esm/tests/scenarios/aggregator.spec.js.map +1 -1
  194. package/dist/esm/tests/scenarios/deleted-record.spec.js +1 -4
  195. package/dist/esm/tests/scenarios/deleted-record.spec.js.map +1 -1
  196. package/dist/esm/tests/scenarios/end-to-end-tests.spec.js +1 -4
  197. package/dist/esm/tests/scenarios/end-to-end-tests.spec.js.map +1 -1
  198. package/dist/esm/tests/scenarios/nested-roles.spec.js +1 -4
  199. package/dist/esm/tests/scenarios/nested-roles.spec.js.map +1 -1
  200. package/dist/esm/tests/scenarios/subscriptions.spec.js +1 -4
  201. package/dist/esm/tests/scenarios/subscriptions.spec.js.map +1 -1
  202. package/dist/esm/tests/store/message-store-level.spec.js +361 -5
  203. package/dist/esm/tests/store/message-store-level.spec.js.map +1 -1
  204. package/dist/esm/tests/store/message-store.spec.js +60 -0
  205. package/dist/esm/tests/store/message-store.spec.js.map +1 -1
  206. package/dist/esm/tests/test-event-stream.js +7 -3
  207. package/dist/esm/tests/test-event-stream.js.map +1 -1
  208. package/dist/esm/tests/test-stores.js +19 -9
  209. package/dist/esm/tests/test-stores.js.map +1 -1
  210. package/dist/esm/tests/test-suite.js +4 -4
  211. package/dist/esm/tests/test-suite.js.map +1 -1
  212. package/dist/esm/tests/utils/test-data-generator.js +25 -0
  213. package/dist/esm/tests/utils/test-data-generator.js.map +1 -1
  214. package/dist/esm/tests/utils/test-stub-generator.js.map +1 -1
  215. package/dist/esm/tests/utils/test-validation-state-reader.js +16 -0
  216. package/dist/esm/tests/utils/test-validation-state-reader.js.map +1 -0
  217. package/dist/types/generated/precompiled-validators.d.ts +6 -6
  218. package/dist/types/generated/precompiled-validators.d.ts.map +1 -1
  219. package/dist/types/src/core/core-protocol.d.ts +3 -3
  220. package/dist/types/src/core/core-protocol.d.ts.map +1 -1
  221. package/dist/types/src/core/dwn-constant.d.ts +5 -0
  222. package/dist/types/src/core/dwn-constant.d.ts.map +1 -1
  223. package/dist/types/src/core/dwn-error.d.ts +13 -7
  224. package/dist/types/src/core/dwn-error.d.ts.map +1 -1
  225. package/dist/types/src/core/grant-authorization.d.ts +5 -5
  226. package/dist/types/src/core/grant-authorization.d.ts.map +1 -1
  227. package/dist/types/src/core/message-reply.d.ts +5 -4
  228. package/dist/types/src/core/message-reply.d.ts.map +1 -1
  229. package/dist/types/src/core/messages-grant-authorization.d.ts +12 -15
  230. package/dist/types/src/core/messages-grant-authorization.d.ts.map +1 -1
  231. package/dist/types/src/core/protocol-authorization-action.d.ts +4 -5
  232. package/dist/types/src/core/protocol-authorization-action.d.ts.map +1 -1
  233. package/dist/types/src/core/protocol-authorization-validation.d.ts +13 -16
  234. package/dist/types/src/core/protocol-authorization-validation.d.ts.map +1 -1
  235. package/dist/types/src/core/protocol-authorization.d.ts +8 -33
  236. package/dist/types/src/core/protocol-authorization.d.ts.map +1 -1
  237. package/dist/types/src/core/protocols-grant-authorization.d.ts +4 -4
  238. package/dist/types/src/core/protocols-grant-authorization.d.ts.map +1 -1
  239. package/dist/types/src/core/recording-validation-state-reader.d.ts +75 -0
  240. package/dist/types/src/core/recording-validation-state-reader.d.ts.map +1 -0
  241. package/dist/types/src/core/records-grant-authorization.d.ts +8 -8
  242. package/dist/types/src/core/records-grant-authorization.d.ts.map +1 -1
  243. package/dist/types/src/core/replication-apply.d.ts +129 -0
  244. package/dist/types/src/core/replication-apply.d.ts.map +1 -0
  245. package/dist/types/src/core/resumable-task-manager.d.ts +1 -1
  246. package/dist/types/src/core/resumable-task-manager.d.ts.map +1 -1
  247. package/dist/types/src/core/validation-state-reader.d.ts +79 -0
  248. package/dist/types/src/core/validation-state-reader.d.ts.map +1 -0
  249. package/dist/types/src/dwn.d.ts +47 -13
  250. package/dist/types/src/dwn.d.ts.map +1 -1
  251. package/dist/types/src/enums/dwn-interface-method.d.ts +0 -1
  252. package/dist/types/src/enums/dwn-interface-method.d.ts.map +1 -1
  253. package/dist/types/src/event-stream/durable-event-log.d.ts +69 -0
  254. package/dist/types/src/event-stream/durable-event-log.d.ts.map +1 -0
  255. package/dist/types/src/event-stream/event-emitter-wake-publisher.d.ts +13 -0
  256. package/dist/types/src/event-stream/event-emitter-wake-publisher.d.ts.map +1 -0
  257. package/dist/types/src/handlers/messages-query.d.ts +20 -0
  258. package/dist/types/src/handlers/messages-query.d.ts.map +1 -0
  259. package/dist/types/src/handlers/messages-read.d.ts +1 -1
  260. package/dist/types/src/handlers/messages-read.d.ts.map +1 -1
  261. package/dist/types/src/handlers/messages-subscribe.d.ts.map +1 -1
  262. package/dist/types/src/handlers/protocols-configure.d.ts +0 -5
  263. package/dist/types/src/handlers/protocols-configure.d.ts.map +1 -1
  264. package/dist/types/src/handlers/records-count.d.ts +2 -1
  265. package/dist/types/src/handlers/records-count.d.ts.map +1 -1
  266. package/dist/types/src/handlers/records-delete.d.ts +2 -2
  267. package/dist/types/src/handlers/records-delete.d.ts.map +1 -1
  268. package/dist/types/src/handlers/records-query.d.ts +1 -1
  269. package/dist/types/src/handlers/records-query.d.ts.map +1 -1
  270. package/dist/types/src/handlers/records-read.d.ts +2 -1
  271. package/dist/types/src/handlers/records-read.d.ts.map +1 -1
  272. package/dist/types/src/handlers/records-subscribe.d.ts +4 -5
  273. package/dist/types/src/handlers/records-subscribe.d.ts.map +1 -1
  274. package/dist/types/src/handlers/records-write.d.ts +3 -11
  275. package/dist/types/src/handlers/records-write.d.ts.map +1 -1
  276. package/dist/types/src/index.d.ts +16 -18
  277. package/dist/types/src/index.d.ts.map +1 -1
  278. package/dist/types/src/interfaces/messages-query.d.ts +23 -0
  279. package/dist/types/src/interfaces/messages-query.d.ts.map +1 -0
  280. package/dist/types/src/interfaces/protocols-configure.d.ts +3 -3
  281. package/dist/types/src/interfaces/protocols-configure.d.ts.map +1 -1
  282. package/dist/types/src/interfaces/protocols-query.d.ts +2 -2
  283. package/dist/types/src/interfaces/protocols-query.d.ts.map +1 -1
  284. package/dist/types/src/interfaces/records-count.d.ts +3 -3
  285. package/dist/types/src/interfaces/records-count.d.ts.map +1 -1
  286. package/dist/types/src/interfaces/records-delete.d.ts +11 -3
  287. package/dist/types/src/interfaces/records-delete.d.ts.map +1 -1
  288. package/dist/types/src/interfaces/records-query.d.ts +3 -3
  289. package/dist/types/src/interfaces/records-query.d.ts.map +1 -1
  290. package/dist/types/src/interfaces/records-read.d.ts +3 -3
  291. package/dist/types/src/interfaces/records-read.d.ts.map +1 -1
  292. package/dist/types/src/interfaces/records-subscribe.d.ts +3 -3
  293. package/dist/types/src/interfaces/records-subscribe.d.ts.map +1 -1
  294. package/dist/types/src/interfaces/records-write.d.ts +15 -7
  295. package/dist/types/src/interfaces/records-write.d.ts.map +1 -1
  296. package/dist/types/src/protocols/permissions.d.ts +9 -12
  297. package/dist/types/src/protocols/permissions.d.ts.map +1 -1
  298. package/dist/types/src/store/index-level.d.ts +10 -1
  299. package/dist/types/src/store/index-level.d.ts.map +1 -1
  300. package/dist/types/src/store/level-wrapper.d.ts +5 -0
  301. package/dist/types/src/store/level-wrapper.d.ts.map +1 -1
  302. package/dist/types/src/store/message-store-level.d.ts +94 -14
  303. package/dist/types/src/store/message-store-level.d.ts.map +1 -1
  304. package/dist/types/src/store/storage-controller.d.ts +17 -14
  305. package/dist/types/src/store/storage-controller.d.ts.map +1 -1
  306. package/dist/types/src/types/message-store.d.ts +29 -1
  307. package/dist/types/src/types/message-store.d.ts.map +1 -1
  308. package/dist/types/src/types/message-types.d.ts +2 -0
  309. package/dist/types/src/types/message-types.d.ts.map +1 -1
  310. package/dist/types/src/types/messages-types.d.ts +21 -55
  311. package/dist/types/src/types/messages-types.d.ts.map +1 -1
  312. package/dist/types/src/types/method-handler.d.ts +2 -2
  313. package/dist/types/src/types/method-handler.d.ts.map +1 -1
  314. package/dist/types/src/types/permission-types.d.ts +1 -1
  315. package/dist/types/src/types/subscriptions.d.ts +50 -39
  316. package/dist/types/src/types/subscriptions.d.ts.map +1 -1
  317. package/dist/types/src/types/validation-state-reader.d.ts +116 -0
  318. package/dist/types/src/types/validation-state-reader.d.ts.map +1 -0
  319. package/dist/types/src/utils/messages.d.ts +10 -0
  320. package/dist/types/src/utils/messages.d.ts.map +1 -1
  321. package/dist/types/src/utils/record-limit-occupancy.d.ts +40 -0
  322. package/dist/types/src/utils/record-limit-occupancy.d.ts.map +1 -0
  323. package/dist/types/src/utils/records.d.ts +25 -3
  324. package/dist/types/src/utils/records.d.ts.map +1 -1
  325. package/dist/types/src/utils/replication.d.ts +22 -0
  326. package/dist/types/src/utils/replication.d.ts.map +1 -0
  327. package/dist/types/tests/core/process-message-parity.spec.d.ts +2 -0
  328. package/dist/types/tests/core/process-message-parity.spec.d.ts.map +1 -0
  329. package/dist/types/tests/core/replication-apply.spec.d.ts +2 -0
  330. package/dist/types/tests/core/replication-apply.spec.d.ts.map +1 -0
  331. package/dist/types/tests/core/replication-replay-property.spec.d.ts +2 -0
  332. package/dist/types/tests/core/replication-replay-property.spec.d.ts.map +1 -0
  333. package/dist/types/tests/core/validation-read-closure.spec.d.ts +2 -0
  334. package/dist/types/tests/core/validation-read-closure.spec.d.ts.map +1 -0
  335. package/dist/types/tests/core/validation-state-reader.spec.d.ts +2 -0
  336. package/dist/types/tests/core/validation-state-reader.spec.d.ts.map +1 -0
  337. package/dist/types/tests/durable-event-log.spec.d.ts +2 -0
  338. package/dist/types/tests/durable-event-log.spec.d.ts.map +1 -0
  339. package/dist/types/tests/dwn.spec.d.ts.map +1 -1
  340. package/dist/types/tests/features/author-delegated-grant.spec.d.ts.map +1 -1
  341. package/dist/types/tests/features/owner-delegated-grant.spec.d.ts.map +1 -1
  342. package/dist/types/tests/features/owner-signature.spec.d.ts.map +1 -1
  343. package/dist/types/tests/features/permissions.spec.d.ts.map +1 -1
  344. package/dist/types/tests/features/protocol-composition.spec.d.ts.map +1 -1
  345. package/dist/types/tests/features/protocol-create-action.spec.d.ts.map +1 -1
  346. package/dist/types/tests/features/protocol-delete-action.spec.d.ts.map +1 -1
  347. package/dist/types/tests/features/protocol-update-action.spec.d.ts.map +1 -1
  348. package/dist/types/tests/features/records-delivery.spec.d.ts.map +1 -1
  349. package/dist/types/tests/features/records-immutable.spec.d.ts.map +1 -1
  350. package/dist/types/tests/features/records-nested-query-scope.spec.d.ts +2 -0
  351. package/dist/types/tests/features/records-nested-query-scope.spec.d.ts.map +1 -0
  352. package/dist/types/tests/features/records-prune-cross-protocol.spec.d.ts.map +1 -1
  353. package/dist/types/tests/features/records-prune.spec.d.ts.map +1 -1
  354. package/dist/types/tests/features/records-record-limit.spec.d.ts.map +1 -1
  355. package/dist/types/tests/features/records-squash.spec.d.ts.map +1 -1
  356. package/dist/types/tests/features/records-tags.spec.d.ts.map +1 -1
  357. package/dist/types/tests/features/resumable-tasks.spec.d.ts.map +1 -1
  358. package/dist/types/tests/handlers/messages-query.spec.d.ts +2 -0
  359. package/dist/types/tests/handlers/messages-query.spec.d.ts.map +1 -0
  360. package/dist/types/tests/handlers/messages-read.spec.d.ts.map +1 -1
  361. package/dist/types/tests/handlers/messages-subscribe.spec.d.ts.map +1 -1
  362. package/dist/types/tests/handlers/protocols-configure.spec.d.ts.map +1 -1
  363. package/dist/types/tests/handlers/protocols-query.spec.d.ts.map +1 -1
  364. package/dist/types/tests/handlers/records-count.spec.d.ts.map +1 -1
  365. package/dist/types/tests/handlers/records-delete.spec.d.ts.map +1 -1
  366. package/dist/types/tests/handlers/records-query.spec.d.ts.map +1 -1
  367. package/dist/types/tests/handlers/records-read.spec.d.ts.map +1 -1
  368. package/dist/types/tests/handlers/records-subscribe.spec.d.ts.map +1 -1
  369. package/dist/types/tests/handlers/records-write.spec.d.ts.map +1 -1
  370. package/dist/types/tests/scenarios/deleted-record.spec.d.ts.map +1 -1
  371. package/dist/types/tests/scenarios/end-to-end-tests.spec.d.ts.map +1 -1
  372. package/dist/types/tests/scenarios/nested-roles.spec.d.ts.map +1 -1
  373. package/dist/types/tests/scenarios/subscriptions.spec.d.ts.map +1 -1
  374. package/dist/types/tests/store/message-store.spec.d.ts.map +1 -1
  375. package/dist/types/tests/test-event-stream.d.ts +1 -1
  376. package/dist/types/tests/test-event-stream.d.ts.map +1 -1
  377. package/dist/types/tests/test-stores.d.ts +5 -4
  378. package/dist/types/tests/test-stores.d.ts.map +1 -1
  379. package/dist/types/tests/test-suite.d.ts +1 -2
  380. package/dist/types/tests/test-suite.d.ts.map +1 -1
  381. package/dist/types/tests/utils/test-data-generator.d.ts +20 -1
  382. package/dist/types/tests/utils/test-data-generator.d.ts.map +1 -1
  383. package/dist/types/tests/utils/test-validation-state-reader.d.ts +15 -0
  384. package/dist/types/tests/utils/test-validation-state-reader.d.ts.map +1 -0
  385. package/package.json +2 -2
  386. package/src/core/core-protocol.ts +3 -3
  387. package/src/core/dwn-constant.ts +7 -1
  388. package/src/core/dwn-error.ts +13 -7
  389. package/src/core/grant-authorization.ts +11 -20
  390. package/src/core/message-reply.ts +6 -5
  391. package/src/core/messages-grant-authorization.ts +37 -100
  392. package/src/core/protocol-authorization-action.ts +29 -38
  393. package/src/core/protocol-authorization-validation.ts +41 -98
  394. package/src/core/protocol-authorization.ts +56 -202
  395. package/src/core/protocols-grant-authorization.ts +9 -9
  396. package/src/core/recording-validation-state-reader.ts +130 -0
  397. package/src/core/records-grant-authorization.ts +16 -16
  398. package/src/core/replication-apply.ts +412 -0
  399. package/src/core/resumable-task-manager.ts +10 -8
  400. package/src/core/validation-state-reader.ts +350 -0
  401. package/src/dwn.ts +417 -30
  402. package/src/enums/dwn-interface-method.ts +0 -1
  403. package/src/event-stream/durable-event-log.ts +509 -0
  404. package/src/event-stream/event-emitter-wake-publisher.ts +34 -0
  405. package/src/handlers/messages-query.ts +203 -0
  406. package/src/handlers/messages-read.ts +9 -10
  407. package/src/handlers/messages-subscribe.ts +12 -13
  408. package/src/handlers/protocols-configure.ts +37 -58
  409. package/src/handlers/protocols-query.ts +1 -1
  410. package/src/handlers/records-count.ts +24 -17
  411. package/src/handlers/records-delete.ts +29 -27
  412. package/src/handlers/records-query.ts +38 -17
  413. package/src/handlers/records-read.ts +63 -50
  414. package/src/handlers/records-subscribe.ts +132 -19
  415. package/src/handlers/records-write.ts +77 -168
  416. package/src/index.ts +16 -20
  417. package/src/interfaces/messages-query.ts +70 -0
  418. package/src/interfaces/protocols-configure.ts +12 -4
  419. package/src/interfaces/protocols-query.ts +4 -5
  420. package/src/interfaces/records-count.ts +9 -4
  421. package/src/interfaces/records-delete.ts +25 -5
  422. package/src/interfaces/records-query.ts +9 -4
  423. package/src/interfaces/records-read.ts +4 -4
  424. package/src/interfaces/records-subscribe.ts +9 -4
  425. package/src/interfaces/records-write.ts +41 -13
  426. package/src/protocols/permissions.ts +32 -52
  427. package/src/store/index-level.ts +30 -9
  428. package/src/store/level-wrapper.ts +9 -1
  429. package/src/store/message-store-level.ts +757 -47
  430. package/src/store/storage-controller.ts +74 -63
  431. package/src/types/message-store.ts +45 -2
  432. package/src/types/message-types.ts +3 -1
  433. package/src/types/messages-types.ts +26 -65
  434. package/src/types/method-handler.ts +3 -3
  435. package/src/types/permission-types.ts +1 -1
  436. package/src/types/subscriptions.ts +53 -42
  437. package/src/types/validation-state-reader.ts +127 -0
  438. package/src/utils/messages.ts +25 -1
  439. package/src/utils/record-limit-occupancy.ts +377 -0
  440. package/src/utils/records.ts +69 -13
  441. package/src/utils/replication.ts +122 -0
  442. package/dist/esm/src/core/record-chain.js +0 -64
  443. package/dist/esm/src/core/record-chain.js.map +0 -1
  444. package/dist/esm/src/event-stream/event-emitter-event-log.js +0 -334
  445. package/dist/esm/src/event-stream/event-emitter-event-log.js.map +0 -1
  446. package/dist/esm/src/handlers/messages-sync.js +0 -581
  447. package/dist/esm/src/handlers/messages-sync.js.map +0 -1
  448. package/dist/esm/src/interfaces/messages-sync.js +0 -54
  449. package/dist/esm/src/interfaces/messages-sync.js.map +0 -1
  450. package/dist/esm/src/smt/smt-store-level.js +0 -103
  451. package/dist/esm/src/smt/smt-store-level.js.map +0 -1
  452. package/dist/esm/src/smt/smt-store-memory.js +0 -41
  453. package/dist/esm/src/smt/smt-store-memory.js.map +0 -1
  454. package/dist/esm/src/smt/smt-utils.js +0 -129
  455. package/dist/esm/src/smt/smt-utils.js.map +0 -1
  456. package/dist/esm/src/smt/sparse-merkle-tree.js +0 -577
  457. package/dist/esm/src/smt/sparse-merkle-tree.js.map +0 -1
  458. package/dist/esm/src/state-index/state-index-level.js +0 -191
  459. package/dist/esm/src/state-index/state-index-level.js.map +0 -1
  460. package/dist/esm/src/sync/records-projection.js +0 -228
  461. package/dist/esm/src/sync/records-projection.js.map +0 -1
  462. package/dist/esm/src/types/smt-types.js +0 -5
  463. package/dist/esm/src/types/smt-types.js.map +0 -1
  464. package/dist/esm/src/types/state-index.js +0 -2
  465. package/dist/esm/src/types/state-index.js.map +0 -1
  466. package/dist/esm/tests/event-emitter-event-log.spec.js +0 -499
  467. package/dist/esm/tests/event-emitter-event-log.spec.js.map +0 -1
  468. package/dist/esm/tests/handlers/messages-sync.spec.js +0 -1771
  469. package/dist/esm/tests/handlers/messages-sync.spec.js.map +0 -1
  470. package/dist/esm/tests/smt/smt-store-level.spec.js +0 -132
  471. package/dist/esm/tests/smt/smt-store-level.spec.js.map +0 -1
  472. package/dist/esm/tests/smt/sparse-merkle-tree.spec.js +0 -732
  473. package/dist/esm/tests/smt/sparse-merkle-tree.spec.js.map +0 -1
  474. package/dist/esm/tests/state-index/state-index-level.spec.js +0 -245
  475. package/dist/esm/tests/state-index/state-index-level.spec.js.map +0 -1
  476. package/dist/esm/tests/sync/records-projection.spec.js +0 -245
  477. package/dist/esm/tests/sync/records-projection.spec.js.map +0 -1
  478. package/dist/types/src/core/record-chain.d.ts +0 -24
  479. package/dist/types/src/core/record-chain.d.ts.map +0 -1
  480. package/dist/types/src/event-stream/event-emitter-event-log.d.ts +0 -80
  481. package/dist/types/src/event-stream/event-emitter-event-log.d.ts.map +0 -1
  482. package/dist/types/src/handlers/messages-sync.d.ts +0 -83
  483. package/dist/types/src/handlers/messages-sync.d.ts.map +0 -1
  484. package/dist/types/src/interfaces/messages-sync.d.ts +0 -23
  485. package/dist/types/src/interfaces/messages-sync.d.ts.map +0 -1
  486. package/dist/types/src/smt/smt-store-level.d.ts +0 -32
  487. package/dist/types/src/smt/smt-store-level.d.ts.map +0 -1
  488. package/dist/types/src/smt/smt-store-memory.d.ts +0 -22
  489. package/dist/types/src/smt/smt-store-memory.d.ts.map +0 -1
  490. package/dist/types/src/smt/smt-utils.d.ts +0 -58
  491. package/dist/types/src/smt/smt-utils.d.ts.map +0 -1
  492. package/dist/types/src/smt/sparse-merkle-tree.d.ts +0 -124
  493. package/dist/types/src/smt/sparse-merkle-tree.d.ts.map +0 -1
  494. package/dist/types/src/state-index/state-index-level.d.ts +0 -83
  495. package/dist/types/src/state-index/state-index-level.d.ts.map +0 -1
  496. package/dist/types/src/sync/records-projection.d.ts +0 -98
  497. package/dist/types/src/sync/records-projection.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/dist/types/tests/sync/records-projection.spec.d.ts +0 -2
  513. package/dist/types/tests/sync/records-projection.spec.d.ts.map +0 -1
  514. package/src/core/record-chain.ts +0 -99
  515. package/src/event-stream/event-emitter-event-log.ts +0 -430
  516. package/src/handlers/messages-sync.ts +0 -896
  517. package/src/interfaces/messages-sync.ts +0 -86
  518. package/src/smt/smt-store-level.ts +0 -143
  519. package/src/smt/smt-store-memory.ts +0 -53
  520. package/src/smt/smt-utils.ts +0 -149
  521. package/src/smt/sparse-merkle-tree.ts +0 -698
  522. package/src/state-index/state-index-level.ts +0 -239
  523. package/src/sync/records-projection.ts +0 -328
  524. package/src/types/smt-types.ts +0 -95
  525. package/src/types/state-index.ts +0 -100
@@ -0,0 +1,203 @@
1
+ import type { EventLogEntry, ProgressGapInfo, ReplicationFeedReader } from '../types/subscriptions.js';
2
+ import type { Filter, KeyValues } from '../types/query-types.js';
3
+ import type { HandlerDependencies, MethodHandler } from '../types/method-handler.js';
4
+ import type { MessagesFilter, MessagesQueryMessage, MessagesQueryReply, MessagesQueryReplyEntry } from '../types/messages-types.js';
5
+
6
+ import { authenticate } from '../core/auth.js';
7
+ import { Message } from '../core/message.js';
8
+ import { messageReplyFromError } from '../core/message-reply.js';
9
+ import { Messages } from '../utils/messages.js';
10
+ import { MessagesGrantAuthorization } from '../core/messages-grant-authorization.js';
11
+ import { MessagesQuery } from '../interfaces/messages-query.js';
12
+ import { PermissionsProtocol } from '../protocols/permissions.js';
13
+ import { Replication } from '../utils/replication.js';
14
+ import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
15
+
16
+ export class MessagesQueryHandler implements MethodHandler {
17
+
18
+ constructor(private readonly deps: HandlerDependencies) { }
19
+
20
+ public async handle({ tenant, message }: { tenant: string, message: MessagesQueryMessage }): Promise<MessagesQueryReply> {
21
+ let messagesQuery: MessagesQuery;
22
+ try {
23
+ messagesQuery = await MessagesQuery.parse(message);
24
+ } catch (e) {
25
+ return messageReplyFromError(e, 400);
26
+ }
27
+
28
+ try {
29
+ await authenticate(message.authorization, this.deps.didResolver);
30
+ await this.authorizeMessagesQuery(tenant, messagesQuery);
31
+ } catch (e) {
32
+ return messageReplyFromError(e, 401);
33
+ }
34
+
35
+ const replicationFeedReader = MessagesQueryHandler.asReplicationFeedReader(this.deps.messageStore);
36
+ if (replicationFeedReader === undefined) {
37
+ return {
38
+ status: {
39
+ code : 501,
40
+ detail : `${DwnErrorCode.MessagesQueryReplicationFeedUnimplemented}: MessagesQuery requires a replication feed reader`,
41
+ }
42
+ };
43
+ }
44
+
45
+ try {
46
+ const filters = MessagesQueryHandler.convertFilters(message.descriptor.filters, this.deps);
47
+ const result = await replicationFeedReader.logRead(tenant, {
48
+ cursor : message.descriptor.cursor,
49
+ filters,
50
+ limit : message.descriptor.limit,
51
+ });
52
+
53
+ const reply: MessagesQueryReply = {
54
+ status : { code: 200, detail: 'OK' },
55
+ entries : await MessagesQueryHandler.buildEntries(result.events, message.descriptor.cidsOnly ?? false),
56
+ cursor : result.cursor,
57
+ drained : result.drained,
58
+ };
59
+
60
+ const fingerprintScopes = MessagesQueryHandler.computeFingerprintScopes(message.descriptor.filters);
61
+ if (fingerprintScopes !== undefined) {
62
+ reply.fingerprint = await replicationFeedReader.fingerprint(tenant, fingerprintScopes);
63
+ }
64
+
65
+ return reply;
66
+ } catch (e) {
67
+ if (e instanceof DwnError && e.code === DwnErrorCode.EventLogProgressGap) {
68
+ const gapInfo = MessagesQueryHandler.getProgressGapInfo(e);
69
+ return {
70
+ status : { code: 410, detail: 'Progress token gap' },
71
+ error : gapInfo === undefined ? undefined : { code: 'ProgressGap', ...gapInfo },
72
+ };
73
+ }
74
+
75
+ return messageReplyFromError(e, 500);
76
+ }
77
+ }
78
+
79
+ private async authorizeMessagesQuery(
80
+ tenant: string,
81
+ messagesQuery: MessagesQuery,
82
+ ): Promise<void> {
83
+ if (messagesQuery.author === tenant) {
84
+ return;
85
+ }
86
+
87
+ const permissionGrantIds = Message.getPermissionGrantIds(messagesQuery.signaturePayload!);
88
+ if (messagesQuery.author !== undefined && permissionGrantIds.length > 0) {
89
+ const permissionGrants = await MessagesGrantAuthorization.fetchPermissionGrants(
90
+ tenant,
91
+ this.deps.validationStateReader,
92
+ permissionGrantIds
93
+ );
94
+ await MessagesGrantAuthorization.authorizeQueryOrSubscribe({
95
+ incomingMessage : messagesQuery.message,
96
+ expectedGrantor : tenant,
97
+ expectedGrantee : messagesQuery.author,
98
+ permissionGrants,
99
+ validationStateReader : this.deps.validationStateReader
100
+ });
101
+ return;
102
+ }
103
+
104
+ throw new DwnError(DwnErrorCode.MessagesQueryAuthorizationFailed, 'message failed authorization');
105
+ }
106
+
107
+ private static asReplicationFeedReader(candidate: unknown): ReplicationFeedReader | undefined {
108
+ const partial = candidate as Partial<ReplicationFeedReader>;
109
+ if (
110
+ typeof partial.logRead === 'function' &&
111
+ typeof partial.logBounds === 'function' &&
112
+ typeof partial.fingerprint === 'function' &&
113
+ typeof partial.epoch === 'function'
114
+ ) {
115
+ return partial as ReplicationFeedReader;
116
+ }
117
+ }
118
+
119
+ private static convertFilters(filters: MessagesFilter[], deps: HandlerDependencies): Filter[] | undefined {
120
+ if (filters.length === 0) {
121
+ return undefined;
122
+ }
123
+
124
+ return Messages.convertFilters(filters, deps.coreProtocols);
125
+ }
126
+
127
+ private static async buildEntries(
128
+ events: EventLogEntry[],
129
+ cidsOnly: boolean,
130
+ ): Promise<MessagesQueryReplyEntry[]> {
131
+ const entries: MessagesQueryReplyEntry[] = [];
132
+
133
+ for (const event of events) {
134
+ entries.push(await MessagesQueryHandler.buildEntry(event, cidsOnly));
135
+ }
136
+
137
+ return entries;
138
+ }
139
+
140
+ private static async buildEntry(
141
+ event: EventLogEntry,
142
+ cidsOnly: boolean,
143
+ ): Promise<MessagesQueryReplyEntry> {
144
+ const messageCid = event.messageCid ?? await Message.getCid(event.event.message);
145
+ const protocol = MessagesQueryHandler.getStringIndex(event.indexes, 'protocol');
146
+ const entry: MessagesQueryReplyEntry = {
147
+ seq : event.seq,
148
+ messageCid,
149
+ isLatestBaseState : MessagesQueryHandler.isLatestBaseState(event.indexes),
150
+ protocol,
151
+ };
152
+
153
+ if (cidsOnly) {
154
+ return entry;
155
+ }
156
+
157
+ const { message, encodedData } = Messages.detachEncodedData(event.event.message);
158
+ entry.message = message;
159
+ if (encodedData !== undefined) {
160
+ entry.encodedData = encodedData;
161
+ }
162
+
163
+ return entry;
164
+ }
165
+
166
+ private static getStringIndex(indexes: KeyValues, key: string): string | undefined {
167
+ const value = indexes[key];
168
+ return typeof value === 'string' ? value : undefined;
169
+ }
170
+
171
+ private static isLatestBaseState(indexes: KeyValues): boolean {
172
+ return indexes.isLatestBaseState === true || indexes.isLatestBaseState === 'true';
173
+ }
174
+
175
+ private static computeFingerprintScopes(filters: MessagesFilter[]): string[] | undefined {
176
+ if (filters.length === 0) {
177
+ return [Replication.globalDomain];
178
+ }
179
+
180
+ const protocols = new Set<string>();
181
+ for (const filter of filters) {
182
+ const keys = Object.keys(filter);
183
+ if (keys.length !== 1 || typeof filter.protocol !== 'string') {
184
+ return undefined;
185
+ }
186
+
187
+ protocols.add(filter.protocol);
188
+ }
189
+
190
+ const protocolList = [...protocols];
191
+ const scopes = protocolList.map(protocol => Replication.protocolDomain(protocol));
192
+ if (!protocols.has(PermissionsProtocol.uri)) {
193
+ scopes.push(...protocolList.map(protocol => Replication.permissionDomain(protocol)));
194
+ }
195
+
196
+ return scopes;
197
+ }
198
+
199
+ private static getProgressGapInfo(error: DwnError): ProgressGapInfo | undefined {
200
+ const gapInfo = (error as DwnError & { gapInfo?: ProgressGapInfo }).gapInfo;
201
+ return gapInfo;
202
+ }
203
+ }
@@ -1,5 +1,4 @@
1
1
  import type { GenericMessage } from '../types/message-types.js';
2
- import type { MessageStore } from '../types/message-store.js';
3
2
  import type { RecordsQueryReplyEntry } from '../types/records-types.js';
4
3
  import type { HandlerDependencies, MethodHandler } from '../types/method-handler.js';
5
4
  import type { MessagesReadMessage, MessagesReadReply, MessagesReadReplyEntry } from '../types/messages-types.js';
@@ -41,7 +40,7 @@ export class MessagesReadHandler implements MethodHandler {
41
40
  }
42
41
 
43
42
  try {
44
- await MessagesReadHandler.authorizeMessagesRead(tenant, messagesRead, messageResult, this.deps.messageStore);
43
+ await MessagesReadHandler.authorizeMessagesRead(tenant, messagesRead, messageResult, this.deps);
45
44
  } catch (error) {
46
45
  return messageReplyFromError(error, 401);
47
46
  }
@@ -72,13 +71,13 @@ export class MessagesReadHandler implements MethodHandler {
72
71
  }
73
72
 
74
73
  /**
75
- * @param messageStore Used to fetch related permission grant, permission revocation, and/or RecordsWrites for permission scope validation.
74
+ * @param deps Used to fetch related permission grant, permission revocation, and/or RecordsWrites for permission scope validation.
76
75
  */
77
76
  private static async authorizeMessagesRead(
78
77
  tenant: string,
79
78
  messagesRead: MessagesRead,
80
79
  matchedMessage: GenericMessage,
81
- messageStore: MessageStore
80
+ deps: HandlerDependencies
82
81
  ): Promise<void> {
83
82
 
84
83
  if (messagesRead.author === tenant) {
@@ -88,14 +87,14 @@ export class MessagesReadHandler implements MethodHandler {
88
87
 
89
88
  const permissionGrantIds = Message.getPermissionGrantIds(messagesRead.signaturePayload!);
90
89
  if (messagesRead.author !== undefined && permissionGrantIds.length > 0) {
91
- const permissionGrants = await MessagesGrantAuthorization.fetchPermissionGrants(tenant, messageStore, permissionGrantIds);
90
+ const permissionGrants = await MessagesGrantAuthorization.fetchPermissionGrants(tenant, deps.validationStateReader, permissionGrantIds);
92
91
  await MessagesGrantAuthorization.authorizeMessagesRead({
93
- messagesReadMessage : messagesRead.message,
94
- messageToRead : matchedMessage,
95
- expectedGrantor : tenant,
96
- expectedGrantee : messagesRead.author,
92
+ messagesReadMessage : messagesRead.message,
93
+ messageToRead : matchedMessage,
94
+ expectedGrantor : tenant,
95
+ expectedGrantee : messagesRead.author,
97
96
  permissionGrants,
98
- messageStore
97
+ validationStateReader : deps.validationStateReader
99
98
  });
100
99
  } else {
101
100
  throw new DwnError(DwnErrorCode.MessagesReadAuthorizationFailed, 'protocol message failed authorization');
@@ -1,4 +1,3 @@
1
- import type { MessageStore } from '../types/message-store.js';
2
1
  import type { PermissionGrant } from '../protocols/permission-grant.js';
3
2
  import type { EventSubscription, ProgressGapInfo, SubscriptionEvent, SubscriptionListener, SubscriptionMessage } from '../types/subscriptions.js';
4
3
  import type { HandlerDependencies, MethodHandler } from '../types/method-handler.js';
@@ -57,7 +56,7 @@ export class MessagesSubscribeHandler implements MethodHandler {
57
56
  let authorization: MessagesSubscribeAuthorization;
58
57
  try {
59
58
  await authenticate(message.authorization, this.deps.didResolver);
60
- authorization = await MessagesSubscribeHandler.authorizeMessagesSubscribe(tenant, messagesSubscribe, this.deps.messageStore);
59
+ authorization = await MessagesSubscribeHandler.authorizeMessagesSubscribe(tenant, messagesSubscribe, this.deps);
61
60
  } catch (error) {
62
61
  return messageReplyFromError(error, 401);
63
62
  }
@@ -65,7 +64,7 @@ export class MessagesSubscribeHandler implements MethodHandler {
65
64
  const guardedHandler = MessagesSubscribeHandler.createAuthorizationGuard({
66
65
  authorization,
67
66
  messagesSubscribe,
68
- messageStore: this.deps.messageStore,
67
+ validationStateReader: this.deps.validationStateReader,
69
68
  subscriptionHandler,
70
69
  });
71
70
 
@@ -99,7 +98,7 @@ export class MessagesSubscribeHandler implements MethodHandler {
99
98
  private static async authorizeMessagesSubscribe(
100
99
  tenant: string,
101
100
  messagesSubscribe: MessagesSubscribe,
102
- messageStore: MessageStore
101
+ deps: HandlerDependencies
103
102
  ): Promise<MessagesSubscribeAuthorization> {
104
103
  // if `MessagesSubscribe` author is the same as the target tenant, we can directly grant access
105
104
  if (messagesSubscribe.author === tenant) {
@@ -108,13 +107,13 @@ export class MessagesSubscribeHandler implements MethodHandler {
108
107
 
109
108
  const permissionGrantIds = Message.getPermissionGrantIds(messagesSubscribe.signaturePayload!);
110
109
  if (messagesSubscribe.author !== undefined && permissionGrantIds.length > 0) {
111
- const permissionGrants = await MessagesGrantAuthorization.fetchPermissionGrants(tenant, messageStore, permissionGrantIds);
112
- await MessagesGrantAuthorization.authorizeSubscribeOrSync({
113
- incomingMessage : messagesSubscribe.message,
114
- expectedGrantor : tenant,
115
- expectedGrantee : messagesSubscribe.author,
110
+ const permissionGrants = await MessagesGrantAuthorization.fetchPermissionGrants(tenant, deps.validationStateReader, permissionGrantIds);
111
+ await MessagesGrantAuthorization.authorizeQueryOrSubscribe({
112
+ incomingMessage : messagesSubscribe.message,
113
+ expectedGrantor : tenant,
114
+ expectedGrantee : messagesSubscribe.author,
116
115
  permissionGrants,
117
- messageStore
116
+ validationStateReader : deps.validationStateReader
118
117
  });
119
118
  return {
120
119
  kind : 'delegate',
@@ -130,10 +129,10 @@ export class MessagesSubscribeHandler implements MethodHandler {
130
129
  private static createAuthorizationGuard(input: {
131
130
  authorization: MessagesSubscribeAuthorization;
132
131
  messagesSubscribe: MessagesSubscribe;
133
- messageStore: MessageStore;
132
+ validationStateReader: HandlerDependencies['validationStateReader'];
134
133
  subscriptionHandler: SubscriptionListener;
135
134
  }): GuardedSubscriptionHandler {
136
- const { authorization, messagesSubscribe, messageStore, subscriptionHandler } = input;
135
+ const { authorization, messagesSubscribe, validationStateReader, subscriptionHandler } = input;
137
136
  if (authorization.kind === 'owner') {
138
137
  return {
139
138
  listener : subscriptionHandler,
@@ -182,7 +181,7 @@ export class MessagesSubscribeHandler implements MethodHandler {
182
181
  expectedGrantor : authorization.expectedGrantor,
183
182
  expectedGrantee : authorization.expectedGrantee,
184
183
  permissionGrants : authorization.permissionGrants,
185
- messageStore,
184
+ validationStateReader,
186
185
  deliveryTimestamp : Time.getCurrentTimestamp(),
187
186
  });
188
187
  } catch {
@@ -1,13 +1,13 @@
1
1
  import type { GenericMessageReply } from '../types/message-types.js';
2
- import type { MessageStore } from '../types//message-store.js';
2
+ import type { ProgressToken } from '../types/subscriptions.js';
3
3
  import type { RecordsWriteMessage } from '../types/records-types.js';
4
+ import type { ValidationStateReader } from '../types/validation-state-reader.js';
4
5
  import type { HandlerDependencies, MethodHandler } from '../types/method-handler.js';
5
6
  import type { ProtocolDefinition, ProtocolRuleSet, ProtocolsConfigureMessage } from '../types/protocols-types.js';
6
7
 
7
8
  import { authenticate } from '../core/auth.js';
8
9
  import { Message } from '../core/message.js';
9
10
  import { messageReplyFromError } from '../core/message-reply.js';
10
- import { PermissionsProtocol } from '../protocols/permissions.js';
11
11
  import { ProtocolAuthorization } from '../core/protocol-authorization.js';
12
12
  import { ProtocolsConfigure } from '../interfaces/protocols-configure.js';
13
13
  import { ProtocolsGrantAuthorization } from '../core/protocols-grant-authorization.js';
@@ -43,7 +43,7 @@ export class ProtocolsConfigureHandler implements MethodHandler {
43
43
  public async handle({
44
44
  tenant,
45
45
  message,
46
- }: {tenant: string, message: ProtocolsConfigureMessage }): Promise<GenericMessageReply> {
46
+ }: { tenant: string, message: ProtocolsConfigureMessage }): Promise<GenericMessageReply> {
47
47
  let protocolsConfigure: ProtocolsConfigure;
48
48
  try {
49
49
  protocolsConfigure = await ProtocolsConfigure.parse(message);
@@ -54,7 +54,7 @@ export class ProtocolsConfigureHandler implements MethodHandler {
54
54
  // authentication & authorization
55
55
  try {
56
56
  await authenticate(message.authorization, this.deps.didResolver);
57
- await ProtocolsConfigureHandler.authorizeProtocolsConfigure(tenant, protocolsConfigure, this.deps.messageStore);
57
+ await ProtocolsConfigureHandler.authorizeProtocolsConfigure(tenant, protocolsConfigure, this.deps);
58
58
  } catch (e) {
59
59
  return messageReplyFromError(e, 401);
60
60
  }
@@ -63,7 +63,9 @@ export class ProtocolsConfigureHandler implements MethodHandler {
63
63
  // `$ref` paths must exist in the referenced protocols, and cross-protocol roles must exist.
64
64
  try {
65
65
  await ProtocolsConfigureHandler.validateCompositionDependencies(
66
- tenant, message.descriptor.definition, this.deps.messageStore
66
+ tenant,
67
+ message.descriptor.definition,
68
+ this.deps.validationStateReader,
67
69
  );
68
70
  } catch (e) {
69
71
  return messageReplyFromError(e, 400);
@@ -78,8 +80,8 @@ export class ProtocolsConfigureHandler implements MethodHandler {
78
80
  const { messages: existingMessages } = await this.deps.messageStore.query(tenant, [ query ]);
79
81
 
80
82
  // If the exact same message already exists, return 409 immediately.
81
- // This prevents duplicate key violations in the MessageStore and StateIndex
82
- // when sync pushes a message that the remote already has.
83
+ // This prevents duplicate key violations in the MessageStore when sync pushes
84
+ // a message that the remote already has.
83
85
  const incomingCid = await Message.getCid(message);
84
86
  for (const existing of existingMessages) {
85
87
  if (await Message.getCid(existing) === incomingCid) {
@@ -97,44 +99,38 @@ export class ProtocolsConfigureHandler implements MethodHandler {
97
99
 
98
100
  // write the incoming message to DB if incoming message is newest
99
101
  let messageReply: GenericMessageReply;
102
+ let position: ProgressToken | undefined;
100
103
  if (incomingMessageIsNewest) {
101
104
  const indexes = ProtocolsConfigureHandler.constructIndexes(protocolsConfigure, true);
102
105
 
103
- await this.deps.messageStore.put(tenant, message, indexes);
104
- const messageCid = await Message.getCid(message);
105
- await this.deps.stateIndex!.insert(tenant, messageCid, indexes);
106
-
107
- // only emit if the event log is set
108
- if (this.deps.eventLog !== undefined) {
109
- await this.deps.eventLog.emit(tenant, { message }, indexes, messageCid);
110
- }
106
+ const putResult = await this.deps.messageStore.put(tenant, message, indexes);
107
+ position = putResult.position;
111
108
 
112
109
  messageReply = {
113
- status: { code: 202, detail: 'Accepted' }
110
+ status: { code: 202, detail: 'Accepted' },
111
+ position,
114
112
  };
115
113
  } else {
116
114
  // incoming message is older — still store it as a historical version (not the latest)
117
115
  const indexes = ProtocolsConfigureHandler.constructIndexes(protocolsConfigure, false);
118
116
 
119
- await this.deps.messageStore.put(tenant, message, indexes);
120
- const messageCid = await Message.getCid(message);
121
- await this.deps.stateIndex!.insert(tenant, messageCid, indexes);
117
+ const putResult = await this.deps.messageStore.put(tenant, message, indexes);
118
+ position = putResult.position;
122
119
 
123
120
  messageReply = {
124
- status: { code: 202, detail: 'Accepted' }
121
+ status: { code: 202, detail: 'Accepted' },
122
+ position,
125
123
  };
126
124
  }
127
125
 
128
126
  // re-index previously-latest messages as no longer the latest base state.
129
- // We must delete and re-put (not just put) to properly replace old index entries.
130
127
  for (const existingMessage of existingMessages) {
131
128
  if (existingMessage !== newestMessage) {
132
129
  const existingProtocolsConfigure = await ProtocolsConfigure.parse(existingMessage as ProtocolsConfigureMessage);
133
130
  const updatedIndexes = ProtocolsConfigureHandler.constructIndexes(existingProtocolsConfigure, false);
134
131
  const existingCid = await Message.getCid(existingMessage);
135
132
 
136
- await this.deps.messageStore.delete(tenant, existingCid);
137
- await this.deps.messageStore.put(tenant, existingMessage, updatedIndexes);
133
+ await this.deps.messageStore.updateIndexes(tenant, existingCid, updatedIndexes);
138
134
  }
139
135
  }
140
136
 
@@ -159,23 +155,23 @@ export class ProtocolsConfigureHandler implements MethodHandler {
159
155
  return indexes;
160
156
  }
161
157
 
162
- private static async authorizeProtocolsConfigure(tenant: string, protocolConfigure: ProtocolsConfigure, messageStore: MessageStore): Promise<void> {
158
+ private static async authorizeProtocolsConfigure(tenant: string, protocolConfigure: ProtocolsConfigure, deps: HandlerDependencies): Promise<void> {
163
159
 
164
160
  if (protocolConfigure.isSignedByAuthorDelegate) {
165
- await protocolConfigure.authorizeAuthorDelegate(messageStore);
161
+ await protocolConfigure.authorizeAuthorDelegate(deps.validationStateReader);
166
162
  }
167
163
 
168
164
  if (protocolConfigure.author === tenant) {
169
165
  return;
170
166
  } else if (protocolConfigure.author !== undefined && Message.getPermissionGrantId(protocolConfigure.signaturePayload!) !== undefined) {
171
167
  const permissionGrantId = Message.getPermissionGrantId(protocolConfigure.signaturePayload!)!;
172
- const permissionGrant = await PermissionsProtocol.fetchGrant(tenant, messageStore, permissionGrantId);
168
+ const permissionGrant = await deps.validationStateReader.fetchGrant(tenant, permissionGrantId);
173
169
  await ProtocolsGrantAuthorization.authorizeConfigure({
174
170
  protocolsConfigureMessage : protocolConfigure.message,
175
171
  expectedGrantor : tenant,
176
172
  expectedGrantee : protocolConfigure.author,
177
173
  permissionGrant,
178
- messageStore
174
+ validationStateReader : deps.validationStateReader
179
175
  });
180
176
  } else {
181
177
  throw new DwnError(DwnErrorCode.ProtocolsConfigureAuthorizationFailed, 'message failed authorization');
@@ -184,8 +180,7 @@ export class ProtocolsConfigureHandler implements MethodHandler {
184
180
 
185
181
  private async purgeRecordsInvalidatedByProtocolConfig(tenant: string, protocol: string): Promise<void> {
186
182
  const dataStore = this.deps.dataStore;
187
- const stateIndex = this.deps.stateIndex;
188
- if (dataStore === undefined || stateIndex === undefined) {
183
+ if (dataStore === undefined) {
189
184
  return;
190
185
  }
191
186
 
@@ -227,7 +222,7 @@ export class ProtocolsConfigureHandler implements MethodHandler {
227
222
  // record. Descendants are evaluated independently so valid child records are not
228
223
  // destroyed as collateral.
229
224
  await StorageController.purgeRecordMessages(
230
- tenant, recordMessages, this.deps.messageStore, dataStore, stateIndex
225
+ tenant, recordMessages, this.deps.messageStore, dataStore
231
226
  );
232
227
  }
233
228
  }
@@ -241,7 +236,7 @@ export class ProtocolsConfigureHandler implements MethodHandler {
241
236
  // Stored records were authenticated when admitted. Reconciliation should not make
242
237
  // record retention depend on fresh DID resolution availability or mutable dependency state.
243
238
  await ProtocolAuthorization.validateStoredInitialWrite(
244
- tenant, recordsWrite, this.deps.messageStore, this.deps.coreProtocols
239
+ tenant, recordsWrite, this.deps.validationStateReader
245
240
  );
246
241
  return 'valid';
247
242
  } catch (error) {
@@ -266,7 +261,10 @@ export class ProtocolsConfigureHandler implements MethodHandler {
266
261
  * This is a no-op if the protocol definition has no `uses` map.
267
262
  */
268
263
  private static async validateCompositionDependencies(
269
- tenant: string, definition: ProtocolDefinition, messageStore: MessageStore
264
+ tenant: string,
265
+ definition: ProtocolDefinition,
266
+ validationStateReader: ValidationStateReader,
267
+ messageTimestamp?: string,
270
268
  ): Promise<void> {
271
269
  const { uses } = definition;
272
270
  if (uses === undefined) {
@@ -277,44 +275,25 @@ export class ProtocolsConfigureHandler implements MethodHandler {
277
275
  const referencedDefinitions = new Map<string, ProtocolDefinition>();
278
276
  for (const alias in uses) {
279
277
  const protocolUri = uses[alias];
280
- const refDefinition = await ProtocolsConfigureHandler.fetchInstalledProtocolDefinition(tenant, protocolUri, messageStore);
278
+ try {
279
+ const refDefinition = await validationStateReader.fetchProtocolDefinition(tenant, protocolUri, messageTimestamp);
280
+ referencedDefinitions.set(alias, refDefinition);
281
+ } catch (error) {
282
+ if (!(error instanceof DwnError) || error.code !== DwnErrorCode.ProtocolAuthorizationProtocolNotFound) {
283
+ throw error;
284
+ }
281
285
 
282
- if (refDefinition === undefined) {
283
286
  throw new DwnError(
284
287
  DwnErrorCode.ProtocolsConfigureComposedProtocolNotInstalled,
285
288
  `composed protocol '${protocolUri}' (alias '${alias}') is not installed for tenant '${tenant}'.`
286
289
  );
287
290
  }
288
-
289
- referencedDefinitions.set(alias, refDefinition);
290
291
  }
291
292
 
292
293
  // Walk the structure and validate all $ref paths and cross-protocol role references
293
294
  ProtocolsConfigureHandler.validateRefsAndRolesRecursively(definition.structure as ProtocolRuleSet, '', referencedDefinitions);
294
295
  }
295
296
 
296
- /**
297
- * Fetches the latest installed protocol definition for the given protocol URI.
298
- * @returns The protocol definition, or `undefined` if not installed.
299
- */
300
- private static async fetchInstalledProtocolDefinition(
301
- tenant: string, protocolUri: string, messageStore: MessageStore
302
- ): Promise<ProtocolDefinition | undefined> {
303
- const query = {
304
- interface : DwnInterfaceName.Protocols,
305
- method : DwnMethodName.Configure,
306
- protocol : protocolUri,
307
- isLatestBaseState : true
308
- };
309
- const { messages } = await messageStore.query(tenant, [query]);
310
-
311
- if (messages.length === 0) {
312
- return undefined;
313
- }
314
-
315
- return (messages[0] as ProtocolsConfigureMessage).descriptor.definition;
316
- }
317
-
318
297
  /**
319
298
  * Recursively walks the structure tree to validate:
320
299
  * - `$ref` type paths exist in the referenced protocol's structure
@@ -28,7 +28,7 @@ export class ProtocolsQueryHandler implements MethodHandler {
28
28
  // authentication & authorization
29
29
  try {
30
30
  await authenticate(message.authorization, this.deps.didResolver);
31
- await protocolsQuery.authorize(tenant, this.deps.messageStore);
31
+ await protocolsQuery.authorize(tenant, this.deps.validationStateReader);
32
32
  } catch (error: any) {
33
33
 
34
34
  // return public ProtocolsConfigures if query fails with a certain authentication or authorization code
@@ -1,13 +1,11 @@
1
- import type { CoreProtocolRegistry } from '../core/core-protocol.js';
2
1
  import type { Filter } from '../types/query-types.js';
3
- import type { MessageStore } from '../types//message-store.js';
4
2
  import type { HandlerDependencies, MethodHandler } from '../types/method-handler.js';
5
3
  import type { RecordsCountMessage, RecordsCountReply } from '../types/records-types.js';
6
4
 
7
5
  import { authenticate } from '../core/auth.js';
6
+ import { countRecordsWithRecordLimitOccupancy } from '../utils/record-limit-occupancy.js';
8
7
  import { Message } from '../core/message.js';
9
8
  import { messageReplyFromError } from '../core/message-reply.js';
10
- import { PermissionsProtocol } from '../protocols/permissions.js';
11
9
  import { ProtocolAuthorization } from '../core/protocol-authorization.js';
12
10
  import { Records } from '../utils/records.js';
13
11
  import { RecordsCount } from '../interfaces/records-count.js';
@@ -20,7 +18,7 @@ export class RecordsCountHandler implements MethodHandler {
20
18
 
21
19
  public async handle({
22
20
  tenant,
23
- message
21
+ message,
24
22
  }: {tenant: string, message: RecordsCountMessage}): Promise<RecordsCountReply> {
25
23
  let recordsCount: RecordsCount;
26
24
  try {
@@ -39,7 +37,7 @@ export class RecordsCountHandler implements MethodHandler {
39
37
  try {
40
38
  await authenticate(message.authorization!, this.deps.didResolver);
41
39
 
42
- await RecordsCountHandler.authorizeRecordsCount(tenant, recordsCount, this.deps.messageStore, this.deps.coreProtocols);
40
+ await RecordsCountHandler.authorizeRecordsCount(tenant, recordsCount, this.deps);
43
41
  } catch (e) {
44
42
  return messageReplyFromError(e, 401);
45
43
  }
@@ -69,7 +67,7 @@ export class RecordsCountHandler implements MethodHandler {
69
67
  isLatestBaseState : true
70
68
  };
71
69
 
72
- return this.deps.messageStore.count(tenant, [countFilter]);
70
+ return this.countProjectedRecords(tenant, recordsCount, [countFilter]);
73
71
  }
74
72
 
75
73
  /**
@@ -101,7 +99,7 @@ export class RecordsCountHandler implements MethodHandler {
101
99
  }
102
100
  }
103
101
 
104
- return this.deps.messageStore.count(tenant, filters);
102
+ return this.countProjectedRecords(tenant, recordsCount, filters);
105
103
  }
106
104
 
107
105
  /**
@@ -109,7 +107,17 @@ export class RecordsCountHandler implements MethodHandler {
109
107
  */
110
108
  private async countPublishedRecords(tenant: string, recordsCount: RecordsCount): Promise<number> {
111
109
  const filter = RecordsCountHandler.buildPublishedRecordsFilter(recordsCount);
112
- return this.deps.messageStore.count(tenant, [filter]);
110
+ return this.countProjectedRecords(tenant, recordsCount, [filter]);
111
+ }
112
+
113
+ private async countProjectedRecords(tenant: string, recordsCount: RecordsCount, filters: Filter[]): Promise<number> {
114
+ return countRecordsWithRecordLimitOccupancy({
115
+ messageStore : this.deps.messageStore,
116
+ validationStateReader : this.deps.validationStateReader,
117
+ tenant,
118
+ filters,
119
+ messageTimestamp : recordsCount.message.descriptor.messageTimestamp,
120
+ });
113
121
  }
114
122
 
115
123
  private static buildPublishedRecordsFilter(recordsCount: RecordsCount): Filter {
@@ -187,23 +195,22 @@ export class RecordsCountHandler implements MethodHandler {
187
195
  private static async authorizeRecordsCount(
188
196
  tenant: string,
189
197
  recordsCount: RecordsCount,
190
- messageStore: MessageStore,
191
- coreProtocols?: CoreProtocolRegistry,
198
+ deps: HandlerDependencies,
192
199
  ): Promise<void> {
193
200
 
194
201
  if (Message.isSignedByAuthorDelegate(recordsCount.message)) {
195
- await recordsCount.authorizeDelegate(messageStore);
202
+ await recordsCount.authorizeDelegate(deps.validationStateReader);
196
203
  }
197
204
 
198
205
  const permissionGrantId = Message.getPermissionGrantId(recordsCount.signaturePayload!);
199
206
  if (permissionGrantId !== undefined) {
200
- const permissionGrant = await PermissionsProtocol.fetchGrant(tenant, messageStore, permissionGrantId);
207
+ const permissionGrant = await deps.validationStateReader.fetchGrant(tenant, permissionGrantId);
201
208
  await RecordsGrantAuthorization.authorizeQueryOrSubscribe({
202
- incomingMessage : recordsCount.message,
203
- expectedGrantor : tenant,
204
- expectedGrantee : recordsCount.author!,
209
+ incomingMessage : recordsCount.message,
210
+ expectedGrantor : tenant,
211
+ expectedGrantee : recordsCount.author!,
205
212
  permissionGrant,
206
- messageStore,
213
+ validationStateReader : deps.validationStateReader,
207
214
  });
208
215
  return;
209
216
  }
@@ -212,7 +219,7 @@ export class RecordsCountHandler implements MethodHandler {
212
219
  // this is because we dynamically filter out records that the caller is not authorized to see.
213
220
  // Currently only run protocol authorization if message deliberately invokes a protocol role.
214
221
  if (Records.shouldProtocolAuthorize(recordsCount.signaturePayload!)) {
215
- await ProtocolAuthorization.authorizeQueryOrSubscribe(tenant, recordsCount, messageStore, coreProtocols);
222
+ await ProtocolAuthorization.authorizeQueryOrSubscribe(tenant, recordsCount, deps.validationStateReader);
216
223
  }
217
224
  }
218
225
  }