@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 @@
1
+ {"version":3,"file":"single-upload.d.ts","sourceRoot":"","sources":["../../src/upload/single-upload.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,332 @@
1
+ import { UploadistaError } from "../error";
2
+ import { shouldRetry, uploadChunk, } from "./chunk-upload";
3
+ import { removeFromClientStorage, saveUploadInClientStorage, } from "./upload-storage";
4
+ import { encodeMetadata, inStatusCategory } from "./upload-utils";
5
+ /**
6
+ * Start uploading the file using PATCH requests. The file will be divided
7
+ * into chunks as specified in the chunkSize option. During the upload
8
+ * the onProgress event handler may be invoked multiple times.
9
+ */
10
+ export async function performUpload({ uploadId, offset, source, uploadLengthDeferred, retryAttempt = 0, abortController, retryDelays, smartChunker, uploadistaApi, logger, smartChunking, metrics, platformService, onRetry, ...callbacks }) {
11
+ let offsetBeforeRetry = offset;
12
+ let currentOffset = offset;
13
+ try {
14
+ const res = await uploadChunk({
15
+ uploadId,
16
+ source,
17
+ offset,
18
+ uploadLengthDeferred,
19
+ onProgress: callbacks.onProgress,
20
+ abortController,
21
+ smartChunker,
22
+ uploadistaApi,
23
+ logger,
24
+ });
25
+ if (!inStatusCategory(res.status, 200) || res.upload == null) {
26
+ throw new UploadistaError({
27
+ name: "NETWORK_UNEXPECTED_RESPONSE",
28
+ message: "Unexpected response while uploading chunk",
29
+ });
30
+ }
31
+ currentOffset = res.upload.offset;
32
+ callbacks.onProgress?.(uploadId, currentOffset, res.upload.size ?? 0);
33
+ callbacks.onChunkComplete?.(currentOffset - offset, offset, res.upload?.size ?? 0);
34
+ // Record detailed chunk metrics
35
+ if (smartChunking?.enabled !== false) {
36
+ const chunkIndex = Math.floor(offset / (currentOffset - offset || 1));
37
+ const chunkSize = currentOffset - offset;
38
+ const chunkDuration = Date.now() - (Date.now() - 100); // Approximate, real timing is in uploadChunk
39
+ const lastDecision = smartChunker.getLastDecision();
40
+ metrics.recordChunk({
41
+ chunkIndex,
42
+ size: chunkSize,
43
+ duration: chunkDuration,
44
+ speed: chunkSize / (chunkDuration / 1000),
45
+ success: true,
46
+ retryCount: retryAttempt,
47
+ networkCondition: lastDecision?.networkCondition?.type,
48
+ chunkingStrategy: lastDecision?.strategy,
49
+ });
50
+ // Update smart chunker with connection metrics for pooling optimization
51
+ const connectionMetrics = uploadistaApi.getConnectionMetrics();
52
+ smartChunker.updateConnectionMetrics(connectionMetrics);
53
+ }
54
+ if (currentOffset >= (source.size ?? 0)) {
55
+ if (source)
56
+ source.close();
57
+ // Complete metrics session
58
+ if (smartChunking?.enabled !== false) {
59
+ const sessionMetrics = metrics.endSession();
60
+ if (sessionMetrics) {
61
+ logger.log(`Upload completed: ${sessionMetrics.totalSize} bytes in ${sessionMetrics.totalDuration}ms, avg speed: ${Math.round(sessionMetrics.averageSpeed / 1024)}KB/s`);
62
+ }
63
+ }
64
+ callbacks.onSuccess?.(res.upload);
65
+ return;
66
+ }
67
+ await performUpload({
68
+ uploadId,
69
+ offset: currentOffset,
70
+ source,
71
+ uploadLengthDeferred,
72
+ retryDelays,
73
+ smartChunker,
74
+ platformService,
75
+ uploadistaApi,
76
+ logger,
77
+ smartChunking,
78
+ metrics,
79
+ onRetry,
80
+ abortController,
81
+ ...callbacks,
82
+ });
83
+ }
84
+ catch (err) {
85
+ // Check if we should retry, when enabled, before sending the error to the user.
86
+ if (retryDelays != null) {
87
+ // We will reset the attempt counter if
88
+ // - we were already able to connect to the server (offset != null) and
89
+ // - we were able to upload a small chunk of data to the server
90
+ const shouldResetDelays = offset != null && currentOffset > offsetBeforeRetry;
91
+ if (shouldResetDelays) {
92
+ retryAttempt = 0;
93
+ }
94
+ const castedErr = !(err instanceof UploadistaError)
95
+ ? new UploadistaError({
96
+ name: "NETWORK_ERROR",
97
+ message: "Network error",
98
+ cause: err,
99
+ })
100
+ : err;
101
+ if (shouldRetry(platformService, castedErr, retryAttempt, retryDelays, callbacks.onShouldRetry)) {
102
+ const delay = retryDelays[retryAttempt];
103
+ offsetBeforeRetry = offset;
104
+ const timeout = platformService.setTimeout(async () => {
105
+ await performUpload({
106
+ uploadId,
107
+ offset,
108
+ source,
109
+ retryAttempt: retryAttempt + 1,
110
+ uploadLengthDeferred,
111
+ retryDelays,
112
+ smartChunker,
113
+ platformService,
114
+ uploadistaApi,
115
+ logger,
116
+ smartChunking,
117
+ metrics,
118
+ onRetry,
119
+ abortController,
120
+ ...callbacks,
121
+ });
122
+ }, delay);
123
+ onRetry?.(timeout);
124
+ }
125
+ else {
126
+ throw new UploadistaError({
127
+ name: "UPLOAD_CHUNK_FAILED",
128
+ message: `failed to upload chunk for ${uploadId} at offset ${offset}`,
129
+ cause: err,
130
+ });
131
+ }
132
+ }
133
+ }
134
+ }
135
+ /**
136
+ * Create a new upload using the creation extension by sending a POST
137
+ * request to the endpoint. After successful creation the file will be
138
+ * uploaded
139
+ */
140
+ export async function createUpload({ fingerprint, storageId, source, uploadLengthDeferred, metadata, uploadistaApi, logger, checksumService, clientStorage, generateId, storeFingerprintForResuming, openWebSocket, closeWebSocket, computeChecksum = true, checksumAlgorithm = "sha256", platformService, ...callbacks }) {
141
+ if (!uploadLengthDeferred && source.size == null) {
142
+ const error = new UploadistaError({
143
+ name: "UPLOAD_SIZE_NOT_SPECIFIED",
144
+ message: "expected size to be set",
145
+ });
146
+ callbacks.onError?.(error);
147
+ throw error;
148
+ }
149
+ // Compute checksum if enabled and file is a File object
150
+ let checksum;
151
+ if (computeChecksum && platformService.isFileLike(source.input)) {
152
+ try {
153
+ logger.log("Computing file checksum...");
154
+ checksum = await checksumService.computeChecksum(new Uint8Array(source.input));
155
+ logger.log(`Checksum computed: ${checksum}`);
156
+ }
157
+ catch (error) {
158
+ logger.log(`Warning: Failed to compute checksum: ${error instanceof Error ? error.message : "Unknown error"}`);
159
+ // Continue without checksum if computation fails
160
+ }
161
+ }
162
+ const createUploadData = {
163
+ uploadLengthDeferred,
164
+ storageId,
165
+ size: source.size ?? 0,
166
+ metadata: metadata ? encodeMetadata(metadata) : undefined,
167
+ fileName: source.name ?? undefined,
168
+ type: source.type ?? "",
169
+ lastModified: source.lastModified ?? undefined,
170
+ checksum,
171
+ checksumAlgorithm: checksum ? checksumAlgorithm : undefined,
172
+ };
173
+ const { upload, status } = await uploadistaApi.createUpload(createUploadData);
174
+ if (!inStatusCategory(status, 200) || upload == null) {
175
+ const error = new UploadistaError({
176
+ name: "NETWORK_UNEXPECTED_RESPONSE",
177
+ message: "Unexpected response while creating upload",
178
+ });
179
+ callbacks.onError?.(error);
180
+ throw error;
181
+ }
182
+ logger.log(`Created upload ${upload.id}`);
183
+ openWebSocket(upload.id);
184
+ if (upload.size === 0) {
185
+ // Nothing to upload and file was successfully created
186
+ callbacks.onSuccess?.(upload);
187
+ if (source)
188
+ source.close();
189
+ closeWebSocket(upload.id);
190
+ return;
191
+ }
192
+ const uploadIdStorageKey = await saveUploadInClientStorage({
193
+ clientStorage,
194
+ fingerprint,
195
+ size: upload.size ?? 0,
196
+ metadata: upload.metadata ?? {},
197
+ clientStorageKey: null,
198
+ storeFingerprintForResuming,
199
+ generateId,
200
+ });
201
+ callbacks.onStart?.({
202
+ uploadId: upload.id,
203
+ size: upload.size ?? null,
204
+ });
205
+ return {
206
+ uploadIdStorageKey,
207
+ uploadId: upload.id,
208
+ offset: upload.offset,
209
+ };
210
+ }
211
+ /**
212
+ * Try to resume an existing upload. First a HEAD request will be sent
213
+ * to retrieve the offset. If the request fails a new upload will be
214
+ * created. In the case of a successful response the file will be uploaded.
215
+ */
216
+ export async function resumeUpload({ uploadId, storageId, uploadIdStorageKey, fingerprint, source, uploadLengthDeferred, uploadistaApi, logger, platformService, checksumService, clientStorage, generateId, storeFingerprintForResuming, openWebSocket, ...callbacks }) {
217
+ const res = await uploadistaApi.getUpload(uploadId);
218
+ const status = res.status;
219
+ if (!inStatusCategory(status, 200)) {
220
+ // If the upload is locked (indicated by the 423 Locked status code), we
221
+ // emit an error instead of directly starting a new upload. This way the
222
+ // retry logic can catch the error and will retry the upload. An upload
223
+ // is usually locked for a short period of time and will be available
224
+ // afterwards.
225
+ if (status === 423) {
226
+ const error = new UploadistaError({
227
+ name: "UPLOAD_LOCKED",
228
+ message: "upload is currently locked; retry later",
229
+ });
230
+ callbacks.onError?.(error);
231
+ throw error;
232
+ }
233
+ if (inStatusCategory(status, 400)) {
234
+ // Remove stored fingerprint and corresponding endpoint,
235
+ // on client errors since the file can not be found
236
+ await removeFromClientStorage(clientStorage, uploadIdStorageKey);
237
+ }
238
+ // Try to create a new upload
239
+ return await createUpload({
240
+ platformService,
241
+ fingerprint,
242
+ storageId,
243
+ source,
244
+ uploadLengthDeferred,
245
+ metadata: {},
246
+ uploadistaApi,
247
+ logger,
248
+ checksumService,
249
+ clientStorage,
250
+ generateId,
251
+ storeFingerprintForResuming,
252
+ openWebSocket,
253
+ closeWebSocket: () => { }, // Placeholder, will be provided by caller
254
+ ...callbacks,
255
+ });
256
+ }
257
+ const upload = res.upload;
258
+ if (upload == null) {
259
+ const error = new UploadistaError({
260
+ name: "NETWORK_UNEXPECTED_RESPONSE",
261
+ message: "Unexpected response while resuming upload",
262
+ });
263
+ callbacks.onError?.(error);
264
+ throw error;
265
+ }
266
+ await saveUploadInClientStorage({
267
+ clientStorage,
268
+ fingerprint,
269
+ size: upload.size ?? 0,
270
+ metadata: upload.metadata ?? {},
271
+ clientStorageKey: uploadIdStorageKey,
272
+ storeFingerprintForResuming,
273
+ generateId,
274
+ });
275
+ // Upload has already been completed and we do not need to send additional
276
+ // data to the server
277
+ if (upload.offset === upload.size) {
278
+ return undefined;
279
+ }
280
+ openWebSocket(upload.id);
281
+ return {
282
+ uploadId,
283
+ uploadIdStorageKey,
284
+ offset: upload.offset,
285
+ };
286
+ }
287
+ /**
288
+ * Initiate the uploading procedure for a non-parallel upload. Here the entire file is
289
+ * uploaded in a sequential matter.
290
+ */
291
+ export async function startSingleUpload({ source, uploadId, uploadIdStorageKey, storageId, fingerprint, platformService, uploadLengthDeferred, uploadistaApi, checksumService, logger, clientStorage, generateId, storeFingerprintForResuming, openWebSocket, closeWebSocket, ...callbacks }) {
292
+ // The upload had been started previously and we should reuse this URL.
293
+ if (uploadId != null && uploadIdStorageKey != null) {
294
+ logger.log(`Resuming upload from previous id: ${uploadId}`);
295
+ return await resumeUpload({
296
+ uploadId,
297
+ uploadIdStorageKey,
298
+ storageId,
299
+ fingerprint,
300
+ source,
301
+ checksumService,
302
+ uploadLengthDeferred,
303
+ uploadistaApi,
304
+ logger,
305
+ platformService,
306
+ clientStorage,
307
+ generateId,
308
+ storeFingerprintForResuming,
309
+ openWebSocket,
310
+ ...callbacks,
311
+ });
312
+ }
313
+ // An upload has not started for the file yet, so we start a new one
314
+ logger.log("Creating a new upload");
315
+ return await createUpload({
316
+ fingerprint,
317
+ storageId,
318
+ source,
319
+ uploadLengthDeferred,
320
+ metadata: {},
321
+ uploadistaApi,
322
+ logger,
323
+ checksumService,
324
+ platformService,
325
+ clientStorage,
326
+ generateId,
327
+ storeFingerprintForResuming,
328
+ openWebSocket,
329
+ closeWebSocket,
330
+ ...callbacks,
331
+ });
332
+ }
@@ -0,0 +1,30 @@
1
+ import type { UploadistaApi } from "../client/uploadista-api";
2
+ import type { AbortControllerLike } from "../services/abort-controller-service";
3
+ import { type PlatformService, type Timeout } from "../services/platform-service";
4
+ import type { ClientStorage } from "../storage/client-storage";
5
+ /**
6
+ * Use the Termination extension to delete an upload from the server by sending a DELETE
7
+ * request to the specified upload URL. This is only possible if the server supports the
8
+ * Termination extension. If the `retryDelays` property is set, the method will
9
+ * also retry if an error occurs.
10
+ */
11
+ export declare function terminate(uploadId: string, uploadistaApi: UploadistaApi, platformService: PlatformService, retryDelays: number[] | undefined, retryAttempt?: number): Promise<void>;
12
+ /**
13
+ * Abort any running request and stop the current upload. After abort is called, no event
14
+ * handler will be invoked anymore. You can use the `start` method to resume the upload
15
+ * again.
16
+ * If `shouldTerminate` is true, the `terminate` function will be called to remove the
17
+ * current upload from the server.
18
+ */
19
+ export declare function abort({ uploadId, uploadIdStorageKey, retryTimeout, shouldTerminate, abortController, uploadistaApi, platformService, retryDelays, clientStorage, }: {
20
+ uploadId: string;
21
+ uploadIdStorageKey: string | undefined;
22
+ retryTimeout: Timeout | null;
23
+ shouldTerminate: boolean;
24
+ abortController: AbortControllerLike;
25
+ uploadistaApi: UploadistaApi;
26
+ platformService: PlatformService;
27
+ retryDelays?: number[];
28
+ clientStorage: ClientStorage;
29
+ }): Promise<void>;
30
+ //# sourceMappingURL=upload-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-manager.d.ts","sourceRoot":"","sources":["../../src/upload/upload-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAChF,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,OAAO,EAEb,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAI/D;;;;;GAKG;AACH,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,aAAa,EAC5B,eAAe,EAAE,eAAe,EAChC,WAAW,EAAE,MAAM,EAAE,GAAG,SAAS,EACjC,YAAY,SAAI,GACf,OAAO,CAAC,IAAI,CAAC,CAkCf;AAED;;;;;;GAMG;AACH,wBAAsB,KAAK,CAAC,EAC1B,QAAQ,EACR,kBAAkB,EAClB,YAAY,EACZ,eAAe,EACf,eAAe,EACf,aAAa,EACb,eAAe,EACf,WAAW,EACX,aAAa,GACd,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,YAAY,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7B,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,EAAE,mBAAmB,CAAC;IACrC,aAAa,EAAE,aAAa,CAAC;IAC7B,eAAe,EAAE,eAAe,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,EAAE,aAAa,CAAC;CAC9B,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBhB"}
@@ -0,0 +1,57 @@
1
+ import { UploadistaError } from "../error";
2
+ import { wait, } from "../services/platform-service";
3
+ import { shouldRetry } from "./chunk-upload";
4
+ import { removeFromClientStorage } from "./upload-storage";
5
+ /**
6
+ * Use the Termination extension to delete an upload from the server by sending a DELETE
7
+ * request to the specified upload URL. This is only possible if the server supports the
8
+ * Termination extension. If the `retryDelays` property is set, the method will
9
+ * also retry if an error occurs.
10
+ */
11
+ export async function terminate(uploadId, uploadistaApi, platformService, retryDelays, retryAttempt = 0) {
12
+ try {
13
+ const res = await uploadistaApi.deleteUpload(uploadId);
14
+ // A 204 response indicates a successful request
15
+ if (res.status === 204) {
16
+ return;
17
+ }
18
+ throw new UploadistaError({
19
+ name: "NETWORK_UNEXPECTED_RESPONSE",
20
+ message: "Unexpected response while terminating upload",
21
+ });
22
+ }
23
+ catch (err) {
24
+ const error = err;
25
+ if (!shouldRetry(platformService, error, retryAttempt, retryDelays)) {
26
+ throw err;
27
+ }
28
+ // Instead of keeping track of the retry attempts, we remove the first element from the delays
29
+ // array. If the array is empty, all retry attempts are used up and we will bubble up the error.
30
+ // We recursively call the terminate function will removing elements from the retryDelays array.
31
+ const delay = retryDelays?.[retryAttempt] ?? 0;
32
+ await wait(platformService, delay);
33
+ return await terminate(uploadId, uploadistaApi, platformService, retryDelays, retryAttempt + 1);
34
+ }
35
+ }
36
+ /**
37
+ * Abort any running request and stop the current upload. After abort is called, no event
38
+ * handler will be invoked anymore. You can use the `start` method to resume the upload
39
+ * again.
40
+ * If `shouldTerminate` is true, the `terminate` function will be called to remove the
41
+ * current upload from the server.
42
+ */
43
+ export async function abort({ uploadId, uploadIdStorageKey, retryTimeout, shouldTerminate, abortController, uploadistaApi, platformService, retryDelays, clientStorage, }) {
44
+ // Stop any current running request.
45
+ abortController.abort();
46
+ // Stop any timeout used for initiating a retry.
47
+ if (retryTimeout != null) {
48
+ platformService.clearTimeout(retryTimeout);
49
+ }
50
+ if (!shouldTerminate || uploadId == null) {
51
+ return;
52
+ }
53
+ await terminate(uploadId, uploadistaApi, platformService, retryDelays);
54
+ if (uploadIdStorageKey != null) {
55
+ return removeFromClientStorage(clientStorage, uploadIdStorageKey);
56
+ }
57
+ }
@@ -0,0 +1,37 @@
1
+ import type { ChunkMetrics } from "../types/chunk-metrics";
2
+ import type { PerformanceInsights } from "../types/performance-insights";
3
+ import type { UploadSessionMetrics } from "../types/upload-session-metrics";
4
+ export interface UploadMetricsConfig {
5
+ maxChunkHistory?: number;
6
+ enableDetailedMetrics?: boolean;
7
+ performanceThresholds?: {
8
+ slowSpeed: number;
9
+ fastSpeed: number;
10
+ highRetryRate: number;
11
+ };
12
+ }
13
+ export declare class UploadMetrics {
14
+ private config;
15
+ private chunkHistory;
16
+ private currentSession;
17
+ private sessionStartTime;
18
+ constructor(config?: UploadMetricsConfig);
19
+ startSession(uploadId: string, totalSize: number, adaptiveChunkingEnabled: boolean): void;
20
+ recordChunk(metrics: Omit<ChunkMetrics, "timestamp">): void;
21
+ endSession(): UploadSessionMetrics | null;
22
+ getCurrentSessionMetrics(): Partial<UploadSessionMetrics>;
23
+ getChunkHistory(count?: number): ChunkMetrics[];
24
+ getPerformanceInsights(): PerformanceInsights;
25
+ exportMetrics(): {
26
+ session: Partial<UploadSessionMetrics>;
27
+ chunks: ChunkMetrics[];
28
+ insights: PerformanceInsights;
29
+ };
30
+ reset(): void;
31
+ private calculateVariance;
32
+ private calculateChunkingEffectiveness;
33
+ private groupChunksBySize;
34
+ private generateRecommendations;
35
+ private calculateOptimalChunkSizeRange;
36
+ }
37
+ //# sourceMappingURL=upload-metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-metrics.d.ts","sourceRoot":"","sources":["../../src/upload/upload-metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAE5E,MAAM,WAAW,mBAAmB;IAClC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,qBAAqB,CAAC,EAAE;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,cAAc,CAAqC;IAC3D,OAAO,CAAC,gBAAgB,CAAK;gBAEjB,MAAM,GAAE,mBAAwB;IAa5C,YAAY,CACV,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,uBAAuB,EAAE,OAAO,GAC/B,IAAI;IAeP,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,GAAG,IAAI;IAwB3D,UAAU,IAAI,oBAAoB,GAAG,IAAI;IA2CzC,wBAAwB,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAIzD,eAAe,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE;IAK/C,sBAAsB,IAAI,mBAAmB;IA6D7C,aAAa,IAAI;QACf,OAAO,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC;QACvC,MAAM,EAAE,YAAY,EAAE,CAAC;QACvB,QAAQ,EAAE,mBAAmB,CAAC;KAC/B;IAQD,KAAK,IAAI,IAAI;IAMb,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,8BAA8B;IAwBtC,OAAO,CAAC,iBAAiB;IAyBzB,OAAO,CAAC,uBAAuB;IAiD/B,OAAO,CAAC,8BAA8B;CAwBvC"}