@fragno-dev/upload 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (301) hide show
  1. package/README.md +148 -12
  2. package/dist/browser/client/clients.js +17 -9
  3. package/dist/browser/client/clients.js.map +1 -1
  4. package/dist/browser/client/helpers.d.ts +15 -6
  5. package/dist/browser/client/helpers.d.ts.map +1 -1
  6. package/dist/browser/client/helpers.js +176 -30
  7. package/dist/browser/client/helpers.js.map +1 -1
  8. package/dist/browser/client/node_modules/.pnpm/{@nanostores_query@0.3.4_nanostores@1.1.0 → @nanostores_query@0.3.4_nanostores@1.2.0}/node_modules/@nanostores/query/dist/nanoquery.js +6 -6
  9. package/dist/browser/client/node_modules/.pnpm/{@nanostores_query@0.3.4_nanostores@1.1.0 → @nanostores_query@0.3.4_nanostores@1.2.0}/node_modules/@nanostores/query/dist/nanoquery.js.map +1 -1
  10. package/dist/browser/client/node_modules/.pnpm/{@nanostores_solid@1.1.1_nanostores@1.1.0_solid-js@1.9.10 → @nanostores_solid@1.1.1_nanostores@1.2.0_solid-js@1.9.10}/node_modules/@nanostores/solid/dist/index.js +2 -2
  11. package/dist/browser/client/node_modules/.pnpm/{@nanostores_solid@1.1.1_nanostores@1.1.0_solid-js@1.9.10 → @nanostores_solid@1.1.1_nanostores@1.2.0_solid-js@1.9.10}/node_modules/@nanostores/solid/dist/index.js.map +1 -1
  12. package/dist/browser/client/node_modules/.pnpm/{nanostores@1.1.0 → nanostores@1.2.0}/node_modules/nanostores/atom/index.js +2 -1
  13. package/dist/browser/client/node_modules/.pnpm/nanostores@1.2.0/node_modules/nanostores/atom/index.js.map +1 -0
  14. package/dist/browser/client/node_modules/.pnpm/nanostores@1.2.0/node_modules/nanostores/clean-stores/index.js +6 -0
  15. package/dist/browser/client/node_modules/.pnpm/{nanostores@1.1.0 → nanostores@1.2.0}/node_modules/nanostores/clean-stores/index.js.map +1 -1
  16. package/dist/browser/client/node_modules/.pnpm/{nanostores@1.1.0 → nanostores@1.2.0}/node_modules/nanostores/computed/index.js +8 -5
  17. package/dist/browser/client/node_modules/.pnpm/nanostores@1.2.0/node_modules/nanostores/computed/index.js.map +1 -0
  18. package/dist/browser/client/node_modules/.pnpm/{nanostores@1.1.0 → nanostores@1.2.0}/node_modules/nanostores/lifecycle/index.js +1 -1
  19. package/dist/browser/client/node_modules/.pnpm/{nanostores@1.1.0 → nanostores@1.2.0}/node_modules/nanostores/lifecycle/index.js.map +1 -1
  20. package/dist/browser/client/node_modules/.pnpm/{nanostores@1.1.0 → nanostores@1.2.0}/node_modules/nanostores/listen-keys/index.js +1 -1
  21. package/dist/browser/client/node_modules/.pnpm/{nanostores@1.1.0 → nanostores@1.2.0}/node_modules/nanostores/listen-keys/index.js.map +1 -1
  22. package/dist/browser/client/node_modules/.pnpm/{nanostores@1.1.0 → nanostores@1.2.0}/node_modules/nanostores/map/index.js +1 -1
  23. package/dist/browser/client/node_modules/.pnpm/{nanostores@1.1.0 → nanostores@1.2.0}/node_modules/nanostores/map/index.js.map +1 -1
  24. package/dist/browser/client/node_modules/.pnpm/{nanostores@1.1.0 → nanostores@1.2.0}/node_modules/nanostores/task/index.js +1 -1
  25. package/dist/browser/client/node_modules/.pnpm/{nanostores@1.1.0 → nanostores@1.2.0}/node_modules/nanostores/task/index.js.map +1 -1
  26. package/dist/browser/client/node_modules/.pnpm/nanostores@1.2.0/node_modules/nanostores/warn/index.js +16 -0
  27. package/dist/browser/client/node_modules/.pnpm/nanostores@1.2.0/node_modules/nanostores/warn/index.js.map +1 -0
  28. package/dist/browser/client/packages/fragment-upload/src/definition.js +1 -42
  29. package/dist/browser/client/packages/fragment-upload/src/definition.js.map +1 -1
  30. package/dist/browser/client/packages/fragment-upload/src/routes/files.js +12 -5
  31. package/dist/browser/client/packages/fragment-upload/src/routes/files.js.map +1 -1
  32. package/dist/browser/client/packages/fragment-upload/src/routes/shared.js +3 -4
  33. package/dist/browser/client/packages/fragment-upload/src/routes/shared.js.map +1 -1
  34. package/dist/browser/client/packages/fragment-upload/src/routes/uploads.js +32 -21
  35. package/dist/browser/client/packages/fragment-upload/src/routes/uploads.js.map +1 -1
  36. package/dist/browser/client/packages/fragment-upload/src/schema.js +33 -3
  37. package/dist/browser/client/packages/fragment-upload/src/schema.js.map +1 -1
  38. package/dist/browser/client/packages/fragment-upload/src/types.d.ts +1 -2
  39. package/dist/browser/client/packages/fragment-upload/src/types.d.ts.map +1 -1
  40. package/dist/browser/client/packages/fragno/dist/client/client.js +28 -12
  41. package/dist/browser/client/packages/fragno/dist/client/client.js.map +1 -1
  42. package/dist/browser/client/packages/fragno/dist/client/client.svelte.js +11 -3
  43. package/dist/browser/client/packages/fragno/dist/client/client.svelte.js.map +1 -1
  44. package/dist/browser/client/packages/fragno/dist/client/react.js +104 -12
  45. package/dist/browser/client/packages/fragno/dist/client/react.js.map +1 -1
  46. package/dist/browser/client/packages/fragno/dist/client/solid.js +25 -11
  47. package/dist/browser/client/packages/fragno/dist/client/solid.js.map +1 -1
  48. package/dist/browser/client/packages/fragno/dist/client/vanilla.js +21 -1
  49. package/dist/browser/client/packages/fragno/dist/client/vanilla.js.map +1 -1
  50. package/dist/browser/client/packages/fragno/dist/client/vue.js +19 -11
  51. package/dist/browser/client/packages/fragno/dist/client/vue.js.map +1 -1
  52. package/dist/browser/client/react.d.ts +215 -192
  53. package/dist/browser/client/react.d.ts.map +1 -1
  54. package/dist/browser/client/react.js.map +1 -1
  55. package/dist/browser/client/solid.d.ts +218 -196
  56. package/dist/browser/client/solid.d.ts.map +1 -1
  57. package/dist/browser/client/solid.js.map +1 -1
  58. package/dist/browser/client/svelte.d.ts +216 -193
  59. package/dist/browser/client/svelte.d.ts.map +1 -1
  60. package/dist/browser/client/svelte.js.map +1 -1
  61. package/dist/browser/client/vanilla.d.ts +217 -195
  62. package/dist/browser/client/vanilla.d.ts.map +1 -1
  63. package/dist/browser/client/vanilla.js.map +1 -1
  64. package/dist/browser/client/vue.d.ts +217 -194
  65. package/dist/browser/client/vue.d.ts.map +1 -1
  66. package/dist/browser/client/vue.js.map +1 -1
  67. package/dist/cli/commands/files/delete.d.ts +4 -4
  68. package/dist/cli/commands/files/delete.d.ts.map +1 -1
  69. package/dist/cli/commands/files/delete.js +8 -10
  70. package/dist/cli/commands/files/delete.js.map +1 -1
  71. package/dist/cli/commands/files/download-url.d.ts +4 -4
  72. package/dist/cli/commands/files/download-url.d.ts.map +1 -1
  73. package/dist/cli/commands/files/download-url.js +8 -10
  74. package/dist/cli/commands/files/download-url.js.map +1 -1
  75. package/dist/cli/commands/files/download.d.ts +4 -4
  76. package/dist/cli/commands/files/download.d.ts.map +1 -1
  77. package/dist/cli/commands/files/download.js +10 -12
  78. package/dist/cli/commands/files/download.js.map +1 -1
  79. package/dist/cli/commands/files/get.d.ts +4 -4
  80. package/dist/cli/commands/files/get.d.ts.map +1 -1
  81. package/dist/cli/commands/files/get.js +8 -10
  82. package/dist/cli/commands/files/get.js.map +1 -1
  83. package/dist/cli/commands/files/list.d.ts +4 -4
  84. package/dist/cli/commands/files/list.d.ts.map +1 -1
  85. package/dist/cli/commands/files/list.js +6 -8
  86. package/dist/cli/commands/files/list.js.map +1 -1
  87. package/dist/cli/commands/files/update.d.ts +4 -4
  88. package/dist/cli/commands/files/update.d.ts.map +1 -1
  89. package/dist/cli/commands/files/update.js +8 -10
  90. package/dist/cli/commands/files/update.js.map +1 -1
  91. package/dist/cli/commands/files/upload.d.ts +4 -4
  92. package/dist/cli/commands/files/upload.d.ts.map +1 -1
  93. package/dist/cli/commands/files/upload.js +10 -12
  94. package/dist/cli/commands/files/upload.js.map +1 -1
  95. package/dist/cli/commands/uploads/abort.d.ts +2 -2
  96. package/dist/cli/commands/uploads/abort.d.ts.map +1 -1
  97. package/dist/cli/commands/uploads/abort.js.map +1 -1
  98. package/dist/cli/commands/uploads/complete.d.ts +2 -2
  99. package/dist/cli/commands/uploads/complete.d.ts.map +1 -1
  100. package/dist/cli/commands/uploads/complete.js.map +1 -1
  101. package/dist/cli/commands/uploads/content.d.ts +2 -2
  102. package/dist/cli/commands/uploads/content.d.ts.map +1 -1
  103. package/dist/cli/commands/uploads/content.js +1 -1
  104. package/dist/cli/commands/uploads/content.js.map +1 -1
  105. package/dist/cli/commands/uploads/create.d.ts +4 -4
  106. package/dist/cli/commands/uploads/create.d.ts.map +1 -1
  107. package/dist/cli/commands/uploads/create.js +8 -11
  108. package/dist/cli/commands/uploads/create.js.map +1 -1
  109. package/dist/cli/commands/uploads/get.d.ts +2 -2
  110. package/dist/cli/commands/uploads/get.d.ts.map +1 -1
  111. package/dist/cli/commands/uploads/get.js.map +1 -1
  112. package/dist/cli/commands/uploads/parts-complete.d.ts +2 -2
  113. package/dist/cli/commands/uploads/parts-complete.d.ts.map +1 -1
  114. package/dist/cli/commands/uploads/parts-complete.js.map +1 -1
  115. package/dist/cli/commands/uploads/parts-list.d.ts +2 -2
  116. package/dist/cli/commands/uploads/parts-list.d.ts.map +1 -1
  117. package/dist/cli/commands/uploads/parts-list.js.map +1 -1
  118. package/dist/cli/commands/uploads/parts-urls.d.ts +2 -2
  119. package/dist/cli/commands/uploads/parts-urls.d.ts.map +1 -1
  120. package/dist/cli/commands/uploads/parts-urls.js.map +1 -1
  121. package/dist/cli/commands/uploads/progress.d.ts +2 -2
  122. package/dist/cli/commands/uploads/progress.d.ts.map +1 -1
  123. package/dist/cli/commands/uploads/progress.js.map +1 -1
  124. package/dist/cli/commands/uploads/transfer.d.ts +4 -4
  125. package/dist/cli/commands/uploads/transfer.d.ts.map +1 -1
  126. package/dist/cli/commands/uploads/transfer.js +9 -12
  127. package/dist/cli/commands/uploads/transfer.js.map +1 -1
  128. package/dist/cli/index.d.ts +13 -13
  129. package/dist/cli/index.d.ts.map +1 -1
  130. package/dist/cli/index.js +14 -14
  131. package/dist/cli/index.js.map +1 -1
  132. package/dist/cli/utils/client.js +22 -5
  133. package/dist/cli/utils/client.js.map +1 -1
  134. package/dist/cli/utils/options.js +7 -43
  135. package/dist/cli/utils/options.js.map +1 -1
  136. package/dist/node/cli/commands/files/delete.d.ts +4 -4
  137. package/dist/node/cli/commands/files/delete.d.ts.map +1 -1
  138. package/dist/node/cli/commands/files/delete.js +8 -10
  139. package/dist/node/cli/commands/files/delete.js.map +1 -1
  140. package/dist/node/cli/commands/files/download-url.d.ts +4 -4
  141. package/dist/node/cli/commands/files/download-url.d.ts.map +1 -1
  142. package/dist/node/cli/commands/files/download-url.js +8 -10
  143. package/dist/node/cli/commands/files/download-url.js.map +1 -1
  144. package/dist/node/cli/commands/files/download.d.ts +4 -4
  145. package/dist/node/cli/commands/files/download.d.ts.map +1 -1
  146. package/dist/node/cli/commands/files/download.js +9 -11
  147. package/dist/node/cli/commands/files/download.js.map +1 -1
  148. package/dist/node/cli/commands/files/get.d.ts +4 -4
  149. package/dist/node/cli/commands/files/get.d.ts.map +1 -1
  150. package/dist/node/cli/commands/files/get.js +8 -10
  151. package/dist/node/cli/commands/files/get.js.map +1 -1
  152. package/dist/node/cli/commands/files/list.d.ts +4 -4
  153. package/dist/node/cli/commands/files/list.d.ts.map +1 -1
  154. package/dist/node/cli/commands/files/list.js +6 -8
  155. package/dist/node/cli/commands/files/list.js.map +1 -1
  156. package/dist/node/cli/commands/files/update.d.ts +4 -4
  157. package/dist/node/cli/commands/files/update.d.ts.map +1 -1
  158. package/dist/node/cli/commands/files/update.js +8 -10
  159. package/dist/node/cli/commands/files/update.js.map +1 -1
  160. package/dist/node/cli/commands/files/upload.d.ts +4 -4
  161. package/dist/node/cli/commands/files/upload.d.ts.map +1 -1
  162. package/dist/node/cli/commands/files/upload.js +9 -11
  163. package/dist/node/cli/commands/files/upload.js.map +1 -1
  164. package/dist/node/cli/commands/uploads/abort.d.ts +2 -2
  165. package/dist/node/cli/commands/uploads/abort.d.ts.map +1 -1
  166. package/dist/node/cli/commands/uploads/abort.js.map +1 -1
  167. package/dist/node/cli/commands/uploads/complete.d.ts +2 -2
  168. package/dist/node/cli/commands/uploads/complete.d.ts.map +1 -1
  169. package/dist/node/cli/commands/uploads/complete.js.map +1 -1
  170. package/dist/node/cli/commands/uploads/content.d.ts +2 -2
  171. package/dist/node/cli/commands/uploads/content.d.ts.map +1 -1
  172. package/dist/node/cli/commands/uploads/content.js.map +1 -1
  173. package/dist/node/cli/commands/uploads/create.d.ts +4 -4
  174. package/dist/node/cli/commands/uploads/create.d.ts.map +1 -1
  175. package/dist/node/cli/commands/uploads/create.js +8 -11
  176. package/dist/node/cli/commands/uploads/create.js.map +1 -1
  177. package/dist/node/cli/commands/uploads/get.d.ts +2 -2
  178. package/dist/node/cli/commands/uploads/get.d.ts.map +1 -1
  179. package/dist/node/cli/commands/uploads/get.js.map +1 -1
  180. package/dist/node/cli/commands/uploads/parts-complete.d.ts +2 -2
  181. package/dist/node/cli/commands/uploads/parts-complete.d.ts.map +1 -1
  182. package/dist/node/cli/commands/uploads/parts-complete.js.map +1 -1
  183. package/dist/node/cli/commands/uploads/parts-list.d.ts +2 -2
  184. package/dist/node/cli/commands/uploads/parts-list.d.ts.map +1 -1
  185. package/dist/node/cli/commands/uploads/parts-list.js.map +1 -1
  186. package/dist/node/cli/commands/uploads/parts-urls.d.ts +2 -2
  187. package/dist/node/cli/commands/uploads/parts-urls.d.ts.map +1 -1
  188. package/dist/node/cli/commands/uploads/parts-urls.js.map +1 -1
  189. package/dist/node/cli/commands/uploads/progress.d.ts +2 -2
  190. package/dist/node/cli/commands/uploads/progress.d.ts.map +1 -1
  191. package/dist/node/cli/commands/uploads/progress.js.map +1 -1
  192. package/dist/node/cli/commands/uploads/transfer.d.ts +4 -4
  193. package/dist/node/cli/commands/uploads/transfer.d.ts.map +1 -1
  194. package/dist/node/cli/commands/uploads/transfer.js +8 -11
  195. package/dist/node/cli/commands/uploads/transfer.js.map +1 -1
  196. package/dist/node/cli/index.d.ts +13 -13
  197. package/dist/node/cli/index.d.ts.map +1 -1
  198. package/dist/node/cli/index.js +14 -14
  199. package/dist/node/cli/index.js.map +1 -1
  200. package/dist/node/cli/utils/client.js +22 -5
  201. package/dist/node/cli/utils/client.js.map +1 -1
  202. package/dist/node/cli/utils/options.js +7 -43
  203. package/dist/node/cli/utils/options.js.map +1 -1
  204. package/dist/node/client/clients.d.ts +217 -194
  205. package/dist/node/client/clients.d.ts.map +1 -1
  206. package/dist/node/client/clients.js +17 -9
  207. package/dist/node/client/clients.js.map +1 -1
  208. package/dist/node/client/helpers.d.ts +15 -6
  209. package/dist/node/client/helpers.d.ts.map +1 -1
  210. package/dist/node/client/helpers.js +176 -30
  211. package/dist/node/client/helpers.js.map +1 -1
  212. package/dist/node/client/react.d.ts +217 -194
  213. package/dist/node/client/react.d.ts.map +1 -1
  214. package/dist/node/client/react.js.map +1 -1
  215. package/dist/node/client/solid.d.ts +218 -196
  216. package/dist/node/client/solid.d.ts.map +1 -1
  217. package/dist/node/client/solid.js.map +1 -1
  218. package/dist/node/client/svelte.d.ts +216 -193
  219. package/dist/node/client/svelte.d.ts.map +1 -1
  220. package/dist/node/client/svelte.js.map +1 -1
  221. package/dist/node/client/vanilla.d.ts +217 -195
  222. package/dist/node/client/vanilla.d.ts.map +1 -1
  223. package/dist/node/client/vanilla.js.map +1 -1
  224. package/dist/node/client/vue.d.ts +217 -194
  225. package/dist/node/client/vue.d.ts.map +1 -1
  226. package/dist/node/client/vue.js.map +1 -1
  227. package/dist/node/config.d.ts +6 -6
  228. package/dist/node/config.d.ts.map +1 -1
  229. package/dist/node/config.js.map +1 -1
  230. package/dist/node/definition.d.ts +588 -219
  231. package/dist/node/definition.d.ts.map +1 -1
  232. package/dist/node/definition.js +27 -3
  233. package/dist/node/definition.js.map +1 -1
  234. package/dist/node/file-key.d.ts +19 -0
  235. package/dist/node/file-key.d.ts.map +1 -0
  236. package/dist/node/file-key.js +47 -0
  237. package/dist/node/file-key.js.map +1 -0
  238. package/dist/node/index.d.ts +582 -175
  239. package/dist/node/index.d.ts.map +1 -1
  240. package/dist/node/index.js +3 -2
  241. package/dist/node/index.js.map +1 -1
  242. package/dist/node/routes/files.js +99 -64
  243. package/dist/node/routes/files.js.map +1 -1
  244. package/dist/node/routes/index.d.ts +1497 -721
  245. package/dist/node/routes/index.d.ts.map +1 -1
  246. package/dist/node/routes/shared.js +5 -9
  247. package/dist/node/routes/shared.js.map +1 -1
  248. package/dist/node/routes/uploads.js +105 -47
  249. package/dist/node/routes/uploads.js.map +1 -1
  250. package/dist/node/schema.d.ts +6 -6
  251. package/dist/node/schema.d.ts.map +1 -1
  252. package/dist/node/schema.js +12 -3
  253. package/dist/node/schema.js.map +1 -1
  254. package/dist/node/services/files.d.ts +6 -2
  255. package/dist/node/services/files.d.ts.map +1 -1
  256. package/dist/node/services/files.js +22 -20
  257. package/dist/node/services/files.js.map +1 -1
  258. package/dist/node/services/helpers.js +37 -15
  259. package/dist/node/services/helpers.js.map +1 -1
  260. package/dist/node/services/uploads.d.ts +10 -5
  261. package/dist/node/services/uploads.d.ts.map +1 -1
  262. package/dist/node/services/uploads.js +340 -63
  263. package/dist/node/services/uploads.js.map +1 -1
  264. package/dist/node/storage/fs.d.ts.map +1 -1
  265. package/dist/node/storage/fs.js +16 -10
  266. package/dist/node/storage/fs.js.map +1 -1
  267. package/dist/node/storage/object-key.js +36 -0
  268. package/dist/node/storage/object-key.js.map +1 -0
  269. package/dist/node/storage/r2-binding.d.ts +59 -0
  270. package/dist/node/storage/r2-binding.d.ts.map +1 -0
  271. package/dist/node/storage/r2-binding.js +245 -0
  272. package/dist/node/storage/r2-binding.js.map +1 -0
  273. package/dist/node/storage/r2.d.ts +6 -5
  274. package/dist/node/storage/r2.d.ts.map +1 -1
  275. package/dist/node/storage/s3.d.ts.map +1 -1
  276. package/dist/node/storage/s3.js +16 -10
  277. package/dist/node/storage/s3.js.map +1 -1
  278. package/dist/node/storage/types.d.ts +6 -5
  279. package/dist/node/storage/types.d.ts.map +1 -1
  280. package/dist/node/types.d.ts +1 -2
  281. package/dist/node/types.d.ts.map +1 -1
  282. package/package.json +26 -46
  283. package/dist/browser/client/node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/atom/index.js.map +0 -1
  284. package/dist/browser/client/node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/clean-stores/index.js +0 -6
  285. package/dist/browser/client/node_modules/.pnpm/nanostores@1.1.0/node_modules/nanostores/computed/index.js.map +0 -1
  286. package/dist/browser/client/packages/fragment-upload/src/keys.d.ts +0 -7
  287. package/dist/browser/client/packages/fragment-upload/src/keys.d.ts.map +0 -1
  288. package/dist/browser/client/packages/fragment-upload/src/keys.js +0 -28
  289. package/dist/browser/client/packages/fragment-upload/src/keys.js.map +0 -1
  290. package/dist/browser/index-BdjKPO4J.d.ts +0 -177
  291. package/dist/browser/index-BdjKPO4J.d.ts.map +0 -1
  292. package/dist/browser/index.js +0 -3
  293. package/dist/browser/src-vdNJUbjT.js +0 -1982
  294. package/dist/browser/src-vdNJUbjT.js.map +0 -1
  295. package/dist/cli/keys.js +0 -32
  296. package/dist/cli/keys.js.map +0 -1
  297. package/dist/node/keys.d.ts +0 -12
  298. package/dist/node/keys.d.ts.map +0 -1
  299. package/dist/node/keys.js +0 -63
  300. package/dist/node/keys.js.map +0 -1
  301. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -23,6 +23,7 @@ const ensureMultipartUpload = (upload) => {
23
23
  const normalizeUploadInput = (input) => {
24
24
  return {
25
25
  ...input,
26
+ provider: input.provider,
26
27
  uploaderId: input.uploaderId ?? null,
27
28
  visibility: input.visibility ?? DEFAULT_VISIBILITY,
28
29
  checksum: input.checksum ?? null,
@@ -39,65 +40,92 @@ const pickActiveUpload = (uploads, now) => {
39
40
  const uploadMetadataMatches = (upload, input) => {
40
41
  return upload.filename === input.filename && upload.contentType === input.contentType && upload.visibility === input.visibility && (upload.uploaderId ?? null) === input.uploaderId && upload.expectedSizeBytes === input.expectedSizeBytes && isDeepStrictEqual(upload.checksum ?? null, input.checksum) && isDeepStrictEqual(upload.tags ?? null, input.tags) && isDeepStrictEqual(upload.metadata ?? null, input.metadata);
41
42
  };
43
+ const buildProviderStickyUploadEndpoint = (uploadId, provider, suffix = "") => {
44
+ return `/uploads/${uploadId}${suffix}?${new URLSearchParams({ provider }).toString()}`;
45
+ };
46
+ const buildUploadSessionRouteData = (storage, input) => {
47
+ const { uploadId, provider, strategy } = input;
48
+ return {
49
+ provider,
50
+ upload: {
51
+ mode: strategy === "direct-multipart" ? "multipart" : "single",
52
+ transport: strategy === "proxy" ? "proxy" : "direct",
53
+ uploadUrl: input.uploadUrl,
54
+ uploadHeaders: input.uploadHeaders,
55
+ partSizeBytes: input.partSizeBytes,
56
+ maxParts: storage.limits?.maxMultipartParts,
57
+ statusEndpoint: buildProviderStickyUploadEndpoint(uploadId, provider),
58
+ progressEndpoint: buildProviderStickyUploadEndpoint(uploadId, provider, "/progress"),
59
+ partsEndpoint: strategy === "direct-multipart" ? buildProviderStickyUploadEndpoint(uploadId, provider, "/parts") : void 0,
60
+ partsCompleteEndpoint: strategy === "direct-multipart" ? buildProviderStickyUploadEndpoint(uploadId, provider, "/parts/complete") : void 0,
61
+ completeEndpoint: buildProviderStickyUploadEndpoint(uploadId, provider, "/complete"),
62
+ abortEndpoint: buildProviderStickyUploadEndpoint(uploadId, provider, "/abort"),
63
+ contentEndpoint: strategy === "proxy" ? buildProviderStickyUploadEndpoint(uploadId, provider, "/content") : void 0
64
+ }
65
+ };
66
+ };
42
67
  const buildCreateUploadResult = (storage, upload) => {
43
68
  const uploadId = upload.id.toString();
44
69
  const strategy = upload.strategy;
45
- const resolved = resolveFileKeyInput({ fileKey: upload.fileKey });
46
70
  const uploadHeaders = upload.uploadHeaders;
47
71
  return {
48
72
  uploadId,
49
- fileKey: upload.fileKey,
50
- fileKeyParts: resolved.fileKeyParts,
51
- status: upload.status,
52
- strategy,
53
- expiresAt: upload.expiresAt,
54
- upload: {
55
- mode: strategy === "direct-multipart" ? "multipart" : "single",
56
- transport: strategy === "proxy" ? "proxy" : "direct",
73
+ fileKey: upload.key,
74
+ ...buildUploadSessionRouteData(storage, {
75
+ uploadId,
76
+ provider: upload.provider,
77
+ strategy,
57
78
  uploadUrl: upload.uploadUrl ?? void 0,
58
79
  uploadHeaders: uploadHeaders ?? void 0,
59
- partSizeBytes: upload.partSizeBytes ?? void 0,
60
- maxParts: storage.limits?.maxMultipartParts,
61
- partsEndpoint: strategy === "direct-multipart" ? `/uploads/${uploadId}/parts` : void 0,
62
- completeEndpoint: `/uploads/${uploadId}/complete`,
63
- contentEndpoint: strategy === "proxy" ? `/uploads/${uploadId}/content` : void 0
64
- }
80
+ partSizeBytes: upload.partSizeBytes ?? void 0
81
+ }),
82
+ status: upload.status,
83
+ strategy,
84
+ expiresAt: upload.expiresAt
65
85
  };
66
86
  };
67
- const buildCreateUploadResultFromInit = (storage, resolved, storageInit, uploadId) => {
87
+ const buildCreateUploadResultFromInit = (storage, provider, resolved, storageInit, uploadId) => {
68
88
  const strategy = storageInit.strategy;
69
89
  return {
70
90
  uploadId,
71
91
  fileKey: resolved.fileKey,
72
- fileKeyParts: resolved.fileKeyParts,
73
- status: "created",
74
- strategy,
75
- expiresAt: storageInit.expiresAt,
76
- upload: {
77
- mode: strategy === "direct-multipart" ? "multipart" : "single",
78
- transport: strategy === "proxy" ? "proxy" : "direct",
92
+ ...buildUploadSessionRouteData(storage, {
93
+ uploadId,
94
+ provider,
95
+ strategy,
79
96
  uploadUrl: storageInit.uploadUrl,
80
97
  uploadHeaders: storageInit.uploadHeaders,
81
- partSizeBytes: storageInit.partSizeBytes,
82
- maxParts: storage.limits?.maxMultipartParts,
83
- partsEndpoint: strategy === "direct-multipart" ? `/uploads/${uploadId}/parts` : void 0,
84
- completeEndpoint: `/uploads/${uploadId}/complete`,
85
- contentEndpoint: strategy === "proxy" ? `/uploads/${uploadId}/content` : void 0
86
- }
98
+ partSizeBytes: storageInit.partSizeBytes
99
+ }),
100
+ status: "created",
101
+ strategy,
102
+ expiresAt: storageInit.expiresAt
87
103
  };
88
104
  };
89
105
  const buildUploadHookPayload = (upload, sizeBytes) => {
90
- const fileKeyParts = resolveFileKeyInput({ fileKey: upload.fileKey }).fileKeyParts;
91
106
  const resolvedSizeBytes = sizeBytes ?? upload.expectedSizeBytes;
92
107
  return {
93
- fileKey: upload.fileKey,
94
- fileKeyParts,
108
+ provider: upload.provider,
109
+ fileKey: upload.key,
110
+ objectKey: upload.objectKey,
95
111
  uploadId: upload.id.toString(),
96
112
  uploaderId: upload.uploaderId ?? null,
97
113
  sizeBytes: toSafeNumber(resolvedSizeBytes),
98
114
  contentType: upload.contentType
99
115
  };
100
116
  };
117
+ const buildFileHookPayload = (file) => ({
118
+ provider: file.provider,
119
+ fileKey: file.key,
120
+ objectKey: file.objectKey,
121
+ uploaderId: file.uploaderId ?? null,
122
+ sizeBytes: toSafeNumber(file.sizeBytes),
123
+ contentType: file.contentType
124
+ });
125
+ const ensureReplacementUsesDistinctObjectKey = (file, nextObjectKey) => {
126
+ if (file.objectKey === nextObjectKey) throw new Error("STORAGE_ERROR");
127
+ };
128
+ const shouldCleanupSupersededObject = (file, nextObjectKey) => file.status !== "deleted" && file.objectKey !== nextObjectKey;
101
129
  const createUploadServices = (config) => {
102
130
  const storage = config.storage;
103
131
  return {
@@ -106,13 +134,10 @@ const createUploadServices = (config) => {
106
134
  const now = /* @__PURE__ */ new Date();
107
135
  const normalized = normalizeUploadInput(input);
108
136
  const hasChecksum = normalized.checksum !== null;
109
- return this.serviceTx(uploadSchema).retrieve((uow) => uow.findFirst("file", (b) => b.whereIndex("idx_file_key", (eb) => eb("fileKey", "=", resolved.fileKey))).find("upload", (b) => b.whereIndex("idx_upload_file_key", (eb) => eb("fileKey", "=", resolved.fileKey)))).transformRetrieve(([file, uploads]) => {
110
- if (file) throw new Error("FILE_ALREADY_EXISTS");
137
+ return this.serviceTx(uploadSchema).retrieve((uow) => uow.find("upload", (b) => b.whereIndex("idx_upload_provider_key", (eb) => eb.and(eb("provider", "=", normalized.provider), eb("key", "=", resolved.fileKey))))).transformRetrieve(([uploads]) => {
111
138
  const activeUpload = pickActiveUpload(uploads, now);
112
- if (!activeUpload) return null;
113
- if (!options.allowIdempotentReuse || !hasChecksum) throw new Error("UPLOAD_ALREADY_ACTIVE");
114
- if (!uploadMetadataMatches(activeUpload, normalized)) throw new Error("UPLOAD_METADATA_MISMATCH");
115
- return buildCreateUploadResult(storage, activeUpload);
139
+ if (activeUpload && options.allowIdempotentReuse && hasChecksum && uploadMetadataMatches(activeUpload, normalized)) return buildCreateUploadResult(storage, activeUpload);
140
+ return null;
116
141
  }).build();
117
142
  },
118
143
  createUploadRecord: function(input) {
@@ -120,20 +145,19 @@ const createUploadServices = (config) => {
120
145
  const now = /* @__PURE__ */ new Date();
121
146
  const normalized = normalizeUploadInput(input);
122
147
  const hasChecksum = normalized.checksum !== null;
123
- return this.serviceTx(uploadSchema).retrieve((uow) => uow.findFirst("file", (b) => b.whereIndex("idx_file_key", (eb) => eb("fileKey", "=", resolved.fileKey))).find("upload", (b) => b.whereIndex("idx_upload_file_key", (eb) => eb("fileKey", "=", resolved.fileKey)))).mutate(({ uow, retrieveResult: [existingFile, uploads] }) => {
124
- if (existingFile) throw new Error("FILE_ALREADY_EXISTS");
148
+ return this.serviceTx(uploadSchema).retrieve((uow) => uow.find("upload", (b) => b.whereIndex("idx_upload_provider_key", (eb) => eb.and(eb("provider", "=", normalized.provider), eb("key", "=", resolved.fileKey))))).mutate(({ uow, retrieveResult: [uploads] }) => {
125
149
  const activeUpload = pickActiveUpload(uploads, now);
126
150
  if (activeUpload) {
127
- if (!input.allowIdempotentReuse || !hasChecksum) throw new Error("UPLOAD_ALREADY_ACTIVE");
128
- if (!uploadMetadataMatches(activeUpload, normalized)) throw new Error("UPLOAD_METADATA_MISMATCH");
129
- return {
151
+ if (input.allowIdempotentReuse && hasChecksum && uploadMetadataMatches(activeUpload, normalized)) return {
130
152
  reused: true,
131
153
  existingUpload: activeUpload
132
154
  };
155
+ throw new Error("UPLOAD_ALREADY_ACTIVE");
133
156
  }
134
157
  const storageInit = input.storageInit;
135
158
  const uploadId = uow.create("upload", {
136
- fileKey: resolved.fileKey,
159
+ key: resolved.fileKey,
160
+ provider: normalized.provider,
137
161
  uploaderId: normalized.uploaderId,
138
162
  filename: normalized.filename,
139
163
  expectedSizeBytes: normalized.expectedSizeBytes,
@@ -144,8 +168,7 @@ const createUploadServices = (config) => {
144
168
  metadata: normalized.metadata,
145
169
  status: "created",
146
170
  strategy: storageInit.strategy,
147
- storageProvider: storage.name,
148
- storageKey: storageInit.storageKey,
171
+ objectKey: storageInit.storageKey,
149
172
  storageUploadId: storageInit.storageUploadId ?? null,
150
173
  uploadUrl: storageInit.uploadUrl ?? null,
151
174
  uploadHeaders: storageInit.uploadHeaders ?? null,
@@ -161,12 +184,13 @@ const createUploadServices = (config) => {
161
184
  });
162
185
  uow.triggerHook("onUploadTimeout", {
163
186
  uploadId: uploadId.toString(),
164
- fileKey: resolved.fileKey,
165
- fileKeyParts: resolved.fileKeyParts
187
+ provider: normalized.provider,
188
+ fileKey: resolved.fileKey
166
189
  }, { processAt: storageInit.expiresAt });
167
190
  return {
168
191
  reused: false,
169
192
  uploadId: uploadId.toString(),
193
+ provider: normalized.provider,
170
194
  resolved,
171
195
  storageInit
172
196
  };
@@ -177,8 +201,194 @@ const createUploadServices = (config) => {
177
201
  };
178
202
  return {
179
203
  reused: false,
180
- result: buildCreateUploadResultFromInit(storage, mutateResult.resolved, mutateResult.storageInit, mutateResult.uploadId)
204
+ result: buildCreateUploadResultFromInit(storage, mutateResult.provider, mutateResult.resolved, mutateResult.storageInit, mutateResult.uploadId)
205
+ };
206
+ }).build();
207
+ },
208
+ createCompletedUpload: function(input) {
209
+ const resolved = resolveFileKeyInput(input);
210
+ const now = /* @__PURE__ */ new Date();
211
+ const normalized = normalizeUploadInput(input);
212
+ const storageInit = input.storageInit;
213
+ return this.serviceTx(uploadSchema).retrieve((uow) => uow.findFirst("file", (b) => b.whereIndex("idx_file_provider_key", (eb) => eb.and(eb("provider", "=", normalized.provider), eb("key", "=", resolved.fileKey))))).mutate(({ uow, retrieveResult: [existingFile] }) => {
214
+ if (existingFile) ensureReplacementUsesDistinctObjectKey(existingFile, storageInit.storageKey);
215
+ const finalSizeBytes = input.completedSizeBytes;
216
+ const uploadId = uow.create("upload", {
217
+ key: resolved.fileKey,
218
+ provider: normalized.provider,
219
+ uploaderId: normalized.uploaderId,
220
+ filename: normalized.filename,
221
+ expectedSizeBytes: normalized.expectedSizeBytes,
222
+ contentType: normalized.contentType,
223
+ checksum: normalized.checksum,
224
+ visibility: normalized.visibility,
225
+ tags: normalized.tags,
226
+ metadata: normalized.metadata,
227
+ status: "completed",
228
+ strategy: storageInit.strategy,
229
+ objectKey: storageInit.storageKey,
230
+ storageUploadId: storageInit.storageUploadId ?? null,
231
+ uploadUrl: storageInit.uploadUrl ?? null,
232
+ uploadHeaders: storageInit.uploadHeaders ?? null,
233
+ bytesUploaded: finalSizeBytes,
234
+ partsUploaded: 0,
235
+ partSizeBytes: storageInit.partSizeBytes ?? null,
236
+ expiresAt: storageInit.expiresAt,
237
+ createdAt: now,
238
+ updatedAt: now,
239
+ completedAt: now,
240
+ errorCode: null,
241
+ errorMessage: null
242
+ });
243
+ const fileRecord = {
244
+ key: resolved.fileKey,
245
+ provider: normalized.provider,
246
+ uploaderId: normalized.uploaderId,
247
+ filename: normalized.filename,
248
+ sizeBytes: finalSizeBytes,
249
+ contentType: normalized.contentType,
250
+ checksum: normalized.checksum,
251
+ visibility: normalized.visibility,
252
+ tags: normalized.tags,
253
+ metadata: normalized.metadata,
254
+ status: "ready",
255
+ objectKey: storageInit.storageKey,
256
+ createdAt: now,
257
+ updatedAt: now,
258
+ completedAt: now,
259
+ deletedAt: null,
260
+ errorCode: null,
261
+ errorMessage: null
262
+ };
263
+ const persistedFile = existingFile ? (() => {
264
+ uow.update("file", existingFile.id, (b) => b.set({
265
+ key: fileRecord.key,
266
+ provider: fileRecord.provider,
267
+ uploaderId: fileRecord.uploaderId,
268
+ filename: fileRecord.filename,
269
+ sizeBytes: fileRecord.sizeBytes,
270
+ contentType: fileRecord.contentType,
271
+ checksum: fileRecord.checksum,
272
+ visibility: fileRecord.visibility,
273
+ tags: fileRecord.tags,
274
+ metadata: fileRecord.metadata,
275
+ status: fileRecord.status,
276
+ objectKey: fileRecord.objectKey,
277
+ createdAt: fileRecord.createdAt,
278
+ updatedAt: fileRecord.updatedAt,
279
+ completedAt: fileRecord.completedAt,
280
+ deletedAt: fileRecord.deletedAt,
281
+ errorCode: fileRecord.errorCode,
282
+ errorMessage: fileRecord.errorMessage
283
+ }).check());
284
+ if (shouldCleanupSupersededObject(existingFile, fileRecord.objectKey)) uow.triggerHook("cleanupStorageObject", buildFileHookPayload(existingFile));
285
+ return {
286
+ id: existingFile.id,
287
+ ...fileRecord
288
+ };
289
+ })() : (() => {
290
+ return {
291
+ id: uow.create("file", fileRecord),
292
+ ...fileRecord
293
+ };
294
+ })();
295
+ const uploadRow = {
296
+ id: uploadId,
297
+ key: resolved.fileKey,
298
+ provider: normalized.provider,
299
+ uploaderId: normalized.uploaderId,
300
+ filename: normalized.filename,
301
+ expectedSizeBytes: normalized.expectedSizeBytes,
302
+ contentType: normalized.contentType,
303
+ checksum: normalized.checksum,
304
+ visibility: normalized.visibility,
305
+ tags: normalized.tags,
306
+ metadata: normalized.metadata,
307
+ status: "completed",
308
+ strategy: storageInit.strategy,
309
+ objectKey: storageInit.storageKey,
310
+ storageUploadId: storageInit.storageUploadId ?? null,
311
+ uploadUrl: storageInit.uploadUrl ?? null,
312
+ uploadHeaders: storageInit.uploadHeaders ?? null,
313
+ bytesUploaded: finalSizeBytes,
314
+ partsUploaded: 0,
315
+ partSizeBytes: storageInit.partSizeBytes ?? null,
316
+ expiresAt: storageInit.expiresAt,
317
+ createdAt: now,
318
+ updatedAt: now,
319
+ completedAt: now,
320
+ errorCode: null,
321
+ errorMessage: null
322
+ };
323
+ uow.triggerHook("onFileReady", buildUploadHookPayload(uploadRow, finalSizeBytes));
324
+ return {
325
+ upload: uploadRow,
326
+ file: persistedFile
327
+ };
328
+ }).build();
329
+ },
330
+ createFailedUpload: function(input) {
331
+ const resolved = resolveFileKeyInput(input);
332
+ const now = /* @__PURE__ */ new Date();
333
+ const normalized = normalizeUploadInput(input);
334
+ const storageInit = input.storageInit;
335
+ return this.serviceTx(uploadSchema).mutate(({ uow }) => {
336
+ const uploadRow = {
337
+ id: uow.create("upload", {
338
+ key: resolved.fileKey,
339
+ provider: normalized.provider,
340
+ uploaderId: normalized.uploaderId,
341
+ filename: normalized.filename,
342
+ expectedSizeBytes: normalized.expectedSizeBytes,
343
+ contentType: normalized.contentType,
344
+ checksum: normalized.checksum,
345
+ visibility: normalized.visibility,
346
+ tags: normalized.tags,
347
+ metadata: normalized.metadata,
348
+ status: "failed",
349
+ strategy: storageInit.strategy,
350
+ objectKey: storageInit.storageKey,
351
+ storageUploadId: storageInit.storageUploadId ?? null,
352
+ uploadUrl: storageInit.uploadUrl ?? null,
353
+ uploadHeaders: storageInit.uploadHeaders ?? null,
354
+ bytesUploaded: 0n,
355
+ partsUploaded: 0,
356
+ partSizeBytes: storageInit.partSizeBytes ?? null,
357
+ expiresAt: storageInit.expiresAt,
358
+ createdAt: now,
359
+ updatedAt: now,
360
+ completedAt: null,
361
+ errorCode: input.errorCode,
362
+ errorMessage: input.errorMessage ?? null
363
+ }),
364
+ key: resolved.fileKey,
365
+ provider: normalized.provider,
366
+ uploaderId: normalized.uploaderId,
367
+ filename: normalized.filename,
368
+ expectedSizeBytes: normalized.expectedSizeBytes,
369
+ contentType: normalized.contentType,
370
+ checksum: normalized.checksum,
371
+ visibility: normalized.visibility,
372
+ tags: normalized.tags,
373
+ metadata: normalized.metadata,
374
+ status: "failed",
375
+ strategy: storageInit.strategy,
376
+ objectKey: storageInit.storageKey,
377
+ storageUploadId: storageInit.storageUploadId ?? null,
378
+ uploadUrl: storageInit.uploadUrl ?? null,
379
+ uploadHeaders: storageInit.uploadHeaders ?? null,
380
+ bytesUploaded: 0n,
381
+ partsUploaded: 0,
382
+ partSizeBytes: storageInit.partSizeBytes ?? null,
383
+ expiresAt: storageInit.expiresAt,
384
+ createdAt: now,
385
+ updatedAt: now,
386
+ completedAt: null,
387
+ errorCode: input.errorCode,
388
+ errorMessage: input.errorMessage ?? null
181
389
  };
390
+ uow.triggerHook("onUploadFailed", buildUploadHookPayload(uploadRow));
391
+ return { upload: uploadRow };
182
392
  }).build();
183
393
  },
184
394
  getUploadStatus: function(uploadId) {
@@ -251,12 +461,11 @@ const createUploadServices = (config) => {
251
461
  };
252
462
  }).build();
253
463
  },
254
- markUploadComplete: function(uploadId, fileKey, options) {
464
+ markUploadCompleteFromSnapshot: function(upload, options) {
255
465
  const now = /* @__PURE__ */ new Date();
256
- return this.serviceTx(uploadSchema).retrieve((uow) => uow.findFirst("upload", (b) => b.whereIndex("primary", (eb) => eb("id", "=", uploadId))).findFirst("file", (b) => b.whereIndex("idx_file_key", (eb) => eb("fileKey", "=", fileKey)))).mutate(({ uow, retrieveResult: [upload, existingFile] }) => {
257
- if (!upload) throw new Error("UPLOAD_NOT_FOUND");
466
+ return this.serviceTx(uploadSchema).retrieve((uow) => uow.findFirst("file", (b) => b.whereIndex("idx_file_provider_key", (eb) => eb.and(eb("provider", "=", upload.provider), eb("key", "=", upload.key))))).mutate(({ uow, retrieveResult: [existingFile] }) => {
258
467
  ensureActiveUpload(upload, now);
259
- if (existingFile) throw new Error("FILE_ALREADY_EXISTS");
468
+ if (existingFile) ensureReplacementUsesDistinctObjectKey(existingFile, upload.objectKey);
260
469
  const finalSizeBytes = options?.sizeBytes ?? upload.expectedSizeBytes;
261
470
  const updatedUpload = {
262
471
  ...upload,
@@ -271,8 +480,9 @@ const createUploadServices = (config) => {
271
480
  completedAt: updatedUpload.completedAt,
272
481
  bytesUploaded: updatedUpload.bytesUploaded
273
482
  }).check());
274
- const createdFile = {
275
- fileKey: upload.fileKey,
483
+ const completedFile = {
484
+ key: upload.key,
485
+ provider: upload.provider,
276
486
  uploaderId: upload.uploaderId ?? null,
277
487
  filename: upload.filename,
278
488
  sizeBytes: finalSizeBytes,
@@ -282,8 +492,7 @@ const createUploadServices = (config) => {
282
492
  tags: upload.tags ?? null,
283
493
  metadata: upload.metadata ?? null,
284
494
  status: "ready",
285
- storageProvider: upload.storageProvider,
286
- storageKey: upload.storageKey,
495
+ objectKey: upload.objectKey,
287
496
  createdAt: now,
288
497
  updatedAt: now,
289
498
  completedAt: now,
@@ -291,14 +500,42 @@ const createUploadServices = (config) => {
291
500
  errorCode: null,
292
501
  errorMessage: null
293
502
  };
294
- const fileId = uow.create("file", createdFile);
503
+ const persistedFile = existingFile ? (() => {
504
+ uow.update("file", existingFile.id, (b) => b.set({
505
+ key: completedFile.key,
506
+ provider: completedFile.provider,
507
+ uploaderId: completedFile.uploaderId,
508
+ filename: completedFile.filename,
509
+ sizeBytes: completedFile.sizeBytes,
510
+ contentType: completedFile.contentType,
511
+ checksum: completedFile.checksum,
512
+ visibility: completedFile.visibility,
513
+ tags: completedFile.tags,
514
+ metadata: completedFile.metadata,
515
+ status: completedFile.status,
516
+ objectKey: completedFile.objectKey,
517
+ createdAt: completedFile.createdAt,
518
+ updatedAt: completedFile.updatedAt,
519
+ completedAt: completedFile.completedAt,
520
+ deletedAt: completedFile.deletedAt,
521
+ errorCode: completedFile.errorCode,
522
+ errorMessage: completedFile.errorMessage
523
+ }).check());
524
+ if (shouldCleanupSupersededObject(existingFile, completedFile.objectKey)) uow.triggerHook("cleanupStorageObject", buildFileHookPayload(existingFile));
525
+ return {
526
+ id: existingFile.id,
527
+ ...completedFile
528
+ };
529
+ })() : (() => {
530
+ return {
531
+ id: uow.create("file", completedFile),
532
+ ...completedFile
533
+ };
534
+ })();
295
535
  uow.triggerHook("onFileReady", buildUploadHookPayload(upload, finalSizeBytes));
296
536
  return {
297
537
  upload: updatedUpload,
298
- file: {
299
- id: fileId,
300
- ...createdFile
301
- }
538
+ file: persistedFile
302
539
  };
303
540
  }).build();
304
541
  },
@@ -324,6 +561,27 @@ const createUploadServices = (config) => {
324
561
  return { upload: updatedUpload };
325
562
  }).build();
326
563
  },
564
+ markUploadFailedFromSnapshot: function(upload, errorCode, errorMessage) {
565
+ const now = /* @__PURE__ */ new Date();
566
+ return this.serviceTx(uploadSchema).mutate(({ uow }) => {
567
+ if (isTerminalUploadStatus(upload.status)) throw new Error("UPLOAD_INVALID_STATE");
568
+ const updatedUpload = {
569
+ ...upload,
570
+ status: "failed",
571
+ updatedAt: now,
572
+ errorCode,
573
+ errorMessage: errorMessage ?? null
574
+ };
575
+ uow.update("upload", upload.id, (b) => b.set({
576
+ status: updatedUpload.status,
577
+ updatedAt: updatedUpload.updatedAt,
578
+ errorCode: updatedUpload.errorCode,
579
+ errorMessage: updatedUpload.errorMessage
580
+ }).check());
581
+ uow.triggerHook("onUploadFailed", buildUploadHookPayload(upload));
582
+ return { upload: updatedUpload };
583
+ }).build();
584
+ },
327
585
  markUploadAborted: function(uploadId) {
328
586
  const now = /* @__PURE__ */ new Date();
329
587
  return this.serviceTx(uploadSchema).retrieve((uow) => uow.findFirst("upload", (b) => b.whereIndex("primary", (eb) => eb("id", "=", uploadId)))).mutate(({ uow, retrieveResult: [upload] }) => {
@@ -344,6 +602,25 @@ const createUploadServices = (config) => {
344
602
  return { upload: updatedUpload };
345
603
  }).build();
346
604
  },
605
+ markUploadAbortedFromSnapshot: function(upload) {
606
+ const now = /* @__PURE__ */ new Date();
607
+ return this.serviceTx(uploadSchema).mutate(({ uow }) => {
608
+ if (isTerminalUploadStatus(upload.status)) throw new Error("UPLOAD_INVALID_STATE");
609
+ const updatedUpload = {
610
+ ...upload,
611
+ status: "aborted",
612
+ updatedAt: now,
613
+ errorCode: "UPLOAD_ABORTED"
614
+ };
615
+ uow.update("upload", upload.id, (b) => b.set({
616
+ status: updatedUpload.status,
617
+ updatedAt: updatedUpload.updatedAt,
618
+ errorCode: updatedUpload.errorCode
619
+ }).check());
620
+ uow.triggerHook("onUploadFailed", buildUploadHookPayload(upload));
621
+ return { upload: updatedUpload };
622
+ }).build();
623
+ },
347
624
  getUploadStorageInfo: function(uploadId) {
348
625
  return this.serviceTx(uploadSchema).retrieve((uow) => uow.findFirst("upload", (b) => b.whereIndex("primary", (eb) => eb("id", "=", uploadId)))).transformRetrieve(([upload]) => {
349
626
  if (!upload) throw new Error("UPLOAD_NOT_FOUND");
@@ -354,5 +631,5 @@ const createUploadServices = (config) => {
354
631
  };
355
632
 
356
633
  //#endregion
357
- export { createUploadServices };
634
+ export { buildUploadSessionRouteData, createUploadServices };
358
635
  //# sourceMappingURL=uploads.js.map