@enbox/dwn-sdk-js 0.4.0 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (522) hide show
  1. package/README.md +4 -4
  2. package/dist/browser.mjs +3 -10
  3. package/dist/browser.mjs.map +4 -4
  4. package/dist/esm/generated/precompiled-validators.js +799 -885
  5. package/dist/esm/generated/precompiled-validators.js.map +1 -1
  6. package/dist/esm/src/core/dwn-constant.js +5 -0
  7. package/dist/esm/src/core/dwn-constant.js.map +1 -1
  8. package/dist/esm/src/core/dwn-error.js +12 -4
  9. package/dist/esm/src/core/dwn-error.js.map +1 -1
  10. package/dist/esm/src/core/grant-authorization.js +9 -18
  11. package/dist/esm/src/core/grant-authorization.js.map +1 -1
  12. package/dist/esm/src/core/message-reply.js.map +1 -1
  13. package/dist/esm/src/core/messages-grant-authorization.js +28 -45
  14. package/dist/esm/src/core/messages-grant-authorization.js.map +1 -1
  15. package/dist/esm/src/core/protocol-authorization-action.js +25 -27
  16. package/dist/esm/src/core/protocol-authorization-action.js.map +1 -1
  17. package/dist/esm/src/core/protocol-authorization-validation.js +34 -89
  18. package/dist/esm/src/core/protocol-authorization-validation.js.map +1 -1
  19. package/dist/esm/src/core/protocol-authorization.js +44 -118
  20. package/dist/esm/src/core/protocol-authorization.js.map +1 -1
  21. package/dist/esm/src/core/protocols-grant-authorization.js +5 -5
  22. package/dist/esm/src/core/protocols-grant-authorization.js.map +1 -1
  23. package/dist/esm/src/core/recording-validation-state-reader.js +84 -0
  24. package/dist/esm/src/core/recording-validation-state-reader.js.map +1 -0
  25. package/dist/esm/src/core/records-grant-authorization.js +11 -11
  26. package/dist/esm/src/core/records-grant-authorization.js.map +1 -1
  27. package/dist/esm/src/core/replication-apply.js +123 -28
  28. package/dist/esm/src/core/replication-apply.js.map +1 -1
  29. package/dist/esm/src/core/resumable-task-manager.js +5 -4
  30. package/dist/esm/src/core/resumable-task-manager.js.map +1 -1
  31. package/dist/esm/src/core/validation-state-reader.js +237 -0
  32. package/dist/esm/src/core/validation-state-reader.js.map +1 -0
  33. package/dist/esm/src/dwn.js +165 -132
  34. package/dist/esm/src/dwn.js.map +1 -1
  35. package/dist/esm/src/enums/dwn-interface-method.js +0 -1
  36. package/dist/esm/src/enums/dwn-interface-method.js.map +1 -1
  37. package/dist/esm/src/event-stream/durable-event-log.js +365 -0
  38. package/dist/esm/src/event-stream/durable-event-log.js.map +1 -0
  39. package/dist/esm/src/event-stream/event-emitter-wake-publisher.js +25 -0
  40. package/dist/esm/src/event-stream/event-emitter-wake-publisher.js.map +1 -0
  41. package/dist/esm/src/handlers/messages-query.js +159 -0
  42. package/dist/esm/src/handlers/messages-query.js.map +1 -0
  43. package/dist/esm/src/handlers/messages-read.js +5 -5
  44. package/dist/esm/src/handlers/messages-read.js.map +1 -1
  45. package/dist/esm/src/handlers/messages-subscribe.js +8 -8
  46. package/dist/esm/src/handlers/messages-subscribe.js.map +1 -1
  47. package/dist/esm/src/handlers/protocols-configure.js +30 -49
  48. package/dist/esm/src/handlers/protocols-configure.js.map +1 -1
  49. package/dist/esm/src/handlers/protocols-query.js +1 -1
  50. package/dist/esm/src/handlers/protocols-query.js.map +1 -1
  51. package/dist/esm/src/handlers/records-count.js +20 -11
  52. package/dist/esm/src/handlers/records-count.js.map +1 -1
  53. package/dist/esm/src/handlers/records-delete.js +20 -16
  54. package/dist/esm/src/handlers/records-delete.js.map +1 -1
  55. package/dist/esm/src/handlers/records-query.js +35 -11
  56. package/dist/esm/src/handlers/records-query.js.map +1 -1
  57. package/dist/esm/src/handlers/records-read.js +52 -42
  58. package/dist/esm/src/handlers/records-read.js.map +1 -1
  59. package/dist/esm/src/handlers/records-subscribe.js +107 -11
  60. package/dist/esm/src/handlers/records-subscribe.js.map +1 -1
  61. package/dist/esm/src/handlers/records-write.js +62 -116
  62. package/dist/esm/src/handlers/records-write.js.map +1 -1
  63. package/dist/esm/src/index.js +6 -7
  64. package/dist/esm/src/index.js.map +1 -1
  65. package/dist/esm/src/interfaces/{messages-sync.js → messages-query.js} +21 -15
  66. package/dist/esm/src/interfaces/messages-query.js.map +1 -0
  67. package/dist/esm/src/interfaces/protocols-configure.js +12 -9
  68. package/dist/esm/src/interfaces/protocols-configure.js.map +1 -1
  69. package/dist/esm/src/interfaces/protocols-query.js +3 -4
  70. package/dist/esm/src/interfaces/protocols-query.js.map +1 -1
  71. package/dist/esm/src/interfaces/records-count.js +4 -3
  72. package/dist/esm/src/interfaces/records-count.js.map +1 -1
  73. package/dist/esm/src/interfaces/records-delete.js +21 -4
  74. package/dist/esm/src/interfaces/records-delete.js.map +1 -1
  75. package/dist/esm/src/interfaces/records-query.js +4 -3
  76. package/dist/esm/src/interfaces/records-query.js.map +1 -1
  77. package/dist/esm/src/interfaces/records-read.js +3 -3
  78. package/dist/esm/src/interfaces/records-read.js.map +1 -1
  79. package/dist/esm/src/interfaces/records-subscribe.js +4 -3
  80. package/dist/esm/src/interfaces/records-subscribe.js.map +1 -1
  81. package/dist/esm/src/interfaces/records-write.js +27 -13
  82. package/dist/esm/src/interfaces/records-write.js.map +1 -1
  83. package/dist/esm/src/protocols/permissions.js +27 -34
  84. package/dist/esm/src/protocols/permissions.js.map +1 -1
  85. package/dist/esm/src/store/index-level.js +24 -9
  86. package/dist/esm/src/store/index-level.js.map +1 -1
  87. package/dist/esm/src/store/level-wrapper.js +7 -0
  88. package/dist/esm/src/store/level-wrapper.js.map +1 -1
  89. package/dist/esm/src/store/message-store-level.js +536 -42
  90. package/dist/esm/src/store/message-store-level.js.map +1 -1
  91. package/dist/esm/src/store/storage-controller.js +58 -49
  92. package/dist/esm/src/store/storage-controller.js.map +1 -1
  93. package/dist/esm/src/types/message-types.js.map +1 -1
  94. package/dist/esm/src/types/validation-state-reader.js +2 -0
  95. package/dist/esm/src/types/validation-state-reader.js.map +1 -0
  96. package/dist/esm/src/utils/messages.js +17 -0
  97. package/dist/esm/src/utils/messages.js.map +1 -1
  98. package/dist/esm/src/utils/protocol-tags.js +262 -0
  99. package/dist/esm/src/utils/protocol-tags.js.map +1 -0
  100. package/dist/esm/src/utils/record-limit-occupancy.js +244 -0
  101. package/dist/esm/src/utils/record-limit-occupancy.js.map +1 -0
  102. package/dist/esm/src/utils/records.js +50 -14
  103. package/dist/esm/src/utils/records.js.map +1 -1
  104. package/dist/esm/src/utils/replication.js +85 -0
  105. package/dist/esm/src/utils/replication.js.map +1 -0
  106. package/dist/esm/tests/core/grant-authorization.spec.js +4 -4
  107. package/dist/esm/tests/core/grant-authorization.spec.js.map +1 -1
  108. package/dist/esm/tests/core/process-message-parity.spec.js +222 -0
  109. package/dist/esm/tests/core/process-message-parity.spec.js.map +1 -0
  110. package/dist/esm/tests/core/protocol-authorization.spec.js +5 -2
  111. package/dist/esm/tests/core/protocol-authorization.spec.js.map +1 -1
  112. package/dist/esm/tests/core/records-grant-authorization.spec.js +5 -5
  113. package/dist/esm/tests/core/records-grant-authorization.spec.js.map +1 -1
  114. package/dist/esm/tests/core/replication-apply.spec.js +55 -1
  115. package/dist/esm/tests/core/replication-apply.spec.js.map +1 -1
  116. package/dist/esm/tests/core/replication-replay-property.spec.js +350 -0
  117. package/dist/esm/tests/core/replication-replay-property.spec.js.map +1 -0
  118. package/dist/esm/tests/core/validation-read-closure.spec.js +469 -0
  119. package/dist/esm/tests/core/validation-read-closure.spec.js.map +1 -0
  120. package/dist/esm/tests/core/validation-state-reader.spec.js +716 -0
  121. package/dist/esm/tests/core/validation-state-reader.spec.js.map +1 -0
  122. package/dist/esm/tests/durable-event-log.spec.js +373 -0
  123. package/dist/esm/tests/durable-event-log.spec.js.map +1 -0
  124. package/dist/esm/tests/dwn.spec.js +504 -35
  125. package/dist/esm/tests/dwn.spec.js.map +1 -1
  126. package/dist/esm/tests/features/author-delegated-grant.spec.js +9 -6
  127. package/dist/esm/tests/features/author-delegated-grant.spec.js.map +1 -1
  128. package/dist/esm/tests/features/owner-delegated-grant.spec.js +1 -4
  129. package/dist/esm/tests/features/owner-delegated-grant.spec.js.map +1 -1
  130. package/dist/esm/tests/features/owner-signature.spec.js +1 -4
  131. package/dist/esm/tests/features/owner-signature.spec.js.map +1 -1
  132. package/dist/esm/tests/features/permissions.spec.js +165 -4
  133. package/dist/esm/tests/features/permissions.spec.js.map +1 -1
  134. package/dist/esm/tests/features/protocol-composition.spec.js +8 -11
  135. package/dist/esm/tests/features/protocol-composition.spec.js.map +1 -1
  136. package/dist/esm/tests/features/protocol-create-action.spec.js +1 -4
  137. package/dist/esm/tests/features/protocol-create-action.spec.js.map +1 -1
  138. package/dist/esm/tests/features/protocol-delete-action.spec.js +3 -5
  139. package/dist/esm/tests/features/protocol-delete-action.spec.js.map +1 -1
  140. package/dist/esm/tests/features/protocol-update-action.spec.js +3 -6
  141. package/dist/esm/tests/features/protocol-update-action.spec.js.map +1 -1
  142. package/dist/esm/tests/features/records-delivery.spec.js +1 -4
  143. package/dist/esm/tests/features/records-delivery.spec.js.map +1 -1
  144. package/dist/esm/tests/features/records-immutable.spec.js +1 -4
  145. package/dist/esm/tests/features/records-immutable.spec.js.map +1 -1
  146. package/dist/esm/tests/features/records-nested-query-scope.spec.js +281 -0
  147. package/dist/esm/tests/features/records-nested-query-scope.spec.js.map +1 -0
  148. package/dist/esm/tests/features/records-prune-cross-protocol.spec.js +3 -7
  149. package/dist/esm/tests/features/records-prune-cross-protocol.spec.js.map +1 -1
  150. package/dist/esm/tests/features/records-prune.spec.js +11 -22
  151. package/dist/esm/tests/features/records-prune.spec.js.map +1 -1
  152. package/dist/esm/tests/features/records-record-limit.spec.js +441 -231
  153. package/dist/esm/tests/features/records-record-limit.spec.js.map +1 -1
  154. package/dist/esm/tests/features/records-squash.spec.js +6 -4
  155. package/dist/esm/tests/features/records-squash.spec.js.map +1 -1
  156. package/dist/esm/tests/features/records-tags.spec.js +1 -4
  157. package/dist/esm/tests/features/records-tags.spec.js.map +1 -1
  158. package/dist/esm/tests/features/resumable-tasks.spec.js +3 -5
  159. package/dist/esm/tests/features/resumable-tasks.spec.js.map +1 -1
  160. package/dist/esm/tests/fuzz/message-store.fuzz.spec.js +1 -2
  161. package/dist/esm/tests/fuzz/message-store.fuzz.spec.js.map +1 -1
  162. package/dist/esm/tests/fuzz/process-message.fuzz.spec.js +2 -4
  163. package/dist/esm/tests/fuzz/process-message.fuzz.spec.js.map +1 -1
  164. package/dist/esm/tests/fuzz/schema-validation.fuzz.spec.js +1 -1
  165. package/dist/esm/tests/fuzz/schema-validation.fuzz.spec.js.map +1 -1
  166. package/dist/esm/tests/handlers/messages-query.spec.js +246 -0
  167. package/dist/esm/tests/handlers/messages-query.spec.js.map +1 -0
  168. package/dist/esm/tests/handlers/messages-read.spec.js +2 -5
  169. package/dist/esm/tests/handlers/messages-read.spec.js.map +1 -1
  170. package/dist/esm/tests/handlers/messages-subscribe.spec.js +3 -14
  171. package/dist/esm/tests/handlers/messages-subscribe.spec.js.map +1 -1
  172. package/dist/esm/tests/handlers/protocols-configure.spec.js +27 -26
  173. package/dist/esm/tests/handlers/protocols-configure.spec.js.map +1 -1
  174. package/dist/esm/tests/handlers/protocols-query.spec.js +1 -4
  175. package/dist/esm/tests/handlers/protocols-query.spec.js.map +1 -1
  176. package/dist/esm/tests/handlers/records-count.spec.js +1 -4
  177. package/dist/esm/tests/handlers/records-count.spec.js.map +1 -1
  178. package/dist/esm/tests/handlers/records-delete.spec.js +312 -30
  179. package/dist/esm/tests/handlers/records-delete.spec.js.map +1 -1
  180. package/dist/esm/tests/handlers/records-query.spec.js +32 -9
  181. package/dist/esm/tests/handlers/records-query.spec.js.map +1 -1
  182. package/dist/esm/tests/handlers/records-read.spec.js +4 -4
  183. package/dist/esm/tests/handlers/records-read.spec.js.map +1 -1
  184. package/dist/esm/tests/handlers/records-subscribe.spec.js +33 -14
  185. package/dist/esm/tests/handlers/records-subscribe.spec.js.map +1 -1
  186. package/dist/esm/tests/handlers/records-write.spec.js +82 -36
  187. package/dist/esm/tests/handlers/records-write.spec.js.map +1 -1
  188. package/dist/esm/tests/interfaces/records-delete.spec.js +69 -2
  189. package/dist/esm/tests/interfaces/records-delete.spec.js.map +1 -1
  190. package/dist/esm/tests/interfaces/records-write.spec.js +4 -3
  191. package/dist/esm/tests/interfaces/records-write.spec.js.map +1 -1
  192. package/dist/esm/tests/protocols/permissions.spec.js +55 -6
  193. package/dist/esm/tests/protocols/permissions.spec.js.map +1 -1
  194. package/dist/esm/tests/scenarios/aggregator.spec.js +1 -4
  195. package/dist/esm/tests/scenarios/aggregator.spec.js.map +1 -1
  196. package/dist/esm/tests/scenarios/deleted-record.spec.js +1 -4
  197. package/dist/esm/tests/scenarios/deleted-record.spec.js.map +1 -1
  198. package/dist/esm/tests/scenarios/end-to-end-tests.spec.js +1 -4
  199. package/dist/esm/tests/scenarios/end-to-end-tests.spec.js.map +1 -1
  200. package/dist/esm/tests/scenarios/nested-roles.spec.js +1 -4
  201. package/dist/esm/tests/scenarios/nested-roles.spec.js.map +1 -1
  202. package/dist/esm/tests/scenarios/subscriptions.spec.js +1 -4
  203. package/dist/esm/tests/scenarios/subscriptions.spec.js.map +1 -1
  204. package/dist/esm/tests/store/message-store-level.spec.js +361 -5
  205. package/dist/esm/tests/store/message-store-level.spec.js.map +1 -1
  206. package/dist/esm/tests/store/message-store.spec.js +60 -0
  207. package/dist/esm/tests/store/message-store.spec.js.map +1 -1
  208. package/dist/esm/tests/test-event-stream.js +7 -3
  209. package/dist/esm/tests/test-event-stream.js.map +1 -1
  210. package/dist/esm/tests/test-stores.js +19 -9
  211. package/dist/esm/tests/test-stores.js.map +1 -1
  212. package/dist/esm/tests/test-suite.js +4 -2
  213. package/dist/esm/tests/test-suite.js.map +1 -1
  214. package/dist/esm/tests/utils/protocol-tags.spec.js +96 -0
  215. package/dist/esm/tests/utils/protocol-tags.spec.js.map +1 -0
  216. package/dist/esm/tests/utils/test-data-generator.js +25 -0
  217. package/dist/esm/tests/utils/test-data-generator.js.map +1 -1
  218. package/dist/esm/tests/utils/test-stub-generator.js.map +1 -1
  219. package/dist/esm/tests/utils/test-validation-state-reader.js +16 -0
  220. package/dist/esm/tests/utils/test-validation-state-reader.js.map +1 -0
  221. package/dist/types/generated/precompiled-validators.d.ts +6 -6
  222. package/dist/types/generated/precompiled-validators.d.ts.map +1 -1
  223. package/dist/types/src/core/core-protocol.d.ts +3 -3
  224. package/dist/types/src/core/core-protocol.d.ts.map +1 -1
  225. package/dist/types/src/core/dwn-constant.d.ts +5 -0
  226. package/dist/types/src/core/dwn-constant.d.ts.map +1 -1
  227. package/dist/types/src/core/dwn-error.d.ts +12 -4
  228. package/dist/types/src/core/dwn-error.d.ts.map +1 -1
  229. package/dist/types/src/core/grant-authorization.d.ts +5 -5
  230. package/dist/types/src/core/grant-authorization.d.ts.map +1 -1
  231. package/dist/types/src/core/message-reply.d.ts +5 -4
  232. package/dist/types/src/core/message-reply.d.ts.map +1 -1
  233. package/dist/types/src/core/messages-grant-authorization.d.ts +12 -14
  234. package/dist/types/src/core/messages-grant-authorization.d.ts.map +1 -1
  235. package/dist/types/src/core/protocol-authorization-action.d.ts +4 -5
  236. package/dist/types/src/core/protocol-authorization-action.d.ts.map +1 -1
  237. package/dist/types/src/core/protocol-authorization-validation.d.ts +14 -17
  238. package/dist/types/src/core/protocol-authorization-validation.d.ts.map +1 -1
  239. package/dist/types/src/core/protocol-authorization.d.ts +8 -33
  240. package/dist/types/src/core/protocol-authorization.d.ts.map +1 -1
  241. package/dist/types/src/core/protocols-grant-authorization.d.ts +4 -4
  242. package/dist/types/src/core/protocols-grant-authorization.d.ts.map +1 -1
  243. package/dist/types/src/core/recording-validation-state-reader.d.ts +75 -0
  244. package/dist/types/src/core/recording-validation-state-reader.d.ts.map +1 -0
  245. package/dist/types/src/core/records-grant-authorization.d.ts +8 -8
  246. package/dist/types/src/core/records-grant-authorization.d.ts.map +1 -1
  247. package/dist/types/src/core/replication-apply.d.ts +36 -0
  248. package/dist/types/src/core/replication-apply.d.ts.map +1 -1
  249. package/dist/types/src/core/resumable-task-manager.d.ts +1 -1
  250. package/dist/types/src/core/resumable-task-manager.d.ts.map +1 -1
  251. package/dist/types/src/core/validation-state-reader.d.ts +79 -0
  252. package/dist/types/src/core/validation-state-reader.d.ts.map +1 -0
  253. package/dist/types/src/dwn.d.ts +33 -20
  254. package/dist/types/src/dwn.d.ts.map +1 -1
  255. package/dist/types/src/enums/dwn-interface-method.d.ts +0 -1
  256. package/dist/types/src/enums/dwn-interface-method.d.ts.map +1 -1
  257. package/dist/types/src/event-stream/durable-event-log.d.ts +69 -0
  258. package/dist/types/src/event-stream/durable-event-log.d.ts.map +1 -0
  259. package/dist/types/src/event-stream/event-emitter-wake-publisher.d.ts +13 -0
  260. package/dist/types/src/event-stream/event-emitter-wake-publisher.d.ts.map +1 -0
  261. package/dist/types/src/handlers/messages-query.d.ts +20 -0
  262. package/dist/types/src/handlers/messages-query.d.ts.map +1 -0
  263. package/dist/types/src/handlers/messages-read.d.ts +1 -1
  264. package/dist/types/src/handlers/messages-read.d.ts.map +1 -1
  265. package/dist/types/src/handlers/messages-subscribe.d.ts.map +1 -1
  266. package/dist/types/src/handlers/protocols-configure.d.ts +0 -5
  267. package/dist/types/src/handlers/protocols-configure.d.ts.map +1 -1
  268. package/dist/types/src/handlers/records-count.d.ts +2 -1
  269. package/dist/types/src/handlers/records-count.d.ts.map +1 -1
  270. package/dist/types/src/handlers/records-delete.d.ts +2 -2
  271. package/dist/types/src/handlers/records-delete.d.ts.map +1 -1
  272. package/dist/types/src/handlers/records-query.d.ts +1 -1
  273. package/dist/types/src/handlers/records-query.d.ts.map +1 -1
  274. package/dist/types/src/handlers/records-read.d.ts +2 -1
  275. package/dist/types/src/handlers/records-read.d.ts.map +1 -1
  276. package/dist/types/src/handlers/records-subscribe.d.ts +4 -5
  277. package/dist/types/src/handlers/records-subscribe.d.ts.map +1 -1
  278. package/dist/types/src/handlers/records-write.d.ts +3 -11
  279. package/dist/types/src/handlers/records-write.d.ts.map +1 -1
  280. package/dist/types/src/index.d.ts +14 -16
  281. package/dist/types/src/index.d.ts.map +1 -1
  282. package/dist/types/src/interfaces/messages-query.d.ts +23 -0
  283. package/dist/types/src/interfaces/messages-query.d.ts.map +1 -0
  284. package/dist/types/src/interfaces/protocols-configure.d.ts +3 -3
  285. package/dist/types/src/interfaces/protocols-configure.d.ts.map +1 -1
  286. package/dist/types/src/interfaces/protocols-query.d.ts +2 -2
  287. package/dist/types/src/interfaces/protocols-query.d.ts.map +1 -1
  288. package/dist/types/src/interfaces/records-count.d.ts +3 -3
  289. package/dist/types/src/interfaces/records-count.d.ts.map +1 -1
  290. package/dist/types/src/interfaces/records-delete.d.ts +11 -3
  291. package/dist/types/src/interfaces/records-delete.d.ts.map +1 -1
  292. package/dist/types/src/interfaces/records-query.d.ts +3 -3
  293. package/dist/types/src/interfaces/records-query.d.ts.map +1 -1
  294. package/dist/types/src/interfaces/records-read.d.ts +3 -3
  295. package/dist/types/src/interfaces/records-read.d.ts.map +1 -1
  296. package/dist/types/src/interfaces/records-subscribe.d.ts +3 -3
  297. package/dist/types/src/interfaces/records-subscribe.d.ts.map +1 -1
  298. package/dist/types/src/interfaces/records-write.d.ts +15 -7
  299. package/dist/types/src/interfaces/records-write.d.ts.map +1 -1
  300. package/dist/types/src/protocols/permissions.d.ts +9 -12
  301. package/dist/types/src/protocols/permissions.d.ts.map +1 -1
  302. package/dist/types/src/store/index-level.d.ts +10 -1
  303. package/dist/types/src/store/index-level.d.ts.map +1 -1
  304. package/dist/types/src/store/level-wrapper.d.ts +5 -0
  305. package/dist/types/src/store/level-wrapper.d.ts.map +1 -1
  306. package/dist/types/src/store/message-store-level.d.ts +94 -14
  307. package/dist/types/src/store/message-store-level.d.ts.map +1 -1
  308. package/dist/types/src/store/storage-controller.d.ts +17 -14
  309. package/dist/types/src/store/storage-controller.d.ts.map +1 -1
  310. package/dist/types/src/types/message-store.d.ts +29 -1
  311. package/dist/types/src/types/message-store.d.ts.map +1 -1
  312. package/dist/types/src/types/message-types.d.ts +2 -0
  313. package/dist/types/src/types/message-types.d.ts.map +1 -1
  314. package/dist/types/src/types/messages-types.d.ts +21 -37
  315. package/dist/types/src/types/messages-types.d.ts.map +1 -1
  316. package/dist/types/src/types/method-handler.d.ts +2 -2
  317. package/dist/types/src/types/method-handler.d.ts.map +1 -1
  318. package/dist/types/src/types/permission-types.d.ts +1 -1
  319. package/dist/types/src/types/subscriptions.d.ts +50 -39
  320. package/dist/types/src/types/subscriptions.d.ts.map +1 -1
  321. package/dist/types/src/types/validation-state-reader.d.ts +116 -0
  322. package/dist/types/src/types/validation-state-reader.d.ts.map +1 -0
  323. package/dist/types/src/utils/messages.d.ts +10 -0
  324. package/dist/types/src/utils/messages.d.ts.map +1 -1
  325. package/dist/types/src/utils/protocol-tags.d.ts +15 -0
  326. package/dist/types/src/utils/protocol-tags.d.ts.map +1 -0
  327. package/dist/types/src/utils/record-limit-occupancy.d.ts +40 -0
  328. package/dist/types/src/utils/record-limit-occupancy.d.ts.map +1 -0
  329. package/dist/types/src/utils/records.d.ts +25 -3
  330. package/dist/types/src/utils/records.d.ts.map +1 -1
  331. package/dist/types/src/utils/replication.d.ts +22 -0
  332. package/dist/types/src/utils/replication.d.ts.map +1 -0
  333. package/dist/types/tests/core/process-message-parity.spec.d.ts +2 -0
  334. package/dist/types/tests/core/process-message-parity.spec.d.ts.map +1 -0
  335. package/dist/types/tests/core/replication-replay-property.spec.d.ts +2 -0
  336. package/dist/types/tests/core/replication-replay-property.spec.d.ts.map +1 -0
  337. package/dist/types/tests/core/validation-read-closure.spec.d.ts +2 -0
  338. package/dist/types/tests/core/validation-read-closure.spec.d.ts.map +1 -0
  339. package/dist/types/tests/core/validation-state-reader.spec.d.ts +2 -0
  340. package/dist/types/tests/core/validation-state-reader.spec.d.ts.map +1 -0
  341. package/dist/types/tests/durable-event-log.spec.d.ts +2 -0
  342. package/dist/types/tests/durable-event-log.spec.d.ts.map +1 -0
  343. package/dist/types/tests/dwn.spec.d.ts.map +1 -1
  344. package/dist/types/tests/features/author-delegated-grant.spec.d.ts.map +1 -1
  345. package/dist/types/tests/features/owner-delegated-grant.spec.d.ts.map +1 -1
  346. package/dist/types/tests/features/owner-signature.spec.d.ts.map +1 -1
  347. package/dist/types/tests/features/permissions.spec.d.ts.map +1 -1
  348. package/dist/types/tests/features/protocol-composition.spec.d.ts.map +1 -1
  349. package/dist/types/tests/features/protocol-create-action.spec.d.ts.map +1 -1
  350. package/dist/types/tests/features/protocol-delete-action.spec.d.ts.map +1 -1
  351. package/dist/types/tests/features/protocol-update-action.spec.d.ts.map +1 -1
  352. package/dist/types/tests/features/records-delivery.spec.d.ts.map +1 -1
  353. package/dist/types/tests/features/records-immutable.spec.d.ts.map +1 -1
  354. package/dist/types/tests/features/records-nested-query-scope.spec.d.ts +2 -0
  355. package/dist/types/tests/features/records-nested-query-scope.spec.d.ts.map +1 -0
  356. package/dist/types/tests/features/records-prune-cross-protocol.spec.d.ts.map +1 -1
  357. package/dist/types/tests/features/records-prune.spec.d.ts.map +1 -1
  358. package/dist/types/tests/features/records-record-limit.spec.d.ts.map +1 -1
  359. package/dist/types/tests/features/records-squash.spec.d.ts.map +1 -1
  360. package/dist/types/tests/features/records-tags.spec.d.ts.map +1 -1
  361. package/dist/types/tests/features/resumable-tasks.spec.d.ts.map +1 -1
  362. package/dist/types/tests/handlers/messages-query.spec.d.ts +2 -0
  363. package/dist/types/tests/handlers/messages-query.spec.d.ts.map +1 -0
  364. package/dist/types/tests/handlers/messages-read.spec.d.ts.map +1 -1
  365. package/dist/types/tests/handlers/messages-subscribe.spec.d.ts.map +1 -1
  366. package/dist/types/tests/handlers/protocols-configure.spec.d.ts.map +1 -1
  367. package/dist/types/tests/handlers/protocols-query.spec.d.ts.map +1 -1
  368. package/dist/types/tests/handlers/records-count.spec.d.ts.map +1 -1
  369. package/dist/types/tests/handlers/records-delete.spec.d.ts.map +1 -1
  370. package/dist/types/tests/handlers/records-query.spec.d.ts.map +1 -1
  371. package/dist/types/tests/handlers/records-read.spec.d.ts.map +1 -1
  372. package/dist/types/tests/handlers/records-subscribe.spec.d.ts.map +1 -1
  373. package/dist/types/tests/handlers/records-write.spec.d.ts.map +1 -1
  374. package/dist/types/tests/scenarios/deleted-record.spec.d.ts.map +1 -1
  375. package/dist/types/tests/scenarios/end-to-end-tests.spec.d.ts.map +1 -1
  376. package/dist/types/tests/scenarios/nested-roles.spec.d.ts.map +1 -1
  377. package/dist/types/tests/scenarios/subscriptions.spec.d.ts.map +1 -1
  378. package/dist/types/tests/store/message-store.spec.d.ts.map +1 -1
  379. package/dist/types/tests/test-event-stream.d.ts +1 -1
  380. package/dist/types/tests/test-event-stream.d.ts.map +1 -1
  381. package/dist/types/tests/test-stores.d.ts +5 -4
  382. package/dist/types/tests/test-stores.d.ts.map +1 -1
  383. package/dist/types/tests/test-suite.d.ts +1 -2
  384. package/dist/types/tests/test-suite.d.ts.map +1 -1
  385. package/dist/types/tests/utils/protocol-tags.spec.d.ts +2 -0
  386. package/dist/types/tests/utils/protocol-tags.spec.d.ts.map +1 -0
  387. package/dist/types/tests/utils/test-data-generator.d.ts +20 -1
  388. package/dist/types/tests/utils/test-data-generator.d.ts.map +1 -1
  389. package/dist/types/tests/utils/test-validation-state-reader.d.ts +15 -0
  390. package/dist/types/tests/utils/test-validation-state-reader.d.ts.map +1 -0
  391. package/package.json +2 -2
  392. package/src/core/core-protocol.ts +3 -3
  393. package/src/core/dwn-constant.ts +7 -1
  394. package/src/core/dwn-error.ts +12 -4
  395. package/src/core/grant-authorization.ts +11 -20
  396. package/src/core/message-reply.ts +6 -5
  397. package/src/core/messages-grant-authorization.ts +37 -70
  398. package/src/core/protocol-authorization-action.ts +29 -38
  399. package/src/core/protocol-authorization-validation.ts +47 -121
  400. package/src/core/protocol-authorization.ts +56 -202
  401. package/src/core/protocols-grant-authorization.ts +9 -9
  402. package/src/core/recording-validation-state-reader.ts +130 -0
  403. package/src/core/records-grant-authorization.ts +16 -16
  404. package/src/core/replication-apply.ts +172 -32
  405. package/src/core/resumable-task-manager.ts +10 -8
  406. package/src/core/validation-state-reader.ts +350 -0
  407. package/src/dwn.ts +285 -192
  408. package/src/enums/dwn-interface-method.ts +0 -1
  409. package/src/event-stream/durable-event-log.ts +509 -0
  410. package/src/event-stream/event-emitter-wake-publisher.ts +34 -0
  411. package/src/handlers/messages-query.ts +203 -0
  412. package/src/handlers/messages-read.ts +9 -10
  413. package/src/handlers/messages-subscribe.ts +12 -13
  414. package/src/handlers/protocols-configure.ts +37 -58
  415. package/src/handlers/protocols-query.ts +1 -1
  416. package/src/handlers/records-count.ts +24 -17
  417. package/src/handlers/records-delete.ts +29 -27
  418. package/src/handlers/records-query.ts +38 -17
  419. package/src/handlers/records-read.ts +63 -50
  420. package/src/handlers/records-subscribe.ts +132 -19
  421. package/src/handlers/records-write.ts +77 -168
  422. package/src/index.ts +14 -17
  423. package/src/interfaces/messages-query.ts +70 -0
  424. package/src/interfaces/protocols-configure.ts +20 -10
  425. package/src/interfaces/protocols-query.ts +4 -5
  426. package/src/interfaces/records-count.ts +9 -4
  427. package/src/interfaces/records-delete.ts +25 -5
  428. package/src/interfaces/records-query.ts +9 -4
  429. package/src/interfaces/records-read.ts +4 -4
  430. package/src/interfaces/records-subscribe.ts +9 -4
  431. package/src/interfaces/records-write.ts +41 -13
  432. package/src/protocols/permissions.ts +32 -52
  433. package/src/store/index-level.ts +30 -9
  434. package/src/store/level-wrapper.ts +9 -1
  435. package/src/store/message-store-level.ts +757 -47
  436. package/src/store/storage-controller.ts +74 -63
  437. package/src/types/message-store.ts +45 -2
  438. package/src/types/message-types.ts +3 -1
  439. package/src/types/messages-types.ts +26 -45
  440. package/src/types/method-handler.ts +3 -3
  441. package/src/types/permission-types.ts +1 -1
  442. package/src/types/subscriptions.ts +53 -42
  443. package/src/types/validation-state-reader.ts +127 -0
  444. package/src/utils/messages.ts +25 -1
  445. package/src/utils/protocol-tags.ts +366 -0
  446. package/src/utils/record-limit-occupancy.ts +377 -0
  447. package/src/utils/records.ts +69 -13
  448. package/src/utils/replication.ts +122 -0
  449. package/dist/esm/src/core/record-chain.js +0 -64
  450. package/dist/esm/src/core/record-chain.js.map +0 -1
  451. package/dist/esm/src/event-stream/event-emitter-event-log.js +0 -334
  452. package/dist/esm/src/event-stream/event-emitter-event-log.js.map +0 -1
  453. package/dist/esm/src/handlers/messages-sync.js +0 -278
  454. package/dist/esm/src/handlers/messages-sync.js.map +0 -1
  455. package/dist/esm/src/interfaces/messages-sync.js.map +0 -1
  456. package/dist/esm/src/smt/smt-store-level.js +0 -103
  457. package/dist/esm/src/smt/smt-store-level.js.map +0 -1
  458. package/dist/esm/src/smt/smt-store-memory.js +0 -41
  459. package/dist/esm/src/smt/smt-store-memory.js.map +0 -1
  460. package/dist/esm/src/smt/smt-utils.js +0 -129
  461. package/dist/esm/src/smt/smt-utils.js.map +0 -1
  462. package/dist/esm/src/smt/sparse-merkle-tree.js +0 -577
  463. package/dist/esm/src/smt/sparse-merkle-tree.js.map +0 -1
  464. package/dist/esm/src/state-index/state-index-level.js +0 -191
  465. package/dist/esm/src/state-index/state-index-level.js.map +0 -1
  466. package/dist/esm/src/types/smt-types.js +0 -5
  467. package/dist/esm/src/types/smt-types.js.map +0 -1
  468. package/dist/esm/src/types/state-index.js +0 -2
  469. package/dist/esm/src/types/state-index.js.map +0 -1
  470. package/dist/esm/tests/event-emitter-event-log.spec.js +0 -499
  471. package/dist/esm/tests/event-emitter-event-log.spec.js.map +0 -1
  472. package/dist/esm/tests/handlers/messages-sync.spec.js +0 -1088
  473. package/dist/esm/tests/handlers/messages-sync.spec.js.map +0 -1
  474. package/dist/esm/tests/smt/smt-store-level.spec.js +0 -132
  475. package/dist/esm/tests/smt/smt-store-level.spec.js.map +0 -1
  476. package/dist/esm/tests/smt/sparse-merkle-tree.spec.js +0 -732
  477. package/dist/esm/tests/smt/sparse-merkle-tree.spec.js.map +0 -1
  478. package/dist/esm/tests/state-index/state-index-level.spec.js +0 -245
  479. package/dist/esm/tests/state-index/state-index-level.spec.js.map +0 -1
  480. package/dist/types/src/core/record-chain.d.ts +0 -24
  481. package/dist/types/src/core/record-chain.d.ts.map +0 -1
  482. package/dist/types/src/event-stream/event-emitter-event-log.d.ts +0 -80
  483. package/dist/types/src/event-stream/event-emitter-event-log.d.ts.map +0 -1
  484. package/dist/types/src/handlers/messages-sync.d.ts +0 -39
  485. package/dist/types/src/handlers/messages-sync.d.ts.map +0 -1
  486. package/dist/types/src/interfaces/messages-sync.d.ts +0 -20
  487. package/dist/types/src/interfaces/messages-sync.d.ts.map +0 -1
  488. package/dist/types/src/smt/smt-store-level.d.ts +0 -32
  489. package/dist/types/src/smt/smt-store-level.d.ts.map +0 -1
  490. package/dist/types/src/smt/smt-store-memory.d.ts +0 -22
  491. package/dist/types/src/smt/smt-store-memory.d.ts.map +0 -1
  492. package/dist/types/src/smt/smt-utils.d.ts +0 -58
  493. package/dist/types/src/smt/smt-utils.d.ts.map +0 -1
  494. package/dist/types/src/smt/sparse-merkle-tree.d.ts +0 -124
  495. package/dist/types/src/smt/sparse-merkle-tree.d.ts.map +0 -1
  496. package/dist/types/src/state-index/state-index-level.d.ts +0 -83
  497. package/dist/types/src/state-index/state-index-level.d.ts.map +0 -1
  498. package/dist/types/src/types/smt-types.d.ts +0 -81
  499. package/dist/types/src/types/smt-types.d.ts.map +0 -1
  500. package/dist/types/src/types/state-index.d.ts +0 -90
  501. package/dist/types/src/types/state-index.d.ts.map +0 -1
  502. package/dist/types/tests/event-emitter-event-log.spec.d.ts +0 -2
  503. package/dist/types/tests/event-emitter-event-log.spec.d.ts.map +0 -1
  504. package/dist/types/tests/handlers/messages-sync.spec.d.ts +0 -2
  505. package/dist/types/tests/handlers/messages-sync.spec.d.ts.map +0 -1
  506. package/dist/types/tests/smt/smt-store-level.spec.d.ts +0 -2
  507. package/dist/types/tests/smt/smt-store-level.spec.d.ts.map +0 -1
  508. package/dist/types/tests/smt/sparse-merkle-tree.spec.d.ts +0 -2
  509. package/dist/types/tests/smt/sparse-merkle-tree.spec.d.ts.map +0 -1
  510. package/dist/types/tests/state-index/state-index-level.spec.d.ts +0 -2
  511. package/dist/types/tests/state-index/state-index-level.spec.d.ts.map +0 -1
  512. package/src/core/record-chain.ts +0 -99
  513. package/src/event-stream/event-emitter-event-log.ts +0 -430
  514. package/src/handlers/messages-sync.ts +0 -403
  515. package/src/interfaces/messages-sync.ts +0 -69
  516. package/src/smt/smt-store-level.ts +0 -143
  517. package/src/smt/smt-store-memory.ts +0 -53
  518. package/src/smt/smt-utils.ts +0 -149
  519. package/src/smt/sparse-merkle-tree.ts +0 -698
  520. package/src/state-index/state-index-level.ts +0 -239
  521. package/src/types/smt-types.ts +0 -95
  522. package/src/types/state-index.ts +0 -100
@@ -1,19 +1,39 @@
1
1
  import { createLevelDatabase } from '../../src/store/level-wrapper.js';
2
+ import { DwnErrorCode } from '../../src/core/dwn-error.js';
3
+ import { EventEmitterWakePublisher } from '../../src/event-stream/event-emitter-wake-publisher.js';
4
+ import { Message } from '../../src/core/message.js';
2
5
  import { MessageStoreLevel } from '../../src/store/message-store-level.js';
6
+ import { PermissionsProtocol } from '../../src/protocols/permissions.js';
7
+ import { ProtocolsConfigureHandler } from '../../src/handlers/protocols-configure.js';
8
+ import { Replication } from '../../src/utils/replication.js';
9
+ import { TestDataGenerator } from '../utils/test-data-generator.js';
3
10
  import { afterAll, beforeAll, beforeEach, describe, expect, it } from 'bun:test';
11
+ const ZERO_FINGERPRINT = '0'.repeat(64);
12
+ async function cidFingerprint(messageCid) {
13
+ return Replication.fingerprintToHex(await Replication.hashMessageCid(messageCid));
14
+ }
15
+ function xorHex(a, b) {
16
+ return Replication.fingerprintToHex(Replication.xorFingerprint(Replication.hexToFingerprint(a), Replication.hexToFingerprint(b)));
17
+ }
4
18
  let messageStore;
19
+ let wakePublisher;
20
+ let wakes;
5
21
  describe('MessageStoreLevel Test Suite', () => {
6
22
  // important to follow the `before` and `after` pattern to initialize and clean the stores in tests
7
23
  // so that different test suites can reuse the same backend store for testing
8
24
  beforeAll(async () => {
25
+ wakePublisher = new EventEmitterWakePublisher();
9
26
  messageStore = new MessageStoreLevel({
10
- blockstoreLocation: 'TEST-MESSAGESTORE',
11
- indexLocation: 'TEST-INDEX'
27
+ location: 'TEST-MESSAGESTORE',
28
+ wakePublisher,
12
29
  });
13
30
  await messageStore.open();
14
31
  });
15
32
  beforeEach(async () => {
16
33
  await messageStore.clear(); // clean up before each test rather than after so that a test does not depend on other tests to do the clean up
34
+ wakes = [];
35
+ wakePublisher.clear();
36
+ wakePublisher.subscribe((wake) => { wakes.push(wake); });
17
37
  });
18
38
  afterAll(async () => {
19
39
  await messageStore.close();
@@ -24,15 +44,351 @@ describe('MessageStoreLevel Test Suite', () => {
24
44
  await messageStore.close();
25
45
  const locations = new Set;
26
46
  messageStore = new MessageStoreLevel({
27
- blockstoreLocation: 'TEST-MESSAGESTORE',
28
- indexLocation: 'TEST-INDEX',
47
+ location: 'TEST-MESSAGESTORE',
48
+ wakePublisher,
29
49
  createLevelDatabase(location, options) {
30
50
  locations.add(location);
31
51
  return createLevelDatabase(location, options);
32
52
  }
33
53
  });
34
54
  await messageStore.open();
35
- expect(locations).toEqual(new Set(['TEST-MESSAGESTORE', 'TEST-INDEX']));
55
+ expect(locations).toEqual(new Set(['TEST-MESSAGESTORE']));
56
+ });
57
+ it('should fail fast when a pre-substrate Level blockstore layout is detected', async () => {
58
+ const location = 'TEST-MESSAGESTORE-PRE-SUBSTRATE';
59
+ const oldDb = await createLevelDatabase(location, { valueEncoding: 'binary' });
60
+ await oldDb.put('!did:test:alice!bafy-old-message', new Uint8Array([1]));
61
+ await oldDb.close();
62
+ const oldLayoutStore = new MessageStoreLevel({ location });
63
+ await expect(oldLayoutStore.open()).rejects.toThrow(DwnErrorCode.MessageStorePreSubstrateLayout);
64
+ await oldLayoutStore.close();
65
+ const cleanupDb = await createLevelDatabase(location, { valueEncoding: 'binary' });
66
+ await cleanupDb.clear();
67
+ await cleanupDb.close();
68
+ });
69
+ });
70
+ async function generateStoredMessage(overrides = {}) {
71
+ const { message } = await TestDataGenerator.generateRecordsWrite({
72
+ ...(overrides.protocol !== undefined && { protocol: overrides.protocol, protocolPath: 'post' }),
73
+ ...(overrides.tags !== undefined && { tags: overrides.tags }),
74
+ });
75
+ const messageCid = await Message.getCid(message);
76
+ const indexes = {
77
+ interface: 'Records',
78
+ method: 'Write',
79
+ messageTimestamp: message.descriptor.messageTimestamp,
80
+ isLatestBaseState: true,
81
+ protocol: message.descriptor.protocol,
82
+ protocolPath: message.descriptor.protocolPath,
83
+ };
84
+ if (message.descriptor.tags !== undefined) {
85
+ for (const [key, value] of Object.entries(message.descriptor.tags)) {
86
+ indexes[`tag.${key}`] = value;
87
+ }
88
+ }
89
+ return { message, messageCid, indexes };
90
+ }
91
+ async function withIsolatedMessageStore(locationPrefix, test) {
92
+ const isolatedStore = new MessageStoreLevel({
93
+ location: `${locationPrefix}-${TestDataGenerator.randomString(10)}`,
94
+ });
95
+ await isolatedStore.open();
96
+ try {
97
+ await isolatedStore.clear();
98
+ return await test(isolatedStore);
99
+ }
100
+ finally {
101
+ await isolatedStore.clear();
102
+ await isolatedStore.close();
103
+ }
104
+ }
105
+ describe('replication log', () => {
106
+ it('should append puts in commit order, return positions, and publish wakes', async () => {
107
+ const alice = await TestDataGenerator.generateDidKeyPersona();
108
+ const storedCids = [];
109
+ for (let i = 0; i < 3; i++) {
110
+ const { message, messageCid, indexes } = await generateStoredMessage();
111
+ const result = await messageStore.put(alice.did, message, indexes);
112
+ expect(result.status).toBe('inserted');
113
+ expect(result.position.position).toBe(String(i + 1));
114
+ expect(result.position.messageCid).toBe(messageCid);
115
+ storedCids.push(messageCid);
116
+ }
117
+ expect(wakes.map((wake) => wake.seq)).toEqual(['1', '2', '3']);
118
+ const { events, cursor, drained } = await messageStore.logRead(alice.did);
119
+ expect(events.map((entry) => entry.seq)).toEqual(['1', '2', '3']);
120
+ expect(events.map((entry) => entry.messageCid)).toEqual(storedCids);
121
+ expect(cursor.position).toBe('3');
122
+ expect(drained).toBe(true);
123
+ });
124
+ it('should assign gap-free monotonic positions for concurrent puts', async () => {
125
+ const alice = await TestDataGenerator.generateDidKeyPersona();
126
+ const writes = await Promise.all(Array.from({ length: 12 }, async () => generateStoredMessage()));
127
+ const results = await Promise.all(writes.map(async ({ message, indexes }) => messageStore.put(alice.did, message, indexes)));
128
+ const positions = results
129
+ .map((result) => Number(result.position.position))
130
+ .sort((a, b) => a - b);
131
+ expect(positions).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]);
132
+ const { events, cursor, drained } = await messageStore.logRead(alice.did);
133
+ expect(events).toHaveLength(12);
134
+ expect(cursor.position).toBe('12');
135
+ expect(drained).toBe(true);
136
+ });
137
+ it('should treat duplicate puts as non-mutating', async () => {
138
+ const alice = await TestDataGenerator.generateDidKeyPersona();
139
+ const { message, indexes } = await generateStoredMessage();
140
+ const first = await messageStore.put(alice.did, message, indexes);
141
+ const second = await messageStore.put(alice.did, message, indexes);
142
+ expect(first.status).toBe('inserted');
143
+ expect(second.status).toBe('duplicate');
144
+ expect(second.position).toBeUndefined();
145
+ expect(wakes.map((wake) => wake.seq)).toEqual(['1']);
146
+ const third = await generateStoredMessage();
147
+ const thirdPut = await messageStore.put(alice.did, third.message, third.indexes);
148
+ expect(thirdPut.position.position).toBe('2');
149
+ });
150
+ it('should page with high-water cursors and omit messageCid for non-delivered tail positions', async () => {
151
+ const alice = await TestDataGenerator.generateDidKeyPersona();
152
+ const protocol = 'https://example.com/photos';
153
+ const matching = await generateStoredMessage({ protocol });
154
+ await messageStore.put(alice.did, matching.message, matching.indexes);
155
+ for (let i = 0; i < 2; i++) {
156
+ const other = await generateStoredMessage();
157
+ await messageStore.put(alice.did, other.message, other.indexes);
158
+ }
159
+ const filtered = await messageStore.logRead(alice.did, { filters: [{ protocol }] });
160
+ expect(filtered.events.map((entry) => entry.messageCid)).toEqual([matching.messageCid]);
161
+ expect(filtered.drained).toBe(true);
162
+ expect(filtered.cursor.position).toBe('3');
163
+ expect(filtered.cursor.messageCid).toBeUndefined();
164
+ const firstPage = await messageStore.logRead(alice.did, { limit: 2 });
165
+ expect(firstPage.drained).toBe(false);
166
+ expect(firstPage.cursor.position).toBe('2');
167
+ const secondPage = await messageStore.logRead(alice.did, { cursor: firstPage.cursor });
168
+ expect(secondPage.drained).toBe(true);
169
+ expect(secondPage.cursor.position).toBe('3');
170
+ });
171
+ it('should not advance the log cursor when limit is zero', async () => {
172
+ const alice = await TestDataGenerator.generateDidKeyPersona();
173
+ const first = await generateStoredMessage();
174
+ const second = await generateStoredMessage();
175
+ const firstPut = await messageStore.put(alice.did, first.message, first.indexes);
176
+ const secondPut = await messageStore.put(alice.did, second.message, second.indexes);
177
+ const withoutCursor = await messageStore.logRead(alice.did, { limit: 0 });
178
+ expect(withoutCursor.events).toEqual([]);
179
+ expect(withoutCursor.cursor).toBeUndefined();
180
+ expect(withoutCursor.drained).toBe(false);
181
+ const withCursor = await messageStore.logRead(alice.did, { cursor: firstPut.position, limit: 0 });
182
+ expect(withCursor.events).toEqual([]);
183
+ expect(withCursor.cursor).toBe(firstPut.position);
184
+ expect(withCursor.drained).toBe(false);
185
+ const atHead = await messageStore.logRead(alice.did, { cursor: secondPut.position, limit: 0 });
186
+ expect(atHead.events).toEqual([]);
187
+ expect(atHead.cursor).toBe(secondPut.position);
188
+ expect(atHead.drained).toBe(true);
189
+ });
190
+ it('should reject cursors from the wrong stream, epoch, future position, or mismatched message CID', async () => {
191
+ const alice = await TestDataGenerator.generateDidKeyPersona();
192
+ const { message, indexes } = await generateStoredMessage();
193
+ const putResult = await messageStore.put(alice.did, message, indexes);
194
+ const cursor = putResult.position;
195
+ await expect(messageStore.logRead(alice.did, { cursor: { ...cursor, streamId: 'wrong-stream' } }))
196
+ .rejects.toThrow('stream_mismatch');
197
+ await expect(messageStore.logRead(alice.did, { cursor: { ...cursor, position: '2' } }))
198
+ .rejects.toThrow('token_too_new');
199
+ await expect(messageStore.logRead(alice.did, { cursor: { ...cursor, messageCid: 'bafy-wrong-message' } }))
200
+ .rejects.toThrow('message_mismatch');
201
+ await messageStore.clear();
202
+ await expect(messageStore.logRead(alice.did, { cursor }))
203
+ .rejects.toThrow('epoch_mismatch');
204
+ });
205
+ it('should resume from a cursor whose exact log row was deleted', async () => {
206
+ const alice = await TestDataGenerator.generateDidKeyPersona();
207
+ const first = await generateStoredMessage();
208
+ const second = await generateStoredMessage();
209
+ const firstPut = await messageStore.put(alice.did, first.message, first.indexes);
210
+ await messageStore.put(alice.did, second.message, second.indexes);
211
+ await messageStore.delete(alice.did, first.messageCid);
212
+ const result = await messageStore.logRead(alice.did, { cursor: firstPut.position });
213
+ expect(result.events.map((entry) => entry.seq)).toEqual(['2']);
214
+ expect(result.events.map((entry) => entry.messageCid)).toEqual([second.messageCid]);
215
+ expect(result.drained).toBe(true);
216
+ });
217
+ });
218
+ describe('updateIndexes', () => {
219
+ it('should replace indexes in place without moving the row or stripping inline data', async () => {
220
+ const alice = await TestDataGenerator.generateDidKeyPersona();
221
+ const first = await generateStoredMessage();
222
+ const second = await generateStoredMessage();
223
+ await messageStore.put(alice.did, { ...first.message, encodedData: 'c29tZSBkYXRh' }, first.indexes);
224
+ await messageStore.put(alice.did, second.message, second.indexes);
225
+ const wakeCountBefore = wakes.length;
226
+ await messageStore.updateIndexes(alice.did, first.messageCid, { ...first.indexes, isLatestBaseState: false });
227
+ const { events } = await messageStore.logRead(alice.did);
228
+ expect(events.map((entry) => entry.seq)).toEqual(['1', '2']);
229
+ expect(events[0].indexes.isLatestBaseState).toBe(false);
230
+ expect((await messageStore.get(alice.did, first.messageCid)).encodedData).toBe('c29tZSBkYXRh');
231
+ expect(wakes.length).toBe(wakeCountBefore);
232
+ expect((await messageStore.logBounds(alice.did)).latest.position).toBe('2');
233
+ });
234
+ it('should reject missing messages and fingerprint-scope mutations', async () => {
235
+ const alice = await TestDataGenerator.generateDidKeyPersona();
236
+ const protocol = 'https://example.com/photos';
237
+ const { message, messageCid, indexes } = await generateStoredMessage({ protocol });
238
+ await expect(messageStore.updateIndexes(alice.did, messageCid, indexes))
239
+ .rejects.toThrow(DwnErrorCode.MessageStoreUpdateIndexesMessageNotFound);
240
+ await messageStore.put(alice.did, message, indexes);
241
+ await expect(messageStore.updateIndexes(alice.did, messageCid, { ...indexes, protocol: 'https://example.com/other' }))
242
+ .rejects.toThrow(DwnErrorCode.MessageStoreFingerprintScopeMutation);
243
+ const { protocol: _protocol, ...indexesWithoutProtocol } = indexes;
244
+ await expect(messageStore.updateIndexes(alice.did, messageCid, indexesWithoutProtocol))
245
+ .rejects.toThrow(DwnErrorCode.MessageStoreFingerprintScopeMutation);
246
+ const grant = await generateStoredMessage({ protocol: PermissionsProtocol.uri, tags: { protocol } });
247
+ const grantIndexes = grant.indexes;
248
+ await messageStore.put(alice.did, grant.message, grantIndexes);
249
+ await expect(messageStore.updateIndexes(alice.did, grant.messageCid, { ...grantIndexes, 'tag.protocol': 'https://example.com/other' }))
250
+ .rejects.toThrow(DwnErrorCode.MessageStoreFingerprintScopeMutation);
251
+ });
252
+ });
253
+ describe('updateMessageAndIndexes', () => {
254
+ it('should replace the stored payload and indexes without moving the row', async () => {
255
+ const alice = await TestDataGenerator.generateDidKeyPersona();
256
+ const first = await generateStoredMessage();
257
+ const second = await generateStoredMessage();
258
+ await messageStore.put(alice.did, { ...first.message, encodedData: 'c29tZSBkYXRh' }, first.indexes);
259
+ await messageStore.put(alice.did, second.message, second.indexes);
260
+ const wakeCountBefore = wakes.length;
261
+ await messageStore.updateMessageAndIndexes(alice.did, first.messageCid, first.message, { ...first.indexes, isLatestBaseState: false });
262
+ const { events } = await messageStore.logRead(alice.did);
263
+ expect(events.map((entry) => entry.seq)).toEqual(['1', '2']);
264
+ expect(events[0].indexes.isLatestBaseState).toBe(false);
265
+ expect((await messageStore.get(alice.did, first.messageCid)).encodedData).toBeUndefined();
266
+ expect(wakes.length).toBe(wakeCountBefore);
267
+ expect((await messageStore.logBounds(alice.did)).latest.position).toBe('2');
268
+ });
269
+ it('should reject missing messages, CID mismatches, and fingerprint-scope mutations', async () => {
270
+ const alice = await TestDataGenerator.generateDidKeyPersona();
271
+ const protocol = 'https://example.com/photos';
272
+ const { message, messageCid, indexes } = await generateStoredMessage({ protocol });
273
+ const other = await generateStoredMessage({ protocol });
274
+ await expect(messageStore.updateMessageAndIndexes(alice.did, messageCid, message, indexes))
275
+ .rejects.toThrow(DwnErrorCode.MessageStoreUpdateMessageAndIndexesMessageNotFound);
276
+ await messageStore.put(alice.did, message, indexes);
277
+ await expect(messageStore.updateMessageAndIndexes(alice.did, messageCid, other.message, indexes))
278
+ .rejects.toThrow(DwnErrorCode.MessageStoreUpdateMessageAndIndexesCidMismatch);
279
+ await expect(messageStore.updateMessageAndIndexes(alice.did, messageCid, message, { ...indexes, protocol: 'https://example.com/other' }))
280
+ .rejects.toThrow(DwnErrorCode.MessageStoreFingerprintScopeMutation);
281
+ });
282
+ });
283
+ describe('fingerprints', () => {
284
+ it('should fold global, protocol, and permission domains and unfold deletes', async () => {
285
+ const alice = await TestDataGenerator.generateDidKeyPersona();
286
+ const photosProtocol = 'https://example.com/photos';
287
+ const photo = await generateStoredMessage({ protocol: photosProtocol });
288
+ await messageStore.put(alice.did, photo.message, photo.indexes);
289
+ const photoFingerprint = await cidFingerprint(photo.messageCid);
290
+ const grant = await generateStoredMessage({ protocol: PermissionsProtocol.uri, tags: { protocol: photosProtocol } });
291
+ const grantIndexes = grant.indexes;
292
+ await messageStore.put(alice.did, grant.message, grantIndexes);
293
+ const grantFingerprint = await cidFingerprint(grant.messageCid);
294
+ expect(await messageStore.fingerprint(alice.did, [Replication.globalDomain])).toBe(xorHex(photoFingerprint, grantFingerprint));
295
+ expect(await messageStore.fingerprint(alice.did, [Replication.protocolDomain(photosProtocol)])).toBe(photoFingerprint);
296
+ expect(await messageStore.fingerprint(alice.did, [Replication.protocolDomain(PermissionsProtocol.uri)])).toBe(grantFingerprint);
297
+ expect(await messageStore.fingerprint(alice.did, [Replication.permissionDomain(photosProtocol)])).toBe(grantFingerprint);
298
+ const { 'tag.protocol': _tag, ...demotedGrantIndexes } = grantIndexes;
299
+ await messageStore.updateIndexes(alice.did, grant.messageCid, { ...demotedGrantIndexes, isLatestBaseState: false });
300
+ expect(await messageStore.fingerprint(alice.did, [Replication.permissionDomain(photosProtocol)])).toBe(grantFingerprint);
301
+ await messageStore.delete(alice.did, grant.messageCid);
302
+ expect(await messageStore.fingerprint(alice.did, [Replication.globalDomain])).toBe(photoFingerprint);
303
+ expect(await messageStore.fingerprint(alice.did, [Replication.permissionDomain(photosProtocol)])).toBe(ZERO_FINGERPRINT);
304
+ });
305
+ it('should fold protocol configs and tombstones into their protocol domain', async () => {
306
+ const alice = await TestDataGenerator.generateDidKeyPersona();
307
+ const photosProtocol = 'https://example.com/photos';
308
+ const protocolDefinition = {
309
+ protocol: photosProtocol,
310
+ published: false,
311
+ types: { post: { schema: 'post', dataFormats: ['text/plain'] } },
312
+ structure: { post: {} },
313
+ };
314
+ const config = await TestDataGenerator.generateProtocolsConfigure({ protocolDefinition });
315
+ const configIndexes = ProtocolsConfigureHandler.constructIndexes(config.protocolsConfigure, true);
316
+ await messageStore.put(alice.did, config.message, configIndexes);
317
+ const configFingerprint = await cidFingerprint(await Message.getCid(config.message));
318
+ expect(await messageStore.fingerprint(alice.did, [Replication.protocolDomain(photosProtocol)])).toBe(configFingerprint);
319
+ const photo = await generateStoredMessage({ protocol: photosProtocol });
320
+ await messageStore.put(alice.did, photo.message, photo.indexes);
321
+ const photoFingerprint = await cidFingerprint(photo.messageCid);
322
+ const recordsDelete = await TestDataGenerator.generateRecordsDelete({
323
+ author: alice,
324
+ recordId: photo.message.descriptor.recordId,
325
+ });
326
+ const deleteIndexes = recordsDelete.recordsDelete.constructIndexes(photo.message, photo.message);
327
+ await messageStore.put(alice.did, recordsDelete.message, deleteIndexes);
328
+ const deleteFingerprint = await cidFingerprint(await Message.getCid(recordsDelete.message));
329
+ expect(await messageStore.fingerprint(alice.did, [Replication.protocolDomain(photosProtocol)]))
330
+ .toBe(xorHex(xorHex(configFingerprint, photoFingerprint), deleteFingerprint));
331
+ });
332
+ it('should converge fingerprints across stores that learn the same messages in different orders', async () => {
333
+ const alice = await TestDataGenerator.generateDidKeyPersona();
334
+ const photosProtocol = 'https://example.com/photos-convergence';
335
+ const protocolDefinition = {
336
+ protocol: photosProtocol,
337
+ published: false,
338
+ types: { post: { schema: 'post', dataFormats: ['text/plain'] } },
339
+ structure: { post: {} },
340
+ };
341
+ await withIsolatedMessageStore('TEST-MESSAGESTORE-FINGERPRINT-PEER', async (peerStore) => {
342
+ const config = await TestDataGenerator.generateProtocolsConfigure({ protocolDefinition });
343
+ const configIndexes = ProtocolsConfigureHandler.constructIndexes(config.protocolsConfigure, true);
344
+ const photo = await generateStoredMessage({ protocol: photosProtocol });
345
+ const grant = await generateStoredMessage({ protocol: PermissionsProtocol.uri, tags: { protocol: photosProtocol } });
346
+ await messageStore.put(alice.did, config.message, configIndexes);
347
+ await messageStore.put(alice.did, photo.message, photo.indexes);
348
+ await messageStore.put(alice.did, grant.message, grant.indexes);
349
+ await peerStore.put(alice.did, grant.message, grant.indexes);
350
+ await peerStore.put(alice.did, config.message, configIndexes);
351
+ await peerStore.put(alice.did, photo.message, photo.indexes);
352
+ const scopes = [
353
+ Replication.globalDomain,
354
+ Replication.protocolDomain(photosProtocol),
355
+ Replication.protocolDomain(PermissionsProtocol.uri),
356
+ Replication.permissionDomain(photosProtocol),
357
+ ];
358
+ for (const scope of scopes) {
359
+ expect(await peerStore.fingerprint(alice.did, [scope]))
360
+ .toBe(await messageStore.fingerprint(alice.did, [scope]));
361
+ }
362
+ });
363
+ });
364
+ });
365
+ describe('durability', () => {
366
+ it('should persist epoch, log positions, and fingerprints across reopen and reset on clear', async () => {
367
+ const alice = await TestDataGenerator.generateDidKeyPersona();
368
+ const protocol = 'https://example.com/reopen';
369
+ const initialEpoch = await messageStore.epoch();
370
+ const first = await generateStoredMessage({ protocol });
371
+ const second = await generateStoredMessage();
372
+ await messageStore.put(alice.did, first.message, first.indexes);
373
+ await messageStore.put(alice.did, second.message, { ...second.indexes, isLatestBaseState: false });
374
+ const boundsBefore = await messageStore.logBounds(alice.did);
375
+ const logBefore = await messageStore.logRead(alice.did);
376
+ const globalFingerprintBefore = await messageStore.fingerprint(alice.did, [Replication.globalDomain]);
377
+ const protocolFingerprintBefore = await messageStore.fingerprint(alice.did, [Replication.protocolDomain(protocol)]);
378
+ await messageStore.close();
379
+ await messageStore.open();
380
+ expect(await messageStore.epoch()).toBe(initialEpoch);
381
+ expect(await messageStore.logBounds(alice.did)).toEqual(boundsBefore);
382
+ const logAfter = await messageStore.logRead(alice.did);
383
+ expect(logAfter.events.map((entry) => entry.messageCid))
384
+ .toEqual(logBefore.events.map((entry) => entry.messageCid));
385
+ expect(logAfter.cursor).toEqual(logBefore.cursor);
386
+ expect(await messageStore.fingerprint(alice.did, [Replication.globalDomain])).toBe(globalFingerprintBefore);
387
+ expect(await messageStore.fingerprint(alice.did, [Replication.protocolDomain(protocol)])).toBe(protocolFingerprintBefore);
388
+ await messageStore.clear();
389
+ expect(await messageStore.epoch()).not.toBe(initialEpoch);
390
+ expect(await messageStore.logBounds(alice.did)).toBeUndefined();
391
+ expect(await messageStore.fingerprint(alice.did, [Replication.globalDomain])).toBe(ZERO_FINGERPRINT);
36
392
  });
37
393
  });
38
394
  });
@@ -1 +1 @@
1
- {"version":3,"file":"message-store-level.spec.js","sourceRoot":"","sources":["../../../../tests/store/message-store-level.spec.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAEjF,IAAI,YAA0B,CAAC;AAE/B,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,mGAAmG;IACnG,6EAA6E;IAC7E,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,YAAY,GAAG,IAAI,iBAAiB,CAAC;YACnC,kBAAkB,EAAG,mBAAmB;YACxC,aAAa,EAAQ,YAAY;SAClC,CAAC,CAAC;QACH,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC,+GAA+G;IAC7I,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,KAAK,IAAI,EAAE;QAClB,MAAM,YAAY,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE;QAC9B,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;YAC5C,oGAAoG;YACpG,MAAM,YAAY,CAAC,KAAK,EAAE,CAAC;YAE3B,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;YAE1B,YAAY,GAAG,IAAI,iBAAiB,CAAC;gBACnC,kBAAkB,EAAG,mBAAmB;gBACxC,aAAa,EAAQ,YAAY;gBACjC,mBAAmB,CAAI,QAAgB,EAAE,OAAuC;oBAC9E,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBACxB,OAAO,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAChD,CAAC;aACF,CAAC,CAAC;YACH,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;YAE1B,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,CAAE,mBAAmB,EAAE,YAAY,CAAE,CAAC,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"message-store-level.spec.js","sourceRoot":"","sources":["../../../../tests/store/message-store-level.spec.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { afterAll, beforeAll, beforeEach, describe, expect, it } from 'bun:test';
2
+ import { DwnErrorCode } from '../../src/core/dwn-error.js';
2
3
  import { lexicographicalCompare } from '../../src/utils/string.js';
3
4
  import { Message } from '../../src/core/message.js';
4
5
  import { SortDirection } from '../../src/types/query-types.js';
@@ -46,6 +47,17 @@ export function testMessageStore() {
46
47
  const resultCid = await Message.getCid(jsonMessage);
47
48
  expect(resultCid).toBe(expectedCid);
48
49
  });
50
+ it('should not mutate the caller message when storing inline encodedData', async () => {
51
+ const alice = await TestDataGenerator.generateDidKeyPersona();
52
+ const { message } = await TestDataGenerator.generateRecordsWrite();
53
+ const messageWithInlineData = { ...message, encodedData: 'c29tZSBkYXRh' };
54
+ const { messageTimestamp } = message.descriptor;
55
+ await messageStore.put(alice.did, messageWithInlineData, { messageTimestamp });
56
+ expect(messageWithInlineData.encodedData).toBe('c29tZSBkYXRh');
57
+ const expectedCid = await Message.getCid(message);
58
+ const storedMessage = await messageStore.get(alice.did, expectedCid);
59
+ expect(storedMessage.encodedData).toBe('c29tZSBkYXRh');
60
+ });
49
61
  // https://github.com/enboxorg/enbox/issues/170
50
62
  it('#170 - should be able to update (delete and insert new) indexes to an existing message', async () => {
51
63
  const alice = await TestDataGenerator.generateDidKeyPersona();
@@ -66,6 +78,54 @@ export function testMessageStore() {
66
78
  const { messages: results4 } = await messageStore.query(alice.did, [{ isLatestBaseState: false }]);
67
79
  expect(results4.length).toBe(1);
68
80
  });
81
+ it('should update indexes in place and clear stale index columns', async () => {
82
+ const alice = await TestDataGenerator.generateDidKeyPersona();
83
+ const oldSchema = 'https://schema.org/OldIndex';
84
+ const newSchema = 'https://schema.org/NewIndex';
85
+ const { message, recordsWrite } = await TestDataGenerator.generateRecordsWrite({ schema: oldSchema });
86
+ const messageCid = await Message.getCid(message);
87
+ const initialIndexes = {
88
+ ...await recordsWrite.constructIndexes(true),
89
+ attester: 'did:example:attester',
90
+ };
91
+ const replacementIndexes = {
92
+ ...initialIndexes,
93
+ isLatestBaseState: false,
94
+ schema: newSchema,
95
+ };
96
+ delete replacementIndexes.attester;
97
+ await messageStore.put(alice.did, message, initialIndexes);
98
+ expect((await messageStore.query(alice.did, [{ attester: 'did:example:attester' }])).messages.length).toBe(1);
99
+ await messageStore.updateIndexes(alice.did, messageCid, replacementIndexes);
100
+ expect((await messageStore.query(alice.did, [{ schema: oldSchema }])).messages.length).toBe(0);
101
+ expect((await messageStore.query(alice.did, [{ schema: newSchema }])).messages.length).toBe(1);
102
+ expect((await messageStore.query(alice.did, [{ attester: 'did:example:attester' }])).messages.length).toBe(0);
103
+ expect((await messageStore.query(alice.did, [{ isLatestBaseState: true }])).messages.length).toBe(0);
104
+ expect((await messageStore.query(alice.did, [{ isLatestBaseState: false }])).messages.length).toBe(1);
105
+ expect(await messageStore.get(alice.did, messageCid)).toBeDefined();
106
+ });
107
+ it('should replace a same-CID message payload and reject CID mismatches', async () => {
108
+ const alice = await TestDataGenerator.generateDidKeyPersona();
109
+ const oldSchema = 'https://schema.org/OldPayload';
110
+ const newSchema = 'https://schema.org/NewPayload';
111
+ const { message, recordsWrite } = await TestDataGenerator.generateRecordsWrite({ schema: oldSchema });
112
+ const messageCid = await Message.getCid(message);
113
+ const messageWithInlineData = { ...message, encodedData: 'c29tZSBkYXRh' };
114
+ const retainedIndexes = await recordsWrite.constructIndexes(false);
115
+ const replacementIndexes = {
116
+ ...retainedIndexes,
117
+ schema: newSchema,
118
+ };
119
+ await messageStore.put(alice.did, messageWithInlineData, await recordsWrite.constructIndexes(true));
120
+ await messageStore.updateMessageAndIndexes(alice.did, messageCid, message, replacementIndexes);
121
+ const storedMessage = await messageStore.get(alice.did, messageCid);
122
+ expect(storedMessage.encodedData).toBeUndefined();
123
+ expect((await messageStore.query(alice.did, [{ schema: oldSchema }])).messages.length).toBe(0);
124
+ expect((await messageStore.query(alice.did, [{ schema: newSchema }])).messages.length).toBe(1);
125
+ const { message: otherMessage } = await TestDataGenerator.generateRecordsWrite({ schema: newSchema });
126
+ await expect(messageStore.updateMessageAndIndexes(alice.did, messageCid, otherMessage, replacementIndexes))
127
+ .rejects.toThrow(DwnErrorCode.MessageStoreUpdateMessageAndIndexesCidMismatch);
128
+ });
69
129
  it('should index properties with characters beyond just letters and digits', async () => {
70
130
  const alice = await TestDataGenerator.generateDidKeyPersona();
71
131
  const schema = 'http://my-awesome-schema/awesomeness_schema';