@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,6 +1,5 @@
1
- import type { Filter } from '../types/query-types.js';
2
- import type { GenericMessageReply } from '../types/message-types.js';
3
- import type { MessageStore } from '../types/message-store.js';
1
+ import type { ProgressToken } from '../types/subscriptions.js';
2
+ import type { GenericMessage, GenericMessageReply } from '../types/message-types.js';
4
3
  import type { HandlerDependencies, MethodHandler } from '../types/method-handler.js';
5
4
  import type { RecordsQueryReplyEntry, RecordsWriteMessage } from '../types/records-types.js';
6
5
 
@@ -9,21 +8,18 @@ import { Cid } from '../utils/cid.js';
9
8
  import { DataStream } from '../utils/data-stream.js';
10
9
  import { DwnConstant } from '../core/dwn-constant.js';
11
10
  import { Encoder } from '../utils/encoder.js';
12
- import { FilterUtility } from '../utils/filter.js';
13
11
  import { Message } from '../core/message.js';
14
12
  import { messageReplyFromError } from '../core/message-reply.js';
15
- import { PermissionsProtocol } from '../protocols/permissions.js';
16
13
  import { ProtocolAuthorization } from '../core/protocol-authorization.js';
17
14
  import { Records } from '../utils/records.js';
18
15
  import { RecordsGrantAuthorization } from '../core/records-grant-authorization.js';
19
16
  import { RecordsWrite } from '../interfaces/records-write.js';
20
17
  import { ResumableTaskName } from '../core/resumable-task-manager.js';
21
- import { SortDirection } from '../types/query-types.js';
22
18
  import { StorageController } from '../store/storage-controller.js';
23
19
  import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
24
20
  import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
25
21
 
26
- type HandlerArgs = { tenant: string, message: RecordsWriteMessage, dataStream?: ReadableStream<Uint8Array>};
22
+ type HandlerArgs = { tenant: string, message: RecordsWriteMessage, dataStream?: ReadableStream<Uint8Array> };
27
23
 
28
24
  export class RecordsWriteHandler implements MethodHandler {
29
25
 
@@ -32,7 +28,7 @@ export class RecordsWriteHandler implements MethodHandler {
32
28
  public async handle({
33
29
  tenant,
34
30
  message,
35
- dataStream
31
+ dataStream,
36
32
  }: HandlerArgs): Promise<GenericMessageReply> {
37
33
  let recordsWrite: RecordsWrite;
38
34
  try {
@@ -52,30 +48,26 @@ export class RecordsWriteHandler implements MethodHandler {
52
48
  // mutable validation. An already-stored message has already passed
53
49
  // admission; replay should not be reinterpreted against current protocol,
54
50
  // parent, role, grant, or record-limit state.
55
- //
56
- // Exception: an initial write may have been stored earlier without data
57
- // (204). A later delivery of the same message with data must be allowed
58
- // to complete the record.
59
51
  const incomingCid = await Message.getCid(message);
60
52
  for (const existingMessage of existingMessages) {
61
53
  if (await Message.getCid(existingMessage) !== incomingCid) {
62
54
  continue;
63
55
  }
64
56
 
65
- const canCompleteMissingData = await this.existingInitialWriteLacksData(
66
- tenant,
67
- existingMessage as RecordsWriteMessage,
68
- message,
69
- dataStream !== undefined,
70
- );
57
+ return { status: { code: 409, detail: 'Conflict' } };
58
+ }
71
59
 
72
- if (!canCompleteMissingData) {
73
- return { status: { code: 409, detail: 'Conflict' } };
74
- }
60
+ const newMessageIsInitialWrite = await recordsWrite.isInitialWrite();
61
+
62
+ let initialWrite: RecordsWriteMessage | undefined;
63
+ try {
64
+ initialWrite = await this.getInitialWrite(existingMessages, newMessageIsInitialWrite);
65
+ } catch (e) {
66
+ return messageReplyFromError(e, 400);
75
67
  }
76
68
 
77
69
  try {
78
- await ProtocolAuthorization.validateReferentialIntegrity(tenant, recordsWrite, this.deps.messageStore, this.deps.coreProtocols);
70
+ await ProtocolAuthorization.validateReferentialIntegrity(tenant, recordsWrite, this.deps.validationStateReader);
79
71
  } catch (e) {
80
72
  return messageReplyFromError(e, 400);
81
73
  }
@@ -83,18 +75,14 @@ export class RecordsWriteHandler implements MethodHandler {
83
75
  // authentication & authorization
84
76
  try {
85
77
  await authenticate(message.authorization, this.deps.didResolver, message.attestation);
86
- await this.authorizeRecordsWrite(tenant, recordsWrite, this.deps.messageStore);
78
+ await this.authorizeRecordsWrite(tenant, recordsWrite);
87
79
  } catch (e) {
88
80
  return messageReplyFromError(e, 401);
89
81
  }
90
82
 
91
- // if the incoming write is not the initial write, then it must not modify any immutable properties defined by the initial write
92
- const newMessageIsInitialWrite = await recordsWrite.isInitialWrite();
93
- let initialWrite: RecordsWriteMessage | undefined;
94
- if (!newMessageIsInitialWrite) {
83
+ if (initialWrite !== undefined) {
95
84
  try {
96
- initialWrite = await RecordsWrite.getInitialWrite(existingMessages);
97
- RecordsWrite.verifyEqualityOfImmutableProperties(initialWrite, message);
85
+ this.verifyImmutableProperties(initialWrite, message);
98
86
  } catch (e) {
99
87
  return messageReplyFromError(e, 400);
100
88
  }
@@ -121,30 +109,9 @@ export class RecordsWriteHandler implements MethodHandler {
121
109
  }
122
110
 
123
111
  if (!incomingMessageIsNewest) {
124
- // Allow re-processing when the existing record was stored as an
125
- // initial write without data (isLatestBaseState = false, status 204)
126
- // and the incoming message now supplies data. This happens during
127
- // sync when a live pull initially stores the message without data
128
- // and a subsequent poll or retry delivers the same message with data.
129
- //
130
- // We detect the incomplete state by checking whether the existing
131
- // message is an initial write that lacks both inline encodedData and
132
- // DataStore data — indicating it was stored without data.
133
- let existingLacksData = false;
134
- if (newestExistingMessage) {
135
- existingLacksData = await this.existingInitialWriteLacksData(
136
- tenant,
137
- newestExistingMessage as RecordsWriteMessage,
138
- message,
139
- dataStream !== undefined,
140
- );
141
- }
142
-
143
- if (!existingLacksData) {
144
- return {
145
- status: { code: 409, detail: 'Conflict' }
146
- };
147
- }
112
+ return {
113
+ status: { code: 409, detail: 'Conflict' }
114
+ };
148
115
  }
149
116
 
150
117
  // Look up the core protocol (if any) for the incoming message so that lifecycle hooks
@@ -152,6 +119,7 @@ export class RecordsWriteHandler implements MethodHandler {
152
119
  const coreProtocol = message.descriptor.protocol === undefined
153
120
  ? undefined
154
121
  : this.deps.coreProtocols?.get(message.descriptor.protocol);
122
+ let position: ProgressToken | undefined;
155
123
 
156
124
  try {
157
125
  if (newestExistingMessage?.descriptor.method === DwnMethodName.Delete) {
@@ -165,7 +133,7 @@ export class RecordsWriteHandler implements MethodHandler {
165
133
  // This allows core protocols to perform cross-record validation before storage
166
134
  // (e.g. ensuring revocation tag consistency with the parent grant's scoped protocol).
167
135
  if (coreProtocol?.preProcessWrite !== undefined) {
168
- await coreProtocol.preProcessWrite(tenant, message, this.deps.messageStore);
136
+ await coreProtocol.preProcessWrite(tenant, message, this.deps.validationStateReader);
169
137
  }
170
138
 
171
139
  // NOTE: We allow isLatestBaseState to be true ONLY if the incoming message comes with data, or if the incoming message is NOT an initial write
@@ -192,21 +160,8 @@ export class RecordsWriteHandler implements MethodHandler {
192
160
  }
193
161
 
194
162
  const indexes = await recordsWrite.constructIndexes(isLatestBaseState);
195
- await this.deps.messageStore.put(tenant, messageWithOptionalEncodedData, indexes);
196
- const messageCid = await Message.getCid(message);
197
- await this.deps.stateIndex!.insert(tenant, messageCid, indexes);
198
-
199
- // NOTE: We only emit a `RecordsWrite` when the message is the latest base state.
200
- // Because we allow a `RecordsWrite` which is not the latest state to be written, but not queried, we shouldn't emit it either.
201
- // It will be emitted as a part of a subsequent next write, if it is the latest base state.
202
- //
203
- // We emit `messageWithOptionalEncodedData` (not the raw `message`) so
204
- // that WebSocket subscribers receive inline `encodedData` for small
205
- // records (<= 30 KB). This allows live sync to store the record
206
- // immediately without a separate MessagesRead round-trip.
207
- if (this.deps.eventLog !== undefined && isLatestBaseState) {
208
- await this.deps.eventLog.emit(tenant, { message: messageWithOptionalEncodedData, initialWrite }, indexes, messageCid);
209
- }
163
+ const putResult = await this.deps.messageStore.put(tenant, messageWithOptionalEncodedData, indexes);
164
+ position = putResult.position;
210
165
  } catch (error) {
211
166
  if (error instanceof DwnError) {
212
167
  if (error.code === DwnErrorCode.RecordsWriteMissingEncodedDataInPrevious ||
@@ -230,12 +185,13 @@ export class RecordsWriteHandler implements MethodHandler {
230
185
  // for more details.
231
186
  status: (newMessageIsInitialWrite && dataStream === undefined) ?
232
187
  { code: 204, detail: 'No Content' } :
233
- { code: 202, detail: 'Accepted' }
188
+ { code: 202, detail: 'Accepted' },
189
+ position,
234
190
  };
235
191
 
236
- // delete all existing messages of the same record that are not newest, except for the initial write
237
- await StorageController.deleteAllOlderMessagesButKeepInitialWrite(
238
- tenant, existingMessages, newestMessage, this.deps.messageStore, this.deps.dataStore!, this.deps.stateIndex!
192
+ // displace every other message for this record, retaining only the initial write as non-latest state
193
+ await StorageController.deleteDisplacedMessagesAndRetainWrites(
194
+ tenant, existingMessages, newestMessage, this.deps.messageStore, this.deps.dataStore!, []
239
195
  );
240
196
 
241
197
  // Squash processing: if the incoming write is a squash, delete all older sibling records
@@ -254,7 +210,6 @@ export class RecordsWriteHandler implements MethodHandler {
254
210
  await coreProtocol.postProcessWrite(tenant, recordsWrite, {
255
211
  messageStore : this.deps.messageStore,
256
212
  dataStore : this.deps.dataStore!,
257
- stateIndex : this.deps.stateIndex!,
258
213
  });
259
214
  }
260
215
 
@@ -282,7 +237,7 @@ export class RecordsWriteHandler implements MethodHandler {
282
237
  // validate data integrity before setting.
283
238
  const dataBytes = await DataStream.toBytes(dataStream);
284
239
  const dataCid = await Cid.computeDagPbCidFromBytes(dataBytes);
285
- RecordsWriteHandler.validateDataIntegrity(message.descriptor.dataCid, message.descriptor.dataSize, dataCid, dataBytes.length);
240
+ RecordsWrite.validateDataIntegrity(message.descriptor.dataCid, message.descriptor.dataSize, dataCid, dataBytes.length);
286
241
 
287
242
  // Dispatch schema validation to the core protocol, if applicable.
288
243
  const coreProtocol = message.descriptor.protocol === undefined
@@ -304,7 +259,7 @@ export class RecordsWriteHandler implements MethodHandler {
304
259
  this.deps.dataStore!.put(tenant, message.recordId, message.descriptor.dataCid, dataStreamCopy2)
305
260
  ]);
306
261
 
307
- RecordsWriteHandler.validateDataIntegrity(message.descriptor.dataCid, message.descriptor.dataSize, dataCid, DataStorePutResult.dataSize);
262
+ RecordsWrite.validateDataIntegrity(message.descriptor.dataCid, message.descriptor.dataSize, dataCid, DataStorePutResult.dataSize);
308
263
  } catch (error) {
309
264
  // unwind/delete data if we have issue with storage or the data failed integrity validation
310
265
  await this.deps.dataStore!.delete(tenant, message.recordId, message.descriptor.dataCid);
@@ -316,31 +271,33 @@ export class RecordsWriteHandler implements MethodHandler {
316
271
  return messageWithOptionalEncodedData;
317
272
  }
318
273
 
319
- private async existingInitialWriteLacksData(
320
- tenant: string,
321
- existingMessage: RecordsWriteMessage,
322
- incomingMessage: RecordsWriteMessage,
323
- incomingHasData: boolean,
324
- ): Promise<boolean> {
325
- if (!incomingHasData) {
326
- return false;
274
+ private async getInitialWrite(
275
+ existingMessages: GenericMessage[],
276
+ newMessageIsInitialWrite: boolean,
277
+ ): Promise<RecordsWriteMessage | undefined> {
278
+ if (newMessageIsInitialWrite) {
279
+ return undefined;
327
280
  }
328
281
 
329
- const isInitial = await RecordsWrite.isInitialWrite(existingMessage);
330
- if (!isInitial) {
331
- return false;
332
- }
282
+ return RecordsWrite.getInitialWrite(existingMessages);
283
+ }
333
284
 
334
- const hasInlineData = !!(existingMessage as RecordsQueryReplyEntry).encodedData;
335
- const hasStoredData = this.deps.dataStore
336
- ? !!(await this.deps.dataStore.get(
337
- tenant,
338
- existingMessage.recordId,
339
- incomingMessage.descriptor.dataCid,
340
- ))
341
- : false;
285
+ private verifyImmutableProperties(
286
+ initialWrite: RecordsWriteMessage,
287
+ message: RecordsWriteMessage,
288
+ ): void {
289
+ try {
290
+ RecordsWrite.verifyEqualityOfImmutableProperties(initialWrite, message);
291
+ } catch (error) {
292
+ if (error instanceof DwnError && error.code === DwnErrorCode.RecordsWriteImmutablePropertyChanged) {
293
+ throw new DwnError(
294
+ DwnErrorCode.RecordsWriteImmutablePropertyChanged,
295
+ 'immutable RecordsWrite properties cannot be changed.'
296
+ );
297
+ }
342
298
 
343
- return !hasInlineData && !hasStoredData;
299
+ throw error;
300
+ }
344
301
  }
345
302
 
346
303
  private async processMessageWithoutDataStream(
@@ -355,7 +312,7 @@ export class RecordsWriteHandler implements MethodHandler {
355
312
  // we preform the dataCid check in case a user attempts to gain access to data by referencing a different known dataCid,
356
313
  // so we insure that the data is already associated with the existing newest message
357
314
  // See: https://github.com/enboxorg/enbox/issues/359 for more info
358
- RecordsWriteHandler.validateDataIntegrity(dataCid, dataSize, newestExistingWrite.descriptor.dataCid, newestExistingWrite.descriptor.dataSize);
315
+ RecordsWrite.validateDataIntegrity(dataCid, dataSize, newestExistingWrite.descriptor.dataCid, newestExistingWrite.descriptor.dataSize);
359
316
 
360
317
  if (dataSize <= DwnConstant.maxDataSizeAllowedToBeEncoded) {
361
318
  // we encode the data from the original write if it is smaller than the data-store threshold
@@ -371,9 +328,9 @@ export class RecordsWriteHandler implements MethodHandler {
371
328
  // else just make sure the data is in the data store
372
329
 
373
330
  // attempt to retrieve the data from the previous message
374
- const DataStoreGetResult = await this.deps.dataStore!.get(tenant, newestExistingWrite.recordId, message.descriptor.dataCid);
331
+ const priorDataExists = await this.deps.validationStateReader.hasStoredData(tenant, newestExistingWrite.recordId, message.descriptor.dataCid);
375
332
 
376
- if (DataStoreGetResult === undefined) {
333
+ if (!priorDataExists) {
377
334
  throw new DwnError(
378
335
  DwnErrorCode.RecordsWriteMissingDataInPrevious,
379
336
  `No dataStream was provided and unable to get data from previous message`
@@ -384,35 +341,6 @@ export class RecordsWriteHandler implements MethodHandler {
384
341
  return messageWithOptionalEncodedData;
385
342
  }
386
343
 
387
- /**
388
- * Validates the expected `dataCid` and `dataSize` in the descriptor vs the received data.
389
- *
390
- * @throws {DwnError} with `DwnErrorCode.RecordsWriteDataCidMismatch`
391
- * if the data stream resulted in a data CID that mismatches with `dataCid` in the given message
392
- * @throws {DwnError} with `DwnErrorCode.RecordsWriteDataSizeMismatch`
393
- * if `dataSize` in `descriptor` given mismatches the actual data size
394
- */
395
- private static validateDataIntegrity(
396
- expectedDataCid: string,
397
- expectedDataSize: number,
398
- actualDataCid: string,
399
- actualDataSize: number
400
- ): void {
401
- if (expectedDataCid !== actualDataCid) {
402
- throw new DwnError(
403
- DwnErrorCode.RecordsWriteDataCidMismatch,
404
- `actual data CID ${actualDataCid} does not match dataCid in descriptor: ${expectedDataCid}`
405
- );
406
- }
407
-
408
- if (expectedDataSize !== actualDataSize) {
409
- throw new DwnError(
410
- DwnErrorCode.RecordsWriteDataSizeMismatch,
411
- `actual data size ${actualDataSize} bytes does not match dataSize in descriptor: ${expectedDataSize}`
412
- );
413
- }
414
- }
415
-
416
344
  /**
417
345
  * Enforces the squash backstop: if the incoming message is at a protocol path with `$squash: true`,
418
346
  * and there exists a squash record at the same protocol path and parent context whose
@@ -426,16 +354,14 @@ export class RecordsWriteHandler implements MethodHandler {
426
354
  return;
427
355
  }
428
356
 
429
- // Fetch the protocol definition to check if $squash is enabled at this path.
430
- // Pass coreProtocols so that core protocols (e.g. permissions) are resolved from the registry.
357
+ // Fetch the protocol definition active at the incoming message timestamp to check if $squash is enabled at this path.
358
+ // The reader resolves core protocols (e.g. permissions) from the registry.
431
359
  let protocolDefinition;
432
360
  try {
433
- protocolDefinition = await ProtocolAuthorization.fetchProtocolDefinition(
361
+ protocolDefinition = await this.deps.validationStateReader.fetchProtocolDefinition(
434
362
  tenant,
435
363
  message.descriptor.protocol,
436
- this.deps.messageStore,
437
- undefined,
438
- this.deps.coreProtocols,
364
+ message.descriptor.messageTimestamp,
439
365
  );
440
366
  } catch (error) {
441
367
  // If the protocol definition can't be found, skip the backstop check.
@@ -455,36 +381,19 @@ export class RecordsWriteHandler implements MethodHandler {
455
381
  return;
456
382
  }
457
383
 
458
- // Find the most recent squash record at the same protocol path and parent context
459
- const filter: Filter = {
460
- interface : DwnInterfaceName.Records,
461
- method : DwnMethodName.Write,
462
- isLatestBaseState : true,
463
- protocol : message.descriptor.protocol,
464
- protocolPath : message.descriptor.protocolPath,
465
- squash : true,
466
- };
467
-
468
- // Scope by parent context for nested records
469
384
  const parentContextId = Records.getParentContextFromOfContextId(message.contextId);
470
- if (parentContextId !== undefined && parentContextId !== '') {
471
- const prefixFilter = FilterUtility.constructPrefixFilterAsRangeFilter(parentContextId);
472
- filter.contextId = prefixFilter;
473
- }
474
-
475
- const { messages: squashMessages } = await this.deps.messageStore.query(
385
+ const contextIdPrefix = parentContextId !== undefined && parentContextId !== '' ? parentContextId : undefined;
386
+ const newestSquash = await this.deps.validationStateReader.fetchLatestSquashRecordAtScope({
476
387
  tenant,
477
- [filter],
478
- { messageTimestamp: SortDirection.Descending },
479
- { limit: 1 },
480
- );
388
+ protocol : message.descriptor.protocol,
389
+ protocolPath : message.descriptor.protocolPath,
390
+ contextIdPrefix,
391
+ });
481
392
 
482
- if (squashMessages.length === 0) {
393
+ if (newestSquash === undefined) {
483
394
  return;
484
395
  }
485
396
 
486
- const newestSquash = squashMessages[0] as RecordsWriteMessage;
487
-
488
397
  // Reject if the incoming message's timestamp is <= the squash record's timestamp
489
398
  if (message.descriptor.messageTimestamp <= newestSquash.descriptor.messageTimestamp) {
490
399
  throw new DwnError(
@@ -496,7 +405,7 @@ export class RecordsWriteHandler implements MethodHandler {
496
405
  }
497
406
  }
498
407
 
499
- private async authorizeRecordsWrite(tenant: string, recordsWrite: RecordsWrite, messageStore: MessageStore): Promise<void> {
408
+ private async authorizeRecordsWrite(tenant: string, recordsWrite: RecordsWrite): Promise<void> {
500
409
  // if owner signature is given (`owner` is not `undefined`), it must be the same as the tenant DID
501
410
  if (recordsWrite.owner !== undefined && recordsWrite.owner !== tenant) {
502
411
  throw new DwnError(
@@ -506,11 +415,11 @@ export class RecordsWriteHandler implements MethodHandler {
506
415
  }
507
416
 
508
417
  if (recordsWrite.isSignedByAuthorDelegate) {
509
- await recordsWrite.authorizeAuthorDelegate(messageStore);
418
+ await recordsWrite.authorizeAuthorDelegate(this.deps.validationStateReader);
510
419
  }
511
420
 
512
421
  if (recordsWrite.isSignedByOwnerDelegate) {
513
- await recordsWrite.authorizeOwnerDelegate(messageStore);
422
+ await recordsWrite.authorizeOwnerDelegate(this.deps.validationStateReader);
514
423
  }
515
424
 
516
425
  if (recordsWrite.owner !== undefined) {
@@ -522,16 +431,16 @@ export class RecordsWriteHandler implements MethodHandler {
522
431
  return;
523
432
  } else if (recordsWrite.author !== undefined && Message.getPermissionGrantId(recordsWrite.signaturePayload!) !== undefined) {
524
433
  const permissionGrantId = Message.getPermissionGrantId(recordsWrite.signaturePayload!)!;
525
- const permissionGrant = await PermissionsProtocol.fetchGrant(tenant, messageStore, permissionGrantId);
434
+ const permissionGrant = await this.deps.validationStateReader.fetchGrant(tenant, permissionGrantId);
526
435
  await RecordsGrantAuthorization.authorizeWrite({
527
- recordsWriteMessage : recordsWrite.message,
528
- expectedGrantor : tenant,
529
- expectedGrantee : recordsWrite.author,
436
+ recordsWriteMessage : recordsWrite.message,
437
+ expectedGrantor : tenant,
438
+ expectedGrantee : recordsWrite.author,
530
439
  permissionGrant,
531
- messageStore
440
+ validationStateReader : this.deps.validationStateReader
532
441
  });
533
442
  } else {
534
- await ProtocolAuthorization.authorizeWrite(tenant, recordsWrite, messageStore, this.deps.coreProtocols);
443
+ await ProtocolAuthorization.authorizeWrite(tenant, recordsWrite, this.deps.validationStateReader);
535
444
  }
536
445
  }
537
446
  }
package/src/index.ts CHANGED
@@ -1,10 +1,14 @@
1
1
  // export everything that we want to be consumable
2
2
  export type { DwnConfig } from './dwn.js';
3
- export type { EventListener, EventLog, EventLogEntry, EventLogReadOptions, EventLogReadResult, EventLogSubscribeOptions, EventSubscription, MessageEvent, ProgressGapInfo, ProgressGapReason, ProgressToken, SubscriptionEose, SubscriptionError, SubscriptionEvent, SubscriptionListener, SubscriptionMessage, SubscriptionReply } from './types/subscriptions.js';
3
+ export type { EventLog, EventLogEntry, EventLogReadOptions, EventLogReadResult, EventLogSubscribeOptions, EventSubscription, MessageEvent, ProgressGapInfo, ProgressGapReason, ProgressToken, ReplicationFeedReader, SubscriptionEose, SubscriptionError, SubscriptionEvent, SubscriptionListener, SubscriptionMessage, SubscriptionReply, Wake, WakePublisher, WakeSubscriber } from './types/subscriptions.js';
4
4
  export type { AuthorizationModel, Descriptor, DelegatedGrantRecordsWriteMessage, GenericMessage, GenericMessageReply, GenericSignaturePayload, MessageSort, MessageSubscription, Pagination, QueryResultEntry, Status } from './types/message-types.js';
5
5
  export type { DependencyRef, ReplicationApplyOptions, ReplicationApplyResult, ReplicationApplyResultContext } from './core/replication-apply.js';
6
6
  export { replicationApplyResultFromReply } from './core/replication-apply.js';
7
- export type { MessagesFilter, MessagesReadMessage, MessagesReadReply, MessagesReadReplyEntry, MessagesReadDescriptor, MessagesSubscribeDescriptor, MessagesSubscribeMessage, MessagesSubscribeReply, MessagesSubscribeMessageOptions, MessagesSyncAction, MessagesSyncDescriptor, MessagesSyncDiffEntry, MessagesSyncMessage, MessagesSyncReply } from './types/messages-types.js';
7
+ export type { ValidationStateReader } from './types/validation-state-reader.js';
8
+ export { StoreValidationStateReader } from './core/validation-state-reader.js';
9
+ export type { RecordedValidationRead } from './core/recording-validation-state-reader.js';
10
+ export { RecordingValidationStateReader } from './core/recording-validation-state-reader.js';
11
+ export type { MessagesFilter, MessagesQueryDescriptor, MessagesQueryMessage, MessagesQueryReply, MessagesQueryReplyEntry, MessagesReadMessage, MessagesReadReply, MessagesReadReplyEntry, MessagesReadDescriptor, MessagesSubscribeDescriptor, MessagesSubscribeMessage, MessagesSubscribeReply, MessagesSubscribeMessageOptions } from './types/messages-types.js';
8
12
  export type { GT, LT, Filter, FilterValue, KeyValues, EqualFilter, OneOfFilter, RangeFilter, RangeCriterion, PaginationCursor, QueryOptions, RangeValue, StartsWithFilter } from './types/query-types.js';
9
13
  export type { ProtocolsConfigureDescriptor, ProtocolDefinition, ProtocolTypes, ProtocolRuleSet, ProtocolsQueryFilter, ProtocolsConfigureMessage, ProtocolsQueryMessage, ProtocolsQueryReply, ProtocolActionRule, ProtocolDeliveryStrategy, ProtocolPathEncryption, ProtocolsQueryDescriptor, ProtocolRecordLimitDefinition, ProtocolSizeDefinition, ProtocolTagsDefinition, ProtocolTagSchema, ProtocolType, ProtocolUses } from './types/protocols-types.js';
10
14
  export { ProtocolRecordLimitStrategy } from './types/protocols-types.js';
@@ -44,10 +48,11 @@ export type { KeyMaterial, PrivateKeyJwk, PublicKeyJwk, Jwk } from './types/jose
44
48
  export { Message } from './core/message.js';
45
49
  export { MessagesRead } from './interfaces/messages-read.js';
46
50
  export type { MessagesReadOptions } from './interfaces/messages-read.js';
47
- export { MessagesSync } from './interfaces/messages-sync.js';
48
- export type { MessagesSyncOptions } from './interfaces/messages-sync.js';
51
+ export { MessagesQuery } from './interfaces/messages-query.js';
52
+ export type { MessagesQueryOptions } from './interfaces/messages-query.js';
49
53
  export type { UnionMessageReply } from './core/message-reply.js';
50
- export type { MessageStore, MessageStoreOptions } from './types/message-store.js';
54
+ export type { MessageStore, MessageStoreOptions, MessageStorePutResult } from './types/message-store.js';
55
+ export { Replication } from './utils/replication.js';
51
56
  export type { MessageInterface } from './types/message-interface.js';
52
57
  export { PermissionGrant } from './protocols/permission-grant.js';
53
58
  export { PermissionRequest } from './protocols/permission-request.js';
@@ -93,19 +98,11 @@ export { MessageStoreLevel } from './store/message-store-level.js';
93
98
  export type { MessageStoreLevelConfig } from './store/message-store-level.js';
94
99
  export { ResumableTaskStoreLevel } from './store/resumable-task-store-level.js';
95
100
  export type { ResumableTaskStoreLevelConfig } from './store/resumable-task-store-level.js';
96
- export { EventEmitterEventLog } from './event-stream/event-emitter-event-log.js';
97
- export type { EventEmitterEventLogConfig } from './event-stream/event-emitter-event-log.js';
101
+ export { EventEmitterWakePublisher } from './event-stream/event-emitter-wake-publisher.js';
102
+ export { DurableEventLog } from './event-stream/durable-event-log.js';
103
+ export type { DurableEventLogConfig, DurableEventLogStore } from './event-stream/durable-event-log.js';
98
104
 
99
- // Sparse Merkle Tree and StateIndex
100
- export type { StateIndex } from './types/state-index.js';
101
- export { StateIndexLevel } from './state-index/state-index-level.js';
102
- export type { StateIndexLevelConfig } from './state-index/state-index-level.js';
103
- export { SparseMerkleTree } from './smt/sparse-merkle-tree.js';
104
- export { SMTStoreLevel } from './smt/smt-store-level.js';
105
- export { SMTStoreMemory } from './smt/smt-store-memory.js';
106
- export type { Hash, SMTNode, SMTInternalNode, SMTLeafNode, SMTProof, SMTDiffResult, SMTNodeStore } from './types/smt-types.js';
107
- export { hashChildren, hashEquals, hashKey, hashLeaf, hashToHex, hexToHash, getBit, initDefaultHashes, getDefaultHashes, SMT_DEPTH, ZERO_HASH } from './smt/smt-utils.js';
108
105
  // test library exports
109
- export type { GenerateFromRecordsWriteInput, GenerateFromRecordsWriteOut, GenerateGrantCreateInput, GenerateGrantCreateOutput, GenerateMessagesReadInput, GenerateMessagesReadOutput, GenerateMessagesSubscribeInput, GenerateMessagesSubscribeOutput, GenerateProtocolsConfigureInput, GenerateProtocolsConfigureOutput, GenerateProtocolsQueryInput, GenerateProtocolsQueryOutput, GenerateRecordsCountInput, GenerateRecordsCountOutput, GenerateRecordsDeleteInput, GenerateRecordsDeleteOutput, GenerateRecordsQueryInput, GenerateRecordsQueryOutput, GenerateRecordsSubscribeInput, GenerateRecordsSubscribeOutput, GenerateRecordsWriteInput, GenerateRecordsWriteOutput, Persona } from '../tests/utils/test-data-generator.js';
106
+ export type { GenerateFromRecordsWriteInput, GenerateFromRecordsWriteOut, GenerateGrantCreateInput, GenerateGrantCreateOutput, GenerateMessagesQueryInput, GenerateMessagesQueryOutput, GenerateMessagesReadInput, GenerateMessagesReadOutput, GenerateMessagesSubscribeInput, GenerateMessagesSubscribeOutput, GenerateProtocolsConfigureInput, GenerateProtocolsConfigureOutput, GenerateProtocolsQueryInput, GenerateProtocolsQueryOutput, GenerateRecordsCountInput, GenerateRecordsCountOutput, GenerateRecordsDeleteInput, GenerateRecordsDeleteOutput, GenerateRecordsQueryInput, GenerateRecordsQueryOutput, GenerateRecordsSubscribeInput, GenerateRecordsSubscribeOutput, GenerateRecordsWriteInput, GenerateRecordsWriteOutput, Persona } from '../tests/utils/test-data-generator.js';
110
107
  export { TestDataGenerator } from '../tests/utils/test-data-generator.js';
111
108
  export { Poller } from '../tests/utils/poller.js';
@@ -0,0 +1,70 @@
1
+ import type { MessageSigner } from '../types/signer.js';
2
+ import type { ProgressToken } from '../types/subscriptions.js';
3
+ import type { MessagesFilter, MessagesQueryDescriptor, MessagesQueryMessage } from '../types/messages-types.js';
4
+
5
+ import { AbstractMessage } from '../core/abstract-message.js';
6
+ import { Message } from '../core/message.js';
7
+ import { removeUndefinedProperties } from '@enbox/common';
8
+ import { Time } from '../utils/time.js';
9
+ import { validateProtocolUrlNormalized } from '../utils/url.js';
10
+ import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
11
+
12
+ export type MessagesQueryOptions = {
13
+ signer: MessageSigner;
14
+ messageTimestamp?: string;
15
+ filters?: MessagesFilter[];
16
+ permissionGrantIds?: string[];
17
+ cursor?: ProgressToken;
18
+ limit?: number;
19
+ cidsOnly?: boolean;
20
+ };
21
+
22
+ export class MessagesQuery extends AbstractMessage<MessagesQueryMessage> {
23
+ public static async parse(message: MessagesQueryMessage): Promise<MessagesQuery> {
24
+ Message.validateJsonSchema(message);
25
+ await Message.validateSignatureStructure(message.authorization.signature, message.descriptor);
26
+
27
+ for (const filter of message.descriptor.filters) {
28
+ if ('protocol' in filter && filter.protocol !== undefined) {
29
+ validateProtocolUrlNormalized(filter.protocol);
30
+ }
31
+ }
32
+
33
+ Time.validateTimestamp(message.descriptor.messageTimestamp);
34
+ return new MessagesQuery(message);
35
+ }
36
+
37
+ /**
38
+ * Creates a MessagesQuery message.
39
+ *
40
+ * @throws {DwnError} if json schema validation fails.
41
+ */
42
+ public static async create(options: MessagesQueryOptions): Promise<MessagesQuery> {
43
+ const permissionGrantInvocation = Message.normalizePermissionGrantInvocation({
44
+ permissionGrantIds: options.permissionGrantIds
45
+ });
46
+
47
+ const descriptor: MessagesQueryDescriptor = {
48
+ interface : DwnInterfaceName.Messages,
49
+ method : DwnMethodName.Query,
50
+ filters : options.filters ?? [],
51
+ messageTimestamp : options.messageTimestamp ?? Time.getCurrentTimestamp(),
52
+ cursor : options.cursor,
53
+ limit : options.limit,
54
+ cidsOnly : options.cidsOnly,
55
+ ...permissionGrantInvocation,
56
+ };
57
+
58
+ removeUndefinedProperties(descriptor);
59
+
60
+ const authorization = await Message.createAuthorization({
61
+ descriptor,
62
+ signer: options.signer,
63
+ ...permissionGrantInvocation,
64
+ });
65
+
66
+ const message: MessagesQueryMessage = { descriptor, authorization };
67
+ Message.validateJsonSchema(message);
68
+ return new MessagesQuery(message);
69
+ }
70
+ }
@@ -1,17 +1,18 @@
1
1
  import type { DataEncodedRecordsWriteMessage } from '../types/records-types.js';
2
2
  import type { MessageSigner } from '../types/signer.js';
3
- import type { MessageStore } from '../types/message-store.js';
3
+ import type { ValidationStateReader } from '../types/validation-state-reader.js';
4
4
  import type {
5
5
  ProtocolActionRule, ProtocolDefinition, ProtocolRuleSet, ProtocolsConfigureDescriptor,
6
6
  ProtocolsConfigureMessage, ProtocolTypes, ProtocolUses
7
7
  } from '../types/protocols-types.js';
8
8
 
9
9
  import { AbstractMessage } from '../core/abstract-message.js';
10
- import Ajv from 'ajv/dist/2020.js';
10
+ import { DwnConstant } from '../core/dwn-constant.js';
11
11
  import { Message } from '../core/message.js';
12
12
  import { PermissionGrant } from '../protocols/permission-grant.js';
13
13
  import { ProtocolsGrantAuthorization } from '../core/protocols-grant-authorization.js';
14
14
  import { Time } from '../utils/time.js';
15
+ import { validateProtocolTagSchemaDefinition } from '../utils/protocol-tags.js';
15
16
  import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
16
17
  import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
17
18
  import { isCrossProtocolRef, parseCrossProtocolRef } from '../utils/protocols.js';
@@ -69,16 +70,16 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
69
70
 
70
71
  /**
71
72
  * Authorizes the author-delegate who signed this message.
72
- * @param messageStore Used to check if the grant has been revoked.
73
+ * @param validationStateReader Used to check if the grant has been revoked.
73
74
  */
74
- public async authorizeAuthorDelegate(messageStore: MessageStore): Promise<void> {
75
+ public async authorizeAuthorDelegate(validationStateReader: ValidationStateReader): Promise<void> {
75
76
  const delegatedGrant = PermissionGrant.parse(this.message.authorization.authorDelegatedGrant!);
76
77
  await ProtocolsGrantAuthorization.authorizeConfigure({
77
78
  protocolsConfigureMessage : this.message,
78
79
  expectedGrantor : this.author!,
79
80
  expectedGrantee : this.signer!,
80
81
  permissionGrant : delegatedGrant,
81
- messageStore
82
+ validationStateReader
82
83
  });
83
84
  }
84
85
 
@@ -247,6 +248,13 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
247
248
  );
248
249
  }
249
250
 
251
+ if (max > DwnConstant.maxRecordLimit) {
252
+ throw new DwnError(
253
+ DwnErrorCode.ProtocolsConfigureInvalidRecordLimit,
254
+ `Invalid $recordLimit.max value ${max} at protocol path '${ruleSetProtocolPath}': must be <= ${DwnConstant.maxRecordLimit}.`
255
+ );
256
+ }
257
+
250
258
  const validStrategies = Object.values(ProtocolRecordLimitStrategy) as string[];
251
259
  if (!validStrategies.includes(strategy as string)) {
252
260
  throw new DwnError(
@@ -257,16 +265,18 @@ export class ProtocolsConfigure extends AbstractMessage<ProtocolsConfigureMessag
257
265
  }
258
266
  }
259
267
 
260
- if (ruleSet.$tags) {
261
- const ajv = new Ajv.default();
268
+ if (ruleSet.$tags !== undefined) {
262
269
  const { $allowUndefinedTags, $requiredTags, ...tagProperties } = ruleSet.$tags;
263
270
 
264
- // we validate each tag's expected schema to ensure it is a valid JSON schema
271
+ // validate each tag's schema against the DWN-supported tag schema subset
265
272
  for (const tag in tagProperties) {
266
273
  const tagSchemaDefinition = tagProperties[tag];
274
+ const schemaError = validateProtocolTagSchemaDefinition(
275
+ tagSchemaDefinition,
276
+ `${ruleSetProtocolPath}/$tags/${tag}`,
277
+ );
267
278
 
268
- if (!ajv.validateSchema(tagSchemaDefinition as Record<string, unknown>)) {
269
- const schemaError = ajv.errorsText(ajv.errors, { dataVar: `${ruleSetProtocolPath}/$tags/${tag}` });
279
+ if (schemaError !== undefined) {
270
280
  throw new DwnError(DwnErrorCode.ProtocolsConfigureInvalidTagSchema, `tags schema validation error: ${schemaError}`);
271
281
  }
272
282
  }