@uploadista/client-core 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (235) hide show
  1. package/.turbo/turbo-build.log +5 -0
  2. package/LICENSE +21 -0
  3. package/README.md +100 -0
  4. package/dist/auth/auth-http-client.d.ts +50 -0
  5. package/dist/auth/auth-http-client.d.ts.map +1 -0
  6. package/dist/auth/auth-http-client.js +110 -0
  7. package/dist/auth/direct-auth.d.ts +38 -0
  8. package/dist/auth/direct-auth.d.ts.map +1 -0
  9. package/dist/auth/direct-auth.js +95 -0
  10. package/dist/auth/index.d.ts +6 -0
  11. package/dist/auth/index.d.ts.map +1 -0
  12. package/dist/auth/index.js +5 -0
  13. package/dist/auth/no-auth.d.ts +26 -0
  14. package/dist/auth/no-auth.d.ts.map +1 -0
  15. package/dist/auth/no-auth.js +33 -0
  16. package/dist/auth/saas-auth.d.ts +80 -0
  17. package/dist/auth/saas-auth.d.ts.map +1 -0
  18. package/dist/auth/saas-auth.js +167 -0
  19. package/dist/auth/types.d.ts +101 -0
  20. package/dist/auth/types.d.ts.map +1 -0
  21. package/dist/auth/types.js +8 -0
  22. package/dist/chunk-buffer.d.ts +209 -0
  23. package/dist/chunk-buffer.d.ts.map +1 -0
  24. package/dist/chunk-buffer.js +236 -0
  25. package/dist/client/create-uploadista-client.d.ts +369 -0
  26. package/dist/client/create-uploadista-client.d.ts.map +1 -0
  27. package/dist/client/create-uploadista-client.js +518 -0
  28. package/dist/client/index.d.ts +4 -0
  29. package/dist/client/index.d.ts.map +1 -0
  30. package/dist/client/index.js +3 -0
  31. package/dist/client/uploadista-api.d.ts +284 -0
  32. package/dist/client/uploadista-api.d.ts.map +1 -0
  33. package/dist/client/uploadista-api.js +444 -0
  34. package/dist/client/uploadista-websocket-manager.d.ts +110 -0
  35. package/dist/client/uploadista-websocket-manager.d.ts.map +1 -0
  36. package/dist/client/uploadista-websocket-manager.js +207 -0
  37. package/dist/error.d.ts +106 -0
  38. package/dist/error.d.ts.map +1 -0
  39. package/dist/error.js +69 -0
  40. package/dist/index.d.ts +9 -0
  41. package/dist/index.d.ts.map +1 -0
  42. package/dist/index.js +12 -0
  43. package/dist/logger.d.ts +70 -0
  44. package/dist/logger.d.ts.map +1 -0
  45. package/dist/logger.js +59 -0
  46. package/dist/mock-data-store.d.ts +30 -0
  47. package/dist/mock-data-store.d.ts.map +1 -0
  48. package/dist/mock-data-store.js +88 -0
  49. package/dist/network-monitor.d.ts +262 -0
  50. package/dist/network-monitor.d.ts.map +1 -0
  51. package/dist/network-monitor.js +291 -0
  52. package/dist/services/abort-controller-service.d.ts +19 -0
  53. package/dist/services/abort-controller-service.d.ts.map +1 -0
  54. package/dist/services/abort-controller-service.js +4 -0
  55. package/dist/services/checksum-service.d.ts +4 -0
  56. package/dist/services/checksum-service.d.ts.map +1 -0
  57. package/dist/services/checksum-service.js +1 -0
  58. package/dist/services/file-reader-service.d.ts +38 -0
  59. package/dist/services/file-reader-service.d.ts.map +1 -0
  60. package/dist/services/file-reader-service.js +4 -0
  61. package/dist/services/fingerprint-service.d.ts +4 -0
  62. package/dist/services/fingerprint-service.d.ts.map +1 -0
  63. package/dist/services/fingerprint-service.js +1 -0
  64. package/dist/services/http-client.d.ts +182 -0
  65. package/dist/services/http-client.d.ts.map +1 -0
  66. package/dist/services/http-client.js +1 -0
  67. package/dist/services/id-generation-service.d.ts +10 -0
  68. package/dist/services/id-generation-service.d.ts.map +1 -0
  69. package/dist/services/id-generation-service.js +1 -0
  70. package/dist/services/index.d.ts +11 -0
  71. package/dist/services/index.d.ts.map +1 -0
  72. package/dist/services/index.js +10 -0
  73. package/dist/services/platform-service.d.ts +48 -0
  74. package/dist/services/platform-service.d.ts.map +1 -0
  75. package/dist/services/platform-service.js +10 -0
  76. package/dist/services/service-container.d.ts +25 -0
  77. package/dist/services/service-container.d.ts.map +1 -0
  78. package/dist/services/service-container.js +1 -0
  79. package/dist/services/storage-service.d.ts +26 -0
  80. package/dist/services/storage-service.d.ts.map +1 -0
  81. package/dist/services/storage-service.js +1 -0
  82. package/dist/services/websocket-service.d.ts +36 -0
  83. package/dist/services/websocket-service.d.ts.map +1 -0
  84. package/dist/services/websocket-service.js +4 -0
  85. package/dist/smart-chunker.d.ts +72 -0
  86. package/dist/smart-chunker.d.ts.map +1 -0
  87. package/dist/smart-chunker.js +317 -0
  88. package/dist/storage/client-storage.d.ts +148 -0
  89. package/dist/storage/client-storage.d.ts.map +1 -0
  90. package/dist/storage/client-storage.js +62 -0
  91. package/dist/storage/in-memory-storage-service.d.ts +7 -0
  92. package/dist/storage/in-memory-storage-service.d.ts.map +1 -0
  93. package/dist/storage/in-memory-storage-service.js +24 -0
  94. package/dist/storage/index.d.ts +3 -0
  95. package/dist/storage/index.d.ts.map +1 -0
  96. package/dist/storage/index.js +2 -0
  97. package/dist/types/buffered-chunk.d.ts +6 -0
  98. package/dist/types/buffered-chunk.d.ts.map +1 -0
  99. package/dist/types/buffered-chunk.js +1 -0
  100. package/dist/types/chunk-metrics.d.ts +12 -0
  101. package/dist/types/chunk-metrics.d.ts.map +1 -0
  102. package/dist/types/chunk-metrics.js +1 -0
  103. package/dist/types/flow-result.d.ts +11 -0
  104. package/dist/types/flow-result.d.ts.map +1 -0
  105. package/dist/types/flow-result.js +1 -0
  106. package/dist/types/flow-upload-config.d.ts +54 -0
  107. package/dist/types/flow-upload-config.d.ts.map +1 -0
  108. package/dist/types/flow-upload-config.js +1 -0
  109. package/dist/types/flow-upload-item.d.ts +16 -0
  110. package/dist/types/flow-upload-item.d.ts.map +1 -0
  111. package/dist/types/flow-upload-item.js +1 -0
  112. package/dist/types/flow-upload-options.d.ts +41 -0
  113. package/dist/types/flow-upload-options.d.ts.map +1 -0
  114. package/dist/types/flow-upload-options.js +1 -0
  115. package/dist/types/index.d.ts +14 -0
  116. package/dist/types/index.d.ts.map +1 -0
  117. package/dist/types/index.js +13 -0
  118. package/dist/types/multi-flow-upload-options.d.ts +33 -0
  119. package/dist/types/multi-flow-upload-options.d.ts.map +1 -0
  120. package/dist/types/multi-flow-upload-options.js +1 -0
  121. package/dist/types/multi-flow-upload-state.d.ts +9 -0
  122. package/dist/types/multi-flow-upload-state.d.ts.map +1 -0
  123. package/dist/types/multi-flow-upload-state.js +1 -0
  124. package/dist/types/performance-insights.d.ts +11 -0
  125. package/dist/types/performance-insights.d.ts.map +1 -0
  126. package/dist/types/performance-insights.js +1 -0
  127. package/dist/types/previous-upload.d.ts +20 -0
  128. package/dist/types/previous-upload.d.ts.map +1 -0
  129. package/dist/types/previous-upload.js +9 -0
  130. package/dist/types/upload-options.d.ts +40 -0
  131. package/dist/types/upload-options.d.ts.map +1 -0
  132. package/dist/types/upload-options.js +1 -0
  133. package/dist/types/upload-response.d.ts +6 -0
  134. package/dist/types/upload-response.d.ts.map +1 -0
  135. package/dist/types/upload-response.js +1 -0
  136. package/dist/types/upload-result.d.ts +57 -0
  137. package/dist/types/upload-result.d.ts.map +1 -0
  138. package/dist/types/upload-result.js +1 -0
  139. package/dist/types/upload-session-metrics.d.ts +16 -0
  140. package/dist/types/upload-session-metrics.d.ts.map +1 -0
  141. package/dist/types/upload-session-metrics.js +1 -0
  142. package/dist/upload/chunk-upload.d.ts +40 -0
  143. package/dist/upload/chunk-upload.d.ts.map +1 -0
  144. package/dist/upload/chunk-upload.js +82 -0
  145. package/dist/upload/flow-upload.d.ts +48 -0
  146. package/dist/upload/flow-upload.d.ts.map +1 -0
  147. package/dist/upload/flow-upload.js +240 -0
  148. package/dist/upload/index.d.ts +3 -0
  149. package/dist/upload/index.d.ts.map +1 -0
  150. package/dist/upload/index.js +2 -0
  151. package/dist/upload/parallel-upload.d.ts +65 -0
  152. package/dist/upload/parallel-upload.d.ts.map +1 -0
  153. package/dist/upload/parallel-upload.js +231 -0
  154. package/dist/upload/single-upload.d.ts +118 -0
  155. package/dist/upload/single-upload.d.ts.map +1 -0
  156. package/dist/upload/single-upload.js +332 -0
  157. package/dist/upload/upload-manager.d.ts +30 -0
  158. package/dist/upload/upload-manager.d.ts.map +1 -0
  159. package/dist/upload/upload-manager.js +57 -0
  160. package/dist/upload/upload-metrics.d.ts +37 -0
  161. package/dist/upload/upload-metrics.d.ts.map +1 -0
  162. package/dist/upload/upload-metrics.js +236 -0
  163. package/dist/upload/upload-storage.d.ts +32 -0
  164. package/dist/upload/upload-storage.d.ts.map +1 -0
  165. package/dist/upload/upload-storage.js +46 -0
  166. package/dist/upload/upload-strategy.d.ts +66 -0
  167. package/dist/upload/upload-strategy.d.ts.map +1 -0
  168. package/dist/upload/upload-strategy.js +171 -0
  169. package/dist/upload/upload-utils.d.ts +26 -0
  170. package/dist/upload/upload-utils.d.ts.map +1 -0
  171. package/dist/upload/upload-utils.js +80 -0
  172. package/package.json +29 -0
  173. package/src/__tests__/smart-chunking.test.ts +399 -0
  174. package/src/auth/__tests__/auth-http-client.test.ts +327 -0
  175. package/src/auth/__tests__/direct-auth.test.ts +135 -0
  176. package/src/auth/__tests__/no-auth.test.ts +40 -0
  177. package/src/auth/__tests__/saas-auth.test.ts +337 -0
  178. package/src/auth/auth-http-client.ts +150 -0
  179. package/src/auth/direct-auth.ts +121 -0
  180. package/src/auth/index.ts +5 -0
  181. package/src/auth/no-auth.ts +39 -0
  182. package/src/auth/saas-auth.ts +218 -0
  183. package/src/auth/types.ts +105 -0
  184. package/src/chunk-buffer.ts +287 -0
  185. package/src/client/create-uploadista-client.ts +901 -0
  186. package/src/client/index.ts +3 -0
  187. package/src/client/uploadista-api.ts +857 -0
  188. package/src/client/uploadista-websocket-manager.ts +275 -0
  189. package/src/error.ts +149 -0
  190. package/src/index.ts +13 -0
  191. package/src/logger.ts +104 -0
  192. package/src/mock-data-store.ts +97 -0
  193. package/src/network-monitor.ts +445 -0
  194. package/src/services/abort-controller-service.ts +21 -0
  195. package/src/services/checksum-service.ts +3 -0
  196. package/src/services/file-reader-service.ts +44 -0
  197. package/src/services/fingerprint-service.ts +6 -0
  198. package/src/services/http-client.ts +229 -0
  199. package/src/services/id-generation-service.ts +9 -0
  200. package/src/services/index.ts +10 -0
  201. package/src/services/platform-service.ts +65 -0
  202. package/src/services/service-container.ts +24 -0
  203. package/src/services/storage-service.ts +29 -0
  204. package/src/services/websocket-service.ts +33 -0
  205. package/src/smart-chunker.ts +451 -0
  206. package/src/storage/client-storage.ts +186 -0
  207. package/src/storage/in-memory-storage-service.ts +33 -0
  208. package/src/storage/index.ts +2 -0
  209. package/src/types/buffered-chunk.ts +5 -0
  210. package/src/types/chunk-metrics.ts +11 -0
  211. package/src/types/flow-result.ts +14 -0
  212. package/src/types/flow-upload-config.ts +56 -0
  213. package/src/types/flow-upload-item.ts +16 -0
  214. package/src/types/flow-upload-options.ts +56 -0
  215. package/src/types/index.ts +13 -0
  216. package/src/types/multi-flow-upload-options.ts +39 -0
  217. package/src/types/multi-flow-upload-state.ts +9 -0
  218. package/src/types/performance-insights.ts +7 -0
  219. package/src/types/previous-upload.ts +22 -0
  220. package/src/types/upload-options.ts +56 -0
  221. package/src/types/upload-response.ts +6 -0
  222. package/src/types/upload-result.ts +60 -0
  223. package/src/types/upload-session-metrics.ts +15 -0
  224. package/src/upload/chunk-upload.ts +151 -0
  225. package/src/upload/flow-upload.ts +367 -0
  226. package/src/upload/index.ts +2 -0
  227. package/src/upload/parallel-upload.ts +387 -0
  228. package/src/upload/single-upload.ts +554 -0
  229. package/src/upload/upload-manager.ts +106 -0
  230. package/src/upload/upload-metrics.ts +340 -0
  231. package/src/upload/upload-storage.ts +87 -0
  232. package/src/upload/upload-strategy.ts +296 -0
  233. package/src/upload/upload-utils.ts +114 -0
  234. package/tsconfig.json +23 -0
  235. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Configuration for uploading a file through a flow pipeline.
3
+ *
4
+ * Flows enable processing uploaded files through a sequence of transformation
5
+ * nodes (e.g., image resize, format conversion, validation) before final storage.
6
+ *
7
+ * @example Basic flow upload
8
+ * ```typescript
9
+ * const config: FlowUploadConfig = {
10
+ * flowId: 'image-optimization',
11
+ * storageId: 'processed-images',
12
+ * };
13
+ *
14
+ * await client.uploadWithFlow(file, config, {
15
+ * onProgress: (progress) => console.log(`${progress}%`),
16
+ * onSuccess: (result) => console.log('Processed:', result),
17
+ * });
18
+ * ```
19
+ *
20
+ * @example With specific output node
21
+ * ```typescript
22
+ * const config: FlowUploadConfig = {
23
+ * flowId: 'multi-format-conversion',
24
+ * storageId: 'images',
25
+ * outputNodeId: 'webp-output', // Get WebP version instead of first output
26
+ * metadata: {
27
+ * userId: '123',
28
+ * album: 'vacation-2024',
29
+ * },
30
+ * };
31
+ * ```
32
+ */
33
+ export type FlowUploadConfig = {
34
+ /** Unique identifier of the flow to execute */
35
+ flowId: string;
36
+ /** Storage backend where flow outputs will be saved */
37
+ storageId: string;
38
+ /**
39
+ * Specify which output node to use for single-value callbacks like onSuccess.
40
+ *
41
+ * For flows with multiple output nodes, this determines which output
42
+ * is passed to the onSuccess callback. If not specified, uses the first
43
+ * output node. The onFlowComplete callback receives all outputs regardless.
44
+ */
45
+ outputNodeId?: string;
46
+ /**
47
+ * Additional metadata to attach to the upload and flow execution.
48
+ *
49
+ * This metadata is stored with the upload and can be used for tracking,
50
+ * filtering, or providing context to flow nodes.
51
+ */
52
+ metadata?: Record<string, string>;
53
+ };
54
+ //# sourceMappingURL=flow-upload-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-upload-config.d.ts","sourceRoot":"","sources":["../../src/types/flow-upload-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IAEf,uDAAuD;IACvD,SAAS,EAAE,MAAM,CAAC;IAElB;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,16 @@
1
+ import type { UploadFile } from "@uploadista/core";
2
+ /**
3
+ * Flow upload item for multi-flow-upload tracking
4
+ */
5
+ export interface FlowUploadItem<UploadInput> {
6
+ id: string;
7
+ file: UploadInput;
8
+ status: "pending" | "uploading" | "success" | "error" | "aborted";
9
+ progress: number;
10
+ bytesUploaded: number;
11
+ totalBytes: number;
12
+ error: Error | null;
13
+ result: UploadFile | null;
14
+ jobId: string | null;
15
+ }
16
+ //# sourceMappingURL=flow-upload-item.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-upload-item.d.ts","sourceRoot":"","sources":["../../src/types/flow-upload-item.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,cAAc,CAAC,WAAW;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;IAClE,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,41 @@
1
+ import type { UploadFile } from "@uploadista/core/types";
2
+ import type { FlowUploadConfig } from "./flow-upload-config";
3
+ export interface FlowUploadOptions<TOutput = UploadFile> {
4
+ /**
5
+ * Flow configuration
6
+ */
7
+ flowConfig: FlowUploadConfig;
8
+ /**
9
+ * Called when upload progress updates
10
+ */
11
+ onProgress?: (progress: number, bytesUploaded: number, totalBytes: number | null) => void;
12
+ /**
13
+ * Called when a chunk completes
14
+ */
15
+ onChunkComplete?: (chunkSize: number, bytesAccepted: number, bytesTotal: number | null) => void;
16
+ /**
17
+ * Called when the flow completes successfully (receives full flow outputs)
18
+ * This is the recommended callback for multi-output flows
19
+ * Format: { [outputNodeId]: result, ... }
20
+ */
21
+ onFlowComplete?: (outputs: Record<string, unknown>) => void;
22
+ /**
23
+ * Called when upload succeeds (legacy, single-output flows)
24
+ * For single-output flows, receives the value from the specified outputNodeId
25
+ * or the first output node if outputNodeId is not specified
26
+ */
27
+ onSuccess?: (result: TOutput) => void;
28
+ /**
29
+ * Called when upload fails
30
+ */
31
+ onError?: (error: Error) => void;
32
+ /**
33
+ * Called when upload is aborted
34
+ */
35
+ onAbort?: () => void;
36
+ /**
37
+ * Custom retry logic
38
+ */
39
+ onShouldRetry?: (error: Error, retryAttempt: number) => boolean;
40
+ }
41
+ //# sourceMappingURL=flow-upload-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-upload-options.d.ts","sourceRoot":"","sources":["../../src/types/flow-upload-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,MAAM,WAAW,iBAAiB,CAAC,OAAO,GAAG,UAAU;IACrD;;OAEG;IACH,UAAU,EAAE,gBAAgB,CAAC;IAE7B;;OAEG;IACH,UAAU,CAAC,EAAE,CACX,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,GAAG,IAAI,KACtB,IAAI,CAAC;IAEV;;OAEG;IACH,eAAe,CAAC,EAAE,CAChB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,GAAG,IAAI,KACtB,IAAI,CAAC;IAEV;;;;OAIG;IACH,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAE5D;;;;OAIG;IACH,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAEtC;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAEjC;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAErB;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC;CACjE"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,14 @@
1
+ export * from "./chunk-metrics";
2
+ export * from "./flow-result";
3
+ export * from "./flow-upload-config";
4
+ export * from "./flow-upload-item";
5
+ export * from "./flow-upload-options";
6
+ export * from "./multi-flow-upload-options";
7
+ export * from "./multi-flow-upload-state";
8
+ export * from "./performance-insights";
9
+ export * from "./previous-upload";
10
+ export * from "./upload-options";
11
+ export * from "./upload-response";
12
+ export * from "./upload-result";
13
+ export * from "./upload-session-metrics";
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC"}
@@ -0,0 +1,13 @@
1
+ export * from "./chunk-metrics";
2
+ export * from "./flow-result";
3
+ export * from "./flow-upload-config";
4
+ export * from "./flow-upload-item";
5
+ export * from "./flow-upload-options";
6
+ export * from "./multi-flow-upload-options";
7
+ export * from "./multi-flow-upload-state";
8
+ export * from "./performance-insights";
9
+ export * from "./previous-upload";
10
+ export * from "./upload-options";
11
+ export * from "./upload-response";
12
+ export * from "./upload-result";
13
+ export * from "./upload-session-metrics";
@@ -0,0 +1,33 @@
1
+ import type { FlowUploadConfig } from "./flow-upload-config";
2
+ import type { FlowUploadItem } from "./flow-upload-item";
3
+ export interface MultiFlowUploadOptions<UploadInput> {
4
+ /**
5
+ * Flow configuration
6
+ */
7
+ flowConfig: FlowUploadConfig;
8
+ /**
9
+ * Maximum number of concurrent uploads (default: 3)
10
+ */
11
+ maxConcurrent?: number;
12
+ /**
13
+ * Called when an individual upload progresses
14
+ */
15
+ onItemProgress?: (item: FlowUploadItem<UploadInput>) => void;
16
+ /**
17
+ * Called when an individual upload succeeds
18
+ */
19
+ onItemSuccess?: (item: FlowUploadItem<UploadInput>) => void;
20
+ /**
21
+ * Called when an individual upload fails
22
+ */
23
+ onItemError?: (item: FlowUploadItem<UploadInput>, error: Error) => void;
24
+ /**
25
+ * Called when all uploads complete
26
+ */
27
+ onComplete?: (items: FlowUploadItem<UploadInput>[]) => void;
28
+ /**
29
+ * Custom retry logic
30
+ */
31
+ onShouldRetry?: (error: Error, retryAttempt: number) => boolean;
32
+ }
33
+ //# sourceMappingURL=multi-flow-upload-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-flow-upload-options.d.ts","sourceRoot":"","sources":["../../src/types/multi-flow-upload-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,WAAW,sBAAsB,CAAC,WAAW;IACjD;;OAEG;IACH,UAAU,EAAE,gBAAgB,CAAC;IAE7B;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;IAE7D;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;IAE5D;;OAEG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAExE;;OAEG;IACH,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC,WAAW,CAAC,EAAE,KAAK,IAAI,CAAC;IAE5D;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC;CACjE"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,9 @@
1
+ import type { FlowUploadItem } from "./flow-upload-item";
2
+ export interface MultiFlowUploadState<UploadInput> {
3
+ items: FlowUploadItem<UploadInput>[];
4
+ totalProgress: number;
5
+ activeUploads: number;
6
+ completedUploads: number;
7
+ failedUploads: number;
8
+ }
9
+ //# sourceMappingURL=multi-flow-upload-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-flow-upload-state.d.ts","sourceRoot":"","sources":["../../src/types/multi-flow-upload-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,WAAW,oBAAoB,CAAC,WAAW;IAC/C,KAAK,EAAE,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;CACvB"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,11 @@
1
+ export interface PerformanceInsights {
2
+ overallEfficiency: number;
3
+ chunkingEffectiveness: number;
4
+ networkStability: number;
5
+ recommendations: string[];
6
+ optimalChunkSizeRange: {
7
+ min: number;
8
+ max: number;
9
+ };
10
+ }
11
+ //# sourceMappingURL=performance-insights.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"performance-insights.d.ts","sourceRoot":"","sources":["../../src/types/performance-insights.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,qBAAqB,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CACrD"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,20 @@
1
+ import z from "zod";
2
+ export type PreviousUpload = {
3
+ size: number | null;
4
+ metadata: {
5
+ [key: string]: string | number | boolean;
6
+ };
7
+ creationTime: string;
8
+ uploadId?: string;
9
+ parallelUploadUrls?: string[];
10
+ clientStorageKey: string;
11
+ };
12
+ export declare const previousUploadSchema: z.ZodObject<{
13
+ size: z.ZodNullable<z.ZodNumber>;
14
+ metadata: z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>;
15
+ creationTime: z.ZodString;
16
+ uploadId: z.ZodOptional<z.ZodString>;
17
+ parallelUploadUrls: z.ZodOptional<z.ZodArray<z.ZodString>>;
18
+ clientStorageKey: z.ZodString;
19
+ }, z.core.$strip>;
20
+ //# sourceMappingURL=previous-upload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"previous-upload.d.ts","sourceRoot":"","sources":["../../src/types/previous-upload.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;IACvD,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,eAAO,MAAM,oBAAoB;;;;;;;iBAU/B,CAAC"}
@@ -0,0 +1,9 @@
1
+ import z from "zod";
2
+ export const previousUploadSchema = z.object({
3
+ size: z.number().nullable(),
4
+ metadata: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])),
5
+ creationTime: z.string(),
6
+ uploadId: z.string().optional(),
7
+ parallelUploadUrls: z.array(z.string()).optional(),
8
+ clientStorageKey: z.string(),
9
+ });
@@ -0,0 +1,40 @@
1
+ import type { UploadFile } from "@uploadista/core";
2
+ export interface UploadOptions {
3
+ /**
4
+ * Upload metadata to attach to the file
5
+ */
6
+ metadata?: Record<string, string>;
7
+ /**
8
+ * Whether to defer the upload size calculation
9
+ */
10
+ uploadLengthDeferred?: boolean;
11
+ /**
12
+ * Manual upload size override
13
+ */
14
+ uploadSize?: number;
15
+ /**
16
+ * Called when upload progress updates
17
+ */
18
+ onProgress?: (progress: number, bytesUploaded: number, totalBytes: number | null) => void;
19
+ /**
20
+ * Called when a chunk completes
21
+ */
22
+ onChunkComplete?: (chunkSize: number, bytesAccepted: number, bytesTotal: number | null) => void;
23
+ /**
24
+ * Called when upload succeeds
25
+ */
26
+ onSuccess?: (result: UploadFile) => void;
27
+ /**
28
+ * Called when upload fails
29
+ */
30
+ onError?: (error: Error) => void;
31
+ /**
32
+ * Called when upload is aborted
33
+ */
34
+ onAbort?: () => void;
35
+ /**
36
+ * Custom retry logic
37
+ */
38
+ onShouldRetry?: (error: Error, retryAttempt: number) => boolean;
39
+ }
40
+ //# sourceMappingURL=upload-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-options.d.ts","sourceRoot":"","sources":["../../src/types/upload-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAElC;;OAEG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAE/B;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,UAAU,CAAC,EAAE,CACX,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,GAAG,IAAI,KACtB,IAAI,CAAC;IAEV;;OAEG;IACH,eAAe,CAAC,EAAE,CAChB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,GAAG,IAAI,KACtB,IAAI,CAAC;IAEV;;OAEG;IACH,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IAEzC;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAEjC;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAErB;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC;CACjE"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,6 @@
1
+ import type { UploadFile } from "@uploadista/core";
2
+ export type UploadResponse = {
3
+ upload?: UploadFile;
4
+ status: number;
5
+ };
6
+ //# sourceMappingURL=upload-response.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-response.d.ts","sourceRoot":"","sources":["../../src/types/upload-response.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,57 @@
1
+ import type { UploadFile } from "@uploadista/core";
2
+ /**
3
+ * Discriminated union representing the result of an upload operation.
4
+ *
5
+ * Provides a type-safe way to handle the three possible outcomes of an upload:
6
+ * success, error, or cancellation. This pattern enables exhaustive checking
7
+ * of all cases at compile time.
8
+ *
9
+ * @template TOutput - The type of the successful result value. Defaults to UploadFile
10
+ *
11
+ * @example Handling upload results
12
+ * ```typescript
13
+ * function handleUploadResult(result: UploadResult) {
14
+ * switch (result.type) {
15
+ * case 'success':
16
+ * console.log('Upload complete:', result.value.id);
17
+ * break;
18
+ * case 'error':
19
+ * console.error('Upload failed:', result.error.message);
20
+ * break;
21
+ * case 'cancelled':
22
+ * console.log('Upload was cancelled by user');
23
+ * break;
24
+ * }
25
+ * }
26
+ * ```
27
+ *
28
+ * @example With custom output type
29
+ * ```typescript
30
+ * interface ProcessedImage {
31
+ * url: string;
32
+ * width: number;
33
+ * height: number;
34
+ * }
35
+ *
36
+ * const result: UploadResult<ProcessedImage> = await uploadAndProcess(file);
37
+ *
38
+ * if (result.type === 'success') {
39
+ * console.log(`Image processed: ${result.value.width}x${result.value.height}`);
40
+ * }
41
+ * ```
42
+ */
43
+ export type UploadResult<TOutput = UploadFile> = {
44
+ /** Indicates the upload completed successfully */
45
+ type: "success";
46
+ /** The successful result value (e.g., upload metadata or processed output) */
47
+ value: TOutput;
48
+ } | {
49
+ /** Indicates the upload failed with an error */
50
+ type: "error";
51
+ /** The error that caused the upload to fail */
52
+ error: Error;
53
+ } | {
54
+ /** Indicates the upload was cancelled by the user or application */
55
+ type: "cancelled";
56
+ };
57
+ //# sourceMappingURL=upload-result.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-result.d.ts","sourceRoot":"","sources":["../../src/types/upload-result.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,MAAM,MAAM,YAAY,CAAC,OAAO,GAAG,UAAU,IACzC;IACE,kDAAkD;IAClD,IAAI,EAAE,SAAS,CAAC;IAChB,8EAA8E;IAC9E,KAAK,EAAE,OAAO,CAAC;CAChB,GACD;IACE,gDAAgD;IAChD,IAAI,EAAE,OAAO,CAAC;IACd,+CAA+C;IAC/C,KAAK,EAAE,KAAK,CAAC;CACd,GACD;IACE,oEAAoE;IACpE,IAAI,EAAE,WAAW,CAAC;CACnB,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,16 @@
1
+ export interface UploadSessionMetrics {
2
+ uploadId: string;
3
+ totalSize: number;
4
+ totalDuration: number;
5
+ chunksCompleted: number;
6
+ chunksTotal: number;
7
+ averageSpeed: number;
8
+ peakSpeed: number;
9
+ minSpeed: number;
10
+ totalRetries: number;
11
+ successRate: number;
12
+ adaptiveChunkingEnabled: boolean;
13
+ startTime: number;
14
+ endTime?: number;
15
+ }
16
+ //# sourceMappingURL=upload-session-metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-session-metrics.d.ts","sourceRoot":"","sources":["../../src/types/upload-session-metrics.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,uBAAuB,EAAE,OAAO,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,40 @@
1
+ import type { UploadistaApi } from "../client/uploadista-api";
2
+ import { UploadistaError } from "../error";
3
+ import type { Logger } from "../logger";
4
+ import type { AbortControllerLike } from "../services";
5
+ import type { FileSource } from "../services/file-reader-service";
6
+ import type { PlatformService } from "../services/platform-service";
7
+ import type { SmartChunker } from "../smart-chunker";
8
+ import type { UploadResponse } from "../types/upload-response";
9
+ export type OnProgress = (uploadId: string, bytesSent: number, bytesTotal: number | null) => void;
10
+ export type OnShouldRetry = (error: UploadistaError, retryAttempt: number) => boolean;
11
+ /**
12
+ * uploadChunk reads a chunk from the source and sends it using the
13
+ * supplied request object. It will not handle the response.
14
+ */
15
+ export declare function uploadChunk({ uploadId, source, offset, uploadLengthDeferred, abortController, onProgress, smartChunker, uploadistaApi, logger, }: {
16
+ uploadId: string;
17
+ source: FileSource;
18
+ offset: number;
19
+ uploadLengthDeferred: boolean | undefined;
20
+ abortController: AbortControllerLike;
21
+ onProgress?: OnProgress;
22
+ smartChunker: SmartChunker;
23
+ uploadistaApi: UploadistaApi;
24
+ logger: Logger;
25
+ }): Promise<UploadResponse>;
26
+ /**
27
+ * Checks whether or not it is ok to retry a request.
28
+ * @param {UploadistaError} err the error returned from the last request
29
+ * @param {number} retryAttempt the number of times the request has already been retried
30
+ * @param {number[]} retryDelays configured retry delays
31
+ * @param {OnShouldRetry} onShouldRetry optional custom retry logic
32
+ */
33
+ export declare function shouldRetry(platformService: PlatformService, err: UploadistaError, retryAttempt: number, retryDelays?: number[], onShouldRetry?: OnShouldRetry): boolean;
34
+ /**
35
+ * determines if the request should be retried. Will only retry if not a status 4xx except a 409 or 423
36
+ * @param {UploadistaError} err
37
+ * @returns {boolean}
38
+ */
39
+ export declare function defaultOnShouldRetry(platformService: PlatformService, err: UploadistaError): boolean;
40
+ //# sourceMappingURL=chunk-upload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-upload.d.ts","sourceRoot":"","sources":["../../src/upload/chunk-upload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG/D,MAAM,MAAM,UAAU,GAAG,CACvB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GAAG,IAAI,KACtB,IAAI,CAAC;AAEV,MAAM,MAAM,aAAa,GAAG,CAC1B,KAAK,EAAE,eAAe,EACtB,YAAY,EAAE,MAAM,KACjB,OAAO,CAAC;AAEb;;;GAGG;AACH,wBAAsB,WAAW,CAAC,EAChC,QAAQ,EACR,MAAM,EACN,MAAM,EACN,oBAAoB,EACpB,eAAe,EACf,UAAU,EACV,YAAY,EACZ,aAAa,EACb,MAAM,GACP,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1C,eAAe,EAAE,mBAAmB,CAAC;IACrC,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,YAAY,EAAE,YAAY,CAAC;IAC3B,aAAa,EAAE,aAAa,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,cAAc,CAAC,CA4D1B;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,eAAe,EAAE,eAAe,EAChC,GAAG,EAAE,eAAe,EACpB,YAAY,EAAE,MAAM,EACpB,WAAW,CAAC,EAAE,MAAM,EAAE,EACtB,aAAa,CAAC,EAAE,aAAa,GAC5B,OAAO,CAcT;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,eAAe,EAAE,eAAe,EAChC,GAAG,EAAE,eAAe,GACnB,OAAO,CAMT"}
@@ -0,0 +1,82 @@
1
+ import { UploadistaError } from "../error";
2
+ import { inStatusCategory } from "./upload-utils";
3
+ /**
4
+ * uploadChunk reads a chunk from the source and sends it using the
5
+ * supplied request object. It will not handle the response.
6
+ */
7
+ export async function uploadChunk({ uploadId, source, offset, uploadLengthDeferred, abortController, onProgress, smartChunker, uploadistaApi, logger, }) {
8
+ const start = offset ?? 0;
9
+ const remainingBytes = source.size ? source.size - start : undefined;
10
+ const chunkSizeDecision = smartChunker.getNextChunkSize(remainingBytes);
11
+ const currentChunkSize = chunkSizeDecision.size;
12
+ let end = start + currentChunkSize;
13
+ // The specified chunkSize may be Infinity or the calcluated end position
14
+ // may exceed the file's size. In both cases, we limit the end position to
15
+ // the input's total size for simpler calculations and correctness.
16
+ if (source.size &&
17
+ (end === Number.POSITIVE_INFINITY || end > source.size) &&
18
+ !uploadLengthDeferred) {
19
+ end = source.size;
20
+ }
21
+ const { value, size, done } = await source.slice(start, end);
22
+ const sizeOfValue = size ?? 0;
23
+ const chunkStartTime = Date.now();
24
+ // If the upload length is deferred, the upload size was not specified during
25
+ // upload creation. So, if the file reader is done reading, we know the total
26
+ // upload size and can tell the tus server.
27
+ if (uploadLengthDeferred && done) {
28
+ source.size = offset + sizeOfValue;
29
+ }
30
+ // The specified uploadSize might not match the actual amount of data that a source
31
+ // provides. In these cases, we cannot successfully complete the upload, so we
32
+ // rather error out and let the user know. If not, tus-js-client will be stuck
33
+ // in a loop of repeating empty PATCH requests.
34
+ // See https://community.transloadit.com/t/how-to-abort-hanging-companion-uploads/16488/13
35
+ const newSize = offset + sizeOfValue;
36
+ if (!uploadLengthDeferred && done && newSize !== source.size) {
37
+ throw new UploadistaError({
38
+ name: "WRONG_UPLOAD_SIZE",
39
+ message: `upload was configured with a size of ${size} bytes, but the source is done after ${newSize} bytes`,
40
+ });
41
+ }
42
+ const result = await uploadistaApi.uploadChunk(uploadId, value, {
43
+ onProgress: (bytes, total) => {
44
+ onProgress?.(uploadId, bytes, total);
45
+ },
46
+ abortController,
47
+ });
48
+ // Record performance metrics
49
+ const chunkDuration = Date.now() - chunkStartTime;
50
+ const success = result.status >= 200 && result.status < 300;
51
+ smartChunker.recordChunkResult(sizeOfValue, chunkDuration, success);
52
+ logger.log(`Chunk upload ${success ? "succeeded" : "failed"}: ${sizeOfValue} bytes in ${chunkDuration}ms (${chunkSizeDecision.strategy} strategy)`);
53
+ return result;
54
+ }
55
+ /**
56
+ * Checks whether or not it is ok to retry a request.
57
+ * @param {UploadistaError} err the error returned from the last request
58
+ * @param {number} retryAttempt the number of times the request has already been retried
59
+ * @param {number[]} retryDelays configured retry delays
60
+ * @param {OnShouldRetry} onShouldRetry optional custom retry logic
61
+ */
62
+ export function shouldRetry(platformService, err, retryAttempt, retryDelays, onShouldRetry) {
63
+ if (retryDelays == null ||
64
+ retryAttempt >= retryDelays.length ||
65
+ !err.isNetworkError()) {
66
+ return false;
67
+ }
68
+ if (onShouldRetry) {
69
+ return onShouldRetry(err, retryAttempt);
70
+ }
71
+ return defaultOnShouldRetry(platformService, err);
72
+ }
73
+ /**
74
+ * determines if the request should be retried. Will only retry if not a status 4xx except a 409 or 423
75
+ * @param {UploadistaError} err
76
+ * @returns {boolean}
77
+ */
78
+ export function defaultOnShouldRetry(platformService, err) {
79
+ const status = err.status ?? 0;
80
+ return ((!inStatusCategory(status, 400) || status === 409 || status === 423) &&
81
+ platformService.isOnline());
82
+ }
@@ -0,0 +1,48 @@
1
+ import type { UploadFile } from "@uploadista/core/types";
2
+ import type { UploadistaApi } from "../client/uploadista-api";
3
+ import type { Logger } from "../logger";
4
+ import type { AbortControllerLike } from "../services";
5
+ import type { FileSource } from "../services/file-reader-service";
6
+ import type { PlatformService, Timeout } from "../services/platform-service";
7
+ import type { SmartChunker, SmartChunkerConfig } from "../smart-chunker";
8
+ import type { FlowUploadConfig } from "../types/flow-upload-config";
9
+ import type { Callbacks } from "./single-upload";
10
+ import type { UploadMetrics } from "./upload-metrics";
11
+ /**
12
+ * Start a flow-based upload by initializing the streaming input node
13
+ */
14
+ export declare function startFlowUpload({ source, flowConfig, uploadistaApi, logger, platformService, openWebSocket, closeWebSocket, ...callbacks }: {
15
+ source: FileSource;
16
+ flowConfig: FlowUploadConfig;
17
+ uploadistaApi: UploadistaApi;
18
+ logger: Logger;
19
+ platformService: PlatformService;
20
+ openWebSocket: (jobId: string) => void;
21
+ closeWebSocket: (jobId: string) => void;
22
+ } & Callbacks): Promise<{
23
+ jobId: string;
24
+ uploadFile: UploadFile;
25
+ inputNodeId: string;
26
+ } | undefined>;
27
+ /**
28
+ * Upload chunks directly to the upload API (not through continueFlow)
29
+ * This is more efficient and reuses the existing upload infrastructure
30
+ */
31
+ export declare function performFlowUpload({ jobId, uploadFile, inputNodeId, offset, source, retryAttempt, abortController, retryDelays, smartChunker, uploadistaApi, logger, smartChunking, metrics, platformService, onRetry, ...callbacks }: {
32
+ jobId: string;
33
+ uploadFile: UploadFile;
34
+ inputNodeId: string;
35
+ offset: number;
36
+ retryAttempt?: number;
37
+ source: FileSource;
38
+ abortController: AbortControllerLike;
39
+ retryDelays: number[] | undefined;
40
+ smartChunker: SmartChunker;
41
+ uploadistaApi: UploadistaApi;
42
+ logger: Logger;
43
+ smartChunking?: SmartChunkerConfig;
44
+ metrics: UploadMetrics;
45
+ platformService: PlatformService;
46
+ onRetry?: (timeout: Timeout) => void;
47
+ } & Callbacks): Promise<void>;
48
+ //# sourceMappingURL=flow-upload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-upload.d.ts","sourceRoot":"","sources":["../../src/upload/flow-upload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAC;AAC7E,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAGpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGtD;;GAEG;AACH,wBAAsB,eAAe,CAAC,EACpC,MAAM,EACN,UAAU,EACV,aAAa,EACb,MAAM,EACN,eAAe,EACf,aAAa,EACb,cAAc,EACd,GAAG,SAAS,EACb,EAAE;IACD,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,EAAE,gBAAgB,CAAC;IAC7B,aAAa,EAAE,aAAa,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,eAAe,CAAC;IACjC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC,GAAG,SAAS,GAAG,OAAO,CACrB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,UAAU,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAC3E,CA0GA;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,EACtC,KAAK,EACL,UAAU,EACV,WAAW,EACX,MAAM,EACN,MAAM,EACN,YAAgB,EAChB,eAAe,EACf,WAAW,EACX,YAAY,EACZ,aAAa,EACb,MAAM,EACN,aAAa,EACb,OAAO,EACP,eAAe,EACf,OAAO,EACP,GAAG,SAAS,EACb,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,UAAU,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,UAAU,CAAC;IACnB,eAAe,EAAE,mBAAmB,CAAC;IACrC,WAAW,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAClC,YAAY,EAAE,YAAY,CAAC;IAC3B,aAAa,EAAE,aAAa,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC,OAAO,EAAE,aAAa,CAAC;IACvB,eAAe,EAAE,eAAe,CAAC;IACjC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACtC,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAwL5B"}