@uploadista/core 0.0.2 → 0.0.3

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 (329) hide show
  1. package/.turbo/turbo-build.log +88 -1
  2. package/README.md +6 -20
  3. package/dist/checksum-C5qE-5eg.js +2 -0
  4. package/dist/checksum-C5qE-5eg.js.map +1 -0
  5. package/dist/checksum-wSBuXX84.cjs +1 -0
  6. package/dist/errors/index.cjs +1 -1
  7. package/dist/errors/index.d.cts +2 -2
  8. package/dist/errors/index.d.ts +3 -3
  9. package/dist/errors/index.js +1 -2
  10. package/dist/flow/index.cjs +1 -1
  11. package/dist/flow/index.d.cts +5 -5
  12. package/dist/flow/index.d.ts +6 -24
  13. package/dist/flow/index.js +1 -24
  14. package/dist/flow-B0mMJM5Y.js +2 -0
  15. package/dist/flow-B0mMJM5Y.js.map +1 -0
  16. package/dist/flow-s5bgJsdb.cjs +1 -0
  17. package/dist/index-0xq1cArb.d.cts +4132 -0
  18. package/dist/index-0xq1cArb.d.cts.map +1 -0
  19. package/dist/index-B46hb7yB.d.cts +36 -0
  20. package/dist/index-B46hb7yB.d.cts.map +1 -0
  21. package/dist/{streams/stream-limiter.d.cts → index-C1mxuUxK.d.ts} +3 -3
  22. package/dist/index-C1mxuUxK.d.ts.map +1 -0
  23. package/dist/index-DMJv8Tvo.d.ts +168 -0
  24. package/dist/index-DMJv8Tvo.d.ts.map +1 -0
  25. package/dist/index-GLPiXqj4.d.cts +168 -0
  26. package/dist/index-GLPiXqj4.d.cts.map +1 -0
  27. package/dist/index-YegzC0p1.d.ts +3952 -0
  28. package/dist/index-YegzC0p1.d.ts.map +1 -0
  29. package/dist/index.cjs +1 -1
  30. package/dist/index.d.cts +5 -5
  31. package/dist/index.d.ts +6 -5
  32. package/dist/index.js +1 -5
  33. package/dist/stream-limiter-CTuiXkcq.js +2 -0
  34. package/dist/{stream-limiter-CoWKv39w.js.map → stream-limiter-CTuiXkcq.js.map} +1 -1
  35. package/dist/stream-limiter-DYGG4t9f.cjs +1 -0
  36. package/dist/streams/index.cjs +1 -0
  37. package/dist/streams/index.d.cts +3 -0
  38. package/dist/streams/index.d.ts +3 -0
  39. package/dist/streams/index.js +1 -0
  40. package/dist/streams-BiD_pOPH.cjs +0 -0
  41. package/dist/streams-Bs3GDNKJ.js +1 -0
  42. package/dist/types/index.cjs +1 -1
  43. package/dist/types/index.d.cts +5 -5
  44. package/dist/types/index.d.ts +6 -10
  45. package/dist/types/index.js +1 -9
  46. package/dist/types-Dj9g8ocl.cjs +1 -0
  47. package/dist/types-m26wrG-Z.js +2 -0
  48. package/dist/types-m26wrG-Z.js.map +1 -0
  49. package/dist/upload/index.cjs +1 -1
  50. package/dist/upload/index.d.cts +5 -5
  51. package/dist/upload/index.d.ts +6 -4
  52. package/dist/upload/index.js +1 -3
  53. package/dist/upload-BzU7ifyH.js +2 -0
  54. package/dist/upload-BzU7ifyH.js.map +1 -0
  55. package/dist/upload-DvLp6TXO.cjs +1 -0
  56. package/dist/uploadista-error-CAtkQiAv.d.cts +221 -0
  57. package/dist/uploadista-error-CAtkQiAv.d.cts.map +1 -0
  58. package/dist/{uploadista-error-BVsVxqvz.js → uploadista-error-CjfcFnVa.js} +9 -2
  59. package/dist/uploadista-error-CjfcFnVa.js.map +1 -0
  60. package/dist/uploadista-error-D9SONF9K.d.ts +221 -0
  61. package/dist/uploadista-error-D9SONF9K.d.ts.map +1 -0
  62. package/dist/{uploadista-error-BB-Wdiz9.cjs → uploadista-error-DdTP-Rjx.cjs} +9 -2
  63. package/dist/utils/index.cjs +1 -0
  64. package/dist/utils/index.d.cts +3 -0
  65. package/dist/utils/index.d.ts +3 -0
  66. package/dist/utils/index.js +1 -0
  67. package/dist/utils-BILytQlb.js +2 -0
  68. package/dist/utils-BILytQlb.js.map +1 -0
  69. package/dist/utils-BLsIUd8c.cjs +1 -0
  70. package/package.json +12 -16
  71. package/src/index.ts +2 -0
  72. package/src/streams/index.ts +1 -0
  73. package/src/utils/index.ts +5 -0
  74. package/tsdown.config.ts +2 -10
  75. package/dist/chunk-CUT6urMc.cjs +0 -1
  76. package/dist/debounce-C2SeqcxD.js +0 -2
  77. package/dist/debounce-C2SeqcxD.js.map +0 -1
  78. package/dist/debounce-LZK7yS7Z.cjs +0 -1
  79. package/dist/errors/index.d.ts.map +0 -1
  80. package/dist/errors/uploadista-error.d.ts +0 -209
  81. package/dist/errors/uploadista-error.d.ts.map +0 -1
  82. package/dist/errors/uploadista-error.js +0 -322
  83. package/dist/flow/edge.d.ts +0 -47
  84. package/dist/flow/edge.d.ts.map +0 -1
  85. package/dist/flow/edge.js +0 -40
  86. package/dist/flow/event.d.ts +0 -206
  87. package/dist/flow/event.d.ts.map +0 -1
  88. package/dist/flow/event.js +0 -53
  89. package/dist/flow/flow-server.d.ts +0 -223
  90. package/dist/flow/flow-server.d.ts.map +0 -1
  91. package/dist/flow/flow-server.js +0 -614
  92. package/dist/flow/flow.d.ts +0 -238
  93. package/dist/flow/flow.d.ts.map +0 -1
  94. package/dist/flow/flow.js +0 -629
  95. package/dist/flow/index.d.ts.map +0 -1
  96. package/dist/flow/node.d.ts +0 -136
  97. package/dist/flow/node.d.ts.map +0 -1
  98. package/dist/flow/node.js +0 -153
  99. package/dist/flow/nodes/index.d.ts +0 -8
  100. package/dist/flow/nodes/index.d.ts.map +0 -1
  101. package/dist/flow/nodes/index.js +0 -7
  102. package/dist/flow/nodes/input-node.d.ts +0 -78
  103. package/dist/flow/nodes/input-node.d.ts.map +0 -1
  104. package/dist/flow/nodes/input-node.js +0 -233
  105. package/dist/flow/nodes/storage-node.d.ts +0 -67
  106. package/dist/flow/nodes/storage-node.d.ts.map +0 -1
  107. package/dist/flow/nodes/storage-node.js +0 -94
  108. package/dist/flow/nodes/streaming-input-node.d.ts +0 -69
  109. package/dist/flow/nodes/streaming-input-node.d.ts.map +0 -1
  110. package/dist/flow/nodes/streaming-input-node.js +0 -156
  111. package/dist/flow/nodes/transform-node.d.ts +0 -85
  112. package/dist/flow/nodes/transform-node.d.ts.map +0 -1
  113. package/dist/flow/nodes/transform-node.js +0 -107
  114. package/dist/flow/parallel-scheduler.d.ts +0 -175
  115. package/dist/flow/parallel-scheduler.d.ts.map +0 -1
  116. package/dist/flow/parallel-scheduler.js +0 -193
  117. package/dist/flow/plugins/credential-provider.d.ts +0 -47
  118. package/dist/flow/plugins/credential-provider.d.ts.map +0 -1
  119. package/dist/flow/plugins/credential-provider.js +0 -24
  120. package/dist/flow/plugins/image-ai-plugin.d.ts +0 -61
  121. package/dist/flow/plugins/image-ai-plugin.d.ts.map +0 -1
  122. package/dist/flow/plugins/image-ai-plugin.js +0 -21
  123. package/dist/flow/plugins/image-plugin.d.ts +0 -52
  124. package/dist/flow/plugins/image-plugin.d.ts.map +0 -1
  125. package/dist/flow/plugins/image-plugin.js +0 -22
  126. package/dist/flow/plugins/types/describe-image-node.d.ts +0 -16
  127. package/dist/flow/plugins/types/describe-image-node.d.ts.map +0 -1
  128. package/dist/flow/plugins/types/describe-image-node.js +0 -9
  129. package/dist/flow/plugins/types/index.d.ts +0 -9
  130. package/dist/flow/plugins/types/index.d.ts.map +0 -1
  131. package/dist/flow/plugins/types/index.js +0 -8
  132. package/dist/flow/plugins/types/optimize-node.d.ts +0 -20
  133. package/dist/flow/plugins/types/optimize-node.d.ts.map +0 -1
  134. package/dist/flow/plugins/types/optimize-node.js +0 -11
  135. package/dist/flow/plugins/types/remove-background-node.d.ts +0 -16
  136. package/dist/flow/plugins/types/remove-background-node.d.ts.map +0 -1
  137. package/dist/flow/plugins/types/remove-background-node.js +0 -9
  138. package/dist/flow/plugins/types/resize-node.d.ts +0 -21
  139. package/dist/flow/plugins/types/resize-node.d.ts.map +0 -1
  140. package/dist/flow/plugins/types/resize-node.js +0 -16
  141. package/dist/flow/plugins/zip-plugin.d.ts +0 -62
  142. package/dist/flow/plugins/zip-plugin.d.ts.map +0 -1
  143. package/dist/flow/plugins/zip-plugin.js +0 -21
  144. package/dist/flow/typed-flow.d.ts +0 -90
  145. package/dist/flow/typed-flow.d.ts.map +0 -1
  146. package/dist/flow/typed-flow.js +0 -59
  147. package/dist/flow/types/flow-file.d.ts +0 -45
  148. package/dist/flow/types/flow-file.d.ts.map +0 -1
  149. package/dist/flow/types/flow-file.js +0 -27
  150. package/dist/flow/types/flow-job.d.ts +0 -118
  151. package/dist/flow/types/flow-job.d.ts.map +0 -1
  152. package/dist/flow/types/flow-job.js +0 -11
  153. package/dist/flow/types/flow-types.d.ts +0 -321
  154. package/dist/flow/types/flow-types.d.ts.map +0 -1
  155. package/dist/flow/types/flow-types.js +0 -52
  156. package/dist/flow/types/index.d.ts +0 -4
  157. package/dist/flow/types/index.d.ts.map +0 -1
  158. package/dist/flow/types/index.js +0 -3
  159. package/dist/flow/types/run-args.d.ts +0 -38
  160. package/dist/flow/types/run-args.d.ts.map +0 -1
  161. package/dist/flow/types/run-args.js +0 -30
  162. package/dist/flow/types/type-validator.d.ts +0 -26
  163. package/dist/flow/types/type-validator.d.ts.map +0 -1
  164. package/dist/flow/types/type-validator.js +0 -134
  165. package/dist/flow/utils/resolve-upload-metadata.d.ts +0 -11
  166. package/dist/flow/utils/resolve-upload-metadata.d.ts.map +0 -1
  167. package/dist/flow/utils/resolve-upload-metadata.js +0 -28
  168. package/dist/flow-2zXnEiWL.cjs +0 -1
  169. package/dist/flow-CRaKy7Vj.js +0 -2
  170. package/dist/flow-CRaKy7Vj.js.map +0 -1
  171. package/dist/generate-id-Dm-Vboxq.d.ts +0 -34
  172. package/dist/generate-id-Dm-Vboxq.d.ts.map +0 -1
  173. package/dist/generate-id-LjJRLD6N.d.cts +0 -34
  174. package/dist/generate-id-LjJRLD6N.d.cts.map +0 -1
  175. package/dist/generate-id-xHp_Z7Cl.cjs +0 -1
  176. package/dist/generate-id-yohS1ZDk.js +0 -2
  177. package/dist/generate-id-yohS1ZDk.js.map +0 -1
  178. package/dist/index-BO8GZlbD.d.cts +0 -1040
  179. package/dist/index-BO8GZlbD.d.cts.map +0 -1
  180. package/dist/index-D-CoVpkZ.d.ts +0 -1004
  181. package/dist/index-D-CoVpkZ.d.ts.map +0 -1
  182. package/dist/index.d.ts.map +0 -1
  183. package/dist/logger/logger.cjs +0 -1
  184. package/dist/logger/logger.d.cts +0 -8
  185. package/dist/logger/logger.d.cts.map +0 -1
  186. package/dist/logger/logger.d.ts +0 -5
  187. package/dist/logger/logger.d.ts.map +0 -1
  188. package/dist/logger/logger.js +0 -10
  189. package/dist/logger/logger.js.map +0 -1
  190. package/dist/semaphore-0ZwjVpyF.js +0 -2
  191. package/dist/semaphore-0ZwjVpyF.js.map +0 -1
  192. package/dist/semaphore-BHprIjFI.d.cts +0 -37
  193. package/dist/semaphore-BHprIjFI.d.cts.map +0 -1
  194. package/dist/semaphore-DThupBkc.d.ts +0 -37
  195. package/dist/semaphore-DThupBkc.d.ts.map +0 -1
  196. package/dist/semaphore-DVrONiAV.cjs +0 -1
  197. package/dist/stream-limiter-CoWKv39w.js +0 -2
  198. package/dist/stream-limiter-JgOwmkMa.cjs +0 -1
  199. package/dist/streams/multi-stream.cjs +0 -1
  200. package/dist/streams/multi-stream.d.cts +0 -91
  201. package/dist/streams/multi-stream.d.cts.map +0 -1
  202. package/dist/streams/multi-stream.d.ts +0 -86
  203. package/dist/streams/multi-stream.d.ts.map +0 -1
  204. package/dist/streams/multi-stream.js +0 -149
  205. package/dist/streams/multi-stream.js.map +0 -1
  206. package/dist/streams/stream-limiter.cjs +0 -1
  207. package/dist/streams/stream-limiter.d.cts.map +0 -1
  208. package/dist/streams/stream-limiter.d.ts +0 -27
  209. package/dist/streams/stream-limiter.d.ts.map +0 -1
  210. package/dist/streams/stream-limiter.js +0 -49
  211. package/dist/streams/stream-splitter.cjs +0 -1
  212. package/dist/streams/stream-splitter.d.cts +0 -68
  213. package/dist/streams/stream-splitter.d.cts.map +0 -1
  214. package/dist/streams/stream-splitter.d.ts +0 -51
  215. package/dist/streams/stream-splitter.d.ts.map +0 -1
  216. package/dist/streams/stream-splitter.js +0 -175
  217. package/dist/streams/stream-splitter.js.map +0 -1
  218. package/dist/types/data-store-registry.d.ts +0 -13
  219. package/dist/types/data-store-registry.d.ts.map +0 -1
  220. package/dist/types/data-store-registry.js +0 -4
  221. package/dist/types/data-store.d.ts +0 -316
  222. package/dist/types/data-store.d.ts.map +0 -1
  223. package/dist/types/data-store.js +0 -157
  224. package/dist/types/event-broadcaster.d.ts +0 -28
  225. package/dist/types/event-broadcaster.d.ts.map +0 -1
  226. package/dist/types/event-broadcaster.js +0 -6
  227. package/dist/types/event-emitter.d.ts +0 -378
  228. package/dist/types/event-emitter.d.ts.map +0 -1
  229. package/dist/types/event-emitter.js +0 -223
  230. package/dist/types/index.d.ts.map +0 -1
  231. package/dist/types/input-file.d.ts +0 -104
  232. package/dist/types/input-file.d.ts.map +0 -1
  233. package/dist/types/input-file.js +0 -27
  234. package/dist/types/kv-store.d.ts +0 -281
  235. package/dist/types/kv-store.d.ts.map +0 -1
  236. package/dist/types/kv-store.js +0 -234
  237. package/dist/types/middleware.d.ts +0 -17
  238. package/dist/types/middleware.d.ts.map +0 -1
  239. package/dist/types/middleware.js +0 -21
  240. package/dist/types/upload-event.d.ts +0 -105
  241. package/dist/types/upload-event.d.ts.map +0 -1
  242. package/dist/types/upload-event.js +0 -71
  243. package/dist/types/upload-file.d.ts +0 -136
  244. package/dist/types/upload-file.d.ts.map +0 -1
  245. package/dist/types/upload-file.js +0 -34
  246. package/dist/types/websocket.d.ts +0 -144
  247. package/dist/types/websocket.d.ts.map +0 -1
  248. package/dist/types/websocket.js +0 -40
  249. package/dist/types-BT-cvi7T.cjs +0 -1
  250. package/dist/types-DhU2j-XF.js +0 -2
  251. package/dist/types-DhU2j-XF.js.map +0 -1
  252. package/dist/upload/convert-to-stream.d.ts +0 -38
  253. package/dist/upload/convert-to-stream.d.ts.map +0 -1
  254. package/dist/upload/convert-to-stream.js +0 -43
  255. package/dist/upload/convert-upload-to-flow-file.d.ts +0 -14
  256. package/dist/upload/convert-upload-to-flow-file.d.ts.map +0 -1
  257. package/dist/upload/convert-upload-to-flow-file.js +0 -21
  258. package/dist/upload/create-upload.d.ts +0 -68
  259. package/dist/upload/create-upload.d.ts.map +0 -1
  260. package/dist/upload/create-upload.js +0 -157
  261. package/dist/upload/index.d.ts.map +0 -1
  262. package/dist/upload/mime.d.ts +0 -24
  263. package/dist/upload/mime.d.ts.map +0 -1
  264. package/dist/upload/mime.js +0 -351
  265. package/dist/upload/upload-chunk.d.ts +0 -58
  266. package/dist/upload/upload-chunk.d.ts.map +0 -1
  267. package/dist/upload/upload-chunk.js +0 -277
  268. package/dist/upload/upload-server.d.ts +0 -221
  269. package/dist/upload/upload-server.d.ts.map +0 -1
  270. package/dist/upload/upload-server.js +0 -181
  271. package/dist/upload/upload-strategy-negotiator.d.ts +0 -148
  272. package/dist/upload/upload-strategy-negotiator.d.ts.map +0 -1
  273. package/dist/upload/upload-strategy-negotiator.js +0 -217
  274. package/dist/upload/upload-url.d.ts +0 -68
  275. package/dist/upload/upload-url.d.ts.map +0 -1
  276. package/dist/upload/upload-url.js +0 -142
  277. package/dist/upload/write-to-store.d.ts +0 -77
  278. package/dist/upload/write-to-store.d.ts.map +0 -1
  279. package/dist/upload/write-to-store.js +0 -147
  280. package/dist/upload-DLuICjpP.cjs +0 -1
  281. package/dist/upload-DaXO34dE.js +0 -2
  282. package/dist/upload-DaXO34dE.js.map +0 -1
  283. package/dist/uploadista-error-BVsVxqvz.js.map +0 -1
  284. package/dist/uploadista-error-CwxYs4EB.d.ts +0 -52
  285. package/dist/uploadista-error-CwxYs4EB.d.ts.map +0 -1
  286. package/dist/uploadista-error-kKlhLRhY.d.cts +0 -52
  287. package/dist/uploadista-error-kKlhLRhY.d.cts.map +0 -1
  288. package/dist/utils/checksum.d.ts +0 -22
  289. package/dist/utils/checksum.d.ts.map +0 -1
  290. package/dist/utils/checksum.js +0 -49
  291. package/dist/utils/debounce.cjs +0 -1
  292. package/dist/utils/debounce.d.cts +0 -38
  293. package/dist/utils/debounce.d.cts.map +0 -1
  294. package/dist/utils/debounce.d.ts +0 -36
  295. package/dist/utils/debounce.d.ts.map +0 -1
  296. package/dist/utils/debounce.js +0 -73
  297. package/dist/utils/generate-id.cjs +0 -1
  298. package/dist/utils/generate-id.d.cts +0 -2
  299. package/dist/utils/generate-id.d.ts +0 -32
  300. package/dist/utils/generate-id.d.ts.map +0 -1
  301. package/dist/utils/generate-id.js +0 -23
  302. package/dist/utils/md5.cjs +0 -1
  303. package/dist/utils/md5.d.cts +0 -73
  304. package/dist/utils/md5.d.cts.map +0 -1
  305. package/dist/utils/md5.d.ts +0 -71
  306. package/dist/utils/md5.d.ts.map +0 -1
  307. package/dist/utils/md5.js +0 -417
  308. package/dist/utils/md5.js.map +0 -1
  309. package/dist/utils/once.cjs +0 -1
  310. package/dist/utils/once.d.cts +0 -25
  311. package/dist/utils/once.d.cts.map +0 -1
  312. package/dist/utils/once.d.ts +0 -21
  313. package/dist/utils/once.d.ts.map +0 -1
  314. package/dist/utils/once.js +0 -54
  315. package/dist/utils/once.js.map +0 -1
  316. package/dist/utils/semaphore.cjs +0 -1
  317. package/dist/utils/semaphore.d.cts +0 -3
  318. package/dist/utils/semaphore.d.ts +0 -78
  319. package/dist/utils/semaphore.d.ts.map +0 -1
  320. package/dist/utils/semaphore.js +0 -134
  321. package/dist/utils/throttle.cjs +0 -1
  322. package/dist/utils/throttle.d.cts +0 -24
  323. package/dist/utils/throttle.d.cts.map +0 -1
  324. package/dist/utils/throttle.d.ts +0 -18
  325. package/dist/utils/throttle.d.ts.map +0 -1
  326. package/dist/utils/throttle.js +0 -20
  327. package/dist/utils/throttle.js.map +0 -1
  328. package/src/logger/logger.ts +0 -14
  329. /package/dist/{errors-CRm1FHHT.cjs → errors-D-K-vxsP.cjs} +0 -0
@@ -1,49 +0,0 @@
1
- import { Effect, Ref, Stream } from "effect";
2
- import { UploadistaError } from "../errors/uploadista-error";
3
- export function streamLimiter({ maxSize, onData, }) {
4
- let currentSize = 0;
5
- return new TransformStream({
6
- transform(chunk, controller) {
7
- currentSize += chunk.length;
8
- onData?.(chunk.byteLength);
9
- if (currentSize > maxSize) {
10
- controller.error(UploadistaError.fromCode("ERR_MAX_SIZE_EXCEEDED"));
11
- }
12
- else {
13
- controller.enqueue(chunk);
14
- }
15
- },
16
- });
17
- }
18
- /**
19
- * Effect-based stream limiter that restricts stream size
20
- */
21
- export const StreamLimiterEffect = {
22
- /**
23
- * Creates an Effect-based stream limiter
24
- * @param maxSize - Maximum allowed stream size in bytes
25
- * @param onData - Optional callback for data progress tracking
26
- * @returns Effect stream transformation that enforces size limits
27
- */
28
- limit: ({ maxSize, onData }) => (stream) => {
29
- return Effect.gen(function* () {
30
- const currentSize = yield* Ref.make(0);
31
- return stream.pipe(Stream.mapEffect((chunk) => Effect.gen(function* () {
32
- const chunkSize = chunk instanceof Uint8Array ? chunk.byteLength : 0;
33
- yield* Ref.update(currentSize, (size) => size + chunkSize);
34
- onData?.(chunkSize);
35
- const size = yield* Ref.get(currentSize);
36
- if (size > maxSize) {
37
- yield* UploadistaError.fromCode("ERR_MAX_SIZE_EXCEEDED").toEffect();
38
- }
39
- return chunk;
40
- })));
41
- }).pipe(Stream.unwrap);
42
- },
43
- /**
44
- * Creates a legacy TransformStream-based limiter
45
- * @param options - Stream limiter options
46
- * @returns TransformStream that enforces size limits
47
- */
48
- createTransformStream: (options) => streamLimiter(options),
49
- };
@@ -1 +0,0 @@
1
- const e=require(`../chunk-CUT6urMc.cjs`),t=require(`../uploadista-error-BB-Wdiz9.cjs`);let n=require(`effect`);n=e.__toESM(n);function r(e){let t=new Uint8Array(e.reduce((e,t)=>e+t.length,0)),n=0;for(let r of e)t.set(r,n),n+=r.length;return t}async function i(e,{onData:t,onChunkError:n,onChunkStarted:i,onChunkCompleted:a,options:{chunkSize:o}}){let s=e.getReader(),c=1,l=[],u=0;try{for(;;){let{done:e,value:n}=await s.read();if(t?.(n?.byteLength??0),e){if(u>0){i(c);let e=r(l);a({partNumber:c,stream:e,size:e.length})}break}let d=n;for(;d.length>0;){let e=o-u;if(d.length<=e){l.push(d),u+=d.length;break}else{let t=d.slice(0,e);l.push(t),u+=t.length,i(c);let n=r(l);a({partNumber:c,stream:n,size:n.length}),c+=1,l=[],u=0,d=d.slice(e)}}}}catch(e){throw n(c,e),e}finally{s.releaseLock()}}const a={split:({chunkSize:e,onChunkStarted:i,onChunkCompleted:a,onChunkError:o,onData:s})=>c=>n.Effect.gen(function*(){let l=yield*n.Ref.make({partNumber:1,buffer:[],bufferSize:0});return c.pipe(n.Stream.mapEffect(t=>n.Effect.gen(function*(){s&&(yield*n.Effect.sync(()=>s(t.byteLength)));let o=t,c=[];for(;o.length>0;){let t=yield*n.Ref.get(l),s=e-t.bufferSize;if(o.length<=s){yield*n.Ref.update(l,e=>({...e,buffer:[...e.buffer,o],bufferSize:e.bufferSize+o.length}));break}else{let e=o.slice(0,s),u=[...t.buffer,e];yield*n.Effect.sync(()=>i(t.partNumber));let d=r(u),f={partNumber:t.partNumber,stream:d,size:d.length};yield*n.Effect.sync(()=>a(f)),c.push(f),yield*n.Ref.set(l,{partNumber:t.partNumber+1,buffer:[],bufferSize:0}),o=o.slice(s)}}return c})),n.Stream.flatMap(e=>n.Stream.fromIterable(e)),n.Stream.concat(n.Stream.fromEffect((()=>n.Effect.gen(function*(){let e=yield*n.Ref.get(l);if(e.bufferSize===0)return[];yield*n.Effect.sync(()=>i(e.partNumber));let t=r(e.buffer),o={partNumber:e.partNumber,stream:t,size:t.length};return yield*n.Effect.sync(()=>a(o)),[o]}))()).pipe(n.Stream.flatMap(e=>n.Stream.fromIterable(e)))),n.Stream.tapError(e=>n.Effect.sync(()=>o(1,e))),n.Stream.mapError(e=>new t.UploadistaError({code:`UNKNOWN_ERROR`,status:500,body:`Stream splitting failed`,details:`Stream splitting failed: ${String(e)}`})))}).pipe(n.Stream.unwrap),fromReadableStream:(e,r)=>n.Effect.tryPromise({try:()=>i(e,r),catch:e=>new t.UploadistaError({code:`UNKNOWN_ERROR`,status:500,body:`Stream splitter failed`,details:`Stream splitter failed: ${String(e)}`})})};exports.StreamSplitterEffect=a,exports.streamSplitter=i;
@@ -1,68 +0,0 @@
1
- import { UploadistaError } from "../uploadista-error-kKlhLRhY.cjs";
2
- import { Effect, Stream } from "effect";
3
-
4
- //#region src/streams/stream-splitter.d.ts
5
- type Options = {
6
- chunkSize: number;
7
- };
8
- type ChunkInfo = {
9
- partNumber: number;
10
- stream: Uint8Array;
11
- size: number;
12
- };
13
- type EventHandlers = {
14
- onData?: (chunkSize: number) => void;
15
- onChunkStarted: (partNumber: number) => void;
16
- onChunkCompleted: (chunkInfo: ChunkInfo) => void;
17
- onChunkError: (partNumber: number, error: unknown) => void;
18
- };
19
- declare function streamSplitter(readStream: ReadableStream<Uint8Array>, {
20
- onData,
21
- onChunkError,
22
- onChunkStarted,
23
- onChunkCompleted,
24
- options: {
25
- chunkSize
26
- }
27
- }: EventHandlers & {
28
- options: Options;
29
- }): Promise<void>;
30
- /**
31
- * Effect-based stream splitter that splits a stream into chunks of specified size
32
- */
33
- declare const StreamSplitterEffect: {
34
- /**
35
- * Splits an Effect stream into chunks of specified size using idiomatic Effect-TS patterns
36
- * @param chunkSize - Maximum size for each chunk in bytes
37
- * @param onChunkStarted - Callback when a new chunk starts processing
38
- * @param onChunkCompleted - Callback when a chunk is completed
39
- * @param onChunkError - Callback when a chunk encounters an error
40
- * @param onData - Optional callback for data progress
41
- * @returns Effect that splits the input stream
42
- */
43
- split: ({
44
- chunkSize,
45
- onChunkStarted,
46
- onChunkCompleted,
47
- onChunkError,
48
- onData
49
- }: {
50
- chunkSize: number;
51
- onChunkStarted: (partNumber: number) => void;
52
- onChunkCompleted: (chunkInfo: ChunkInfo) => void;
53
- onChunkError: (partNumber: number, error: unknown) => void;
54
- onData?: (chunkSize: number) => void;
55
- }) => <E>(stream: Stream.Stream<Uint8Array, E>) => Stream.Stream<ChunkInfo, E | UploadistaError>;
56
- /**
57
- * Creates a legacy stream splitter effect from ReadableStream
58
- * @param readStream - Input ReadableStream
59
- * @param handlers - Event handlers for chunk processing
60
- * @returns Effect that processes the stream
61
- */
62
- fromReadableStream: (readStream: ReadableStream<Uint8Array>, handlers: EventHandlers & {
63
- options: Options;
64
- }) => Effect.Effect<void, UploadistaError>;
65
- };
66
- //#endregion
67
- export { ChunkInfo, StreamSplitterEffect, streamSplitter };
68
- //# sourceMappingURL=stream-splitter.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stream-splitter.d.cts","names":[],"sources":["../../src/streams/stream-splitter.ts"],"sourcesContent":[],"mappings":";;;;KAGK,OAAA;;AAFwD,CAAA;AAMjD,KAAA,SAAA,GAAS;EAMhB,UAAA,EAAA,MAAa;EAiBI,MAAA,EArBZ,UAqB0B;EAAA,IAAA,EAAA,MAAA;;KAjB/B,aAAA,GAkBS;QAEV,CAAA,EAAA,CAAA,SAAA,EAAA,MAAA,EAAA,GAAA,IAAA;gBACA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,GAAA,IAAA;kBACA,EAAA,CAAA,SAAA,EAnB4B,SAmB5B,EAAA,GAAA,IAAA;cACA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,GAAA,IAAA;;AAEC,iBARiB,cAAA,CAQjB,UAAA,EAPS,cAOT,CAPwB,UAOxB,CAAA,EAAA;EAAA,MAAA;EAAA,YAAA;EAAA,cAAA;EAAA,gBAAA;EAAA,OAAA,EAAA;IAAA;EAAA;CAAA,EAAA,aAAA,GAAA;SAA2B,EAAA,OAAA;IAC7B,OAAA,CAAA,IAAA,CAAA;;AAyEH;;cAAa;;;;;;;;;;OA0BmB,EAAA,CAAA;IAAA,SAAA;IAAA,cAAA;IAAA,gBAAA;IAAA,YAAA;IAAA;GAAA,EAAA;IAAI,SAAA,EAAA,MAAA;IAA7B,cAAO,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,GAAA,IAAA;IAmHiB,gBAAA,EAAA,CAAA,SAAA,EAzHK,SAyHL,EAAA,GAAA,IAAA;IAAf,YAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,EAAA,GAAA,IAAA;IACF,MAAA,CAAA,EAAA,CAAA,SAAA,EAAA,MAAA,EAAA,GAAA,IAAA;KAA2B,GAAA,CAAA,CAAA,CAAA,CAAA,MAAA,EArH3B,MAAA,CAAO,MAqHoB,CArHb,UAqHa,EArHD,CAqHC,CAAA,EAAA,GApHlC,MAAA,CAAO,MAoH2B,CApHpB,SAoHoB,EApHT,CAoHS,GApHL,eAoHK,CAAA;;;;;;;mCADzB,eAAe,uBACjB;aAA2B;QACpC,MAAA,CAAO,aAAa"}
@@ -1,51 +0,0 @@
1
- import { Effect, Stream } from "effect";
2
- import { UploadistaError } from "../errors/uploadista-error";
3
- type Options = {
4
- chunkSize: number;
5
- };
6
- export type ChunkInfo = {
7
- partNumber: number;
8
- stream: Uint8Array;
9
- size: number;
10
- };
11
- type EventHandlers = {
12
- onData?: (chunkSize: number) => void;
13
- onChunkStarted: (partNumber: number) => void;
14
- onChunkCompleted: (chunkInfo: ChunkInfo) => void;
15
- onChunkError: (partNumber: number, error: unknown) => void;
16
- };
17
- export declare function streamSplitter(readStream: ReadableStream<Uint8Array>, { onData, onChunkError, onChunkStarted, onChunkCompleted, options: { chunkSize }, }: EventHandlers & {
18
- options: Options;
19
- }): Promise<void>;
20
- /**
21
- * Effect-based stream splitter that splits a stream into chunks of specified size
22
- */
23
- export declare const StreamSplitterEffect: {
24
- /**
25
- * Splits an Effect stream into chunks of specified size using idiomatic Effect-TS patterns
26
- * @param chunkSize - Maximum size for each chunk in bytes
27
- * @param onChunkStarted - Callback when a new chunk starts processing
28
- * @param onChunkCompleted - Callback when a chunk is completed
29
- * @param onChunkError - Callback when a chunk encounters an error
30
- * @param onData - Optional callback for data progress
31
- * @returns Effect that splits the input stream
32
- */
33
- split: ({ chunkSize, onChunkStarted, onChunkCompleted, onChunkError, onData, }: {
34
- chunkSize: number;
35
- onChunkStarted: (partNumber: number) => void;
36
- onChunkCompleted: (chunkInfo: ChunkInfo) => void;
37
- onChunkError: (partNumber: number, error: unknown) => void;
38
- onData?: (chunkSize: number) => void;
39
- }) => <E>(stream: Stream.Stream<Uint8Array, E>) => Stream.Stream<ChunkInfo, E | UploadistaError>;
40
- /**
41
- * Creates a legacy stream splitter effect from ReadableStream
42
- * @param readStream - Input ReadableStream
43
- * @param handlers - Event handlers for chunk processing
44
- * @returns Effect that processes the stream
45
- */
46
- fromReadableStream: (readStream: ReadableStream<Uint8Array>, handlers: EventHandlers & {
47
- options: Options;
48
- }) => Effect.Effect<void, UploadistaError>;
49
- };
50
- export {};
51
- //# sourceMappingURL=stream-splitter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stream-splitter.d.ts","sourceRoot":"","sources":["../../src/streams/stream-splitter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAO,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAE7D,KAAK,OAAO,GAAG;IACb,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,KAAK,aAAa,GAAG;IACnB,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,cAAc,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,gBAAgB,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,CAAC;IACjD,YAAY,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAC5D,CAAC;AAYF,wBAAsB,cAAc,CAClC,UAAU,EAAE,cAAc,CAAC,UAAU,CAAC,EACtC,EACE,MAAM,EACN,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,OAAO,EAAE,EAAE,SAAS,EAAE,GACvB,EAAE,aAAa,GAAG;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GACtC,OAAO,CAAC,IAAI,CAAC,CAoEf;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB;IAC/B;;;;;;;;OAQG;oFAQE;QACD,SAAS,EAAE,MAAM,CAAC;QAClB,cAAc,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;QAC7C,gBAAgB,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,CAAC;QACjD,YAAY,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;QAC3D,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;KACtC,MACA,CAAC,EACA,QAAQ,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,KACnC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,GAAG,eAAe,CAAC;IA4GlD;;;;;OAKG;qCAEW,cAAc,CAAC,UAAU,CAAC,YAC5B,aAAa,GAAG;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,KAC7C,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAAC;CAWxC,CAAC"}
@@ -1,175 +0,0 @@
1
- import { Effect, Ref, Stream } from "effect";
2
- import { UploadistaError } from "../errors/uploadista-error";
3
- function concatArrayBuffers(chunks) {
4
- const result = new Uint8Array(chunks.reduce((a, c) => a + c.length, 0));
5
- let offset = 0;
6
- for (const chunk of chunks) {
7
- result.set(chunk, offset);
8
- offset += chunk.length;
9
- }
10
- return result;
11
- }
12
- export async function streamSplitter(readStream, { onData, onChunkError, onChunkStarted, onChunkCompleted, options: { chunkSize }, }) {
13
- const reader = readStream.getReader();
14
- let part = 1;
15
- let currentPartChunks = [];
16
- let currentPartSize = 0;
17
- try {
18
- while (true) {
19
- const { done, value } = await reader.read();
20
- onData?.(value?.byteLength ?? 0);
21
- if (done) {
22
- // Process any remaining data
23
- if (currentPartSize > 0) {
24
- onChunkStarted(part);
25
- const stream = concatArrayBuffers(currentPartChunks);
26
- onChunkCompleted({
27
- partNumber: part,
28
- stream,
29
- size: stream.length,
30
- });
31
- }
32
- break;
33
- }
34
- let remaining = value;
35
- while (remaining.length > 0) {
36
- const spaceInCurrentPart = chunkSize - currentPartSize;
37
- if (remaining.length <= spaceInCurrentPart) {
38
- // All remaining data fits in current part
39
- currentPartChunks.push(remaining);
40
- currentPartSize += remaining.length;
41
- break;
42
- }
43
- else {
44
- // Need to split the data
45
- const partToTake = remaining.slice(0, spaceInCurrentPart);
46
- currentPartChunks.push(partToTake);
47
- currentPartSize += partToTake.length;
48
- // Complete current part
49
- onChunkStarted(part);
50
- const stream = concatArrayBuffers(currentPartChunks);
51
- onChunkCompleted({
52
- partNumber: part,
53
- stream,
54
- size: stream.length,
55
- });
56
- // Start new part
57
- part += 1;
58
- currentPartChunks = [];
59
- currentPartSize = 0;
60
- remaining = remaining.slice(spaceInCurrentPart);
61
- }
62
- }
63
- }
64
- }
65
- catch (error) {
66
- onChunkError(part, error);
67
- throw error;
68
- }
69
- finally {
70
- reader.releaseLock();
71
- }
72
- }
73
- /**
74
- * Effect-based stream splitter that splits a stream into chunks of specified size
75
- */
76
- export const StreamSplitterEffect = {
77
- /**
78
- * Splits an Effect stream into chunks of specified size using idiomatic Effect-TS patterns
79
- * @param chunkSize - Maximum size for each chunk in bytes
80
- * @param onChunkStarted - Callback when a new chunk starts processing
81
- * @param onChunkCompleted - Callback when a chunk is completed
82
- * @param onChunkError - Callback when a chunk encounters an error
83
- * @param onData - Optional callback for data progress
84
- * @returns Effect that splits the input stream
85
- */
86
- split: ({ chunkSize, onChunkStarted, onChunkCompleted, onChunkError, onData, }) => (stream) => {
87
- return Effect.gen(function* () {
88
- const stateRef = yield* Ref.make({
89
- partNumber: 1,
90
- buffer: [],
91
- bufferSize: 0,
92
- });
93
- const processChunkAndEmitCompleted = (chunk) => Effect.gen(function* () {
94
- // Report data progress
95
- if (onData) {
96
- yield* Effect.sync(() => onData(chunk.byteLength));
97
- }
98
- let remaining = chunk;
99
- const results = [];
100
- while (remaining.length > 0) {
101
- const state = yield* Ref.get(stateRef);
102
- const spaceAvailable = chunkSize - state.bufferSize;
103
- if (remaining.length <= spaceAvailable) {
104
- // All remaining data fits in current part
105
- yield* Ref.update(stateRef, (s) => ({
106
- ...s,
107
- buffer: [...s.buffer, remaining],
108
- bufferSize: s.bufferSize + remaining.length,
109
- }));
110
- break;
111
- }
112
- else {
113
- // Need to split the data - complete current part
114
- const partToTake = remaining.slice(0, spaceAvailable);
115
- const completeBuffer = [...state.buffer, partToTake];
116
- // Execute side effects in Effect context
117
- yield* Effect.sync(() => onChunkStarted(state.partNumber));
118
- const concatenatedStream = concatArrayBuffers(completeBuffer);
119
- const chunkInfo = {
120
- partNumber: state.partNumber,
121
- stream: concatenatedStream,
122
- size: concatenatedStream.length,
123
- };
124
- yield* Effect.sync(() => onChunkCompleted(chunkInfo));
125
- results.push(chunkInfo);
126
- // Start new part
127
- yield* Ref.set(stateRef, {
128
- partNumber: state.partNumber + 1,
129
- buffer: [],
130
- bufferSize: 0,
131
- });
132
- remaining = remaining.slice(spaceAvailable);
133
- }
134
- }
135
- return results;
136
- });
137
- const emitFinalChunk = () => Effect.gen(function* () {
138
- const finalState = yield* Ref.get(stateRef);
139
- if (finalState.bufferSize === 0) {
140
- return [];
141
- }
142
- yield* Effect.sync(() => onChunkStarted(finalState.partNumber));
143
- const concatenatedStream = concatArrayBuffers(finalState.buffer);
144
- const chunkInfo = {
145
- partNumber: finalState.partNumber,
146
- stream: concatenatedStream,
147
- size: concatenatedStream.length,
148
- };
149
- yield* Effect.sync(() => onChunkCompleted(chunkInfo));
150
- return [chunkInfo];
151
- });
152
- return stream.pipe(Stream.mapEffect(processChunkAndEmitCompleted), Stream.flatMap((chunkInfos) => Stream.fromIterable(chunkInfos)), Stream.concat(Stream.fromEffect(emitFinalChunk()).pipe(Stream.flatMap((chunkInfos) => Stream.fromIterable(chunkInfos)))), Stream.tapError((error) => Effect.sync(() => onChunkError(1, error))), Stream.mapError((error) => new UploadistaError({
153
- code: "UNKNOWN_ERROR",
154
- status: 500,
155
- body: "Stream splitting failed",
156
- details: `Stream splitting failed: ${String(error)}`,
157
- })));
158
- }).pipe(Stream.unwrap);
159
- },
160
- /**
161
- * Creates a legacy stream splitter effect from ReadableStream
162
- * @param readStream - Input ReadableStream
163
- * @param handlers - Event handlers for chunk processing
164
- * @returns Effect that processes the stream
165
- */
166
- fromReadableStream: (readStream, handlers) => Effect.tryPromise({
167
- try: () => streamSplitter(readStream, handlers),
168
- catch: (error) => new UploadistaError({
169
- code: "UNKNOWN_ERROR",
170
- status: 500,
171
- body: "Stream splitter failed",
172
- details: `Stream splitter failed: ${String(error)}`,
173
- }),
174
- }),
175
- };
@@ -1 +0,0 @@
1
- {"version":3,"file":"stream-splitter.js","names":["currentPartChunks: Uint8Array[]","results: ChunkInfo[]","chunkInfo: ChunkInfo"],"sources":["../../src/streams/stream-splitter.ts"],"sourcesContent":["import { Effect, Ref, Stream } from \"effect\";\nimport { UploadistaError } from \"../errors/uploadista-error\";\n\ntype Options = {\n chunkSize: number;\n};\n\nexport type ChunkInfo = {\n partNumber: number;\n stream: Uint8Array;\n size: number;\n};\n\ntype EventHandlers = {\n onData?: (chunkSize: number) => void;\n onChunkStarted: (partNumber: number) => void;\n onChunkCompleted: (chunkInfo: ChunkInfo) => void;\n onChunkError: (partNumber: number, error: unknown) => void;\n};\n\nfunction concatArrayBuffers(chunks: Uint8Array[]): Uint8Array {\n const result = new Uint8Array(chunks.reduce((a, c) => a + c.length, 0));\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n return result;\n}\n\nexport async function streamSplitter(\n readStream: ReadableStream<Uint8Array>,\n {\n onData,\n onChunkError,\n onChunkStarted,\n onChunkCompleted,\n options: { chunkSize },\n }: EventHandlers & { options: Options },\n): Promise<void> {\n const reader = readStream.getReader();\n\n let part = 1;\n let currentPartChunks: Uint8Array[] = [];\n let currentPartSize = 0;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n\n onData?.(value?.byteLength ?? 0);\n\n if (done) {\n // Process any remaining data\n if (currentPartSize > 0) {\n onChunkStarted(part);\n\n const stream = concatArrayBuffers(currentPartChunks);\n\n onChunkCompleted({\n partNumber: part,\n stream,\n size: stream.length,\n });\n }\n break;\n }\n\n let remaining = value;\n\n while (remaining.length > 0) {\n const spaceInCurrentPart = chunkSize - currentPartSize;\n\n if (remaining.length <= spaceInCurrentPart) {\n // All remaining data fits in current part\n currentPartChunks.push(remaining);\n currentPartSize += remaining.length;\n break;\n } else {\n // Need to split the data\n const partToTake = remaining.slice(0, spaceInCurrentPart);\n currentPartChunks.push(partToTake);\n currentPartSize += partToTake.length;\n\n // Complete current part\n onChunkStarted(part);\n const stream = concatArrayBuffers(currentPartChunks);\n onChunkCompleted({\n partNumber: part,\n stream,\n size: stream.length,\n });\n\n // Start new part\n part += 1;\n currentPartChunks = [];\n currentPartSize = 0;\n remaining = remaining.slice(spaceInCurrentPart);\n }\n }\n }\n } catch (error) {\n onChunkError(part, error);\n throw error;\n } finally {\n reader.releaseLock();\n }\n}\n\n/**\n * Effect-based stream splitter that splits a stream into chunks of specified size\n */\nexport const StreamSplitterEffect = {\n /**\n * Splits an Effect stream into chunks of specified size using idiomatic Effect-TS patterns\n * @param chunkSize - Maximum size for each chunk in bytes\n * @param onChunkStarted - Callback when a new chunk starts processing\n * @param onChunkCompleted - Callback when a chunk is completed\n * @param onChunkError - Callback when a chunk encounters an error\n * @param onData - Optional callback for data progress\n * @returns Effect that splits the input stream\n */\n split:\n ({\n chunkSize,\n onChunkStarted,\n onChunkCompleted,\n onChunkError,\n onData,\n }: {\n chunkSize: number;\n onChunkStarted: (partNumber: number) => void;\n onChunkCompleted: (chunkInfo: ChunkInfo) => void;\n onChunkError: (partNumber: number, error: unknown) => void;\n onData?: (chunkSize: number) => void;\n }) =>\n <E>(\n stream: Stream.Stream<Uint8Array, E>,\n ): Stream.Stream<ChunkInfo, E | UploadistaError> => {\n return Effect.gen(function* () {\n const stateRef = yield* Ref.make({\n partNumber: 1,\n buffer: [] as Uint8Array[],\n bufferSize: 0,\n });\n\n const processChunkAndEmitCompleted = (\n chunk: Uint8Array,\n ): Effect.Effect<ChunkInfo[], UploadistaError> =>\n Effect.gen(function* () {\n // Report data progress\n if (onData) {\n yield* Effect.sync(() => onData(chunk.byteLength));\n }\n\n let remaining = chunk;\n const results: ChunkInfo[] = [];\n\n while (remaining.length > 0) {\n const state = yield* Ref.get(stateRef);\n const spaceAvailable = chunkSize - state.bufferSize;\n\n if (remaining.length <= spaceAvailable) {\n // All remaining data fits in current part\n yield* Ref.update(stateRef, (s) => ({\n ...s,\n buffer: [...s.buffer, remaining],\n bufferSize: s.bufferSize + remaining.length,\n }));\n break;\n } else {\n // Need to split the data - complete current part\n const partToTake = remaining.slice(0, spaceAvailable);\n const completeBuffer = [...state.buffer, partToTake];\n\n // Execute side effects in Effect context\n yield* Effect.sync(() => onChunkStarted(state.partNumber));\n\n const concatenatedStream = concatArrayBuffers(completeBuffer);\n const chunkInfo: ChunkInfo = {\n partNumber: state.partNumber,\n stream: concatenatedStream,\n size: concatenatedStream.length,\n };\n\n yield* Effect.sync(() => onChunkCompleted(chunkInfo));\n results.push(chunkInfo);\n\n // Start new part\n yield* Ref.set(stateRef, {\n partNumber: state.partNumber + 1,\n buffer: [],\n bufferSize: 0,\n });\n remaining = remaining.slice(spaceAvailable);\n }\n }\n\n return results;\n });\n\n const emitFinalChunk = (): Effect.Effect<\n ChunkInfo[],\n UploadistaError\n > =>\n Effect.gen(function* () {\n const finalState = yield* Ref.get(stateRef);\n if (finalState.bufferSize === 0) {\n return [];\n }\n\n yield* Effect.sync(() => onChunkStarted(finalState.partNumber));\n\n const concatenatedStream = concatArrayBuffers(finalState.buffer);\n const chunkInfo: ChunkInfo = {\n partNumber: finalState.partNumber,\n stream: concatenatedStream,\n size: concatenatedStream.length,\n };\n\n yield* Effect.sync(() => onChunkCompleted(chunkInfo));\n return [chunkInfo];\n });\n\n return stream.pipe(\n Stream.mapEffect(processChunkAndEmitCompleted),\n Stream.flatMap((chunkInfos) => Stream.fromIterable(chunkInfos)),\n Stream.concat(\n Stream.fromEffect(emitFinalChunk()).pipe(\n Stream.flatMap((chunkInfos) => Stream.fromIterable(chunkInfos)),\n ),\n ),\n Stream.tapError((error) => Effect.sync(() => onChunkError(1, error))),\n Stream.mapError(\n (error) =>\n new UploadistaError({\n code: \"UNKNOWN_ERROR\",\n status: 500,\n body: \"Stream splitting failed\",\n details: `Stream splitting failed: ${String(error)}`,\n }),\n ),\n );\n }).pipe(Stream.unwrap);\n },\n\n /**\n * Creates a legacy stream splitter effect from ReadableStream\n * @param readStream - Input ReadableStream\n * @param handlers - Event handlers for chunk processing\n * @returns Effect that processes the stream\n */\n fromReadableStream: (\n readStream: ReadableStream<Uint8Array>,\n handlers: EventHandlers & { options: Options },\n ): Effect.Effect<void, UploadistaError> =>\n Effect.tryPromise({\n try: () => streamSplitter(readStream, handlers),\n catch: (error) =>\n new UploadistaError({\n code: \"UNKNOWN_ERROR\",\n status: 500,\n body: \"Stream splitter failed\",\n details: `Stream splitter failed: ${String(error)}`,\n }),\n }),\n};\n"],"mappings":"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"}
@@ -1,13 +0,0 @@
1
- import { Context, type Effect } from "effect";
2
- import type { UploadistaError } from "../errors";
3
- import type { DataStore } from "./data-store";
4
- import type { UploadFile } from "./upload-file";
5
- declare const DataStoreRegistry_base: Context.TagClass<DataStoreRegistry, "DataStoreRegistry", {
6
- readonly register: <T extends DataStore<UploadFile>>(id: string, store: Effect.Effect<T, UploadistaError>) => Effect.Effect<void, never>;
7
- readonly get: (id: string) => Effect.Effect<DataStore<UploadFile>, UploadistaError>;
8
- readonly list: () => Effect.Effect<Array<string>, never>;
9
- }>;
10
- export declare class DataStoreRegistry extends DataStoreRegistry_base {
11
- }
12
- export {};
13
- //# sourceMappingURL=data-store-registry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"data-store-registry.d.ts","sourceRoot":"","sources":["../../src/types/data-store-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;;uBAMzB,CAAC,CAAC,SAAS,SAAS,CAAC,UAAU,CAAC,EACjD,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,eAAe,CAAC,KACrC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;kBACjB,CACZ,EAAE,EAAE,MAAM,KACP,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,eAAe,CAAC;mBAC3C,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC;;AAV5D,qBAAa,iBAAkB,SAAQ,sBAYpC;CAAG"}
@@ -1,4 +0,0 @@
1
- import { Context } from "effect";
2
- // Data Store Registry service for managing multiple data stores
3
- export class DataStoreRegistry extends Context.Tag("DataStoreRegistry")() {
4
- }