@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,394 @@
1
+ import { Data, Effect } from "effect";
2
+
3
+ /**
4
+ * Union type of all possible error codes in the Uploadista system.
5
+ *
6
+ * Each error code corresponds to a specific error condition with predefined
7
+ * HTTP status codes and messages in the ERROR_CATALOG.
8
+ */
9
+ export type UploadistaErrorCode =
10
+ | "MISSING_OFFSET"
11
+ | "ABORTED"
12
+ | "INVALID_TERMINATION"
13
+ | "ERR_LOCK_TIMEOUT"
14
+ | "INVALID_CONTENT_TYPE"
15
+ | "FLOW_STRUCTURE_ERROR"
16
+ | "FLOW_CYCLE_ERROR"
17
+ | "FLOW_NODE_NOT_FOUND"
18
+ | "FLOW_NODE_ERROR"
19
+ | "FLOW_NOT_AUTHORIZED"
20
+ | "FLOW_NOT_FOUND"
21
+ | "FILE_READ_ERROR"
22
+ | "FLOW_JOB_NOT_FOUND"
23
+ | "FLOW_JOB_ERROR"
24
+ | "DATASTORE_NOT_FOUND"
25
+ | "FILE_NOT_FOUND"
26
+ | "INVALID_OFFSET"
27
+ | "FILE_NO_LONGER_EXISTS"
28
+ | "ERR_SIZE_EXCEEDED"
29
+ | "ERR_MAX_SIZE_EXCEEDED"
30
+ | "INVALID_LENGTH"
31
+ | "INVALID_METADATA"
32
+ | "VALIDATION_ERROR"
33
+ | "STORAGE_NOT_AUTHORIZED"
34
+ | "UNKNOWN_ERROR"
35
+ | "FILE_WRITE_ERROR"
36
+ | "UPLOAD_ID_NOT_FOUND"
37
+ | "FLOW_OUTPUT_VALIDATION_ERROR"
38
+ | "FLOW_INPUT_VALIDATION_ERROR"
39
+ | "CHECKSUM_MISMATCH"
40
+ | "MIMETYPE_MISMATCH"
41
+ | "UNSUPPORTED_CHECKSUM_ALGORITHM";
42
+
43
+ /**
44
+ * Catalog of all predefined errors in the Uploadista system.
45
+ *
46
+ * Maps error codes to their HTTP status codes and default error messages.
47
+ * This centralized catalog ensures consistent error handling across all
48
+ * Uploadista packages and adapters.
49
+ *
50
+ * Each error entry contains:
51
+ * - `status`: HTTP status code (400-500 range)
52
+ * - `body`: Human-readable error message
53
+ *
54
+ * @example
55
+ * ```typescript
56
+ * // Access a specific error definition
57
+ * const fileNotFound = ERROR_CATALOG.FILE_NOT_FOUND;
58
+ * console.log(fileNotFound.status); // 404
59
+ * console.log(fileNotFound.body); // "The file for this url was not found\n"
60
+ *
61
+ * // Use with UploadistaError
62
+ * const error = UploadistaError.fromCode("FILE_NOT_FOUND");
63
+ * ```
64
+ */
65
+ export const ERROR_CATALOG: Readonly<
66
+ Record<UploadistaErrorCode, { status: number; body: string }>
67
+ > = {
68
+ MISSING_OFFSET: { status: 403, body: "Upload-Offset header required\n" },
69
+ ABORTED: { status: 400, body: "Request aborted due to lock acquired" },
70
+ INVALID_TERMINATION: {
71
+ status: 400,
72
+ body: "Cannot terminate an already completed upload",
73
+ },
74
+ ERR_LOCK_TIMEOUT: {
75
+ status: 500,
76
+ body: "failed to acquire lock before timeout",
77
+ },
78
+ INVALID_CONTENT_TYPE: {
79
+ status: 403,
80
+ body: "Content-Type header required\n",
81
+ },
82
+ DATASTORE_NOT_FOUND: {
83
+ status: 500,
84
+ body: "The datastore was not found\n",
85
+ },
86
+ UPLOAD_ID_NOT_FOUND: {
87
+ status: 500,
88
+ body: "The upload id was not found\n",
89
+ },
90
+ FILE_NOT_FOUND: {
91
+ status: 404,
92
+ body: "The file for this url was not found\n",
93
+ },
94
+ FLOW_NOT_AUTHORIZED: {
95
+ status: 401,
96
+ body: "The flow is not authorized\n",
97
+ },
98
+ FLOW_NOT_FOUND: {
99
+ status: 404,
100
+ body: "The flow was not found\n",
101
+ },
102
+ FLOW_STRUCTURE_ERROR: {
103
+ status: 500,
104
+ body: "The flow structure is invalid\n",
105
+ },
106
+ FLOW_CYCLE_ERROR: {
107
+ status: 500,
108
+ body: "The flow contains a cycle\n",
109
+ },
110
+ FLOW_NODE_NOT_FOUND: {
111
+ status: 500,
112
+ body: "The flow node was not found\n",
113
+ },
114
+ FLOW_NODE_ERROR: {
115
+ status: 500,
116
+ body: "The flow node failed\n",
117
+ },
118
+ FLOW_JOB_NOT_FOUND: {
119
+ status: 404,
120
+ body: "The flow job was not found\n",
121
+ },
122
+ FLOW_JOB_ERROR: {
123
+ status: 500,
124
+ body: "The flow job failed\n",
125
+ },
126
+ FLOW_INPUT_VALIDATION_ERROR: {
127
+ status: 500,
128
+ body: "The flow input validation failed\n",
129
+ },
130
+ FLOW_OUTPUT_VALIDATION_ERROR: {
131
+ status: 500,
132
+ body: "The flow output validation failed\n",
133
+ },
134
+ INVALID_OFFSET: { status: 409, body: "Upload-Offset conflict\n" },
135
+ FILE_NO_LONGER_EXISTS: {
136
+ status: 410,
137
+ body: "The file for this url no longer exists\n",
138
+ },
139
+ FILE_READ_ERROR: {
140
+ status: 500,
141
+ body: "Something went wrong reading the file\n",
142
+ },
143
+ ERR_SIZE_EXCEEDED: { status: 413, body: "upload's size exceeded\n" },
144
+ ERR_MAX_SIZE_EXCEEDED: { status: 413, body: "Maximum size exceeded\n" },
145
+ INVALID_LENGTH: {
146
+ status: 400,
147
+ body: "Upload-Length or Upload-Defer-Length header required\n",
148
+ },
149
+ INVALID_METADATA: {
150
+ status: 400,
151
+ body: "Upload-Metadata is invalid. It MUST consist of one or more comma-separated key-value pairs. The key and value MUST be separated by a space. The key MUST NOT contain spaces and commas and MUST NOT be empty. The key SHOULD be ASCII encoded and the value MUST be Base64 encoded. All keys MUST be unique",
152
+ },
153
+ VALIDATION_ERROR: {
154
+ status: 400,
155
+ body: "Validation failed\n",
156
+ },
157
+ STORAGE_NOT_AUTHORIZED: {
158
+ status: 401,
159
+ body: "The storage is not authorized\n",
160
+ },
161
+ UNKNOWN_ERROR: {
162
+ status: 500,
163
+ body: "Something went wrong with that request\n",
164
+ },
165
+ FILE_WRITE_ERROR: {
166
+ status: 500,
167
+ body: "Something went wrong receiving the file\n",
168
+ },
169
+ CHECKSUM_MISMATCH: {
170
+ status: 400,
171
+ body: "The file checksum does not match the provided checksum\n",
172
+ },
173
+ MIMETYPE_MISMATCH: {
174
+ status: 400,
175
+ body: "The file MIME type does not match the declared type\n",
176
+ },
177
+ UNSUPPORTED_CHECKSUM_ALGORITHM: {
178
+ status: 400,
179
+ body: "The specified checksum algorithm is not supported\n",
180
+ },
181
+ } as const;
182
+
183
+ /**
184
+ * Standard error class for all Uploadista operations.
185
+ *
186
+ * UploadistaError provides a consistent error handling approach across the entire
187
+ * Uploadista ecosystem. Each error has:
188
+ * - A typed error code from the ERROR_CATALOG
189
+ * - An HTTP-compatible status code
190
+ * - A human-readable error message (body)
191
+ * - Optional additional details and cause information
192
+ *
193
+ * This class integrates with Effect-TS for functional error handling and can be
194
+ * easily converted to an Effect that fails.
195
+ *
196
+ * @example
197
+ * ```typescript
198
+ * // Create from error code
199
+ * const error = UploadistaError.fromCode("FILE_NOT_FOUND");
200
+ *
201
+ * // Create with custom details
202
+ * const customError = UploadistaError.fromCode("FLOW_NODE_ERROR", {
203
+ * body: "Failed to process image",
204
+ * cause: originalError,
205
+ * details: { nodeId: "resize-1", fileId: "abc123" }
206
+ * });
207
+ *
208
+ * // Use with Effect
209
+ * const effect = customError.toEffect<void>();
210
+ *
211
+ * // In an Effect pipeline
212
+ * return Effect.gen(function* () {
213
+ * const file = yield* getFile(id);
214
+ * if (!file) {
215
+ * return yield* UploadistaError.fromCode("FILE_NOT_FOUND").toEffect();
216
+ * }
217
+ * return file;
218
+ * });
219
+ * ```
220
+ */
221
+ export class UploadistaError extends Data.TaggedError("UploadistaError") {
222
+ readonly code: string;
223
+ readonly status: number;
224
+ // Keep legacy property names for backward compatibility
225
+ readonly status_code: number;
226
+ readonly body: string;
227
+ readonly details?: unknown;
228
+
229
+ constructor({
230
+ code,
231
+ status,
232
+ body,
233
+ cause,
234
+ details,
235
+ }: {
236
+ code: UploadistaErrorCode | string;
237
+ status: number;
238
+ body: string;
239
+ cause?: unknown;
240
+ details?: unknown;
241
+ }) {
242
+ super();
243
+ this.name = "UploadistaError";
244
+ this.code = code;
245
+ this.status = status;
246
+ this.status_code = status; // legacy alias
247
+ this.body = body;
248
+ this.details = details;
249
+ if (cause) (this as unknown as { cause?: unknown }).cause = cause;
250
+ }
251
+
252
+ /**
253
+ * Creates an UploadistaError from a predefined error code.
254
+ *
255
+ * This is the primary way to create errors in the Uploadista system. Each error code
256
+ * has a default status and message defined in ERROR_CATALOG, but these can be overridden
257
+ * for specific use cases.
258
+ *
259
+ * @param code - One of the predefined error codes from UploadistaErrorCode
260
+ * @param overrides - Optional overrides for the default error properties
261
+ * @param overrides.status - Custom HTTP status code (overrides the default)
262
+ * @param overrides.body - Custom error message (overrides the default)
263
+ * @param overrides.details - Additional structured data about the error
264
+ * @param overrides.cause - The underlying error that caused this error (for error chaining)
265
+ *
266
+ * @returns A new UploadistaError instance
267
+ *
268
+ * @example
269
+ * ```typescript
270
+ * // Use default error
271
+ * const error = UploadistaError.fromCode("FILE_NOT_FOUND");
272
+ *
273
+ * // Override message
274
+ * const customError = UploadistaError.fromCode("FILE_NOT_FOUND", {
275
+ * body: `File with ID ${fileId} was not found in storage`
276
+ * });
277
+ *
278
+ * // Include cause and details
279
+ * const detailedError = UploadistaError.fromCode("DATASTORE_NOT_FOUND", {
280
+ * cause: storageException,
281
+ * details: { storageId: "s3-prod", region: "us-east-1" }
282
+ * });
283
+ * ```
284
+ */
285
+ static fromCode(
286
+ code: UploadistaErrorCode,
287
+ overrides?: Partial<Pick<UploadistaError, "status" | "body">> & {
288
+ details?: unknown;
289
+ cause?: unknown;
290
+ }
291
+ ): UploadistaError {
292
+ const base = ERROR_CATALOG[code];
293
+ return new UploadistaError({
294
+ code,
295
+ status: overrides?.status ?? base.status,
296
+ body: overrides?.body ?? base.body,
297
+ details: overrides?.details,
298
+ cause: overrides?.cause,
299
+ });
300
+ }
301
+
302
+ /**
303
+ * Converts this error to an Effect that immediately fails.
304
+ *
305
+ * This method integrates UploadistaError with Effect-TS's error handling system,
306
+ * allowing errors to be used in Effect pipelines with proper type checking.
307
+ *
308
+ * @template T - The success type of the Effect (defaults to never since it always fails)
309
+ * @returns An Effect that fails with this UploadistaError
310
+ *
311
+ * @example
312
+ * ```typescript
313
+ * const error = UploadistaError.fromCode("FILE_NOT_FOUND");
314
+ *
315
+ * // Use in an Effect pipeline
316
+ * return Effect.gen(function* () {
317
+ * const file = yield* kvStore.get(fileId);
318
+ * if (!file) {
319
+ * return yield* error.toEffect();
320
+ * }
321
+ * return file;
322
+ * });
323
+ * ```
324
+ */
325
+ toEffect<T = never>(): Effect.Effect<T, UploadistaError> {
326
+ return Effect.fail(this);
327
+ }
328
+ }
329
+
330
+ /**
331
+ * Type guard to check if an unknown value is an UploadistaError.
332
+ *
333
+ * Useful for error handling when catching errors that might be from
334
+ * different sources or libraries.
335
+ *
336
+ * @param error - The value to check
337
+ * @returns True if the value is an UploadistaError instance
338
+ *
339
+ * @example
340
+ * ```typescript
341
+ * try {
342
+ * await someOperation();
343
+ * } catch (error) {
344
+ * if (isUploadistaError(error)) {
345
+ * console.log(`Uploadista error: ${error.code} (${error.status})`);
346
+ * console.log(error.body);
347
+ * } else {
348
+ * console.error("Unknown error:", error);
349
+ * }
350
+ * }
351
+ * ```
352
+ */
353
+ export function isUploadistaError(error: unknown): error is UploadistaError {
354
+ return error instanceof UploadistaError;
355
+ }
356
+
357
+ /**
358
+ * Creates an Effect that immediately fails with an UploadistaError.
359
+ *
360
+ * This is a convenience function that combines error creation with Effect conversion.
361
+ * It's equivalent to calling `UploadistaError.fromCode(code, overrides).toEffect()`.
362
+ *
363
+ * @param code - One of the predefined error codes from UploadistaErrorCode
364
+ * @param overrides - Optional overrides for the default error properties
365
+ * @param overrides.status - Custom HTTP status code
366
+ * @param overrides.body - Custom error message
367
+ * @param overrides.details - Additional structured data about the error
368
+ * @param overrides.cause - The underlying error that caused this error
369
+ *
370
+ * @returns An Effect that immediately fails with the created UploadistaError
371
+ *
372
+ * @example
373
+ * ```typescript
374
+ * // In an Effect pipeline
375
+ * return Effect.gen(function* () {
376
+ * const file = yield* kvStore.get(fileId);
377
+ * if (!file) {
378
+ * return yield* httpFailure("FILE_NOT_FOUND", {
379
+ * details: { fileId }
380
+ * });
381
+ * }
382
+ * return file;
383
+ * });
384
+ * ```
385
+ */
386
+ export function httpFailure(
387
+ code: UploadistaErrorCode,
388
+ overrides?: Partial<Pick<UploadistaError, "status" | "body">> & {
389
+ details?: unknown;
390
+ cause?: unknown;
391
+ }
392
+ ): Effect.Effect<never, UploadistaError> {
393
+ return UploadistaError.fromCode(code, overrides).toEffect();
394
+ }