@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
@@ -1 +1 @@
1
- {"version":3,"file":"records-grant-authorization.spec.js","sourceRoot":"","sources":["../../../../tests/core/records-grant-authorization.spec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"records-grant-authorization.spec.js","sourceRoot":"","sources":["../../../../tests/core/records-grant-authorization.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,274 @@
1
+ import { describe, expect, it } from 'bun:test';
2
+ import { TestDataGenerator } from '../utils/test-data-generator.js';
3
+ import { DwnErrorCode, replicationApplyResultFromReply } from '../../src/index.js';
4
+ describe('replicationApplyResultFromReply', () => {
5
+ it('classifies successful and idempotent replies', async () => {
6
+ const { message } = await TestDataGenerator.generateRecordsWrite();
7
+ expect(replicationApplyResultFromReply(message, { status: { code: 202 } }))
8
+ .toEqual({ kind: 'Applied' });
9
+ expect(replicationApplyResultFromReply(message, { status: { code: 204 } }))
10
+ .toEqual({ kind: 'Applied', ancestryOnly: true });
11
+ expect(replicationApplyResultFromReply(message, {
12
+ status: { code: 202 },
13
+ position: { streamId: 's', epoch: 'e', position: '1', messageCid: 'c' },
14
+ })).toEqual({
15
+ kind: 'Applied',
16
+ position: { streamId: 's', epoch: 'e', position: '1', messageCid: 'c' },
17
+ });
18
+ expect(replicationApplyResultFromReply(message, { status: { code: 409 } }))
19
+ .toEqual({ kind: 'Superseded' });
20
+ expect(replicationApplyResultFromReply(message, {
21
+ status: {
22
+ code: 400,
23
+ detail: `${DwnErrorCode.RecordsWriteNotAllowedAfterDelete}: record is deleted`,
24
+ },
25
+ })).toEqual({ kind: 'Superseded' });
26
+ });
27
+ it('classifies missing initial writes as retryable dependencies', async () => {
28
+ const protocol = 'https://example.com/protocol';
29
+ const { message } = await TestDataGenerator.generateRecordsWrite({ protocol });
30
+ expect(replicationApplyResultFromReply(message, {
31
+ status: {
32
+ code: 400,
33
+ detail: `${DwnErrorCode.RecordsWriteGetInitialWriteNotFound}: Initial write is not found.`,
34
+ },
35
+ })).toEqual({
36
+ kind: 'Incomplete',
37
+ missing: [{ type: 'InitialWrite', recordId: message.recordId, protocol }],
38
+ });
39
+ });
40
+ it('classifies protocol and parent misses from status detail', async () => {
41
+ const protocol = 'https://example.com/protocol';
42
+ const composedProtocol = 'https://example.com/composed';
43
+ const { message } = await TestDataGenerator.generateRecordsWrite({ protocol });
44
+ expect(replicationApplyResultFromReply(message, {
45
+ status: {
46
+ code: 400,
47
+ detail: `${DwnErrorCode.ProtocolAuthorizationProtocolNotFound}: protocol is not installed`,
48
+ },
49
+ })).toEqual({
50
+ kind: 'Incomplete',
51
+ missing: [{ type: 'Protocol', protocol }],
52
+ });
53
+ expect(replicationApplyResultFromReply(message, {
54
+ status: {
55
+ code: 400,
56
+ detail: `${DwnErrorCode.ProtocolsConfigureComposedProtocolNotInstalled}: composed protocol '${composedProtocol}' is not installed`,
57
+ },
58
+ })).toEqual({
59
+ kind: 'Incomplete',
60
+ missing: [{ type: 'Protocol', protocol: composedProtocol }],
61
+ });
62
+ expect(replicationApplyResultFromReply(message, {
63
+ status: {
64
+ code: 400,
65
+ detail: `${DwnErrorCode.ProtocolAuthorizationParentRecordNotFound}: parent record 'parent-record' in protocol '${protocol}' was not found`,
66
+ },
67
+ })).toEqual({
68
+ kind: 'Incomplete',
69
+ missing: [{ type: 'Parent', recordId: 'parent-record', protocol }],
70
+ });
71
+ });
72
+ it('classifies parent-chain misses with the incoming protocol', async () => {
73
+ const protocol = 'https://example.com/protocol';
74
+ const { message } = await TestDataGenerator.generateRecordsWrite({ protocol });
75
+ expect(replicationApplyResultFromReply(message, {
76
+ status: {
77
+ code: 401,
78
+ detail: `${DwnErrorCode.ProtocolAuthorizationParentNotFoundConstructingRecordChain}: parent with ID parent-record was not found`,
79
+ },
80
+ })).toEqual({
81
+ kind: 'Incomplete',
82
+ missing: [{ type: 'Ancestor', recordId: 'parent-record', protocol }],
83
+ });
84
+ });
85
+ it('emits Ancestor refs above a batched missing parent in a single Incomplete', async () => {
86
+ const protocol = 'https://example.com/protocol';
87
+ const { message } = await TestDataGenerator.generateRecordsWrite({ protocol });
88
+ expect(replicationApplyResultFromReply(message, {
89
+ status: {
90
+ code: 400,
91
+ detail: `${DwnErrorCode.ProtocolAuthorizationParentRecordNotFound}: Could not find parent record 'baz-record'.`,
92
+ },
93
+ }, { missingAncestorRecordIds: ['foo-record', 'bar-record', 'baz-record'] })).toEqual({
94
+ kind: 'Incomplete',
95
+ missing: [
96
+ { type: 'Ancestor', recordId: 'foo-record', protocol },
97
+ { type: 'Ancestor', recordId: 'bar-record', protocol },
98
+ { type: 'Parent', recordId: 'baz-record', protocol },
99
+ ],
100
+ });
101
+ });
102
+ it('emits one Ancestor ref per batched missing ancestor in a single Incomplete', async () => {
103
+ const protocol = 'https://example.com/protocol';
104
+ const { message } = await TestDataGenerator.generateRecordsWrite({ protocol });
105
+ expect(replicationApplyResultFromReply(message, {
106
+ status: {
107
+ code: 401,
108
+ detail: `${DwnErrorCode.ProtocolAuthorizationParentNotFoundConstructingRecordChain}: parent with ID baz-record was not found`,
109
+ },
110
+ }, { missingAncestorRecordIds: ['foo-record', 'bar-record', 'baz-record'] })).toEqual({
111
+ kind: 'Incomplete',
112
+ missing: [
113
+ { type: 'Ancestor', recordId: 'foo-record', protocol },
114
+ { type: 'Ancestor', recordId: 'bar-record', protocol },
115
+ { type: 'Ancestor', recordId: 'baz-record', protocol },
116
+ ],
117
+ });
118
+ });
119
+ it('falls back to the failure-named ancestor when the batched missing-ancestor set is empty', async () => {
120
+ const protocol = 'https://example.com/protocol';
121
+ const { message } = await TestDataGenerator.generateRecordsWrite({ protocol });
122
+ expect(replicationApplyResultFromReply(message, {
123
+ status: {
124
+ code: 401,
125
+ detail: `${DwnErrorCode.ProtocolAuthorizationParentNotFoundConstructingRecordChain}: parent with ID parent-record was not found`,
126
+ },
127
+ }, { missingAncestorRecordIds: [] })).toEqual({
128
+ kind: 'Incomplete',
129
+ missing: [{ type: 'Ancestor', recordId: 'parent-record', protocol }],
130
+ });
131
+ });
132
+ it('classifies grant, record data, and delete initial-write dependencies', async () => {
133
+ const protocol = 'https://example.com/protocol';
134
+ const permissionGrantId = 'grant-1';
135
+ const dataCid = 'bafyreib3xmaq5x6o6lhn5jvcnv6hvgh7e64xw66z3c3rgyk7wwq7qv2b5a';
136
+ const { message } = await TestDataGenerator.generateRecordsWrite({
137
+ dataCid,
138
+ dataSize: 42,
139
+ permissionGrantId,
140
+ protocol,
141
+ });
142
+ const deleteMessage = await TestDataGenerator.generateRecordsDelete({ recordId: 'deleted-record' });
143
+ expect(replicationApplyResultFromReply(message, {
144
+ status: {
145
+ code: 401,
146
+ detail: `${DwnErrorCode.GrantAuthorizationGrantMissing}: grant was not found`,
147
+ },
148
+ })).toEqual({
149
+ kind: 'Incomplete',
150
+ missing: [{ type: 'Grant', permissionGrantId }],
151
+ });
152
+ expect(replicationApplyResultFromReply(message, {
153
+ status: {
154
+ code: 400,
155
+ detail: `${DwnErrorCode.RecordsWriteMissingDataInPrevious}: data is missing`,
156
+ },
157
+ })).toEqual({
158
+ kind: 'Incomplete',
159
+ missing: [{ type: 'RecordData', recordId: message.recordId, dataCid, protocol }],
160
+ });
161
+ expect(replicationApplyResultFromReply(deleteMessage.message, {
162
+ status: { code: 404 },
163
+ })).toEqual({
164
+ kind: 'Incomplete',
165
+ missing: [{ type: 'InitialWrite', recordId: 'deleted-record' }],
166
+ });
167
+ });
168
+ it('classifies missing role records from the signed authorization payload', async () => {
169
+ const protocol = 'https://example.com/protocol';
170
+ const protocolRole = 'member';
171
+ const { author, message } = await TestDataGenerator.generateRecordsWrite({
172
+ protocol,
173
+ protocolPath: 'chat/message',
174
+ protocolRole,
175
+ });
176
+ expect(replicationApplyResultFromReply(message, {
177
+ status: {
178
+ code: 401,
179
+ detail: `${DwnErrorCode.ProtocolAuthorizationMatchingRoleRecordNotFound}: matching role record was not found`,
180
+ },
181
+ })).toEqual({
182
+ kind: 'Incomplete',
183
+ missing: [{
184
+ type: 'Role',
185
+ protocol,
186
+ protocolPath: protocolRole,
187
+ recipient: author.did,
188
+ }],
189
+ });
190
+ });
191
+ it('includes context prefixes for nested role dependencies', async () => {
192
+ const protocol = 'https://example.com/protocol';
193
+ const protocolRole = 'thread/member';
194
+ const { author, message } = await TestDataGenerator.generateRecordsWrite({
195
+ protocol,
196
+ protocolPath: 'thread/message',
197
+ protocolRole,
198
+ });
199
+ message.descriptor.contextId = 'thread-context/member-context';
200
+ expect(replicationApplyResultFromReply(message, {
201
+ status: {
202
+ code: 401,
203
+ detail: `${DwnErrorCode.ProtocolAuthorizationMatchingRoleRecordNotFound}: matching role record was not found`,
204
+ },
205
+ })).toEqual({
206
+ kind: 'Incomplete',
207
+ missing: [{
208
+ type: 'Role',
209
+ contextPrefix: 'thread-context',
210
+ protocol,
211
+ protocolPath: protocolRole,
212
+ recipient: author.did,
213
+ }],
214
+ });
215
+ });
216
+ it('resolves cross-protocol role dependencies through the composing protocol uses map', async () => {
217
+ const protocol = 'https://example.com/composing-protocol';
218
+ const roleProtocol = 'https://example.com/roles-protocol';
219
+ const protocolRole = 'roles:thread/member';
220
+ const protocolDefinition = {
221
+ protocol,
222
+ published: false,
223
+ uses: {
224
+ roles: roleProtocol,
225
+ },
226
+ types: {
227
+ message: {},
228
+ },
229
+ structure: {
230
+ message: {},
231
+ },
232
+ };
233
+ const { author, message } = await TestDataGenerator.generateRecordsWrite({
234
+ protocol,
235
+ protocolPath: 'message',
236
+ protocolRole,
237
+ });
238
+ message.descriptor.contextId = 'thread-context/member-context';
239
+ expect(replicationApplyResultFromReply(message, {
240
+ status: {
241
+ code: 401,
242
+ detail: `${DwnErrorCode.ProtocolAuthorizationMatchingRoleRecordNotFound}: matching role record was not found`,
243
+ },
244
+ }, { protocolDefinition })).toEqual({
245
+ kind: 'Incomplete',
246
+ missing: [{
247
+ type: 'Role',
248
+ contextPrefix: 'thread-context',
249
+ protocol: roleProtocol,
250
+ protocolPath: 'thread/member',
251
+ recipient: author.did,
252
+ }],
253
+ });
254
+ });
255
+ it('classifies resolver and storage failures as deferred', async () => {
256
+ const { message } = await TestDataGenerator.generateRecordsWrite();
257
+ expect(replicationApplyResultFromReply(message, {
258
+ status: {
259
+ code: 401,
260
+ detail: `${DwnErrorCode.GeneralJwsVerifierGetPublicKeyNotFound}: unable to resolve DID`,
261
+ },
262
+ })).toEqual({ kind: 'Deferred', reason: 'resolver-unavailable' });
263
+ expect(replicationApplyResultFromReply(message, {
264
+ status: { code: 500, detail: 'storage unavailable' },
265
+ })).toEqual({ kind: 'Deferred', reason: 'storage' });
266
+ });
267
+ it('classifies unmatched client errors as invalid', async () => {
268
+ const { message } = await TestDataGenerator.generateRecordsWrite();
269
+ expect(replicationApplyResultFromReply(message, {
270
+ status: { code: 400 },
271
+ })).toEqual({ kind: 'Invalid', reason: 'replicated message rejected with status 400' });
272
+ });
273
+ });
274
+ //# sourceMappingURL=replication-apply.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replication-apply.spec.js","sourceRoot":"","sources":["../../../../tests/core/replication-apply.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,350 @@
1
+ import fc from 'fast-check';
2
+ import { rm } from 'node:fs/promises';
3
+ import { TestDataGenerator } from '../utils/test-data-generator.js';
4
+ import { afterAll, describe, expect, it } from 'bun:test';
5
+ import { DataStoreLevel, DataStream, Dwn, DwnInterfaceName, DwnMethodName, Encoder, Jws, Message, MessageStoreLevel, Records, RecordsDelete, Replication, ResumableTaskStoreLevel, Time, } from '../../src/index.js';
6
+ import { DidKey, UniversalResolver } from '@enbox/dids';
7
+ // Keep CI deterministic and cheap; set FAST_CHECK_NUM_RUNS for deeper local or nightly sweeps.
8
+ const numRuns = Math.min(Number(process.env.FAST_CHECK_NUM_RUNS) || 5, 20);
9
+ const replayOperations = [
10
+ 'config-churn',
11
+ 'create-note',
12
+ 'create-pin',
13
+ 'create-profile',
14
+ 'create-thread-reply',
15
+ 'delete-note',
16
+ 'prune-thread',
17
+ 'squash-patch',
18
+ 'update-note',
19
+ ];
20
+ describe('replication replay property', () => {
21
+ const didResolver = new UniversalResolver({ didResolvers: [DidKey] });
22
+ const harnesses = [];
23
+ afterAll(async () => {
24
+ for (const harness of harnesses) {
25
+ await harness.dwn.close();
26
+ await rm(harness.dataPath, { force: true, recursive: true });
27
+ }
28
+ });
29
+ it('should replay the retained feed into a fresh DWN with equal live records, fingerprints, and data bytes', async () => {
30
+ await fc.assert(fc.asyncProperty(fc.record({
31
+ operations: fc.array(fc.constantFrom(...replayOperations), { minLength: 8, maxLength: 14 }),
32
+ replayOrderSeed: fc.integer({ min: 0, max: 0xffffffff }),
33
+ runId: fc.uuid(),
34
+ }), async ({ operations, replayOrderSeed, runId }) => {
35
+ const source = await createHarness(`${runId}-source`);
36
+ const replica = await createHarness(`${runId}-replica`);
37
+ harnesses.push(source, replica);
38
+ const alice = await TestDataGenerator.generateDidKeyPersona();
39
+ const protocol = `https://replay-property.example/${runId}`;
40
+ await driveSourceMutationPlan(source.dwn, alice, protocol, operations);
41
+ await replayFeed(source.dwn, replica.dwn, alice, replayOrderSeed);
42
+ await expectFingerprintsEqual(source.messageStore, replica.messageStore, alice.did, protocol);
43
+ await expectLiveRecordsEqual(source.dwn, replica.dwn, alice, protocol);
44
+ await expectOccupantsEqual(source.dwn, replica.dwn, alice, protocol, 'profile', 1);
45
+ await expectOccupantsEqual(source.dwn, replica.dwn, alice, protocol, 'pin', 2);
46
+ }), { numRuns, seed: 1046 });
47
+ });
48
+ async function createHarness(path) {
49
+ const dataPath = `__TESTDATA__/replication-replay-property/${path}`;
50
+ await rm(dataPath, { force: true, recursive: true });
51
+ const messageStore = new MessageStoreLevel({ location: `${dataPath}/messages` });
52
+ const dataStore = new DataStoreLevel({ blockstoreLocation: `${dataPath}/data` });
53
+ const resumableTaskStore = new ResumableTaskStoreLevel({ location: `${dataPath}/resumable-tasks` });
54
+ const dwn = await Dwn.create({ dataStore, didResolver, messageStore, resumableTaskStore });
55
+ return { dataPath, dwn, messageStore };
56
+ }
57
+ });
58
+ async function driveSourceMutationPlan(dwn, alice, protocol, operations) {
59
+ let sequence = 1;
60
+ let configRevision = 1;
61
+ const nextTimestamp = () => Time.createOffsetTimestamp({ seconds: sequence++ }, Time.createTimestamp({ year: 2025, month: 1, day: 1 }));
62
+ const notes = [];
63
+ const threads = [];
64
+ await installProtocol(dwn, alice, protocolDefinition(protocol, configRevision), nextTimestamp());
65
+ const firstNote = await writeRecord(dwn, alice, protocol, 'note', 'initial-note-a', nextTimestamp());
66
+ const secondNote = await writeRecord(dwn, alice, protocol, 'note', 'initial-note-b', nextTimestamp());
67
+ notes.push({ deleted: false, latest: firstNote.recordsWrite, recordId: firstNote.message.recordId }, { deleted: false, latest: secondNote.recordsWrite, recordId: secondNote.message.recordId });
68
+ await writeRecord(dwn, alice, protocol, 'profile', 'profile-a', nextTimestamp());
69
+ await writeRecord(dwn, alice, protocol, 'profile', 'profile-b', nextTimestamp());
70
+ await writeRecord(dwn, alice, protocol, 'pin', 'pin-a', nextTimestamp());
71
+ await writeRecord(dwn, alice, protocol, 'pin', 'pin-b', nextTimestamp());
72
+ await writeRecord(dwn, alice, protocol, 'pin', 'pin-c', nextTimestamp());
73
+ const thread = await writeRecord(dwn, alice, protocol, 'thread', 'thread-a', nextTimestamp());
74
+ await writeRecord(dwn, alice, protocol, 'thread/reply', 'reply-a', nextTimestamp(), thread.message.contextId);
75
+ threads.push({ deleted: false, recordId: thread.message.recordId });
76
+ await writeRecord(dwn, alice, protocol, 'patch', 'patch-before-squash', nextTimestamp());
77
+ for (const operation of operations) {
78
+ if (operation === 'config-churn') {
79
+ configRevision++;
80
+ await installProtocol(dwn, alice, protocolDefinition(protocol, configRevision), nextTimestamp());
81
+ }
82
+ else if (operation === 'create-note') {
83
+ const note = await writeRecord(dwn, alice, protocol, 'note', `${operation}-${sequence}`, nextTimestamp());
84
+ notes.push({ deleted: false, latest: note.recordsWrite, recordId: note.message.recordId });
85
+ }
86
+ else if (operation === 'create-pin') {
87
+ await writeRecord(dwn, alice, protocol, 'pin', `${operation}-${sequence}`, nextTimestamp());
88
+ }
89
+ else if (operation === 'create-profile') {
90
+ await writeRecord(dwn, alice, protocol, 'profile', `${operation}-${sequence}`, nextTimestamp());
91
+ }
92
+ else if (operation === 'create-thread-reply') {
93
+ const createdThread = await writeRecord(dwn, alice, protocol, 'thread', `${operation}-thread-${sequence}`, nextTimestamp());
94
+ await writeRecord(dwn, alice, protocol, 'thread/reply', `${operation}-reply-${sequence}`, nextTimestamp(), createdThread.message.contextId);
95
+ threads.push({ deleted: false, recordId: createdThread.message.recordId });
96
+ }
97
+ else if (operation === 'delete-note') {
98
+ const note = notes.find(candidate => !candidate.deleted);
99
+ if (note !== undefined) {
100
+ await deleteRecord(dwn, alice, note.recordId);
101
+ note.deleted = true;
102
+ }
103
+ }
104
+ else if (operation === 'prune-thread') {
105
+ const activeThread = threads.find(candidate => !candidate.deleted);
106
+ if (activeThread !== undefined) {
107
+ await deleteRecord(dwn, alice, activeThread.recordId, true);
108
+ activeThread.deleted = true;
109
+ }
110
+ }
111
+ else if (operation === 'squash-patch') {
112
+ await writeRecord(dwn, alice, protocol, 'patch', `${operation}-${sequence}`, nextTimestamp(), undefined, true);
113
+ }
114
+ else {
115
+ const note = notes.find(candidate => !candidate.deleted);
116
+ if (note !== undefined) {
117
+ const update = await TestDataGenerator.generateFromRecordsWrite({
118
+ author: alice,
119
+ data: Encoder.stringToBytes(`${operation}-${sequence}`),
120
+ existingWrite: note.latest,
121
+ messageTimestamp: nextTimestamp(),
122
+ });
123
+ const reply = await dwn.processMessage(alice.did, update.message, { dataStream: update.dataStream });
124
+ expect(reply.status.code).toBe(202);
125
+ note.latest = update.recordsWrite;
126
+ }
127
+ }
128
+ }
129
+ }
130
+ function protocolDefinition(protocol, revision) {
131
+ const extraType = `extra${revision}`;
132
+ return {
133
+ protocol,
134
+ published: false,
135
+ types: {
136
+ [extraType]: {},
137
+ note: {},
138
+ patch: {},
139
+ pin: {},
140
+ profile: {},
141
+ reply: {},
142
+ thread: {},
143
+ },
144
+ structure: {
145
+ [extraType]: {},
146
+ note: {},
147
+ patch: { $squash: true },
148
+ pin: { $recordLimit: { max: 2, strategy: 'reject' } },
149
+ profile: { $recordLimit: { max: 1, strategy: 'reject' } },
150
+ thread: { reply: {} },
151
+ },
152
+ };
153
+ }
154
+ async function installProtocol(dwn, alice, definition, timestamp) {
155
+ const configure = await TestDataGenerator.generateProtocolsConfigure({
156
+ author: alice,
157
+ messageTimestamp: timestamp,
158
+ protocolDefinition: definition,
159
+ });
160
+ const reply = await dwn.processMessage(alice.did, configure.message);
161
+ expect(reply.status.code).toBe(202);
162
+ }
163
+ async function writeRecord(dwn, alice, protocol, protocolPath, data, timestamp, parentContextId, squash) {
164
+ const record = await TestDataGenerator.generateRecordsWrite({
165
+ author: alice,
166
+ data: Encoder.stringToBytes(data),
167
+ dataFormat: 'text/plain',
168
+ dateCreated: timestamp,
169
+ messageTimestamp: timestamp,
170
+ parentContextId,
171
+ protocol,
172
+ protocolPath,
173
+ schema: `${protocol}/schema/${protocolPath.split('/').at(-1)}`,
174
+ squash,
175
+ });
176
+ const reply = await dwn.processMessage(alice.did, record.message, { dataStream: record.dataStream });
177
+ expect(reply.status.code).toBe(202);
178
+ return record;
179
+ }
180
+ async function deleteRecord(dwn, alice, recordId, prune) {
181
+ const recordsDelete = await RecordsDelete.create({
182
+ prune,
183
+ recordId,
184
+ signer: Jws.createSigner(alice),
185
+ });
186
+ const reply = await dwn.processMessage(alice.did, recordsDelete.message);
187
+ expect(reply.status.code).toBe(202);
188
+ }
189
+ async function replayFeed(source, replica, alice, replayOrderSeed) {
190
+ const entries = permuteReplayEntries(await queryAllReplayEntries(source, alice), replayOrderSeed);
191
+ let pending = entries;
192
+ let incompleteDeferrals = 0;
193
+ for (let attempt = 0; attempt < entries.length + 1 && pending.length > 0; attempt++) {
194
+ const nextPending = [];
195
+ for (const replayEntry of pending) {
196
+ const { dataBytes, entry } = replayEntry;
197
+ expect(entry.message).toBeDefined();
198
+ const result = await replica.applyReplicatedMessage(alice.did, entry.message, {
199
+ ...(dataBytes === undefined ? {} : { dataStream: DataStream.fromBytes(dataBytes) }),
200
+ });
201
+ if (result.kind === 'Incomplete') {
202
+ incompleteDeferrals++;
203
+ nextPending.push(replayEntry);
204
+ continue;
205
+ }
206
+ if (result.kind === 'Deferred') {
207
+ throw new Error(`replay unexpectedly deferred CID ${entry.messageCid}: ${result.reason}`);
208
+ }
209
+ expect(['Applied', 'Duplicate', 'Superseded']).toContain(result.kind);
210
+ }
211
+ if (nextPending.length === pending.length) {
212
+ throw new Error(`replay made no progress; unresolved CIDs: ${nextPending.map(item => item.entry.messageCid).join(', ')}`);
213
+ }
214
+ pending = nextPending;
215
+ }
216
+ expect(pending).toHaveLength(0);
217
+ expect(incompleteDeferrals).toBeGreaterThan(0);
218
+ }
219
+ // Shuffling puts records before protocol configs, forcing dependency Incomplete outcomes before retry convergence.
220
+ function permuteReplayEntries(entries, replayOrderSeed) {
221
+ return entries
222
+ .map((entry, index) => ({
223
+ entry,
224
+ group: replayDependencyGroup(entry),
225
+ index,
226
+ sortKey: replaySortKey(replayOrderSeed, entry.entry.messageCid, index),
227
+ }))
228
+ .sort((left, right) => {
229
+ const groupComparison = left.group - right.group;
230
+ if (groupComparison !== 0) {
231
+ return groupComparison;
232
+ }
233
+ const sortKeyComparison = left.sortKey - right.sortKey;
234
+ if (sortKeyComparison !== 0) {
235
+ return sortKeyComparison;
236
+ }
237
+ return left.index - right.index;
238
+ })
239
+ .map(item => item.entry);
240
+ }
241
+ function replayDependencyGroup(replayEntry) {
242
+ const descriptor = replayEntry.entry.message?.descriptor;
243
+ return descriptor?.interface === DwnInterfaceName.Protocols && descriptor.method === DwnMethodName.Configure ? 1 : 0;
244
+ }
245
+ function replaySortKey(replayOrderSeed, messageCid, index) {
246
+ let hash = replayOrderSeed >>> 0;
247
+ const input = `${messageCid}:${index}`;
248
+ for (let i = 0; i < input.length; i++) {
249
+ hash = Math.imul(hash ^ input.charCodeAt(i), 16777619) >>> 0;
250
+ }
251
+ return hash;
252
+ }
253
+ async function queryAllReplayEntries(source, alice) {
254
+ const entries = [];
255
+ let cursor;
256
+ while (true) {
257
+ const query = await TestDataGenerator.generateMessagesQuery({
258
+ author: alice,
259
+ cursor,
260
+ limit: 3,
261
+ });
262
+ const reply = await source.processMessage(alice.did, query.message);
263
+ expect(reply.status.code).toBe(200);
264
+ for (const entry of reply.entries ?? []) {
265
+ entries.push({
266
+ dataBytes: await dataBytesForEntry(source, alice, entry),
267
+ entry: entry,
268
+ });
269
+ }
270
+ if (reply.drained === true) {
271
+ break;
272
+ }
273
+ cursor = reply.cursor;
274
+ }
275
+ return entries;
276
+ }
277
+ async function dataBytesForEntry(source, alice, entry) {
278
+ if (!isRecordsWriteMessage(entry.message)) {
279
+ return undefined;
280
+ }
281
+ if (entry.encodedData !== undefined) {
282
+ return Encoder.base64UrlToBytes(entry.encodedData);
283
+ }
284
+ const read = await TestDataGenerator.generateMessagesRead({
285
+ author: alice,
286
+ messageCid: entry.messageCid,
287
+ });
288
+ const reply = await source.processMessage(alice.did, read.message);
289
+ if (reply.status.code !== 200) {
290
+ return undefined;
291
+ }
292
+ const data = reply.entry?.data;
293
+ return data === undefined ? undefined : await DataStream.toBytes(data);
294
+ }
295
+ function isRecordsWriteMessage(message) {
296
+ return typeof message === 'object' && message !== null && Records.isRecordsWrite(message);
297
+ }
298
+ async function expectFingerprintsEqual(source, replica, tenant, protocol) {
299
+ const scopes = [Replication.globalDomain];
300
+ expect(await replica.fingerprint(tenant, scopes)).toBe(await source.fingerprint(tenant, scopes));
301
+ const protocolScopes = [
302
+ Replication.protocolDomain(protocol),
303
+ Replication.permissionDomain(protocol),
304
+ ];
305
+ expect(await replica.fingerprint(tenant, protocolScopes)).toBe(await source.fingerprint(tenant, protocolScopes));
306
+ }
307
+ async function expectLiveRecordsEqual(source, replica, alice, protocol) {
308
+ expect(await liveRecordSnapshot(replica, alice, protocol)).toEqual(await liveRecordSnapshot(source, alice, protocol));
309
+ }
310
+ async function liveRecordSnapshot(dwn, alice, protocol) {
311
+ const query = await TestDataGenerator.generateRecordsQuery({
312
+ author: alice,
313
+ filter: { protocol },
314
+ });
315
+ const reply = await dwn.processMessage(alice.did, query.message);
316
+ expect(reply.status.code).toBe(200);
317
+ const snapshot = [];
318
+ for (const entry of reply.entries ?? []) {
319
+ const { encodedData, initialWrite, ...recordsWrite } = entry;
320
+ snapshot.push({
321
+ data: encodedData ?? '',
322
+ initialCid: initialWrite === undefined ? undefined : await Message.getCid(initialWrite),
323
+ latestCid: await Message.getCid(recordsWrite),
324
+ protocolPath: recordsWrite.descriptor.protocolPath,
325
+ recordId: recordsWrite.recordId,
326
+ });
327
+ }
328
+ return snapshot.sort(compareLiveRecords);
329
+ }
330
+ function compareLiveRecords(left, right) {
331
+ const leftKey = `${left.protocolPath}:${left.recordId}`;
332
+ const rightKey = `${right.protocolPath}:${right.recordId}`;
333
+ return leftKey < rightKey ? -1 : leftKey > rightKey ? 1 : 0;
334
+ }
335
+ async function expectOccupantsEqual(source, replica, alice, protocol, protocolPath, expectedMax) {
336
+ const sourceOccupants = await queryRecordIds(source, alice, protocol, protocolPath);
337
+ const replicaOccupants = await queryRecordIds(replica, alice, protocol, protocolPath);
338
+ expect(replicaOccupants).toEqual(sourceOccupants);
339
+ expect(sourceOccupants.length).toBeLessThanOrEqual(expectedMax);
340
+ }
341
+ async function queryRecordIds(dwn, alice, protocol, protocolPath) {
342
+ const query = await TestDataGenerator.generateRecordsQuery({
343
+ author: alice,
344
+ filter: { protocol, protocolPath },
345
+ });
346
+ const reply = await dwn.processMessage(alice.did, query.message);
347
+ expect(reply.status.code).toBe(200);
348
+ return (reply.entries ?? []).map(entry => entry.recordId).sort();
349
+ }
350
+ //# sourceMappingURL=replication-replay-property.spec.js.map