@uploadista/core 0.0.2

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 (359) hide show
  1. package/.turbo/turbo-build.log +5 -0
  2. package/.turbo/turbo-check.log +231 -0
  3. package/.turbo/turbo-format.log +5 -0
  4. package/LICENSE +21 -0
  5. package/README.md +1120 -0
  6. package/dist/chunk-CUT6urMc.cjs +1 -0
  7. package/dist/debounce-C2SeqcxD.js +2 -0
  8. package/dist/debounce-C2SeqcxD.js.map +1 -0
  9. package/dist/debounce-LZK7yS7Z.cjs +1 -0
  10. package/dist/errors/index.cjs +1 -0
  11. package/dist/errors/index.d.cts +3 -0
  12. package/dist/errors/index.d.ts +3 -0
  13. package/dist/errors/index.d.ts.map +1 -0
  14. package/dist/errors/index.js +2 -0
  15. package/dist/errors/uploadista-error.d.ts +209 -0
  16. package/dist/errors/uploadista-error.d.ts.map +1 -0
  17. package/dist/errors/uploadista-error.js +322 -0
  18. package/dist/errors-8i_aMxOE.js +1 -0
  19. package/dist/errors-CRm1FHHT.cjs +0 -0
  20. package/dist/flow/edge.d.ts +47 -0
  21. package/dist/flow/edge.d.ts.map +1 -0
  22. package/dist/flow/edge.js +40 -0
  23. package/dist/flow/event.d.ts +206 -0
  24. package/dist/flow/event.d.ts.map +1 -0
  25. package/dist/flow/event.js +53 -0
  26. package/dist/flow/flow-server.d.ts +223 -0
  27. package/dist/flow/flow-server.d.ts.map +1 -0
  28. package/dist/flow/flow-server.js +614 -0
  29. package/dist/flow/flow.d.ts +238 -0
  30. package/dist/flow/flow.d.ts.map +1 -0
  31. package/dist/flow/flow.js +629 -0
  32. package/dist/flow/index.cjs +1 -0
  33. package/dist/flow/index.d.cts +6 -0
  34. package/dist/flow/index.d.ts +24 -0
  35. package/dist/flow/index.d.ts.map +1 -0
  36. package/dist/flow/index.js +24 -0
  37. package/dist/flow/node.d.ts +136 -0
  38. package/dist/flow/node.d.ts.map +1 -0
  39. package/dist/flow/node.js +153 -0
  40. package/dist/flow/nodes/index.d.ts +8 -0
  41. package/dist/flow/nodes/index.d.ts.map +1 -0
  42. package/dist/flow/nodes/index.js +7 -0
  43. package/dist/flow/nodes/input-node.d.ts +78 -0
  44. package/dist/flow/nodes/input-node.d.ts.map +1 -0
  45. package/dist/flow/nodes/input-node.js +233 -0
  46. package/dist/flow/nodes/storage-node.d.ts +67 -0
  47. package/dist/flow/nodes/storage-node.d.ts.map +1 -0
  48. package/dist/flow/nodes/storage-node.js +94 -0
  49. package/dist/flow/nodes/streaming-input-node.d.ts +69 -0
  50. package/dist/flow/nodes/streaming-input-node.d.ts.map +1 -0
  51. package/dist/flow/nodes/streaming-input-node.js +156 -0
  52. package/dist/flow/nodes/transform-node.d.ts +85 -0
  53. package/dist/flow/nodes/transform-node.d.ts.map +1 -0
  54. package/dist/flow/nodes/transform-node.js +107 -0
  55. package/dist/flow/parallel-scheduler.d.ts +175 -0
  56. package/dist/flow/parallel-scheduler.d.ts.map +1 -0
  57. package/dist/flow/parallel-scheduler.js +193 -0
  58. package/dist/flow/plugins/credential-provider.d.ts +47 -0
  59. package/dist/flow/plugins/credential-provider.d.ts.map +1 -0
  60. package/dist/flow/plugins/credential-provider.js +24 -0
  61. package/dist/flow/plugins/image-ai-plugin.d.ts +61 -0
  62. package/dist/flow/plugins/image-ai-plugin.d.ts.map +1 -0
  63. package/dist/flow/plugins/image-ai-plugin.js +21 -0
  64. package/dist/flow/plugins/image-plugin.d.ts +52 -0
  65. package/dist/flow/plugins/image-plugin.d.ts.map +1 -0
  66. package/dist/flow/plugins/image-plugin.js +22 -0
  67. package/dist/flow/plugins/types/describe-image-node.d.ts +16 -0
  68. package/dist/flow/plugins/types/describe-image-node.d.ts.map +1 -0
  69. package/dist/flow/plugins/types/describe-image-node.js +9 -0
  70. package/dist/flow/plugins/types/index.d.ts +9 -0
  71. package/dist/flow/plugins/types/index.d.ts.map +1 -0
  72. package/dist/flow/plugins/types/index.js +8 -0
  73. package/dist/flow/plugins/types/optimize-node.d.ts +20 -0
  74. package/dist/flow/plugins/types/optimize-node.d.ts.map +1 -0
  75. package/dist/flow/plugins/types/optimize-node.js +11 -0
  76. package/dist/flow/plugins/types/remove-background-node.d.ts +16 -0
  77. package/dist/flow/plugins/types/remove-background-node.d.ts.map +1 -0
  78. package/dist/flow/plugins/types/remove-background-node.js +9 -0
  79. package/dist/flow/plugins/types/resize-node.d.ts +21 -0
  80. package/dist/flow/plugins/types/resize-node.d.ts.map +1 -0
  81. package/dist/flow/plugins/types/resize-node.js +16 -0
  82. package/dist/flow/plugins/zip-plugin.d.ts +62 -0
  83. package/dist/flow/plugins/zip-plugin.d.ts.map +1 -0
  84. package/dist/flow/plugins/zip-plugin.js +21 -0
  85. package/dist/flow/typed-flow.d.ts +90 -0
  86. package/dist/flow/typed-flow.d.ts.map +1 -0
  87. package/dist/flow/typed-flow.js +59 -0
  88. package/dist/flow/types/flow-file.d.ts +45 -0
  89. package/dist/flow/types/flow-file.d.ts.map +1 -0
  90. package/dist/flow/types/flow-file.js +27 -0
  91. package/dist/flow/types/flow-job.d.ts +118 -0
  92. package/dist/flow/types/flow-job.d.ts.map +1 -0
  93. package/dist/flow/types/flow-job.js +11 -0
  94. package/dist/flow/types/flow-types.d.ts +321 -0
  95. package/dist/flow/types/flow-types.d.ts.map +1 -0
  96. package/dist/flow/types/flow-types.js +52 -0
  97. package/dist/flow/types/index.d.ts +4 -0
  98. package/dist/flow/types/index.d.ts.map +1 -0
  99. package/dist/flow/types/index.js +3 -0
  100. package/dist/flow/types/run-args.d.ts +38 -0
  101. package/dist/flow/types/run-args.d.ts.map +1 -0
  102. package/dist/flow/types/run-args.js +30 -0
  103. package/dist/flow/types/type-validator.d.ts +26 -0
  104. package/dist/flow/types/type-validator.d.ts.map +1 -0
  105. package/dist/flow/types/type-validator.js +134 -0
  106. package/dist/flow/utils/resolve-upload-metadata.d.ts +11 -0
  107. package/dist/flow/utils/resolve-upload-metadata.d.ts.map +1 -0
  108. package/dist/flow/utils/resolve-upload-metadata.js +28 -0
  109. package/dist/flow-2zXnEiWL.cjs +1 -0
  110. package/dist/flow-CRaKy7Vj.js +2 -0
  111. package/dist/flow-CRaKy7Vj.js.map +1 -0
  112. package/dist/generate-id-Dm-Vboxq.d.ts +34 -0
  113. package/dist/generate-id-Dm-Vboxq.d.ts.map +1 -0
  114. package/dist/generate-id-LjJRLD6N.d.cts +34 -0
  115. package/dist/generate-id-LjJRLD6N.d.cts.map +1 -0
  116. package/dist/generate-id-xHp_Z7Cl.cjs +1 -0
  117. package/dist/generate-id-yohS1ZDk.js +2 -0
  118. package/dist/generate-id-yohS1ZDk.js.map +1 -0
  119. package/dist/index-BO8GZlbD.d.cts +1040 -0
  120. package/dist/index-BO8GZlbD.d.cts.map +1 -0
  121. package/dist/index-BoGG5KAY.d.ts +1 -0
  122. package/dist/index-BtBZHVmz.d.cts +1 -0
  123. package/dist/index-D-CoVpkZ.d.ts +1004 -0
  124. package/dist/index-D-CoVpkZ.d.ts.map +1 -0
  125. package/dist/index.cjs +1 -0
  126. package/dist/index.d.cts +6 -0
  127. package/dist/index.d.ts +5 -0
  128. package/dist/index.d.ts.map +1 -0
  129. package/dist/index.js +5 -0
  130. package/dist/logger/logger.cjs +1 -0
  131. package/dist/logger/logger.d.cts +8 -0
  132. package/dist/logger/logger.d.cts.map +1 -0
  133. package/dist/logger/logger.d.ts +5 -0
  134. package/dist/logger/logger.d.ts.map +1 -0
  135. package/dist/logger/logger.js +10 -0
  136. package/dist/logger/logger.js.map +1 -0
  137. package/dist/semaphore-0ZwjVpyF.js +2 -0
  138. package/dist/semaphore-0ZwjVpyF.js.map +1 -0
  139. package/dist/semaphore-BHprIjFI.d.cts +37 -0
  140. package/dist/semaphore-BHprIjFI.d.cts.map +1 -0
  141. package/dist/semaphore-DThupBkc.d.ts +37 -0
  142. package/dist/semaphore-DThupBkc.d.ts.map +1 -0
  143. package/dist/semaphore-DVrONiAV.cjs +1 -0
  144. package/dist/stream-limiter-CoWKv39w.js +2 -0
  145. package/dist/stream-limiter-CoWKv39w.js.map +1 -0
  146. package/dist/stream-limiter-JgOwmkMa.cjs +1 -0
  147. package/dist/streams/multi-stream.cjs +1 -0
  148. package/dist/streams/multi-stream.d.cts +91 -0
  149. package/dist/streams/multi-stream.d.cts.map +1 -0
  150. package/dist/streams/multi-stream.d.ts +86 -0
  151. package/dist/streams/multi-stream.d.ts.map +1 -0
  152. package/dist/streams/multi-stream.js +149 -0
  153. package/dist/streams/multi-stream.js.map +1 -0
  154. package/dist/streams/stream-limiter.cjs +1 -0
  155. package/dist/streams/stream-limiter.d.cts +36 -0
  156. package/dist/streams/stream-limiter.d.cts.map +1 -0
  157. package/dist/streams/stream-limiter.d.ts +27 -0
  158. package/dist/streams/stream-limiter.d.ts.map +1 -0
  159. package/dist/streams/stream-limiter.js +49 -0
  160. package/dist/streams/stream-splitter.cjs +1 -0
  161. package/dist/streams/stream-splitter.d.cts +68 -0
  162. package/dist/streams/stream-splitter.d.cts.map +1 -0
  163. package/dist/streams/stream-splitter.d.ts +51 -0
  164. package/dist/streams/stream-splitter.d.ts.map +1 -0
  165. package/dist/streams/stream-splitter.js +175 -0
  166. package/dist/streams/stream-splitter.js.map +1 -0
  167. package/dist/types/data-store-registry.d.ts +13 -0
  168. package/dist/types/data-store-registry.d.ts.map +1 -0
  169. package/dist/types/data-store-registry.js +4 -0
  170. package/dist/types/data-store.d.ts +316 -0
  171. package/dist/types/data-store.d.ts.map +1 -0
  172. package/dist/types/data-store.js +157 -0
  173. package/dist/types/event-broadcaster.d.ts +28 -0
  174. package/dist/types/event-broadcaster.d.ts.map +1 -0
  175. package/dist/types/event-broadcaster.js +6 -0
  176. package/dist/types/event-emitter.d.ts +378 -0
  177. package/dist/types/event-emitter.d.ts.map +1 -0
  178. package/dist/types/event-emitter.js +223 -0
  179. package/dist/types/index.cjs +1 -0
  180. package/dist/types/index.d.cts +6 -0
  181. package/dist/types/index.d.ts +10 -0
  182. package/dist/types/index.d.ts.map +1 -0
  183. package/dist/types/index.js +9 -0
  184. package/dist/types/input-file.d.ts +104 -0
  185. package/dist/types/input-file.d.ts.map +1 -0
  186. package/dist/types/input-file.js +27 -0
  187. package/dist/types/kv-store.d.ts +281 -0
  188. package/dist/types/kv-store.d.ts.map +1 -0
  189. package/dist/types/kv-store.js +234 -0
  190. package/dist/types/middleware.d.ts +17 -0
  191. package/dist/types/middleware.d.ts.map +1 -0
  192. package/dist/types/middleware.js +21 -0
  193. package/dist/types/upload-event.d.ts +105 -0
  194. package/dist/types/upload-event.d.ts.map +1 -0
  195. package/dist/types/upload-event.js +71 -0
  196. package/dist/types/upload-file.d.ts +136 -0
  197. package/dist/types/upload-file.d.ts.map +1 -0
  198. package/dist/types/upload-file.js +34 -0
  199. package/dist/types/websocket.d.ts +144 -0
  200. package/dist/types/websocket.d.ts.map +1 -0
  201. package/dist/types/websocket.js +40 -0
  202. package/dist/types-BT-cvi7T.cjs +1 -0
  203. package/dist/types-DhU2j-XF.js +2 -0
  204. package/dist/types-DhU2j-XF.js.map +1 -0
  205. package/dist/upload/convert-to-stream.d.ts +38 -0
  206. package/dist/upload/convert-to-stream.d.ts.map +1 -0
  207. package/dist/upload/convert-to-stream.js +43 -0
  208. package/dist/upload/convert-upload-to-flow-file.d.ts +14 -0
  209. package/dist/upload/convert-upload-to-flow-file.d.ts.map +1 -0
  210. package/dist/upload/convert-upload-to-flow-file.js +21 -0
  211. package/dist/upload/create-upload.d.ts +68 -0
  212. package/dist/upload/create-upload.d.ts.map +1 -0
  213. package/dist/upload/create-upload.js +157 -0
  214. package/dist/upload/index.cjs +1 -0
  215. package/dist/upload/index.d.cts +6 -0
  216. package/dist/upload/index.d.ts +4 -0
  217. package/dist/upload/index.d.ts.map +1 -0
  218. package/dist/upload/index.js +3 -0
  219. package/dist/upload/mime.d.ts +24 -0
  220. package/dist/upload/mime.d.ts.map +1 -0
  221. package/dist/upload/mime.js +351 -0
  222. package/dist/upload/upload-chunk.d.ts +58 -0
  223. package/dist/upload/upload-chunk.d.ts.map +1 -0
  224. package/dist/upload/upload-chunk.js +277 -0
  225. package/dist/upload/upload-server.d.ts +221 -0
  226. package/dist/upload/upload-server.d.ts.map +1 -0
  227. package/dist/upload/upload-server.js +181 -0
  228. package/dist/upload/upload-strategy-negotiator.d.ts +148 -0
  229. package/dist/upload/upload-strategy-negotiator.d.ts.map +1 -0
  230. package/dist/upload/upload-strategy-negotiator.js +217 -0
  231. package/dist/upload/upload-url.d.ts +68 -0
  232. package/dist/upload/upload-url.d.ts.map +1 -0
  233. package/dist/upload/upload-url.js +142 -0
  234. package/dist/upload/write-to-store.d.ts +77 -0
  235. package/dist/upload/write-to-store.d.ts.map +1 -0
  236. package/dist/upload/write-to-store.js +147 -0
  237. package/dist/upload-DLuICjpP.cjs +1 -0
  238. package/dist/upload-DaXO34dE.js +2 -0
  239. package/dist/upload-DaXO34dE.js.map +1 -0
  240. package/dist/uploadista-error-BB-Wdiz9.cjs +22 -0
  241. package/dist/uploadista-error-BVsVxqvz.js +23 -0
  242. package/dist/uploadista-error-BVsVxqvz.js.map +1 -0
  243. package/dist/uploadista-error-CwxYs4EB.d.ts +52 -0
  244. package/dist/uploadista-error-CwxYs4EB.d.ts.map +1 -0
  245. package/dist/uploadista-error-kKlhLRhY.d.cts +52 -0
  246. package/dist/uploadista-error-kKlhLRhY.d.cts.map +1 -0
  247. package/dist/utils/checksum.d.ts +22 -0
  248. package/dist/utils/checksum.d.ts.map +1 -0
  249. package/dist/utils/checksum.js +49 -0
  250. package/dist/utils/debounce.cjs +1 -0
  251. package/dist/utils/debounce.d.cts +38 -0
  252. package/dist/utils/debounce.d.cts.map +1 -0
  253. package/dist/utils/debounce.d.ts +36 -0
  254. package/dist/utils/debounce.d.ts.map +1 -0
  255. package/dist/utils/debounce.js +73 -0
  256. package/dist/utils/generate-id.cjs +1 -0
  257. package/dist/utils/generate-id.d.cts +2 -0
  258. package/dist/utils/generate-id.d.ts +32 -0
  259. package/dist/utils/generate-id.d.ts.map +1 -0
  260. package/dist/utils/generate-id.js +23 -0
  261. package/dist/utils/md5.cjs +1 -0
  262. package/dist/utils/md5.d.cts +73 -0
  263. package/dist/utils/md5.d.cts.map +1 -0
  264. package/dist/utils/md5.d.ts +71 -0
  265. package/dist/utils/md5.d.ts.map +1 -0
  266. package/dist/utils/md5.js +417 -0
  267. package/dist/utils/md5.js.map +1 -0
  268. package/dist/utils/once.cjs +1 -0
  269. package/dist/utils/once.d.cts +25 -0
  270. package/dist/utils/once.d.cts.map +1 -0
  271. package/dist/utils/once.d.ts +21 -0
  272. package/dist/utils/once.d.ts.map +1 -0
  273. package/dist/utils/once.js +54 -0
  274. package/dist/utils/once.js.map +1 -0
  275. package/dist/utils/semaphore.cjs +1 -0
  276. package/dist/utils/semaphore.d.cts +3 -0
  277. package/dist/utils/semaphore.d.ts +78 -0
  278. package/dist/utils/semaphore.d.ts.map +1 -0
  279. package/dist/utils/semaphore.js +134 -0
  280. package/dist/utils/throttle.cjs +1 -0
  281. package/dist/utils/throttle.d.cts +24 -0
  282. package/dist/utils/throttle.d.cts.map +1 -0
  283. package/dist/utils/throttle.d.ts +18 -0
  284. package/dist/utils/throttle.d.ts.map +1 -0
  285. package/dist/utils/throttle.js +20 -0
  286. package/dist/utils/throttle.js.map +1 -0
  287. package/docs/PARALLEL_EXECUTION.md +206 -0
  288. package/docs/PARALLEL_EXECUTION_QUICKSTART.md +142 -0
  289. package/docs/PARALLEL_EXECUTION_REFACTOR.md +184 -0
  290. package/package.json +80 -0
  291. package/src/errors/__tests__/uploadista-error.test.ts +251 -0
  292. package/src/errors/index.ts +2 -0
  293. package/src/errors/uploadista-error.ts +394 -0
  294. package/src/flow/README.md +352 -0
  295. package/src/flow/edge.test.ts +146 -0
  296. package/src/flow/edge.ts +60 -0
  297. package/src/flow/event.ts +229 -0
  298. package/src/flow/flow-server.ts +1089 -0
  299. package/src/flow/flow.ts +1050 -0
  300. package/src/flow/index.ts +28 -0
  301. package/src/flow/node.ts +249 -0
  302. package/src/flow/nodes/index.ts +8 -0
  303. package/src/flow/nodes/input-node.ts +296 -0
  304. package/src/flow/nodes/storage-node.ts +128 -0
  305. package/src/flow/nodes/transform-node.ts +154 -0
  306. package/src/flow/parallel-scheduler.ts +259 -0
  307. package/src/flow/plugins/credential-provider.ts +48 -0
  308. package/src/flow/plugins/image-ai-plugin.ts +66 -0
  309. package/src/flow/plugins/image-plugin.ts +60 -0
  310. package/src/flow/plugins/types/describe-image-node.ts +16 -0
  311. package/src/flow/plugins/types/index.ts +9 -0
  312. package/src/flow/plugins/types/optimize-node.ts +18 -0
  313. package/src/flow/plugins/types/remove-background-node.ts +18 -0
  314. package/src/flow/plugins/types/resize-node.ts +26 -0
  315. package/src/flow/plugins/zip-plugin.ts +69 -0
  316. package/src/flow/typed-flow.ts +279 -0
  317. package/src/flow/types/flow-file.ts +51 -0
  318. package/src/flow/types/flow-job.ts +138 -0
  319. package/src/flow/types/flow-types.ts +353 -0
  320. package/src/flow/types/index.ts +6 -0
  321. package/src/flow/types/run-args.ts +40 -0
  322. package/src/flow/types/type-validator.ts +204 -0
  323. package/src/flow/utils/resolve-upload-metadata.ts +48 -0
  324. package/src/index.ts +5 -0
  325. package/src/logger/logger.ts +14 -0
  326. package/src/streams/stream-limiter.test.ts +150 -0
  327. package/src/streams/stream-limiter.ts +75 -0
  328. package/src/types/data-store.ts +427 -0
  329. package/src/types/event-broadcaster.ts +39 -0
  330. package/src/types/event-emitter.ts +349 -0
  331. package/src/types/index.ts +9 -0
  332. package/src/types/input-file.ts +107 -0
  333. package/src/types/kv-store.ts +375 -0
  334. package/src/types/middleware.ts +54 -0
  335. package/src/types/upload-event.ts +75 -0
  336. package/src/types/upload-file.ts +139 -0
  337. package/src/types/websocket.ts +65 -0
  338. package/src/upload/convert-to-stream.ts +48 -0
  339. package/src/upload/create-upload.ts +214 -0
  340. package/src/upload/index.ts +3 -0
  341. package/src/upload/mime.ts +436 -0
  342. package/src/upload/upload-chunk.ts +364 -0
  343. package/src/upload/upload-server.ts +390 -0
  344. package/src/upload/upload-strategy-negotiator.ts +316 -0
  345. package/src/upload/upload-url.ts +173 -0
  346. package/src/upload/write-to-store.ts +211 -0
  347. package/src/utils/checksum.ts +61 -0
  348. package/src/utils/debounce.test.ts +126 -0
  349. package/src/utils/debounce.ts +89 -0
  350. package/src/utils/generate-id.ts +35 -0
  351. package/src/utils/md5.ts +475 -0
  352. package/src/utils/once.test.ts +83 -0
  353. package/src/utils/once.ts +63 -0
  354. package/src/utils/throttle.test.ts +101 -0
  355. package/src/utils/throttle.ts +29 -0
  356. package/tsconfig.json +20 -0
  357. package/tsconfig.tsbuildinfo +1 -0
  358. package/tsdown.config.ts +25 -0
  359. package/vitest.config.ts +15 -0
@@ -0,0 +1,21 @@
1
+ import { Context, Effect, Layer } from "effect";
2
+ // Effect-based Middleware service
3
+ export class MiddlewareService extends Context.Tag("MiddlewareService")() {
4
+ }
5
+ export const MiddlewareServiceLive = Layer.succeed(MiddlewareService, MiddlewareService.of({
6
+ execute: (middlewares, context, handler) => Effect.gen(function* () {
7
+ if (middlewares.length === 0) {
8
+ return yield* Effect.tryPromise({
9
+ try: () => handler(),
10
+ catch: (error) => error,
11
+ });
12
+ }
13
+ const chain = middlewares.reduceRight((next, middleware) => {
14
+ return () => middleware(context, next);
15
+ }, handler);
16
+ return yield* Effect.tryPromise({
17
+ try: () => chain(),
18
+ catch: (error) => error,
19
+ });
20
+ }),
21
+ }));
@@ -0,0 +1,105 @@
1
+ import { z } from "zod";
2
+ export declare enum UploadEventType {
3
+ UPLOAD_STARTED = "upload-started",
4
+ UPLOAD_PROGRESS = "upload-progress",
5
+ UPLOAD_COMPLETE = "upload-complete",
6
+ UPLOAD_FAILED = "upload-failed",
7
+ UPLOAD_VALIDATION_SUCCESS = "upload-validation-success",
8
+ UPLOAD_VALIDATION_FAILED = "upload-validation-failed",
9
+ UPLOAD_VALIDATION_WARNING = "upload-validation-warning"
10
+ }
11
+ export declare const uploadEventSchema: z.ZodUnion<readonly [z.ZodObject<{
12
+ type: z.ZodUnion<readonly [z.ZodLiteral<UploadEventType.UPLOAD_STARTED>, z.ZodLiteral<UploadEventType.UPLOAD_COMPLETE>]>;
13
+ data: z.ZodObject<{
14
+ id: z.ZodString;
15
+ size: z.ZodOptional<z.ZodNumber>;
16
+ offset: z.ZodNumber;
17
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
18
+ creationDate: z.ZodOptional<z.ZodString>;
19
+ url: z.ZodOptional<z.ZodString>;
20
+ sizeIsDeferred: z.ZodOptional<z.ZodBoolean>;
21
+ checksum: z.ZodOptional<z.ZodString>;
22
+ checksumAlgorithm: z.ZodOptional<z.ZodString>;
23
+ storage: z.ZodObject<{
24
+ id: z.ZodString;
25
+ type: z.ZodString;
26
+ path: z.ZodOptional<z.ZodString>;
27
+ uploadId: z.ZodOptional<z.ZodString>;
28
+ bucket: z.ZodOptional<z.ZodString>;
29
+ }, z.core.$strip>;
30
+ flow: z.ZodOptional<z.ZodObject<{
31
+ flowId: z.ZodString;
32
+ nodeId: z.ZodString;
33
+ jobId: z.ZodString;
34
+ }, z.core.$strip>>;
35
+ }, z.core.$strip>;
36
+ flow: z.ZodOptional<z.ZodObject<{
37
+ flowId: z.ZodString;
38
+ nodeId: z.ZodString;
39
+ jobId: z.ZodString;
40
+ }, z.core.$strip>>;
41
+ }, z.core.$strip>, z.ZodObject<{
42
+ type: z.ZodLiteral<UploadEventType.UPLOAD_PROGRESS>;
43
+ data: z.ZodObject<{
44
+ id: z.ZodString;
45
+ progress: z.ZodNumber;
46
+ total: z.ZodNumber;
47
+ }, z.core.$strip>;
48
+ flow: z.ZodOptional<z.ZodObject<{
49
+ flowId: z.ZodString;
50
+ nodeId: z.ZodString;
51
+ jobId: z.ZodString;
52
+ }, z.core.$strip>>;
53
+ }, z.core.$strip>, z.ZodObject<{
54
+ type: z.ZodLiteral<UploadEventType.UPLOAD_FAILED>;
55
+ data: z.ZodObject<{
56
+ id: z.ZodString;
57
+ error: z.ZodString;
58
+ }, z.core.$strip>;
59
+ flow: z.ZodOptional<z.ZodObject<{
60
+ flowId: z.ZodString;
61
+ nodeId: z.ZodString;
62
+ jobId: z.ZodString;
63
+ }, z.core.$strip>>;
64
+ }, z.core.$strip>, z.ZodObject<{
65
+ type: z.ZodLiteral<UploadEventType.UPLOAD_VALIDATION_SUCCESS>;
66
+ data: z.ZodObject<{
67
+ id: z.ZodString;
68
+ validationType: z.ZodEnum<{
69
+ checksum: "checksum";
70
+ mimetype: "mimetype";
71
+ }>;
72
+ algorithm: z.ZodOptional<z.ZodString>;
73
+ }, z.core.$strip>;
74
+ flow: z.ZodOptional<z.ZodObject<{
75
+ flowId: z.ZodString;
76
+ nodeId: z.ZodString;
77
+ jobId: z.ZodString;
78
+ }, z.core.$strip>>;
79
+ }, z.core.$strip>, z.ZodObject<{
80
+ type: z.ZodLiteral<UploadEventType.UPLOAD_VALIDATION_FAILED>;
81
+ data: z.ZodObject<{
82
+ id: z.ZodString;
83
+ reason: z.ZodString;
84
+ expected: z.ZodString;
85
+ actual: z.ZodString;
86
+ }, z.core.$strip>;
87
+ flow: z.ZodOptional<z.ZodObject<{
88
+ flowId: z.ZodString;
89
+ nodeId: z.ZodString;
90
+ jobId: z.ZodString;
91
+ }, z.core.$strip>>;
92
+ }, z.core.$strip>, z.ZodObject<{
93
+ type: z.ZodLiteral<UploadEventType.UPLOAD_VALIDATION_WARNING>;
94
+ data: z.ZodObject<{
95
+ id: z.ZodString;
96
+ message: z.ZodString;
97
+ }, z.core.$strip>;
98
+ flow: z.ZodOptional<z.ZodObject<{
99
+ flowId: z.ZodString;
100
+ nodeId: z.ZodString;
101
+ jobId: z.ZodString;
102
+ }, z.core.$strip>>;
103
+ }, z.core.$strip>]>;
104
+ export type UploadEvent = z.infer<typeof uploadEventSchema>;
105
+ //# sourceMappingURL=upload-event.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-event.d.ts","sourceRoot":"","sources":["../../src/types/upload-event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,oBAAY,eAAe;IACzB,cAAc,mBAAmB;IACjC,eAAe,oBAAoB;IACnC,eAAe,oBAAoB;IACnC,aAAa,kBAAkB;IAC/B,yBAAyB,8BAA8B;IACvD,wBAAwB,6BAA6B;IACrD,yBAAyB,8BAA8B;CACxD;AAQD,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAqD5B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
@@ -0,0 +1,71 @@
1
+ import { z } from "zod";
2
+ import { uploadFileSchema } from "./upload-file";
3
+ export var UploadEventType;
4
+ (function (UploadEventType) {
5
+ UploadEventType["UPLOAD_STARTED"] = "upload-started";
6
+ UploadEventType["UPLOAD_PROGRESS"] = "upload-progress";
7
+ UploadEventType["UPLOAD_COMPLETE"] = "upload-complete";
8
+ UploadEventType["UPLOAD_FAILED"] = "upload-failed";
9
+ UploadEventType["UPLOAD_VALIDATION_SUCCESS"] = "upload-validation-success";
10
+ UploadEventType["UPLOAD_VALIDATION_FAILED"] = "upload-validation-failed";
11
+ UploadEventType["UPLOAD_VALIDATION_WARNING"] = "upload-validation-warning";
12
+ })(UploadEventType || (UploadEventType = {}));
13
+ const flowContextSchema = z.object({
14
+ flowId: z.string(),
15
+ nodeId: z.string(),
16
+ jobId: z.string(),
17
+ }).optional();
18
+ export const uploadEventSchema = z.union([
19
+ z.object({
20
+ type: z.union([
21
+ z.literal(UploadEventType.UPLOAD_STARTED),
22
+ z.literal(UploadEventType.UPLOAD_COMPLETE),
23
+ ]),
24
+ data: uploadFileSchema,
25
+ flow: flowContextSchema,
26
+ }),
27
+ z.object({
28
+ type: z.literal(UploadEventType.UPLOAD_PROGRESS),
29
+ data: z.object({
30
+ id: z.string(),
31
+ progress: z.number(),
32
+ total: z.number(),
33
+ }),
34
+ flow: flowContextSchema,
35
+ }),
36
+ z.object({
37
+ type: z.literal(UploadEventType.UPLOAD_FAILED),
38
+ data: z.object({
39
+ id: z.string(),
40
+ error: z.string(),
41
+ }),
42
+ flow: flowContextSchema,
43
+ }),
44
+ z.object({
45
+ type: z.literal(UploadEventType.UPLOAD_VALIDATION_SUCCESS),
46
+ data: z.object({
47
+ id: z.string(),
48
+ validationType: z.enum(["checksum", "mimetype"]),
49
+ algorithm: z.string().optional(),
50
+ }),
51
+ flow: flowContextSchema,
52
+ }),
53
+ z.object({
54
+ type: z.literal(UploadEventType.UPLOAD_VALIDATION_FAILED),
55
+ data: z.object({
56
+ id: z.string(),
57
+ reason: z.string(),
58
+ expected: z.string(),
59
+ actual: z.string(),
60
+ }),
61
+ flow: flowContextSchema,
62
+ }),
63
+ z.object({
64
+ type: z.literal(UploadEventType.UPLOAD_VALIDATION_WARNING),
65
+ data: z.object({
66
+ id: z.string(),
67
+ message: z.string(),
68
+ }),
69
+ flow: flowContextSchema,
70
+ }),
71
+ ]);
@@ -0,0 +1,136 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Zod schema for validating UploadFile objects.
4
+ *
5
+ * This schema defines the structure and validation rules for upload file metadata.
6
+ * Use this schema to parse and validate UploadFile data from external sources.
7
+ *
8
+ * @see {@link UploadFile} for the TypeScript type
9
+ */
10
+ export declare const uploadFileSchema: z.ZodObject<{
11
+ id: z.ZodString;
12
+ size: z.ZodOptional<z.ZodNumber>;
13
+ offset: z.ZodNumber;
14
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
15
+ creationDate: z.ZodOptional<z.ZodString>;
16
+ url: z.ZodOptional<z.ZodString>;
17
+ sizeIsDeferred: z.ZodOptional<z.ZodBoolean>;
18
+ checksum: z.ZodOptional<z.ZodString>;
19
+ checksumAlgorithm: z.ZodOptional<z.ZodString>;
20
+ storage: z.ZodObject<{
21
+ id: z.ZodString;
22
+ type: z.ZodString;
23
+ path: z.ZodOptional<z.ZodString>;
24
+ uploadId: z.ZodOptional<z.ZodString>;
25
+ bucket: z.ZodOptional<z.ZodString>;
26
+ }, z.core.$strip>;
27
+ flow: z.ZodOptional<z.ZodObject<{
28
+ flowId: z.ZodString;
29
+ nodeId: z.ZodString;
30
+ jobId: z.ZodString;
31
+ }, z.core.$strip>>;
32
+ }, z.core.$strip>;
33
+ /**
34
+ * Represents an uploaded file with its metadata and storage information.
35
+ *
36
+ * This is the core data structure that tracks file uploads throughout their lifecycle.
37
+ * It contains all metadata needed to resume uploads, track progress, and locate files
38
+ * in storage backends.
39
+ *
40
+ * @property id - Unique identifier for this upload
41
+ * @property offset - Current byte offset (how many bytes have been uploaded)
42
+ * @property storage - Storage backend information
43
+ * @property storage.id - Storage backend identifier (e.g., "s3-production")
44
+ * @property storage.type - Storage backend type (e.g., "s3", "azure", "gcs")
45
+ * @property storage.path - Optional path prefix within the storage backend
46
+ * @property storage.uploadId - Optional backend-specific upload ID (e.g., S3 multipart upload ID)
47
+ * @property storage.bucket - Optional bucket or container name
48
+ * @property flow - Optional flow processing information (when file is part of a flow)
49
+ * @property flow.flowId - ID of the flow processing this file
50
+ * @property flow.nodeId - ID of the flow node that created this file
51
+ * @property flow.jobId - ID of the flow job execution
52
+ * @property size - Total file size in bytes (undefined if deferred)
53
+ * @property metadata - Custom key-value metadata attached to the file
54
+ * @property creationDate - ISO 8601 timestamp when upload was created
55
+ * @property url - Optional public URL to access the file
56
+ * @property sizeIsDeferred - True if file size is not known at upload start
57
+ * @property checksum - Optional file checksum/hash value
58
+ * @property checksumAlgorithm - Algorithm used for checksum (e.g., "md5", "sha256")
59
+ *
60
+ * @example
61
+ * ```typescript
62
+ * // Create an UploadFile for a new upload
63
+ * const uploadFile: UploadFile = {
64
+ * id: "upload_abc123",
65
+ * offset: 0,
66
+ * size: 1024000,
67
+ * storage: {
68
+ * id: "s3-production",
69
+ * type: "s3",
70
+ * bucket: "my-uploads",
71
+ * path: "files/"
72
+ * },
73
+ * metadata: {
74
+ * fileName: "image.jpg",
75
+ * contentType: "image/jpeg",
76
+ * userId: "user_123"
77
+ * },
78
+ * creationDate: new Date().toISOString(),
79
+ * checksum: "5d41402abc4b2a76b9719d911017c592",
80
+ * checksumAlgorithm: "md5"
81
+ * };
82
+ *
83
+ * // UploadFile with flow processing
84
+ * const flowFile: UploadFile = {
85
+ * id: "upload_xyz789",
86
+ * offset: 0,
87
+ * size: 2048000,
88
+ * storage: {
89
+ * id: "s3-temp",
90
+ * type: "s3",
91
+ * bucket: "temp-processing"
92
+ * },
93
+ * flow: {
94
+ * flowId: "flow_resize_optimize",
95
+ * nodeId: "input_1",
96
+ * jobId: "job_456"
97
+ * }
98
+ * };
99
+ *
100
+ * // Resume an interrupted upload
101
+ * const resumingFile: UploadFile = {
102
+ * id: "upload_resume",
103
+ * offset: 524288, // Already uploaded 512KB
104
+ * size: 1024000,
105
+ * storage: {
106
+ * id: "s3-production",
107
+ * type: "s3",
108
+ * uploadId: "multipart_xyz" // S3 multipart upload ID
109
+ * }
110
+ * };
111
+ * ```
112
+ */
113
+ export type UploadFile = {
114
+ id: string;
115
+ offset: number;
116
+ storage: {
117
+ id: string;
118
+ type: string;
119
+ path?: string | undefined;
120
+ uploadId?: string | undefined;
121
+ bucket?: string | undefined;
122
+ };
123
+ flow?: {
124
+ flowId: string;
125
+ nodeId: string;
126
+ jobId: string;
127
+ };
128
+ size?: number | undefined;
129
+ metadata?: Record<string, string | number | boolean> | undefined;
130
+ creationDate?: string | undefined;
131
+ url?: string | undefined;
132
+ sizeIsDeferred?: boolean | undefined;
133
+ checksum?: string | undefined;
134
+ checksumAlgorithm?: string | undefined;
135
+ };
136
+ //# sourceMappingURL=upload-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-file.d.ts","sourceRoot":"","sources":["../../src/types/upload-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;iBAwB3B,CAAC;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+EG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE;QACP,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC9B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KAC7B,CAAC;IACF,IAAI,CAAC,EAAE;QACL,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,SAAS,CAAC;IACjE,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Zod schema for validating UploadFile objects.
4
+ *
5
+ * This schema defines the structure and validation rules for upload file metadata.
6
+ * Use this schema to parse and validate UploadFile data from external sources.
7
+ *
8
+ * @see {@link UploadFile} for the TypeScript type
9
+ */
10
+ export const uploadFileSchema = z.object({
11
+ id: z.string(),
12
+ size: z.number().optional(),
13
+ offset: z.number(),
14
+ metadata: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])).optional(),
15
+ creationDate: z.string().optional(),
16
+ url: z.string().optional(),
17
+ sizeIsDeferred: z.boolean().optional(),
18
+ checksum: z.string().optional(),
19
+ checksumAlgorithm: z.string().optional(),
20
+ storage: z.object({
21
+ id: z.string(),
22
+ type: z.string(),
23
+ path: z.string().optional(),
24
+ uploadId: z.string().optional(),
25
+ bucket: z.string().optional(),
26
+ }),
27
+ flow: z
28
+ .object({
29
+ flowId: z.string(),
30
+ nodeId: z.string(),
31
+ jobId: z.string(),
32
+ })
33
+ .optional(),
34
+ });
@@ -0,0 +1,144 @@
1
+ import z from "zod";
2
+ /**
3
+ * Platform-agnostic WebSocket connection interface
4
+ */
5
+ export interface WebSocketConnection {
6
+ send(data: string): void;
7
+ close(code?: number, reason?: string): void;
8
+ readonly readyState: number;
9
+ readonly id: string;
10
+ }
11
+ /**
12
+ * WebSocket message that can be sent/received
13
+ */
14
+ export declare const webSocketMessageSchema: z.ZodUnion<readonly [z.ZodObject<{
15
+ type: z.ZodLiteral<"upload_event">;
16
+ payload: z.ZodUnion<readonly [z.ZodObject<{
17
+ type: z.ZodUnion<readonly [z.ZodLiteral<import("./upload-event").UploadEventType.UPLOAD_STARTED>, z.ZodLiteral<import("./upload-event").UploadEventType.UPLOAD_COMPLETE>]>;
18
+ data: z.ZodObject<{
19
+ id: z.ZodString;
20
+ size: z.ZodOptional<z.ZodNumber>;
21
+ offset: z.ZodNumber;
22
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
23
+ creationDate: z.ZodOptional<z.ZodString>;
24
+ url: z.ZodOptional<z.ZodString>;
25
+ sizeIsDeferred: z.ZodOptional<z.ZodBoolean>;
26
+ checksum: z.ZodOptional<z.ZodString>;
27
+ checksumAlgorithm: z.ZodOptional<z.ZodString>;
28
+ storage: z.ZodObject<{
29
+ id: z.ZodString;
30
+ type: z.ZodString;
31
+ path: z.ZodOptional<z.ZodString>;
32
+ uploadId: z.ZodOptional<z.ZodString>;
33
+ bucket: z.ZodOptional<z.ZodString>;
34
+ }, z.core.$strip>;
35
+ flow: z.ZodOptional<z.ZodObject<{
36
+ flowId: z.ZodString;
37
+ nodeId: z.ZodString;
38
+ jobId: z.ZodString;
39
+ }, z.core.$strip>>;
40
+ }, z.core.$strip>;
41
+ flow: z.ZodOptional<z.ZodObject<{
42
+ flowId: z.ZodString;
43
+ nodeId: z.ZodString;
44
+ jobId: z.ZodString;
45
+ }, z.core.$strip>>;
46
+ }, z.core.$strip>, z.ZodObject<{
47
+ type: z.ZodLiteral<import("./upload-event").UploadEventType.UPLOAD_PROGRESS>;
48
+ data: z.ZodObject<{
49
+ id: z.ZodString;
50
+ progress: z.ZodNumber;
51
+ total: z.ZodNumber;
52
+ }, z.core.$strip>;
53
+ flow: z.ZodOptional<z.ZodObject<{
54
+ flowId: z.ZodString;
55
+ nodeId: z.ZodString;
56
+ jobId: z.ZodString;
57
+ }, z.core.$strip>>;
58
+ }, z.core.$strip>, z.ZodObject<{
59
+ type: z.ZodLiteral<import("./upload-event").UploadEventType.UPLOAD_FAILED>;
60
+ data: z.ZodObject<{
61
+ id: z.ZodString;
62
+ error: z.ZodString;
63
+ }, z.core.$strip>;
64
+ flow: z.ZodOptional<z.ZodObject<{
65
+ flowId: z.ZodString;
66
+ nodeId: z.ZodString;
67
+ jobId: z.ZodString;
68
+ }, z.core.$strip>>;
69
+ }, z.core.$strip>, z.ZodObject<{
70
+ type: z.ZodLiteral<import("./upload-event").UploadEventType.UPLOAD_VALIDATION_SUCCESS>;
71
+ data: z.ZodObject<{
72
+ id: z.ZodString;
73
+ validationType: z.ZodEnum<{
74
+ checksum: "checksum";
75
+ mimetype: "mimetype";
76
+ }>;
77
+ algorithm: z.ZodOptional<z.ZodString>;
78
+ }, z.core.$strip>;
79
+ flow: z.ZodOptional<z.ZodObject<{
80
+ flowId: z.ZodString;
81
+ nodeId: z.ZodString;
82
+ jobId: z.ZodString;
83
+ }, z.core.$strip>>;
84
+ }, z.core.$strip>, z.ZodObject<{
85
+ type: z.ZodLiteral<import("./upload-event").UploadEventType.UPLOAD_VALIDATION_FAILED>;
86
+ data: z.ZodObject<{
87
+ id: z.ZodString;
88
+ reason: z.ZodString;
89
+ expected: z.ZodString;
90
+ actual: z.ZodString;
91
+ }, z.core.$strip>;
92
+ flow: z.ZodOptional<z.ZodObject<{
93
+ flowId: z.ZodString;
94
+ nodeId: z.ZodString;
95
+ jobId: z.ZodString;
96
+ }, z.core.$strip>>;
97
+ }, z.core.$strip>, z.ZodObject<{
98
+ type: z.ZodLiteral<import("./upload-event").UploadEventType.UPLOAD_VALIDATION_WARNING>;
99
+ data: z.ZodObject<{
100
+ id: z.ZodString;
101
+ message: z.ZodString;
102
+ }, z.core.$strip>;
103
+ flow: z.ZodOptional<z.ZodObject<{
104
+ flowId: z.ZodString;
105
+ nodeId: z.ZodString;
106
+ jobId: z.ZodString;
107
+ }, z.core.$strip>>;
108
+ }, z.core.$strip>]>;
109
+ timestamp: z.ZodOptional<z.ZodString>;
110
+ }, z.core.$strip>, z.ZodObject<{
111
+ type: z.ZodLiteral<"flow_event">;
112
+ payload: z.ZodAny;
113
+ timestamp: z.ZodOptional<z.ZodString>;
114
+ }, z.core.$strip>, z.ZodObject<{
115
+ type: z.ZodLiteral<"subscribed">;
116
+ payload: z.ZodObject<{
117
+ eventKey: z.ZodString;
118
+ }, z.core.$strip>;
119
+ timestamp: z.ZodOptional<z.ZodString>;
120
+ }, z.core.$strip>, z.ZodObject<{
121
+ type: z.ZodLiteral<"error">;
122
+ message: z.ZodOptional<z.ZodString>;
123
+ }, z.core.$strip>, z.ZodObject<{
124
+ type: z.ZodLiteral<"pong">;
125
+ timestamp: z.ZodOptional<z.ZodString>;
126
+ }, z.core.$strip>, z.ZodObject<{
127
+ type: z.ZodLiteral<"ping">;
128
+ timestamp: z.ZodOptional<z.ZodString>;
129
+ }, z.core.$strip>, z.ZodObject<{
130
+ type: z.ZodLiteral<"connection">;
131
+ message: z.ZodOptional<z.ZodString>;
132
+ uploadId: z.ZodOptional<z.ZodString>;
133
+ timestamp: z.ZodOptional<z.ZodString>;
134
+ }, z.core.$strip>]>;
135
+ export type WebSocketMessage<TEvent = unknown> = z.infer<typeof webSocketMessageSchema> | {
136
+ type: "upload_event";
137
+ payload: TEvent;
138
+ timestamp?: string;
139
+ } | {
140
+ type: "flow_event";
141
+ payload: TEvent;
142
+ timestamp?: string;
143
+ };
144
+ //# sourceMappingURL=websocket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/types/websocket.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAGpB;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AAEH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAkCjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,CAAC,MAAM,GAAG,OAAO,IACzC,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,GACtC;IACE,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACD;IACE,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC"}
@@ -0,0 +1,40 @@
1
+ import z from "zod";
2
+ import { uploadEventSchema } from "./upload-event";
3
+ /**
4
+ * WebSocket message that can be sent/received
5
+ */
6
+ export const webSocketMessageSchema = z.union([
7
+ z.object({
8
+ type: z.literal("upload_event"),
9
+ payload: uploadEventSchema,
10
+ timestamp: z.string().optional(),
11
+ }),
12
+ z.object({
13
+ type: z.literal("flow_event"),
14
+ payload: z.any(), // FlowEvent doesn't have a zod schema, using z.any() for now
15
+ timestamp: z.string().optional(),
16
+ }),
17
+ z.object({
18
+ type: z.literal("subscribed"),
19
+ payload: z.object({ eventKey: z.string() }),
20
+ timestamp: z.string().optional(),
21
+ }),
22
+ z.object({
23
+ type: z.literal("error"),
24
+ message: z.string().optional(),
25
+ }),
26
+ z.object({
27
+ type: z.literal("pong"),
28
+ timestamp: z.string().optional(),
29
+ }),
30
+ z.object({
31
+ type: z.literal("ping"),
32
+ timestamp: z.string().optional(),
33
+ }),
34
+ z.object({
35
+ type: z.literal("connection"),
36
+ message: z.string().optional(),
37
+ uploadId: z.string().optional(),
38
+ timestamp: z.string().optional(),
39
+ }),
40
+ ]);
@@ -0,0 +1 @@
1
+ const e=require(`./chunk-CUT6urMc.cjs`),t=require(`./uploadista-error-BB-Wdiz9.cjs`);let n=require(`effect`);n=e.__toESM(n);let r=require(`zod`);r=e.__toESM(r);var i=class extends n.Context.Tag(`UploadFileDataStore`)(){},a=class extends n.Context.Tag(`BufferedUploadFileDataStore`)(){},o=class extends n.Context.Tag(`UploadFileDataStores`)(){},s=class extends n.Context.Tag(`DataStoreRegistry`)(){},c=class{constructor(e,t){this.baseEmitter=e,this.eventToMessage=t}subscribe=(e,t)=>this.baseEmitter.subscribe(e,t);unsubscribe=e=>this.baseEmitter.unsubscribe(e);emit=(e,t)=>{let n=this.eventToMessage(t);return this.baseEmitter.emit(e,n)}};const l=e=>({eventToMessage:t=>JSON.stringify({type:e,payload:t,timestamp:new Date().toISOString()})});var u=class extends n.Context.Tag(`BaseEventEmitter`)(){},d=class extends n.Context.Tag(`UploadEventEmitter`)(){};const f=n.Layer.effect(d,n.Effect.gen(function*(){let e=yield*u;return new c(e,l(`upload_event`).eventToMessage)}));var p=class extends n.Context.Tag(`FlowEventEmitter`)(){};const m=n.Layer.effect(p,n.Effect.gen(function*(){let e=yield*u;return new c(e,l(`flow_event`).eventToMessage)})),h=r.z.object({uploadLengthDeferred:r.z.boolean().optional(),storageId:r.z.string(),size:r.z.number(),type:r.z.string(),fileName:r.z.string().optional(),lastModified:r.z.number().optional(),metadata:r.z.string().optional()});var g=class{constructor(e,t,n){this.baseStore=e,this.serialize=t,this.deserialize=n}get=e=>this.baseStore.get(e).pipe(n.Effect.flatMap(r=>{if(r===null)return n.Effect.fail(t.UploadistaError.fromCode(`FILE_NOT_FOUND`,{cause:`Key "${e}" not found`}));try{return n.Effect.succeed(this.deserialize(r))}catch(r){return n.Effect.fail(new t.UploadistaError({code:`VALIDATION_ERROR`,status:400,body:`Failed to deserialize value for key "${e}"`,cause:r}))}}));set=(e,r)=>{try{let t=this.serialize(r);return this.baseStore.set(e,t)}catch(r){return n.Effect.fail(new t.UploadistaError({code:`VALIDATION_ERROR`,status:400,body:`Failed to serialize value for key "${e}"`,cause:r}))}};delete=e=>this.baseStore.delete(e);list=()=>this.baseStore.list?this.baseStore.list():n.Effect.fail(new t.UploadistaError({code:`UNKNOWN_ERROR`,status:501,body:`List operation not supported by this store`}))};const _={serialize:e=>JSON.stringify(e),deserialize:e=>JSON.parse(e)};var v=class extends n.Context.Tag(`BaseKvStore`)(){},y=class extends n.Context.Tag(`UploadFileKVStore`)(){};const b=n.Layer.effect(y,n.Effect.gen(function*(){let e=yield*v;return new g(e,_.serialize,_.deserialize)}));var x=class extends n.Context.Tag(`FlowJobKVStore`)(){};const S=n.Layer.effect(x,n.Effect.gen(function*(){let e=yield*v;return new g(e,_.serialize,_.deserialize)}));var C=class extends n.Context.Tag(`MiddlewareService`)(){};const w=n.Layer.succeed(C,C.of({execute:(e,t,r)=>n.Effect.gen(function*(){if(e.length===0)return yield*n.Effect.tryPromise({try:()=>r(),catch:e=>e});let i=e.reduceRight((e,n)=>()=>n(t,e),r);return yield*n.Effect.tryPromise({try:()=>i(),catch:e=>e})})})),T=r.z.object({id:r.z.string(),size:r.z.number().optional(),offset:r.z.number(),metadata:r.z.record(r.z.string(),r.z.string()).optional(),creationDate:r.z.string().optional(),url:r.z.string().optional(),sizeIsDeferred:r.z.boolean().optional(),storage:r.z.object({id:r.z.string(),type:r.z.string(),path:r.z.string().optional(),uploadId:r.z.string().optional(),bucket:r.z.string().optional()})});let E=function(e){return e.UPLOAD_STARTED=`upload-started`,e.UPLOAD_PROGRESS=`upload-progress`,e.UPLOAD_COMPLETE=`upload-complete`,e.UPLOAD_FAILED=`upload-failed`,e}({});const D=r.z.union([r.z.object({type:r.z.union([r.z.literal(E.UPLOAD_STARTED),r.z.literal(E.UPLOAD_COMPLETE)]),data:T}),r.z.object({type:r.z.literal(E.UPLOAD_PROGRESS),data:r.z.object({id:r.z.string(),progress:r.z.number(),total:r.z.number()})}),r.z.object({type:r.z.literal(E.UPLOAD_FAILED),data:r.z.object({id:r.z.string(),error:r.z.string()})})]),O=r.default.union([r.default.object({type:r.default.literal(`upload_event`),payload:D,timestamp:r.default.string().optional()}),r.default.object({type:r.default.literal(`flow_event`),payload:r.default.any(),timestamp:r.default.string().optional()}),r.default.object({type:r.default.literal(`subscribed`),payload:r.default.object({uploadId:r.default.string()}),timestamp:r.default.string().optional()}),r.default.object({type:r.default.literal(`error`),message:r.default.string().optional()}),r.default.object({type:r.default.literal(`pong`),timestamp:r.default.string().optional()}),r.default.object({type:r.default.literal(`ping`),timestamp:r.default.string().optional()}),r.default.object({type:r.default.literal(`connection`),message:r.default.string().optional(),uploadId:r.default.string().optional(),timestamp:r.default.string().optional()})]);Object.defineProperty(exports,`BaseEventEmitterService`,{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,`BaseKvStoreService`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`BufferedUploadFileDataStore`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`DataStoreRegistry`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`FlowEventEmitter`,{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,`FlowJobKVStore`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`MiddlewareService`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`MiddlewareServiceLive`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`TypedEventEmitter`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`TypedKvStore`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`UploadEventEmitter`,{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,`UploadEventType`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`UploadFileDataStore`,{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,`UploadFileDataStores`,{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,`UploadFileKVStore`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`eventToMessageSerializer`,{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,`flowEventEmitter`,{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,`flowJobKvStore`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`inputFileSchema`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`jsonSerializer`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`uploadEventEmitter`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`uploadEventSchema`,{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,`uploadFileKvStore`,{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,`uploadFileSchema`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`webSocketMessageSchema`,{enumerable:!0,get:function(){return O}});
@@ -0,0 +1,2 @@
1
+ import{UploadistaError as e}from"./uploadista-error-BVsVxqvz.js";import{Context as t,Effect as n,Layer as r}from"effect";import i,{z as a}from"zod";var o=class extends t.Tag(`UploadFileDataStore`)(){},s=class extends t.Tag(`BufferedUploadFileDataStore`)(){},c=class extends t.Tag(`UploadFileDataStores`)(){},l=class extends t.Tag(`DataStoreRegistry`)(){},u=class{constructor(e,t){this.baseEmitter=e,this.eventToMessage=t}subscribe=(e,t)=>this.baseEmitter.subscribe(e,t);unsubscribe=e=>this.baseEmitter.unsubscribe(e);emit=(e,t)=>{let n=this.eventToMessage(t);return this.baseEmitter.emit(e,n)}};const d=e=>({eventToMessage:t=>JSON.stringify({type:e,payload:t,timestamp:new Date().toISOString()})});var f=class extends t.Tag(`BaseEventEmitter`)(){},p=class extends t.Tag(`UploadEventEmitter`)(){};const m=r.effect(p,n.gen(function*(){let e=yield*f;return new u(e,d(`upload_event`).eventToMessage)}));var h=class extends t.Tag(`FlowEventEmitter`)(){};const g=r.effect(h,n.gen(function*(){let e=yield*f;return new u(e,d(`flow_event`).eventToMessage)})),_=a.object({uploadLengthDeferred:a.boolean().optional(),storageId:a.string(),size:a.number(),type:a.string(),fileName:a.string().optional(),lastModified:a.number().optional(),metadata:a.string().optional()});var v=class{constructor(e,t,n){this.baseStore=e,this.serialize=t,this.deserialize=n}get=t=>this.baseStore.get(t).pipe(n.flatMap(r=>{if(r===null)return n.fail(e.fromCode(`FILE_NOT_FOUND`,{cause:`Key "${t}" not found`}));try{return n.succeed(this.deserialize(r))}catch(r){return n.fail(new e({code:`VALIDATION_ERROR`,status:400,body:`Failed to deserialize value for key "${t}"`,cause:r}))}}));set=(t,r)=>{try{let e=this.serialize(r);return this.baseStore.set(t,e)}catch(r){return n.fail(new e({code:`VALIDATION_ERROR`,status:400,body:`Failed to serialize value for key "${t}"`,cause:r}))}};delete=e=>this.baseStore.delete(e);list=()=>this.baseStore.list?this.baseStore.list():n.fail(new e({code:`UNKNOWN_ERROR`,status:501,body:`List operation not supported by this store`}))};const y={serialize:e=>JSON.stringify(e),deserialize:e=>JSON.parse(e)};var b=class extends t.Tag(`BaseKvStore`)(){},x=class extends t.Tag(`UploadFileKVStore`)(){};const S=r.effect(x,n.gen(function*(){let e=yield*b;return new v(e,y.serialize,y.deserialize)}));var C=class extends t.Tag(`FlowJobKVStore`)(){};const w=r.effect(C,n.gen(function*(){let e=yield*b;return new v(e,y.serialize,y.deserialize)}));var T=class extends t.Tag(`MiddlewareService`)(){};const E=r.succeed(T,T.of({execute:(e,t,r)=>n.gen(function*(){if(e.length===0)return yield*n.tryPromise({try:()=>r(),catch:e=>e});let i=e.reduceRight((e,n)=>()=>n(t,e),r);return yield*n.tryPromise({try:()=>i(),catch:e=>e})})})),D=a.object({id:a.string(),size:a.number().optional(),offset:a.number(),metadata:a.record(a.string(),a.string()).optional(),creationDate:a.string().optional(),url:a.string().optional(),sizeIsDeferred:a.boolean().optional(),storage:a.object({id:a.string(),type:a.string(),path:a.string().optional(),uploadId:a.string().optional(),bucket:a.string().optional()})});let O=function(e){return e.UPLOAD_STARTED=`upload-started`,e.UPLOAD_PROGRESS=`upload-progress`,e.UPLOAD_COMPLETE=`upload-complete`,e.UPLOAD_FAILED=`upload-failed`,e}({});const k=a.union([a.object({type:a.union([a.literal(O.UPLOAD_STARTED),a.literal(O.UPLOAD_COMPLETE)]),data:D}),a.object({type:a.literal(O.UPLOAD_PROGRESS),data:a.object({id:a.string(),progress:a.number(),total:a.number()})}),a.object({type:a.literal(O.UPLOAD_FAILED),data:a.object({id:a.string(),error:a.string()})})]),A=i.union([i.object({type:i.literal(`upload_event`),payload:k,timestamp:i.string().optional()}),i.object({type:i.literal(`flow_event`),payload:i.any(),timestamp:i.string().optional()}),i.object({type:i.literal(`subscribed`),payload:i.object({uploadId:i.string()}),timestamp:i.string().optional()}),i.object({type:i.literal(`error`),message:i.string().optional()}),i.object({type:i.literal(`pong`),timestamp:i.string().optional()}),i.object({type:i.literal(`ping`),timestamp:i.string().optional()}),i.object({type:i.literal(`connection`),message:i.string().optional(),uploadId:i.string().optional(),timestamp:i.string().optional()})]);export{f as BaseEventEmitterService,b as BaseKvStoreService,s as BufferedUploadFileDataStore,l as DataStoreRegistry,h as FlowEventEmitter,C as FlowJobKVStore,T as MiddlewareService,E as MiddlewareServiceLive,u as TypedEventEmitter,v as TypedKvStore,p as UploadEventEmitter,O as UploadEventType,o as UploadFileDataStore,c as UploadFileDataStores,x as UploadFileKVStore,d as eventToMessageSerializer,g as flowEventEmitter,w as flowJobKvStore,_ as inputFileSchema,y as jsonSerializer,m as uploadEventEmitter,k as uploadEventSchema,S as uploadFileKvStore,D as uploadFileSchema,A as webSocketMessageSchema};
2
+ //# sourceMappingURL=types-DhU2j-XF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-DhU2j-XF.js","names":["baseEmitter: BaseEventEmitter","eventToMessage: (event: TEvent) => string","baseStore: BaseKvStore","serialize: (data: TData) => string","deserialize: (str: string) => TData","z"],"sources":["../src/types/data-store.ts","../src/types/data-store-registry.ts","../src/types/event-emitter.ts","../src/types/input-file.ts","../src/types/kv-store.ts","../src/types/middleware.ts","../src/types/upload-file.ts","../src/types/upload-event.ts","../src/types/websocket.ts"],"sourcesContent":["import type { Effect, Stream } from \"effect\";\nimport { Context } from \"effect\";\nimport type { UploadistaError } from \"../errors/uploadista-error\";\nimport type { UploadFile } from \"./upload-file\";\n\nexport type DataStoreWriteOptions = {\n file_id: string;\n stream: Stream.Stream<Uint8Array, UploadistaError>;\n offset: number;\n};\n\nexport type UploadStrategy = \"single\" | \"parallel\";\n\nexport type DataStoreCapabilities = {\n supportsParallelUploads: boolean;\n supportsConcatenation: boolean;\n supportsDeferredLength: boolean;\n supportsResumableUploads: boolean;\n supportsTransactionalUploads: boolean;\n maxConcurrentUploads?: number;\n minChunkSize?: number;\n maxChunkSize?: number;\n maxParts?: number;\n optimalChunkSize?: number;\n requiresOrderedChunks: boolean;\n};\n\nexport type DataStore<TData = unknown> = {\n readonly bucket?: string;\n readonly path?: string;\n readonly create: (file: TData) => Effect.Effect<TData, UploadistaError>;\n readonly remove: (file_id: string) => Effect.Effect<void, UploadistaError>;\n readonly read: (\n file_id: string,\n ) => Effect.Effect<Uint8Array, UploadistaError>;\n readonly write: (\n options: DataStoreWriteOptions,\n dependencies: {\n onProgress?: (chunkSize: number) => void;\n },\n ) => Effect.Effect<number, UploadistaError>;\n readonly deleteExpired?: Effect.Effect<number, UploadistaError>;\n readonly getCapabilities: () => DataStoreCapabilities;\n readonly validateUploadStrategy: (\n strategy: UploadStrategy,\n ) => Effect.Effect<boolean, never>;\n};\n\nexport class UploadFileDataStore extends Context.Tag(\"UploadFileDataStore\")<\n UploadFileDataStore,\n DataStore<UploadFile>\n>() {}\n\nexport class BufferedUploadFileDataStore extends Context.Tag(\n \"BufferedUploadFileDataStore\",\n)<BufferedUploadFileDataStore, DataStore<UploadFile>>() {}\n\nexport type UploadFileDataStoresShape = {\n getDataStore: (\n storageId: string,\n isBuffer?: boolean,\n ) => Effect.Effect<DataStore<UploadFile>, UploadistaError>;\n};\n\nexport class UploadFileDataStores extends Context.Tag(\"UploadFileDataStores\")<\n UploadFileDataStores,\n UploadFileDataStoresShape\n>() {}\n","import { Context, type Effect } from \"effect\";\nimport type { UploadistaError } from \"../errors\";\nimport type { DataStore } from \"./data-store\";\nimport type { UploadFile } from \"./upload-file\";\n\n// Data Store Registry service for managing multiple data stores\nexport class DataStoreRegistry extends Context.Tag(\"DataStoreRegistry\")<\n DataStoreRegistry,\n {\n readonly register: <T extends DataStore<UploadFile>>(\n id: string,\n store: Effect.Effect<T, UploadistaError>,\n ) => Effect.Effect<void, never>;\n readonly get: (\n id: string,\n ) => Effect.Effect<DataStore<UploadFile>, UploadistaError>;\n readonly list: () => Effect.Effect<Array<string>, never>;\n }\n>() {}\n","import { Context, Effect, Layer } from \"effect\";\nimport type { UploadistaError } from \"../errors\";\nimport type { FlowEvent } from \"../flow/event\";\nimport type { UploadEvent } from \"./upload-event\";\nimport type { WebSocketConnection } from \"./websocket\";\n\n// Base untyped EventEmitter interface - emits raw strings\nexport interface BaseEventEmitter {\n readonly subscribe: (\n key: string,\n connection: WebSocketConnection,\n ) => Effect.Effect<void, UploadistaError>;\n readonly unsubscribe: (key: string) => Effect.Effect<void, UploadistaError>;\n readonly emit: (\n key: string,\n event: string,\n ) => Effect.Effect<void, UploadistaError>;\n}\n\n// Typed EventEmitter interface - handles serialization/deserialization\nexport type EventEmitter<TEvent> = {\n readonly subscribe: (\n key: string,\n connection: WebSocketConnection,\n ) => Effect.Effect<void, UploadistaError>;\n readonly unsubscribe: (key: string) => Effect.Effect<void, UploadistaError>;\n readonly emit: (\n key: string,\n event: TEvent,\n ) => Effect.Effect<void, UploadistaError>;\n};\n\n// Typed wrapper class that uses a base event emitter with serialization\nexport class TypedEventEmitter<TEvent> implements EventEmitter<TEvent> {\n constructor(\n private baseEmitter: BaseEventEmitter,\n private eventToMessage: (event: TEvent) => string,\n ) {}\n\n subscribe = (\n key: string,\n connection: WebSocketConnection,\n ): Effect.Effect<void, UploadistaError> =>\n this.baseEmitter.subscribe(key, connection);\n\n unsubscribe = (key: string): Effect.Effect<void, UploadistaError> =>\n this.baseEmitter.unsubscribe(key);\n\n emit = (key: string, event: TEvent): Effect.Effect<void, UploadistaError> => {\n const message = this.eventToMessage(event);\n return this.baseEmitter.emit(key, message);\n };\n}\n\n// Default JSON serialization helper\nexport const eventToMessageSerializer = (\n messageType: \"upload_event\" | \"flow_event\",\n) => ({\n eventToMessage: <T>(event: T): string =>\n JSON.stringify({\n type: messageType,\n payload: event,\n timestamp: new Date().toISOString(),\n }),\n});\n\n// Context tags\nexport class BaseEventEmitterService extends Context.Tag(\"BaseEventEmitter\")<\n BaseEventEmitterService,\n BaseEventEmitter\n>() {}\n\nexport class UploadEventEmitter extends Context.Tag(\"UploadEventEmitter\")<\n UploadEventEmitter,\n EventEmitter<UploadEvent>\n>() {}\n\nexport const uploadEventEmitter = Layer.effect(\n UploadEventEmitter,\n Effect.gen(function* () {\n const baseEmitter = yield* BaseEventEmitterService;\n return new TypedEventEmitter<UploadEvent>(\n baseEmitter,\n eventToMessageSerializer(\"upload_event\").eventToMessage,\n );\n }),\n);\n\nexport class FlowEventEmitter extends Context.Tag(\"FlowEventEmitter\")<\n FlowEventEmitter,\n EventEmitter<FlowEvent>\n>() {}\n\nexport const flowEventEmitter = Layer.effect(\n FlowEventEmitter,\n Effect.gen(function* () {\n const baseEmitter = yield* BaseEventEmitterService;\n return new TypedEventEmitter<FlowEvent>(\n baseEmitter,\n eventToMessageSerializer(\"flow_event\").eventToMessage,\n );\n }),\n);\n","import { z } from \"zod\";\n\nexport const inputFileSchema = z.object({\n uploadLengthDeferred: z.boolean().optional(),\n storageId: z.string(),\n size: z.number(),\n type: z.string(),\n fileName: z.string().optional(),\n lastModified: z.number().optional(),\n metadata: z.string().optional(),\n});\n\nexport type InputFile = z.infer<typeof inputFileSchema>;\n","import { Context, Effect, Layer } from \"effect\";\nimport { UploadistaError } from \"../errors\";\nimport type { FlowJob } from \"../flow\";\nimport type { UploadFile } from \"./upload-file\";\n\n// Base untyped KV store interface - stores raw strings\nexport interface BaseKvStore {\n readonly get: (key: string) => Effect.Effect<string | null, UploadistaError>;\n readonly set: (\n key: string,\n value: string,\n ) => Effect.Effect<void, UploadistaError>;\n readonly delete: (key: string) => Effect.Effect<void, UploadistaError>;\n readonly list?: () => Effect.Effect<Array<string>, UploadistaError>;\n}\n\n// Typed KV store interface - handles serialization/deserialization\nexport type KvStore<TData> = {\n readonly get: (key: string) => Effect.Effect<TData, UploadistaError>;\n readonly set: (\n key: string,\n value: TData,\n ) => Effect.Effect<void, UploadistaError>;\n readonly delete: (key: string) => Effect.Effect<void, UploadistaError>;\n readonly list?: () => Effect.Effect<Array<string>, UploadistaError>;\n};\n\n// Typed wrapper class that uses a base store with serialization\nexport class TypedKvStore<TData> implements KvStore<TData> {\n constructor(\n private baseStore: BaseKvStore,\n private serialize: (data: TData) => string,\n private deserialize: (str: string) => TData,\n ) {}\n\n get = (key: string): Effect.Effect<TData, UploadistaError> =>\n this.baseStore.get(key).pipe(\n Effect.flatMap((value) => {\n if (value === null) {\n return Effect.fail(\n UploadistaError.fromCode(\"FILE_NOT_FOUND\", {\n cause: `Key \"${key}\" not found`,\n }),\n );\n }\n try {\n return Effect.succeed(this.deserialize(value));\n } catch (error) {\n return Effect.fail(\n new UploadistaError({\n code: \"VALIDATION_ERROR\",\n status: 400,\n body: `Failed to deserialize value for key \"${key}\"`,\n cause: error,\n }),\n );\n }\n }),\n );\n\n set = (key: string, value: TData): Effect.Effect<void, UploadistaError> => {\n try {\n const serialized = this.serialize(value);\n return this.baseStore.set(key, serialized);\n } catch (error) {\n return Effect.fail(\n new UploadistaError({\n code: \"VALIDATION_ERROR\",\n status: 400,\n body: `Failed to serialize value for key \"${key}\"`,\n cause: error,\n }),\n );\n }\n };\n\n delete = (key: string): Effect.Effect<void, UploadistaError> =>\n this.baseStore.delete(key);\n\n list = (): Effect.Effect<Array<string>, UploadistaError> => {\n if (this.baseStore.list) {\n return this.baseStore.list();\n }\n return Effect.fail(\n new UploadistaError({\n code: \"UNKNOWN_ERROR\",\n status: 501,\n body: \"List operation not supported by this store\",\n }),\n );\n };\n}\n\n// Default JSON serialization helpers\nexport const jsonSerializer = {\n serialize: <T>(data: T): string => JSON.stringify(data),\n deserialize: <T>(str: string): T => JSON.parse(str),\n};\n\n// Context tags\nexport class BaseKvStoreService extends Context.Tag(\"BaseKvStore\")<\n BaseKvStoreService,\n BaseKvStore\n>() {}\n\nexport class UploadFileKVStore extends Context.Tag(\"UploadFileKVStore\")<\n UploadFileKVStore,\n KvStore<UploadFile>\n>() {}\n\nexport const uploadFileKvStore = Layer.effect(\n UploadFileKVStore,\n Effect.gen(function* () {\n const baseStore = yield* BaseKvStoreService;\n return new TypedKvStore<UploadFile>(\n baseStore,\n jsonSerializer.serialize,\n jsonSerializer.deserialize,\n );\n }),\n);\n\nexport class FlowJobKVStore extends Context.Tag(\"FlowJobKVStore\")<\n FlowJobKVStore,\n KvStore<FlowJob>\n>() {}\n\nexport const flowJobKvStore = Layer.effect(\n FlowJobKVStore,\n Effect.gen(function* () {\n const baseStore = yield* BaseKvStoreService;\n return new TypedKvStore<FlowJob>(\n baseStore,\n jsonSerializer.serialize,\n jsonSerializer.deserialize,\n );\n }),\n);\n","import { Context, Effect, Layer } from \"effect\";\nimport type { UploadistaError } from \"../errors\";\n\nexport type MiddlewareContext = {\n request: Request;\n uploadId?: string;\n metadata?: Record<string, string>;\n};\n\nexport type MiddlewareNext = () => Promise<Response>;\n\nexport type Middleware = (\n context: MiddlewareContext,\n next: MiddlewareNext,\n) => Promise<Response>;\n\n// Effect-based Middleware service\nexport class MiddlewareService extends Context.Tag(\"MiddlewareService\")<\n MiddlewareService,\n {\n readonly execute: (\n middlewares: Middleware[],\n context: MiddlewareContext,\n handler: MiddlewareNext,\n ) => Effect.Effect<Response, UploadistaError>;\n }\n>() {}\n\nexport const MiddlewareServiceLive = Layer.succeed(\n MiddlewareService,\n MiddlewareService.of({\n execute: (middlewares, context, handler) =>\n Effect.gen(function* () {\n if (middlewares.length === 0) {\n return yield* Effect.tryPromise({\n try: () => handler(),\n catch: (error) => error as UploadistaError,\n });\n }\n\n const chain = middlewares.reduceRight(\n (next: MiddlewareNext, middleware: Middleware) => {\n return () => middleware(context, next);\n },\n handler,\n );\n\n return yield* Effect.tryPromise({\n try: () => chain(),\n catch: (error) => error as UploadistaError,\n });\n }),\n }),\n);\n","import { z } from \"zod\";\n\nexport const uploadFileSchema = z.object({\n id: z.string(),\n size: z.number().optional(),\n offset: z.number(),\n metadata: z.record(z.string(), z.string()).optional(),\n creationDate: z.string().optional(),\n url: z.string().optional(),\n sizeIsDeferred: z.boolean().optional(),\n storage: z.object({\n id: z.string(),\n type: z.string(),\n path: z.string().optional(),\n uploadId: z.string().optional(),\n bucket: z.string().optional(),\n }),\n});\n\nexport type UploadFile = {\n id: string;\n offset: number;\n storage: {\n id: string;\n isBuffer?: boolean;\n type: string;\n path?: string | undefined;\n uploadId?: string | undefined;\n bucket?: string | undefined;\n };\n size?: number | undefined;\n metadata?: Record<string, string> | undefined;\n creationDate?: string | undefined;\n url?: string | undefined;\n sizeIsDeferred?: boolean | undefined;\n};\n","import { z } from \"zod\";\nimport { uploadFileSchema } from \"./upload-file\";\n\nexport enum UploadEventType {\n UPLOAD_STARTED = \"upload-started\",\n UPLOAD_PROGRESS = \"upload-progress\",\n UPLOAD_COMPLETE = \"upload-complete\",\n UPLOAD_FAILED = \"upload-failed\",\n}\n\nexport const uploadEventSchema = z.union([\n z.object({\n type: z.union([\n z.literal(UploadEventType.UPLOAD_STARTED),\n z.literal(UploadEventType.UPLOAD_COMPLETE),\n ]),\n data: uploadFileSchema,\n }),\n z.object({\n type: z.literal(UploadEventType.UPLOAD_PROGRESS),\n data: z.object({\n id: z.string(),\n progress: z.number(),\n total: z.number(),\n }),\n }),\n z.object({\n type: z.literal(UploadEventType.UPLOAD_FAILED),\n data: z.object({\n id: z.string(),\n error: z.string(),\n }),\n }),\n]);\n\nexport type UploadEvent = z.infer<typeof uploadEventSchema>;\n","import z from \"zod\";\nimport { uploadEventSchema } from \"./upload-event\";\n\n/**\n * Platform-agnostic WebSocket connection interface\n */\nexport interface WebSocketConnection {\n send(data: string): void;\n close(code?: number, reason?: string): void;\n readonly readyState: number;\n readonly id: string;\n}\n\n/**\n * WebSocket message that can be sent/received\n */\n\nexport const webSocketMessageSchema = z.union([\n z.object({\n type: z.literal(\"upload_event\"),\n payload: uploadEventSchema,\n timestamp: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"flow_event\"),\n payload: z.any(), // FlowEvent doesn't have a zod schema, using z.any() for now\n timestamp: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"subscribed\"),\n payload: z.object({ uploadId: z.string() }),\n timestamp: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"error\"),\n message: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"pong\"),\n timestamp: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"ping\"),\n timestamp: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"connection\"),\n message: z.string().optional(),\n uploadId: z.string().optional(),\n timestamp: z.string().optional(),\n }),\n]);\n\nexport type WebSocketMessage<TEvent = unknown> =\n | z.infer<typeof webSocketMessageSchema>\n | {\n type: \"upload_event\";\n payload: TEvent;\n timestamp?: string;\n }\n | {\n type: \"flow_event\";\n payload: TEvent;\n timestamp?: string;\n };\n"],"mappings":"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"}