@enbox/dwn-sdk-js 0.3.9 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (525) hide show
  1. package/README.md +4 -4
  2. package/dist/browser.mjs +11 -11
  3. package/dist/browser.mjs.map +4 -4
  4. package/dist/esm/generated/precompiled-validators.js +783 -1206
  5. package/dist/esm/generated/precompiled-validators.js.map +1 -1
  6. package/dist/esm/src/core/dwn-constant.js +5 -0
  7. package/dist/esm/src/core/dwn-constant.js.map +1 -1
  8. package/dist/esm/src/core/dwn-error.js +13 -7
  9. package/dist/esm/src/core/dwn-error.js.map +1 -1
  10. package/dist/esm/src/core/grant-authorization.js +9 -18
  11. package/dist/esm/src/core/grant-authorization.js.map +1 -1
  12. package/dist/esm/src/core/message-reply.js.map +1 -1
  13. package/dist/esm/src/core/messages-grant-authorization.js +28 -61
  14. package/dist/esm/src/core/messages-grant-authorization.js.map +1 -1
  15. package/dist/esm/src/core/protocol-authorization-action.js +25 -27
  16. package/dist/esm/src/core/protocol-authorization-action.js.map +1 -1
  17. package/dist/esm/src/core/protocol-authorization-validation.js +31 -69
  18. package/dist/esm/src/core/protocol-authorization-validation.js.map +1 -1
  19. package/dist/esm/src/core/protocol-authorization.js +44 -118
  20. package/dist/esm/src/core/protocol-authorization.js.map +1 -1
  21. package/dist/esm/src/core/protocols-grant-authorization.js +5 -5
  22. package/dist/esm/src/core/protocols-grant-authorization.js.map +1 -1
  23. package/dist/esm/src/core/recording-validation-state-reader.js +84 -0
  24. package/dist/esm/src/core/recording-validation-state-reader.js.map +1 -0
  25. package/dist/esm/src/core/records-grant-authorization.js +11 -11
  26. package/dist/esm/src/core/records-grant-authorization.js.map +1 -1
  27. package/dist/esm/src/core/replication-apply.js +295 -0
  28. package/dist/esm/src/core/replication-apply.js.map +1 -0
  29. package/dist/esm/src/core/resumable-task-manager.js +5 -4
  30. package/dist/esm/src/core/resumable-task-manager.js.map +1 -1
  31. package/dist/esm/src/core/validation-state-reader.js +237 -0
  32. package/dist/esm/src/core/validation-state-reader.js.map +1 -0
  33. package/dist/esm/src/dwn.js +261 -16
  34. package/dist/esm/src/dwn.js.map +1 -1
  35. package/dist/esm/src/enums/dwn-interface-method.js +0 -1
  36. package/dist/esm/src/enums/dwn-interface-method.js.map +1 -1
  37. package/dist/esm/src/event-stream/durable-event-log.js +365 -0
  38. package/dist/esm/src/event-stream/durable-event-log.js.map +1 -0
  39. package/dist/esm/src/event-stream/event-emitter-wake-publisher.js +25 -0
  40. package/dist/esm/src/event-stream/event-emitter-wake-publisher.js.map +1 -0
  41. package/dist/esm/src/handlers/messages-query.js +159 -0
  42. package/dist/esm/src/handlers/messages-query.js.map +1 -0
  43. package/dist/esm/src/handlers/messages-read.js +5 -5
  44. package/dist/esm/src/handlers/messages-read.js.map +1 -1
  45. package/dist/esm/src/handlers/messages-subscribe.js +8 -8
  46. package/dist/esm/src/handlers/messages-subscribe.js.map +1 -1
  47. package/dist/esm/src/handlers/protocols-configure.js +30 -49
  48. package/dist/esm/src/handlers/protocols-configure.js.map +1 -1
  49. package/dist/esm/src/handlers/protocols-query.js +1 -1
  50. package/dist/esm/src/handlers/protocols-query.js.map +1 -1
  51. package/dist/esm/src/handlers/records-count.js +20 -11
  52. package/dist/esm/src/handlers/records-count.js.map +1 -1
  53. package/dist/esm/src/handlers/records-delete.js +20 -16
  54. package/dist/esm/src/handlers/records-delete.js.map +1 -1
  55. package/dist/esm/src/handlers/records-query.js +35 -11
  56. package/dist/esm/src/handlers/records-query.js.map +1 -1
  57. package/dist/esm/src/handlers/records-read.js +52 -42
  58. package/dist/esm/src/handlers/records-read.js.map +1 -1
  59. package/dist/esm/src/handlers/records-subscribe.js +107 -11
  60. package/dist/esm/src/handlers/records-subscribe.js.map +1 -1
  61. package/dist/esm/src/handlers/records-write.js +62 -116
  62. package/dist/esm/src/handlers/records-write.js.map +1 -1
  63. package/dist/esm/src/index.js +7 -8
  64. package/dist/esm/src/index.js.map +1 -1
  65. package/dist/esm/src/interfaces/messages-query.js +49 -0
  66. package/dist/esm/src/interfaces/messages-query.js.map +1 -0
  67. package/dist/esm/src/interfaces/protocols-configure.js +7 -3
  68. package/dist/esm/src/interfaces/protocols-configure.js.map +1 -1
  69. package/dist/esm/src/interfaces/protocols-query.js +3 -4
  70. package/dist/esm/src/interfaces/protocols-query.js.map +1 -1
  71. package/dist/esm/src/interfaces/records-count.js +4 -3
  72. package/dist/esm/src/interfaces/records-count.js.map +1 -1
  73. package/dist/esm/src/interfaces/records-delete.js +21 -4
  74. package/dist/esm/src/interfaces/records-delete.js.map +1 -1
  75. package/dist/esm/src/interfaces/records-query.js +4 -3
  76. package/dist/esm/src/interfaces/records-query.js.map +1 -1
  77. package/dist/esm/src/interfaces/records-read.js +3 -3
  78. package/dist/esm/src/interfaces/records-read.js.map +1 -1
  79. package/dist/esm/src/interfaces/records-subscribe.js +4 -3
  80. package/dist/esm/src/interfaces/records-subscribe.js.map +1 -1
  81. package/dist/esm/src/interfaces/records-write.js +27 -13
  82. package/dist/esm/src/interfaces/records-write.js.map +1 -1
  83. package/dist/esm/src/protocols/permissions.js +27 -34
  84. package/dist/esm/src/protocols/permissions.js.map +1 -1
  85. package/dist/esm/src/store/index-level.js +24 -9
  86. package/dist/esm/src/store/index-level.js.map +1 -1
  87. package/dist/esm/src/store/level-wrapper.js +7 -0
  88. package/dist/esm/src/store/level-wrapper.js.map +1 -1
  89. package/dist/esm/src/store/message-store-level.js +536 -42
  90. package/dist/esm/src/store/message-store-level.js.map +1 -1
  91. package/dist/esm/src/store/storage-controller.js +58 -49
  92. package/dist/esm/src/store/storage-controller.js.map +1 -1
  93. package/dist/esm/src/types/message-types.js.map +1 -1
  94. package/dist/esm/src/types/validation-state-reader.js +2 -0
  95. package/dist/esm/src/types/validation-state-reader.js.map +1 -0
  96. package/dist/esm/src/utils/messages.js +17 -0
  97. package/dist/esm/src/utils/messages.js.map +1 -1
  98. package/dist/esm/src/utils/record-limit-occupancy.js +244 -0
  99. package/dist/esm/src/utils/record-limit-occupancy.js.map +1 -0
  100. package/dist/esm/src/utils/records.js +50 -14
  101. package/dist/esm/src/utils/records.js.map +1 -1
  102. package/dist/esm/src/utils/replication.js +85 -0
  103. package/dist/esm/src/utils/replication.js.map +1 -0
  104. package/dist/esm/tests/core/grant-authorization.spec.js +4 -4
  105. package/dist/esm/tests/core/grant-authorization.spec.js.map +1 -1
  106. package/dist/esm/tests/core/process-message-parity.spec.js +222 -0
  107. package/dist/esm/tests/core/process-message-parity.spec.js.map +1 -0
  108. package/dist/esm/tests/core/protocol-authorization.spec.js +5 -2
  109. package/dist/esm/tests/core/protocol-authorization.spec.js.map +1 -1
  110. package/dist/esm/tests/core/records-grant-authorization.spec.js +5 -5
  111. package/dist/esm/tests/core/records-grant-authorization.spec.js.map +1 -1
  112. package/dist/esm/tests/core/replication-apply.spec.js +274 -0
  113. package/dist/esm/tests/core/replication-apply.spec.js.map +1 -0
  114. package/dist/esm/tests/core/replication-replay-property.spec.js +350 -0
  115. package/dist/esm/tests/core/replication-replay-property.spec.js.map +1 -0
  116. package/dist/esm/tests/core/validation-read-closure.spec.js +469 -0
  117. package/dist/esm/tests/core/validation-read-closure.spec.js.map +1 -0
  118. package/dist/esm/tests/core/validation-state-reader.spec.js +716 -0
  119. package/dist/esm/tests/core/validation-state-reader.spec.js.map +1 -0
  120. package/dist/esm/tests/durable-event-log.spec.js +373 -0
  121. package/dist/esm/tests/durable-event-log.spec.js.map +1 -0
  122. package/dist/esm/tests/dwn.spec.js +620 -14
  123. package/dist/esm/tests/dwn.spec.js.map +1 -1
  124. package/dist/esm/tests/features/author-delegated-grant.spec.js +9 -6
  125. package/dist/esm/tests/features/author-delegated-grant.spec.js.map +1 -1
  126. package/dist/esm/tests/features/owner-delegated-grant.spec.js +1 -4
  127. package/dist/esm/tests/features/owner-delegated-grant.spec.js.map +1 -1
  128. package/dist/esm/tests/features/owner-signature.spec.js +1 -4
  129. package/dist/esm/tests/features/owner-signature.spec.js.map +1 -1
  130. package/dist/esm/tests/features/permissions.spec.js +165 -4
  131. package/dist/esm/tests/features/permissions.spec.js.map +1 -1
  132. package/dist/esm/tests/features/protocol-composition.spec.js +8 -11
  133. package/dist/esm/tests/features/protocol-composition.spec.js.map +1 -1
  134. package/dist/esm/tests/features/protocol-create-action.spec.js +1 -4
  135. package/dist/esm/tests/features/protocol-create-action.spec.js.map +1 -1
  136. package/dist/esm/tests/features/protocol-delete-action.spec.js +3 -5
  137. package/dist/esm/tests/features/protocol-delete-action.spec.js.map +1 -1
  138. package/dist/esm/tests/features/protocol-update-action.spec.js +3 -6
  139. package/dist/esm/tests/features/protocol-update-action.spec.js.map +1 -1
  140. package/dist/esm/tests/features/records-delivery.spec.js +1 -4
  141. package/dist/esm/tests/features/records-delivery.spec.js.map +1 -1
  142. package/dist/esm/tests/features/records-immutable.spec.js +1 -4
  143. package/dist/esm/tests/features/records-immutable.spec.js.map +1 -1
  144. package/dist/esm/tests/features/records-nested-query-scope.spec.js +281 -0
  145. package/dist/esm/tests/features/records-nested-query-scope.spec.js.map +1 -0
  146. package/dist/esm/tests/features/records-prune-cross-protocol.spec.js +3 -7
  147. package/dist/esm/tests/features/records-prune-cross-protocol.spec.js.map +1 -1
  148. package/dist/esm/tests/features/records-prune.spec.js +11 -22
  149. package/dist/esm/tests/features/records-prune.spec.js.map +1 -1
  150. package/dist/esm/tests/features/records-record-limit.spec.js +441 -231
  151. package/dist/esm/tests/features/records-record-limit.spec.js.map +1 -1
  152. package/dist/esm/tests/features/records-squash.spec.js +6 -4
  153. package/dist/esm/tests/features/records-squash.spec.js.map +1 -1
  154. package/dist/esm/tests/features/records-tags.spec.js +1 -4
  155. package/dist/esm/tests/features/records-tags.spec.js.map +1 -1
  156. package/dist/esm/tests/features/resumable-tasks.spec.js +3 -5
  157. package/dist/esm/tests/features/resumable-tasks.spec.js.map +1 -1
  158. package/dist/esm/tests/fuzz/message-store.fuzz.spec.js +1 -2
  159. package/dist/esm/tests/fuzz/message-store.fuzz.spec.js.map +1 -1
  160. package/dist/esm/tests/fuzz/process-message.fuzz.spec.js +2 -4
  161. package/dist/esm/tests/fuzz/process-message.fuzz.spec.js.map +1 -1
  162. package/dist/esm/tests/fuzz/schema-validation.fuzz.spec.js +1 -1
  163. package/dist/esm/tests/fuzz/schema-validation.fuzz.spec.js.map +1 -1
  164. package/dist/esm/tests/handlers/messages-query.spec.js +246 -0
  165. package/dist/esm/tests/handlers/messages-query.spec.js.map +1 -0
  166. package/dist/esm/tests/handlers/messages-read.spec.js +2 -5
  167. package/dist/esm/tests/handlers/messages-read.spec.js.map +1 -1
  168. package/dist/esm/tests/handlers/messages-subscribe.spec.js +3 -14
  169. package/dist/esm/tests/handlers/messages-subscribe.spec.js.map +1 -1
  170. package/dist/esm/tests/handlers/protocols-configure.spec.js +27 -26
  171. package/dist/esm/tests/handlers/protocols-configure.spec.js.map +1 -1
  172. package/dist/esm/tests/handlers/protocols-query.spec.js +1 -4
  173. package/dist/esm/tests/handlers/protocols-query.spec.js.map +1 -1
  174. package/dist/esm/tests/handlers/records-count.spec.js +1 -4
  175. package/dist/esm/tests/handlers/records-count.spec.js.map +1 -1
  176. package/dist/esm/tests/handlers/records-delete.spec.js +312 -30
  177. package/dist/esm/tests/handlers/records-delete.spec.js.map +1 -1
  178. package/dist/esm/tests/handlers/records-query.spec.js +32 -9
  179. package/dist/esm/tests/handlers/records-query.spec.js.map +1 -1
  180. package/dist/esm/tests/handlers/records-read.spec.js +4 -4
  181. package/dist/esm/tests/handlers/records-read.spec.js.map +1 -1
  182. package/dist/esm/tests/handlers/records-subscribe.spec.js +33 -14
  183. package/dist/esm/tests/handlers/records-subscribe.spec.js.map +1 -1
  184. package/dist/esm/tests/handlers/records-write.spec.js +84 -38
  185. package/dist/esm/tests/handlers/records-write.spec.js.map +1 -1
  186. package/dist/esm/tests/interfaces/records-delete.spec.js +69 -2
  187. package/dist/esm/tests/interfaces/records-delete.spec.js.map +1 -1
  188. package/dist/esm/tests/interfaces/records-write.spec.js +4 -3
  189. package/dist/esm/tests/interfaces/records-write.spec.js.map +1 -1
  190. package/dist/esm/tests/protocols/permissions.spec.js +55 -6
  191. package/dist/esm/tests/protocols/permissions.spec.js.map +1 -1
  192. package/dist/esm/tests/scenarios/aggregator.spec.js +1 -4
  193. package/dist/esm/tests/scenarios/aggregator.spec.js.map +1 -1
  194. package/dist/esm/tests/scenarios/deleted-record.spec.js +1 -4
  195. package/dist/esm/tests/scenarios/deleted-record.spec.js.map +1 -1
  196. package/dist/esm/tests/scenarios/end-to-end-tests.spec.js +1 -4
  197. package/dist/esm/tests/scenarios/end-to-end-tests.spec.js.map +1 -1
  198. package/dist/esm/tests/scenarios/nested-roles.spec.js +1 -4
  199. package/dist/esm/tests/scenarios/nested-roles.spec.js.map +1 -1
  200. package/dist/esm/tests/scenarios/subscriptions.spec.js +1 -4
  201. package/dist/esm/tests/scenarios/subscriptions.spec.js.map +1 -1
  202. package/dist/esm/tests/store/message-store-level.spec.js +361 -5
  203. package/dist/esm/tests/store/message-store-level.spec.js.map +1 -1
  204. package/dist/esm/tests/store/message-store.spec.js +60 -0
  205. package/dist/esm/tests/store/message-store.spec.js.map +1 -1
  206. package/dist/esm/tests/test-event-stream.js +7 -3
  207. package/dist/esm/tests/test-event-stream.js.map +1 -1
  208. package/dist/esm/tests/test-stores.js +19 -9
  209. package/dist/esm/tests/test-stores.js.map +1 -1
  210. package/dist/esm/tests/test-suite.js +4 -4
  211. package/dist/esm/tests/test-suite.js.map +1 -1
  212. package/dist/esm/tests/utils/test-data-generator.js +25 -0
  213. package/dist/esm/tests/utils/test-data-generator.js.map +1 -1
  214. package/dist/esm/tests/utils/test-stub-generator.js.map +1 -1
  215. package/dist/esm/tests/utils/test-validation-state-reader.js +16 -0
  216. package/dist/esm/tests/utils/test-validation-state-reader.js.map +1 -0
  217. package/dist/types/generated/precompiled-validators.d.ts +6 -6
  218. package/dist/types/generated/precompiled-validators.d.ts.map +1 -1
  219. package/dist/types/src/core/core-protocol.d.ts +3 -3
  220. package/dist/types/src/core/core-protocol.d.ts.map +1 -1
  221. package/dist/types/src/core/dwn-constant.d.ts +5 -0
  222. package/dist/types/src/core/dwn-constant.d.ts.map +1 -1
  223. package/dist/types/src/core/dwn-error.d.ts +13 -7
  224. package/dist/types/src/core/dwn-error.d.ts.map +1 -1
  225. package/dist/types/src/core/grant-authorization.d.ts +5 -5
  226. package/dist/types/src/core/grant-authorization.d.ts.map +1 -1
  227. package/dist/types/src/core/message-reply.d.ts +5 -4
  228. package/dist/types/src/core/message-reply.d.ts.map +1 -1
  229. package/dist/types/src/core/messages-grant-authorization.d.ts +12 -15
  230. package/dist/types/src/core/messages-grant-authorization.d.ts.map +1 -1
  231. package/dist/types/src/core/protocol-authorization-action.d.ts +4 -5
  232. package/dist/types/src/core/protocol-authorization-action.d.ts.map +1 -1
  233. package/dist/types/src/core/protocol-authorization-validation.d.ts +13 -16
  234. package/dist/types/src/core/protocol-authorization-validation.d.ts.map +1 -1
  235. package/dist/types/src/core/protocol-authorization.d.ts +8 -33
  236. package/dist/types/src/core/protocol-authorization.d.ts.map +1 -1
  237. package/dist/types/src/core/protocols-grant-authorization.d.ts +4 -4
  238. package/dist/types/src/core/protocols-grant-authorization.d.ts.map +1 -1
  239. package/dist/types/src/core/recording-validation-state-reader.d.ts +75 -0
  240. package/dist/types/src/core/recording-validation-state-reader.d.ts.map +1 -0
  241. package/dist/types/src/core/records-grant-authorization.d.ts +8 -8
  242. package/dist/types/src/core/records-grant-authorization.d.ts.map +1 -1
  243. package/dist/types/src/core/replication-apply.d.ts +129 -0
  244. package/dist/types/src/core/replication-apply.d.ts.map +1 -0
  245. package/dist/types/src/core/resumable-task-manager.d.ts +1 -1
  246. package/dist/types/src/core/resumable-task-manager.d.ts.map +1 -1
  247. package/dist/types/src/core/validation-state-reader.d.ts +79 -0
  248. package/dist/types/src/core/validation-state-reader.d.ts.map +1 -0
  249. package/dist/types/src/dwn.d.ts +47 -13
  250. package/dist/types/src/dwn.d.ts.map +1 -1
  251. package/dist/types/src/enums/dwn-interface-method.d.ts +0 -1
  252. package/dist/types/src/enums/dwn-interface-method.d.ts.map +1 -1
  253. package/dist/types/src/event-stream/durable-event-log.d.ts +69 -0
  254. package/dist/types/src/event-stream/durable-event-log.d.ts.map +1 -0
  255. package/dist/types/src/event-stream/event-emitter-wake-publisher.d.ts +13 -0
  256. package/dist/types/src/event-stream/event-emitter-wake-publisher.d.ts.map +1 -0
  257. package/dist/types/src/handlers/messages-query.d.ts +20 -0
  258. package/dist/types/src/handlers/messages-query.d.ts.map +1 -0
  259. package/dist/types/src/handlers/messages-read.d.ts +1 -1
  260. package/dist/types/src/handlers/messages-read.d.ts.map +1 -1
  261. package/dist/types/src/handlers/messages-subscribe.d.ts.map +1 -1
  262. package/dist/types/src/handlers/protocols-configure.d.ts +0 -5
  263. package/dist/types/src/handlers/protocols-configure.d.ts.map +1 -1
  264. package/dist/types/src/handlers/records-count.d.ts +2 -1
  265. package/dist/types/src/handlers/records-count.d.ts.map +1 -1
  266. package/dist/types/src/handlers/records-delete.d.ts +2 -2
  267. package/dist/types/src/handlers/records-delete.d.ts.map +1 -1
  268. package/dist/types/src/handlers/records-query.d.ts +1 -1
  269. package/dist/types/src/handlers/records-query.d.ts.map +1 -1
  270. package/dist/types/src/handlers/records-read.d.ts +2 -1
  271. package/dist/types/src/handlers/records-read.d.ts.map +1 -1
  272. package/dist/types/src/handlers/records-subscribe.d.ts +4 -5
  273. package/dist/types/src/handlers/records-subscribe.d.ts.map +1 -1
  274. package/dist/types/src/handlers/records-write.d.ts +3 -11
  275. package/dist/types/src/handlers/records-write.d.ts.map +1 -1
  276. package/dist/types/src/index.d.ts +16 -18
  277. package/dist/types/src/index.d.ts.map +1 -1
  278. package/dist/types/src/interfaces/messages-query.d.ts +23 -0
  279. package/dist/types/src/interfaces/messages-query.d.ts.map +1 -0
  280. package/dist/types/src/interfaces/protocols-configure.d.ts +3 -3
  281. package/dist/types/src/interfaces/protocols-configure.d.ts.map +1 -1
  282. package/dist/types/src/interfaces/protocols-query.d.ts +2 -2
  283. package/dist/types/src/interfaces/protocols-query.d.ts.map +1 -1
  284. package/dist/types/src/interfaces/records-count.d.ts +3 -3
  285. package/dist/types/src/interfaces/records-count.d.ts.map +1 -1
  286. package/dist/types/src/interfaces/records-delete.d.ts +11 -3
  287. package/dist/types/src/interfaces/records-delete.d.ts.map +1 -1
  288. package/dist/types/src/interfaces/records-query.d.ts +3 -3
  289. package/dist/types/src/interfaces/records-query.d.ts.map +1 -1
  290. package/dist/types/src/interfaces/records-read.d.ts +3 -3
  291. package/dist/types/src/interfaces/records-read.d.ts.map +1 -1
  292. package/dist/types/src/interfaces/records-subscribe.d.ts +3 -3
  293. package/dist/types/src/interfaces/records-subscribe.d.ts.map +1 -1
  294. package/dist/types/src/interfaces/records-write.d.ts +15 -7
  295. package/dist/types/src/interfaces/records-write.d.ts.map +1 -1
  296. package/dist/types/src/protocols/permissions.d.ts +9 -12
  297. package/dist/types/src/protocols/permissions.d.ts.map +1 -1
  298. package/dist/types/src/store/index-level.d.ts +10 -1
  299. package/dist/types/src/store/index-level.d.ts.map +1 -1
  300. package/dist/types/src/store/level-wrapper.d.ts +5 -0
  301. package/dist/types/src/store/level-wrapper.d.ts.map +1 -1
  302. package/dist/types/src/store/message-store-level.d.ts +94 -14
  303. package/dist/types/src/store/message-store-level.d.ts.map +1 -1
  304. package/dist/types/src/store/storage-controller.d.ts +17 -14
  305. package/dist/types/src/store/storage-controller.d.ts.map +1 -1
  306. package/dist/types/src/types/message-store.d.ts +29 -1
  307. package/dist/types/src/types/message-store.d.ts.map +1 -1
  308. package/dist/types/src/types/message-types.d.ts +2 -0
  309. package/dist/types/src/types/message-types.d.ts.map +1 -1
  310. package/dist/types/src/types/messages-types.d.ts +21 -55
  311. package/dist/types/src/types/messages-types.d.ts.map +1 -1
  312. package/dist/types/src/types/method-handler.d.ts +2 -2
  313. package/dist/types/src/types/method-handler.d.ts.map +1 -1
  314. package/dist/types/src/types/permission-types.d.ts +1 -1
  315. package/dist/types/src/types/subscriptions.d.ts +50 -39
  316. package/dist/types/src/types/subscriptions.d.ts.map +1 -1
  317. package/dist/types/src/types/validation-state-reader.d.ts +116 -0
  318. package/dist/types/src/types/validation-state-reader.d.ts.map +1 -0
  319. package/dist/types/src/utils/messages.d.ts +10 -0
  320. package/dist/types/src/utils/messages.d.ts.map +1 -1
  321. package/dist/types/src/utils/record-limit-occupancy.d.ts +40 -0
  322. package/dist/types/src/utils/record-limit-occupancy.d.ts.map +1 -0
  323. package/dist/types/src/utils/records.d.ts +25 -3
  324. package/dist/types/src/utils/records.d.ts.map +1 -1
  325. package/dist/types/src/utils/replication.d.ts +22 -0
  326. package/dist/types/src/utils/replication.d.ts.map +1 -0
  327. package/dist/types/tests/core/process-message-parity.spec.d.ts +2 -0
  328. package/dist/types/tests/core/process-message-parity.spec.d.ts.map +1 -0
  329. package/dist/types/tests/core/replication-apply.spec.d.ts +2 -0
  330. package/dist/types/tests/core/replication-apply.spec.d.ts.map +1 -0
  331. package/dist/types/tests/core/replication-replay-property.spec.d.ts +2 -0
  332. package/dist/types/tests/core/replication-replay-property.spec.d.ts.map +1 -0
  333. package/dist/types/tests/core/validation-read-closure.spec.d.ts +2 -0
  334. package/dist/types/tests/core/validation-read-closure.spec.d.ts.map +1 -0
  335. package/dist/types/tests/core/validation-state-reader.spec.d.ts +2 -0
  336. package/dist/types/tests/core/validation-state-reader.spec.d.ts.map +1 -0
  337. package/dist/types/tests/durable-event-log.spec.d.ts +2 -0
  338. package/dist/types/tests/durable-event-log.spec.d.ts.map +1 -0
  339. package/dist/types/tests/dwn.spec.d.ts.map +1 -1
  340. package/dist/types/tests/features/author-delegated-grant.spec.d.ts.map +1 -1
  341. package/dist/types/tests/features/owner-delegated-grant.spec.d.ts.map +1 -1
  342. package/dist/types/tests/features/owner-signature.spec.d.ts.map +1 -1
  343. package/dist/types/tests/features/permissions.spec.d.ts.map +1 -1
  344. package/dist/types/tests/features/protocol-composition.spec.d.ts.map +1 -1
  345. package/dist/types/tests/features/protocol-create-action.spec.d.ts.map +1 -1
  346. package/dist/types/tests/features/protocol-delete-action.spec.d.ts.map +1 -1
  347. package/dist/types/tests/features/protocol-update-action.spec.d.ts.map +1 -1
  348. package/dist/types/tests/features/records-delivery.spec.d.ts.map +1 -1
  349. package/dist/types/tests/features/records-immutable.spec.d.ts.map +1 -1
  350. package/dist/types/tests/features/records-nested-query-scope.spec.d.ts +2 -0
  351. package/dist/types/tests/features/records-nested-query-scope.spec.d.ts.map +1 -0
  352. package/dist/types/tests/features/records-prune-cross-protocol.spec.d.ts.map +1 -1
  353. package/dist/types/tests/features/records-prune.spec.d.ts.map +1 -1
  354. package/dist/types/tests/features/records-record-limit.spec.d.ts.map +1 -1
  355. package/dist/types/tests/features/records-squash.spec.d.ts.map +1 -1
  356. package/dist/types/tests/features/records-tags.spec.d.ts.map +1 -1
  357. package/dist/types/tests/features/resumable-tasks.spec.d.ts.map +1 -1
  358. package/dist/types/tests/handlers/messages-query.spec.d.ts +2 -0
  359. package/dist/types/tests/handlers/messages-query.spec.d.ts.map +1 -0
  360. package/dist/types/tests/handlers/messages-read.spec.d.ts.map +1 -1
  361. package/dist/types/tests/handlers/messages-subscribe.spec.d.ts.map +1 -1
  362. package/dist/types/tests/handlers/protocols-configure.spec.d.ts.map +1 -1
  363. package/dist/types/tests/handlers/protocols-query.spec.d.ts.map +1 -1
  364. package/dist/types/tests/handlers/records-count.spec.d.ts.map +1 -1
  365. package/dist/types/tests/handlers/records-delete.spec.d.ts.map +1 -1
  366. package/dist/types/tests/handlers/records-query.spec.d.ts.map +1 -1
  367. package/dist/types/tests/handlers/records-read.spec.d.ts.map +1 -1
  368. package/dist/types/tests/handlers/records-subscribe.spec.d.ts.map +1 -1
  369. package/dist/types/tests/handlers/records-write.spec.d.ts.map +1 -1
  370. package/dist/types/tests/scenarios/deleted-record.spec.d.ts.map +1 -1
  371. package/dist/types/tests/scenarios/end-to-end-tests.spec.d.ts.map +1 -1
  372. package/dist/types/tests/scenarios/nested-roles.spec.d.ts.map +1 -1
  373. package/dist/types/tests/scenarios/subscriptions.spec.d.ts.map +1 -1
  374. package/dist/types/tests/store/message-store.spec.d.ts.map +1 -1
  375. package/dist/types/tests/test-event-stream.d.ts +1 -1
  376. package/dist/types/tests/test-event-stream.d.ts.map +1 -1
  377. package/dist/types/tests/test-stores.d.ts +5 -4
  378. package/dist/types/tests/test-stores.d.ts.map +1 -1
  379. package/dist/types/tests/test-suite.d.ts +1 -2
  380. package/dist/types/tests/test-suite.d.ts.map +1 -1
  381. package/dist/types/tests/utils/test-data-generator.d.ts +20 -1
  382. package/dist/types/tests/utils/test-data-generator.d.ts.map +1 -1
  383. package/dist/types/tests/utils/test-validation-state-reader.d.ts +15 -0
  384. package/dist/types/tests/utils/test-validation-state-reader.d.ts.map +1 -0
  385. package/package.json +2 -2
  386. package/src/core/core-protocol.ts +3 -3
  387. package/src/core/dwn-constant.ts +7 -1
  388. package/src/core/dwn-error.ts +13 -7
  389. package/src/core/grant-authorization.ts +11 -20
  390. package/src/core/message-reply.ts +6 -5
  391. package/src/core/messages-grant-authorization.ts +37 -100
  392. package/src/core/protocol-authorization-action.ts +29 -38
  393. package/src/core/protocol-authorization-validation.ts +41 -98
  394. package/src/core/protocol-authorization.ts +56 -202
  395. package/src/core/protocols-grant-authorization.ts +9 -9
  396. package/src/core/recording-validation-state-reader.ts +130 -0
  397. package/src/core/records-grant-authorization.ts +16 -16
  398. package/src/core/replication-apply.ts +412 -0
  399. package/src/core/resumable-task-manager.ts +10 -8
  400. package/src/core/validation-state-reader.ts +350 -0
  401. package/src/dwn.ts +417 -30
  402. package/src/enums/dwn-interface-method.ts +0 -1
  403. package/src/event-stream/durable-event-log.ts +509 -0
  404. package/src/event-stream/event-emitter-wake-publisher.ts +34 -0
  405. package/src/handlers/messages-query.ts +203 -0
  406. package/src/handlers/messages-read.ts +9 -10
  407. package/src/handlers/messages-subscribe.ts +12 -13
  408. package/src/handlers/protocols-configure.ts +37 -58
  409. package/src/handlers/protocols-query.ts +1 -1
  410. package/src/handlers/records-count.ts +24 -17
  411. package/src/handlers/records-delete.ts +29 -27
  412. package/src/handlers/records-query.ts +38 -17
  413. package/src/handlers/records-read.ts +63 -50
  414. package/src/handlers/records-subscribe.ts +132 -19
  415. package/src/handlers/records-write.ts +77 -168
  416. package/src/index.ts +16 -20
  417. package/src/interfaces/messages-query.ts +70 -0
  418. package/src/interfaces/protocols-configure.ts +12 -4
  419. package/src/interfaces/protocols-query.ts +4 -5
  420. package/src/interfaces/records-count.ts +9 -4
  421. package/src/interfaces/records-delete.ts +25 -5
  422. package/src/interfaces/records-query.ts +9 -4
  423. package/src/interfaces/records-read.ts +4 -4
  424. package/src/interfaces/records-subscribe.ts +9 -4
  425. package/src/interfaces/records-write.ts +41 -13
  426. package/src/protocols/permissions.ts +32 -52
  427. package/src/store/index-level.ts +30 -9
  428. package/src/store/level-wrapper.ts +9 -1
  429. package/src/store/message-store-level.ts +757 -47
  430. package/src/store/storage-controller.ts +74 -63
  431. package/src/types/message-store.ts +45 -2
  432. package/src/types/message-types.ts +3 -1
  433. package/src/types/messages-types.ts +26 -65
  434. package/src/types/method-handler.ts +3 -3
  435. package/src/types/permission-types.ts +1 -1
  436. package/src/types/subscriptions.ts +53 -42
  437. package/src/types/validation-state-reader.ts +127 -0
  438. package/src/utils/messages.ts +25 -1
  439. package/src/utils/record-limit-occupancy.ts +377 -0
  440. package/src/utils/records.ts +69 -13
  441. package/src/utils/replication.ts +122 -0
  442. package/dist/esm/src/core/record-chain.js +0 -64
  443. package/dist/esm/src/core/record-chain.js.map +0 -1
  444. package/dist/esm/src/event-stream/event-emitter-event-log.js +0 -334
  445. package/dist/esm/src/event-stream/event-emitter-event-log.js.map +0 -1
  446. package/dist/esm/src/handlers/messages-sync.js +0 -581
  447. package/dist/esm/src/handlers/messages-sync.js.map +0 -1
  448. package/dist/esm/src/interfaces/messages-sync.js +0 -54
  449. package/dist/esm/src/interfaces/messages-sync.js.map +0 -1
  450. package/dist/esm/src/smt/smt-store-level.js +0 -103
  451. package/dist/esm/src/smt/smt-store-level.js.map +0 -1
  452. package/dist/esm/src/smt/smt-store-memory.js +0 -41
  453. package/dist/esm/src/smt/smt-store-memory.js.map +0 -1
  454. package/dist/esm/src/smt/smt-utils.js +0 -129
  455. package/dist/esm/src/smt/smt-utils.js.map +0 -1
  456. package/dist/esm/src/smt/sparse-merkle-tree.js +0 -577
  457. package/dist/esm/src/smt/sparse-merkle-tree.js.map +0 -1
  458. package/dist/esm/src/state-index/state-index-level.js +0 -191
  459. package/dist/esm/src/state-index/state-index-level.js.map +0 -1
  460. package/dist/esm/src/sync/records-projection.js +0 -228
  461. package/dist/esm/src/sync/records-projection.js.map +0 -1
  462. package/dist/esm/src/types/smt-types.js +0 -5
  463. package/dist/esm/src/types/smt-types.js.map +0 -1
  464. package/dist/esm/src/types/state-index.js +0 -2
  465. package/dist/esm/src/types/state-index.js.map +0 -1
  466. package/dist/esm/tests/event-emitter-event-log.spec.js +0 -499
  467. package/dist/esm/tests/event-emitter-event-log.spec.js.map +0 -1
  468. package/dist/esm/tests/handlers/messages-sync.spec.js +0 -1771
  469. package/dist/esm/tests/handlers/messages-sync.spec.js.map +0 -1
  470. package/dist/esm/tests/smt/smt-store-level.spec.js +0 -132
  471. package/dist/esm/tests/smt/smt-store-level.spec.js.map +0 -1
  472. package/dist/esm/tests/smt/sparse-merkle-tree.spec.js +0 -732
  473. package/dist/esm/tests/smt/sparse-merkle-tree.spec.js.map +0 -1
  474. package/dist/esm/tests/state-index/state-index-level.spec.js +0 -245
  475. package/dist/esm/tests/state-index/state-index-level.spec.js.map +0 -1
  476. package/dist/esm/tests/sync/records-projection.spec.js +0 -245
  477. package/dist/esm/tests/sync/records-projection.spec.js.map +0 -1
  478. package/dist/types/src/core/record-chain.d.ts +0 -24
  479. package/dist/types/src/core/record-chain.d.ts.map +0 -1
  480. package/dist/types/src/event-stream/event-emitter-event-log.d.ts +0 -80
  481. package/dist/types/src/event-stream/event-emitter-event-log.d.ts.map +0 -1
  482. package/dist/types/src/handlers/messages-sync.d.ts +0 -83
  483. package/dist/types/src/handlers/messages-sync.d.ts.map +0 -1
  484. package/dist/types/src/interfaces/messages-sync.d.ts +0 -23
  485. package/dist/types/src/interfaces/messages-sync.d.ts.map +0 -1
  486. package/dist/types/src/smt/smt-store-level.d.ts +0 -32
  487. package/dist/types/src/smt/smt-store-level.d.ts.map +0 -1
  488. package/dist/types/src/smt/smt-store-memory.d.ts +0 -22
  489. package/dist/types/src/smt/smt-store-memory.d.ts.map +0 -1
  490. package/dist/types/src/smt/smt-utils.d.ts +0 -58
  491. package/dist/types/src/smt/smt-utils.d.ts.map +0 -1
  492. package/dist/types/src/smt/sparse-merkle-tree.d.ts +0 -124
  493. package/dist/types/src/smt/sparse-merkle-tree.d.ts.map +0 -1
  494. package/dist/types/src/state-index/state-index-level.d.ts +0 -83
  495. package/dist/types/src/state-index/state-index-level.d.ts.map +0 -1
  496. package/dist/types/src/sync/records-projection.d.ts +0 -98
  497. package/dist/types/src/sync/records-projection.d.ts.map +0 -1
  498. package/dist/types/src/types/smt-types.d.ts +0 -81
  499. package/dist/types/src/types/smt-types.d.ts.map +0 -1
  500. package/dist/types/src/types/state-index.d.ts +0 -90
  501. package/dist/types/src/types/state-index.d.ts.map +0 -1
  502. package/dist/types/tests/event-emitter-event-log.spec.d.ts +0 -2
  503. package/dist/types/tests/event-emitter-event-log.spec.d.ts.map +0 -1
  504. package/dist/types/tests/handlers/messages-sync.spec.d.ts +0 -2
  505. package/dist/types/tests/handlers/messages-sync.spec.d.ts.map +0 -1
  506. package/dist/types/tests/smt/smt-store-level.spec.d.ts +0 -2
  507. package/dist/types/tests/smt/smt-store-level.spec.d.ts.map +0 -1
  508. package/dist/types/tests/smt/sparse-merkle-tree.spec.d.ts +0 -2
  509. package/dist/types/tests/smt/sparse-merkle-tree.spec.d.ts.map +0 -1
  510. package/dist/types/tests/state-index/state-index-level.spec.d.ts +0 -2
  511. package/dist/types/tests/state-index/state-index-level.spec.d.ts.map +0 -1
  512. package/dist/types/tests/sync/records-projection.spec.d.ts +0 -2
  513. package/dist/types/tests/sync/records-projection.spec.d.ts.map +0 -1
  514. package/src/core/record-chain.ts +0 -99
  515. package/src/event-stream/event-emitter-event-log.ts +0 -430
  516. package/src/handlers/messages-sync.ts +0 -896
  517. package/src/interfaces/messages-sync.ts +0 -86
  518. package/src/smt/smt-store-level.ts +0 -143
  519. package/src/smt/smt-store-memory.ts +0 -53
  520. package/src/smt/smt-utils.ts +0 -149
  521. package/src/smt/sparse-merkle-tree.ts +0 -698
  522. package/src/state-index/state-index-level.ts +0 -239
  523. package/src/sync/records-projection.ts +0 -328
  524. package/src/types/smt-types.ts +0 -95
  525. package/src/types/state-index.ts +0 -100
@@ -0,0 +1,237 @@
1
+ import { FilterUtility } from '../utils/filter.js';
2
+ import { PermissionGrant } from '../protocols/permission-grant.js';
3
+ import { PermissionsProtocol } from '../protocols/permissions.js';
4
+ import { RecordsWrite } from '../interfaces/records-write.js';
5
+ import { SortDirection } from '../types/query-types.js';
6
+ import { DwnError, DwnErrorCode } from './dwn-error.js';
7
+ import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
8
+ import { fetchInitialRecordsWrite, fetchInitialRecordsWriteMessage, getInitialWrite } from '../interfaces/records-write-query.js';
9
+ /**
10
+ * The store-backed `ValidationStateReader` — the single place where validation-time state reads
11
+ * touch the `MessageStore`/`DataStore`.
12
+ */
13
+ export class StoreValidationStateReader {
14
+ messageStore;
15
+ dataStore;
16
+ coreProtocols;
17
+ constructor(input) {
18
+ this.messageStore = input.messageStore;
19
+ this.dataStore = input.dataStore;
20
+ this.coreProtocols = input.coreProtocols;
21
+ }
22
+ /** @inheritdoc */
23
+ async fetchInitialRecordsWrite(tenant, recordId) {
24
+ return fetchInitialRecordsWrite(this.messageStore, tenant, recordId);
25
+ }
26
+ /** @inheritdoc */
27
+ async fetchInitialWrite(tenant, recordId) {
28
+ const query = {
29
+ interface: DwnInterfaceName.Records,
30
+ method: DwnMethodName.Write,
31
+ recordId: recordId
32
+ };
33
+ const { messages } = await this.messageStore.query(tenant, [query]);
34
+ if (messages.length === 0) {
35
+ return undefined;
36
+ }
37
+ const initialWrite = await getInitialWrite(messages);
38
+ return initialWrite;
39
+ }
40
+ /** @inheritdoc */
41
+ async constructRecordChain(tenant, descendantRecordId) {
42
+ if (descendantRecordId === undefined) {
43
+ return [];
44
+ }
45
+ const recordChain = [];
46
+ // keep walking up the chain from the inbound message's parent, until there is no more parent
47
+ let currentRecordId = descendantRecordId;
48
+ while (currentRecordId !== undefined) {
49
+ const initialWrite = await this.fetchInitialWrite(tenant, currentRecordId);
50
+ // RecordsWrite needed should be available since we perform necessary checks at the time of writes,
51
+ // eg. check the immediate parent in `verifyProtocolPathAndContextId` at the time of writing,
52
+ // so if this condition is triggered, it means there is an unexpected bug that caused an incomplete chain.
53
+ // We add additional defensive check here because returning an unexpected/incorrect record chain could lead to security vulnerabilities.
54
+ if (initialWrite === undefined) {
55
+ throw new DwnError(DwnErrorCode.ProtocolAuthorizationParentNotFoundConstructingRecordChain, `Unexpected error that should never trigger: no parent found with ID ${currentRecordId} when constructing record chain.`);
56
+ }
57
+ recordChain.push(initialWrite);
58
+ currentRecordId = initialWrite.descriptor.parentId;
59
+ }
60
+ return recordChain.reverse(); // root record first
61
+ }
62
+ /** @inheritdoc */
63
+ async fetchParentRecord(input) {
64
+ const { tenant, parentProtocolUri, parentId } = input;
65
+ const latestStateQuery = {
66
+ isLatestBaseState: true, // NOTE: this filter is critical, to ensure are are not returning a deleted parent
67
+ interface: DwnInterfaceName.Records,
68
+ method: DwnMethodName.Write,
69
+ protocol: parentProtocolUri,
70
+ recordId: parentId
71
+ };
72
+ const { messages: parentMessages } = await this.messageStore.query(tenant, [latestStateQuery]);
73
+ const latestParent = parentMessages[0];
74
+ if (latestParent !== undefined) {
75
+ return latestParent;
76
+ }
77
+ const initialWrite = await fetchInitialRecordsWriteMessage(this.messageStore, tenant, parentId);
78
+ if (initialWrite?.descriptor.protocol !== parentProtocolUri) {
79
+ return undefined;
80
+ }
81
+ if (await this.recordHasLocalTombstone(tenant, parentId)) {
82
+ return undefined;
83
+ }
84
+ return initialWrite;
85
+ }
86
+ /** @inheritdoc */
87
+ async hasMatchingRoleRecord(input) {
88
+ const latestStateFilter = StoreValidationStateReader.constructRoleRecordFilter({ ...input, latestStateOnly: true });
89
+ const { messages: matchingMessages } = await this.messageStore.query(input.tenant, [latestStateFilter]);
90
+ if (matchingMessages.length > 0) {
91
+ return true;
92
+ }
93
+ const anyWriteFilter = StoreValidationStateReader.constructRoleRecordFilter({ ...input, latestStateOnly: false });
94
+ const { messages: candidates } = await this.messageStore.query(input.tenant, [anyWriteFilter]);
95
+ for (const candidate of candidates) {
96
+ if (!await RecordsWrite.isInitialWrite(candidate)) {
97
+ continue;
98
+ }
99
+ if (!await this.recordHasLocalTombstone(input.tenant, candidate.recordId)) {
100
+ return true;
101
+ }
102
+ }
103
+ return false;
104
+ }
105
+ /** @inheritdoc */
106
+ async queryLatestRoleRecords(input) {
107
+ const filter = StoreValidationStateReader.constructRoleRecordFilter({ ...input, latestStateOnly: true });
108
+ const { messages: matchingMessages } = await this.messageStore.query(input.tenant, [filter]);
109
+ return matchingMessages;
110
+ }
111
+ /** @inheritdoc */
112
+ async fetchGrant(tenant, permissionGrantId) {
113
+ const grantQuery = {
114
+ recordId: permissionGrantId,
115
+ isLatestBaseState: true
116
+ };
117
+ const { messages } = await this.messageStore.query(tenant, [grantQuery]);
118
+ const possibleGrantMessage = messages[0];
119
+ const dwnInterface = possibleGrantMessage?.descriptor.interface;
120
+ const dwnMethod = possibleGrantMessage?.descriptor.method;
121
+ if (dwnInterface !== DwnInterfaceName.Records ||
122
+ dwnMethod !== DwnMethodName.Write ||
123
+ possibleGrantMessage.descriptor.protocolPath !== PermissionsProtocol.grantPath) {
124
+ throw new DwnError(DwnErrorCode.GrantAuthorizationGrantMissing, `Could not find permission grant with record ID ${permissionGrantId}.`);
125
+ }
126
+ const permissionGrantMessage = possibleGrantMessage;
127
+ const permissionGrant = PermissionGrant.parse(permissionGrantMessage);
128
+ return permissionGrant;
129
+ }
130
+ /** @inheritdoc */
131
+ async fetchOldestGrantRevocation(tenant, permissionGrantId) {
132
+ const query = PermissionsProtocol.grantRevocationFilter(permissionGrantId);
133
+ const { messages } = await this.messageStore.query(tenant, [query], { messageTimestamp: SortDirection.Ascending }, { limit: 1 });
134
+ return messages[0];
135
+ }
136
+ /** @inheritdoc */
137
+ async fetchNewestRecordsWrite(tenant, recordId) {
138
+ return RecordsWrite.fetchNewestRecordsWrite(this.messageStore, tenant, recordId);
139
+ }
140
+ /** @inheritdoc */
141
+ async fetchProtocolDefinition(tenant, protocolUri, messageTimestamp) {
142
+ // if the protocol is a registered core protocol, return the definition directly without a store query
143
+ if (this.coreProtocols !== undefined) {
144
+ const coreDefinition = this.coreProtocols.getDefinition(protocolUri);
145
+ if (coreDefinition !== undefined) {
146
+ return coreDefinition;
147
+ }
148
+ }
149
+ // fetch the corresponding protocol definition
150
+ const query = {
151
+ interface: DwnInterfaceName.Protocols,
152
+ method: DwnMethodName.Configure,
153
+ protocol: protocolUri,
154
+ };
155
+ if (messageTimestamp === undefined) {
156
+ // default: return only the latest protocol definition
157
+ query.isLatestBaseState = true;
158
+ }
159
+ else {
160
+ // temporal lookup: find the protocol definition active at the given timestamp
161
+ query.messageTimestamp = { lte: messageTimestamp };
162
+ }
163
+ let { messages: protocols } = await this.messageStore.query(tenant, [query], { messageTimestamp: SortDirection.Descending }, { limit: 1 });
164
+ if (protocols.length === 0 && messageTimestamp !== undefined) {
165
+ // A record can be authored before the protocol's earliest retained config yet still have
166
+ // been admitted under that config: admission order, not timestamp order, governed the
167
+ // source. When no config predates the record, reconstruct the historical answer from the
168
+ // earliest retained config. A protocol that is genuinely not installed still has zero
169
+ // configs and fails below.
170
+ ({ messages: protocols } = await this.messageStore.query(tenant, [{
171
+ interface: DwnInterfaceName.Protocols,
172
+ method: DwnMethodName.Configure,
173
+ protocol: protocolUri,
174
+ }], { messageTimestamp: SortDirection.Ascending }, { limit: 1 }));
175
+ }
176
+ if (protocols.length === 0) {
177
+ throw new DwnError(DwnErrorCode.ProtocolAuthorizationProtocolNotFound, `unable to find protocol definition for ${protocolUri}`);
178
+ }
179
+ const protocolMessage = protocols[0];
180
+ return protocolMessage.descriptor.definition;
181
+ }
182
+ /** @inheritdoc */
183
+ async fetchLatestSquashRecordAtScope(input) {
184
+ const filter = {
185
+ interface: DwnInterfaceName.Records,
186
+ method: DwnMethodName.Write,
187
+ isLatestBaseState: true,
188
+ protocol: input.protocol,
189
+ protocolPath: input.protocolPath,
190
+ squash: true,
191
+ };
192
+ if (input.contextIdPrefix !== undefined) {
193
+ filter.contextId = FilterUtility.constructPrefixFilterAsRangeFilter(input.contextIdPrefix);
194
+ }
195
+ const { messages } = await this.messageStore.query(input.tenant, [filter], { messageTimestamp: SortDirection.Descending }, { limit: 1 });
196
+ return messages[0];
197
+ }
198
+ /** @inheritdoc */
199
+ async hasStoredData(tenant, recordId, dataCid) {
200
+ const dataStoreGetResult = await this.dataStore.get(tenant, recordId, dataCid);
201
+ return dataStoreGetResult !== undefined;
202
+ }
203
+ /**
204
+ * Checks whether a `RecordsDelete` tombstone for the given record is locally present.
205
+ * Retained initial writes can prove immutable parent/role facts, but a tombstone still wins.
206
+ */
207
+ async recordHasLocalTombstone(tenant, recordId) {
208
+ const tombstoneQuery = {
209
+ interface: DwnInterfaceName.Records,
210
+ method: DwnMethodName.Delete,
211
+ recordId: recordId
212
+ };
213
+ const { messages } = await this.messageStore.query(tenant, [tombstoneQuery]);
214
+ return messages.length > 0;
215
+ }
216
+ /**
217
+ * Constructs the role-record selector filter shared by the invoked-role lookup and the
218
+ * duplicate-role-recipient uniqueness check.
219
+ */
220
+ static constructRoleRecordFilter(input) {
221
+ const filter = {
222
+ interface: DwnInterfaceName.Records,
223
+ method: DwnMethodName.Write,
224
+ protocol: input.protocol,
225
+ protocolPath: input.protocolPath,
226
+ recipient: input.recipient,
227
+ };
228
+ if (input.latestStateOnly) {
229
+ filter.isLatestBaseState = true;
230
+ }
231
+ if (input.contextIdPrefix !== undefined) {
232
+ filter.contextId = FilterUtility.constructPrefixFilterAsRangeFilter(input.contextIdPrefix);
233
+ }
234
+ return filter;
235
+ }
236
+ }
237
+ //# sourceMappingURL=validation-state-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation-state-reader.js","sourceRoot":"","sources":["../../../../src/core/validation-state-reader.ts"],"names":[],"mappings":"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"}
@@ -1,35 +1,44 @@
1
1
  import { AllowAllTenantGate } from './core/tenant-gate.js';
2
+ import { Cid } from './utils/cid.js';
2
3
  import { CoreProtocolRegistry } from './core/core-protocol.js';
4
+ import { DataStream } from './utils/data-stream.js';
5
+ import { DwnConstant } from './core/dwn-constant.js';
3
6
  import { Message } from './core/message.js';
4
7
  import { messageReplyFromError } from './core/message-reply.js';
8
+ import { MessagesQueryHandler } from './handlers/messages-query.js';
5
9
  import { MessagesReadHandler } from './handlers/messages-read.js';
6
10
  import { MessagesSubscribeHandler } from './handlers/messages-subscribe.js';
7
- import { MessagesSyncHandler } from './handlers/messages-sync.js';
8
11
  import { PermissionsProtocol } from './protocols/permissions.js';
9
12
  import { ProtocolsConfigureHandler } from './handlers/protocols-configure.js';
10
13
  import { ProtocolsQueryHandler } from './handlers/protocols-query.js';
14
+ import { Records } from './utils/records.js';
11
15
  import { RecordsCountHandler } from './handlers/records-count.js';
16
+ import { RecordsDelete } from './interfaces/records-delete.js';
12
17
  import { RecordsDeleteHandler } from './handlers/records-delete.js';
13
18
  import { RecordsQueryHandler } from './handlers/records-query.js';
14
19
  import { RecordsReadHandler } from './handlers/records-read.js';
15
20
  import { RecordsSubscribeHandler } from './handlers/records-subscribe.js';
21
+ import { RecordsWrite } from './interfaces/records-write.js';
16
22
  import { RecordsWriteHandler } from './handlers/records-write.js';
17
23
  import { ResumableTaskManager } from './core/resumable-task-manager.js';
18
24
  import { StorageController } from './store/storage-controller.js';
25
+ import { StoreValidationStateReader } from './core/validation-state-reader.js';
19
26
  import { DidDht, DidJwk, DidKey, DidResolverCacheMemory, DidWeb, UniversalResolver } from '@enbox/dids';
27
+ import { DwnError, DwnErrorCode } from './core/dwn-error.js';
20
28
  import { DwnInterfaceName, DwnMethodName } from './enums/dwn-interface-method.js';
29
+ import { missingAncestorRecordIdsFromReply, replicationApplyResultFromReply } from './core/replication-apply.js';
21
30
  export class Dwn {
22
31
  methodHandlers;
23
32
  didResolver;
24
33
  messageStore;
25
34
  dataStore;
26
35
  resumableTaskStore;
27
- stateIndex;
28
36
  tenantGate;
29
37
  eventLog;
30
38
  storageController;
31
39
  resumableTaskManager;
32
40
  _coreProtocols;
41
+ validationStateReader;
33
42
  /** Whether the DWN owns the resolver's lifecycle (i.e., created it via defaults). */
34
43
  ownsResolver;
35
44
  constructor(config) {
@@ -39,33 +48,37 @@ export class Dwn {
39
48
  this.messageStore = config.messageStore;
40
49
  this.dataStore = config.dataStore;
41
50
  this.resumableTaskStore = config.resumableTaskStore;
42
- this.stateIndex = config.stateIndex;
51
+ // Initialize the core protocol registry with built-in system protocols.
52
+ this._coreProtocols = new CoreProtocolRegistry();
53
+ this._coreProtocols.register(new PermissionsProtocol());
54
+ // The single narrow surface through which validation logic reads state (replay-basis closure).
55
+ const validationStateReader = new StoreValidationStateReader({
56
+ messageStore: this.messageStore,
57
+ dataStore: this.dataStore,
58
+ coreProtocols: this._coreProtocols,
59
+ });
60
+ this.validationStateReader = config.instrumentValidationStateReader?.(validationStateReader) ?? validationStateReader;
43
61
  this.eventLog = config.eventLog;
44
62
  this.storageController = new StorageController({
45
63
  messageStore: this.messageStore,
46
64
  dataStore: this.dataStore,
47
- stateIndex: this.stateIndex,
48
- eventLog: this.eventLog
49
65
  });
50
66
  this.resumableTaskManager = new ResumableTaskManager(config.resumableTaskStore, this.storageController);
51
- // Initialize the core protocol registry with built-in system protocols.
52
- this._coreProtocols = new CoreProtocolRegistry();
53
- this._coreProtocols.register(new PermissionsProtocol());
54
67
  // Build the shared dependency bag once; every handler receives the same object
55
68
  // and accesses only the dependencies it needs.
56
69
  const deps = {
57
70
  didResolver: this.didResolver,
58
71
  messageStore: this.messageStore,
72
+ validationStateReader: this.validationStateReader,
59
73
  dataStore: this.dataStore,
60
- stateIndex: this.stateIndex,
61
74
  resumableTaskManager: this.resumableTaskManager,
62
75
  coreProtocols: this._coreProtocols,
63
76
  eventLog: this.eventLog,
64
77
  };
65
78
  this.methodHandlers = {
66
79
  [DwnInterfaceName.Messages + DwnMethodName.Read]: new MessagesReadHandler(deps),
80
+ [DwnInterfaceName.Messages + DwnMethodName.Query]: new MessagesQueryHandler(deps),
67
81
  [DwnInterfaceName.Messages + DwnMethodName.Subscribe]: new MessagesSubscribeHandler(deps),
68
- [DwnInterfaceName.Messages + DwnMethodName.Sync]: new MessagesSyncHandler(deps),
69
82
  [DwnInterfaceName.Protocols + DwnMethodName.Configure]: new ProtocolsConfigureHandler(deps),
70
83
  [DwnInterfaceName.Protocols + DwnMethodName.Query]: new ProtocolsQueryHandler(deps),
71
84
  [DwnInterfaceName.Records + DwnMethodName.Count]: new RecordsCountHandler(deps),
@@ -107,7 +120,6 @@ export class Dwn {
107
120
  await this.messageStore.open();
108
121
  await this.dataStore.open();
109
122
  await this.resumableTaskStore.open();
110
- await this.stateIndex.open();
111
123
  await this.eventLog?.open();
112
124
  await this.resumableTaskManager.resumeTasksAndWaitForCompletion();
113
125
  }
@@ -116,7 +128,6 @@ export class Dwn {
116
128
  await this.messageStore.close();
117
129
  await this.dataStore.close();
118
130
  await this.resumableTaskStore.close();
119
- await this.stateIndex.close();
120
131
  // Close the resolver's cache if the DWN owns it.
121
132
  const lifecycleResolver = this.didResolver;
122
133
  if (this.ownsResolver && typeof lifecycleResolver.close === 'function') {
@@ -133,15 +144,14 @@ export class Dwn {
133
144
  }
134
145
  /**
135
146
  * Returns the internal storage components for advanced operations that
136
- * cannot be expressed through the standard `processMessage()` pipeline
137
- * (e.g., owner-upgrade of externally authored encrypted records).
147
+ * cannot be expressed through the standard `processMessage()` pipeline.
138
148
  *
139
149
  * Callers are responsible for maintaining consistency across stores.
140
150
  */
141
151
  get storage() {
142
152
  return {
153
+ dataStore: this.dataStore,
143
154
  messageStore: this.messageStore,
144
- stateIndex: this.stateIndex,
145
155
  eventLog: this.eventLog,
146
156
  };
147
157
  }
@@ -156,10 +166,245 @@ export class Dwn {
156
166
  tenant,
157
167
  message: rawMessage,
158
168
  dataStream,
159
- subscriptionHandler
169
+ subscriptionHandler,
160
170
  });
161
171
  return methodHandlerReply;
162
172
  }
173
+ /**
174
+ * Applies a message obtained through replication and returns a structured
175
+ * outcome instead of an HTTP-like handler status. Normal authoring still
176
+ * uses `processMessage`; sync uses this entry point so missing local
177
+ * dependencies can be fetched and retried without treating the replicated
178
+ * message as permanently invalid.
179
+ */
180
+ async applyReplicatedMessage(tenant, rawMessage, options = {}) {
181
+ const tenantError = await this.validateTenant(tenant);
182
+ if (tenantError !== undefined) {
183
+ return { kind: 'Deferred', reason: 'tenant-inactive' };
184
+ }
185
+ const integrityError = await this.validateMessageIntegrity(rawMessage);
186
+ if (integrityError !== undefined) {
187
+ return { kind: 'Invalid', reason: integrityError.status.detail };
188
+ }
189
+ if (await this.replicatedMessageAlreadyStored(tenant, rawMessage)) {
190
+ return { kind: 'Duplicate' };
191
+ }
192
+ const reply = await this.processMessage(tenant, rawMessage, options);
193
+ const replicatedWriteBeatenByDeleteResult = await this.storeReplicatedWriteBeatenByDelete(tenant, rawMessage, reply, options);
194
+ if (replicatedWriteBeatenByDeleteResult !== undefined) {
195
+ return replicatedWriteBeatenByDeleteResult;
196
+ }
197
+ const protocolDefinition = await this.getReplicationApplyProtocolDefinition(tenant, rawMessage, reply);
198
+ const missingAncestorRecordIds = await this.getReplicationApplyMissingAncestors(tenant, rawMessage, reply);
199
+ return replicationApplyResultFromReply(rawMessage, reply, { protocolDefinition, missingAncestorRecordIds });
200
+ }
201
+ /**
202
+ * Computes the layer-batched missing-ancestor set for a replicated message that failed on a
203
+ * missing ancestor (immediate parent or record-chain construction), so the resulting
204
+ * `Incomplete` names every locally-absent ancestor at once. Returns `undefined`
205
+ * (single-ancestor emission) when the set cannot be computed.
206
+ */
207
+ async getReplicationApplyMissingAncestors(tenant, message, reply) {
208
+ try {
209
+ return await missingAncestorRecordIdsFromReply(tenant, message, reply, this.validationStateReader);
210
+ }
211
+ catch {
212
+ return undefined;
213
+ }
214
+ }
215
+ async storeReplicatedWriteBeatenByDelete(tenant, message, reply, options) {
216
+ const detail = reply.status.detail ?? '';
217
+ if (!detail.startsWith(`${DwnErrorCode.RecordsWriteNotAllowedAfterDelete}:`) || !Records.isRecordsWrite(message)) {
218
+ return undefined;
219
+ }
220
+ const query = {
221
+ interface: DwnInterfaceName.Records,
222
+ recordId: message.recordId,
223
+ };
224
+ const { messages: existingMessages } = await this.messageStore.query(tenant, [query]);
225
+ const initialWrite = await RecordsWrite.getInitialWrite(existingMessages);
226
+ const existingDelete = await Records.getNewestRecordsDelete(existingMessages);
227
+ if (existingDelete === undefined) {
228
+ return undefined;
229
+ }
230
+ const validationReply = await this.validateReplicatedWriteBeatenByDelete(tenant, message, existingMessages, options);
231
+ if (validationReply !== undefined) {
232
+ return replicationApplyResultFromReply(message, validationReply);
233
+ }
234
+ const recordsWrite = await RecordsWrite.parse(message);
235
+ const storedWriteMessage = { ...message };
236
+ delete storedWriteMessage.encodedData;
237
+ const recordsWriteIndexes = await recordsWrite.constructIndexes(false);
238
+ await this.messageStore.put(tenant, storedWriteMessage, recordsWriteIndexes);
239
+ const recordsDelete = await RecordsDelete.parse(existingDelete);
240
+ const visibilitySourceWrite = await Records.getNewestRecordsWrite([...existingMessages, storedWriteMessage]) ?? initialWrite;
241
+ const recordsDeleteIndexes = recordsDelete.constructIndexes(initialWrite, visibilitySourceWrite);
242
+ const recordsDeleteCid = await Message.getCid(existingDelete);
243
+ await this.messageStore.updateIndexes(tenant, recordsDeleteCid, recordsDeleteIndexes);
244
+ return { kind: 'Superseded' };
245
+ }
246
+ async validateReplicatedWriteBeatenByDelete(tenant, message, existingMessages, options) {
247
+ try {
248
+ await this.validateReplicatedWriteBeatenByDeleteOrThrow(tenant, message, existingMessages, options);
249
+ return undefined;
250
+ }
251
+ catch (error) {
252
+ const statusCode = error instanceof DwnError
253
+ ? this._coreProtocols.mapErrorToStatusCode(error.code) ?? 400
254
+ : 400;
255
+ return messageReplyFromError(error, statusCode);
256
+ }
257
+ }
258
+ async validateReplicatedWriteBeatenByDeleteOrThrow(tenant, message, existingMessages, options) {
259
+ const coreProtocol = message.descriptor.protocol === undefined
260
+ ? undefined
261
+ : this._coreProtocols.get(message.descriptor.protocol);
262
+ if (coreProtocol?.preProcessWrite !== undefined) {
263
+ await coreProtocol.preProcessWrite(tenant, message, this.validationStateReader);
264
+ }
265
+ if (options.dataStream !== undefined) {
266
+ await Dwn.validateReplicatedWriteBeatenByDeleteDataStream(message, options.dataStream, coreProtocol);
267
+ return;
268
+ }
269
+ if (await RecordsWrite.isInitialWrite(message)) {
270
+ return;
271
+ }
272
+ await this.validateReplicatedWriteBeatenByDeleteExistingData(tenant, message, existingMessages);
273
+ }
274
+ static async validateReplicatedWriteBeatenByDeleteDataStream(message, dataStream, coreProtocol) {
275
+ if (message.descriptor.dataSize <= DwnConstant.maxDataSizeAllowedToBeEncoded) {
276
+ const dataBytes = await DataStream.toBytes(dataStream);
277
+ const dataCid = await Cid.computeDagPbCidFromBytes(dataBytes);
278
+ RecordsWrite.validateDataIntegrity(message.descriptor.dataCid, message.descriptor.dataSize, dataCid, dataBytes.length);
279
+ if (coreProtocol?.validateRecord !== undefined) {
280
+ coreProtocol.validateRecord(message, dataBytes);
281
+ }
282
+ return;
283
+ }
284
+ const [dataCidStream, dataSizeStream] = DataStream.duplicateDataStream(dataStream, 2);
285
+ const [dataCid, dataSize] = await Promise.all([
286
+ Cid.computeDagPbCidFromStream(dataCidStream),
287
+ Dwn.getDataStreamByteLength(dataSizeStream),
288
+ ]);
289
+ RecordsWrite.validateDataIntegrity(message.descriptor.dataCid, message.descriptor.dataSize, dataCid, dataSize);
290
+ }
291
+ async validateReplicatedWriteBeatenByDeleteExistingData(tenant, message, existingMessages) {
292
+ const newestExistingWrite = await Records.getNewestRecordsWrite(existingMessages);
293
+ if (newestExistingWrite === undefined) {
294
+ throw new DwnError(DwnErrorCode.RecordsWriteGetInitialWriteNotFound, `initial write is missing for record ${message.recordId}`);
295
+ }
296
+ const { dataCid, dataSize } = message.descriptor;
297
+ RecordsWrite.validateDataIntegrity(dataCid, dataSize, newestExistingWrite.descriptor.dataCid, newestExistingWrite.descriptor.dataSize);
298
+ if (dataSize <= DwnConstant.maxDataSizeAllowedToBeEncoded) {
299
+ const newestExistingWriteWithData = newestExistingWrite;
300
+ if (newestExistingWriteWithData.encodedData === undefined) {
301
+ throw new DwnError(DwnErrorCode.RecordsWriteMissingEncodedDataInPrevious, `No dataStream was provided and unable to get data from previous message`);
302
+ }
303
+ return;
304
+ }
305
+ const priorDataExists = await this.validationStateReader.hasStoredData(tenant, newestExistingWrite.recordId, dataCid);
306
+ if (!priorDataExists) {
307
+ throw new DwnError(DwnErrorCode.RecordsWriteMissingDataInPrevious, `No dataStream was provided and unable to get data from previous message`);
308
+ }
309
+ }
310
+ static async getDataStreamByteLength(dataStream) {
311
+ let byteLength = 0;
312
+ for await (const chunk of DataStream.asAsyncIterable(dataStream)) {
313
+ byteLength += chunk.length;
314
+ }
315
+ return byteLength;
316
+ }
317
+ async getReplicationApplyProtocolDefinition(tenant, message, reply) {
318
+ const detail = reply.status.detail ?? '';
319
+ if (!detail.startsWith(`${DwnErrorCode.ProtocolAuthorizationMatchingRoleRecordNotFound}:`)) {
320
+ return undefined;
321
+ }
322
+ const lookup = Dwn.getReplicationApplyProtocolDefinitionLookup(message);
323
+ if (lookup === undefined) {
324
+ return undefined;
325
+ }
326
+ try {
327
+ return await this.validationStateReader.fetchProtocolDefinition(tenant, lookup.protocol, lookup.messageTimestamp);
328
+ }
329
+ catch {
330
+ return undefined;
331
+ }
332
+ }
333
+ static getReplicationApplyProtocolDefinitionLookup(message) {
334
+ if (Dwn.isRecordsWriteMessage(message)) {
335
+ return {
336
+ protocol: message.descriptor.protocol,
337
+ messageTimestamp: message.descriptor.messageTimestamp,
338
+ };
339
+ }
340
+ const protocol = Dwn.getMessageProtocolForReplicationApply(message);
341
+ return protocol === undefined ? undefined : { protocol };
342
+ }
343
+ static getMessageProtocolForReplicationApply(message) {
344
+ const descriptor = message.descriptor;
345
+ if (typeof descriptor.protocol === 'string') {
346
+ return descriptor.protocol;
347
+ }
348
+ if (typeof descriptor.filter?.protocol === 'string') {
349
+ return descriptor.filter.protocol;
350
+ }
351
+ }
352
+ static isRecordsWriteMessage(message) {
353
+ return message.descriptor.interface === DwnInterfaceName.Records &&
354
+ message.descriptor.method === DwnMethodName.Write;
355
+ }
356
+ async replicatedMessageAlreadyStored(tenant, message) {
357
+ const existingMessages = await this.getExistingMessagesForReplicationDedup(tenant, message);
358
+ if (existingMessages.length === 0) {
359
+ return false;
360
+ }
361
+ const incomingCid = await Message.getCid(message);
362
+ for (const existing of existingMessages) {
363
+ if (await Message.getCid(existing) !== incomingCid) {
364
+ continue;
365
+ }
366
+ return true;
367
+ }
368
+ return false;
369
+ }
370
+ async getExistingMessagesForReplicationDedup(tenant, message) {
371
+ const { descriptor } = message;
372
+ if (descriptor.interface === DwnInterfaceName.Records && descriptor.method === DwnMethodName.Write) {
373
+ const recordId = message.recordId;
374
+ if (typeof recordId !== 'string') {
375
+ return [];
376
+ }
377
+ const { messages } = await this.messageStore.query(tenant, [{
378
+ interface: DwnInterfaceName.Records,
379
+ recordId,
380
+ }]);
381
+ return messages;
382
+ }
383
+ if (descriptor.interface === DwnInterfaceName.Records && descriptor.method === DwnMethodName.Delete) {
384
+ const recordId = descriptor.recordId;
385
+ if (typeof recordId !== 'string') {
386
+ return [];
387
+ }
388
+ const { messages } = await this.messageStore.query(tenant, [{
389
+ interface: DwnInterfaceName.Records,
390
+ recordId,
391
+ }]);
392
+ return messages;
393
+ }
394
+ if (descriptor.interface === DwnInterfaceName.Protocols && descriptor.method === DwnMethodName.Configure) {
395
+ const protocol = descriptor.definition?.protocol;
396
+ if (typeof protocol !== 'string') {
397
+ return [];
398
+ }
399
+ const { messages } = await this.messageStore.query(tenant, [{
400
+ interface: DwnInterfaceName.Protocols,
401
+ method: DwnMethodName.Configure,
402
+ protocol,
403
+ }]);
404
+ return messages;
405
+ }
406
+ return [];
407
+ }
163
408
  /**
164
409
  * Checks tenant gate to see if tenant is allowed.
165
410
  * @param tenant The tenant DID to route the given message to.