@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,207 @@
1
+ import { webSocketMessageSchema } from "@uploadista/core/types";
2
+ /**
3
+ * Unified WebSocket management for both upload and flow events
4
+ */
5
+ export class UploadistaWebSocketManager {
6
+ constructor(uploadistaApi, logger, onEvent) {
7
+ this.uploadistaApi = uploadistaApi;
8
+ this.logger = logger;
9
+ this.onEvent = onEvent;
10
+ this.uploadWebsockets = new Map();
11
+ this.flowWebsockets = new Map();
12
+ }
13
+ /**
14
+ * Open a WebSocket connection for upload events
15
+ */
16
+ async openUploadWebSocket(uploadId) {
17
+ // Close existing connection if any
18
+ this.closeUploadWebSocket(uploadId);
19
+ const ws = await this.uploadistaApi.openUploadWebSocket(uploadId);
20
+ this.uploadWebsockets.set(uploadId, ws);
21
+ ws.onmessage = (event) => {
22
+ try {
23
+ const parsedEvent = webSocketMessageSchema.safeParse(JSON.parse(event.data));
24
+ if (parsedEvent.success) {
25
+ if (parsedEvent.data.type === "upload_event") {
26
+ this.onEvent?.(parsedEvent.data.payload);
27
+ }
28
+ }
29
+ else {
30
+ this.logger.error(`Error parsing upload event: ${parsedEvent.error.message}`);
31
+ }
32
+ }
33
+ catch (error) {
34
+ this.logger.error(`Error parsing upload event: ${error}`);
35
+ }
36
+ };
37
+ ws.onerror = (error) => {
38
+ this.logger.error(`Upload WebSocket error for ${uploadId}: ${error}`);
39
+ };
40
+ ws.onclose = (event) => {
41
+ this.logger.log(`Upload WebSocket closed for ${uploadId}, \n code: ${event.code}, reason: ${event.reason}`);
42
+ this.uploadWebsockets.delete(uploadId);
43
+ };
44
+ return ws;
45
+ }
46
+ /**
47
+ * Open a WebSocket connection for flow/job events
48
+ */
49
+ async openFlowWebSocket(jobId) {
50
+ // Close existing connection if any
51
+ this.closeFlowWebSocket(jobId);
52
+ const ws = await this.uploadistaApi.openFlowWebSocket(jobId);
53
+ this.flowWebsockets.set(jobId, ws);
54
+ ws.onmessage = (event) => {
55
+ try {
56
+ const message = JSON.parse(event.data);
57
+ switch (message.type) {
58
+ case "connection":
59
+ this.logger.log(`Flow WebSocket connected for job: ${message.id}`);
60
+ break;
61
+ case "subscribed":
62
+ this.logger.log(`Flow WebSocket subscribed for job: ${message.payload.jobId}`);
63
+ break;
64
+ case "error":
65
+ this.logger.error(`Flow WebSocket error: ${message.message} for job ${jobId} with code ${message.code}`);
66
+ break;
67
+ case "pong":
68
+ this.logger.log(`Flow WebSocket pong received for job: ${jobId}`);
69
+ break;
70
+ case "flow_event":
71
+ this.onEvent?.(message.payload);
72
+ break;
73
+ default:
74
+ this.logger.warn(`Unknown flow WebSocket message type: ${message.type}`);
75
+ }
76
+ }
77
+ catch (error) {
78
+ this.logger.error(`Error parsing flow WebSocket message:${error}`);
79
+ }
80
+ };
81
+ ws.onerror = (error) => {
82
+ this.logger.error(`Flow WebSocket error for job ${jobId}: ${error}`);
83
+ };
84
+ ws.onclose = (event) => {
85
+ this.logger.log(`Flow WebSocket closed for job ${jobId}, \n code: ${event.code}, reason: ${event.reason}`);
86
+ this.flowWebsockets.delete(jobId);
87
+ };
88
+ return ws;
89
+ }
90
+ /**
91
+ * Open a unified WebSocket connection - automatically determines if it's for upload or flow
92
+ * based on the ID format (upload IDs typically start with 'upload-', job IDs start with 'job-')
93
+ */
94
+ async openWebSocket(id) {
95
+ // Heuristic: if ID starts with 'upload-' or contains upload-related patterns, treat as upload
96
+ // Otherwise, treat as flow/job
97
+ if (id.startsWith("upload-") || id.includes("upload")) {
98
+ return await this.openUploadWebSocket(id);
99
+ }
100
+ return await this.openFlowWebSocket(id);
101
+ }
102
+ /**
103
+ * Close upload WebSocket connection
104
+ */
105
+ closeUploadWebSocket(uploadId) {
106
+ const ws = this.uploadWebsockets.get(uploadId);
107
+ if (ws) {
108
+ this.uploadistaApi.closeWebSocket(ws);
109
+ this.uploadWebsockets.delete(uploadId);
110
+ }
111
+ }
112
+ /**
113
+ * Close flow WebSocket connection
114
+ */
115
+ closeFlowWebSocket(jobId) {
116
+ const ws = this.flowWebsockets.get(jobId);
117
+ if (ws) {
118
+ this.uploadistaApi.closeWebSocket(ws);
119
+ this.flowWebsockets.delete(jobId);
120
+ }
121
+ }
122
+ /**
123
+ * Close WebSocket connection by ID (auto-detects type)
124
+ */
125
+ closeWebSocket(id) {
126
+ // Try both maps
127
+ this.closeUploadWebSocket(id);
128
+ this.closeFlowWebSocket(id);
129
+ }
130
+ /**
131
+ * Close all WebSocket connections (both upload and flow)
132
+ */
133
+ closeAll() {
134
+ // Close all upload websockets
135
+ for (const [uploadId, ws] of this.uploadWebsockets.entries()) {
136
+ this.uploadistaApi.closeWebSocket(ws);
137
+ this.uploadWebsockets.delete(uploadId);
138
+ }
139
+ // Close all flow websockets
140
+ for (const [jobId, ws] of this.flowWebsockets.entries()) {
141
+ this.uploadistaApi.closeWebSocket(ws);
142
+ this.flowWebsockets.delete(jobId);
143
+ }
144
+ }
145
+ /**
146
+ * Send ping to flow WebSocket
147
+ */
148
+ sendPing(jobId) {
149
+ const ws = this.flowWebsockets.get(jobId);
150
+ if (ws && ws.readyState === ws.OPEN) {
151
+ ws.send(JSON.stringify({
152
+ type: "ping",
153
+ timestamp: new Date().toISOString(),
154
+ }));
155
+ return true;
156
+ }
157
+ return false;
158
+ }
159
+ /**
160
+ * Get upload WebSocket by ID
161
+ */
162
+ getUploadWebSocket(uploadId) {
163
+ return this.uploadWebsockets.get(uploadId);
164
+ }
165
+ /**
166
+ * Get flow WebSocket by ID
167
+ */
168
+ getFlowWebSocket(jobId) {
169
+ return this.flowWebsockets.get(jobId);
170
+ }
171
+ /**
172
+ * Check if upload WebSocket is connected
173
+ */
174
+ isUploadConnected(uploadId) {
175
+ const ws = this.uploadWebsockets.get(uploadId);
176
+ return ws?.readyState === ws?.OPEN;
177
+ }
178
+ /**
179
+ * Check if flow WebSocket is connected
180
+ */
181
+ isFlowConnected(jobId) {
182
+ const ws = this.flowWebsockets.get(jobId);
183
+ return ws?.readyState === ws?.OPEN;
184
+ }
185
+ /**
186
+ * Check if WebSocket is connected (auto-detects type)
187
+ */
188
+ isConnected(id) {
189
+ return this.isUploadConnected(id) || this.isFlowConnected(id);
190
+ }
191
+ /**
192
+ * Get total number of active WebSocket connections
193
+ */
194
+ getConnectionCount() {
195
+ return this.uploadWebsockets.size + this.flowWebsockets.size;
196
+ }
197
+ /**
198
+ * Get connection counts by type
199
+ */
200
+ getConnectionCountByType() {
201
+ return {
202
+ upload: this.uploadWebsockets.size,
203
+ flow: this.flowWebsockets.size,
204
+ total: this.uploadWebsockets.size + this.flowWebsockets.size,
205
+ };
206
+ }
207
+ }
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Specific error types that can occur during upload and flow operations.
3
+ *
4
+ * These error names provide fine-grained categorization of failures,
5
+ * allowing applications to implement targeted error handling and recovery strategies.
6
+ *
7
+ * @example Error handling by type
8
+ * ```typescript
9
+ * try {
10
+ * await client.upload(file);
11
+ * } catch (error) {
12
+ * if (error instanceof UploadistaError) {
13
+ * if (error.isNetworkError()) {
14
+ * // Retry network-related failures
15
+ * console.log('Network issue, retrying...');
16
+ * } else if (error.name === 'UPLOAD_NOT_FOUND') {
17
+ * // Handle missing upload
18
+ * console.log('Upload not found, starting fresh');
19
+ * }
20
+ * }
21
+ * }
22
+ * ```
23
+ */
24
+ export type UploadistaErrorName = "UPLOAD_SIZE_NOT_SPECIFIED" | "NETWORK_ERROR" | "NETWORK_UNEXPECTED_RESPONSE" | "UPLOAD_CHUNK_FAILED" | "WRONG_UPLOAD_SIZE" | "UPLOAD_LOCKED" | "UPLOAD_NOT_FOUND" | "CREATE_UPLOAD_FAILED" | "DELETE_UPLOAD_FAILED" | "PARALLEL_SEGMENT_CREATION_FAILED" | "PARALLEL_SEGMENT_UPLOAD_FAILED" | "FLOW_NOT_FOUND" | "FLOW_INIT_FAILED" | "FLOW_RUN_FAILED" | "FLOW_CONTINUE_FAILED" | "FLOW_UNEXPECTED_STATE" | "FLOW_INCOMPATIBLE" | "FLOW_NO_UPLOAD_ID" | "FLOW_TIMEOUT" | "FLOW_FINALIZE_FAILED" | "JOB_NOT_FOUND" | "WEBSOCKET_AUTH_FAILED";
25
+ /**
26
+ * Custom error class for all Uploadista client operations.
27
+ *
28
+ * Extends the standard Error class with additional context including
29
+ * typed error names, HTTP status codes, and underlying error causes.
30
+ * This allows for precise error handling and debugging.
31
+ *
32
+ * @example Basic error handling
33
+ * ```typescript
34
+ * try {
35
+ * await client.upload(file);
36
+ * } catch (error) {
37
+ * if (error instanceof UploadistaError) {
38
+ * console.log(`Error: ${error.name} - ${error.message}`);
39
+ * console.log(`HTTP Status: ${error.status}`);
40
+ * }
41
+ * }
42
+ * ```
43
+ *
44
+ * @example Network error detection
45
+ * ```typescript
46
+ * try {
47
+ * await client.upload(file);
48
+ * } catch (error) {
49
+ * if (error instanceof UploadistaError && error.isNetworkError()) {
50
+ * // Implement retry logic for network failures
51
+ * await retryWithBackoff(() => client.upload(file));
52
+ * }
53
+ * }
54
+ * ```
55
+ */
56
+ export declare class UploadistaError extends Error {
57
+ /**
58
+ * Typed error name indicating the specific type of failure
59
+ */
60
+ name: UploadistaErrorName;
61
+ /**
62
+ * Human-readable error message describing what went wrong
63
+ */
64
+ message: string;
65
+ /**
66
+ * The underlying error that caused this failure, if any
67
+ */
68
+ cause: Error | undefined;
69
+ /**
70
+ * HTTP status code from the server response, if applicable
71
+ */
72
+ status: number | undefined;
73
+ /**
74
+ * Creates a new UploadistaError instance.
75
+ *
76
+ * @param options - Error configuration
77
+ * @param options.name - Typed error name for categorization
78
+ * @param options.message - Descriptive error message
79
+ * @param options.cause - Optional underlying error that caused this failure
80
+ * @param options.status - Optional HTTP status code from server response
81
+ */
82
+ constructor({ name, message, cause, status, }: {
83
+ name: UploadistaErrorName;
84
+ message: string;
85
+ cause?: Error;
86
+ status?: number;
87
+ });
88
+ /**
89
+ * Checks if this error is related to network connectivity issues.
90
+ *
91
+ * Network errors are typically transient and may succeed on retry,
92
+ * making them good candidates for automatic retry logic.
93
+ *
94
+ * @returns True if this is a network-related error
95
+ *
96
+ * @example
97
+ * ```typescript
98
+ * if (error.isNetworkError()) {
99
+ * // Safe to retry
100
+ * await retry(() => uploadChunk());
101
+ * }
102
+ * ```
103
+ */
104
+ isNetworkError(): boolean;
105
+ }
106
+ //# sourceMappingURL=error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,MAAM,mBAAmB,GAC3B,2BAA2B,GAC3B,eAAe,GACf,6BAA6B,GAC7B,qBAAqB,GACrB,mBAAmB,GACnB,eAAe,GACf,kBAAkB,GAClB,sBAAsB,GACtB,sBAAsB,GACtB,kCAAkC,GAClC,gCAAgC,GAChC,gBAAgB,GAChB,kBAAkB,GAClB,iBAAiB,GACjB,sBAAsB,GACtB,uBAAuB,GACvB,mBAAmB,GACnB,mBAAmB,GACnB,cAAc,GACd,sBAAsB,GACtB,eAAe,GACf,uBAAuB,CAAC;AAE5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IACxC;;OAEG;IACH,IAAI,EAAE,mBAAmB,CAAC;IAE1B;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;IAEzB;;OAEG;IACH,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAE3B;;;;;;;;OAQG;gBACS,EACV,IAAI,EACJ,OAAO,EACP,KAAK,EACL,MAAM,GACP,EAAE;QACD,IAAI,EAAE,mBAAmB,CAAC;QAC1B,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,KAAK,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB;IAQD;;;;;;;;;;;;;;;OAeG;IACH,cAAc,IAAI,OAAO;CAM1B"}
package/dist/error.js ADDED
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Custom error class for all Uploadista client operations.
3
+ *
4
+ * Extends the standard Error class with additional context including
5
+ * typed error names, HTTP status codes, and underlying error causes.
6
+ * This allows for precise error handling and debugging.
7
+ *
8
+ * @example Basic error handling
9
+ * ```typescript
10
+ * try {
11
+ * await client.upload(file);
12
+ * } catch (error) {
13
+ * if (error instanceof UploadistaError) {
14
+ * console.log(`Error: ${error.name} - ${error.message}`);
15
+ * console.log(`HTTP Status: ${error.status}`);
16
+ * }
17
+ * }
18
+ * ```
19
+ *
20
+ * @example Network error detection
21
+ * ```typescript
22
+ * try {
23
+ * await client.upload(file);
24
+ * } catch (error) {
25
+ * if (error instanceof UploadistaError && error.isNetworkError()) {
26
+ * // Implement retry logic for network failures
27
+ * await retryWithBackoff(() => client.upload(file));
28
+ * }
29
+ * }
30
+ * ```
31
+ */
32
+ export class UploadistaError extends Error {
33
+ /**
34
+ * Creates a new UploadistaError instance.
35
+ *
36
+ * @param options - Error configuration
37
+ * @param options.name - Typed error name for categorization
38
+ * @param options.message - Descriptive error message
39
+ * @param options.cause - Optional underlying error that caused this failure
40
+ * @param options.status - Optional HTTP status code from server response
41
+ */
42
+ constructor({ name, message, cause, status, }) {
43
+ super();
44
+ this.name = name;
45
+ this.cause = cause;
46
+ this.message = message;
47
+ this.status = status;
48
+ }
49
+ /**
50
+ * Checks if this error is related to network connectivity issues.
51
+ *
52
+ * Network errors are typically transient and may succeed on retry,
53
+ * making them good candidates for automatic retry logic.
54
+ *
55
+ * @returns True if this is a network-related error
56
+ *
57
+ * @example
58
+ * ```typescript
59
+ * if (error.isNetworkError()) {
60
+ * // Safe to retry
61
+ * await retry(() => uploadChunk());
62
+ * }
63
+ * ```
64
+ */
65
+ isNetworkError() {
66
+ return (this.name === "NETWORK_ERROR" ||
67
+ this.name === "NETWORK_UNEXPECTED_RESPONSE");
68
+ }
69
+ }
@@ -0,0 +1,9 @@
1
+ export * from "./chunk-buffer";
2
+ export * from "./client";
3
+ export * from "./error";
4
+ export * from "./logger";
5
+ export * from "./network-monitor";
6
+ export * from "./services";
7
+ export * from "./storage";
8
+ export * from "./types";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AAEzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC;AAE3B,cAAc,WAAW,CAAC;AAE1B,cAAc,SAAS,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,12 @@
1
+ // Service interfaces
2
+ export * from "./chunk-buffer";
3
+ export * from "./client";
4
+ export * from "./error";
5
+ export * from "./logger";
6
+ // Utilities
7
+ export * from "./network-monitor";
8
+ export * from "./services";
9
+ // Storage
10
+ export * from "./storage";
11
+ // Core types
12
+ export * from "./types";
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Logger interface for Uploadista client operations.
3
+ *
4
+ * Provides structured logging capabilities for debugging upload progress,
5
+ * flow execution, and client operations. Platform implementations should
6
+ * provide their own logging functions (e.g., console.log, custom loggers).
7
+ *
8
+ * @example Using with console
9
+ * ```typescript
10
+ * const logger = createLogger(true, console.log);
11
+ * logger.log('Upload started');
12
+ * logger.warn('Retrying failed chunk');
13
+ * logger.error('Upload failed');
14
+ * ```
15
+ */
16
+ export type Logger = {
17
+ /**
18
+ * Log informational messages (e.g., upload progress, state changes)
19
+ */
20
+ log: (message: string) => void;
21
+ /**
22
+ * Log warning messages (e.g., retry attempts, degraded performance)
23
+ */
24
+ warn: (message: string) => void;
25
+ /**
26
+ * Log error messages (e.g., upload failures, network errors)
27
+ */
28
+ error: (message: string) => void;
29
+ };
30
+ /**
31
+ * Platform-specific logging function type.
32
+ *
33
+ * Accepts a message string and outputs it to the appropriate logging destination.
34
+ * This abstraction allows the client to work across different platforms
35
+ * (browser, Node.js, React Native) with their own logging mechanisms.
36
+ */
37
+ export type LogFunction = (message: string) => void;
38
+ /**
39
+ * Creates a Logger instance with configurable output.
40
+ *
41
+ * This factory function creates a logger that can be enabled/disabled
42
+ * and customized with a platform-specific logging function.
43
+ *
44
+ * @param enabled - Whether logging is enabled. When false, all log calls are no-ops
45
+ * @param logFn - Optional custom logging function. Defaults to no-op. Pass console.log for browser/Node.js
46
+ * @returns A Logger instance with log, warn, and error methods
47
+ *
48
+ * @example Basic usage with console
49
+ * ```typescript
50
+ * const logger = createLogger(true, console.log);
51
+ * logger.log('Upload started');
52
+ * ```
53
+ *
54
+ * @example Disabled logger (no output)
55
+ * ```typescript
56
+ * const logger = createLogger(false);
57
+ * logger.log('This will not be logged');
58
+ * ```
59
+ *
60
+ * @example Custom logging function
61
+ * ```typescript
62
+ * const customLog = (msg: string) => {
63
+ * // Send to analytics service
64
+ * analytics.track('upload_log', { message: msg });
65
+ * };
66
+ * const logger = createLogger(true, customLog);
67
+ * ```
68
+ */
69
+ export declare function createLogger(enabled: boolean, logFn?: LogFunction): Logger;
70
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,MAAM,GAAG;IACnB;;OAEG;IACH,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAE/B;;OAEG;IACH,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAEhC;;OAEG;IACH,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAYpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,OAAO,EAChB,KAAK,GAAE,WAAqB,GAC3B,MAAM,CAkBR"}
package/dist/logger.js ADDED
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Default no-op logger function.
3
+ *
4
+ * Used when no custom logging function is provided.
5
+ * Platform implementations should provide their own (e.g., console.log).
6
+ */
7
+ const noopLog = () => {
8
+ // No-op by default - platforms will override
9
+ };
10
+ /**
11
+ * Creates a Logger instance with configurable output.
12
+ *
13
+ * This factory function creates a logger that can be enabled/disabled
14
+ * and customized with a platform-specific logging function.
15
+ *
16
+ * @param enabled - Whether logging is enabled. When false, all log calls are no-ops
17
+ * @param logFn - Optional custom logging function. Defaults to no-op. Pass console.log for browser/Node.js
18
+ * @returns A Logger instance with log, warn, and error methods
19
+ *
20
+ * @example Basic usage with console
21
+ * ```typescript
22
+ * const logger = createLogger(true, console.log);
23
+ * logger.log('Upload started');
24
+ * ```
25
+ *
26
+ * @example Disabled logger (no output)
27
+ * ```typescript
28
+ * const logger = createLogger(false);
29
+ * logger.log('This will not be logged');
30
+ * ```
31
+ *
32
+ * @example Custom logging function
33
+ * ```typescript
34
+ * const customLog = (msg: string) => {
35
+ * // Send to analytics service
36
+ * analytics.track('upload_log', { message: msg });
37
+ * };
38
+ * const logger = createLogger(true, customLog);
39
+ * ```
40
+ */
41
+ export function createLogger(enabled, logFn = noopLog) {
42
+ return {
43
+ log: (message) => {
44
+ if (enabled) {
45
+ logFn(message);
46
+ }
47
+ },
48
+ warn: (message) => {
49
+ if (enabled) {
50
+ logFn(message);
51
+ }
52
+ },
53
+ error: (message) => {
54
+ if (enabled) {
55
+ logFn(message);
56
+ }
57
+ },
58
+ };
59
+ }
@@ -0,0 +1,30 @@
1
+ import type { DataStoreCapabilities, UploadStrategy } from "@uploadista/core/types";
2
+ /**
3
+ * Mock data store implementation for client-side capability negotiation.
4
+ * This doesn't perform actual data store operations but provides capability information
5
+ * for upload strategy decisions.
6
+ */
7
+ export declare class MockClientDataStore {
8
+ private capabilities;
9
+ constructor(capabilities: DataStoreCapabilities);
10
+ getCapabilities(): DataStoreCapabilities;
11
+ validateUploadStrategy(strategy: UploadStrategy): boolean;
12
+ }
13
+ /**
14
+ * Default capabilities that assume basic parallel upload support
15
+ * (conservative defaults that work with most backends)
16
+ */
17
+ export declare const defaultClientCapabilities: DataStoreCapabilities;
18
+ /**
19
+ * Capabilities for S3-compatible backends
20
+ */
21
+ export declare const s3LikeCapabilities: DataStoreCapabilities;
22
+ /**
23
+ * Capabilities for GCS-compatible backends
24
+ */
25
+ export declare const gcsLikeCapabilities: DataStoreCapabilities;
26
+ /**
27
+ * Capabilities for filesystem-based backends
28
+ */
29
+ export declare const filesystemLikeCapabilities: DataStoreCapabilities;
30
+ //# sourceMappingURL=mock-data-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-data-store.d.ts","sourceRoot":"","sources":["../src/mock-data-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,cAAc,EACf,MAAM,wBAAwB,CAAC;AAEhC;;;;GAIG;AACH,qBAAa,mBAAmB;IAClB,OAAO,CAAC,YAAY;gBAAZ,YAAY,EAAE,qBAAqB;IAEvD,eAAe,IAAI,qBAAqB;IAIxC,sBAAsB,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO;CAU1D;AAED;;;GAGG;AACH,eAAO,MAAM,yBAAyB,EAAE,qBAYvC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,qBAYhC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,qBAYjC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,0BAA0B,EAAE,qBAYxC,CAAC"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Mock data store implementation for client-side capability negotiation.
3
+ * This doesn't perform actual data store operations but provides capability information
4
+ * for upload strategy decisions.
5
+ */
6
+ export class MockClientDataStore {
7
+ constructor(capabilities) {
8
+ this.capabilities = capabilities;
9
+ }
10
+ getCapabilities() {
11
+ return this.capabilities;
12
+ }
13
+ validateUploadStrategy(strategy) {
14
+ switch (strategy) {
15
+ case "parallel":
16
+ return this.capabilities.supportsParallelUploads;
17
+ case "single":
18
+ return true;
19
+ default:
20
+ return false;
21
+ }
22
+ }
23
+ }
24
+ /**
25
+ * Default capabilities that assume basic parallel upload support
26
+ * (conservative defaults that work with most backends)
27
+ */
28
+ export const defaultClientCapabilities = {
29
+ supportsParallelUploads: true,
30
+ supportsConcatenation: true,
31
+ supportsDeferredLength: true,
32
+ supportsResumableUploads: true,
33
+ supportsTransactionalUploads: false,
34
+ maxConcurrentUploads: 6, // Browser-safe default
35
+ minChunkSize: 64 * 1024, // 64KB
36
+ maxChunkSize: 100 * 1024 * 1024, // 100MB
37
+ maxParts: 10000,
38
+ optimalChunkSize: 8 * 1024 * 1024, // 8MB
39
+ requiresOrderedChunks: false,
40
+ };
41
+ /**
42
+ * Capabilities for S3-compatible backends
43
+ */
44
+ export const s3LikeCapabilities = {
45
+ supportsParallelUploads: true,
46
+ supportsConcatenation: true,
47
+ supportsDeferredLength: true,
48
+ supportsResumableUploads: true,
49
+ supportsTransactionalUploads: true,
50
+ maxConcurrentUploads: 60,
51
+ minChunkSize: 5 * 1024 * 1024, // 5MiB S3 minimum
52
+ maxChunkSize: 5 * 1024 * 1024 * 1024, // 5GiB S3 maximum
53
+ maxParts: 10000,
54
+ optimalChunkSize: 8 * 1024 * 1024, // 8MB
55
+ requiresOrderedChunks: false,
56
+ };
57
+ /**
58
+ * Capabilities for GCS-compatible backends
59
+ */
60
+ export const gcsLikeCapabilities = {
61
+ supportsParallelUploads: false, // GCS doesn't have native multipart
62
+ supportsConcatenation: true, // Can combine files
63
+ supportsDeferredLength: true,
64
+ supportsResumableUploads: true,
65
+ supportsTransactionalUploads: false,
66
+ maxConcurrentUploads: 1,
67
+ minChunkSize: undefined,
68
+ maxChunkSize: undefined,
69
+ maxParts: undefined,
70
+ optimalChunkSize: 8 * 1024 * 1024, // 8MB
71
+ requiresOrderedChunks: true,
72
+ };
73
+ /**
74
+ * Capabilities for filesystem-based backends
75
+ */
76
+ export const filesystemLikeCapabilities = {
77
+ supportsParallelUploads: false, // Sequential operations
78
+ supportsConcatenation: false,
79
+ supportsDeferredLength: false,
80
+ supportsResumableUploads: true,
81
+ supportsTransactionalUploads: false,
82
+ maxConcurrentUploads: 1,
83
+ minChunkSize: undefined,
84
+ maxChunkSize: undefined,
85
+ maxParts: undefined,
86
+ optimalChunkSize: 1024 * 1024, // 1MB
87
+ requiresOrderedChunks: true,
88
+ };