@enbox/dwn-sdk-js 0.3.9 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (525) hide show
  1. package/README.md +4 -4
  2. package/dist/browser.mjs +11 -11
  3. package/dist/browser.mjs.map +4 -4
  4. package/dist/esm/generated/precompiled-validators.js +783 -1206
  5. package/dist/esm/generated/precompiled-validators.js.map +1 -1
  6. package/dist/esm/src/core/dwn-constant.js +5 -0
  7. package/dist/esm/src/core/dwn-constant.js.map +1 -1
  8. package/dist/esm/src/core/dwn-error.js +13 -7
  9. package/dist/esm/src/core/dwn-error.js.map +1 -1
  10. package/dist/esm/src/core/grant-authorization.js +9 -18
  11. package/dist/esm/src/core/grant-authorization.js.map +1 -1
  12. package/dist/esm/src/core/message-reply.js.map +1 -1
  13. package/dist/esm/src/core/messages-grant-authorization.js +28 -61
  14. package/dist/esm/src/core/messages-grant-authorization.js.map +1 -1
  15. package/dist/esm/src/core/protocol-authorization-action.js +25 -27
  16. package/dist/esm/src/core/protocol-authorization-action.js.map +1 -1
  17. package/dist/esm/src/core/protocol-authorization-validation.js +31 -69
  18. package/dist/esm/src/core/protocol-authorization-validation.js.map +1 -1
  19. package/dist/esm/src/core/protocol-authorization.js +44 -118
  20. package/dist/esm/src/core/protocol-authorization.js.map +1 -1
  21. package/dist/esm/src/core/protocols-grant-authorization.js +5 -5
  22. package/dist/esm/src/core/protocols-grant-authorization.js.map +1 -1
  23. package/dist/esm/src/core/recording-validation-state-reader.js +84 -0
  24. package/dist/esm/src/core/recording-validation-state-reader.js.map +1 -0
  25. package/dist/esm/src/core/records-grant-authorization.js +11 -11
  26. package/dist/esm/src/core/records-grant-authorization.js.map +1 -1
  27. package/dist/esm/src/core/replication-apply.js +295 -0
  28. package/dist/esm/src/core/replication-apply.js.map +1 -0
  29. package/dist/esm/src/core/resumable-task-manager.js +5 -4
  30. package/dist/esm/src/core/resumable-task-manager.js.map +1 -1
  31. package/dist/esm/src/core/validation-state-reader.js +237 -0
  32. package/dist/esm/src/core/validation-state-reader.js.map +1 -0
  33. package/dist/esm/src/dwn.js +261 -16
  34. package/dist/esm/src/dwn.js.map +1 -1
  35. package/dist/esm/src/enums/dwn-interface-method.js +0 -1
  36. package/dist/esm/src/enums/dwn-interface-method.js.map +1 -1
  37. package/dist/esm/src/event-stream/durable-event-log.js +365 -0
  38. package/dist/esm/src/event-stream/durable-event-log.js.map +1 -0
  39. package/dist/esm/src/event-stream/event-emitter-wake-publisher.js +25 -0
  40. package/dist/esm/src/event-stream/event-emitter-wake-publisher.js.map +1 -0
  41. package/dist/esm/src/handlers/messages-query.js +159 -0
  42. package/dist/esm/src/handlers/messages-query.js.map +1 -0
  43. package/dist/esm/src/handlers/messages-read.js +5 -5
  44. package/dist/esm/src/handlers/messages-read.js.map +1 -1
  45. package/dist/esm/src/handlers/messages-subscribe.js +8 -8
  46. package/dist/esm/src/handlers/messages-subscribe.js.map +1 -1
  47. package/dist/esm/src/handlers/protocols-configure.js +30 -49
  48. package/dist/esm/src/handlers/protocols-configure.js.map +1 -1
  49. package/dist/esm/src/handlers/protocols-query.js +1 -1
  50. package/dist/esm/src/handlers/protocols-query.js.map +1 -1
  51. package/dist/esm/src/handlers/records-count.js +20 -11
  52. package/dist/esm/src/handlers/records-count.js.map +1 -1
  53. package/dist/esm/src/handlers/records-delete.js +20 -16
  54. package/dist/esm/src/handlers/records-delete.js.map +1 -1
  55. package/dist/esm/src/handlers/records-query.js +35 -11
  56. package/dist/esm/src/handlers/records-query.js.map +1 -1
  57. package/dist/esm/src/handlers/records-read.js +52 -42
  58. package/dist/esm/src/handlers/records-read.js.map +1 -1
  59. package/dist/esm/src/handlers/records-subscribe.js +107 -11
  60. package/dist/esm/src/handlers/records-subscribe.js.map +1 -1
  61. package/dist/esm/src/handlers/records-write.js +62 -116
  62. package/dist/esm/src/handlers/records-write.js.map +1 -1
  63. package/dist/esm/src/index.js +7 -8
  64. package/dist/esm/src/index.js.map +1 -1
  65. package/dist/esm/src/interfaces/messages-query.js +49 -0
  66. package/dist/esm/src/interfaces/messages-query.js.map +1 -0
  67. package/dist/esm/src/interfaces/protocols-configure.js +7 -3
  68. package/dist/esm/src/interfaces/protocols-configure.js.map +1 -1
  69. package/dist/esm/src/interfaces/protocols-query.js +3 -4
  70. package/dist/esm/src/interfaces/protocols-query.js.map +1 -1
  71. package/dist/esm/src/interfaces/records-count.js +4 -3
  72. package/dist/esm/src/interfaces/records-count.js.map +1 -1
  73. package/dist/esm/src/interfaces/records-delete.js +21 -4
  74. package/dist/esm/src/interfaces/records-delete.js.map +1 -1
  75. package/dist/esm/src/interfaces/records-query.js +4 -3
  76. package/dist/esm/src/interfaces/records-query.js.map +1 -1
  77. package/dist/esm/src/interfaces/records-read.js +3 -3
  78. package/dist/esm/src/interfaces/records-read.js.map +1 -1
  79. package/dist/esm/src/interfaces/records-subscribe.js +4 -3
  80. package/dist/esm/src/interfaces/records-subscribe.js.map +1 -1
  81. package/dist/esm/src/interfaces/records-write.js +27 -13
  82. package/dist/esm/src/interfaces/records-write.js.map +1 -1
  83. package/dist/esm/src/protocols/permissions.js +27 -34
  84. package/dist/esm/src/protocols/permissions.js.map +1 -1
  85. package/dist/esm/src/store/index-level.js +24 -9
  86. package/dist/esm/src/store/index-level.js.map +1 -1
  87. package/dist/esm/src/store/level-wrapper.js +7 -0
  88. package/dist/esm/src/store/level-wrapper.js.map +1 -1
  89. package/dist/esm/src/store/message-store-level.js +536 -42
  90. package/dist/esm/src/store/message-store-level.js.map +1 -1
  91. package/dist/esm/src/store/storage-controller.js +58 -49
  92. package/dist/esm/src/store/storage-controller.js.map +1 -1
  93. package/dist/esm/src/types/message-types.js.map +1 -1
  94. package/dist/esm/src/types/validation-state-reader.js +2 -0
  95. package/dist/esm/src/types/validation-state-reader.js.map +1 -0
  96. package/dist/esm/src/utils/messages.js +17 -0
  97. package/dist/esm/src/utils/messages.js.map +1 -1
  98. package/dist/esm/src/utils/record-limit-occupancy.js +244 -0
  99. package/dist/esm/src/utils/record-limit-occupancy.js.map +1 -0
  100. package/dist/esm/src/utils/records.js +50 -14
  101. package/dist/esm/src/utils/records.js.map +1 -1
  102. package/dist/esm/src/utils/replication.js +85 -0
  103. package/dist/esm/src/utils/replication.js.map +1 -0
  104. package/dist/esm/tests/core/grant-authorization.spec.js +4 -4
  105. package/dist/esm/tests/core/grant-authorization.spec.js.map +1 -1
  106. package/dist/esm/tests/core/process-message-parity.spec.js +222 -0
  107. package/dist/esm/tests/core/process-message-parity.spec.js.map +1 -0
  108. package/dist/esm/tests/core/protocol-authorization.spec.js +5 -2
  109. package/dist/esm/tests/core/protocol-authorization.spec.js.map +1 -1
  110. package/dist/esm/tests/core/records-grant-authorization.spec.js +5 -5
  111. package/dist/esm/tests/core/records-grant-authorization.spec.js.map +1 -1
  112. package/dist/esm/tests/core/replication-apply.spec.js +274 -0
  113. package/dist/esm/tests/core/replication-apply.spec.js.map +1 -0
  114. package/dist/esm/tests/core/replication-replay-property.spec.js +350 -0
  115. package/dist/esm/tests/core/replication-replay-property.spec.js.map +1 -0
  116. package/dist/esm/tests/core/validation-read-closure.spec.js +469 -0
  117. package/dist/esm/tests/core/validation-read-closure.spec.js.map +1 -0
  118. package/dist/esm/tests/core/validation-state-reader.spec.js +716 -0
  119. package/dist/esm/tests/core/validation-state-reader.spec.js.map +1 -0
  120. package/dist/esm/tests/durable-event-log.spec.js +373 -0
  121. package/dist/esm/tests/durable-event-log.spec.js.map +1 -0
  122. package/dist/esm/tests/dwn.spec.js +620 -14
  123. package/dist/esm/tests/dwn.spec.js.map +1 -1
  124. package/dist/esm/tests/features/author-delegated-grant.spec.js +9 -6
  125. package/dist/esm/tests/features/author-delegated-grant.spec.js.map +1 -1
  126. package/dist/esm/tests/features/owner-delegated-grant.spec.js +1 -4
  127. package/dist/esm/tests/features/owner-delegated-grant.spec.js.map +1 -1
  128. package/dist/esm/tests/features/owner-signature.spec.js +1 -4
  129. package/dist/esm/tests/features/owner-signature.spec.js.map +1 -1
  130. package/dist/esm/tests/features/permissions.spec.js +165 -4
  131. package/dist/esm/tests/features/permissions.spec.js.map +1 -1
  132. package/dist/esm/tests/features/protocol-composition.spec.js +8 -11
  133. package/dist/esm/tests/features/protocol-composition.spec.js.map +1 -1
  134. package/dist/esm/tests/features/protocol-create-action.spec.js +1 -4
  135. package/dist/esm/tests/features/protocol-create-action.spec.js.map +1 -1
  136. package/dist/esm/tests/features/protocol-delete-action.spec.js +3 -5
  137. package/dist/esm/tests/features/protocol-delete-action.spec.js.map +1 -1
  138. package/dist/esm/tests/features/protocol-update-action.spec.js +3 -6
  139. package/dist/esm/tests/features/protocol-update-action.spec.js.map +1 -1
  140. package/dist/esm/tests/features/records-delivery.spec.js +1 -4
  141. package/dist/esm/tests/features/records-delivery.spec.js.map +1 -1
  142. package/dist/esm/tests/features/records-immutable.spec.js +1 -4
  143. package/dist/esm/tests/features/records-immutable.spec.js.map +1 -1
  144. package/dist/esm/tests/features/records-nested-query-scope.spec.js +281 -0
  145. package/dist/esm/tests/features/records-nested-query-scope.spec.js.map +1 -0
  146. package/dist/esm/tests/features/records-prune-cross-protocol.spec.js +3 -7
  147. package/dist/esm/tests/features/records-prune-cross-protocol.spec.js.map +1 -1
  148. package/dist/esm/tests/features/records-prune.spec.js +11 -22
  149. package/dist/esm/tests/features/records-prune.spec.js.map +1 -1
  150. package/dist/esm/tests/features/records-record-limit.spec.js +441 -231
  151. package/dist/esm/tests/features/records-record-limit.spec.js.map +1 -1
  152. package/dist/esm/tests/features/records-squash.spec.js +6 -4
  153. package/dist/esm/tests/features/records-squash.spec.js.map +1 -1
  154. package/dist/esm/tests/features/records-tags.spec.js +1 -4
  155. package/dist/esm/tests/features/records-tags.spec.js.map +1 -1
  156. package/dist/esm/tests/features/resumable-tasks.spec.js +3 -5
  157. package/dist/esm/tests/features/resumable-tasks.spec.js.map +1 -1
  158. package/dist/esm/tests/fuzz/message-store.fuzz.spec.js +1 -2
  159. package/dist/esm/tests/fuzz/message-store.fuzz.spec.js.map +1 -1
  160. package/dist/esm/tests/fuzz/process-message.fuzz.spec.js +2 -4
  161. package/dist/esm/tests/fuzz/process-message.fuzz.spec.js.map +1 -1
  162. package/dist/esm/tests/fuzz/schema-validation.fuzz.spec.js +1 -1
  163. package/dist/esm/tests/fuzz/schema-validation.fuzz.spec.js.map +1 -1
  164. package/dist/esm/tests/handlers/messages-query.spec.js +246 -0
  165. package/dist/esm/tests/handlers/messages-query.spec.js.map +1 -0
  166. package/dist/esm/tests/handlers/messages-read.spec.js +2 -5
  167. package/dist/esm/tests/handlers/messages-read.spec.js.map +1 -1
  168. package/dist/esm/tests/handlers/messages-subscribe.spec.js +3 -14
  169. package/dist/esm/tests/handlers/messages-subscribe.spec.js.map +1 -1
  170. package/dist/esm/tests/handlers/protocols-configure.spec.js +27 -26
  171. package/dist/esm/tests/handlers/protocols-configure.spec.js.map +1 -1
  172. package/dist/esm/tests/handlers/protocols-query.spec.js +1 -4
  173. package/dist/esm/tests/handlers/protocols-query.spec.js.map +1 -1
  174. package/dist/esm/tests/handlers/records-count.spec.js +1 -4
  175. package/dist/esm/tests/handlers/records-count.spec.js.map +1 -1
  176. package/dist/esm/tests/handlers/records-delete.spec.js +312 -30
  177. package/dist/esm/tests/handlers/records-delete.spec.js.map +1 -1
  178. package/dist/esm/tests/handlers/records-query.spec.js +32 -9
  179. package/dist/esm/tests/handlers/records-query.spec.js.map +1 -1
  180. package/dist/esm/tests/handlers/records-read.spec.js +4 -4
  181. package/dist/esm/tests/handlers/records-read.spec.js.map +1 -1
  182. package/dist/esm/tests/handlers/records-subscribe.spec.js +33 -14
  183. package/dist/esm/tests/handlers/records-subscribe.spec.js.map +1 -1
  184. package/dist/esm/tests/handlers/records-write.spec.js +84 -38
  185. package/dist/esm/tests/handlers/records-write.spec.js.map +1 -1
  186. package/dist/esm/tests/interfaces/records-delete.spec.js +69 -2
  187. package/dist/esm/tests/interfaces/records-delete.spec.js.map +1 -1
  188. package/dist/esm/tests/interfaces/records-write.spec.js +4 -3
  189. package/dist/esm/tests/interfaces/records-write.spec.js.map +1 -1
  190. package/dist/esm/tests/protocols/permissions.spec.js +55 -6
  191. package/dist/esm/tests/protocols/permissions.spec.js.map +1 -1
  192. package/dist/esm/tests/scenarios/aggregator.spec.js +1 -4
  193. package/dist/esm/tests/scenarios/aggregator.spec.js.map +1 -1
  194. package/dist/esm/tests/scenarios/deleted-record.spec.js +1 -4
  195. package/dist/esm/tests/scenarios/deleted-record.spec.js.map +1 -1
  196. package/dist/esm/tests/scenarios/end-to-end-tests.spec.js +1 -4
  197. package/dist/esm/tests/scenarios/end-to-end-tests.spec.js.map +1 -1
  198. package/dist/esm/tests/scenarios/nested-roles.spec.js +1 -4
  199. package/dist/esm/tests/scenarios/nested-roles.spec.js.map +1 -1
  200. package/dist/esm/tests/scenarios/subscriptions.spec.js +1 -4
  201. package/dist/esm/tests/scenarios/subscriptions.spec.js.map +1 -1
  202. package/dist/esm/tests/store/message-store-level.spec.js +361 -5
  203. package/dist/esm/tests/store/message-store-level.spec.js.map +1 -1
  204. package/dist/esm/tests/store/message-store.spec.js +60 -0
  205. package/dist/esm/tests/store/message-store.spec.js.map +1 -1
  206. package/dist/esm/tests/test-event-stream.js +7 -3
  207. package/dist/esm/tests/test-event-stream.js.map +1 -1
  208. package/dist/esm/tests/test-stores.js +19 -9
  209. package/dist/esm/tests/test-stores.js.map +1 -1
  210. package/dist/esm/tests/test-suite.js +4 -4
  211. package/dist/esm/tests/test-suite.js.map +1 -1
  212. package/dist/esm/tests/utils/test-data-generator.js +25 -0
  213. package/dist/esm/tests/utils/test-data-generator.js.map +1 -1
  214. package/dist/esm/tests/utils/test-stub-generator.js.map +1 -1
  215. package/dist/esm/tests/utils/test-validation-state-reader.js +16 -0
  216. package/dist/esm/tests/utils/test-validation-state-reader.js.map +1 -0
  217. package/dist/types/generated/precompiled-validators.d.ts +6 -6
  218. package/dist/types/generated/precompiled-validators.d.ts.map +1 -1
  219. package/dist/types/src/core/core-protocol.d.ts +3 -3
  220. package/dist/types/src/core/core-protocol.d.ts.map +1 -1
  221. package/dist/types/src/core/dwn-constant.d.ts +5 -0
  222. package/dist/types/src/core/dwn-constant.d.ts.map +1 -1
  223. package/dist/types/src/core/dwn-error.d.ts +13 -7
  224. package/dist/types/src/core/dwn-error.d.ts.map +1 -1
  225. package/dist/types/src/core/grant-authorization.d.ts +5 -5
  226. package/dist/types/src/core/grant-authorization.d.ts.map +1 -1
  227. package/dist/types/src/core/message-reply.d.ts +5 -4
  228. package/dist/types/src/core/message-reply.d.ts.map +1 -1
  229. package/dist/types/src/core/messages-grant-authorization.d.ts +12 -15
  230. package/dist/types/src/core/messages-grant-authorization.d.ts.map +1 -1
  231. package/dist/types/src/core/protocol-authorization-action.d.ts +4 -5
  232. package/dist/types/src/core/protocol-authorization-action.d.ts.map +1 -1
  233. package/dist/types/src/core/protocol-authorization-validation.d.ts +13 -16
  234. package/dist/types/src/core/protocol-authorization-validation.d.ts.map +1 -1
  235. package/dist/types/src/core/protocol-authorization.d.ts +8 -33
  236. package/dist/types/src/core/protocol-authorization.d.ts.map +1 -1
  237. package/dist/types/src/core/protocols-grant-authorization.d.ts +4 -4
  238. package/dist/types/src/core/protocols-grant-authorization.d.ts.map +1 -1
  239. package/dist/types/src/core/recording-validation-state-reader.d.ts +75 -0
  240. package/dist/types/src/core/recording-validation-state-reader.d.ts.map +1 -0
  241. package/dist/types/src/core/records-grant-authorization.d.ts +8 -8
  242. package/dist/types/src/core/records-grant-authorization.d.ts.map +1 -1
  243. package/dist/types/src/core/replication-apply.d.ts +129 -0
  244. package/dist/types/src/core/replication-apply.d.ts.map +1 -0
  245. package/dist/types/src/core/resumable-task-manager.d.ts +1 -1
  246. package/dist/types/src/core/resumable-task-manager.d.ts.map +1 -1
  247. package/dist/types/src/core/validation-state-reader.d.ts +79 -0
  248. package/dist/types/src/core/validation-state-reader.d.ts.map +1 -0
  249. package/dist/types/src/dwn.d.ts +47 -13
  250. package/dist/types/src/dwn.d.ts.map +1 -1
  251. package/dist/types/src/enums/dwn-interface-method.d.ts +0 -1
  252. package/dist/types/src/enums/dwn-interface-method.d.ts.map +1 -1
  253. package/dist/types/src/event-stream/durable-event-log.d.ts +69 -0
  254. package/dist/types/src/event-stream/durable-event-log.d.ts.map +1 -0
  255. package/dist/types/src/event-stream/event-emitter-wake-publisher.d.ts +13 -0
  256. package/dist/types/src/event-stream/event-emitter-wake-publisher.d.ts.map +1 -0
  257. package/dist/types/src/handlers/messages-query.d.ts +20 -0
  258. package/dist/types/src/handlers/messages-query.d.ts.map +1 -0
  259. package/dist/types/src/handlers/messages-read.d.ts +1 -1
  260. package/dist/types/src/handlers/messages-read.d.ts.map +1 -1
  261. package/dist/types/src/handlers/messages-subscribe.d.ts.map +1 -1
  262. package/dist/types/src/handlers/protocols-configure.d.ts +0 -5
  263. package/dist/types/src/handlers/protocols-configure.d.ts.map +1 -1
  264. package/dist/types/src/handlers/records-count.d.ts +2 -1
  265. package/dist/types/src/handlers/records-count.d.ts.map +1 -1
  266. package/dist/types/src/handlers/records-delete.d.ts +2 -2
  267. package/dist/types/src/handlers/records-delete.d.ts.map +1 -1
  268. package/dist/types/src/handlers/records-query.d.ts +1 -1
  269. package/dist/types/src/handlers/records-query.d.ts.map +1 -1
  270. package/dist/types/src/handlers/records-read.d.ts +2 -1
  271. package/dist/types/src/handlers/records-read.d.ts.map +1 -1
  272. package/dist/types/src/handlers/records-subscribe.d.ts +4 -5
  273. package/dist/types/src/handlers/records-subscribe.d.ts.map +1 -1
  274. package/dist/types/src/handlers/records-write.d.ts +3 -11
  275. package/dist/types/src/handlers/records-write.d.ts.map +1 -1
  276. package/dist/types/src/index.d.ts +16 -18
  277. package/dist/types/src/index.d.ts.map +1 -1
  278. package/dist/types/src/interfaces/messages-query.d.ts +23 -0
  279. package/dist/types/src/interfaces/messages-query.d.ts.map +1 -0
  280. package/dist/types/src/interfaces/protocols-configure.d.ts +3 -3
  281. package/dist/types/src/interfaces/protocols-configure.d.ts.map +1 -1
  282. package/dist/types/src/interfaces/protocols-query.d.ts +2 -2
  283. package/dist/types/src/interfaces/protocols-query.d.ts.map +1 -1
  284. package/dist/types/src/interfaces/records-count.d.ts +3 -3
  285. package/dist/types/src/interfaces/records-count.d.ts.map +1 -1
  286. package/dist/types/src/interfaces/records-delete.d.ts +11 -3
  287. package/dist/types/src/interfaces/records-delete.d.ts.map +1 -1
  288. package/dist/types/src/interfaces/records-query.d.ts +3 -3
  289. package/dist/types/src/interfaces/records-query.d.ts.map +1 -1
  290. package/dist/types/src/interfaces/records-read.d.ts +3 -3
  291. package/dist/types/src/interfaces/records-read.d.ts.map +1 -1
  292. package/dist/types/src/interfaces/records-subscribe.d.ts +3 -3
  293. package/dist/types/src/interfaces/records-subscribe.d.ts.map +1 -1
  294. package/dist/types/src/interfaces/records-write.d.ts +15 -7
  295. package/dist/types/src/interfaces/records-write.d.ts.map +1 -1
  296. package/dist/types/src/protocols/permissions.d.ts +9 -12
  297. package/dist/types/src/protocols/permissions.d.ts.map +1 -1
  298. package/dist/types/src/store/index-level.d.ts +10 -1
  299. package/dist/types/src/store/index-level.d.ts.map +1 -1
  300. package/dist/types/src/store/level-wrapper.d.ts +5 -0
  301. package/dist/types/src/store/level-wrapper.d.ts.map +1 -1
  302. package/dist/types/src/store/message-store-level.d.ts +94 -14
  303. package/dist/types/src/store/message-store-level.d.ts.map +1 -1
  304. package/dist/types/src/store/storage-controller.d.ts +17 -14
  305. package/dist/types/src/store/storage-controller.d.ts.map +1 -1
  306. package/dist/types/src/types/message-store.d.ts +29 -1
  307. package/dist/types/src/types/message-store.d.ts.map +1 -1
  308. package/dist/types/src/types/message-types.d.ts +2 -0
  309. package/dist/types/src/types/message-types.d.ts.map +1 -1
  310. package/dist/types/src/types/messages-types.d.ts +21 -55
  311. package/dist/types/src/types/messages-types.d.ts.map +1 -1
  312. package/dist/types/src/types/method-handler.d.ts +2 -2
  313. package/dist/types/src/types/method-handler.d.ts.map +1 -1
  314. package/dist/types/src/types/permission-types.d.ts +1 -1
  315. package/dist/types/src/types/subscriptions.d.ts +50 -39
  316. package/dist/types/src/types/subscriptions.d.ts.map +1 -1
  317. package/dist/types/src/types/validation-state-reader.d.ts +116 -0
  318. package/dist/types/src/types/validation-state-reader.d.ts.map +1 -0
  319. package/dist/types/src/utils/messages.d.ts +10 -0
  320. package/dist/types/src/utils/messages.d.ts.map +1 -1
  321. package/dist/types/src/utils/record-limit-occupancy.d.ts +40 -0
  322. package/dist/types/src/utils/record-limit-occupancy.d.ts.map +1 -0
  323. package/dist/types/src/utils/records.d.ts +25 -3
  324. package/dist/types/src/utils/records.d.ts.map +1 -1
  325. package/dist/types/src/utils/replication.d.ts +22 -0
  326. package/dist/types/src/utils/replication.d.ts.map +1 -0
  327. package/dist/types/tests/core/process-message-parity.spec.d.ts +2 -0
  328. package/dist/types/tests/core/process-message-parity.spec.d.ts.map +1 -0
  329. package/dist/types/tests/core/replication-apply.spec.d.ts +2 -0
  330. package/dist/types/tests/core/replication-apply.spec.d.ts.map +1 -0
  331. package/dist/types/tests/core/replication-replay-property.spec.d.ts +2 -0
  332. package/dist/types/tests/core/replication-replay-property.spec.d.ts.map +1 -0
  333. package/dist/types/tests/core/validation-read-closure.spec.d.ts +2 -0
  334. package/dist/types/tests/core/validation-read-closure.spec.d.ts.map +1 -0
  335. package/dist/types/tests/core/validation-state-reader.spec.d.ts +2 -0
  336. package/dist/types/tests/core/validation-state-reader.spec.d.ts.map +1 -0
  337. package/dist/types/tests/durable-event-log.spec.d.ts +2 -0
  338. package/dist/types/tests/durable-event-log.spec.d.ts.map +1 -0
  339. package/dist/types/tests/dwn.spec.d.ts.map +1 -1
  340. package/dist/types/tests/features/author-delegated-grant.spec.d.ts.map +1 -1
  341. package/dist/types/tests/features/owner-delegated-grant.spec.d.ts.map +1 -1
  342. package/dist/types/tests/features/owner-signature.spec.d.ts.map +1 -1
  343. package/dist/types/tests/features/permissions.spec.d.ts.map +1 -1
  344. package/dist/types/tests/features/protocol-composition.spec.d.ts.map +1 -1
  345. package/dist/types/tests/features/protocol-create-action.spec.d.ts.map +1 -1
  346. package/dist/types/tests/features/protocol-delete-action.spec.d.ts.map +1 -1
  347. package/dist/types/tests/features/protocol-update-action.spec.d.ts.map +1 -1
  348. package/dist/types/tests/features/records-delivery.spec.d.ts.map +1 -1
  349. package/dist/types/tests/features/records-immutable.spec.d.ts.map +1 -1
  350. package/dist/types/tests/features/records-nested-query-scope.spec.d.ts +2 -0
  351. package/dist/types/tests/features/records-nested-query-scope.spec.d.ts.map +1 -0
  352. package/dist/types/tests/features/records-prune-cross-protocol.spec.d.ts.map +1 -1
  353. package/dist/types/tests/features/records-prune.spec.d.ts.map +1 -1
  354. package/dist/types/tests/features/records-record-limit.spec.d.ts.map +1 -1
  355. package/dist/types/tests/features/records-squash.spec.d.ts.map +1 -1
  356. package/dist/types/tests/features/records-tags.spec.d.ts.map +1 -1
  357. package/dist/types/tests/features/resumable-tasks.spec.d.ts.map +1 -1
  358. package/dist/types/tests/handlers/messages-query.spec.d.ts +2 -0
  359. package/dist/types/tests/handlers/messages-query.spec.d.ts.map +1 -0
  360. package/dist/types/tests/handlers/messages-read.spec.d.ts.map +1 -1
  361. package/dist/types/tests/handlers/messages-subscribe.spec.d.ts.map +1 -1
  362. package/dist/types/tests/handlers/protocols-configure.spec.d.ts.map +1 -1
  363. package/dist/types/tests/handlers/protocols-query.spec.d.ts.map +1 -1
  364. package/dist/types/tests/handlers/records-count.spec.d.ts.map +1 -1
  365. package/dist/types/tests/handlers/records-delete.spec.d.ts.map +1 -1
  366. package/dist/types/tests/handlers/records-query.spec.d.ts.map +1 -1
  367. package/dist/types/tests/handlers/records-read.spec.d.ts.map +1 -1
  368. package/dist/types/tests/handlers/records-subscribe.spec.d.ts.map +1 -1
  369. package/dist/types/tests/handlers/records-write.spec.d.ts.map +1 -1
  370. package/dist/types/tests/scenarios/deleted-record.spec.d.ts.map +1 -1
  371. package/dist/types/tests/scenarios/end-to-end-tests.spec.d.ts.map +1 -1
  372. package/dist/types/tests/scenarios/nested-roles.spec.d.ts.map +1 -1
  373. package/dist/types/tests/scenarios/subscriptions.spec.d.ts.map +1 -1
  374. package/dist/types/tests/store/message-store.spec.d.ts.map +1 -1
  375. package/dist/types/tests/test-event-stream.d.ts +1 -1
  376. package/dist/types/tests/test-event-stream.d.ts.map +1 -1
  377. package/dist/types/tests/test-stores.d.ts +5 -4
  378. package/dist/types/tests/test-stores.d.ts.map +1 -1
  379. package/dist/types/tests/test-suite.d.ts +1 -2
  380. package/dist/types/tests/test-suite.d.ts.map +1 -1
  381. package/dist/types/tests/utils/test-data-generator.d.ts +20 -1
  382. package/dist/types/tests/utils/test-data-generator.d.ts.map +1 -1
  383. package/dist/types/tests/utils/test-validation-state-reader.d.ts +15 -0
  384. package/dist/types/tests/utils/test-validation-state-reader.d.ts.map +1 -0
  385. package/package.json +2 -2
  386. package/src/core/core-protocol.ts +3 -3
  387. package/src/core/dwn-constant.ts +7 -1
  388. package/src/core/dwn-error.ts +13 -7
  389. package/src/core/grant-authorization.ts +11 -20
  390. package/src/core/message-reply.ts +6 -5
  391. package/src/core/messages-grant-authorization.ts +37 -100
  392. package/src/core/protocol-authorization-action.ts +29 -38
  393. package/src/core/protocol-authorization-validation.ts +41 -98
  394. package/src/core/protocol-authorization.ts +56 -202
  395. package/src/core/protocols-grant-authorization.ts +9 -9
  396. package/src/core/recording-validation-state-reader.ts +130 -0
  397. package/src/core/records-grant-authorization.ts +16 -16
  398. package/src/core/replication-apply.ts +412 -0
  399. package/src/core/resumable-task-manager.ts +10 -8
  400. package/src/core/validation-state-reader.ts +350 -0
  401. package/src/dwn.ts +417 -30
  402. package/src/enums/dwn-interface-method.ts +0 -1
  403. package/src/event-stream/durable-event-log.ts +509 -0
  404. package/src/event-stream/event-emitter-wake-publisher.ts +34 -0
  405. package/src/handlers/messages-query.ts +203 -0
  406. package/src/handlers/messages-read.ts +9 -10
  407. package/src/handlers/messages-subscribe.ts +12 -13
  408. package/src/handlers/protocols-configure.ts +37 -58
  409. package/src/handlers/protocols-query.ts +1 -1
  410. package/src/handlers/records-count.ts +24 -17
  411. package/src/handlers/records-delete.ts +29 -27
  412. package/src/handlers/records-query.ts +38 -17
  413. package/src/handlers/records-read.ts +63 -50
  414. package/src/handlers/records-subscribe.ts +132 -19
  415. package/src/handlers/records-write.ts +77 -168
  416. package/src/index.ts +16 -20
  417. package/src/interfaces/messages-query.ts +70 -0
  418. package/src/interfaces/protocols-configure.ts +12 -4
  419. package/src/interfaces/protocols-query.ts +4 -5
  420. package/src/interfaces/records-count.ts +9 -4
  421. package/src/interfaces/records-delete.ts +25 -5
  422. package/src/interfaces/records-query.ts +9 -4
  423. package/src/interfaces/records-read.ts +4 -4
  424. package/src/interfaces/records-subscribe.ts +9 -4
  425. package/src/interfaces/records-write.ts +41 -13
  426. package/src/protocols/permissions.ts +32 -52
  427. package/src/store/index-level.ts +30 -9
  428. package/src/store/level-wrapper.ts +9 -1
  429. package/src/store/message-store-level.ts +757 -47
  430. package/src/store/storage-controller.ts +74 -63
  431. package/src/types/message-store.ts +45 -2
  432. package/src/types/message-types.ts +3 -1
  433. package/src/types/messages-types.ts +26 -65
  434. package/src/types/method-handler.ts +3 -3
  435. package/src/types/permission-types.ts +1 -1
  436. package/src/types/subscriptions.ts +53 -42
  437. package/src/types/validation-state-reader.ts +127 -0
  438. package/src/utils/messages.ts +25 -1
  439. package/src/utils/record-limit-occupancy.ts +377 -0
  440. package/src/utils/records.ts +69 -13
  441. package/src/utils/replication.ts +122 -0
  442. package/dist/esm/src/core/record-chain.js +0 -64
  443. package/dist/esm/src/core/record-chain.js.map +0 -1
  444. package/dist/esm/src/event-stream/event-emitter-event-log.js +0 -334
  445. package/dist/esm/src/event-stream/event-emitter-event-log.js.map +0 -1
  446. package/dist/esm/src/handlers/messages-sync.js +0 -581
  447. package/dist/esm/src/handlers/messages-sync.js.map +0 -1
  448. package/dist/esm/src/interfaces/messages-sync.js +0 -54
  449. package/dist/esm/src/interfaces/messages-sync.js.map +0 -1
  450. package/dist/esm/src/smt/smt-store-level.js +0 -103
  451. package/dist/esm/src/smt/smt-store-level.js.map +0 -1
  452. package/dist/esm/src/smt/smt-store-memory.js +0 -41
  453. package/dist/esm/src/smt/smt-store-memory.js.map +0 -1
  454. package/dist/esm/src/smt/smt-utils.js +0 -129
  455. package/dist/esm/src/smt/smt-utils.js.map +0 -1
  456. package/dist/esm/src/smt/sparse-merkle-tree.js +0 -577
  457. package/dist/esm/src/smt/sparse-merkle-tree.js.map +0 -1
  458. package/dist/esm/src/state-index/state-index-level.js +0 -191
  459. package/dist/esm/src/state-index/state-index-level.js.map +0 -1
  460. package/dist/esm/src/sync/records-projection.js +0 -228
  461. package/dist/esm/src/sync/records-projection.js.map +0 -1
  462. package/dist/esm/src/types/smt-types.js +0 -5
  463. package/dist/esm/src/types/smt-types.js.map +0 -1
  464. package/dist/esm/src/types/state-index.js +0 -2
  465. package/dist/esm/src/types/state-index.js.map +0 -1
  466. package/dist/esm/tests/event-emitter-event-log.spec.js +0 -499
  467. package/dist/esm/tests/event-emitter-event-log.spec.js.map +0 -1
  468. package/dist/esm/tests/handlers/messages-sync.spec.js +0 -1771
  469. package/dist/esm/tests/handlers/messages-sync.spec.js.map +0 -1
  470. package/dist/esm/tests/smt/smt-store-level.spec.js +0 -132
  471. package/dist/esm/tests/smt/smt-store-level.spec.js.map +0 -1
  472. package/dist/esm/tests/smt/sparse-merkle-tree.spec.js +0 -732
  473. package/dist/esm/tests/smt/sparse-merkle-tree.spec.js.map +0 -1
  474. package/dist/esm/tests/state-index/state-index-level.spec.js +0 -245
  475. package/dist/esm/tests/state-index/state-index-level.spec.js.map +0 -1
  476. package/dist/esm/tests/sync/records-projection.spec.js +0 -245
  477. package/dist/esm/tests/sync/records-projection.spec.js.map +0 -1
  478. package/dist/types/src/core/record-chain.d.ts +0 -24
  479. package/dist/types/src/core/record-chain.d.ts.map +0 -1
  480. package/dist/types/src/event-stream/event-emitter-event-log.d.ts +0 -80
  481. package/dist/types/src/event-stream/event-emitter-event-log.d.ts.map +0 -1
  482. package/dist/types/src/handlers/messages-sync.d.ts +0 -83
  483. package/dist/types/src/handlers/messages-sync.d.ts.map +0 -1
  484. package/dist/types/src/interfaces/messages-sync.d.ts +0 -23
  485. package/dist/types/src/interfaces/messages-sync.d.ts.map +0 -1
  486. package/dist/types/src/smt/smt-store-level.d.ts +0 -32
  487. package/dist/types/src/smt/smt-store-level.d.ts.map +0 -1
  488. package/dist/types/src/smt/smt-store-memory.d.ts +0 -22
  489. package/dist/types/src/smt/smt-store-memory.d.ts.map +0 -1
  490. package/dist/types/src/smt/smt-utils.d.ts +0 -58
  491. package/dist/types/src/smt/smt-utils.d.ts.map +0 -1
  492. package/dist/types/src/smt/sparse-merkle-tree.d.ts +0 -124
  493. package/dist/types/src/smt/sparse-merkle-tree.d.ts.map +0 -1
  494. package/dist/types/src/state-index/state-index-level.d.ts +0 -83
  495. package/dist/types/src/state-index/state-index-level.d.ts.map +0 -1
  496. package/dist/types/src/sync/records-projection.d.ts +0 -98
  497. package/dist/types/src/sync/records-projection.d.ts.map +0 -1
  498. package/dist/types/src/types/smt-types.d.ts +0 -81
  499. package/dist/types/src/types/smt-types.d.ts.map +0 -1
  500. package/dist/types/src/types/state-index.d.ts +0 -90
  501. package/dist/types/src/types/state-index.d.ts.map +0 -1
  502. package/dist/types/tests/event-emitter-event-log.spec.d.ts +0 -2
  503. package/dist/types/tests/event-emitter-event-log.spec.d.ts.map +0 -1
  504. package/dist/types/tests/handlers/messages-sync.spec.d.ts +0 -2
  505. package/dist/types/tests/handlers/messages-sync.spec.d.ts.map +0 -1
  506. package/dist/types/tests/smt/smt-store-level.spec.d.ts +0 -2
  507. package/dist/types/tests/smt/smt-store-level.spec.d.ts.map +0 -1
  508. package/dist/types/tests/smt/sparse-merkle-tree.spec.d.ts +0 -2
  509. package/dist/types/tests/smt/sparse-merkle-tree.spec.d.ts.map +0 -1
  510. package/dist/types/tests/state-index/state-index-level.spec.d.ts +0 -2
  511. package/dist/types/tests/state-index/state-index-level.spec.d.ts.map +0 -1
  512. package/dist/types/tests/sync/records-projection.spec.d.ts +0 -2
  513. package/dist/types/tests/sync/records-projection.spec.d.ts.map +0 -1
  514. package/src/core/record-chain.ts +0 -99
  515. package/src/event-stream/event-emitter-event-log.ts +0 -430
  516. package/src/handlers/messages-sync.ts +0 -896
  517. package/src/interfaces/messages-sync.ts +0 -86
  518. package/src/smt/smt-store-level.ts +0 -143
  519. package/src/smt/smt-store-memory.ts +0 -53
  520. package/src/smt/smt-utils.ts +0 -149
  521. package/src/smt/sparse-merkle-tree.ts +0 -698
  522. package/src/state-index/state-index-level.ts +0 -239
  523. package/src/sync/records-projection.ts +0 -328
  524. package/src/types/smt-types.ts +0 -95
  525. package/src/types/state-index.ts +0 -100
@@ -0,0 +1,122 @@
1
+ import type { GenericMessage } from '../types/message-types.js';
2
+ import type { KeyValues } from '../types/query-types.js';
3
+
4
+ import { PermissionsProtocol } from '../protocols/permissions.js';
5
+ import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
6
+
7
+ const POSITION_PAD_WIDTH = 20;
8
+
9
+ type ReplicationMessageDescriptor = GenericMessage['descriptor'] & {
10
+ tags?: Record<string, unknown>;
11
+ };
12
+
13
+ /**
14
+ * Shared helpers for the replication log substrate.
15
+ */
16
+ export class Replication {
17
+ public static readonly globalDomain = '';
18
+
19
+ public static protocolDomain(protocolUri: string): string {
20
+ return `protocol:${protocolUri}`;
21
+ }
22
+
23
+ public static permissionDomain(protocolUri: string): string {
24
+ return `perm:${protocolUri}`;
25
+ }
26
+
27
+ public static async deriveStreamId(tenant: string): Promise<string> {
28
+ const bytes = new TextEncoder().encode(tenant);
29
+ const hashBuffer = await crypto.subtle.digest('SHA-256', bytes);
30
+ const hashArray = new Uint8Array(hashBuffer);
31
+ return Array.from(hashArray.slice(0, 8), (b: number) => b.toString(16).padStart(2, '0')).join('');
32
+ }
33
+
34
+ public static computeFingerprintScopes(message: GenericMessage, indexes: KeyValues): string[] {
35
+ const scopes = [Replication.globalDomain];
36
+
37
+ const descriptor: ReplicationMessageDescriptor = message.descriptor;
38
+ const protocol = indexes.protocol;
39
+ if (typeof protocol === 'string') {
40
+ scopes.push(Replication.protocolDomain(protocol));
41
+
42
+ if (protocol === PermissionsProtocol.uri) {
43
+ const indexedTaggedProtocol = indexes['tag.protocol'];
44
+ const taggedProtocol = indexedTaggedProtocol ?? descriptor.tags?.protocol;
45
+ if (typeof taggedProtocol === 'string') {
46
+ scopes.push(Replication.permissionDomain(taggedProtocol));
47
+ }
48
+ }
49
+ }
50
+
51
+ return scopes;
52
+ }
53
+
54
+ public static assertFingerprintScopesUntouched(
55
+ persistedScopes: string[],
56
+ message: GenericMessage,
57
+ messageCid: string,
58
+ newIndexes: KeyValues,
59
+ ): void {
60
+ const expectedScopes = Replication.computeFingerprintScopes(message, newIndexes);
61
+ if (!Replication.scopeSetsMatch(persistedScopes, expectedScopes)) {
62
+ Replication.throwFingerprintScopeMutation(messageCid);
63
+ }
64
+ }
65
+
66
+ private static scopeSetsMatch(left: string[], right: string[]): boolean {
67
+ if (left.length !== right.length) {
68
+ return false;
69
+ }
70
+
71
+ return right.every((scope) => left.includes(scope));
72
+ }
73
+
74
+ private static throwFingerprintScopeMutation(messageCid: string): never {
75
+ throw new DwnError(
76
+ DwnErrorCode.MessageStoreFingerprintScopeMutation,
77
+ `index replacement for message ${messageCid} would change its persisted fingerprint scopes`
78
+ );
79
+ }
80
+
81
+ public static async hashMessageCid(messageCid: string): Promise<Uint8Array> {
82
+ const bytes = new TextEncoder().encode(messageCid);
83
+ const hashBuffer = await crypto.subtle.digest('SHA-256', bytes);
84
+ return new Uint8Array(hashBuffer);
85
+ }
86
+
87
+ public static emptyFingerprint(): Uint8Array {
88
+ return new Uint8Array(32);
89
+ }
90
+
91
+ public static xorFingerprint(fingerprint: Uint8Array, contribution: Uint8Array): Uint8Array {
92
+ const result = new Uint8Array(32);
93
+ for (let i = 0; i < 32; i++) {
94
+ result[i] = fingerprint[i] ^ contribution[i];
95
+ }
96
+ return result;
97
+ }
98
+
99
+ public static fingerprintToHex(fingerprint: Uint8Array): string {
100
+ return Array.from(fingerprint, (b: number) => b.toString(16).padStart(2, '0')).join('');
101
+ }
102
+
103
+ public static hexToFingerprint(hex: string): Uint8Array {
104
+ const bytes = new Uint8Array(32);
105
+ for (let i = 0; i < 32; i++) {
106
+ bytes[i] = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16);
107
+ }
108
+ return bytes;
109
+ }
110
+
111
+ public static encodePositionKey(position: bigint): string {
112
+ const decimal = position.toString();
113
+ if (position < 0n || decimal.length > POSITION_PAD_WIDTH) {
114
+ throw new DwnError(
115
+ DwnErrorCode.MessageStoreReplicationPositionOverflow,
116
+ `log position ${decimal} cannot be encoded within ${POSITION_PAD_WIDTH} digits`
117
+ );
118
+ }
119
+
120
+ return decimal.padStart(POSITION_PAD_WIDTH, '0');
121
+ }
122
+ }
@@ -1,64 +0,0 @@
1
- import { RecordsWrite } from '../interfaces/records-write.js';
2
- import { DwnError, DwnErrorCode } from './dwn-error.js';
3
- import { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
4
- /**
5
- * Fetches the initial RecordsWrite message associated with the given (tenant + recordId).
6
- */
7
- export async function fetchInitialWrite(tenant, recordId, messageStore) {
8
- const query = {
9
- interface: DwnInterfaceName.Records,
10
- method: DwnMethodName.Write,
11
- recordId: recordId
12
- };
13
- const { messages } = await messageStore.query(tenant, [query]);
14
- if (messages.length === 0) {
15
- return undefined;
16
- }
17
- const initialWrite = await RecordsWrite.getInitialWrite(messages);
18
- return initialWrite;
19
- }
20
- /**
21
- * Constructs the chain of EXISTING records in the datastore where the first record is the root initial `RecordsWrite` of the record chain
22
- * and last record is the initial `RecordsWrite` of the descendant record specified.
23
- * @param descendantRecordId The ID of the descendent record to start constructing the record chain from by repeatedly looking up the parent.
24
- * @returns the record chain where each record is represented by its initial `RecordsWrite`;
25
- * returns empty array if `descendantRecordId` is `undefined`.
26
- * @throws {DwnError} if `descendantRecordId` is defined but any initial `RecordsWrite` is not found in the chain of records.
27
- */
28
- export async function constructRecordChain(tenant, descendantRecordId, messageStore) {
29
- if (descendantRecordId === undefined) {
30
- return [];
31
- }
32
- const recordChain = [];
33
- // keep walking up the chain from the inbound message's parent, until there is no more parent
34
- let currentRecordId = descendantRecordId;
35
- while (currentRecordId !== undefined) {
36
- const initialWrite = await fetchInitialWrite(tenant, currentRecordId, messageStore);
37
- // RecordsWrite needed should be available since we perform necessary checks at the time of writes,
38
- // eg. check the immediate parent in `verifyProtocolPathAndContextId` at the time of writing,
39
- // so if this condition is triggered, it means there is an unexpected bug that caused an incomplete chain.
40
- // We add additional defensive check here because returning an unexpected/incorrect record chain could lead to security vulnerabilities.
41
- if (initialWrite === undefined) {
42
- throw new DwnError(DwnErrorCode.ProtocolAuthorizationParentNotFoundConstructingRecordChain, `Unexpected error that should never trigger: no parent found with ID ${currentRecordId} when constructing record chain.`);
43
- }
44
- recordChain.push(initialWrite);
45
- currentRecordId = initialWrite.descriptor.parentId;
46
- }
47
- return recordChain.reverse(); // root record first
48
- }
49
- /**
50
- * Determines the timestamp that governs which protocol definition version applies to the given RecordsWrite.
51
- * For an update, this is the initial write's `messageTimestamp` (the protocol version is locked at creation time).
52
- * For a new initial write, returns `undefined` — the latest protocol definition should be used because the
53
- * record is being created now and must conform to the current protocol rules.
54
- */
55
- export async function getGoverningTimestamp(tenant, incomingMessage, messageStore) {
56
- const existingInitialWrite = await fetchInitialWrite(tenant, incomingMessage.message.recordId, messageStore);
57
- if (existingInitialWrite !== undefined) {
58
- // update case: use the initial write's timestamp
59
- return existingInitialWrite.descriptor.messageTimestamp;
60
- }
61
- // initial write case: validate against the latest protocol definition
62
- return undefined;
63
- }
64
- //# sourceMappingURL=record-chain.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"record-chain.js","sourceRoot":"","sources":["../../../../src/core/record-chain.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAEnF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAc,EACd,QAAgB,EAChB,YAA0B;IAG1B,MAAM,KAAK,GAAW;QACpB,SAAS,EAAG,gBAAgB,CAAC,OAAO;QACpC,MAAM,EAAM,aAAa,CAAC,KAAK;QAC/B,QAAQ,EAAI,QAAQ;KACrB,CAAC;IACF,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAE/D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;IAClE,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAc,EACd,kBAAsC,EACtC,YAA0B;IAG1B,IAAI,kBAAkB,KAAK,SAAS,EAAE,CAAC;QACrC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,WAAW,GAA0B,EAAE,CAAC;IAE9C,6FAA6F;IAC7F,IAAI,eAAe,GAAuB,kBAAkB,CAAC;IAC7D,OAAO,eAAe,KAAK,SAAS,EAAE,CAAC;QAErC,MAAM,YAAY,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,eAAe,EAAE,YAAY,CAAC,CAAC;QAEpF,mGAAmG;QACnG,6FAA6F;QAC7F,0GAA0G;QAC1G,wIAAwI;QACxI,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,IAAI,QAAQ,CAChB,YAAY,CAAC,0DAA0D,EACvE,uEAAuE,eAAe,kCAAkC,CACzH,CAAC;QACJ,CAAC;QAED,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC/B,eAAe,GAAG,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC;IACrD,CAAC;IAED,OAAO,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,oBAAoB;AACpD,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAc,EACd,eAA6B,EAC7B,YAA0B;IAE1B,MAAM,oBAAoB,GAAG,MAAM,iBAAiB,CAClD,MAAM,EAAE,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE,YAAY,CACvD,CAAC;IAEF,IAAI,oBAAoB,KAAK,SAAS,EAAE,CAAC;QACvC,iDAAiD;QACjD,OAAO,oBAAoB,CAAC,UAAU,CAAC,gBAAgB,CAAC;IAC1D,CAAC;IAED,sEAAsE;IACtE,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -1,334 +0,0 @@
1
- import mitt from 'mitt';
2
- import { FilterUtility } from '../utils/filter.js';
3
- import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
4
- const EVENTS_LISTENER_CHANNEL = 'events';
5
- /**
6
- * In-memory implementation of {@link EventLog} backed by `mitt` for in-process
7
- * pub/sub and a per-tenant `Map<number, StoredEntry>` for persistence with
8
- * cursor-based reads.
9
- *
10
- * Suitable for single-process embedded DWN instances and tests.
11
- * For multi-node deployments, use a distributed implementation (NATS, Redis, etc.).
12
- */
13
- export class EventEmitterEventLog {
14
- emitter = mitt();
15
- isOpen = false;
16
- errorHandler = (error) => { console.error('event log error', error); };
17
- maxEventsPerTenant;
18
- /**
19
- * Per-tenant ordered event storage.
20
- * Key: tenant DID → Map of seq → StoredEntry.
21
- */
22
- tenantLogs = new Map();
23
- /**
24
- * Per-tenant monotonic sequence counter.
25
- */
26
- tenantSeqs = new Map();
27
- /**
28
- * Epoch for this EventLog instance. Generated once at construction as a
29
- * UUID v4. Changes every restart (correct for in-memory — state is lost).
30
- */
31
- epoch;
32
- constructor(config = {}) {
33
- this.maxEventsPerTenant = config.maxEventsPerTenant ?? 10_000;
34
- this.epoch = crypto.randomUUID();
35
- if (config.errorHandler) {
36
- this.errorHandler = config.errorHandler;
37
- }
38
- }
39
- /**
40
- * Derives a stable `streamId` for a given tenant. Deterministic — same
41
- * tenant always produces the same streamId on any instance.
42
- */
43
- async getStreamId(tenant) {
44
- const bytes = new TextEncoder().encode(tenant);
45
- const hashBuffer = await crypto.subtle.digest('SHA-256', bytes);
46
- const hashArray = new Uint8Array(hashBuffer);
47
- // Take first 16 hex chars (64 bits) of the hash for a compact stable ID.
48
- return Array.from(hashArray.slice(0, 8), (b) => b.toString(16).padStart(2, '0')).join('');
49
- }
50
- /**
51
- * Constructs a {@link ProgressToken} from internal state.
52
- */
53
- async buildToken(tenant, seq, messageCid) {
54
- return {
55
- streamId: await this.getStreamId(tenant),
56
- epoch: this.epoch,
57
- position: String(seq),
58
- messageCid,
59
- };
60
- }
61
- /**
62
- * Validates a cursor against the current EventLog state. Throws
63
- * `DwnError(EventLogProgressGap)` with {@link ProgressGapInfo} metadata
64
- * if the cursor cannot be resumed.
65
- */
66
- async validateCursor(tenant, cursor) {
67
- const expectedStreamId = await this.getStreamId(tenant);
68
- let reason;
69
- if (cursor.streamId !== expectedStreamId) {
70
- reason = 'stream_mismatch';
71
- }
72
- else if (cursor.epoch === this.epoch) {
73
- // Check if position is still within replay bounds.
74
- const log = this.tenantLogs.get(tenant);
75
- if (log !== undefined && log.size > 0) {
76
- const firstSeq = log.keys().next().value;
77
- const cursorSeq = EventEmitterEventLog.parsePosition(cursor.position);
78
- if (cursorSeq < firstSeq - 1) {
79
- // Cursor position has been evicted — events between cursor and firstSeq are lost.
80
- reason = 'token_too_old';
81
- }
82
- else {
83
- return; // Cursor is valid.
84
- }
85
- }
86
- else {
87
- return; // No events for tenant — cursor is vacuously valid (will get empty catch-up + EOSE).
88
- }
89
- }
90
- else {
91
- reason = 'epoch_mismatch';
92
- }
93
- // Build gap metadata.
94
- const bounds = await this.getReplayBounds(tenant);
95
- const gapInfo = {
96
- requested: cursor,
97
- oldestAvailable: bounds?.oldest ?? cursor,
98
- latestAvailable: bounds?.latest ?? cursor,
99
- reason,
100
- };
101
- const error = new DwnError(DwnErrorCode.EventLogProgressGap, `progress token gap: ${reason}`);
102
- error.gapInfo = gapInfo;
103
- throw error;
104
- }
105
- async open() {
106
- this.isOpen = true;
107
- }
108
- async close() {
109
- this.isOpen = false;
110
- this.emitter.all.clear();
111
- this.tenantLogs.clear();
112
- this.tenantSeqs.clear();
113
- }
114
- async emit(tenant, event, indexes, messageCid) {
115
- if (!this.isOpen) {
116
- this.errorHandler(new DwnError(DwnErrorCode.EventLogNotOpenError, 'a message emitted when EventLog is closed'));
117
- return undefined;
118
- }
119
- // Assign a monotonic sequence number for this tenant.
120
- const prevSeq = this.tenantSeqs.get(tenant) ?? 0;
121
- const seq = prevSeq + 1;
122
- this.tenantSeqs.set(tenant, seq);
123
- // Persist the event.
124
- let log = this.tenantLogs.get(tenant);
125
- if (log === undefined) {
126
- log = new Map();
127
- this.tenantLogs.set(tenant, log);
128
- }
129
- log.set(seq, { event, indexes, messageCid });
130
- // Evict oldest entries if the log exceeds the retention limit.
131
- if (log.size > this.maxEventsPerTenant) {
132
- const evictCount = log.size - this.maxEventsPerTenant;
133
- let evicted = 0;
134
- for (const key of log.keys()) {
135
- if (evicted >= evictCount) {
136
- break;
137
- }
138
- log.delete(key);
139
- evicted++;
140
- }
141
- }
142
- // Notify in-process subscribers.
143
- const channel = `${tenant}_${EVENTS_LISTENER_CHANNEL}`;
144
- this.emitter.emit(channel, { tenant, event, indexes, seq, messageCid });
145
- return this.buildToken(tenant, seq, messageCid);
146
- }
147
- async read(tenant, options = {}) {
148
- const { cursor, limit, filters } = options;
149
- // Validate cursor before attempting to read.
150
- if (cursor !== undefined) {
151
- await this.validateCursor(tenant, cursor);
152
- }
153
- const cursorSeq = cursor === undefined ? undefined : EventEmitterEventLog.parsePosition(cursor.position);
154
- const log = this.tenantLogs.get(tenant);
155
- if (log === undefined || log.size === 0) {
156
- return { events: [], cursor };
157
- }
158
- const results = [];
159
- const maxResults = limit ?? Number.MAX_SAFE_INTEGER;
160
- for (const [seq, entry] of log) {
161
- // Skip entries at or before the cursor.
162
- if (cursorSeq !== undefined && seq <= cursorSeq) {
163
- continue;
164
- }
165
- // Apply filters if provided (OR semantics — match any filter).
166
- if (filters !== undefined && filters.length > 0) {
167
- if (!FilterUtility.matchAnyFilter(entry.indexes, filters)) {
168
- continue;
169
- }
170
- }
171
- results.push({
172
- seq,
173
- event: entry.event,
174
- indexes: entry.indexes,
175
- messageCid: entry.messageCid,
176
- });
177
- if (results.length >= maxResults) {
178
- break;
179
- }
180
- }
181
- if (results.length > 0) {
182
- const lastEntry = results[results.length - 1];
183
- // Use the messageCid captured during the synchronous iteration above —
184
- // no re-lookup needed, so eviction during the await cannot lose it.
185
- const lastToken = await this.buildToken(tenant, lastEntry.seq, lastEntry.messageCid);
186
- return { events: results, cursor: lastToken };
187
- }
188
- return { events: results, cursor };
189
- }
190
- /**
191
- * Parse a position string into an internal sequence number using BigInt
192
- * for safe handling of values beyond `Number.MAX_SAFE_INTEGER`.
193
- *
194
- * The returned `number` is safe for the in-memory EventLog which uses
195
- * `Map<number, StoredEntry>` keys — in-memory sequences will never
196
- * exceed safe integer range. The BigInt parse validates correctness
197
- * before the narrowing conversion.
198
- */
199
- static parsePosition(position) {
200
- try {
201
- const big = BigInt(position);
202
- if (big < 0n) {
203
- throw new DwnError(DwnErrorCode.EventLogNotOpenError, `invalid cursor position: '${position}'`);
204
- }
205
- return Number(big);
206
- }
207
- catch (e) {
208
- if (e instanceof DwnError) {
209
- throw e;
210
- }
211
- throw new DwnError(DwnErrorCode.EventLogNotOpenError, `invalid cursor position: '${position}'`);
212
- }
213
- }
214
- async subscribe(tenant, id, listener, options) {
215
- const channel = `${tenant}_${EVENTS_LISTENER_CHANNEL}`;
216
- const { cursor, filters } = options ?? {};
217
- // Helper to build a token from a live emitter payload.
218
- const tokenFromPayload = async (payload) => {
219
- return this.buildToken(tenant, payload.seq, payload.messageCid);
220
- };
221
- if (cursor !== undefined) {
222
- // ---- Cursor mode: catch-up from stored events, then EOSE, then live ----
223
- // Validate cursor before subscribing — throws DwnError(EventLogProgressGap) on gap.
224
- await this.validateCursor(tenant, cursor);
225
- const cursorSeq = EventEmitterEventLog.parsePosition(cursor.position);
226
- const pendingLiveEvents = [];
227
- let catchUpComplete = false;
228
- // Step 1: Register live listener FIRST so no events are missed during read.
229
- const handler = (payload) => {
230
- if (filters !== undefined && filters.length > 0) {
231
- if (!FilterUtility.matchAnyFilter(payload.indexes, filters)) {
232
- return;
233
- }
234
- }
235
- if (catchUpComplete) {
236
- void tokenFromPayload(payload).then((token) => {
237
- listener({ type: 'event', cursor: token, event: payload.event });
238
- });
239
- }
240
- else {
241
- pendingLiveEvents.push({ event: payload.event, seq: payload.seq, messageCid: payload.messageCid });
242
- }
243
- };
244
- this.emitter.on(channel, handler);
245
- // Step 2: Read stored events from cursor and deliver them.
246
- const readResult = await this.read(tenant, { cursor, filters });
247
- // The read cursor is the token of the last read event, or the input cursor if nothing new.
248
- const eoseCursor = readResult.cursor ?? cursor;
249
- const lastCatchUpSeq = readResult.cursor === undefined
250
- ? cursorSeq
251
- : EventEmitterEventLog.parsePosition(readResult.cursor.position);
252
- // Use the messageCid captured by read() during its synchronous iteration.
253
- // This eliminates re-lookup races: read() populates entry.messageCid before
254
- // any async yield, so eviction during read()'s buildToken() cannot lose it.
255
- for (const entry of readResult.events) {
256
- const token = await this.buildToken(tenant, entry.seq, entry.messageCid ?? '');
257
- listener({ type: 'event', cursor: token, event: entry.event });
258
- }
259
- // Step 3: Deliver any live events that arrived during catch-up (with seq > lastCatchUpSeq).
260
- // messageCid was captured at buffer time from the EmitterPayload.
261
- catchUpComplete = true;
262
- for (const liveEvent of pendingLiveEvents) {
263
- if (liveEvent.seq > lastCatchUpSeq) {
264
- const token = await this.buildToken(tenant, liveEvent.seq, liveEvent.messageCid);
265
- listener({ type: 'event', cursor: token, event: liveEvent.event });
266
- }
267
- }
268
- // Step 4: Send EOSE marker.
269
- listener({ type: 'eose', cursor: eoseCursor });
270
- return {
271
- id,
272
- close: async () => { this.emitter.off(channel, handler); }
273
- };
274
- }
275
- // ---- No cursor: live events only ----
276
- const handler = (payload) => {
277
- if (filters !== undefined && filters.length > 0) {
278
- if (!FilterUtility.matchAnyFilter(payload.indexes, filters)) {
279
- return;
280
- }
281
- }
282
- void tokenFromPayload(payload).then((token) => {
283
- listener({ type: 'event', cursor: token, event: payload.event });
284
- });
285
- };
286
- this.emitter.on(channel, handler);
287
- return {
288
- id,
289
- close: async () => { this.emitter.off(channel, handler); }
290
- };
291
- }
292
- async getReplayBounds(tenant) {
293
- const log = this.tenantLogs.get(tenant);
294
- if (log === undefined || log.size === 0) {
295
- return undefined;
296
- }
297
- // Map is ordered by insertion (ascending seq). First and last keys are min/max.
298
- const keys = [...log.keys()];
299
- const oldestSeq = keys[0];
300
- const latestSeq = keys[keys.length - 1];
301
- const oldestEntry = log.get(oldestSeq);
302
- const latestEntry = log.get(latestSeq);
303
- const oldest = await this.buildToken(tenant, oldestSeq, oldestEntry.messageCid);
304
- const latest = await this.buildToken(tenant, latestSeq, latestEntry.messageCid);
305
- return { oldest, latest };
306
- }
307
- async trim(tenant, olderThan) {
308
- const log = this.tenantLogs.get(tenant);
309
- if (log === undefined) {
310
- return;
311
- }
312
- if (typeof olderThan === 'number') {
313
- // Trim by sequence number: delete entries with seq < olderThan.
314
- for (const seq of log.keys()) {
315
- if (seq < olderThan) {
316
- log.delete(seq);
317
- }
318
- else {
319
- break; // Map is ordered by insertion (ascending seq), safe to stop.
320
- }
321
- }
322
- }
323
- else {
324
- // Trim by ISO-8601 timestamp: delete entries whose message timestamp is before the given time.
325
- for (const [seq, entry] of log) {
326
- const messageTimestamp = entry.indexes['messageTimestamp'] ?? '';
327
- if (messageTimestamp < olderThan) {
328
- log.delete(seq);
329
- }
330
- }
331
- }
332
- }
333
- }
334
- //# sourceMappingURL=event-emitter-event-log.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"event-emitter-event-log.js","sourceRoot":"","sources":["../../../../src/event-stream/event-emitter-event-log.ts"],"names":[],"mappings":"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"}