@enbox/dwn-sdk-js 0.0.6 → 0.0.8

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 (527) hide show
  1. package/dist/browser.mjs +8 -8
  2. package/dist/browser.mjs.map +4 -4
  3. package/dist/esm/generated/precompiled-validators.js +762 -911
  4. package/dist/esm/generated/precompiled-validators.js.map +1 -1
  5. package/dist/esm/src/core/abstract-message.js +4 -0
  6. package/dist/esm/src/core/abstract-message.js.map +1 -1
  7. package/dist/esm/src/core/auth.js +22 -33
  8. package/dist/esm/src/core/auth.js.map +1 -1
  9. package/dist/esm/src/core/constants.js +11 -0
  10. package/dist/esm/src/core/constants.js.map +1 -0
  11. package/dist/esm/src/core/core-protocol.js +44 -0
  12. package/dist/esm/src/core/core-protocol.js.map +1 -0
  13. package/dist/esm/src/core/dwn-constant.js +7 -7
  14. package/dist/esm/src/core/dwn-constant.js.map +1 -1
  15. package/dist/esm/src/core/dwn-error.js +10 -12
  16. package/dist/esm/src/core/dwn-error.js.map +1 -1
  17. package/dist/esm/src/core/grant-authorization.js +50 -52
  18. package/dist/esm/src/core/grant-authorization.js.map +1 -1
  19. package/dist/esm/src/core/message.js +85 -116
  20. package/dist/esm/src/core/message.js.map +1 -1
  21. package/dist/esm/src/core/messages-grant-authorization.js +63 -78
  22. package/dist/esm/src/core/messages-grant-authorization.js.map +1 -1
  23. package/dist/esm/src/core/protocol-authorization-action.js +266 -0
  24. package/dist/esm/src/core/protocol-authorization-action.js.map +1 -0
  25. package/dist/esm/src/core/protocol-authorization-validation.js +321 -0
  26. package/dist/esm/src/core/protocol-authorization-validation.js.map +1 -0
  27. package/dist/esm/src/core/protocol-authorization.js +144 -741
  28. package/dist/esm/src/core/protocol-authorization.js.map +1 -1
  29. package/dist/esm/src/core/protocols-grant-authorization.js +24 -38
  30. package/dist/esm/src/core/protocols-grant-authorization.js.map +1 -1
  31. package/dist/esm/src/core/record-chain.js +64 -0
  32. package/dist/esm/src/core/record-chain.js.map +1 -0
  33. package/dist/esm/src/core/records-grant-authorization.js +53 -72
  34. package/dist/esm/src/core/records-grant-authorization.js.map +1 -1
  35. package/dist/esm/src/core/resumable-task-manager.js +50 -65
  36. package/dist/esm/src/core/resumable-task-manager.js.map +1 -1
  37. package/dist/esm/src/core/tenant-gate.js +2 -13
  38. package/dist/esm/src/core/tenant-gate.js.map +1 -1
  39. package/dist/esm/src/dwn.js +108 -101
  40. package/dist/esm/src/dwn.js.map +1 -1
  41. package/dist/esm/src/event-stream/event-emitter-event-log.js +204 -0
  42. package/dist/esm/src/event-stream/event-emitter-event-log.js.map +1 -0
  43. package/dist/esm/src/handlers/messages-read.js +67 -81
  44. package/dist/esm/src/handlers/messages-read.js.map +1 -1
  45. package/dist/esm/src/handlers/messages-subscribe.js +51 -63
  46. package/dist/esm/src/handlers/messages-subscribe.js.map +1 -1
  47. package/dist/esm/src/handlers/messages-sync.js +75 -89
  48. package/dist/esm/src/handlers/messages-sync.js.map +1 -1
  49. package/dist/esm/src/handlers/protocols-configure.js +153 -163
  50. package/dist/esm/src/handlers/protocols-configure.js.map +1 -1
  51. package/dist/esm/src/handlers/protocols-query.js +52 -55
  52. package/dist/esm/src/handlers/protocols-query.js.map +1 -1
  53. package/dist/esm/src/handlers/records-count.js +97 -85
  54. package/dist/esm/src/handlers/records-count.js.map +1 -1
  55. package/dist/esm/src/handlers/records-delete.js +75 -93
  56. package/dist/esm/src/handlers/records-delete.js.map +1 -1
  57. package/dist/esm/src/handlers/records-query.js +116 -105
  58. package/dist/esm/src/handlers/records-query.js.map +1 -1
  59. package/dist/esm/src/handlers/records-read.js +130 -132
  60. package/dist/esm/src/handlers/records-read.js.map +1 -1
  61. package/dist/esm/src/handlers/records-subscribe.js +164 -104
  62. package/dist/esm/src/handlers/records-subscribe.js.map +1 -1
  63. package/dist/esm/src/handlers/records-write.js +213 -280
  64. package/dist/esm/src/handlers/records-write.js.map +1 -1
  65. package/dist/esm/src/index.js +5 -2
  66. package/dist/esm/src/index.js.map +1 -1
  67. package/dist/esm/src/interfaces/messages-read.js +24 -32
  68. package/dist/esm/src/interfaces/messages-read.js.map +1 -1
  69. package/dist/esm/src/interfaces/messages-subscribe.js +28 -41
  70. package/dist/esm/src/interfaces/messages-subscribe.js.map +1 -1
  71. package/dist/esm/src/interfaces/messages-sync.js +26 -40
  72. package/dist/esm/src/interfaces/messages-sync.js.map +1 -1
  73. package/dist/esm/src/interfaces/protocols-configure.js +87 -65
  74. package/dist/esm/src/interfaces/protocols-configure.js.map +1 -1
  75. package/dist/esm/src/interfaces/protocols-query.js +55 -68
  76. package/dist/esm/src/interfaces/protocols-query.js.map +1 -1
  77. package/dist/esm/src/interfaces/records-count.js +50 -66
  78. package/dist/esm/src/interfaces/records-count.js.map +1 -1
  79. package/dist/esm/src/interfaces/records-delete.js +45 -55
  80. package/dist/esm/src/interfaces/records-delete.js.map +1 -1
  81. package/dist/esm/src/interfaces/records-query.js +60 -76
  82. package/dist/esm/src/interfaces/records-query.js.map +1 -1
  83. package/dist/esm/src/interfaces/records-read.js +51 -67
  84. package/dist/esm/src/interfaces/records-read.js.map +1 -1
  85. package/dist/esm/src/interfaces/records-subscribe.js +53 -68
  86. package/dist/esm/src/interfaces/records-subscribe.js.map +1 -1
  87. package/dist/esm/src/interfaces/records-write-query.js +102 -0
  88. package/dist/esm/src/interfaces/records-write-query.js.map +1 -0
  89. package/dist/esm/src/interfaces/records-write-signing.js +81 -0
  90. package/dist/esm/src/interfaces/records-write-signing.js.map +1 -0
  91. package/dist/esm/src/interfaces/records-write.js +396 -610
  92. package/dist/esm/src/interfaces/records-write.js.map +1 -1
  93. package/dist/esm/src/jose/algorithms/signing/ed25519.js +10 -19
  94. package/dist/esm/src/jose/algorithms/signing/ed25519.js.map +1 -1
  95. package/dist/esm/src/jose/jws/general/builder.js +23 -35
  96. package/dist/esm/src/jose/jws/general/builder.js.map +1 -1
  97. package/dist/esm/src/jose/jws/general/verifier.js +56 -69
  98. package/dist/esm/src/jose/jws/general/verifier.js.map +1 -1
  99. package/dist/esm/src/protocols/permission-grant.js +43 -14
  100. package/dist/esm/src/protocols/permission-grant.js.map +1 -1
  101. package/dist/esm/src/protocols/permission-request.js +28 -14
  102. package/dist/esm/src/protocols/permission-request.js.map +1 -1
  103. package/dist/esm/src/protocols/permissions.js +325 -227
  104. package/dist/esm/src/protocols/permissions.js.map +1 -1
  105. package/dist/esm/src/smt/smt-store-level.js +42 -64
  106. package/dist/esm/src/smt/smt-store-level.js.map +1 -1
  107. package/dist/esm/src/smt/smt-store-memory.js +19 -45
  108. package/dist/esm/src/smt/smt-store-memory.js.map +1 -1
  109. package/dist/esm/src/smt/smt-utils.js +28 -45
  110. package/dist/esm/src/smt/smt-utils.js.map +1 -1
  111. package/dist/esm/src/smt/sparse-merkle-tree.js +426 -471
  112. package/dist/esm/src/smt/sparse-merkle-tree.js.map +1 -1
  113. package/dist/esm/src/state-index/state-index-level.js +113 -150
  114. package/dist/esm/src/state-index/state-index-level.js.map +1 -1
  115. package/dist/esm/src/store/blockstore-level.js +54 -156
  116. package/dist/esm/src/store/blockstore-level.js.map +1 -1
  117. package/dist/esm/src/store/blockstore-mock.js +48 -153
  118. package/dist/esm/src/store/blockstore-mock.js.map +1 -1
  119. package/dist/esm/src/store/data-store-level.js +137 -100
  120. package/dist/esm/src/store/data-store-level.js.map +1 -1
  121. package/dist/esm/src/store/index-level-compound.js +246 -0
  122. package/dist/esm/src/store/index-level-compound.js.map +1 -0
  123. package/dist/esm/src/store/index-level.js +307 -715
  124. package/dist/esm/src/store/index-level.js.map +1 -1
  125. package/dist/esm/src/store/level-wrapper.js +143 -244
  126. package/dist/esm/src/store/level-wrapper.js.map +1 -1
  127. package/dist/esm/src/store/message-store-level.js +71 -94
  128. package/dist/esm/src/store/message-store-level.js.map +1 -1
  129. package/dist/esm/src/store/resumable-task-store-level.js +62 -101
  130. package/dist/esm/src/store/resumable-task-store-level.js.map +1 -1
  131. package/dist/esm/src/store/storage-controller.js +131 -146
  132. package/dist/esm/src/store/storage-controller.js.map +1 -1
  133. package/dist/esm/src/types/permission-types.js.map +1 -1
  134. package/dist/esm/src/types/protocols-types.js +10 -0
  135. package/dist/esm/src/types/protocols-types.js.map +1 -1
  136. package/dist/esm/src/types/records-types.js.map +1 -1
  137. package/dist/esm/src/utils/abort.js +8 -19
  138. package/dist/esm/src/utils/abort.js.map +1 -1
  139. package/dist/esm/src/utils/array.js +15 -49
  140. package/dist/esm/src/utils/array.js.map +1 -1
  141. package/dist/esm/src/utils/cid.js +29 -77
  142. package/dist/esm/src/utils/cid.js.map +1 -1
  143. package/dist/esm/src/utils/data-stream.js +37 -65
  144. package/dist/esm/src/utils/data-stream.js.map +1 -1
  145. package/dist/esm/src/utils/encryption.js +136 -162
  146. package/dist/esm/src/utils/encryption.js.map +1 -1
  147. package/dist/esm/src/utils/filter.js +1 -12
  148. package/dist/esm/src/utils/filter.js.map +1 -1
  149. package/dist/esm/src/utils/hd-key.js +45 -71
  150. package/dist/esm/src/utils/hd-key.js.map +1 -1
  151. package/dist/esm/src/utils/jws.js +9 -20
  152. package/dist/esm/src/utils/jws.js.map +1 -1
  153. package/dist/esm/src/utils/memory-cache.js +12 -23
  154. package/dist/esm/src/utils/memory-cache.js.map +1 -1
  155. package/dist/esm/src/utils/messages.js +21 -33
  156. package/dist/esm/src/utils/messages.js.map +1 -1
  157. package/dist/esm/src/utils/private-key-signer.js +9 -17
  158. package/dist/esm/src/utils/private-key-signer.js.map +1 -1
  159. package/dist/esm/src/utils/protocols.js +62 -70
  160. package/dist/esm/src/utils/protocols.js.map +1 -1
  161. package/dist/esm/src/utils/records.js +103 -166
  162. package/dist/esm/src/utils/records.js.map +1 -1
  163. package/dist/esm/src/utils/secp256k1.js +60 -96
  164. package/dist/esm/src/utils/secp256k1.js.map +1 -1
  165. package/dist/esm/src/utils/secp256r1.js +54 -71
  166. package/dist/esm/src/utils/secp256r1.js.map +1 -1
  167. package/dist/esm/src/utils/time.js +5 -18
  168. package/dist/esm/src/utils/time.js.map +1 -1
  169. package/dist/esm/src/utils/url.js +3 -3
  170. package/dist/esm/src/utils/url.js.map +1 -1
  171. package/dist/esm/tests/core/auth.spec.js +3 -12
  172. package/dist/esm/tests/core/auth.spec.js.map +1 -1
  173. package/dist/esm/tests/core/message.spec.js +50 -59
  174. package/dist/esm/tests/core/message.spec.js.map +1 -1
  175. package/dist/esm/tests/core/protocol-authorization.spec.js +10 -18
  176. package/dist/esm/tests/core/protocol-authorization.spec.js.map +1 -1
  177. package/dist/esm/tests/dwn.spec.js +65 -89
  178. package/dist/esm/tests/dwn.spec.js.map +1 -1
  179. package/dist/esm/tests/event-emitter-event-log.spec.js +305 -0
  180. package/dist/esm/tests/event-emitter-event-log.spec.js.map +1 -0
  181. package/dist/esm/tests/features/author-delegated-grant.spec.js +337 -347
  182. package/dist/esm/tests/features/author-delegated-grant.spec.js.map +1 -1
  183. package/dist/esm/tests/features/owner-delegated-grant.spec.js +160 -172
  184. package/dist/esm/tests/features/owner-delegated-grant.spec.js.map +1 -1
  185. package/dist/esm/tests/features/owner-signature.spec.js +78 -82
  186. package/dist/esm/tests/features/owner-signature.spec.js.map +1 -1
  187. package/dist/esm/tests/features/permissions.spec.js +449 -184
  188. package/dist/esm/tests/features/permissions.spec.js.map +1 -1
  189. package/dist/esm/tests/features/protocol-composition.spec.js +981 -360
  190. package/dist/esm/tests/features/protocol-composition.spec.js.map +1 -1
  191. package/dist/esm/tests/features/protocol-create-action.spec.js +45 -54
  192. package/dist/esm/tests/features/protocol-create-action.spec.js.map +1 -1
  193. package/dist/esm/tests/features/protocol-delete-action.spec.js +99 -108
  194. package/dist/esm/tests/features/protocol-delete-action.spec.js.map +1 -1
  195. package/dist/esm/tests/features/protocol-update-action.spec.js +108 -117
  196. package/dist/esm/tests/features/protocol-update-action.spec.js.map +1 -1
  197. package/dist/esm/tests/features/records-immutable.spec.js +315 -0
  198. package/dist/esm/tests/features/records-immutable.spec.js.map +1 -0
  199. package/dist/esm/tests/features/records-prune.spec.js +178 -194
  200. package/dist/esm/tests/features/records-prune.spec.js.map +1 -1
  201. package/dist/esm/tests/features/records-record-limit.spec.js +542 -0
  202. package/dist/esm/tests/features/records-record-limit.spec.js.map +1 -0
  203. package/dist/esm/tests/features/records-tags.spec.js +456 -463
  204. package/dist/esm/tests/features/records-tags.spec.js.map +1 -1
  205. package/dist/esm/tests/features/resumable-tasks.spec.js +88 -98
  206. package/dist/esm/tests/features/resumable-tasks.spec.js.map +1 -1
  207. package/dist/esm/tests/handlers/messages-read.spec.js +215 -210
  208. package/dist/esm/tests/handlers/messages-read.spec.js.map +1 -1
  209. package/dist/esm/tests/handlers/messages-subscribe.spec.js +309 -171
  210. package/dist/esm/tests/handlers/messages-subscribe.spec.js.map +1 -1
  211. package/dist/esm/tests/handlers/messages-sync.spec.js +272 -199
  212. package/dist/esm/tests/handlers/messages-sync.spec.js.map +1 -1
  213. package/dist/esm/tests/handlers/protocols-configure.spec.js +247 -241
  214. package/dist/esm/tests/handlers/protocols-configure.spec.js.map +1 -1
  215. package/dist/esm/tests/handlers/protocols-query.spec.js +159 -172
  216. package/dist/esm/tests/handlers/protocols-query.spec.js.map +1 -1
  217. package/dist/esm/tests/handlers/records-count.spec.js +101 -105
  218. package/dist/esm/tests/handlers/records-count.spec.js.map +1 -1
  219. package/dist/esm/tests/handlers/records-delete.spec.js +266 -279
  220. package/dist/esm/tests/handlers/records-delete.spec.js.map +1 -1
  221. package/dist/esm/tests/handlers/records-query.spec.js +984 -996
  222. package/dist/esm/tests/handlers/records-query.spec.js.map +1 -1
  223. package/dist/esm/tests/handlers/records-read.spec.js +542 -671
  224. package/dist/esm/tests/handlers/records-read.spec.js.map +1 -1
  225. package/dist/esm/tests/handlers/records-subscribe.spec.js +433 -302
  226. package/dist/esm/tests/handlers/records-subscribe.spec.js.map +1 -1
  227. package/dist/esm/tests/handlers/records-write.spec.js +1216 -1140
  228. package/dist/esm/tests/handlers/records-write.spec.js.map +1 -1
  229. package/dist/esm/tests/interfaces/messages-get.spec.js +39 -48
  230. package/dist/esm/tests/interfaces/messages-get.spec.js.map +1 -1
  231. package/dist/esm/tests/interfaces/messages-subscribe.spec.js +4 -13
  232. package/dist/esm/tests/interfaces/messages-subscribe.spec.js.map +1 -1
  233. package/dist/esm/tests/interfaces/protocols-configure.spec.js +212 -88
  234. package/dist/esm/tests/interfaces/protocols-configure.spec.js.map +1 -1
  235. package/dist/esm/tests/interfaces/protocols-query.spec.js +8 -17
  236. package/dist/esm/tests/interfaces/protocols-query.spec.js.map +1 -1
  237. package/dist/esm/tests/interfaces/records-delete.spec.js +8 -17
  238. package/dist/esm/tests/interfaces/records-delete.spec.js.map +1 -1
  239. package/dist/esm/tests/interfaces/records-query.spec.js +20 -29
  240. package/dist/esm/tests/interfaces/records-query.spec.js.map +1 -1
  241. package/dist/esm/tests/interfaces/records-read.spec.js +42 -51
  242. package/dist/esm/tests/interfaces/records-read.spec.js.map +1 -1
  243. package/dist/esm/tests/interfaces/records-subscribe.spec.js +16 -25
  244. package/dist/esm/tests/interfaces/records-subscribe.spec.js.map +1 -1
  245. package/dist/esm/tests/interfaces/records-write.spec.js +190 -219
  246. package/dist/esm/tests/interfaces/records-write.spec.js.map +1 -1
  247. package/dist/esm/tests/jose/jws/general.spec.js +36 -45
  248. package/dist/esm/tests/jose/jws/general.spec.js.map +1 -1
  249. package/dist/esm/tests/protocols/permission-grant.spec.js +44 -50
  250. package/dist/esm/tests/protocols/permission-grant.spec.js.map +1 -1
  251. package/dist/esm/tests/protocols/permission-request.spec.js +23 -32
  252. package/dist/esm/tests/protocols/permission-request.spec.js.map +1 -1
  253. package/dist/esm/tests/protocols/permissions.spec.js +49 -55
  254. package/dist/esm/tests/protocols/permissions.spec.js.map +1 -1
  255. package/dist/esm/tests/scenarios/aggregator.spec.js +127 -138
  256. package/dist/esm/tests/scenarios/aggregator.spec.js.map +1 -1
  257. package/dist/esm/tests/scenarios/deleted-record.spec.js +372 -36
  258. package/dist/esm/tests/scenarios/deleted-record.spec.js.map +1 -1
  259. package/dist/esm/tests/scenarios/end-to-end-tests.spec.js +55 -64
  260. package/dist/esm/tests/scenarios/end-to-end-tests.spec.js.map +1 -1
  261. package/dist/esm/tests/scenarios/nested-roles.spec.js +66 -76
  262. package/dist/esm/tests/scenarios/nested-roles.spec.js.map +1 -1
  263. package/dist/esm/tests/scenarios/subscriptions.spec.js +451 -354
  264. package/dist/esm/tests/scenarios/subscriptions.spec.js.map +1 -1
  265. package/dist/esm/tests/smt/smt-store-level.spec.js +76 -87
  266. package/dist/esm/tests/smt/smt-store-level.spec.js.map +1 -1
  267. package/dist/esm/tests/smt/sparse-merkle-tree.spec.js +344 -353
  268. package/dist/esm/tests/smt/sparse-merkle-tree.spec.js.map +1 -1
  269. package/dist/esm/tests/state-index/state-index-level.spec.js +117 -126
  270. package/dist/esm/tests/state-index/state-index-level.spec.js.map +1 -1
  271. package/dist/esm/tests/store/blockstore-level.spec.js +44 -99
  272. package/dist/esm/tests/store/blockstore-level.spec.js.map +1 -1
  273. package/dist/esm/tests/store/blockstore-mock.spec.js +40 -120
  274. package/dist/esm/tests/store/blockstore-mock.spec.js.map +1 -1
  275. package/dist/esm/tests/store/data-store-level.spec.js +160 -108
  276. package/dist/esm/tests/store/data-store-level.spec.js.map +1 -1
  277. package/dist/esm/tests/store/index-level.spec.js +404 -414
  278. package/dist/esm/tests/store/index-level.spec.js.map +1 -1
  279. package/dist/esm/tests/store/message-store-level.spec.js +13 -22
  280. package/dist/esm/tests/store/message-store-level.spec.js.map +1 -1
  281. package/dist/esm/tests/store/message-store.spec.js +229 -238
  282. package/dist/esm/tests/store/message-store.spec.js.map +1 -1
  283. package/dist/esm/tests/test-event-stream.js +12 -13
  284. package/dist/esm/tests/test-event-stream.js.map +1 -1
  285. package/dist/esm/tests/test-stores.js +16 -13
  286. package/dist/esm/tests/test-stores.js.map +1 -1
  287. package/dist/esm/tests/test-suite.js +8 -15
  288. package/dist/esm/tests/test-suite.js.map +1 -1
  289. package/dist/esm/tests/utils/cid.spec.js +24 -33
  290. package/dist/esm/tests/utils/cid.spec.js.map +1 -1
  291. package/dist/esm/tests/utils/data-stream.spec.js +48 -57
  292. package/dist/esm/tests/utils/data-stream.spec.js.map +1 -1
  293. package/dist/esm/tests/utils/encryption-callbacks.spec.js +45 -54
  294. package/dist/esm/tests/utils/encryption-callbacks.spec.js.map +1 -1
  295. package/dist/esm/tests/utils/encryption.spec.js +229 -82
  296. package/dist/esm/tests/utils/encryption.spec.js.map +1 -1
  297. package/dist/esm/tests/utils/filters.spec.js +46 -55
  298. package/dist/esm/tests/utils/filters.spec.js.map +1 -1
  299. package/dist/esm/tests/utils/hd-key.spec.js +10 -19
  300. package/dist/esm/tests/utils/hd-key.spec.js.map +1 -1
  301. package/dist/esm/tests/utils/jws.spec.js +3 -12
  302. package/dist/esm/tests/utils/jws.spec.js.map +1 -1
  303. package/dist/esm/tests/utils/memory-cache.spec.js +9 -18
  304. package/dist/esm/tests/utils/memory-cache.spec.js.map +1 -1
  305. package/dist/esm/tests/utils/messages.spec.js +18 -20
  306. package/dist/esm/tests/utils/messages.spec.js.map +1 -1
  307. package/dist/esm/tests/utils/poller.js +22 -33
  308. package/dist/esm/tests/utils/poller.js.map +1 -1
  309. package/dist/esm/tests/utils/private-key-signer.spec.js +15 -24
  310. package/dist/esm/tests/utils/private-key-signer.spec.js.map +1 -1
  311. package/dist/esm/tests/utils/records.spec.js +14 -27
  312. package/dist/esm/tests/utils/records.spec.js.map +1 -1
  313. package/dist/esm/tests/utils/secp256k1.spec.js +16 -25
  314. package/dist/esm/tests/utils/secp256k1.spec.js.map +1 -1
  315. package/dist/esm/tests/utils/secp256r1.spec.js +18 -27
  316. package/dist/esm/tests/utils/secp256r1.spec.js.map +1 -1
  317. package/dist/esm/tests/utils/test-data-generator.js +446 -467
  318. package/dist/esm/tests/utils/test-data-generator.js.map +1 -1
  319. package/dist/esm/tests/validation/json-schemas/definitions.spec.js +2 -11
  320. package/dist/esm/tests/validation/json-schemas/definitions.spec.js.map +1 -1
  321. package/dist/esm/tests/validation/json-schemas/jwk/general-jwk.spec.js +4 -13
  322. package/dist/esm/tests/validation/json-schemas/jwk/general-jwk.spec.js.map +1 -1
  323. package/dist/esm/tests/validation/json-schemas/jwk/public-jwk.spec.js +8 -17
  324. package/dist/esm/tests/validation/json-schemas/jwk/public-jwk.spec.js.map +1 -1
  325. package/dist/esm/tests/validation/json-schemas/jwk-verification-method.spec.js +3 -12
  326. package/dist/esm/tests/validation/json-schemas/jwk-verification-method.spec.js.map +1 -1
  327. package/dist/esm/tests/validation/json-schemas/protocols/protocols-configure.spec.js +4 -13
  328. package/dist/esm/tests/validation/json-schemas/protocols/protocols-configure.spec.js.map +1 -1
  329. package/dist/esm/tests/validation/json-schemas/records/records-query.spec.js +2 -11
  330. package/dist/esm/tests/validation/json-schemas/records/records-query.spec.js.map +1 -1
  331. package/dist/esm/tests/validation/json-schemas/records/records-read.spec.js +2 -11
  332. package/dist/esm/tests/validation/json-schemas/records/records-read.spec.js.map +1 -1
  333. package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js +44 -24
  334. package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js.map +1 -1
  335. package/dist/types/generated/precompiled-validators.d.ts +49 -40
  336. package/dist/types/generated/precompiled-validators.d.ts.map +1 -1
  337. package/dist/types/src/core/constants.d.ts +11 -0
  338. package/dist/types/src/core/constants.d.ts.map +1 -0
  339. package/dist/types/src/core/core-protocol.d.ts +89 -0
  340. package/dist/types/src/core/core-protocol.d.ts.map +1 -0
  341. package/dist/types/src/core/dwn-error.d.ts +9 -12
  342. package/dist/types/src/core/dwn-error.d.ts.map +1 -1
  343. package/dist/types/src/core/grant-authorization.d.ts +6 -2
  344. package/dist/types/src/core/grant-authorization.d.ts.map +1 -1
  345. package/dist/types/src/core/protocol-authorization-action.d.ts +42 -0
  346. package/dist/types/src/core/protocol-authorization-action.d.ts.map +1 -0
  347. package/dist/types/src/core/protocol-authorization-validation.d.ts +81 -0
  348. package/dist/types/src/core/protocol-authorization-validation.d.ts.map +1 -0
  349. package/dist/types/src/core/protocol-authorization.d.ts +24 -106
  350. package/dist/types/src/core/protocol-authorization.d.ts.map +1 -1
  351. package/dist/types/src/core/record-chain.d.ts +24 -0
  352. package/dist/types/src/core/record-chain.d.ts.map +1 -0
  353. package/dist/types/src/core/records-grant-authorization.d.ts.map +1 -1
  354. package/dist/types/src/dwn.d.ts +19 -7
  355. package/dist/types/src/dwn.d.ts.map +1 -1
  356. package/dist/types/src/event-stream/event-emitter-event-log.d.ts +50 -0
  357. package/dist/types/src/event-stream/event-emitter-event-log.d.ts.map +1 -0
  358. package/dist/types/src/handlers/messages-read.d.ts +3 -8
  359. package/dist/types/src/handlers/messages-read.d.ts.map +1 -1
  360. package/dist/types/src/handlers/messages-subscribe.d.ts +6 -10
  361. package/dist/types/src/handlers/messages-subscribe.d.ts.map +1 -1
  362. package/dist/types/src/handlers/messages-sync.d.ts +3 -8
  363. package/dist/types/src/handlers/messages-sync.d.ts.map +1 -1
  364. package/dist/types/src/handlers/protocols-configure.d.ts +3 -10
  365. package/dist/types/src/handlers/protocols-configure.d.ts.map +1 -1
  366. package/dist/types/src/handlers/protocols-query.d.ts +3 -8
  367. package/dist/types/src/handlers/protocols-query.d.ts.map +1 -1
  368. package/dist/types/src/handlers/records-count.d.ts +3 -6
  369. package/dist/types/src/handlers/records-count.d.ts.map +1 -1
  370. package/dist/types/src/handlers/records-delete.d.ts +3 -8
  371. package/dist/types/src/handlers/records-delete.d.ts.map +1 -1
  372. package/dist/types/src/handlers/records-query.d.ts +3 -8
  373. package/dist/types/src/handlers/records-query.d.ts.map +1 -1
  374. package/dist/types/src/handlers/records-read.d.ts +3 -8
  375. package/dist/types/src/handlers/records-read.d.ts.map +1 -1
  376. package/dist/types/src/handlers/records-subscribe.d.ts +8 -10
  377. package/dist/types/src/handlers/records-subscribe.d.ts.map +1 -1
  378. package/dist/types/src/handlers/records-write.d.ts +4 -24
  379. package/dist/types/src/handlers/records-write.d.ts.map +1 -1
  380. package/dist/types/src/index.d.ts +8 -4
  381. package/dist/types/src/index.d.ts.map +1 -1
  382. package/dist/types/src/interfaces/messages-subscribe.d.ts +5 -0
  383. package/dist/types/src/interfaces/messages-subscribe.d.ts.map +1 -1
  384. package/dist/types/src/interfaces/protocols-configure.d.ts.map +1 -1
  385. package/dist/types/src/interfaces/records-subscribe.d.ts +5 -0
  386. package/dist/types/src/interfaces/records-subscribe.d.ts.map +1 -1
  387. package/dist/types/src/interfaces/records-write-query.d.ts +33 -0
  388. package/dist/types/src/interfaces/records-write-query.d.ts.map +1 -0
  389. package/dist/types/src/interfaces/records-write-signing.d.ts +34 -0
  390. package/dist/types/src/interfaces/records-write-signing.d.ts.map +1 -0
  391. package/dist/types/src/interfaces/records-write.d.ts +13 -53
  392. package/dist/types/src/interfaces/records-write.d.ts.map +1 -1
  393. package/dist/types/src/protocols/permission-grant.d.ts +1 -1
  394. package/dist/types/src/protocols/permission-grant.d.ts.map +1 -1
  395. package/dist/types/src/protocols/permission-request.d.ts +1 -1
  396. package/dist/types/src/protocols/permission-request.d.ts.map +1 -1
  397. package/dist/types/src/protocols/permissions.d.ts +40 -3
  398. package/dist/types/src/protocols/permissions.d.ts.map +1 -1
  399. package/dist/types/src/state-index/state-index-level.d.ts.map +1 -1
  400. package/dist/types/src/store/data-store-level.d.ts +20 -4
  401. package/dist/types/src/store/data-store-level.d.ts.map +1 -1
  402. package/dist/types/src/store/index-level-compound.d.ts +70 -0
  403. package/dist/types/src/store/index-level-compound.d.ts.map +1 -0
  404. package/dist/types/src/store/index-level.d.ts +4 -58
  405. package/dist/types/src/store/index-level.d.ts.map +1 -1
  406. package/dist/types/src/store/storage-controller.d.ts +4 -4
  407. package/dist/types/src/store/storage-controller.d.ts.map +1 -1
  408. package/dist/types/src/types/message-types.d.ts +3 -3
  409. package/dist/types/src/types/message-types.d.ts.map +1 -1
  410. package/dist/types/src/types/messages-types.d.ts +12 -3
  411. package/dist/types/src/types/messages-types.d.ts.map +1 -1
  412. package/dist/types/src/types/method-handler.d.ts +24 -3
  413. package/dist/types/src/types/method-handler.d.ts.map +1 -1
  414. package/dist/types/src/types/permission-types.d.ts +7 -0
  415. package/dist/types/src/types/permission-types.d.ts.map +1 -1
  416. package/dist/types/src/types/protocols-types.d.ts +41 -1
  417. package/dist/types/src/types/protocols-types.d.ts.map +1 -1
  418. package/dist/types/src/types/records-types.d.ts +16 -6
  419. package/dist/types/src/types/records-types.d.ts.map +1 -1
  420. package/dist/types/src/types/subscriptions.d.ts +151 -13
  421. package/dist/types/src/types/subscriptions.d.ts.map +1 -1
  422. package/dist/types/src/utils/hd-key.d.ts +1 -9
  423. package/dist/types/src/utils/hd-key.d.ts.map +1 -1
  424. package/dist/types/src/utils/messages.d.ts +7 -5
  425. package/dist/types/src/utils/messages.d.ts.map +1 -1
  426. package/dist/types/src/utils/protocols.d.ts +5 -0
  427. package/dist/types/src/utils/protocols.d.ts.map +1 -1
  428. package/dist/types/src/utils/records.d.ts +1 -11
  429. package/dist/types/src/utils/records.d.ts.map +1 -1
  430. package/dist/types/tests/dwn.spec.d.ts.map +1 -1
  431. package/dist/types/tests/event-emitter-event-log.spec.d.ts +2 -0
  432. package/dist/types/tests/event-emitter-event-log.spec.d.ts.map +1 -0
  433. package/dist/types/tests/features/author-delegated-grant.spec.d.ts.map +1 -1
  434. package/dist/types/tests/features/owner-delegated-grant.spec.d.ts.map +1 -1
  435. package/dist/types/tests/features/owner-signature.spec.d.ts.map +1 -1
  436. package/dist/types/tests/features/permissions.spec.d.ts.map +1 -1
  437. package/dist/types/tests/features/protocol-composition.spec.d.ts.map +1 -1
  438. package/dist/types/tests/features/records-immutable.spec.d.ts +2 -0
  439. package/dist/types/tests/features/records-immutable.spec.d.ts.map +1 -0
  440. package/dist/types/tests/features/records-record-limit.spec.d.ts +2 -0
  441. package/dist/types/tests/features/records-record-limit.spec.d.ts.map +1 -0
  442. package/dist/types/tests/features/records-tags.spec.d.ts.map +1 -1
  443. package/dist/types/tests/features/resumable-tasks.spec.d.ts.map +1 -1
  444. package/dist/types/tests/handlers/messages-read.spec.d.ts.map +1 -1
  445. package/dist/types/tests/handlers/messages-subscribe.spec.d.ts.map +1 -1
  446. package/dist/types/tests/handlers/messages-sync.spec.d.ts.map +1 -1
  447. package/dist/types/tests/handlers/records-count.spec.d.ts.map +1 -1
  448. package/dist/types/tests/handlers/records-delete.spec.d.ts.map +1 -1
  449. package/dist/types/tests/handlers/records-query.spec.d.ts.map +1 -1
  450. package/dist/types/tests/handlers/records-read.spec.d.ts.map +1 -1
  451. package/dist/types/tests/handlers/records-subscribe.spec.d.ts.map +1 -1
  452. package/dist/types/tests/handlers/records-write.spec.d.ts.map +1 -1
  453. package/dist/types/tests/scenarios/deleted-record.spec.d.ts.map +1 -1
  454. package/dist/types/tests/scenarios/subscriptions.spec.d.ts.map +1 -1
  455. package/dist/types/tests/test-event-stream.d.ts +11 -12
  456. package/dist/types/tests/test-event-stream.d.ts.map +1 -1
  457. package/dist/types/tests/test-suite.d.ts +2 -2
  458. package/dist/types/tests/test-suite.d.ts.map +1 -1
  459. package/dist/types/tests/utils/test-data-generator.d.ts +18 -0
  460. package/dist/types/tests/utils/test-data-generator.d.ts.map +1 -1
  461. package/package.json +5 -4
  462. package/src/core/constants.ts +11 -0
  463. package/src/core/core-protocol.ts +129 -0
  464. package/src/core/dwn-error.ts +15 -12
  465. package/src/core/grant-authorization.ts +20 -3
  466. package/src/core/protocol-authorization-action.ts +377 -0
  467. package/src/core/protocol-authorization-validation.ts +487 -0
  468. package/src/core/protocol-authorization.ts +111 -856
  469. package/src/core/record-chain.ts +99 -0
  470. package/src/core/records-grant-authorization.ts +6 -8
  471. package/src/dwn.ts +58 -73
  472. package/src/event-stream/event-emitter-event-log.ts +283 -0
  473. package/src/handlers/messages-read.ts +8 -9
  474. package/src/handlers/messages-subscribe.ts +24 -28
  475. package/src/handlers/messages-sync.ts +10 -16
  476. package/src/handlers/protocols-configure.ts +47 -32
  477. package/src/handlers/protocols-query.ts +6 -9
  478. package/src/handlers/records-count.ts +11 -10
  479. package/src/handlers/records-delete.ts +12 -21
  480. package/src/handlers/records-query.ts +12 -12
  481. package/src/handlers/records-read.ts +34 -22
  482. package/src/handlers/records-subscribe.ts +47 -26
  483. package/src/handlers/records-write.ts +47 -104
  484. package/src/index.ts +9 -5
  485. package/src/interfaces/messages-subscribe.ts +7 -1
  486. package/src/interfaces/protocols-configure.ts +73 -8
  487. package/src/interfaces/records-count.ts +1 -1
  488. package/src/interfaces/records-delete.ts +1 -1
  489. package/src/interfaces/records-query.ts +1 -1
  490. package/src/interfaces/records-read.ts +1 -1
  491. package/src/interfaces/records-subscribe.ts +8 -1
  492. package/src/interfaces/records-write-query.ts +139 -0
  493. package/src/interfaces/records-write-signing.ts +123 -0
  494. package/src/interfaces/records-write.ts +66 -261
  495. package/src/protocols/permission-grant.ts +1 -1
  496. package/src/protocols/permission-request.ts +1 -1
  497. package/src/protocols/permissions.ts +148 -6
  498. package/src/state-index/state-index-level.ts +5 -7
  499. package/src/store/data-store-level.ts +124 -34
  500. package/src/store/index-level-compound.ts +324 -0
  501. package/src/store/index-level.ts +68 -341
  502. package/src/store/storage-controller.ts +11 -11
  503. package/src/types/message-types.ts +3 -3
  504. package/src/types/messages-types.ts +12 -3
  505. package/src/types/method-handler.ts +26 -4
  506. package/src/types/mitt.d.ts +28 -0
  507. package/src/types/permission-types.ts +7 -0
  508. package/src/types/protocols-types.ts +46 -0
  509. package/src/types/records-types.ts +16 -6
  510. package/src/types/subscriptions.ts +178 -14
  511. package/src/utils/hd-key.ts +0 -9
  512. package/src/utils/messages.ts +17 -37
  513. package/src/utils/protocols.ts +8 -0
  514. package/src/utils/records.ts +8 -59
  515. package/dist/esm/src/event-stream/event-emitter-stream.js +0 -60
  516. package/dist/esm/src/event-stream/event-emitter-stream.js.map +0 -1
  517. package/dist/esm/tests/event-stream/event-emitter-stream.spec.js +0 -77
  518. package/dist/esm/tests/event-stream/event-emitter-stream.spec.js.map +0 -1
  519. package/dist/esm/tests/event-stream/event-stream.spec.js +0 -123
  520. package/dist/esm/tests/event-stream/event-stream.spec.js.map +0 -1
  521. package/dist/types/src/event-stream/event-emitter-stream.d.ts +0 -23
  522. package/dist/types/src/event-stream/event-emitter-stream.d.ts.map +0 -1
  523. package/dist/types/tests/event-stream/event-emitter-stream.spec.d.ts +0 -2
  524. package/dist/types/tests/event-stream/event-emitter-stream.spec.d.ts.map +0 -1
  525. package/dist/types/tests/event-stream/event-stream.spec.d.ts +0 -2
  526. package/dist/types/tests/event-stream/event-stream.spec.d.ts.map +0 -1
  527. package/src/event-stream/event-emitter-stream.ts +0 -69
@@ -154,6 +154,36 @@ export type ProtocolSizeDefinition = {
154
154
  max?: number;
155
155
  };
156
156
 
157
+ /**
158
+ * Supported strategies for handling writes that would exceed a `$recordLimit`.
159
+ */
160
+ export enum ProtocolRecordLimitStrategy {
161
+ /** Reject the incoming write with an error. The author must delete old records first. */
162
+ Reject = 'reject',
163
+ /** Automatically delete the oldest record(s) (by `dateCreated`) to make room for the new one. */
164
+ PurgeOldest = 'purgeOldest',
165
+ }
166
+
167
+ /**
168
+ * Limits the number of records at a given protocol path within the same parent context.
169
+ *
170
+ * For root-level records, the count is across the entire protocol for the tenant.
171
+ * For nested records, the count is scoped to the parent record's context.
172
+ *
173
+ * Only initial writes (new records) count toward the limit; updates to existing records do not.
174
+ */
175
+ export type ProtocolRecordLimitDefinition = {
176
+ /** Maximum number of records allowed at this path within the same parent context. Must be >= 1. */
177
+ max: number;
178
+
179
+ /**
180
+ * Strategy when the limit is reached.
181
+ * Currently only `'reject'` is implemented. Future strategies (e.g. `'purgeOldest'`)
182
+ * are defined in the wire format but not yet enforced.
183
+ */
184
+ strategy: ProtocolRecordLimitStrategy | `${ProtocolRecordLimitStrategy}` | (string & {});
185
+ };
186
+
157
187
  /**
158
188
  * Tag rules for records at a given protocol path. Each non-`$`-prefixed property
159
189
  * is a JSON Schema object constraining that tag's value.
@@ -201,6 +231,7 @@ type ProtocolRuleSetValue =
201
231
  | ProtocolPathEncryption
202
232
  | ProtocolTagsDefinition
203
233
  | ProtocolSizeDefinition
234
+ | ProtocolRecordLimitDefinition
204
235
  | boolean
205
236
  | string
206
237
  | undefined;
@@ -247,6 +278,21 @@ export type ProtocolRuleSet = {
247
278
  */
248
279
  $tags?: ProtocolTagsDefinition;
249
280
 
281
+ /**
282
+ * If $recordLimit is set, the number of records at this protocol path within the same
283
+ * parent context is constrained. When the limit is reached, the `strategy` determines
284
+ * whether the write is rejected or the oldest record is purged.
285
+ */
286
+ $recordLimit?: ProtocolRecordLimitDefinition;
287
+
288
+ /**
289
+ * If `$immutable` is `true`, records at this protocol path are write-once: they can be
290
+ * created but never updated after the initial write. `RecordsDelete` is still governed
291
+ * by `$actions` — immutability means the record's data cannot change, not that it
292
+ * cannot be removed.
293
+ */
294
+ $immutable?: boolean;
295
+
250
296
  /**
251
297
  * Non-`$`-prefixed keys are nested child `ProtocolRuleSet` entries.
252
298
  * At runtime, JSON Schema validation ensures only valid child rule sets appear here.
@@ -1,5 +1,6 @@
1
1
  import type { GeneralJws } from './jws-types.js';
2
2
  import type { JweEncryption } from '../utils/encryption.js';
3
+ import type { SubscriptionListener } from './subscriptions.js';
3
4
  import type { AuthorizationModel, GenericMessage, GenericMessageReply, GenericSignaturePayload, MessageSubscription, Pagination } from './message-types.js';
4
5
  import type { DwnInterfaceName, DwnMethodName } from '../enums/dwn-interface-method.js';
5
6
  import type { PaginationCursor, RangeCriterion, RangeFilter, StartsWithFilter } from './query-types.js';
@@ -23,8 +24,8 @@ export type RecordsWriteTagsFilter = StartsWithFilter | RangeFilter | string | n
23
24
  export type RecordsWriteDescriptor = {
24
25
  interface: DwnInterfaceName.Records;
25
26
  method: DwnMethodName.Write;
26
- protocol?: string;
27
- protocolPath?: string;
27
+ protocol: string;
28
+ protocolPath: string;
28
29
  recipient?: string;
29
30
  schema?: string;
30
31
  tags?: RecordsWriteTags;
@@ -57,7 +58,7 @@ export type InternalRecordsWriteMessage = GenericMessage & {
57
58
  export type RecordsWriteMessage = {
58
59
  authorization: AuthorizationModel; // overriding `GenericMessage` with `authorization` being required
59
60
  recordId: string,
60
- contextId?: string;
61
+ contextId: string;
61
62
  descriptor: RecordsWriteDescriptor;
62
63
  attestation?: GeneralJws;
63
64
  encryption?: JweEncryption;
@@ -122,6 +123,12 @@ export type RecordsSubscribeDescriptor = {
122
123
  filter: RecordsFilter;
123
124
  dateSort?: DateSort;
124
125
  pagination?: Pagination;
126
+ /**
127
+ * Opaque EventLog cursor string to resume from. When provided, the handler replays
128
+ * events from the EventLog starting after this cursor instead of querying the
129
+ * MessageStore for an initial snapshot. An EOSE marker is sent after catch-up.
130
+ */
131
+ cursor?: string;
125
132
  };
126
133
 
127
134
  export type RecordsFilter = {
@@ -157,7 +164,7 @@ export type RecordsWriteAttestationPayload = {
157
164
 
158
165
  export type RecordsWriteSignaturePayload = GenericSignaturePayload & {
159
166
  recordId: string;
160
- contextId?: string;
167
+ contextId: string;
161
168
  attestationCid?: string;
162
169
  encryptionCid?: string;
163
170
  };
@@ -176,10 +183,13 @@ export type RecordEvent = {
176
183
  initialWrite?: RecordsWriteMessage;
177
184
  };
178
185
 
179
- export type RecordSubscriptionHandler = (event: RecordEvent) => void;
186
+ /**
187
+ * @deprecated Use {@link SubscriptionListener} directly. Retained as an alias for migration.
188
+ */
189
+ export type RecordSubscriptionHandler = SubscriptionListener;
180
190
 
181
191
  export type RecordsSubscribeMessageOptions = {
182
- subscriptionHandler: RecordSubscriptionHandler;
192
+ subscriptionHandler: SubscriptionListener;
183
193
  };
184
194
 
185
195
  export type RecordsSubscribeMessage = GenericMessage & {
@@ -1,9 +1,13 @@
1
- import type { GenericMessageReply } from '../types/message-types.js';
2
- import type { KeyValues } from './query-types.js';
3
1
  import type { RecordsWriteMessage } from './records-types.js';
4
- import type { GenericMessage, MessageSubscription } from './message-types.js';
2
+ import type { Filter, KeyValues } from './query-types.js';
3
+ import type { GenericMessage, GenericMessageReply, MessageSubscription } from './message-types.js';
5
4
 
6
- export type EventListener = (tenant: string, event: MessageEvent, indexes: KeyValues) => void;
5
+ /**
6
+ * Internal listener type used by {@link EventLog.emit} to notify in-process
7
+ * subscribers. Not intended for direct consumer use — consumers should use
8
+ * {@link SubscriptionListener} via {@link EventLog.subscribe}.
9
+ */
10
+ export type EventListener = (tenant: string, event: MessageEvent, indexes: KeyValues, seq: number) => void;
7
11
 
8
12
  /**
9
13
  * MessageEvent contains the message being emitted and an optional initial write message.
@@ -14,16 +18,6 @@ export type MessageEvent = {
14
18
  initialWrite?: RecordsWriteMessage
15
19
  };
16
20
 
17
- /**
18
- * The EventStream interface implements a pub/sub system based on Message filters.
19
- */
20
- export interface EventStream {
21
- subscribe(tenant: string, id: string, listener: EventListener): Promise<EventSubscription>;
22
- emit(tenant: string, event: MessageEvent, indexes: KeyValues): void;
23
- open(): Promise<void>;
24
- close(): Promise<void>;
25
- }
26
-
27
21
  export interface EventSubscription {
28
22
  id: string;
29
23
  close: () => Promise<void>;
@@ -32,3 +26,173 @@ export interface EventSubscription {
32
26
  export type SubscriptionReply = GenericMessageReply & {
33
27
  subscription?: MessageSubscription;
34
28
  };
29
+
30
+ // ---------------------------------------------------------------------------
31
+ // Subscription events — discriminated union for event + EOSE delivery
32
+ // ---------------------------------------------------------------------------
33
+
34
+ /**
35
+ * A regular subscription event carrying a message and its EventLog cursor.
36
+ */
37
+ export type SubscriptionEvent = {
38
+ type : 'event';
39
+ /**
40
+ * Opaque cursor string assigned by the EventLog implementation. Clients should
41
+ * persist this value and pass it back to `subscribe()` or `read()` to resume
42
+ * from this point. The format is implementation-defined (e.g. numeric sequence
43
+ * for in-memory, Redis stream ID, NATS stream sequence, etc.).
44
+ */
45
+ cursor : string;
46
+ /** The event payload (message + optional initialWrite). */
47
+ event : MessageEvent;
48
+ };
49
+
50
+ /**
51
+ * End-of-Stored-Events marker. Sent after all catch-up events have been replayed
52
+ * from the EventLog. After EOSE, all subsequent events are live.
53
+ *
54
+ * Only delivered when a subscription is created with a `cursor`. Subscriptions
55
+ * without a cursor never receive EOSE.
56
+ */
57
+ export type SubscriptionEose = {
58
+ type : 'eose';
59
+ /**
60
+ * Opaque cursor string of the last stored event that was replayed.
61
+ * Echoes the input cursor when no stored events matched (i.e. already caught up).
62
+ */
63
+ cursor : string;
64
+ };
65
+
66
+ /**
67
+ * Discriminated union of subscription event types delivered to
68
+ * {@link SubscriptionListener} callbacks.
69
+ */
70
+ export type SubscriptionMessage = SubscriptionEvent | SubscriptionEose;
71
+
72
+ /**
73
+ * Callback for {@link EventLog.subscribe}. Receives either a regular event
74
+ * (with cursor) or an EOSE marker indicating catch-up replay is complete.
75
+ */
76
+ export type SubscriptionListener = (message: SubscriptionMessage) => void;
77
+
78
+ /**
79
+ * Options for {@link EventLog.subscribe}.
80
+ */
81
+ export type EventLogSubscribeOptions = {
82
+ /**
83
+ * Opaque cursor string to resume from (exclusive — events after this cursor
84
+ * are replayed). When provided, stored events are replayed first, followed by
85
+ * an EOSE marker, then live events. When omitted, only live events are delivered.
86
+ *
87
+ * Cursor values are implementation-defined and must be obtained from a prior
88
+ * interaction with the same EventLog instance (e.g. `SubscriptionEvent.cursor`,
89
+ * `EventLogReadResult.cursor`, or the return value of `emit()`).
90
+ */
91
+ cursor? : string;
92
+
93
+ /**
94
+ * Filters evaluated against event indexes. Events must match at least one
95
+ * filter (OR semantics). When omitted, all events are delivered.
96
+ */
97
+ filters? : Filter[];
98
+ };
99
+
100
+ // ---------------------------------------------------------------------------
101
+ // EventLog — persistent, cursor-based event delivery
102
+ // ---------------------------------------------------------------------------
103
+
104
+ /**
105
+ * A single entry returned by {@link EventLog.read}.
106
+ */
107
+ export type EventLogEntry = {
108
+ /** Monotonic sequence number scoped to (instance, tenant). */
109
+ seq: number;
110
+
111
+ /** The event payload. */
112
+ event: MessageEvent;
113
+
114
+ /** Indexes associated with the event (used for filter matching). */
115
+ indexes: KeyValues;
116
+ };
117
+
118
+ /**
119
+ * Options accepted by {@link EventLog.read}.
120
+ */
121
+ export type EventLogReadOptions = {
122
+ /** Opaque cursor string to resume from (exclusive — returns events after this cursor). */
123
+ cursor? : string;
124
+
125
+ /** Maximum number of events to return. */
126
+ limit? : number;
127
+
128
+ /** Optional filters evaluated server-side. Events must match at least one filter (OR semantics). */
129
+ filters?: Filter[];
130
+ };
131
+
132
+ /**
133
+ * Result returned by {@link EventLog.read}.
134
+ */
135
+ export type EventLogReadResult = {
136
+ /** Events matching the read request, ordered by ascending seq. */
137
+ events : EventLogEntry[];
138
+
139
+ /**
140
+ * Opaque cursor string for resuming subsequent reads or subscriptions.
141
+ *
142
+ * - When events are returned: cursor of the last event.
143
+ * - When no events are returned but a cursor was provided: the input cursor
144
+ * (meaning "you are caught up, nothing new since this point").
145
+ * - When no events exist and no cursor was provided: `undefined`.
146
+ */
147
+ cursor? : string;
148
+ };
149
+
150
+ /**
151
+ * The EventLog interface provides persistent, ordered event storage with
152
+ * cursor-based reads and subscription support.
153
+ *
154
+ * It persists events before delivery, exposing opaque cursor strings
155
+ * that enable cursor-based resume after disconnects.
156
+ *
157
+ * The interface is intentionally transport-agnostic — implementations can be
158
+ * backed by LevelDB (embedded), SQL, NATS JetStream, Redis Streams, etc.
159
+ * Each implementation owns the catch-up + live transition strategy appropriate
160
+ * to its backend (e.g., NATS pull consumers, Redis XREAD, in-memory buffering).
161
+ */
162
+ export interface EventLog {
163
+ /**
164
+ * Persist an event and notify in-process subscribers.
165
+ * @returns The opaque cursor string assigned to the event, or empty string on failure.
166
+ */
167
+ emit(tenant: string, event: MessageEvent, indexes: KeyValues): Promise<string>;
168
+
169
+ /**
170
+ * Read events from the log starting after `cursor`, optionally filtered.
171
+ */
172
+ read(tenant: string, options?: EventLogReadOptions): Promise<EventLogReadResult>;
173
+
174
+ /**
175
+ * Subscribe to events for a tenant.
176
+ *
177
+ * When `options.cursor` is provided, the implementation replays stored events
178
+ * from that cursor through the listener, delivers an EOSE marker, then
179
+ * continues with live events. The catch-up → live transition (including
180
+ * buffering and deduplication) is owned by the implementation.
181
+ *
182
+ * When `options.cursor` is omitted, only live events are delivered.
183
+ *
184
+ * @param tenant The tenant DID to subscribe to.
185
+ * @param id A unique subscription identifier (used for close/tracking).
186
+ * @param listener Callback that receives {@link SubscriptionMessage} events.
187
+ * @param options Optional cursor and filters for catch-up replay.
188
+ */
189
+ subscribe(tenant: string, id: string, listener: SubscriptionListener, options?: EventLogSubscribeOptions): Promise<EventSubscription>;
190
+
191
+ /**
192
+ * Delete events older than the given sequence number or ISO-8601 timestamp.
193
+ */
194
+ trim(tenant: string, olderThan: number | string): Promise<void>;
195
+
196
+ open(): Promise<void>;
197
+ close(): Promise<void>;
198
+ }
@@ -6,17 +6,8 @@ import { X25519 } from '@enbox/crypto';
6
6
  import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
7
7
 
8
8
  export enum KeyDerivationScheme {
9
- /**
10
- * Key derivation using the `dataFormat` value for Flat-space records.
11
- */
12
- DataFormats = 'dataFormats',
13
9
  ProtocolContext = 'protocolContext',
14
10
  ProtocolPath = 'protocolPath',
15
-
16
- /**
17
- * Key derivation using the `schema` value for Flat-space records.
18
- */
19
- Schemas = 'schemas'
20
11
  }
21
12
 
22
13
  export type DerivedPrivateJwk = {
@@ -1,10 +1,9 @@
1
+ import type { CoreProtocolRegistry } from '../core/core-protocol.js';
1
2
  import type { Filter } from '../types/query-types.js';
2
3
  import type { MessagesFilter } from '../types/messages-types.js';
3
4
 
4
5
  import { FilterUtility } from './filter.js';
5
6
  import { normalizeProtocolUrl } from './url.js';
6
- import { PermissionsProtocol } from '../protocols/permissions.js';
7
- import { Records } from './records.js';
8
7
  import { isEmptyObject, removeUndefinedProperties } from './object.js';
9
8
 
10
9
 
@@ -42,25 +41,29 @@ export class Messages {
42
41
  /**
43
42
  * Converts an incoming array of MessagesFilter into an array of Filter usable by MessageLog.
44
43
  *
44
+ * When a `CoreProtocolRegistry` is provided, each registered core protocol's
45
+ * `constructAdditionalMessageFilter` hook is invoked per filter. This replaces the previous
46
+ * hardcoded permission-records shadow filter with a generic loop over all core protocols.
47
+ *
45
48
  * @param filters An array of MessagesFilter
49
+ * @param coreProtocols Optional registry of core protocols whose additional filters are injected.
46
50
  * @returns {Filter[]} an array of generic Filter able to be used when querying.
47
51
  */
48
- public static convertFilters(filters: MessagesFilter[]): Filter[] {
52
+ public static convertFilters(filters: MessagesFilter[], coreProtocols?: CoreProtocolRegistry): Filter[] {
49
53
 
50
54
  const messagesQueryFilters: Filter[] = [];
51
55
 
52
- // convert each filter individually by the specific type of filter it is
53
- // we must check for the type of filter in a specific order to make a reductive decision as to which filters need converting
54
- // first we check for `MessagesRecordsFilter` fields for conversion
55
- // otherwise it is `MessagesMessageFilter` fields for conversion
56
56
  for (const filter of filters) {
57
- // extract the protocol tag filter from the incoming message record filter
58
- // this filters for permission grants, requests and revocations associated with a targeted protocol
59
- // since permissions are their own protocol, we added an additional tag index when writing the permission messages
60
- // so that we can filter for permission records here
61
- const permissionRecordsFilter = this.constructPermissionRecordsFilter(filter);
62
- if (permissionRecordsFilter) {
63
- messagesQueryFilters.push(permissionRecordsFilter);
57
+ // Ask each core protocol whether it needs an additional shadow filter for this query.
58
+ // For example, the Permissions protocol injects a filter for grants/requests/revocations
59
+ // tagged with the target protocol so they appear alongside that protocol's own records.
60
+ if (coreProtocols !== undefined) {
61
+ for (const coreProtocol of coreProtocols.all()) {
62
+ const additionalFilter = coreProtocol.constructAdditionalMessageFilter?.(filter);
63
+ if (additionalFilter !== undefined) {
64
+ messagesQueryFilters.push(additionalFilter);
65
+ }
66
+ }
64
67
  }
65
68
 
66
69
  messagesQueryFilters.push(this.convertFilter(filter));
@@ -69,29 +72,6 @@ export class Messages {
69
72
  return messagesQueryFilters;
70
73
  }
71
74
 
72
- /**
73
- * Constructs a filter that gets associated permission records if protocol is in the given filter.
74
- */
75
- private static constructPermissionRecordsFilter(filter: MessagesFilter): Filter | undefined {
76
- const { protocol, messageTimestamp } = filter;
77
- if (protocol !== undefined) {
78
- const taggedFilter = {
79
- protocol: PermissionsProtocol.uri,
80
- ...Records.convertTagsFilter({ protocol })
81
- } as Filter;
82
-
83
- if (messageTimestamp != undefined) {
84
- // if we filter by message timestamp, we also want to filter the permission messages by the same timestamp range
85
- const messageTimestampFilter = FilterUtility.convertRangeCriterion(messageTimestamp);
86
- if (messageTimestampFilter) {
87
- taggedFilter.messageTimestamp = messageTimestampFilter;
88
- }
89
- }
90
-
91
- return taggedFilter;
92
- }
93
- }
94
-
95
75
  /**
96
76
  * Converts an external-facing filter model into an internal-facing filer model used by data store.
97
77
  */
@@ -44,6 +44,14 @@ export function isCrossProtocolRef(ref: string): boolean {
44
44
  return ref.includes(':');
45
45
  }
46
46
 
47
+ /**
48
+ * Extracts the last segment of a protocolPath — i.e. the type name.
49
+ * e.g. `'thread/comment'` → `'comment'`, `'note'` → `'note'`.
50
+ */
51
+ export function getTypeName(protocolPath: string): string {
52
+ return protocolPath.split('/').slice(-1)[0];
53
+ }
54
+
47
55
  /**
48
56
  * Gets the rule set at a given protocol path within a protocol definition's structure tree.
49
57
  * Returns `undefined` if the path does not exist.
@@ -139,32 +139,16 @@ export class Records {
139
139
  const contextId = recordsWriteMessage.contextId;
140
140
 
141
141
  let fullDerivationPath;
142
- if (keyDerivationScheme === KeyDerivationScheme.DataFormats) {
143
- fullDerivationPath = Records.constructKeyDerivationPathUsingDataFormatsScheme(descriptor.dataFormat);
144
- } else if (keyDerivationScheme === KeyDerivationScheme.ProtocolPath) {
142
+ if (keyDerivationScheme === KeyDerivationScheme.ProtocolPath) {
145
143
  fullDerivationPath = Records.constructKeyDerivationPathUsingProtocolPathScheme(descriptor);
146
- } else if (keyDerivationScheme === KeyDerivationScheme.ProtocolContext) {
147
- fullDerivationPath = Records.constructKeyDerivationPathUsingProtocolContextScheme(contextId);
148
144
  } else {
149
- // `schemas` scheme
150
- fullDerivationPath = Records.constructKeyDerivationPathUsingSchemasScheme(descriptor.schema);
145
+ // `protocolContext` scheme
146
+ fullDerivationPath = Records.constructKeyDerivationPathUsingProtocolContextScheme(contextId);
151
147
  }
152
148
 
153
149
  return fullDerivationPath;
154
150
  }
155
151
 
156
- /**
157
- * Constructs the full key derivation path using `dataFormats` scheme.
158
- * The derivation path is always `["dataFormats", "<mime-type>"]` regardless of whether
159
- * a schema is present. This matches the spec: keys are derived purely from the MIME type.
160
- */
161
- public static constructKeyDerivationPathUsingDataFormatsScheme(dataFormat: string): string[] {
162
- return [
163
- KeyDerivationScheme.DataFormats,
164
- dataFormat
165
- ];
166
- }
167
-
168
152
  /**
169
153
  * Constructs the full key derivation path using `protocolPath` scheme.
170
154
  *
@@ -174,16 +158,7 @@ export class Records {
174
158
  * its children (composing protocol) use different protocol URIs and thus different key trees.
175
159
  */
176
160
  public static constructKeyDerivationPathUsingProtocolPathScheme(descriptor: RecordsWriteDescriptor): string[] {
177
- // ensure `protocol` is defined
178
- // NOTE: no need to check `protocolPath` and `contextId` because earlier code ensures that if `protocol` is defined, those are defined also
179
- if (descriptor.protocol === undefined) {
180
- throw new DwnError(
181
- DwnErrorCode.RecordsProtocolPathDerivationSchemeMissingProtocol,
182
- 'Unable to construct key derivation path using `protocols` scheme because `protocol` is missing.'
183
- );
184
- }
185
-
186
- const protocolPathSegments = descriptor.protocolPath!.split('/');
161
+ const protocolPathSegments = descriptor.protocolPath.split('/');
187
162
  const fullDerivationPath = [
188
163
  KeyDerivationScheme.ProtocolPath,
189
164
  descriptor.protocol,
@@ -203,15 +178,8 @@ export class Records {
203
178
  * a shared context (e.g., thread participants can decrypt messages from both the threads protocol
204
179
  * and composing protocols that attach to those threads).
205
180
  */
206
- public static constructKeyDerivationPathUsingProtocolContextScheme(contextId: string | undefined): string[] {
207
- if (contextId === undefined) {
208
- throw new DwnError(
209
- DwnErrorCode.RecordsProtocolContextDerivationSchemeMissingContextId,
210
- 'Unable to construct key derivation path using `protocolContext` scheme because `contextId` is missing.'
211
- );
212
- }
213
-
214
- // TODO: issue #683 -Extend key derivation support to include the full contextId (https://github.com/enboxorg/enbox/issues/683)
181
+ public static constructKeyDerivationPathUsingProtocolContextScheme(contextId: string): string[] {
182
+ // TODO: Extend key derivation support to include the full contextId (https://github.com/enboxorg/enbox/issues/99)
215
183
  const firstContextSegment = contextId.split('/')[0];
216
184
 
217
185
  const fullDerivationPath = [
@@ -222,25 +190,6 @@ export class Records {
222
190
  return fullDerivationPath;
223
191
  }
224
192
 
225
- /**
226
- * Constructs the full key derivation path using `schemas` scheme.
227
- */
228
- public static constructKeyDerivationPathUsingSchemasScheme( schema: string | undefined ): string[] {
229
- if (schema === undefined) {
230
- throw new DwnError(
231
- DwnErrorCode.RecordsSchemasDerivationSchemeMissingSchema,
232
- 'Unable to construct key derivation path using `schemas` scheme because `schema` is missing.'
233
- );
234
- }
235
-
236
- const fullDerivationPath = [
237
- KeyDerivationScheme.Schemas,
238
- schema
239
- ];
240
-
241
- return fullDerivationPath;
242
- }
243
-
244
193
  /**
245
194
  * Derives a descendant private key given an ancestor private key and the full absolute derivation path.
246
195
  * Uses X25519 keys for encryption key derivation.
@@ -456,7 +405,7 @@ export class Records {
456
405
  if (authorDelegatedGrantDefined) {
457
406
  const delegatedGrant = message.authorization!.authorDelegatedGrant!;
458
407
 
459
- const permissionGrant = await PermissionGrant.parse(delegatedGrant);
408
+ const permissionGrant = PermissionGrant.parse(delegatedGrant);
460
409
  if (permissionGrant.delegated !== true) {
461
410
  throw new DwnError(
462
411
  DwnErrorCode.RecordsAuthorDelegatedGrantNotADelegatedGrant,
@@ -499,7 +448,7 @@ export class Records {
499
448
 
500
449
  if (ownerDelegatedGrantDefined) {
501
450
  const delegatedGrant = message.authorization!.ownerDelegatedGrant!;
502
- const permissionGrant = await PermissionGrant.parse(delegatedGrant);
451
+ const permissionGrant = PermissionGrant.parse(delegatedGrant);
503
452
 
504
453
  if (permissionGrant.delegated !== true) {
505
454
  throw new DwnError(
@@ -1,60 +0,0 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- import { EventEmitter } from 'events';
11
- import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
12
- const EVENTS_LISTENER_CHANNEL = 'events';
13
- ;
14
- export class EventEmitterStream {
15
- constructor(config = {}) {
16
- this.isOpen = false;
17
- /**
18
- * we subscribe to the `EventEmitter` error handler with a provided handler or set one which logs the errors.
19
- */
20
- this.errorHandler = (error) => { console.error('event emitter error', error); };
21
- // we capture the rejections and currently just log the errors that are produced
22
- this.eventEmitter = new EventEmitter({ captureRejections: true });
23
- // number of listeners per particular eventName before a warning is emitted
24
- // we set to 0 which represents infinity.
25
- // https://nodejs.org/api/events.html#emittersetmaxlistenersn
26
- this.eventEmitter.setMaxListeners(0);
27
- if (config.errorHandler) {
28
- this.errorHandler = config.errorHandler;
29
- }
30
- this.eventEmitter.on('error', this.errorHandler);
31
- }
32
- subscribe(tenant, id, listener) {
33
- return __awaiter(this, void 0, void 0, function* () {
34
- this.eventEmitter.on(`${tenant}_${EVENTS_LISTENER_CHANNEL}`, listener);
35
- return {
36
- id,
37
- close: () => __awaiter(this, void 0, void 0, function* () { this.eventEmitter.off(`${tenant}_${EVENTS_LISTENER_CHANNEL}`, listener); })
38
- };
39
- });
40
- }
41
- open() {
42
- return __awaiter(this, void 0, void 0, function* () {
43
- this.isOpen = true;
44
- });
45
- }
46
- close() {
47
- return __awaiter(this, void 0, void 0, function* () {
48
- this.isOpen = false;
49
- this.eventEmitter.removeAllListeners();
50
- });
51
- }
52
- emit(tenant, event, indexes) {
53
- if (!this.isOpen) {
54
- this.errorHandler(new DwnError(DwnErrorCode.EventEmitterStreamNotOpenError, 'a message emitted when EventEmitterStream is closed'));
55
- return;
56
- }
57
- this.eventEmitter.emit(`${tenant}_${EVENTS_LISTENER_CHANNEL}`, tenant, event, indexes);
58
- }
59
- }
60
- //# sourceMappingURL=event-emitter-stream.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"event-emitter-stream.js","sourceRoot":"","sources":["../../../../src/event-stream/event-emitter-stream.ts"],"names":[],"mappings":";;;;;;;;;AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAE9D,MAAM,uBAAuB,GAAG,QAAQ,CAAC;AAQxC,CAAC;AAEF,MAAM,OAAO,kBAAkB;IAI7B,YAAY,SAAmC,EAAE;QAFzC,WAAM,GAAY,KAAK,CAAC;QAkBhC;;WAEG;QACK,iBAAY,GAAwB,CAAC,KAAK,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAlBtG,gFAAgF;QAChF,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;QAElE,2EAA2E;QAC3E,yCAAyC;QACzC,6DAA6D;QAC7D,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAErC,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YACxB,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QAC1C,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IACnD,CAAC;IAOK,SAAS,CAAC,MAAc,EAAE,EAAU,EAAE,QAAuB;;YACjE,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,MAAM,IAAI,uBAAuB,EAAE,EAAE,QAAQ,CAAC,CAAC;YACvE,OAAO;gBACL,EAAE;gBACF,KAAK,EAAE,GAAwB,EAAE,gDAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,uBAAuB,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;aAC/G,CAAC;QACJ,CAAC;KAAA;IAEK,IAAI;;YACR,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;KAAA;IAEK,KAAK;;YACT,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YACpB,IAAI,CAAC,YAAY,CAAC,kBAAkB,EAAE,CAAC;QACzC,CAAC;KAAA;IAED,IAAI,CAAC,MAAc,EAAE,KAAmB,EAAE,OAAkB;QAC1D,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,CAAC,YAAY,CAAC,IAAI,QAAQ,CAC5B,YAAY,CAAC,8BAA8B,EAC3C,qDAAqD,CACtD,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,uBAAuB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACzF,CAAC;CACF"}