@enbox/dwn-sdk-js 0.4.6 → 0.4.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 (375) hide show
  1. package/README.md +3 -1
  2. package/dist/browser.mjs +19 -78
  3. package/dist/browser.mjs.map +4 -4
  4. package/dist/esm/generated/precompiled-validators.js +2324 -1525
  5. package/dist/esm/generated/precompiled-validators.js.map +1 -1
  6. package/dist/esm/src/core/constants.js +50 -0
  7. package/dist/esm/src/core/constants.js.map +1 -1
  8. package/dist/esm/src/core/dwn-error.js +29 -11
  9. package/dist/esm/src/core/dwn-error.js.map +1 -1
  10. package/dist/esm/src/core/encryption-control.js +785 -0
  11. package/dist/esm/src/core/encryption-control.js.map +1 -0
  12. package/dist/esm/src/core/message.js +6 -0
  13. package/dist/esm/src/core/message.js.map +1 -1
  14. package/dist/esm/src/core/messages-grant-authorization.js +36 -5
  15. package/dist/esm/src/core/messages-grant-authorization.js.map +1 -1
  16. package/dist/esm/src/core/protocol-authorization-action.js +3 -12
  17. package/dist/esm/src/core/protocol-authorization-action.js.map +1 -1
  18. package/dist/esm/src/core/protocol-authorization-validation.js +31 -30
  19. package/dist/esm/src/core/protocol-authorization-validation.js.map +1 -1
  20. package/dist/esm/src/core/protocol-authorization.js +6 -0
  21. package/dist/esm/src/core/protocol-authorization.js.map +1 -1
  22. package/dist/esm/src/core/recording-validation-state-reader.js +3 -3
  23. package/dist/esm/src/core/recording-validation-state-reader.js.map +1 -1
  24. package/dist/esm/src/core/replication-apply.js +62 -108
  25. package/dist/esm/src/core/replication-apply.js.map +1 -1
  26. package/dist/esm/src/core/validation-state-reader.js +5 -6
  27. package/dist/esm/src/core/validation-state-reader.js.map +1 -1
  28. package/dist/esm/src/dwn.js +1 -2
  29. package/dist/esm/src/dwn.js.map +1 -1
  30. package/dist/esm/src/event-stream/event-emitter-wake-publisher.js +11 -11
  31. package/dist/esm/src/event-stream/event-emitter-wake-publisher.js.map +1 -1
  32. package/dist/esm/src/handlers/messages-query.js +6 -16
  33. package/dist/esm/src/handlers/messages-query.js.map +1 -1
  34. package/dist/esm/src/handlers/messages-read.js +4 -3
  35. package/dist/esm/src/handlers/messages-read.js.map +1 -1
  36. package/dist/esm/src/handlers/messages-subscribe.js +26 -30
  37. package/dist/esm/src/handlers/messages-subscribe.js.map +1 -1
  38. package/dist/esm/src/handlers/protocols-configure.js +6 -4
  39. package/dist/esm/src/handlers/protocols-configure.js.map +1 -1
  40. package/dist/esm/src/handlers/records-count.js +85 -10
  41. package/dist/esm/src/handlers/records-count.js.map +1 -1
  42. package/dist/esm/src/handlers/records-delete.js +11 -0
  43. package/dist/esm/src/handlers/records-delete.js.map +1 -1
  44. package/dist/esm/src/handlers/records-query.js +140 -18
  45. package/dist/esm/src/handlers/records-query.js.map +1 -1
  46. package/dist/esm/src/handlers/records-read.js +20 -4
  47. package/dist/esm/src/handlers/records-read.js.map +1 -1
  48. package/dist/esm/src/handlers/records-subscribe.js +127 -11
  49. package/dist/esm/src/handlers/records-subscribe.js.map +1 -1
  50. package/dist/esm/src/handlers/records-write.js +15 -0
  51. package/dist/esm/src/handlers/records-write.js.map +1 -1
  52. package/dist/esm/src/index.js +8 -11
  53. package/dist/esm/src/index.js.map +1 -1
  54. package/dist/esm/src/interfaces/protocols-configure.js +66 -9
  55. package/dist/esm/src/interfaces/protocols-configure.js.map +1 -1
  56. package/dist/esm/src/interfaces/records-write.js +43 -36
  57. package/dist/esm/src/interfaces/records-write.js.map +1 -1
  58. package/dist/esm/src/jose/algorithms/signing/ed25519.js +5 -5
  59. package/dist/esm/src/jose/algorithms/signing/ed25519.js.map +1 -1
  60. package/dist/esm/src/jose/jws/general/verifier.js +1 -1
  61. package/dist/esm/src/jose/jws/general/verifier.js.map +1 -1
  62. package/dist/esm/src/protocols/encryption.js +60 -270
  63. package/dist/esm/src/protocols/encryption.js.map +1 -1
  64. package/dist/esm/src/store/blockstore-level.js +14 -23
  65. package/dist/esm/src/store/blockstore-level.js.map +1 -1
  66. package/dist/esm/src/store/blockstore-mock.js +10 -27
  67. package/dist/esm/src/store/blockstore-mock.js.map +1 -1
  68. package/dist/esm/src/store/blockstore-utils.js +45 -0
  69. package/dist/esm/src/store/blockstore-utils.js.map +1 -0
  70. package/dist/esm/src/store/blockstore.js +2 -0
  71. package/dist/esm/src/store/blockstore.js.map +1 -0
  72. package/dist/esm/src/store/data-store-level.js +4 -12
  73. package/dist/esm/src/store/data-store-level.js.map +1 -1
  74. package/dist/esm/src/store/level.js +7 -0
  75. package/dist/esm/src/store/level.js.map +1 -0
  76. package/dist/esm/src/types/encryption-types.js +4 -1
  77. package/dist/esm/src/types/encryption-types.js.map +1 -1
  78. package/dist/esm/src/utils/data-stream.js +25 -0
  79. package/dist/esm/src/utils/data-stream.js.map +1 -1
  80. package/dist/esm/src/utils/encryption.js +107 -19
  81. package/dist/esm/src/utils/encryption.js.map +1 -1
  82. package/dist/esm/src/utils/grant-key-coverage.js +180 -0
  83. package/dist/esm/src/utils/grant-key-coverage.js.map +1 -0
  84. package/dist/esm/src/utils/hd-key.js +1 -2
  85. package/dist/esm/src/utils/hd-key.js.map +1 -1
  86. package/dist/esm/src/utils/jws.js +7 -1
  87. package/dist/esm/src/utils/jws.js.map +1 -1
  88. package/dist/esm/src/utils/memory-cache.js +29 -8
  89. package/dist/esm/src/utils/memory-cache.js.map +1 -1
  90. package/dist/esm/src/utils/protocols.js +27 -0
  91. package/dist/esm/src/utils/protocols.js.map +1 -1
  92. package/dist/esm/src/utils/record-limit-occupancy.js +23 -3
  93. package/dist/esm/src/utils/record-limit-occupancy.js.map +1 -1
  94. package/dist/esm/src/utils/records.js +29 -0
  95. package/dist/esm/src/utils/records.js.map +1 -1
  96. package/dist/esm/src/utils/secp256k1.js +12 -11
  97. package/dist/esm/src/utils/secp256k1.js.map +1 -1
  98. package/dist/esm/src/utils/secp256r1.js +12 -20
  99. package/dist/esm/src/utils/secp256r1.js.map +1 -1
  100. package/dist/esm/src/utils/time.js +103 -25
  101. package/dist/esm/src/utils/time.js.map +1 -1
  102. package/dist/esm/tests/core/constants.spec.js +35 -0
  103. package/dist/esm/tests/core/constants.spec.js.map +1 -0
  104. package/dist/esm/tests/core/encryption-control.spec.js +100 -0
  105. package/dist/esm/tests/core/encryption-control.spec.js.map +1 -0
  106. package/dist/esm/tests/core/message.spec.js +35 -0
  107. package/dist/esm/tests/core/message.spec.js.map +1 -1
  108. package/dist/esm/tests/core/protocol-authorization.spec.js +1 -1
  109. package/dist/esm/tests/core/protocol-authorization.spec.js.map +1 -1
  110. package/dist/esm/tests/core/replication-apply.spec.js +157 -74
  111. package/dist/esm/tests/core/replication-apply.spec.js.map +1 -1
  112. package/dist/esm/tests/core/replication-replay-property.spec.js +2 -1
  113. package/dist/esm/tests/core/replication-replay-property.spec.js.map +1 -1
  114. package/dist/esm/tests/core/validation-read-closure.spec.js +14 -28
  115. package/dist/esm/tests/core/validation-read-closure.spec.js.map +1 -1
  116. package/dist/esm/tests/core/validation-state-reader.spec.js +19 -23
  117. package/dist/esm/tests/core/validation-state-reader.spec.js.map +1 -1
  118. package/dist/esm/tests/dwn.spec.js +2 -1
  119. package/dist/esm/tests/dwn.spec.js.map +1 -1
  120. package/dist/esm/tests/event-emitter-wake-publisher.spec.js +51 -0
  121. package/dist/esm/tests/event-emitter-wake-publisher.spec.js.map +1 -0
  122. package/dist/esm/tests/features/protocol-composition.spec.js +1 -1
  123. package/dist/esm/tests/features/protocol-composition.spec.js.map +1 -1
  124. package/dist/esm/tests/features/records-record-limit.spec.js +1 -1
  125. package/dist/esm/tests/features/records-record-limit.spec.js.map +1 -1
  126. package/dist/esm/tests/fuzz/encryption.fuzz.spec.js +9 -1
  127. package/dist/esm/tests/fuzz/encryption.fuzz.spec.js.map +1 -1
  128. package/dist/esm/tests/fuzz/process-message.fuzz.spec.js +1 -1
  129. package/dist/esm/tests/fuzz/process-message.fuzz.spec.js.map +1 -1
  130. package/dist/esm/tests/fuzz/protocols-utils.fuzz.spec.js +29 -1
  131. package/dist/esm/tests/fuzz/protocols-utils.fuzz.spec.js.map +1 -1
  132. package/dist/esm/tests/fuzz/secp256k1.fuzz.spec.js +2 -2
  133. package/dist/esm/tests/fuzz/secp256k1.fuzz.spec.js.map +1 -1
  134. package/dist/esm/tests/fuzz/time.fuzz.spec.js +7 -1
  135. package/dist/esm/tests/fuzz/time.fuzz.spec.js.map +1 -1
  136. package/dist/esm/tests/handlers/messages-query.spec.js +123 -11
  137. package/dist/esm/tests/handlers/messages-query.spec.js.map +1 -1
  138. package/dist/esm/tests/handlers/messages-read.spec.js +95 -0
  139. package/dist/esm/tests/handlers/messages-read.spec.js.map +1 -1
  140. package/dist/esm/tests/handlers/messages-subscribe.spec.js +90 -0
  141. package/dist/esm/tests/handlers/messages-subscribe.spec.js.map +1 -1
  142. package/dist/esm/tests/handlers/protocols-configure.spec.js +66 -0
  143. package/dist/esm/tests/handlers/protocols-configure.spec.js.map +1 -1
  144. package/dist/esm/tests/handlers/records-count.spec.js +370 -0
  145. package/dist/esm/tests/handlers/records-count.spec.js.map +1 -1
  146. package/dist/esm/tests/handlers/records-delete.spec.js +70 -1
  147. package/dist/esm/tests/handlers/records-delete.spec.js.map +1 -1
  148. package/dist/esm/tests/handlers/records-query.spec.js +562 -1
  149. package/dist/esm/tests/handlers/records-query.spec.js.map +1 -1
  150. package/dist/esm/tests/handlers/records-read.spec.js +140 -2
  151. package/dist/esm/tests/handlers/records-read.spec.js.map +1 -1
  152. package/dist/esm/tests/handlers/records-subscribe.spec.js +241 -1
  153. package/dist/esm/tests/handlers/records-subscribe.spec.js.map +1 -1
  154. package/dist/esm/tests/handlers/records-write.spec.js +1187 -29
  155. package/dist/esm/tests/handlers/records-write.spec.js.map +1 -1
  156. package/dist/esm/tests/interfaces/protocols-configure.spec.js +290 -2
  157. package/dist/esm/tests/interfaces/protocols-configure.spec.js.map +1 -1
  158. package/dist/esm/tests/interfaces/records-write.spec.js +47 -5
  159. package/dist/esm/tests/interfaces/records-write.spec.js.map +1 -1
  160. package/dist/esm/tests/protocols/encryption.spec.js +187 -452
  161. package/dist/esm/tests/protocols/encryption.spec.js.map +1 -1
  162. package/dist/esm/tests/scenarios/end-to-end-tests.spec.js +13 -27
  163. package/dist/esm/tests/scenarios/end-to-end-tests.spec.js.map +1 -1
  164. package/dist/esm/tests/store/blockstore-level.spec.js +33 -10
  165. package/dist/esm/tests/store/blockstore-level.spec.js.map +1 -1
  166. package/dist/esm/tests/store/blockstore-mock.spec.js +31 -7
  167. package/dist/esm/tests/store/blockstore-mock.spec.js.map +1 -1
  168. package/dist/esm/tests/store/blockstore-utils.spec.js +115 -0
  169. package/dist/esm/tests/store/blockstore-utils.spec.js.map +1 -0
  170. package/dist/esm/tests/store/index-level.spec.js +3 -3
  171. package/dist/esm/tests/store/index-level.spec.js.map +1 -1
  172. package/dist/esm/tests/test-stores.js +2 -1
  173. package/dist/esm/tests/test-stores.js.map +1 -1
  174. package/dist/esm/tests/utils/cid.spec.js +15 -0
  175. package/dist/esm/tests/utils/cid.spec.js.map +1 -1
  176. package/dist/esm/tests/utils/data-stream.spec.js +30 -0
  177. package/dist/esm/tests/utils/data-stream.spec.js.map +1 -1
  178. package/dist/esm/tests/utils/encryption-control-test-utils.js +111 -0
  179. package/dist/esm/tests/utils/encryption-control-test-utils.js.map +1 -0
  180. package/dist/esm/tests/utils/encryption.spec.js +198 -5
  181. package/dist/esm/tests/utils/encryption.spec.js.map +1 -1
  182. package/dist/esm/tests/utils/grant-key-coverage.spec.js +262 -0
  183. package/dist/esm/tests/utils/grant-key-coverage.spec.js.map +1 -0
  184. package/dist/esm/tests/utils/memory-cache.spec.js +12 -0
  185. package/dist/esm/tests/utils/memory-cache.spec.js.map +1 -1
  186. package/dist/esm/tests/utils/secp256r1.spec.js +2 -2
  187. package/dist/esm/tests/utils/secp256r1.spec.js.map +1 -1
  188. package/dist/esm/tests/utils/test-data-generator.js +2 -1
  189. package/dist/esm/tests/utils/test-data-generator.js.map +1 -1
  190. package/dist/esm/tests/utils/test-validation-state-reader.js +1 -1
  191. package/dist/esm/tests/utils/test-validation-state-reader.js.map +1 -1
  192. package/dist/esm/tests/utils/time.spec.js +26 -0
  193. package/dist/esm/tests/utils/time.spec.js.map +1 -1
  194. package/dist/esm/tests/validation/json-schemas/encryption/audience.spec.js +45 -0
  195. package/dist/esm/tests/validation/json-schemas/encryption/audience.spec.js.map +1 -0
  196. package/dist/esm/tests/validation/json-schemas/encryption/delivery.spec.js +47 -0
  197. package/dist/esm/tests/validation/json-schemas/encryption/delivery.spec.js.map +1 -0
  198. package/dist/esm/tests/validation/json-schemas/encryption/wrapped-grant-key-envelope.spec.js +43 -0
  199. package/dist/esm/tests/validation/json-schemas/encryption/wrapped-grant-key-envelope.spec.js.map +1 -0
  200. package/dist/esm/tests/validation/json-schemas/protocols/protocols-configure.spec.js +152 -0
  201. package/dist/esm/tests/validation/json-schemas/protocols/protocols-configure.spec.js.map +1 -1
  202. package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js +46 -1
  203. package/dist/esm/tests/validation/json-schemas/records/records-write.spec.js.map +1 -1
  204. package/dist/types/generated/precompiled-validators.d.ts +20 -4
  205. package/dist/types/generated/precompiled-validators.d.ts.map +1 -1
  206. package/dist/types/src/core/constants.d.ts +39 -0
  207. package/dist/types/src/core/constants.d.ts.map +1 -1
  208. package/dist/types/src/core/dwn-error.d.ts +29 -11
  209. package/dist/types/src/core/dwn-error.d.ts.map +1 -1
  210. package/dist/types/src/core/encryption-control.d.ts +128 -0
  211. package/dist/types/src/core/encryption-control.d.ts.map +1 -0
  212. package/dist/types/src/core/message.d.ts +4 -0
  213. package/dist/types/src/core/message.d.ts.map +1 -1
  214. package/dist/types/src/core/messages-grant-authorization.d.ts +11 -0
  215. package/dist/types/src/core/messages-grant-authorization.d.ts.map +1 -1
  216. package/dist/types/src/core/protocol-authorization-action.d.ts.map +1 -1
  217. package/dist/types/src/core/protocol-authorization-validation.d.ts.map +1 -1
  218. package/dist/types/src/core/protocol-authorization.d.ts.map +1 -1
  219. package/dist/types/src/core/recording-validation-state-reader.d.ts +2 -3
  220. package/dist/types/src/core/recording-validation-state-reader.d.ts.map +1 -1
  221. package/dist/types/src/core/replication-apply.d.ts +10 -1
  222. package/dist/types/src/core/replication-apply.d.ts.map +1 -1
  223. package/dist/types/src/core/validation-state-reader.d.ts +2 -3
  224. package/dist/types/src/core/validation-state-reader.d.ts.map +1 -1
  225. package/dist/types/src/dwn.d.ts.map +1 -1
  226. package/dist/types/src/event-stream/event-emitter-wake-publisher.d.ts +1 -1
  227. package/dist/types/src/event-stream/event-emitter-wake-publisher.d.ts.map +1 -1
  228. package/dist/types/src/handlers/messages-query.d.ts.map +1 -1
  229. package/dist/types/src/handlers/messages-read.d.ts.map +1 -1
  230. package/dist/types/src/handlers/messages-subscribe.d.ts.map +1 -1
  231. package/dist/types/src/handlers/protocols-configure.d.ts +1 -0
  232. package/dist/types/src/handlers/protocols-configure.d.ts.map +1 -1
  233. package/dist/types/src/handlers/records-count.d.ts +2 -0
  234. package/dist/types/src/handlers/records-count.d.ts.map +1 -1
  235. package/dist/types/src/handlers/records-delete.d.ts.map +1 -1
  236. package/dist/types/src/handlers/records-query.d.ts +3 -0
  237. package/dist/types/src/handlers/records-query.d.ts.map +1 -1
  238. package/dist/types/src/handlers/records-read.d.ts.map +1 -1
  239. package/dist/types/src/handlers/records-subscribe.d.ts +2 -0
  240. package/dist/types/src/handlers/records-subscribe.d.ts.map +1 -1
  241. package/dist/types/src/handlers/records-write.d.ts.map +1 -1
  242. package/dist/types/src/index.d.ts +12 -18
  243. package/dist/types/src/index.d.ts.map +1 -1
  244. package/dist/types/src/interfaces/protocols-configure.d.ts +13 -1
  245. package/dist/types/src/interfaces/protocols-configure.d.ts.map +1 -1
  246. package/dist/types/src/interfaces/records-write.d.ts +5 -1
  247. package/dist/types/src/interfaces/records-write.d.ts.map +1 -1
  248. package/dist/types/src/jose/algorithms/signing/ed25519.d.ts.map +1 -1
  249. package/dist/types/src/protocols/encryption.d.ts +15 -19
  250. package/dist/types/src/protocols/encryption.d.ts.map +1 -1
  251. package/dist/types/src/store/blockstore-level.d.ts +11 -11
  252. package/dist/types/src/store/blockstore-level.d.ts.map +1 -1
  253. package/dist/types/src/store/blockstore-mock.d.ts +12 -12
  254. package/dist/types/src/store/blockstore-mock.d.ts.map +1 -1
  255. package/dist/types/src/store/blockstore-utils.d.ts +23 -0
  256. package/dist/types/src/store/blockstore-utils.d.ts.map +1 -0
  257. package/dist/types/src/store/blockstore.d.ts +3 -0
  258. package/dist/types/src/store/blockstore.d.ts.map +1 -0
  259. package/dist/types/src/store/data-store-level.d.ts.map +1 -1
  260. package/dist/types/src/store/level.d.ts +13 -0
  261. package/dist/types/src/store/level.d.ts.map +1 -0
  262. package/dist/types/src/types/cache.d.ts +2 -2
  263. package/dist/types/src/types/cache.d.ts.map +1 -1
  264. package/dist/types/src/types/encryption-types.d.ts +31 -2
  265. package/dist/types/src/types/encryption-types.d.ts.map +1 -1
  266. package/dist/types/src/types/validation-state-reader.d.ts +3 -5
  267. package/dist/types/src/types/validation-state-reader.d.ts.map +1 -1
  268. package/dist/types/src/utils/data-stream.d.ts +5 -0
  269. package/dist/types/src/utils/data-stream.d.ts.map +1 -1
  270. package/dist/types/src/utils/encryption.d.ts +53 -24
  271. package/dist/types/src/utils/encryption.d.ts.map +1 -1
  272. package/dist/types/src/utils/grant-key-coverage.d.ts +36 -0
  273. package/dist/types/src/utils/grant-key-coverage.d.ts.map +1 -0
  274. package/dist/types/src/utils/hd-key.d.ts.map +1 -1
  275. package/dist/types/src/utils/jws.d.ts.map +1 -1
  276. package/dist/types/src/utils/memory-cache.d.ts +4 -2
  277. package/dist/types/src/utils/memory-cache.d.ts.map +1 -1
  278. package/dist/types/src/utils/protocols.d.ts +11 -0
  279. package/dist/types/src/utils/protocols.d.ts.map +1 -1
  280. package/dist/types/src/utils/record-limit-occupancy.d.ts +7 -0
  281. package/dist/types/src/utils/record-limit-occupancy.d.ts.map +1 -1
  282. package/dist/types/src/utils/records.d.ts +2 -0
  283. package/dist/types/src/utils/records.d.ts.map +1 -1
  284. package/dist/types/src/utils/secp256k1.d.ts.map +1 -1
  285. package/dist/types/src/utils/secp256r1.d.ts.map +1 -1
  286. package/dist/types/src/utils/time.d.ts +21 -13
  287. package/dist/types/src/utils/time.d.ts.map +1 -1
  288. package/dist/types/tests/core/constants.spec.d.ts +2 -0
  289. package/dist/types/tests/core/constants.spec.d.ts.map +1 -0
  290. package/dist/types/tests/core/encryption-control.spec.d.ts +2 -0
  291. package/dist/types/tests/core/encryption-control.spec.d.ts.map +1 -0
  292. package/dist/types/tests/dwn.spec.d.ts.map +1 -1
  293. package/dist/types/tests/event-emitter-wake-publisher.spec.d.ts +2 -0
  294. package/dist/types/tests/event-emitter-wake-publisher.spec.d.ts.map +1 -0
  295. package/dist/types/tests/handlers/messages-query.spec.d.ts.map +1 -1
  296. package/dist/types/tests/handlers/messages-read.spec.d.ts.map +1 -1
  297. package/dist/types/tests/handlers/messages-subscribe.spec.d.ts.map +1 -1
  298. package/dist/types/tests/handlers/protocols-configure.spec.d.ts.map +1 -1
  299. package/dist/types/tests/handlers/records-count.spec.d.ts.map +1 -1
  300. package/dist/types/tests/handlers/records-delete.spec.d.ts.map +1 -1
  301. package/dist/types/tests/handlers/records-query.spec.d.ts.map +1 -1
  302. package/dist/types/tests/handlers/records-read.spec.d.ts.map +1 -1
  303. package/dist/types/tests/handlers/records-subscribe.spec.d.ts.map +1 -1
  304. package/dist/types/tests/handlers/records-write.spec.d.ts.map +1 -1
  305. package/dist/types/tests/scenarios/end-to-end-tests.spec.d.ts.map +1 -1
  306. package/dist/types/tests/store/blockstore-utils.spec.d.ts +2 -0
  307. package/dist/types/tests/store/blockstore-utils.spec.d.ts.map +1 -0
  308. package/dist/types/tests/test-stores.d.ts.map +1 -1
  309. package/dist/types/tests/utils/encryption-control-test-utils.d.ts +46 -0
  310. package/dist/types/tests/utils/encryption-control-test-utils.d.ts.map +1 -0
  311. package/dist/types/tests/utils/grant-key-coverage.spec.d.ts +2 -0
  312. package/dist/types/tests/utils/grant-key-coverage.spec.d.ts.map +1 -0
  313. package/dist/types/tests/utils/test-data-generator.d.ts.map +1 -1
  314. package/dist/types/tests/validation/json-schemas/encryption/audience.spec.d.ts +2 -0
  315. package/dist/types/tests/validation/json-schemas/encryption/audience.spec.d.ts.map +1 -0
  316. package/dist/types/tests/validation/json-schemas/encryption/delivery.spec.d.ts +2 -0
  317. package/dist/types/tests/validation/json-schemas/encryption/delivery.spec.d.ts.map +1 -0
  318. package/dist/types/tests/validation/json-schemas/encryption/wrapped-grant-key-envelope.spec.d.ts +2 -0
  319. package/dist/types/tests/validation/json-schemas/encryption/wrapped-grant-key-envelope.spec.d.ts.map +1 -0
  320. package/package.json +47 -28
  321. package/src/core/constants.ts +61 -0
  322. package/src/core/dwn-error.ts +29 -11
  323. package/src/core/encryption-control.ts +1249 -0
  324. package/src/core/message.ts +7 -0
  325. package/src/core/messages-grant-authorization.ts +60 -9
  326. package/src/core/protocol-authorization-action.ts +3 -13
  327. package/src/core/protocol-authorization-validation.ts +66 -46
  328. package/src/core/protocol-authorization.ts +7 -0
  329. package/src/core/recording-validation-state-reader.ts +4 -5
  330. package/src/core/replication-apply.ts +77 -133
  331. package/src/core/validation-state-reader.ts +6 -8
  332. package/src/dwn.ts +1 -2
  333. package/src/event-stream/event-emitter-wake-publisher.ts +10 -14
  334. package/src/handlers/messages-query.ts +6 -22
  335. package/src/handlers/messages-read.ts +4 -3
  336. package/src/handlers/messages-subscribe.ts +34 -30
  337. package/src/handlers/protocols-configure.ts +7 -4
  338. package/src/handlers/records-count.ts +111 -10
  339. package/src/handlers/records-delete.ts +15 -0
  340. package/src/handlers/records-query.ts +176 -20
  341. package/src/handlers/records-read.ts +19 -6
  342. package/src/handlers/records-subscribe.ts +158 -8
  343. package/src/handlers/records-write.ts +19 -0
  344. package/src/index.ts +50 -22
  345. package/src/interfaces/protocols-configure.ts +102 -11
  346. package/src/interfaces/records-write.ts +49 -43
  347. package/src/jose/algorithms/signing/ed25519.ts +7 -6
  348. package/src/jose/jws/general/verifier.ts +3 -3
  349. package/src/protocols/encryption.ts +94 -411
  350. package/src/store/blockstore-level.ts +33 -37
  351. package/src/store/blockstore-mock.ts +24 -38
  352. package/src/store/blockstore-utils.ts +85 -0
  353. package/src/store/blockstore.ts +8 -0
  354. package/src/store/data-store-level.ts +5 -12
  355. package/src/store/level.ts +19 -0
  356. package/src/types/cache.ts +3 -3
  357. package/src/types/encryption-types.ts +39 -2
  358. package/src/types/validation-state-reader.ts +3 -5
  359. package/src/utils/data-stream.ts +29 -1
  360. package/src/utils/encryption.ts +190 -60
  361. package/src/utils/grant-key-coverage.ts +303 -0
  362. package/src/utils/hd-key.ts +1 -2
  363. package/src/utils/jws.ts +8 -2
  364. package/src/utils/memory-cache.ts +42 -11
  365. package/src/utils/protocols.ts +32 -0
  366. package/src/utils/record-limit-occupancy.ts +34 -5
  367. package/src/utils/records.ts +36 -2
  368. package/src/utils/secp256k1.ts +12 -12
  369. package/src/utils/secp256r1.ts +12 -22
  370. package/src/utils/time.ts +145 -27
  371. package/dist/esm/tests/validation/json-schemas/encryption/audience-key.spec.js +0 -40
  372. package/dist/esm/tests/validation/json-schemas/encryption/audience-key.spec.js.map +0 -1
  373. package/dist/types/tests/validation/json-schemas/encryption/audience-key.spec.d.ts +0 -2
  374. package/dist/types/tests/validation/json-schemas/encryption/audience-key.spec.d.ts.map +0 -1
  375. package/src/types/mitt.d.ts +0 -28
@@ -1,7 +1,15 @@
1
- import { CID } from 'multiformats';
2
- import type { AbortOptions, AwaitIterable } from 'interface-store';
3
- import type { Blockstore, Pair } from 'interface-blockstore';
1
+ import type { Blockstore, InputPair, Pair } from 'interface-blockstore';
2
+ import type { BlockstoreAbortOptions, BlockstoreInput, BlockstoreSource } from './blockstore-utils.js';
4
3
 
4
+ import { CID } from 'multiformats';
5
+ import { NotFoundError } from 'interface-store';
6
+ import {
7
+ collectBlockstoreBytes,
8
+ deleteManyBlockstoreItems,
9
+ getManyBlockstoreItems,
10
+ putManyBlockstoreItems,
11
+ yieldBlockstoreBytes,
12
+ } from './blockstore-utils.js';
5
13
  import { createLevelDatabase, LevelWrapper } from './level-wrapper.js';
6
14
 
7
15
  // `level` works in Node.js 12+ and Electron 5+ on Linux, Mac OS, Windows and
@@ -40,63 +48,51 @@ export class BlockstoreLevel implements Blockstore {
40
48
  return new BlockstoreLevel({ ...this.config, location: '' }, db);
41
49
  }
42
50
 
43
- async put(key: CID | string, val: Uint8Array, options?: AbortOptions): Promise<CID> {
44
- await this.db.put(String(key), val, options);
51
+ async put(key: CID | string, val: BlockstoreInput, options?: BlockstoreAbortOptions): Promise<CID> {
52
+ const bytes = await collectBlockstoreBytes(val);
53
+ await this.db.put(String(key), bytes, options);
45
54
  return CID.parse(key.toString());
46
55
  }
47
56
 
48
- async get(key: CID | string, options?: AbortOptions): Promise<Uint8Array> {
57
+ async * get(key: CID | string, options?: BlockstoreAbortOptions): AsyncGenerator<Uint8Array> {
49
58
  const result = await this.db.get(String(key), options);
50
- return result!;
59
+ if (result === undefined) {
60
+ throw new NotFoundError();
61
+ }
62
+
63
+ yield result;
51
64
  }
52
65
 
53
- async has(key: CID | string, options?: AbortOptions): Promise<boolean> {
66
+ async has(key: CID | string, options?: BlockstoreAbortOptions): Promise<boolean> {
54
67
  return this.db.has(String(key), options);
55
68
  }
56
69
 
57
- async delete(key: CID | string, options?: AbortOptions): Promise<void> {
70
+ async delete(key: CID | string, options?: BlockstoreAbortOptions): Promise<void> {
58
71
  return this.db.delete(String(key), options);
59
72
  }
60
73
 
61
- async isEmpty(options?: AbortOptions): Promise<boolean> {
74
+ async isEmpty(options?: BlockstoreAbortOptions): Promise<boolean> {
62
75
  return this.db.isEmpty(options);
63
76
  }
64
77
 
65
- async * putMany(source: AwaitIterable<Pair>, options?: AbortOptions): AsyncIterable<CID> {
66
- for await (const entry of source) {
67
- await this.put(entry.cid, entry.block, options);
68
-
69
- yield entry.cid;
70
- }
78
+ async * putMany(source: BlockstoreSource<InputPair>, options?: BlockstoreAbortOptions): AsyncGenerator<CID> {
79
+ yield * putManyBlockstoreItems(this, source, options);
71
80
  }
72
81
 
73
- async * getMany(source: AwaitIterable<CID>, options?: AbortOptions): AsyncIterable<Pair> {
74
- for await (const key of source) {
75
- yield {
76
- cid : key,
77
- block : await this.get(key, options)
78
- };
79
- }
82
+ async * getMany(source: BlockstoreSource<CID>, options?: BlockstoreAbortOptions): AsyncGenerator<Pair> {
83
+ yield * getManyBlockstoreItems(this, source, options);
80
84
  }
81
85
 
82
- async * getAll(options?: AbortOptions): AsyncIterable<Pair> {
83
- // @ts-expect-error keyEncoding is 'buffer' but types for db.iterator always return the key type as 'string'
84
- const li: AsyncGenerator<[Uint8Array, Uint8Array]> = this.db.iterator({
85
- keys : true,
86
- keyEncoding : 'buffer'
87
- }, options);
86
+ async * getAll(options?: BlockstoreAbortOptions): AsyncGenerator<Pair> {
87
+ const li: AsyncGenerator<[string, Uint8Array]> = this.db.iterator({ keys: true }, options);
88
88
 
89
89
  for await (const [key, value] of li) {
90
- yield { cid: CID.decode(key), block: value };
90
+ yield { cid: CID.parse(key), bytes: yieldBlockstoreBytes(value) };
91
91
  }
92
92
  }
93
93
 
94
- async * deleteMany(source: AwaitIterable<CID>, options?: AbortOptions): AsyncIterable<CID> {
95
- for await (const key of source) {
96
- await this.delete(key, options);
97
-
98
- yield key;
99
- }
94
+ async * deleteMany(source: BlockstoreSource<CID>, options?: BlockstoreAbortOptions): AsyncGenerator<CID> {
95
+ yield * deleteManyBlockstoreItems(this, source, options);
100
96
  }
101
97
 
102
98
  /**
@@ -110,4 +106,4 @@ export class BlockstoreLevel implements Blockstore {
110
106
  export type BlockstoreLevelConfig = {
111
107
  location: string,
112
108
  createLevelDatabase?: typeof createLevelDatabase,
113
- };
109
+ };
@@ -1,6 +1,12 @@
1
- import { CID } from 'multiformats';
2
- import type { AbortOptions, AwaitIterable } from 'interface-store';
3
- import type { Blockstore, Pair } from 'interface-blockstore';
1
+ import type { CID } from 'multiformats';
2
+ import type { Blockstore, InputPair, Pair } from 'interface-blockstore';
3
+ import type { BlockstoreAbortOptions, BlockstoreInput, BlockstoreSource } from './blockstore-utils.js';
4
+
5
+ import {
6
+ deleteManyBlockstoreItems,
7
+ getManyBlockstoreItems,
8
+ putManyBlockstoreItems,
9
+ } from './blockstore-utils.js';
4
10
 
5
11
  /**
6
12
  * Mock implementation for the Blockstore interface.
@@ -16,60 +22,40 @@ export class BlockstoreMock implements Blockstore {
16
22
  async close(): Promise<void> {
17
23
  }
18
24
 
19
- async put(key: CID, _val: Uint8Array, _options?: AbortOptions): Promise<CID> {
25
+ async put(key: CID, _val: BlockstoreInput, _options?: BlockstoreAbortOptions): Promise<CID> {
20
26
  return key;
21
27
  }
22
28
 
23
- async get(_key: CID, _options?: AbortOptions): Promise<Uint8Array> {
24
- return new Uint8Array();
29
+ async * get(_key: CID, _options?: BlockstoreAbortOptions): AsyncGenerator<Uint8Array> {
30
+ yield new Uint8Array();
25
31
  }
26
32
 
27
- async has(_key: CID, _options?: AbortOptions): Promise<boolean> {
33
+ async has(_key: CID, _options?: BlockstoreAbortOptions): Promise<boolean> {
28
34
  return false;
29
35
  }
30
36
 
31
- async delete(_key: CID, _options?: AbortOptions): Promise<void> {
37
+ async delete(_key: CID, _options?: BlockstoreAbortOptions): Promise<void> {
38
+ return;
32
39
  }
33
40
 
34
- async isEmpty(_options?: AbortOptions): Promise<boolean> {
41
+ async isEmpty(_options?: BlockstoreAbortOptions): Promise<boolean> {
35
42
  return true;
36
43
  }
37
44
 
38
- async * putMany(source: AwaitIterable<Pair>, options?: AbortOptions): AsyncIterable<CID> {
39
- for await (const entry of source) {
40
- await this.put(entry.cid, entry.block, options);
41
-
42
- yield entry.cid;
43
- }
45
+ async * putMany(source: BlockstoreSource<InputPair>, options?: BlockstoreAbortOptions): AsyncGenerator<CID> {
46
+ yield * putManyBlockstoreItems(this, source, options);
44
47
  }
45
48
 
46
- async * getMany(source: AwaitIterable<CID>, options?: AbortOptions): AsyncIterable<Pair> {
47
- for await (const key of source) {
48
- yield {
49
- cid : key,
50
- block : await this.get(key, options)
51
- };
52
- }
49
+ async * getMany(source: BlockstoreSource<CID>, options?: BlockstoreAbortOptions): AsyncGenerator<Pair> {
50
+ yield * getManyBlockstoreItems(this, source, options);
53
51
  }
54
52
 
55
- async * getAll(options?: AbortOptions): AsyncIterable<Pair> {
56
- // @ts-expect-error keyEncoding is 'buffer' but types for db.iterator always return the key type as 'string'
57
- const li: AsyncGenerator<[Uint8Array, Uint8Array]> = this.db.iterator({
58
- keys : true,
59
- keyEncoding : 'buffer'
60
- }, options);
61
-
62
- for await (const [key, value] of li) {
63
- yield { cid: CID.decode(key), block: value };
64
- }
53
+ async * getAll(_options?: BlockstoreAbortOptions): AsyncGenerator<Pair> {
54
+ yield * [];
65
55
  }
66
56
 
67
- async * deleteMany(source: AwaitIterable<CID>, options?: AbortOptions): AsyncIterable<CID> {
68
- for await (const key of source) {
69
- await this.delete(key, options);
70
-
71
- yield key;
72
- }
57
+ async * deleteMany(source: BlockstoreSource<CID>, options?: BlockstoreAbortOptions): AsyncGenerator<CID> {
58
+ yield * deleteManyBlockstoreItems(this, source, options);
73
59
  }
74
60
 
75
61
  /**
@@ -0,0 +1,85 @@
1
+ import type { CID } from 'multiformats';
2
+ import type { InputPair, Pair } from 'interface-blockstore';
3
+
4
+ export type BlockstoreAbortOptions = { signal?: AbortSignal };
5
+ export type BlockstoreInput = Uint8Array | Iterable<Uint8Array> | AsyncIterable<Uint8Array>;
6
+ export type BlockstoreSource<T> = Iterable<T> | AsyncIterable<T>;
7
+
8
+ type BlockstorePutDelegate = {
9
+ put(key: CID, val: BlockstoreInput, options?: BlockstoreAbortOptions): Promise<CID>;
10
+ };
11
+
12
+ type BlockstoreGetDelegate = {
13
+ get(key: CID, options?: BlockstoreAbortOptions): AsyncGenerator<Uint8Array>;
14
+ };
15
+
16
+ type BlockstoreDeleteDelegate = {
17
+ delete(key: CID, options?: BlockstoreAbortOptions): Promise<void>;
18
+ };
19
+
20
+ export async function collectBlockstoreBytes(input: BlockstoreInput): Promise<Uint8Array> {
21
+ if (input instanceof Uint8Array) {
22
+ return input;
23
+ }
24
+
25
+ const chunks: Uint8Array[] = [];
26
+ let byteLength = 0;
27
+ for await (const chunk of input) {
28
+ chunks.push(chunk);
29
+ byteLength += chunk.byteLength;
30
+ }
31
+
32
+ if (chunks.length === 1) {
33
+ return chunks[0];
34
+ }
35
+
36
+ const bytes = new Uint8Array(byteLength);
37
+ let offset = 0;
38
+ for (const chunk of chunks) {
39
+ bytes.set(chunk, offset);
40
+ offset += chunk.byteLength;
41
+ }
42
+
43
+ return bytes;
44
+ }
45
+
46
+ export async function* yieldBlockstoreBytes(bytes: Uint8Array): AsyncGenerator<Uint8Array> {
47
+ yield bytes;
48
+ }
49
+
50
+ export async function* putManyBlockstoreItems(
51
+ blockstore: BlockstorePutDelegate,
52
+ source: BlockstoreSource<InputPair>,
53
+ options?: BlockstoreAbortOptions,
54
+ ): AsyncGenerator<CID> {
55
+ for await (const entry of source) {
56
+ await blockstore.put(entry.cid, entry.bytes, options);
57
+
58
+ yield entry.cid;
59
+ }
60
+ }
61
+
62
+ export async function* getManyBlockstoreItems(
63
+ blockstore: BlockstoreGetDelegate,
64
+ source: BlockstoreSource<CID>,
65
+ options?: BlockstoreAbortOptions,
66
+ ): AsyncGenerator<Pair> {
67
+ for await (const key of source) {
68
+ yield {
69
+ cid : key,
70
+ bytes : blockstore.get(key, options),
71
+ };
72
+ }
73
+ }
74
+
75
+ export async function* deleteManyBlockstoreItems(
76
+ blockstore: BlockstoreDeleteDelegate,
77
+ source: BlockstoreSource<CID>,
78
+ options?: BlockstoreAbortOptions,
79
+ ): AsyncGenerator<CID> {
80
+ for await (const key of source) {
81
+ await blockstore.delete(key, options);
82
+
83
+ yield key;
84
+ }
85
+ }
@@ -0,0 +1,8 @@
1
+ export {
2
+ collectBlockstoreBytes,
3
+ deleteManyBlockstoreItems,
4
+ getManyBlockstoreItems,
5
+ putManyBlockstoreItems,
6
+ yieldBlockstoreBytes,
7
+ } from './blockstore-utils.js';
8
+ export type { BlockstoreAbortOptions, BlockstoreInput, BlockstoreSource } from './blockstore-utils.js';
@@ -118,18 +118,11 @@ export class DataStoreLevel implements DataStore {
118
118
 
119
119
  // Data is chunked into DAG-PB UnixFS blocks. Re-inflate the chunks.
120
120
  const dataDagRoot = await exporter(dataCid, blocksPartition);
121
- const contentIterator = dataDagRoot.content();
122
-
123
- const dataStream = new ReadableStream<Uint8Array>({
124
- async pull(controller): Promise<void> {
125
- const result = await contentIterator.next();
126
- if (result.done) {
127
- controller.close();
128
- } else {
129
- controller.enqueue(result.value);
130
- }
131
- }
132
- });
121
+ if (dataDagRoot.type !== 'file' && dataDagRoot.type !== 'raw' && dataDagRoot.type !== 'identity') {
122
+ throw new Error(`DataStoreLevel: Expected UnixFS file content for '${dataCid}', got '${dataDagRoot.type}'.`);
123
+ }
124
+
125
+ const dataStream = DataStream.fromAsyncIterable(dataDagRoot.content());
133
126
 
134
127
  return { dataSize, dataStream };
135
128
  }
@@ -0,0 +1,19 @@
1
+ export { BlockstoreLevel } from './blockstore-level.js';
2
+ export type { BlockstoreLevelConfig } from './blockstore-level.js';
3
+ export { DataStoreLevel } from './data-store-level.js';
4
+ export type { DataStoreLevelConfig } from './data-store-level.js';
5
+ export { IndexLevel } from './index-level.js';
6
+ export type { CompoundIndexDefinition, IndexLevelConfig, IndexedItem, IndexLevelOptions } from './index-level.js';
7
+ export { createLevelDatabase, LevelWrapper } from './level-wrapper.js';
8
+ export type {
9
+ CreateLevelDatabaseOptions,
10
+ LevelDatabase,
11
+ LevelWrapperBatchOperation,
12
+ LevelWrapperConfig,
13
+ LevelWrapperIteratorOptions,
14
+ LevelWrapperOptions,
15
+ } from './level-wrapper.js';
16
+ export { MessageStoreLevel } from './message-store-level.js';
17
+ export type { MessageStoreLevelConfig } from './message-store-level.js';
18
+ export { ResumableTaskStoreLevel } from './resumable-task-store-level.js';
19
+ export type { ResumableTaskStoreLevelConfig } from './resumable-task-store-level.js';
@@ -6,11 +6,11 @@ export interface Cache {
6
6
  /**
7
7
  * Sets a key-value pair. Does not throw error.
8
8
  */
9
- set(key: string, value: any): Promise<void>;
9
+ set<T = unknown>(key: string, value: T): Promise<void>;
10
10
 
11
11
  /**
12
12
  * Gets the value corresponding to the given key.
13
13
  * @returns value stored corresponding to the given key; `undefined` if key is not found or expired
14
14
  */
15
- get(key: string): Promise<any | undefined>;
16
- }
15
+ get<T = unknown>(key: string): Promise<T | undefined>;
16
+ }
@@ -1,6 +1,43 @@
1
1
  import type { KeyDerivationScheme } from '../utils/hd-key.js';
2
- import type { KeyUnwrapPayload } from '../utils/encryption.js';
3
- import type { PublicKeyJwk } from './jose-types.js';
2
+ import type { KeyUnwrapPayload, SealKeyWrap } from '../utils/encryption.js';
3
+ import type { PrivateKeyJwk, PublicKeyJwk } from './jose-types.js';
4
+
5
+ export type RoleAudienceTuple = {
6
+ protocol: string;
7
+ rolePath: string;
8
+ contextId: string;
9
+ };
10
+
11
+ export type RoleAudienceKeyId = RoleAudienceTuple & {
12
+ keyId: string;
13
+ };
14
+
15
+ export enum EncryptionControlDeliveryRecipientAuthority {
16
+ RoleHolder = 'roleHolder',
17
+ }
18
+
19
+ export type EncryptionControlDeliveryTags = RoleAudienceKeyId & {
20
+ recipientAuthority: EncryptionControlDeliveryRecipientAuthority | `${EncryptionControlDeliveryRecipientAuthority}`;
21
+ };
22
+
23
+ export type EncryptionControlSeal = SealKeyWrap;
24
+
25
+ export type EncryptionControlAudiencePayload = RoleAudienceKeyId & {
26
+ publicKeyJwk: PublicKeyJwk;
27
+ sealedPrivateKey: EncryptionControlSeal;
28
+ };
29
+
30
+ export type RoleAudienceKeyMaterial = {
31
+ algorithm: 'X25519-HKDF-SHA256+A256KW';
32
+ derivationScheme: 'roleAudience';
33
+ keyId: string;
34
+ publicKeyJwk: PublicKeyJwk;
35
+ privateKeyJwk: PrivateKeyJwk;
36
+ };
37
+
38
+ export type EncryptionControlDeliveryPayload = RoleAudienceKeyId & {
39
+ keyMaterial: RoleAudienceKeyMaterial;
40
+ };
4
41
 
5
42
  export type KeyDecrypterDerivationScheme = KeyDerivationScheme | 'roleAudience';
6
43
 
@@ -79,15 +79,13 @@ export interface ValidationStateReader {
79
79
  }): Promise<RecordsWriteMessage[]>;
80
80
 
81
81
  /**
82
- * Queries accepted audience epoch records in the Encryption Protocol.
83
- * The optional `keyId` narrows the lookup to one published audience key.
82
+ * Queries accepted source-protocol-native audience control records by role-audience coordinates.
84
83
  */
85
- queryAudienceEpochs(input: {
84
+ queryAudienceRecords(input: {
86
85
  tenant: string;
87
86
  protocol: string;
87
+ rolePath: string;
88
88
  contextId: string;
89
- role: string;
90
- epoch: number;
91
89
  keyId?: string;
92
90
  }): Promise<RecordsWriteMessage[]>;
93
91
 
@@ -76,6 +76,28 @@ export class DataStream {
76
76
  });
77
77
  }
78
78
 
79
+ /**
80
+ * Adapts an iterable or async iterable of byte chunks into a Web ReadableStream.
81
+ */
82
+ public static fromAsyncIterable(iterable: AsyncIterable<Uint8Array> | Iterable<Uint8Array>): ReadableStream<Uint8Array> {
83
+ const iterator = DataStream.toAsyncGenerator(iterable);
84
+
85
+ return new ReadableStream<Uint8Array>({
86
+ async pull(controller): Promise<void> {
87
+ const result = await iterator.next();
88
+ if (result.done) {
89
+ controller.close();
90
+ } else {
91
+ controller.enqueue(result.value);
92
+ }
93
+ },
94
+
95
+ async cancel(): Promise<void> {
96
+ await iterator.return(undefined);
97
+ }
98
+ });
99
+ }
100
+
79
101
  /**
80
102
  * Creates a readable stream from the object given.
81
103
  */
@@ -106,6 +128,12 @@ export class DataStream {
106
128
  }
107
129
  }
108
130
 
131
+ private static async * toAsyncGenerator<T>(iterable: AsyncIterable<T> | Iterable<T>): AsyncGenerator<T> {
132
+ for await (const item of iterable) {
133
+ yield item;
134
+ }
135
+ }
136
+
109
137
  /**
110
138
  * Duplicates the given data stream into the number of streams specified so that multiple handlers can consume the same data stream.
111
139
  * Uses the native `ReadableStream.tee()` method for 2 copies, or a custom fan-out for N copies.
@@ -133,4 +161,4 @@ export class DataStream {
133
161
 
134
162
  return streams;
135
163
  }
136
- }
164
+ }