@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,19 +1,17 @@
1
- import type { CoreProtocolRegistry } from '../core/core-protocol.js';
2
1
  import type { GenericMessageReply } from '../types/message-types.js';
3
- import type { MessageStore } from '../types//message-store.js';
2
+ import type { ProgressToken } from '../types/subscriptions.js';
4
3
  import type { RecordsDeleteMessage } from '../types/records-types.js';
4
+ import type { RecordsWrite } from '../interfaces/records-write.js';
5
5
  import type { HandlerDependencies, MethodHandler } from '../types/method-handler.js';
6
6
 
7
7
  import { authenticate } from '../core/auth.js';
8
8
  import { DwnInterfaceName } from '../enums/dwn-interface-method.js';
9
9
  import { Message } from '../core/message.js';
10
10
  import { messageReplyFromError } from '../core/message-reply.js';
11
- import { PermissionsProtocol } from '../protocols/permissions.js';
12
11
  import { ProtocolAuthorization } from '../core/protocol-authorization.js';
13
12
  import { Records } from '../utils/records.js';
14
13
  import { RecordsDelete } from '../interfaces/records-delete.js';
15
14
  import { RecordsGrantAuthorization } from '../core/records-grant-authorization.js';
16
- import { RecordsWrite } from '../interfaces/records-write.js';
17
15
  import { ResumableTaskName } from '../core/resumable-task-manager.js';
18
16
 
19
17
  export class RecordsDeleteHandler implements MethodHandler {
@@ -22,8 +20,8 @@ export class RecordsDeleteHandler implements MethodHandler {
22
20
 
23
21
  public async handle({
24
22
  tenant,
25
- message
26
- }: { tenant: string, message: RecordsDeleteMessage}): Promise<GenericMessageReply> {
23
+ message,
24
+ }: { tenant: string, message: RecordsDeleteMessage }): Promise<GenericMessageReply> {
27
25
  let recordsDelete: RecordsDelete;
28
26
  try {
29
27
  recordsDelete = await RecordsDelete.parse(message);
@@ -48,15 +46,20 @@ export class RecordsDeleteHandler implements MethodHandler {
48
46
  // find which message is the newest, and if the incoming message is the newest
49
47
  const newestExistingMessage = await Message.getNewestMessage(existingMessages);
50
48
 
51
- if (!Records.canPerformDeleteAgainstRecord(message, newestExistingMessage)) {
49
+ if (newestExistingMessage === undefined) {
52
50
  return {
53
51
  status: { code: 404, detail: 'Not Found' }
54
52
  };
55
53
  }
56
54
 
57
- // if the incoming message is not the newest, return Conflict
58
- const incomingDeleteIsNewest = await Message.isNewer(message, newestExistingMessage!);
59
- if (!incomingDeleteIsNewest) {
55
+ // Tombstone lattice: an incoming tombstone displaces ANY RecordsWrite, even a newer one — the
56
+ // write handler already rejects writes-after-delete regardless of timestamp, so this is the
57
+ // only rule that makes both arrival orders reach the same terminal state. Among competing
58
+ // tombstones one canonical winner stands on every replica: a prune beats a plain delete
59
+ // regardless of timestamp (the cascade is a side effect that must run everywhere), and within
60
+ // the same class the newest (messageTimestamp, then CID) wins. A beaten delete is a Conflict
61
+ // no-op; replication classifies the 409 as Superseded.
62
+ if (await Records.isDeleteBeatenByExistingTombstone(message, newestExistingMessage)) {
60
63
  return {
61
64
  status: { code: 409, detail: 'Conflict' }
62
65
  };
@@ -67,26 +70,26 @@ export class RecordsDeleteHandler implements MethodHandler {
67
70
  // NOTE: We need a RecordsWrite (doesn't have to be initial) to access the immutable properties for delete processing,
68
71
  // but if the latest record state is a RecordsDelete (ie. when we are pruning a non-prune delete),
69
72
  // we'd need to use the initial write because RecordsDelete does not contain the immutable properties needed for processing.
70
- const initialWrite = await RecordsWrite.fetchInitialRecordsWrite(this.deps.messageStore, tenant, message.descriptor.recordId);
73
+ const initialWrite = await this.deps.validationStateReader.fetchInitialRecordsWrite(tenant, message.descriptor.recordId);
71
74
 
72
- await RecordsDeleteHandler.authorizeRecordsDelete(
75
+ await this.authorizeRecordsDelete(
73
76
  tenant,
74
77
  recordsDelete,
75
78
  initialWrite!,
76
- this.deps.messageStore,
77
- this.deps.coreProtocols,
78
79
  );
80
+
79
81
  } catch (e) {
80
82
  return messageReplyFromError(e, 401);
81
83
  }
82
84
 
83
- await this.deps.resumableTaskManager!.run({
85
+ const taskResult = await this.deps.resumableTaskManager!.run<{ position?: ProgressToken }>({
84
86
  name : ResumableTaskName.RecordsDelete,
85
87
  data : { tenant, message }
86
88
  });
87
89
 
88
90
  const messageReply = {
89
- status: { code: 202, detail: 'Accepted' }
91
+ status : { code: 202, detail: 'Accepted' },
92
+ position : taskResult.position,
90
93
  };
91
94
  return messageReply;
92
95
  };
@@ -96,33 +99,32 @@ export class RecordsDeleteHandler implements MethodHandler {
96
99
  *
97
100
  * @param recordsWrite A RecordsWrite of the record to be deleted.
98
101
  */
99
- private static async authorizeRecordsDelete(
102
+ private async authorizeRecordsDelete(
100
103
  tenant: string,
101
104
  recordsDelete: RecordsDelete,
102
105
  recordsWrite: RecordsWrite,
103
- messageStore: MessageStore,
104
- coreProtocols?: CoreProtocolRegistry,
105
106
  ): Promise<void> {
106
107
 
107
108
  if (Message.isSignedByAuthorDelegate(recordsDelete.message)) {
108
- await recordsDelete.authorizeDelegate(recordsWrite.message, messageStore);
109
+ await recordsDelete.authorizeDelegate(recordsWrite.message, this.deps.validationStateReader);
109
110
  }
110
111
 
111
112
  if (recordsDelete.author === tenant) {
112
113
  return;
113
114
  } else if (recordsDelete.author !== undefined && Message.getPermissionGrantId(recordsDelete.signaturePayload!) !== undefined) {
114
115
  const permissionGrantId = Message.getPermissionGrantId(recordsDelete.signaturePayload!)!;
115
- const permissionGrant = await PermissionsProtocol.fetchGrant(tenant, messageStore, permissionGrantId);
116
+ const permissionGrant = await this.deps.validationStateReader.fetchGrant(tenant, permissionGrantId);
116
117
  await RecordsGrantAuthorization.authorizeDelete({
117
- recordsDeleteMessage : recordsDelete.message,
118
- recordsWriteToDelete : recordsWrite.message,
119
- expectedGrantor : tenant,
120
- expectedGrantee : recordsDelete.author,
118
+ recordsDeleteMessage : recordsDelete.message,
119
+ recordsWriteToDelete : recordsWrite.message,
120
+ expectedGrantor : tenant,
121
+ expectedGrantee : recordsDelete.author,
121
122
  permissionGrant,
122
- messageStore,
123
+ validationStateReader : this.deps.validationStateReader,
123
124
  });
124
125
  } else {
125
- await ProtocolAuthorization.authorizeDelete(tenant, recordsDelete, recordsWrite, messageStore, coreProtocols);
126
+ await ProtocolAuthorization.authorizeDelete(tenant, recordsDelete, recordsWrite, this.deps.validationStateReader);
126
127
  }
127
128
  }
129
+
128
130
  };
@@ -1,5 +1,3 @@
1
- import type { CoreProtocolRegistry } from '../core/core-protocol.js';
2
- import type { MessageStore } from '../types//message-store.js';
3
1
  import type { Filter, PaginationCursor } from '../types/query-types.js';
4
2
  import type { GenericMessage, MessageSort } from '../types/message-types.js';
5
3
  import type { HandlerDependencies, MethodHandler } from '../types/method-handler.js';
@@ -9,8 +7,8 @@ import { authenticate } from '../core/auth.js';
9
7
  import { DateSort } from '../types/records-types.js';
10
8
  import { Message } from '../core/message.js';
11
9
  import { messageReplyFromError } from '../core/message-reply.js';
12
- import { PermissionsProtocol } from '../protocols/permissions.js';
13
10
  import { ProtocolAuthorization } from '../core/protocol-authorization.js';
11
+ import { queryRecordsWithRecordLimitOccupancy } from '../utils/record-limit-occupancy.js';
14
12
  import { Records } from '../utils/records.js';
15
13
  import { RecordsGrantAuthorization } from '../core/records-grant-authorization.js';
16
14
  import { RecordsQuery } from '../interfaces/records-query.js';
@@ -24,7 +22,7 @@ export class RecordsQueryHandler implements MethodHandler {
24
22
 
25
23
  public async handle({
26
24
  tenant,
27
- message
25
+ message,
28
26
  }: {tenant: string, message: RecordsQueryMessage}): Promise<RecordsQueryReply> {
29
27
  let recordsQuery: RecordsQuery;
30
28
  try {
@@ -45,7 +43,7 @@ export class RecordsQueryHandler implements MethodHandler {
45
43
  try {
46
44
  await authenticate(message.authorization!, this.deps.didResolver);
47
45
 
48
- await RecordsQueryHandler.authorizeRecordsQuery(tenant, recordsQuery, this.deps.messageStore, this.deps.coreProtocols);
46
+ await RecordsQueryHandler.authorizeRecordsQuery(tenant, recordsQuery, this.deps);
49
47
  } catch (e) {
50
48
  return messageReplyFromError(e, 401);
51
49
  }
@@ -124,7 +122,15 @@ export class RecordsQueryHandler implements MethodHandler {
124
122
  };
125
123
 
126
124
  const messageSort = this.convertDateSort(dateSort);
127
- return this.deps.messageStore.query(tenant, [ queryFilter ], messageSort, pagination);
125
+ return queryRecordsWithRecordLimitOccupancy({
126
+ messageStore : this.deps.messageStore,
127
+ validationStateReader : this.deps.validationStateReader,
128
+ tenant,
129
+ filters : [queryFilter],
130
+ messageSort,
131
+ pagination,
132
+ messageTimestamp : recordsQuery.message.descriptor.messageTimestamp,
133
+ });
128
134
  }
129
135
 
130
136
  /**
@@ -174,7 +180,15 @@ export class RecordsQueryHandler implements MethodHandler {
174
180
  }
175
181
 
176
182
  const messageSort = this.convertDateSort(dateSort);
177
- return this.deps.messageStore.query(tenant, filters, messageSort, pagination );
183
+ return queryRecordsWithRecordLimitOccupancy({
184
+ messageStore : this.deps.messageStore,
185
+ validationStateReader : this.deps.validationStateReader,
186
+ tenant,
187
+ filters,
188
+ messageSort,
189
+ pagination,
190
+ messageTimestamp : recordsQuery.message.descriptor.messageTimestamp,
191
+ });
178
192
  }
179
193
 
180
194
  /**
@@ -186,7 +200,15 @@ export class RecordsQueryHandler implements MethodHandler {
186
200
  const { dateSort, pagination } = recordsQuery.message.descriptor;
187
201
  const filter = RecordsQueryHandler.buildPublishedRecordsFilter(recordsQuery);
188
202
  const messageSort = this.convertDateSort(dateSort);
189
- return this.deps.messageStore.query(tenant, [ filter ], messageSort, pagination);
203
+ return queryRecordsWithRecordLimitOccupancy({
204
+ messageStore : this.deps.messageStore,
205
+ validationStateReader : this.deps.validationStateReader,
206
+ tenant,
207
+ filters : [filter],
208
+ messageSort,
209
+ pagination,
210
+ messageTimestamp : recordsQuery.message.descriptor.messageTimestamp,
211
+ });
190
212
  }
191
213
 
192
214
  private static buildPublishedRecordsFilter(recordsQuery: RecordsQuery): Filter {
@@ -268,23 +290,22 @@ export class RecordsQueryHandler implements MethodHandler {
268
290
  private static async authorizeRecordsQuery(
269
291
  tenant: string,
270
292
  recordsQuery: RecordsQuery,
271
- messageStore: MessageStore,
272
- coreProtocols?: CoreProtocolRegistry,
293
+ deps: HandlerDependencies,
273
294
  ): Promise<void> {
274
295
 
275
296
  if (Message.isSignedByAuthorDelegate(recordsQuery.message)) {
276
- await recordsQuery.authorizeDelegate(messageStore);
297
+ await recordsQuery.authorizeDelegate(deps.validationStateReader);
277
298
  }
278
299
 
279
300
  const permissionGrantId = Message.getPermissionGrantId(recordsQuery.signaturePayload!);
280
301
  if (permissionGrantId !== undefined) {
281
- const permissionGrant = await PermissionsProtocol.fetchGrant(tenant, messageStore, permissionGrantId);
302
+ const permissionGrant = await deps.validationStateReader.fetchGrant(tenant, permissionGrantId);
282
303
  await RecordsGrantAuthorization.authorizeQueryOrSubscribe({
283
- incomingMessage : recordsQuery.message,
284
- expectedGrantor : tenant,
285
- expectedGrantee : recordsQuery.author!,
304
+ incomingMessage : recordsQuery.message,
305
+ expectedGrantor : tenant,
306
+ expectedGrantee : recordsQuery.author!,
286
307
  permissionGrant,
287
- messageStore,
308
+ validationStateReader : deps.validationStateReader,
288
309
  });
289
310
  return;
290
311
  }
@@ -293,7 +314,7 @@ export class RecordsQueryHandler implements MethodHandler {
293
314
  // this is because we dynamically filter out records that the caller is not authorized to see.
294
315
  // Currently only run protocol authorization if message deliberately invokes a protocol role.
295
316
  if (Records.shouldProtocolAuthorize(recordsQuery.signaturePayload!)) {
296
- await ProtocolAuthorization.authorizeQueryOrSubscribe(tenant, recordsQuery, messageStore, coreProtocols);
317
+ await ProtocolAuthorization.authorizeQueryOrSubscribe(tenant, recordsQuery, deps.validationStateReader);
297
318
  }
298
319
  }
299
320
  }
@@ -1,15 +1,13 @@
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 { RecordsDeleteMessage, RecordsQueryReplyEntry, RecordsReadMessage, RecordsReadReply } from '../types/records-types.js';
6
4
 
7
5
  import { authenticate } from '../core/auth.js';
8
6
  import { DataStream } from '../utils/data-stream.js';
9
7
  import { Encoder } from '../utils/encoder.js';
8
+ import { isRecordLimitOccupant } from '../utils/record-limit-occupancy.js';
10
9
  import { Message } from '../core/message.js';
11
10
  import { messageReplyFromError } from '../core/message-reply.js';
12
- import { PermissionsProtocol } from '../protocols/permissions.js';
13
11
  import { ProtocolAuthorization } from '../core/protocol-authorization.js';
14
12
  import { Records } from '../utils/records.js';
15
13
  import { RecordsGrantAuthorization } from '../core/records-grant-authorization.js';
@@ -24,7 +22,7 @@ export class RecordsReadHandler implements MethodHandler {
24
22
 
25
23
  public async handle({
26
24
  tenant,
27
- message
25
+ message,
28
26
  }: { tenant: string, message: RecordsReadMessage }): Promise<RecordsReadReply> {
29
27
 
30
28
  let recordsRead: RecordsRead;
@@ -51,7 +49,7 @@ export class RecordsReadHandler implements MethodHandler {
51
49
  ...Records.convertFilter(message.descriptor.filter)
52
50
  };
53
51
  const messageSort = Records.convertDateSort(message.descriptor.dateSort);
54
- const { messages: existingMessages } = await this.deps.messageStore.query(tenant, [ query ], messageSort, { limit: 1 });
52
+ const { messages: existingMessages } = await this.deps.messageStore.query(tenant, [query], messageSort, { limit: 1 });
55
53
  if (existingMessages.length === 0) {
56
54
  return {
57
55
  status: { code: 404, detail: 'Not Found' }
@@ -60,55 +58,29 @@ export class RecordsReadHandler implements MethodHandler {
60
58
 
61
59
  const matchedMessage = existingMessages[0];
62
60
 
63
- // If the matched message is a RecordsDelete, authorize against the newest RecordsWrite
64
- // (for parity with the live-record path which authorizes against the latest write),
65
- // then return 404 with both the RecordsDelete and the initial RecordsWrite.
66
61
  if (matchedMessage.descriptor.method === DwnMethodName.Delete) {
67
- const recordsDeleteMessage = matchedMessage as RecordsDeleteMessage;
68
- const recordId = recordsDeleteMessage.descriptor.recordId;
69
-
70
- const initialWrite = await RecordsWrite.fetchInitialRecordsWriteMessage(this.deps.messageStore, tenant, recordId);
71
- if (initialWrite === undefined) {
72
- return messageReplyFromError(new DwnError(
73
- DwnErrorCode.RecordsReadInitialWriteNotFound,
74
- 'initial write for deleted record not found'
75
- ), 400);
76
- }
77
-
78
- // Authorize against the newest RecordsWrite so that mutable properties like `published`
79
- // reflect the record's state at the time of deletion, not just the initial write.
80
- let newestWrite;
81
- try {
82
- newestWrite = await RecordsWrite.fetchNewestRecordsWrite(this.deps.messageStore, tenant, recordId);
83
- } catch {
84
- // If newest write is not found (should not happen since initial write exists),
85
- // fall back to the initial write for authorization.
86
- newestWrite = initialWrite;
87
- }
88
- const parsedNewestWrite = await RecordsWrite.parse(newestWrite);
62
+ return this.replyForDeletedRecord(tenant, recordsRead, matchedMessage as RecordsDeleteMessage);
63
+ }
89
64
 
90
- try {
91
- await RecordsReadHandler.authorizeRecordsRead(tenant, recordsRead, parsedNewestWrite, this.deps.messageStore, this.deps.coreProtocols);
92
- } catch (error) {
93
- return messageReplyFromError(error, 401);
94
- }
65
+ // else the matched message is a RecordsWrite
66
+ const matchedRecordsWrite = matchedMessage as RecordsQueryReplyEntry;
95
67
 
68
+ if (!await isRecordLimitOccupant({
69
+ messageStore : this.deps.messageStore,
70
+ validationStateReader : this.deps.validationStateReader,
71
+ tenant,
72
+ message : matchedRecordsWrite,
73
+ messageTimestamp : recordsRead.message.descriptor.messageTimestamp,
74
+ })) {
96
75
  return {
97
- status : { code: 404, detail: 'Not Found' },
98
- entry : {
99
- recordsDelete: recordsDeleteMessage,
100
- initialWrite,
101
- }
76
+ status: { code: 404, detail: 'Not Found' }
102
77
  };
103
78
  }
104
79
 
105
- // else the matched message is a RecordsWrite
106
- const matchedRecordsWrite = matchedMessage as RecordsQueryReplyEntry;
107
-
108
80
  try {
109
81
  const parsedWrite = await RecordsWrite.parse(matchedRecordsWrite);
110
82
  await RecordsReadHandler.authorizeRecordsRead(
111
- tenant, recordsRead, parsedWrite, this.deps.messageStore, this.deps.coreProtocols,
83
+ tenant, recordsRead, parsedWrite, this.deps,
112
84
  );
113
85
  } catch (error) {
114
86
  return messageReplyFromError(error, 401);
@@ -155,6 +127,48 @@ export class RecordsReadHandler implements MethodHandler {
155
127
  return recordsReadReply;
156
128
  };
157
129
 
130
+ private async replyForDeletedRecord(
131
+ tenant: string,
132
+ recordsRead: RecordsRead,
133
+ recordsDeleteMessage: RecordsDeleteMessage,
134
+ ): Promise<RecordsReadReply> {
135
+ const recordId = recordsDeleteMessage.descriptor.recordId;
136
+
137
+ const initialWrite = await RecordsWrite.fetchInitialRecordsWriteMessage(this.deps.messageStore, tenant, recordId);
138
+ if (initialWrite === undefined) {
139
+ return messageReplyFromError(new DwnError(
140
+ DwnErrorCode.RecordsReadInitialWriteNotFound,
141
+ 'initial write for deleted record not found'
142
+ ), 400);
143
+ }
144
+
145
+ // Authorize against the newest RecordsWrite so that mutable properties like `published`
146
+ // reflect the record's state at the time of deletion, not just the initial write.
147
+ let newestWrite;
148
+ try {
149
+ newestWrite = await RecordsWrite.fetchNewestRecordsWrite(this.deps.messageStore, tenant, recordId);
150
+ } catch {
151
+ // If newest write is not found (should not happen since initial write exists),
152
+ // fall back to the initial write for authorization.
153
+ newestWrite = initialWrite;
154
+ }
155
+ const parsedNewestWrite = await RecordsWrite.parse(newestWrite);
156
+
157
+ try {
158
+ await RecordsReadHandler.authorizeRecordsRead(tenant, recordsRead, parsedNewestWrite, this.deps);
159
+ } catch (error) {
160
+ return messageReplyFromError(error, 401);
161
+ }
162
+
163
+ return {
164
+ status : { code: 404, detail: 'Not Found' },
165
+ entry : {
166
+ recordsDelete: recordsDeleteMessage,
167
+ initialWrite,
168
+ }
169
+ };
170
+ }
171
+
158
172
  /**
159
173
  * @param messageStore Used to check if the grant has been revoked.
160
174
  */
@@ -162,11 +176,10 @@ export class RecordsReadHandler implements MethodHandler {
162
176
  tenant: string,
163
177
  recordsRead: RecordsRead,
164
178
  matchedRecordsWrite: RecordsWrite,
165
- messageStore: MessageStore,
166
- coreProtocols?: CoreProtocolRegistry,
179
+ deps: HandlerDependencies,
167
180
  ): Promise<void> {
168
181
  if (Message.isSignedByAuthorDelegate(recordsRead.message)) {
169
- await recordsRead.authorizeDelegate(matchedRecordsWrite.message, messageStore);
182
+ await recordsRead.authorizeDelegate(matchedRecordsWrite.message, deps.validationStateReader);
170
183
  }
171
184
 
172
185
  const { descriptor } = matchedRecordsWrite.message;
@@ -184,17 +197,17 @@ export class RecordsReadHandler implements MethodHandler {
184
197
  return;
185
198
  } else if (recordsRead.author !== undefined && Message.getPermissionGrantId(recordsRead.signaturePayload!) !== undefined) {
186
199
  const permissionGrantId = Message.getPermissionGrantId(recordsRead.signaturePayload!)!;
187
- const permissionGrant = await PermissionsProtocol.fetchGrant(tenant, messageStore, permissionGrantId);
200
+ const permissionGrant = await deps.validationStateReader.fetchGrant(tenant, permissionGrantId);
188
201
  await RecordsGrantAuthorization.authorizeRead({
189
202
  recordsReadMessage : recordsRead.message,
190
203
  recordsWriteMessageToBeRead : matchedRecordsWrite.message,
191
204
  expectedGrantor : tenant,
192
205
  expectedGrantee : recordsRead.author,
193
206
  permissionGrant,
194
- messageStore
207
+ validationStateReader : deps.validationStateReader
195
208
  });
196
209
  } else {
197
- await ProtocolAuthorization.authorizeRead(tenant, recordsRead, matchedRecordsWrite, messageStore, coreProtocols);
210
+ await ProtocolAuthorization.authorizeRead(tenant, recordsRead, matchedRecordsWrite, deps.validationStateReader);
198
211
  }
199
212
  }
200
213
  }