@enbox/dwn-sdk-js 0.0.7 → 0.1.0

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 (368) 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 +817 -911
  4. package/dist/esm/generated/precompiled-validators.js.map +1 -1
  5. package/dist/esm/src/core/constants.js +11 -0
  6. package/dist/esm/src/core/constants.js.map +1 -0
  7. package/dist/esm/src/core/core-protocol.js +44 -0
  8. package/dist/esm/src/core/core-protocol.js.map +1 -0
  9. package/dist/esm/src/core/dwn-error.js +12 -12
  10. package/dist/esm/src/core/dwn-error.js.map +1 -1
  11. package/dist/esm/src/core/grant-authorization.js +16 -3
  12. package/dist/esm/src/core/grant-authorization.js.map +1 -1
  13. package/dist/esm/src/core/protocol-authorization-action.js +5 -0
  14. package/dist/esm/src/core/protocol-authorization-action.js.map +1 -1
  15. package/dist/esm/src/core/protocol-authorization-validation.js +91 -0
  16. package/dist/esm/src/core/protocol-authorization-validation.js.map +1 -1
  17. package/dist/esm/src/core/protocol-authorization.js +53 -30
  18. package/dist/esm/src/core/protocol-authorization.js.map +1 -1
  19. package/dist/esm/src/core/records-grant-authorization.js +6 -8
  20. package/dist/esm/src/core/records-grant-authorization.js.map +1 -1
  21. package/dist/esm/src/core/resumable-task-manager.js +2 -0
  22. package/dist/esm/src/core/resumable-task-manager.js.map +1 -1
  23. package/dist/esm/src/dwn.js +42 -18
  24. package/dist/esm/src/dwn.js.map +1 -1
  25. package/dist/esm/src/event-stream/event-emitter-event-log.js +204 -0
  26. package/dist/esm/src/event-stream/event-emitter-event-log.js.map +1 -0
  27. package/dist/esm/src/handlers/messages-read.js +7 -11
  28. package/dist/esm/src/handlers/messages-read.js.map +1 -1
  29. package/dist/esm/src/handlers/messages-subscribe.js +22 -24
  30. package/dist/esm/src/handlers/messages-subscribe.js.map +1 -1
  31. package/dist/esm/src/handlers/messages-sync.js +11 -15
  32. package/dist/esm/src/handlers/messages-sync.js.map +1 -1
  33. package/dist/esm/src/handlers/protocols-configure.js +37 -27
  34. package/dist/esm/src/handlers/protocols-configure.js.map +1 -1
  35. package/dist/esm/src/handlers/protocols-query.js +7 -11
  36. package/dist/esm/src/handlers/protocols-query.js.map +1 -1
  37. package/dist/esm/src/handlers/records-count.js +10 -12
  38. package/dist/esm/src/handlers/records-count.js.map +1 -1
  39. package/dist/esm/src/handlers/records-delete.js +10 -18
  40. package/dist/esm/src/handlers/records-delete.js.map +1 -1
  41. package/dist/esm/src/handlers/records-query.js +11 -15
  42. package/dist/esm/src/handlers/records-query.js.map +1 -1
  43. package/dist/esm/src/handlers/records-read.js +31 -26
  44. package/dist/esm/src/handlers/records-read.js.map +1 -1
  45. package/dist/esm/src/handlers/records-subscribe.js +39 -26
  46. package/dist/esm/src/handlers/records-subscribe.js.map +1 -1
  47. package/dist/esm/src/handlers/records-write.js +128 -105
  48. package/dist/esm/src/handlers/records-write.js.map +1 -1
  49. package/dist/esm/src/index.js +5 -2
  50. package/dist/esm/src/index.js.map +1 -1
  51. package/dist/esm/src/interfaces/messages-subscribe.js +1 -0
  52. package/dist/esm/src/interfaces/messages-subscribe.js.map +1 -1
  53. package/dist/esm/src/interfaces/protocols-configure.js +33 -3
  54. package/dist/esm/src/interfaces/protocols-configure.js.map +1 -1
  55. package/dist/esm/src/interfaces/records-count.js +1 -1
  56. package/dist/esm/src/interfaces/records-count.js.map +1 -1
  57. package/dist/esm/src/interfaces/records-delete.js +1 -1
  58. package/dist/esm/src/interfaces/records-delete.js.map +1 -1
  59. package/dist/esm/src/interfaces/records-query.js +1 -1
  60. package/dist/esm/src/interfaces/records-query.js.map +1 -1
  61. package/dist/esm/src/interfaces/records-read.js +1 -1
  62. package/dist/esm/src/interfaces/records-read.js.map +1 -1
  63. package/dist/esm/src/interfaces/records-subscribe.js +2 -1
  64. package/dist/esm/src/interfaces/records-subscribe.js.map +1 -1
  65. package/dist/esm/src/interfaces/records-write-signing.js +1 -12
  66. package/dist/esm/src/interfaces/records-write-signing.js.map +1 -1
  67. package/dist/esm/src/interfaces/records-write.js +25 -41
  68. package/dist/esm/src/interfaces/records-write.js.map +1 -1
  69. package/dist/esm/src/protocols/permission-grant.js +1 -1
  70. package/dist/esm/src/protocols/permission-grant.js.map +1 -1
  71. package/dist/esm/src/protocols/permission-request.js +1 -1
  72. package/dist/esm/src/protocols/permission-request.js.map +1 -1
  73. package/dist/esm/src/protocols/permissions.js +113 -5
  74. package/dist/esm/src/protocols/permissions.js.map +1 -1
  75. package/dist/esm/src/state-index/state-index-level.js +5 -7
  76. package/dist/esm/src/state-index/state-index-level.js.map +1 -1
  77. package/dist/esm/src/store/data-store-level.js +110 -33
  78. package/dist/esm/src/store/data-store-level.js.map +1 -1
  79. package/dist/esm/src/store/index-level.js +42 -32
  80. package/dist/esm/src/store/index-level.js.map +1 -1
  81. package/dist/esm/src/store/storage-controller.js +70 -6
  82. package/dist/esm/src/store/storage-controller.js.map +1 -1
  83. package/dist/esm/src/types/permission-types.js.map +1 -1
  84. package/dist/esm/src/types/protocols-types.js +11 -0
  85. package/dist/esm/src/types/protocols-types.js.map +1 -1
  86. package/dist/esm/src/types/records-types.js.map +1 -1
  87. package/dist/esm/src/utils/hd-key.js +0 -8
  88. package/dist/esm/src/utils/hd-key.js.map +1 -1
  89. package/dist/esm/src/utils/messages.js +16 -34
  90. package/dist/esm/src/utils/messages.js.map +1 -1
  91. package/dist/esm/src/utils/records.js +5 -43
  92. package/dist/esm/src/utils/records.js.map +1 -1
  93. package/dist/esm/tests/core/protocol-authorization.spec.js +2 -1
  94. package/dist/esm/tests/core/protocol-authorization.spec.js.map +1 -1
  95. package/dist/esm/tests/dwn.spec.js +32 -43
  96. package/dist/esm/tests/dwn.spec.js.map +1 -1
  97. package/dist/esm/tests/event-emitter-event-log.spec.js +305 -0
  98. package/dist/esm/tests/event-emitter-event-log.spec.js.map +1 -0
  99. package/dist/esm/tests/features/author-delegated-grant.spec.js +14 -7
  100. package/dist/esm/tests/features/author-delegated-grant.spec.js.map +1 -1
  101. package/dist/esm/tests/features/owner-delegated-grant.spec.js +9 -5
  102. package/dist/esm/tests/features/owner-delegated-grant.spec.js.map +1 -1
  103. package/dist/esm/tests/features/owner-signature.spec.js +14 -7
  104. package/dist/esm/tests/features/owner-signature.spec.js.map +1 -1
  105. package/dist/esm/tests/features/permissions.spec.js +12 -12
  106. package/dist/esm/tests/features/permissions.spec.js.map +1 -1
  107. package/dist/esm/tests/features/protocol-composition.spec.js +636 -5
  108. package/dist/esm/tests/features/protocol-composition.spec.js.map +1 -1
  109. package/dist/esm/tests/features/protocol-create-action.spec.js +4 -4
  110. package/dist/esm/tests/features/protocol-create-action.spec.js.map +1 -1
  111. package/dist/esm/tests/features/protocol-delete-action.spec.js +7 -7
  112. package/dist/esm/tests/features/protocol-delete-action.spec.js.map +1 -1
  113. package/dist/esm/tests/features/protocol-update-action.spec.js +4 -4
  114. package/dist/esm/tests/features/protocol-update-action.spec.js.map +1 -1
  115. package/dist/esm/tests/features/records-delivery.spec.js +236 -0
  116. package/dist/esm/tests/features/records-delivery.spec.js.map +1 -0
  117. package/dist/esm/tests/features/records-immutable.spec.js +315 -0
  118. package/dist/esm/tests/features/records-immutable.spec.js.map +1 -0
  119. package/dist/esm/tests/features/records-prune.spec.js +4 -4
  120. package/dist/esm/tests/features/records-prune.spec.js.map +1 -1
  121. package/dist/esm/tests/features/records-record-limit.spec.js +542 -0
  122. package/dist/esm/tests/features/records-record-limit.spec.js.map +1 -0
  123. package/dist/esm/tests/features/records-squash.spec.js +1055 -0
  124. package/dist/esm/tests/features/records-squash.spec.js.map +1 -0
  125. package/dist/esm/tests/features/records-tags.spec.js +16 -4
  126. package/dist/esm/tests/features/records-tags.spec.js.map +1 -1
  127. package/dist/esm/tests/features/resumable-tasks.spec.js +7 -8
  128. package/dist/esm/tests/features/resumable-tasks.spec.js.map +1 -1
  129. package/dist/esm/tests/handlers/messages-read.spec.js +11 -5
  130. package/dist/esm/tests/handlers/messages-read.spec.js.map +1 -1
  131. package/dist/esm/tests/handlers/messages-subscribe.spec.js +169 -22
  132. package/dist/esm/tests/handlers/messages-subscribe.spec.js.map +1 -1
  133. package/dist/esm/tests/handlers/messages-sync.spec.js +103 -21
  134. package/dist/esm/tests/handlers/messages-sync.spec.js.map +1 -1
  135. package/dist/esm/tests/handlers/protocols-configure.spec.js +5 -5
  136. package/dist/esm/tests/handlers/protocols-configure.spec.js.map +1 -1
  137. package/dist/esm/tests/handlers/protocols-query.spec.js +5 -5
  138. package/dist/esm/tests/handlers/protocols-query.spec.js.map +1 -1
  139. package/dist/esm/tests/handlers/records-count.spec.js +9 -4
  140. package/dist/esm/tests/handlers/records-count.spec.js.map +1 -1
  141. package/dist/esm/tests/handlers/records-delete.spec.js +24 -25
  142. package/dist/esm/tests/handlers/records-delete.spec.js.map +1 -1
  143. package/dist/esm/tests/handlers/records-query.spec.js +68 -9
  144. package/dist/esm/tests/handlers/records-query.spec.js.map +1 -1
  145. package/dist/esm/tests/handlers/records-read.spec.js +24 -138
  146. package/dist/esm/tests/handlers/records-read.spec.js.map +1 -1
  147. package/dist/esm/tests/handlers/records-subscribe.spec.js +175 -35
  148. package/dist/esm/tests/handlers/records-subscribe.spec.js.map +1 -1
  149. package/dist/esm/tests/handlers/records-write.spec.js +176 -72
  150. package/dist/esm/tests/handlers/records-write.spec.js.map +1 -1
  151. package/dist/esm/tests/interfaces/records-write.spec.js +52 -68
  152. package/dist/esm/tests/interfaces/records-write.spec.js.map +1 -1
  153. package/dist/esm/tests/protocols/permission-grant.spec.js +6 -6
  154. package/dist/esm/tests/protocols/permission-grant.spec.js.map +1 -1
  155. package/dist/esm/tests/protocols/permission-request.spec.js +4 -4
  156. package/dist/esm/tests/protocols/permission-request.spec.js.map +1 -1
  157. package/dist/esm/tests/protocols/permissions.spec.js +4 -4
  158. package/dist/esm/tests/protocols/permissions.spec.js.map +1 -1
  159. package/dist/esm/tests/scenarios/aggregator.spec.js +4 -4
  160. package/dist/esm/tests/scenarios/aggregator.spec.js.map +1 -1
  161. package/dist/esm/tests/scenarios/deleted-record.spec.js +350 -5
  162. package/dist/esm/tests/scenarios/deleted-record.spec.js.map +1 -1
  163. package/dist/esm/tests/scenarios/end-to-end-tests.spec.js +4 -4
  164. package/dist/esm/tests/scenarios/end-to-end-tests.spec.js.map +1 -1
  165. package/dist/esm/tests/scenarios/nested-roles.spec.js +4 -4
  166. package/dist/esm/tests/scenarios/nested-roles.spec.js.map +1 -1
  167. package/dist/esm/tests/scenarios/subscriptions.spec.js +93 -40
  168. package/dist/esm/tests/scenarios/subscriptions.spec.js.map +1 -1
  169. package/dist/esm/tests/store/data-store-level.spec.js +102 -41
  170. package/dist/esm/tests/store/data-store-level.spec.js.map +1 -1
  171. package/dist/esm/tests/test-event-stream.js +12 -13
  172. package/dist/esm/tests/test-event-stream.js.map +1 -1
  173. package/dist/esm/tests/test-suite.js +10 -4
  174. package/dist/esm/tests/test-suite.js.map +1 -1
  175. package/dist/esm/tests/utils/messages.spec.js +12 -5
  176. package/dist/esm/tests/utils/messages.spec.js.map +1 -1
  177. package/dist/esm/tests/utils/records.spec.js +8 -12
  178. package/dist/esm/tests/utils/records.spec.js.map +1 -1
  179. package/dist/esm/tests/utils/test-data-generator.js +36 -2
  180. package/dist/esm/tests/utils/test-data-generator.js.map +1 -1
  181. package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js +37 -8
  182. package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js.map +1 -1
  183. package/dist/types/generated/precompiled-validators.d.ts +49 -40
  184. package/dist/types/generated/precompiled-validators.d.ts.map +1 -1
  185. package/dist/types/src/core/constants.d.ts +11 -0
  186. package/dist/types/src/core/constants.d.ts.map +1 -0
  187. package/dist/types/src/core/core-protocol.d.ts +89 -0
  188. package/dist/types/src/core/core-protocol.d.ts.map +1 -0
  189. package/dist/types/src/core/dwn-error.d.ts +12 -12
  190. package/dist/types/src/core/dwn-error.d.ts.map +1 -1
  191. package/dist/types/src/core/grant-authorization.d.ts +6 -2
  192. package/dist/types/src/core/grant-authorization.d.ts.map +1 -1
  193. package/dist/types/src/core/protocol-authorization-action.d.ts.map +1 -1
  194. package/dist/types/src/core/protocol-authorization-validation.d.ts +30 -0
  195. package/dist/types/src/core/protocol-authorization-validation.d.ts.map +1 -1
  196. package/dist/types/src/core/protocol-authorization.d.ts +19 -11
  197. package/dist/types/src/core/protocol-authorization.d.ts.map +1 -1
  198. package/dist/types/src/core/records-grant-authorization.d.ts.map +1 -1
  199. package/dist/types/src/core/resumable-task-manager.d.ts +2 -1
  200. package/dist/types/src/core/resumable-task-manager.d.ts.map +1 -1
  201. package/dist/types/src/dwn.d.ts +19 -7
  202. package/dist/types/src/dwn.d.ts.map +1 -1
  203. package/dist/types/src/event-stream/event-emitter-event-log.d.ts +50 -0
  204. package/dist/types/src/event-stream/event-emitter-event-log.d.ts.map +1 -0
  205. package/dist/types/src/handlers/messages-read.d.ts +3 -8
  206. package/dist/types/src/handlers/messages-read.d.ts.map +1 -1
  207. package/dist/types/src/handlers/messages-subscribe.d.ts +6 -10
  208. package/dist/types/src/handlers/messages-subscribe.d.ts.map +1 -1
  209. package/dist/types/src/handlers/messages-sync.d.ts +3 -8
  210. package/dist/types/src/handlers/messages-sync.d.ts.map +1 -1
  211. package/dist/types/src/handlers/protocols-configure.d.ts +3 -10
  212. package/dist/types/src/handlers/protocols-configure.d.ts.map +1 -1
  213. package/dist/types/src/handlers/protocols-query.d.ts +3 -8
  214. package/dist/types/src/handlers/protocols-query.d.ts.map +1 -1
  215. package/dist/types/src/handlers/records-count.d.ts +3 -6
  216. package/dist/types/src/handlers/records-count.d.ts.map +1 -1
  217. package/dist/types/src/handlers/records-delete.d.ts +3 -8
  218. package/dist/types/src/handlers/records-delete.d.ts.map +1 -1
  219. package/dist/types/src/handlers/records-query.d.ts +3 -8
  220. package/dist/types/src/handlers/records-query.d.ts.map +1 -1
  221. package/dist/types/src/handlers/records-read.d.ts +3 -8
  222. package/dist/types/src/handlers/records-read.d.ts.map +1 -1
  223. package/dist/types/src/handlers/records-subscribe.d.ts +8 -10
  224. package/dist/types/src/handlers/records-subscribe.d.ts.map +1 -1
  225. package/dist/types/src/handlers/records-write.d.ts +12 -25
  226. package/dist/types/src/handlers/records-write.d.ts.map +1 -1
  227. package/dist/types/src/index.d.ts +8 -4
  228. package/dist/types/src/index.d.ts.map +1 -1
  229. package/dist/types/src/interfaces/messages-subscribe.d.ts +5 -0
  230. package/dist/types/src/interfaces/messages-subscribe.d.ts.map +1 -1
  231. package/dist/types/src/interfaces/protocols-configure.d.ts.map +1 -1
  232. package/dist/types/src/interfaces/records-subscribe.d.ts +5 -0
  233. package/dist/types/src/interfaces/records-subscribe.d.ts.map +1 -1
  234. package/dist/types/src/interfaces/records-write-signing.d.ts +3 -4
  235. package/dist/types/src/interfaces/records-write-signing.d.ts.map +1 -1
  236. package/dist/types/src/interfaces/records-write.d.ts +11 -11
  237. package/dist/types/src/interfaces/records-write.d.ts.map +1 -1
  238. package/dist/types/src/protocols/permission-grant.d.ts +1 -1
  239. package/dist/types/src/protocols/permission-grant.d.ts.map +1 -1
  240. package/dist/types/src/protocols/permission-request.d.ts +1 -1
  241. package/dist/types/src/protocols/permission-request.d.ts.map +1 -1
  242. package/dist/types/src/protocols/permissions.d.ts +40 -3
  243. package/dist/types/src/protocols/permissions.d.ts.map +1 -1
  244. package/dist/types/src/state-index/state-index-level.d.ts.map +1 -1
  245. package/dist/types/src/store/data-store-level.d.ts +20 -4
  246. package/dist/types/src/store/data-store-level.d.ts.map +1 -1
  247. package/dist/types/src/store/index-level.d.ts +4 -0
  248. package/dist/types/src/store/index-level.d.ts.map +1 -1
  249. package/dist/types/src/store/storage-controller.d.ts +20 -6
  250. package/dist/types/src/store/storage-controller.d.ts.map +1 -1
  251. package/dist/types/src/types/message-types.d.ts +3 -3
  252. package/dist/types/src/types/message-types.d.ts.map +1 -1
  253. package/dist/types/src/types/messages-types.d.ts +12 -3
  254. package/dist/types/src/types/messages-types.d.ts.map +1 -1
  255. package/dist/types/src/types/method-handler.d.ts +24 -3
  256. package/dist/types/src/types/method-handler.d.ts.map +1 -1
  257. package/dist/types/src/types/permission-types.d.ts +7 -0
  258. package/dist/types/src/types/permission-types.d.ts.map +1 -1
  259. package/dist/types/src/types/protocols-types.d.ts +69 -2
  260. package/dist/types/src/types/protocols-types.d.ts.map +1 -1
  261. package/dist/types/src/types/records-types.d.ts +23 -6
  262. package/dist/types/src/types/records-types.d.ts.map +1 -1
  263. package/dist/types/src/types/subscriptions.d.ts +151 -13
  264. package/dist/types/src/types/subscriptions.d.ts.map +1 -1
  265. package/dist/types/src/utils/hd-key.d.ts +1 -9
  266. package/dist/types/src/utils/hd-key.d.ts.map +1 -1
  267. package/dist/types/src/utils/messages.d.ts +7 -5
  268. package/dist/types/src/utils/messages.d.ts.map +1 -1
  269. package/dist/types/src/utils/records.d.ts +1 -11
  270. package/dist/types/src/utils/records.d.ts.map +1 -1
  271. package/dist/types/tests/dwn.spec.d.ts.map +1 -1
  272. package/dist/types/tests/event-emitter-event-log.spec.d.ts +2 -0
  273. package/dist/types/tests/event-emitter-event-log.spec.d.ts.map +1 -0
  274. package/dist/types/tests/features/author-delegated-grant.spec.d.ts.map +1 -1
  275. package/dist/types/tests/features/owner-delegated-grant.spec.d.ts.map +1 -1
  276. package/dist/types/tests/features/owner-signature.spec.d.ts.map +1 -1
  277. package/dist/types/tests/features/protocol-composition.spec.d.ts.map +1 -1
  278. package/dist/types/tests/features/records-delivery.spec.d.ts +2 -0
  279. package/dist/types/tests/features/records-delivery.spec.d.ts.map +1 -0
  280. package/dist/types/tests/features/records-immutable.spec.d.ts +2 -0
  281. package/dist/types/tests/features/records-immutable.spec.d.ts.map +1 -0
  282. package/dist/types/tests/features/records-record-limit.spec.d.ts +2 -0
  283. package/dist/types/tests/features/records-record-limit.spec.d.ts.map +1 -0
  284. package/dist/types/tests/features/records-squash.spec.d.ts +2 -0
  285. package/dist/types/tests/features/records-squash.spec.d.ts.map +1 -0
  286. package/dist/types/tests/features/records-tags.spec.d.ts.map +1 -1
  287. package/dist/types/tests/features/resumable-tasks.spec.d.ts.map +1 -1
  288. package/dist/types/tests/handlers/messages-read.spec.d.ts.map +1 -1
  289. package/dist/types/tests/handlers/messages-subscribe.spec.d.ts.map +1 -1
  290. package/dist/types/tests/handlers/messages-sync.spec.d.ts.map +1 -1
  291. package/dist/types/tests/handlers/records-count.spec.d.ts.map +1 -1
  292. package/dist/types/tests/handlers/records-delete.spec.d.ts.map +1 -1
  293. package/dist/types/tests/handlers/records-query.spec.d.ts.map +1 -1
  294. package/dist/types/tests/handlers/records-read.spec.d.ts.map +1 -1
  295. package/dist/types/tests/handlers/records-subscribe.spec.d.ts.map +1 -1
  296. package/dist/types/tests/handlers/records-write.spec.d.ts.map +1 -1
  297. package/dist/types/tests/scenarios/deleted-record.spec.d.ts.map +1 -1
  298. package/dist/types/tests/scenarios/subscriptions.spec.d.ts.map +1 -1
  299. package/dist/types/tests/test-event-stream.d.ts +11 -12
  300. package/dist/types/tests/test-event-stream.d.ts.map +1 -1
  301. package/dist/types/tests/test-suite.d.ts +2 -2
  302. package/dist/types/tests/test-suite.d.ts.map +1 -1
  303. package/dist/types/tests/utils/test-data-generator.d.ts +19 -0
  304. package/dist/types/tests/utils/test-data-generator.d.ts.map +1 -1
  305. package/package.json +5 -4
  306. package/src/core/constants.ts +11 -0
  307. package/src/core/core-protocol.ts +129 -0
  308. package/src/core/dwn-error.ts +18 -12
  309. package/src/core/grant-authorization.ts +20 -3
  310. package/src/core/protocol-authorization-action.ts +5 -0
  311. package/src/core/protocol-authorization-validation.ts +133 -0
  312. package/src/core/protocol-authorization.ts +71 -23
  313. package/src/core/records-grant-authorization.ts +6 -8
  314. package/src/core/resumable-task-manager.ts +3 -1
  315. package/src/dwn.ts +58 -73
  316. package/src/event-stream/event-emitter-event-log.ts +283 -0
  317. package/src/handlers/messages-read.ts +8 -9
  318. package/src/handlers/messages-subscribe.ts +24 -28
  319. package/src/handlers/messages-sync.ts +10 -16
  320. package/src/handlers/protocols-configure.ts +47 -32
  321. package/src/handlers/protocols-query.ts +6 -9
  322. package/src/handlers/records-count.ts +11 -10
  323. package/src/handlers/records-delete.ts +12 -21
  324. package/src/handlers/records-query.ts +12 -12
  325. package/src/handlers/records-read.ts +34 -22
  326. package/src/handlers/records-subscribe.ts +47 -26
  327. package/src/handlers/records-write.ts +152 -119
  328. package/src/index.ts +9 -5
  329. package/src/interfaces/messages-subscribe.ts +7 -1
  330. package/src/interfaces/protocols-configure.ts +51 -3
  331. package/src/interfaces/records-count.ts +1 -1
  332. package/src/interfaces/records-delete.ts +1 -1
  333. package/src/interfaces/records-query.ts +1 -1
  334. package/src/interfaces/records-read.ts +1 -1
  335. package/src/interfaces/records-subscribe.ts +8 -1
  336. package/src/interfaces/records-write-signing.ts +2 -22
  337. package/src/interfaces/records-write.ts +35 -48
  338. package/src/protocols/permission-grant.ts +1 -1
  339. package/src/protocols/permission-request.ts +1 -1
  340. package/src/protocols/permissions.ts +148 -6
  341. package/src/state-index/state-index-level.ts +5 -7
  342. package/src/store/data-store-level.ts +124 -34
  343. package/src/store/index-level.ts +44 -35
  344. package/src/store/storage-controller.ts +89 -12
  345. package/src/types/message-types.ts +3 -3
  346. package/src/types/messages-types.ts +12 -3
  347. package/src/types/method-handler.ts +26 -4
  348. package/src/types/mitt.d.ts +28 -0
  349. package/src/types/permission-types.ts +7 -0
  350. package/src/types/protocols-types.ts +78 -1
  351. package/src/types/records-types.ts +24 -6
  352. package/src/types/subscriptions.ts +178 -14
  353. package/src/utils/hd-key.ts +0 -9
  354. package/src/utils/messages.ts +17 -37
  355. package/src/utils/records.ts +7 -58
  356. package/dist/esm/src/event-stream/event-emitter-stream.js +0 -46
  357. package/dist/esm/src/event-stream/event-emitter-stream.js.map +0 -1
  358. package/dist/esm/tests/event-stream/event-emitter-stream.spec.js +0 -68
  359. package/dist/esm/tests/event-stream/event-emitter-stream.spec.js.map +0 -1
  360. package/dist/esm/tests/event-stream/event-stream.spec.js +0 -114
  361. package/dist/esm/tests/event-stream/event-stream.spec.js.map +0 -1
  362. package/dist/types/src/event-stream/event-emitter-stream.d.ts +0 -23
  363. package/dist/types/src/event-stream/event-emitter-stream.d.ts.map +0 -1
  364. package/dist/types/tests/event-stream/event-emitter-stream.spec.d.ts +0 -2
  365. package/dist/types/tests/event-stream/event-emitter-stream.spec.d.ts.map +0 -1
  366. package/dist/types/tests/event-stream/event-stream.spec.d.ts +0 -2
  367. package/dist/types/tests/event-stream/event-stream.spec.d.ts.map +0 -1
  368. package/src/event-stream/event-emitter-stream.ts +0 -69
@@ -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
  */
@@ -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,14 +178,7 @@ 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
-
181
+ public static constructKeyDerivationPathUsingProtocolContextScheme(contextId: string): string[] {
214
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
 
@@ -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,46 +0,0 @@
1
- import { EventEmitter } from 'events';
2
- import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
3
- const EVENTS_LISTENER_CHANNEL = 'events';
4
- ;
5
- export class EventEmitterStream {
6
- eventEmitter;
7
- isOpen = false;
8
- constructor(config = {}) {
9
- // we capture the rejections and currently just log the errors that are produced
10
- this.eventEmitter = new EventEmitter({ captureRejections: true });
11
- // number of listeners per particular eventName before a warning is emitted
12
- // we set to 0 which represents infinity.
13
- // https://nodejs.org/api/events.html#emittersetmaxlistenersn
14
- this.eventEmitter.setMaxListeners(0);
15
- if (config.errorHandler) {
16
- this.errorHandler = config.errorHandler;
17
- }
18
- this.eventEmitter.on('error', this.errorHandler);
19
- }
20
- /**
21
- * we subscribe to the `EventEmitter` error handler with a provided handler or set one which logs the errors.
22
- */
23
- errorHandler = (error) => { console.error('event emitter error', error); };
24
- async subscribe(tenant, id, listener) {
25
- this.eventEmitter.on(`${tenant}_${EVENTS_LISTENER_CHANNEL}`, listener);
26
- return {
27
- id,
28
- close: async () => { this.eventEmitter.off(`${tenant}_${EVENTS_LISTENER_CHANNEL}`, listener); }
29
- };
30
- }
31
- async open() {
32
- this.isOpen = true;
33
- }
34
- async close() {
35
- this.isOpen = false;
36
- this.eventEmitter.removeAllListeners();
37
- }
38
- emit(tenant, event, indexes) {
39
- if (!this.isOpen) {
40
- this.errorHandler(new DwnError(DwnErrorCode.EventEmitterStreamNotOpenError, 'a message emitted when EventEmitterStream is closed'));
41
- return;
42
- }
43
- this.eventEmitter.emit(`${tenant}_${EVENTS_LISTENER_CHANNEL}`, tenant, event, indexes);
44
- }
45
- }
46
- //# 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;IACrB,YAAY,CAAe;IAC3B,MAAM,GAAY,KAAK,CAAC;IAEhC,YAAY,SAAmC,EAAE;QAC/C,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;IAED;;OAEG;IACK,YAAY,GAAwB,CAAC,KAAK,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAExG,KAAK,CAAC,SAAS,CAAC,MAAc,EAAE,EAAU,EAAE,QAAuB;QACjE,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,MAAM,IAAI,uBAAuB,EAAE,EAAE,QAAQ,CAAC,CAAC;QACvE,OAAO;YACL,EAAE;YACF,KAAK,EAAE,KAAK,IAAmB,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,uBAAuB,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;SAC/G,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,YAAY,CAAC,kBAAkB,EAAE,CAAC;IACzC,CAAC;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"}
@@ -1,68 +0,0 @@
1
- import { EventEmitterStream } from '../../src/event-stream/event-emitter-stream.js';
2
- import { TestDataGenerator } from '../../src/index.js';
3
- import { TestStores } from '../test-stores.js';
4
- import sinon from 'sinon';
5
- import { afterAll, beforeAll, beforeEach, describe, expect, it } from 'bun:test';
6
- describe('EventEmitterStream', () => {
7
- let messageStore;
8
- beforeAll(async () => {
9
- ({ messageStore } = TestStores.get());
10
- await messageStore.open();
11
- });
12
- beforeEach(async () => {
13
- await messageStore.clear();
14
- });
15
- afterAll(async () => {
16
- // Clean up after each test by closing and clearing the event stream
17
- await messageStore.close();
18
- sinon.restore();
19
- });
20
- it('should remove listeners when `close` method is used', async () => {
21
- const eventStream = new EventEmitterStream();
22
- const emitter = eventStream['eventEmitter'];
23
- // count the `events` listeners, which represents all listeners
24
- expect(emitter.listenerCount('did:alice_events')).toBe(0);
25
- const sub = await eventStream.subscribe('did:alice', 'id', () => { });
26
- expect(emitter.listenerCount('did:alice_events')).toBe(1);
27
- // close the subscription, which should remove the listener
28
- await sub.close();
29
- expect(emitter.listenerCount('did:alice_events')).toBe(0);
30
- });
31
- it('logs message when the emitter experiences an error', async () => {
32
- const testHandler = {
33
- errorHandler: (_) => { },
34
- };
35
- const eventErrorSpy = sinon.spy(testHandler, 'errorHandler');
36
- const eventStream = new EventEmitterStream({ errorHandler: testHandler.errorHandler });
37
- const emitter = eventStream['eventEmitter'];
38
- emitter.emit('error', new Error('random error'));
39
- expect(eventErrorSpy.callCount).toBe(1);
40
- });
41
- it('does not emit messages if event stream is closed', async () => {
42
- const testHandler = {
43
- errorHandler: (_) => { },
44
- };
45
- const eventErrorSpy = sinon.spy(testHandler, 'errorHandler');
46
- const eventStream = new EventEmitterStream({ errorHandler: testHandler.errorHandler });
47
- const handler = async (_tenant, _event, _indexes) => { };
48
- await eventStream.subscribe('did:alice', 'sub-1', handler);
49
- // close eventStream
50
- await eventStream.close();
51
- const message1 = await TestDataGenerator.generateRecordsWrite({});
52
- eventStream.emit('did:alice', { message: message1.message }, {});
53
- const message2 = await TestDataGenerator.generateRecordsWrite({});
54
- eventStream.emit('did:alice', { message: message2.message }, {});
55
- expect(eventErrorSpy.callCount).toBe(2);
56
- // check that all listeners have been removed
57
- const eventEmitter = eventStream['eventEmitter'];
58
- for (const event of eventEmitter.eventNames()) {
59
- expect(eventEmitter.listenerCount(event)).toBe(0);
60
- }
61
- });
62
- it('sets max listeners to 0 which represents infinity', async () => {
63
- const eventStreamOne = new EventEmitterStream();
64
- const emitterOne = eventStreamOne['eventEmitter'];
65
- expect(emitterOne.getMaxListeners()).toBe(0);
66
- });
67
- });
68
- //# sourceMappingURL=event-emitter-stream.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"event-emitter-stream.spec.js","sourceRoot":"","sources":["../../../../tests/event-stream/event-emitter-stream.spec.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gDAAgD,CAAC;AACpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAEjF,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAI,YAA0B,CAAC;IAE/B,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,CAAC,EAAE,YAAY,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC;QACtC,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,YAAY,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,KAAK,IAAI,EAAE;QAClB,oEAAoE;QACpE,MAAM,YAAY,CAAC,KAAK,EAAE,CAAC;QAC3B,KAAK,CAAC,OAAO,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,WAAW,GAAG,IAAI,kBAAkB,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;QAE5C,+DAA+D;QAC/D,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAE1D,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACrE,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAE1D,2DAA2D;QAC3D,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,WAAW,GAAG;YAClB,YAAY,EAAE,CAAC,CAAK,EAAO,EAAE,GAAE,CAAC;SACjC,CAAC;QACF,MAAM,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QAE7D,MAAM,WAAW,GAAG,IAAI,kBAAkB,CAAC,EAAE,YAAY,EAAE,WAAW,CAAC,YAAY,EAAE,CAAC,CAAC;QACvF,MAAM,OAAO,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,WAAW,GAAG;YAClB,YAAY,EAAE,CAAC,CAAK,EAAO,EAAE,GAAE,CAAC;SACjC,CAAC;QACF,MAAM,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QAE7D,MAAM,WAAW,GAAG,IAAI,kBAAkB,CAAC,EAAE,YAAY,EAAE,WAAW,CAAC,YAAY,EAAE,CAAC,CAAC;QAEvF,MAAM,OAAO,GAAG,KAAK,EAAE,OAAe,EAAE,MAAoB,EAAE,QAAmB,EAAiB,EAAE,GAAE,CAAC,CAAC;QACxG,MAAM,WAAW,CAAC,SAAS,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAE3D,oBAAoB;QACpB,MAAM,WAAW,CAAC,KAAK,EAAE,CAAC;QAE1B,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;QAClE,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QACjE,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;QAClE,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QAEjE,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAExC,6CAA6C;QAC7C,MAAM,YAAY,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;QACjD,KAAK,MAAM,KAAK,IAAI,YAAY,CAAC,UAAU,EAAE,EAAE,CAAC;YAC9C,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,cAAc,GAAG,IAAI,kBAAkB,EAAE,CAAC;QAChD,MAAM,UAAU,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;QAClD,MAAM,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,114 +0,0 @@
1
- import { Poller } from '../utils/poller.js';
2
- import { TestEventStream } from '../test-event-stream.js';
3
- import { Message, TestDataGenerator } from '../../src/index.js';
4
- import sinon from 'sinon';
5
- import { afterAll, beforeAll, beforeEach, describe, expect, it } from 'bun:test';
6
- // NOTE: We use `Poller.pollUntilSuccessOrTimeout` to poll for the expected results.
7
- // In some cases, the EventStream is a coordinated pub/sub system and the messages/events are emitted over the network
8
- // this means that the messages are not processed immediately and we need to wait for the messages to be processed
9
- // before we can assert the results. The `pollUntilSuccessOrTimeout` function is a utility function that will poll until the expected results are met.
10
- // It is also important to note that in some cases where we are testing a negative case (the message not arriving at the subscriber)
11
- // we add an alternate subscription to await results within to give the EventStream ample time to process the message.
12
- // Additionally in some of these cases the order in which messages are sent to be processed or checked may matter, and they are noted as such.
13
- export function testEventStream() {
14
- describe('EventStream', () => {
15
- // saving the original `console.error` function to re-assign after tests complete
16
- const originalConsoleErrorFunction = console.error;
17
- let eventStream;
18
- beforeAll(async () => {
19
- eventStream = TestEventStream.get();
20
- await eventStream.open();
21
- // do not print the console error statements from the emitter error
22
- console.error = (_) => { };
23
- });
24
- beforeEach(() => {
25
- sinon.restore();
26
- });
27
- afterAll(async () => {
28
- sinon.restore();
29
- console.error = originalConsoleErrorFunction;
30
- // Clean up after each test by closing and clearing the event stream
31
- await eventStream.close();
32
- });
33
- it('emits all messages to each subscriptions', async () => {
34
- // Scenario: We create 2 separate subscriptions that listen to all messages
35
- // and we emit 3 messages. We expect both subscriptions to receive all 3 messages.
36
- const messageCids1 = [];
37
- const handler1 = async (_tenant, event, _indexes) => {
38
- const { message } = event;
39
- const messageCid = await Message.getCid(message);
40
- messageCids1.push(messageCid);
41
- };
42
- const messageCids2 = [];
43
- const handler2 = async (_tenant, event, _indexes) => {
44
- const { message } = event;
45
- const messageCid = await Message.getCid(message);
46
- messageCids2.push(messageCid);
47
- };
48
- const subscription1 = await eventStream.subscribe('did:alice', 'sub-1', handler1);
49
- const subscription2 = await eventStream.subscribe('did:alice', 'sub-2', handler2);
50
- const message1 = await TestDataGenerator.generateRecordsWrite({});
51
- const message1Cid = await Message.getCid(message1.message);
52
- eventStream.emit('did:alice', { message: message1.message }, {});
53
- const message2 = await TestDataGenerator.generateRecordsWrite({});
54
- const message2Cid = await Message.getCid(message2.message);
55
- eventStream.emit('did:alice', { message: message2.message }, {});
56
- const message3 = await TestDataGenerator.generateRecordsWrite({});
57
- const message3Cid = await Message.getCid(message3.message);
58
- eventStream.emit('did:alice', { message: message3.message }, {});
59
- // Use the Poller to poll until the expected results are met
60
- await Poller.pollUntilSuccessOrTimeout(async () => {
61
- expect(messageCids1).toEqual(expect.arrayContaining([message1Cid, message2Cid, message3Cid]));
62
- expect(messageCids2).toEqual(expect.arrayContaining([message1Cid, message2Cid, message3Cid]));
63
- });
64
- await subscription1.close();
65
- await subscription2.close();
66
- });
67
- it('does not receive messages if subscription is closed', async () => {
68
- // Scenario: We create two subscriptions that listen to all messages.
69
- // The reason we create two is in order to allow for a negative test case.
70
- // We send a message, validate that both handlers processed the message
71
- // We then close one of the subscriptions, and send another message.
72
- // Now we validate that only the handler of the subscription that is still open received the message.
73
- const sub1MessageCids = [];
74
- const handler1 = async (_tenant, event, _indexes) => {
75
- const { message } = event;
76
- const messageCid = await Message.getCid(message);
77
- sub1MessageCids.push(messageCid);
78
- };
79
- const sub2MessageCids = [];
80
- const handler2 = async (_tenant, event, _indexes) => {
81
- const { message } = event;
82
- const messageCid = await Message.getCid(message);
83
- sub2MessageCids.push(messageCid);
84
- };
85
- const subscription1 = await eventStream.subscribe('did:alice', 'sub-1', handler1);
86
- const subscription2 = await eventStream.subscribe('did:alice', 'sub-2', handler2);
87
- const message1 = await TestDataGenerator.generateRecordsWrite({});
88
- const message1Cid = await Message.getCid(message1.message);
89
- eventStream.emit('did:alice', { message: message1.message }, {});
90
- // Use the Poller to poll until the expected results are met
91
- await Poller.pollUntilSuccessOrTimeout(async () => {
92
- expect(sub1MessageCids).toHaveLength(1);
93
- expect(sub1MessageCids).toEqual(expect.arrayContaining([message1Cid]));
94
- expect(sub2MessageCids).toHaveLength(1);
95
- expect(sub2MessageCids).toEqual(expect.arrayContaining([message1Cid]));
96
- });
97
- await subscription1.close(); // close subscription 1
98
- const message2 = await TestDataGenerator.generateRecordsWrite({});
99
- const message2Cid = await Message.getCid(message2.message);
100
- eventStream.emit('did:alice', { message: message2.message }, {});
101
- // Use the Poller to poll until the expected results are met
102
- await Poller.pollUntilSuccessOrTimeout(async () => {
103
- // subscription 2 should have received the message
104
- expect(sub2MessageCids.length).toBe(2);
105
- expect(sub2MessageCids).toEqual(expect.arrayContaining([message1Cid, message2Cid]));
106
- // subscription 1 should not have received the message
107
- expect(sub1MessageCids).toHaveLength(1);
108
- expect(sub1MessageCids).toEqual(expect.arrayContaining([message1Cid]));
109
- });
110
- await subscription2.close();
111
- });
112
- });
113
- }
114
- //# sourceMappingURL=event-stream.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"event-stream.spec.js","sourceRoot":"","sources":["../../../../tests/event-stream/event-stream.spec.ts"],"names":[],"mappings":"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"}
@@ -1,23 +0,0 @@
1
- import type { KeyValues } from '../types/query-types.js';
2
- import type { EventListener, EventStream, EventSubscription, MessageEvent } from '../types/subscriptions.js';
3
- export interface EventEmitterStreamConfig {
4
- /**
5
- * An optional error handler in order to be able to react to any errors or warnings triggers by `EventEmitter`.
6
- * By default we log errors with `console.error`.
7
- */
8
- errorHandler?: (error: any) => void;
9
- }
10
- export declare class EventEmitterStream implements EventStream {
11
- private eventEmitter;
12
- private isOpen;
13
- constructor(config?: EventEmitterStreamConfig);
14
- /**
15
- * we subscribe to the `EventEmitter` error handler with a provided handler or set one which logs the errors.
16
- */
17
- private errorHandler;
18
- subscribe(tenant: string, id: string, listener: EventListener): Promise<EventSubscription>;
19
- open(): Promise<void>;
20
- close(): Promise<void>;
21
- emit(tenant: string, event: MessageEvent, indexes: KeyValues): void;
22
- }
23
- //# sourceMappingURL=event-emitter-stream.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"event-emitter-stream.d.ts","sourceRoot":"","sources":["../../../../src/event-stream/event-emitter-stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAO7G,MAAM,WAAW,wBAAwB;IACvC;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;CACrC;AAED,qBAAa,kBAAmB,YAAW,WAAW;IACpD,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,MAAM,CAAkB;gBAEpB,MAAM,GAAE,wBAA6B;IAgBjD;;OAEG;IACH,OAAO,CAAC,YAAY,CAAoF;IAElG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAQ1F,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,GAAG,IAAI;CAUpE"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=event-emitter-stream.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"event-emitter-stream.spec.d.ts","sourceRoot":"","sources":["../../../../tests/event-stream/event-emitter-stream.spec.ts"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- export declare function testEventStream(): void;
2
- //# sourceMappingURL=event-stream.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"event-stream.spec.d.ts","sourceRoot":"","sources":["../../../../tests/event-stream/event-stream.spec.ts"],"names":[],"mappings":"AAoBA,wBAAgB,eAAe,IAAI,IAAI,CA2HtC"}
@@ -1,69 +0,0 @@
1
- import type { KeyValues } from '../types/query-types.js';
2
- import type { EventListener, EventStream, EventSubscription, MessageEvent } from '../types/subscriptions.js';
3
-
4
- import { EventEmitter } from 'events';
5
- import { DwnError, DwnErrorCode } from '../core/dwn-error.js';
6
-
7
- const EVENTS_LISTENER_CHANNEL = 'events';
8
-
9
- export interface EventEmitterStreamConfig {
10
- /**
11
- * An optional error handler in order to be able to react to any errors or warnings triggers by `EventEmitter`.
12
- * By default we log errors with `console.error`.
13
- */
14
- errorHandler?: (error: any) => void;
15
- };
16
-
17
- export class EventEmitterStream implements EventStream {
18
- private eventEmitter: EventEmitter;
19
- private isOpen: boolean = false;
20
-
21
- constructor(config: EventEmitterStreamConfig = {}) {
22
- // we capture the rejections and currently just log the errors that are produced
23
- this.eventEmitter = new EventEmitter({ captureRejections: true });
24
-
25
- // number of listeners per particular eventName before a warning is emitted
26
- // we set to 0 which represents infinity.
27
- // https://nodejs.org/api/events.html#emittersetmaxlistenersn
28
- this.eventEmitter.setMaxListeners(0);
29
-
30
- if (config.errorHandler) {
31
- this.errorHandler = config.errorHandler;
32
- }
33
-
34
- this.eventEmitter.on('error', this.errorHandler);
35
- }
36
-
37
- /**
38
- * we subscribe to the `EventEmitter` error handler with a provided handler or set one which logs the errors.
39
- */
40
- private errorHandler: (error:any) => void = (error) => { console.error('event emitter error', error); };
41
-
42
- async subscribe(tenant: string, id: string, listener: EventListener): Promise<EventSubscription> {
43
- this.eventEmitter.on(`${tenant}_${EVENTS_LISTENER_CHANNEL}`, listener);
44
- return {
45
- id,
46
- close: async (): Promise<void> => { this.eventEmitter.off(`${tenant}_${EVENTS_LISTENER_CHANNEL}`, listener); }
47
- };
48
- }
49
-
50
- async open(): Promise<void> {
51
- this.isOpen = true;
52
- }
53
-
54
- async close(): Promise<void> {
55
- this.isOpen = false;
56
- this.eventEmitter.removeAllListeners();
57
- }
58
-
59
- emit(tenant: string, event: MessageEvent, indexes: KeyValues): void {
60
- if (!this.isOpen) {
61
- this.errorHandler(new DwnError(
62
- DwnErrorCode.EventEmitterStreamNotOpenError,
63
- 'a message emitted when EventEmitterStream is closed'
64
- ));
65
- return;
66
- }
67
- this.eventEmitter.emit(`${tenant}_${EVENTS_LISTENER_CHANNEL}`, tenant, event, indexes);
68
- }
69
- }