uploados 0.1.0

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 (66) hide show
  1. package/android/build.gradle +25 -0
  2. package/android/src/main/AndroidManifest.xml +15 -0
  3. package/android/src/main/java/expo/modules/uploados/UploadosModule.kt +121 -0
  4. package/android/src/main/java/expo/modules/uploados/upload/CompressionPipeline.kt +192 -0
  5. package/android/src/main/java/expo/modules/uploados/upload/FileStager.kt +125 -0
  6. package/android/src/main/java/expo/modules/uploados/upload/ProgressRequestBody.kt +36 -0
  7. package/android/src/main/java/expo/modules/uploados/upload/UploadManager.kt +857 -0
  8. package/android/src/main/java/expo/modules/uploados/upload/UploadModels.kt +209 -0
  9. package/android/src/main/java/expo/modules/uploados/upload/UploadNotificationHelper.kt +93 -0
  10. package/android/src/main/java/expo/modules/uploados/upload/UploadTaskStore.kt +224 -0
  11. package/android/src/main/java/expo/modules/uploados/upload/UploadWorker.kt +31 -0
  12. package/build/Uploados.types.d.ts +226 -0
  13. package/build/Uploados.types.d.ts.map +1 -0
  14. package/build/Uploados.types.js +2 -0
  15. package/build/Uploados.types.js.map +1 -0
  16. package/build/UploadosModule.d.ts +13 -0
  17. package/build/UploadosModule.d.ts.map +1 -0
  18. package/build/UploadosModule.js +3 -0
  19. package/build/UploadosModule.js.map +1 -0
  20. package/build/UploadosModule.web.d.ts +13 -0
  21. package/build/UploadosModule.web.d.ts.map +1 -0
  22. package/build/UploadosModule.web.js +33 -0
  23. package/build/UploadosModule.web.js.map +1 -0
  24. package/build/createUploader.d.ts +3 -0
  25. package/build/createUploader.d.ts.map +1 -0
  26. package/build/createUploader.js +108 -0
  27. package/build/createUploader.js.map +1 -0
  28. package/build/index.d.ts +5 -0
  29. package/build/index.d.ts.map +1 -0
  30. package/build/index.js +5 -0
  31. package/build/index.js.map +1 -0
  32. package/build/normalizeUploadOptions.d.ts +9 -0
  33. package/build/normalizeUploadOptions.d.ts.map +1 -0
  34. package/build/normalizeUploadOptions.js +81 -0
  35. package/build/normalizeUploadOptions.js.map +1 -0
  36. package/build/providers/defineUploadProvider.d.ts +26 -0
  37. package/build/providers/defineUploadProvider.d.ts.map +1 -0
  38. package/build/providers/defineUploadProvider.js +39 -0
  39. package/build/providers/defineUploadProvider.js.map +1 -0
  40. package/build/providers/multipartPlan.d.ts +10 -0
  41. package/build/providers/multipartPlan.d.ts.map +1 -0
  42. package/build/providers/multipartPlan.js +28 -0
  43. package/build/providers/multipartPlan.js.map +1 -0
  44. package/eslint.config.cjs +5 -0
  45. package/expo-module.config.json +10 -0
  46. package/ios/Upload/CompressionPipeline.swift +183 -0
  47. package/ios/Upload/FileStager.swift +67 -0
  48. package/ios/Upload/UploadManager.swift +813 -0
  49. package/ios/Upload/UploadModels.swift +305 -0
  50. package/ios/Upload/UploadSessionDelegate.swift +82 -0
  51. package/ios/Upload/UploadTaskStore.swift +92 -0
  52. package/ios/Upload/UploadosAppDelegate.swift +14 -0
  53. package/ios/Uploados.podspec +23 -0
  54. package/ios/UploadosModule.swift +87 -0
  55. package/jest.config.js +15 -0
  56. package/package.json +54 -0
  57. package/readme.md +169 -0
  58. package/src/Uploados.types.ts +260 -0
  59. package/src/UploadosModule.ts +18 -0
  60. package/src/UploadosModule.web.ts +49 -0
  61. package/src/createUploader.ts +146 -0
  62. package/src/index.ts +4 -0
  63. package/src/normalizeUploadOptions.ts +132 -0
  64. package/src/providers/defineUploadProvider.ts +75 -0
  65. package/src/providers/multipartPlan.ts +43 -0
  66. package/tsconfig.json +42 -0
@@ -0,0 +1,226 @@
1
+ export type UploadState = 'created' | 'validating' | 'compressing' | 'queued' | 'connecting' | 'uploading' | 'verifying' | 'retrying' | 'completed' | 'paused' | 'failed' | 'cancelled';
2
+ export type UploadHttpMethod = 'PUT' | 'POST';
3
+ export type UploadNetworkPolicy = 'wait' | 'failFast';
4
+ export type UploadErrorPhase = 'validating' | 'compressing' | 'connecting' | 'uploading' | 'verifying' | 'retrying';
5
+ export type UploadProgress = {
6
+ bytesUploaded: number;
7
+ totalBytes: number;
8
+ percentage: number;
9
+ };
10
+ export type UploadErrorCode = 'FILE_NOT_FOUND' | 'FILE_TOO_LARGE' | 'NETWORK_ERROR' | 'AUTH_ERROR' | 'PROVIDER_ERROR' | 'MULTIPART_FAILED' | 'COMPRESSION_FAILED' | 'BACKGROUND_RESTRICTED' | 'CANCELLED' | 'UNSUPPORTED_PLATFORM' | 'UNKNOWN';
11
+ export type UploadErrorPayload = {
12
+ code: UploadErrorCode;
13
+ message: string;
14
+ retryable: boolean;
15
+ taskId: string;
16
+ phase?: UploadErrorPhase;
17
+ httpStatus?: number;
18
+ providerCode?: string;
19
+ providerMessage?: string;
20
+ nativeCause?: string;
21
+ };
22
+ export type UploadFileMetadata = {
23
+ originalUri: string;
24
+ uploadUri: string;
25
+ isStaged: boolean;
26
+ sizeBytes?: number;
27
+ };
28
+ export type CompressionStats = {
29
+ preset: CompressionPreset;
30
+ originalSize: number;
31
+ optimizedSize: number;
32
+ format: 'jpeg';
33
+ };
34
+ export type UploadTaskSnapshot = {
35
+ id: string;
36
+ localUri: string;
37
+ file?: UploadFileMetadata;
38
+ uploadUrl: string;
39
+ method: UploadHttpMethod;
40
+ state: UploadState;
41
+ progress: UploadProgress;
42
+ background: boolean;
43
+ networkPolicy: UploadNetworkPolicy;
44
+ attempt: number;
45
+ maxAttempts: number;
46
+ nextRetryAt?: number;
47
+ createdAt: number;
48
+ updatedAt: number;
49
+ originalSize?: number;
50
+ optimizedSize?: number;
51
+ compression?: CompressionStats;
52
+ error?: UploadErrorPayload;
53
+ };
54
+ export type UploadRetryOptions = {
55
+ maxAttempts?: number;
56
+ };
57
+ export type CompressionPreset = 'balanced' | 'inspection' | 'avatar';
58
+ export type CompressionOptions = {
59
+ enabled?: boolean;
60
+ preset?: CompressionPreset;
61
+ };
62
+ export type UploaderConfig = {
63
+ background?: boolean;
64
+ networkPolicy?: UploadNetworkPolicy;
65
+ retry?: UploadRetryOptions;
66
+ provider?: UploadProvider;
67
+ };
68
+ export type CreateMultipartInput = {
69
+ key: string;
70
+ contentType?: string;
71
+ metadata?: Record<string, string>;
72
+ };
73
+ export type CreateMultipartResult = {
74
+ uploadId: string;
75
+ key: string;
76
+ };
77
+ export type SignPartInput = {
78
+ key: string;
79
+ uploadId: string;
80
+ partNumber: number;
81
+ };
82
+ export type SignedPartResult = {
83
+ url: string;
84
+ method: UploadHttpMethod;
85
+ headers?: Record<string, string>;
86
+ partNumber: number;
87
+ };
88
+ export type CompletedPart = {
89
+ partNumber: number;
90
+ etag: string;
91
+ };
92
+ export type CompleteMultipartInput = {
93
+ key: string;
94
+ uploadId: string;
95
+ parts: CompletedPart[];
96
+ };
97
+ export type CompleteMultipartResult = {
98
+ key: string;
99
+ location?: string;
100
+ etag?: string;
101
+ };
102
+ export type AbortMultipartInput = {
103
+ key: string;
104
+ uploadId: string;
105
+ };
106
+ export type ProviderUploadUrlInput = {
107
+ key: string;
108
+ contentType?: string;
109
+ metadata?: Record<string, string>;
110
+ };
111
+ export type ProviderUploadUrlResult = {
112
+ url: string;
113
+ method?: UploadHttpMethod;
114
+ headers?: Record<string, string>;
115
+ };
116
+ export type UploadProvider = {
117
+ getUploadUrl?: (input: ProviderUploadUrlInput) => Promise<ProviderUploadUrlResult>;
118
+ createMultipartUpload?: (input: CreateMultipartInput) => Promise<CreateMultipartResult>;
119
+ signPart?: (input: SignPartInput) => Promise<SignedPartResult>;
120
+ completeMultipartUpload?: (input: CompleteMultipartInput) => Promise<CompleteMultipartResult>;
121
+ abortMultipartUpload?: (input: AbortMultipartInput) => Promise<void>;
122
+ };
123
+ /** Direct signed-URL upload supported by the current native baseline. */
124
+ export type DirectUploadOptions = {
125
+ file: string;
126
+ uploadUrl: string;
127
+ method?: UploadHttpMethod;
128
+ headers?: Record<string, string>;
129
+ background?: boolean;
130
+ networkPolicy?: UploadNetworkPolicy;
131
+ retry?: UploadRetryOptions;
132
+ /** Reserved for P1-C. Rejected when enabled until native compression ships. */
133
+ compression?: CompressionOptions;
134
+ /** Reserved for P1-E. Rejected when true until multipart ships. */
135
+ multipart?: boolean;
136
+ };
137
+ /** Provider-key upload reserved for the P1-D provider contract. */
138
+ export type ProviderUploadOptions = {
139
+ file: string;
140
+ key: string;
141
+ contentType?: string;
142
+ background?: boolean;
143
+ networkPolicy?: UploadNetworkPolicy;
144
+ retry?: UploadRetryOptions;
145
+ compression?: CompressionOptions;
146
+ multipart?: boolean;
147
+ };
148
+ export type UploadOptions = DirectUploadOptions | ProviderUploadOptions;
149
+ export type UploadTaskHandle = {
150
+ readonly id: string;
151
+ readonly snapshot: UploadTaskSnapshot;
152
+ cancel(): Promise<UploadTaskSnapshot>;
153
+ retry(): Promise<UploadTaskSnapshot>;
154
+ getSnapshot(): Promise<UploadTaskSnapshot | null>;
155
+ onProgress(listener: (progress: UploadProgress) => void): () => void;
156
+ onComplete(listener: (task: UploadTaskSnapshot) => void): () => void;
157
+ onFailed(listener: (error: UploadErrorPayload) => void): () => void;
158
+ onCancelled(listener: () => void): () => void;
159
+ };
160
+ export type Uploader = {
161
+ upload(options: UploadOptions): Promise<UploadTaskHandle>;
162
+ cancel(taskId: string): Promise<UploadTaskSnapshot>;
163
+ retry(taskId: string): Promise<UploadTaskSnapshot>;
164
+ getTask(taskId: string): Promise<UploadTaskSnapshot | null>;
165
+ getAllTasks(): Promise<UploadTaskSnapshot[]>;
166
+ restoreQueue(): Promise<UploadTaskSnapshot[]>;
167
+ subscribe(listener: (event: UploadEvent) => void): () => void;
168
+ };
169
+ export type CreateUploadOptions = {
170
+ localUri: string;
171
+ uploadUrl: string;
172
+ method?: UploadHttpMethod;
173
+ headers?: Record<string, string>;
174
+ background?: boolean;
175
+ networkPolicy?: UploadNetworkPolicy;
176
+ retry?: UploadRetryOptions;
177
+ compression?: CompressionOptions;
178
+ };
179
+ export type UploadEvent = {
180
+ type: 'created';
181
+ task: UploadTaskSnapshot;
182
+ } | {
183
+ type: 'compressing';
184
+ taskId: string;
185
+ task: UploadTaskSnapshot;
186
+ } | {
187
+ type: 'compressed';
188
+ taskId: string;
189
+ task: UploadTaskSnapshot;
190
+ stats: CompressionStats;
191
+ } | {
192
+ type: 'queued';
193
+ taskId: string;
194
+ } | {
195
+ type: 'connecting';
196
+ taskId: string;
197
+ task: UploadTaskSnapshot;
198
+ } | {
199
+ type: 'progress';
200
+ taskId: string;
201
+ progress: UploadProgress;
202
+ } | {
203
+ type: 'verifying';
204
+ taskId: string;
205
+ } | {
206
+ type: 'retrying';
207
+ taskId: string;
208
+ attempt: number;
209
+ delayMs: number;
210
+ error: UploadErrorPayload;
211
+ } | {
212
+ type: 'completed';
213
+ taskId: string;
214
+ task: UploadTaskSnapshot;
215
+ } | {
216
+ type: 'failed';
217
+ taskId: string;
218
+ error: UploadErrorPayload;
219
+ } | {
220
+ type: 'cancelled';
221
+ taskId: string;
222
+ };
223
+ export type UploadosModuleEvents = {
224
+ onUploadEvent: (event: UploadEvent) => void;
225
+ };
226
+ //# sourceMappingURL=Uploados.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Uploados.types.d.ts","sourceRoot":"","sources":["../src/Uploados.types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Uploados.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Uploados.types.js","sourceRoot":"","sources":["../src/Uploados.types.ts"],"names":[],"mappings":"","sourcesContent":["export type UploadState =\n | 'created'\n | 'validating'\n | 'compressing'\n | 'queued'\n | 'connecting'\n | 'uploading'\n | 'verifying'\n | 'retrying'\n | 'completed'\n | 'paused'\n | 'failed'\n | 'cancelled';\n\nexport type UploadHttpMethod = 'PUT' | 'POST';\n\nexport type UploadNetworkPolicy = 'wait' | 'failFast';\n\nexport type UploadErrorPhase =\n | 'validating'\n | 'compressing'\n | 'connecting'\n | 'uploading'\n | 'verifying'\n | 'retrying';\n\nexport type UploadProgress = {\n bytesUploaded: number;\n totalBytes: number;\n percentage: number;\n};\n\nexport type UploadErrorCode =\n | 'FILE_NOT_FOUND'\n | 'FILE_TOO_LARGE'\n | 'NETWORK_ERROR'\n | 'AUTH_ERROR'\n | 'PROVIDER_ERROR'\n | 'MULTIPART_FAILED'\n | 'COMPRESSION_FAILED'\n | 'BACKGROUND_RESTRICTED'\n | 'CANCELLED'\n | 'UNSUPPORTED_PLATFORM'\n | 'UNKNOWN';\n\nexport type UploadErrorPayload = {\n code: UploadErrorCode;\n message: string;\n retryable: boolean;\n taskId: string;\n phase?: UploadErrorPhase;\n httpStatus?: number;\n providerCode?: string;\n providerMessage?: string;\n nativeCause?: string;\n};\n\nexport type UploadFileMetadata = {\n originalUri: string;\n uploadUri: string;\n isStaged: boolean;\n sizeBytes?: number;\n};\n\nexport type CompressionStats = {\n preset: CompressionPreset;\n originalSize: number;\n optimizedSize: number;\n format: 'jpeg';\n};\n\nexport type UploadTaskSnapshot = {\n id: string;\n localUri: string;\n file?: UploadFileMetadata;\n uploadUrl: string;\n method: UploadHttpMethod;\n state: UploadState;\n progress: UploadProgress;\n background: boolean;\n networkPolicy: UploadNetworkPolicy;\n attempt: number;\n maxAttempts: number;\n nextRetryAt?: number;\n createdAt: number;\n updatedAt: number;\n originalSize?: number;\n optimizedSize?: number;\n compression?: CompressionStats;\n error?: UploadErrorPayload;\n};\n\nexport type UploadRetryOptions = {\n maxAttempts?: number;\n};\n\nexport type CompressionPreset = 'balanced' | 'inspection' | 'avatar';\n\nexport type CompressionOptions = {\n enabled?: boolean;\n preset?: CompressionPreset;\n};\n\nexport type UploaderConfig = {\n background?: boolean;\n networkPolicy?: UploadNetworkPolicy;\n retry?: UploadRetryOptions;\n provider?: UploadProvider;\n};\n\nexport type CreateMultipartInput = {\n key: string;\n contentType?: string;\n metadata?: Record<string, string>;\n};\n\nexport type CreateMultipartResult = {\n uploadId: string;\n key: string;\n};\n\nexport type SignPartInput = {\n key: string;\n uploadId: string;\n partNumber: number;\n};\n\nexport type SignedPartResult = {\n url: string;\n method: UploadHttpMethod;\n headers?: Record<string, string>;\n partNumber: number;\n};\n\nexport type CompletedPart = {\n partNumber: number;\n etag: string;\n};\n\nexport type CompleteMultipartInput = {\n key: string;\n uploadId: string;\n parts: CompletedPart[];\n};\n\nexport type CompleteMultipartResult = {\n key: string;\n location?: string;\n etag?: string;\n};\n\nexport type AbortMultipartInput = {\n key: string;\n uploadId: string;\n};\n\nexport type ProviderUploadUrlInput = {\n key: string;\n contentType?: string;\n metadata?: Record<string, string>;\n};\n\nexport type ProviderUploadUrlResult = {\n url: string;\n method?: UploadHttpMethod;\n headers?: Record<string, string>;\n};\n\nexport type UploadProvider = {\n getUploadUrl?: (input: ProviderUploadUrlInput) => Promise<ProviderUploadUrlResult>;\n createMultipartUpload?: (input: CreateMultipartInput) => Promise<CreateMultipartResult>;\n signPart?: (input: SignPartInput) => Promise<SignedPartResult>;\n completeMultipartUpload?: (input: CompleteMultipartInput) => Promise<CompleteMultipartResult>;\n abortMultipartUpload?: (input: AbortMultipartInput) => Promise<void>;\n};\n\n/** Direct signed-URL upload supported by the current native baseline. */\nexport type DirectUploadOptions = {\n file: string;\n uploadUrl: string;\n method?: UploadHttpMethod;\n headers?: Record<string, string>;\n background?: boolean;\n networkPolicy?: UploadNetworkPolicy;\n retry?: UploadRetryOptions;\n /** Reserved for P1-C. Rejected when enabled until native compression ships. */\n compression?: CompressionOptions;\n /** Reserved for P1-E. Rejected when true until multipart ships. */\n multipart?: boolean;\n};\n\n/** Provider-key upload reserved for the P1-D provider contract. */\nexport type ProviderUploadOptions = {\n file: string;\n key: string;\n contentType?: string;\n background?: boolean;\n networkPolicy?: UploadNetworkPolicy;\n retry?: UploadRetryOptions;\n compression?: CompressionOptions;\n multipart?: boolean;\n};\n\nexport type UploadOptions = DirectUploadOptions | ProviderUploadOptions;\n\nexport type UploadTaskHandle = {\n readonly id: string;\n readonly snapshot: UploadTaskSnapshot;\n cancel(): Promise<UploadTaskSnapshot>;\n retry(): Promise<UploadTaskSnapshot>;\n getSnapshot(): Promise<UploadTaskSnapshot | null>;\n onProgress(listener: (progress: UploadProgress) => void): () => void;\n onComplete(listener: (task: UploadTaskSnapshot) => void): () => void;\n onFailed(listener: (error: UploadErrorPayload) => void): () => void;\n onCancelled(listener: () => void): () => void;\n};\n\nexport type Uploader = {\n upload(options: UploadOptions): Promise<UploadTaskHandle>;\n cancel(taskId: string): Promise<UploadTaskSnapshot>;\n retry(taskId: string): Promise<UploadTaskSnapshot>;\n getTask(taskId: string): Promise<UploadTaskSnapshot | null>;\n getAllTasks(): Promise<UploadTaskSnapshot[]>;\n restoreQueue(): Promise<UploadTaskSnapshot[]>;\n subscribe(listener: (event: UploadEvent) => void): () => void;\n};\n\nexport type CreateUploadOptions = {\n localUri: string;\n uploadUrl: string;\n method?: UploadHttpMethod;\n headers?: Record<string, string>;\n background?: boolean;\n networkPolicy?: UploadNetworkPolicy;\n retry?: UploadRetryOptions;\n compression?: CompressionOptions;\n};\n\nexport type UploadEvent =\n | { type: 'created'; task: UploadTaskSnapshot }\n | { type: 'compressing'; taskId: string; task: UploadTaskSnapshot }\n | { type: 'compressed'; taskId: string; task: UploadTaskSnapshot; stats: CompressionStats }\n | { type: 'queued'; taskId: string }\n | { type: 'connecting'; taskId: string; task: UploadTaskSnapshot }\n | { type: 'progress'; taskId: string; progress: UploadProgress }\n | { type: 'verifying'; taskId: string }\n | {\n type: 'retrying';\n taskId: string;\n attempt: number;\n delayMs: number;\n error: UploadErrorPayload;\n }\n | { type: 'completed'; taskId: string; task: UploadTaskSnapshot }\n | { type: 'failed'; taskId: string; error: UploadErrorPayload }\n | { type: 'cancelled'; taskId: string };\n\nexport type UploadosModuleEvents = {\n onUploadEvent: (event: UploadEvent) => void;\n};\n"]}
@@ -0,0 +1,13 @@
1
+ import { NativeModule } from 'expo';
2
+ import type { CreateUploadOptions, UploadosModuleEvents, UploadTaskSnapshot } from './Uploados.types';
3
+ declare class UploadosModule extends NativeModule<UploadosModuleEvents> {
4
+ createUploadAsync(options: CreateUploadOptions): Promise<UploadTaskSnapshot>;
5
+ cancelUploadAsync(taskId: string): Promise<UploadTaskSnapshot>;
6
+ retryUploadAsync(taskId: string): Promise<UploadTaskSnapshot>;
7
+ getTaskAsync(taskId: string): Promise<UploadTaskSnapshot | null>;
8
+ getAllTasksAsync(): Promise<UploadTaskSnapshot[]>;
9
+ restoreQueueAsync(): Promise<UploadTaskSnapshot[]>;
10
+ }
11
+ declare const _default: UploadosModule;
12
+ export default _default;
13
+ //# sourceMappingURL=UploadosModule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UploadosModule.d.ts","sourceRoot":"","sources":["../src/UploadosModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAuB,MAAM,MAAM,CAAC;AAEzD,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,OAAO,cAAe,SAAQ,YAAY,CAAC,oBAAoB,CAAC;IACrE,iBAAiB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAC5E,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAC9D,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAC7D,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAChE,gBAAgB,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IACjD,iBAAiB,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;CACnD;;AAED,wBAA+D"}
@@ -0,0 +1,3 @@
1
+ import { requireNativeModule } from 'expo';
2
+ export default requireNativeModule('Uploados');
3
+ //# sourceMappingURL=UploadosModule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UploadosModule.js","sourceRoot":"","sources":["../src/UploadosModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,mBAAmB,EAAE,MAAM,MAAM,CAAC;AAiBzD,eAAe,mBAAmB,CAAiB,UAAU,CAAC,CAAC","sourcesContent":["import { NativeModule, requireNativeModule } from 'expo';\n\nimport type {\n CreateUploadOptions,\n UploadosModuleEvents,\n UploadTaskSnapshot,\n} from './Uploados.types';\n\ndeclare class UploadosModule extends NativeModule<UploadosModuleEvents> {\n createUploadAsync(options: CreateUploadOptions): Promise<UploadTaskSnapshot>;\n cancelUploadAsync(taskId: string): Promise<UploadTaskSnapshot>;\n retryUploadAsync(taskId: string): Promise<UploadTaskSnapshot>;\n getTaskAsync(taskId: string): Promise<UploadTaskSnapshot | null>;\n getAllTasksAsync(): Promise<UploadTaskSnapshot[]>;\n restoreQueueAsync(): Promise<UploadTaskSnapshot[]>;\n}\n\nexport default requireNativeModule<UploadosModule>('Uploados');\n"]}
@@ -0,0 +1,13 @@
1
+ import { NativeModule } from 'expo';
2
+ import type { CreateUploadOptions, UploadosModuleEvents, UploadTaskSnapshot } from './Uploados.types';
3
+ declare class Uploados extends NativeModule<UploadosModuleEvents> {
4
+ createUploadAsync(_options: CreateUploadOptions): Promise<UploadTaskSnapshot>;
5
+ cancelUploadAsync(_taskId: string): Promise<UploadTaskSnapshot>;
6
+ retryUploadAsync(_taskId: string): Promise<UploadTaskSnapshot>;
7
+ getTaskAsync(_taskId: string): Promise<UploadTaskSnapshot | null>;
8
+ getAllTasksAsync(): Promise<UploadTaskSnapshot[]>;
9
+ restoreQueueAsync(): Promise<UploadTaskSnapshot[]>;
10
+ }
11
+ declare const _default: Uploados;
12
+ export default _default;
13
+ //# sourceMappingURL=UploadosModule.web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UploadosModule.web.d.ts","sourceRoot":"","sources":["../src/UploadosModule.web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqB,MAAM,MAAM,CAAC;AAEvD,OAAO,KAAK,EACV,mBAAmB,EAEnB,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,kBAAkB,CAAC;AAY1B,cAAM,QAAS,SAAQ,YAAY,CAAC,oBAAoB,CAAC;IACjD,iBAAiB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAI7E,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAI/D,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAI9D,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IAIjE,gBAAgB,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAIjD,iBAAiB,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;CAGzD;;AAKD,wBAAmF"}
@@ -0,0 +1,33 @@
1
+ import { NativeModule, registerWebModule } from 'expo';
2
+ function unsupported() {
3
+ const error = {
4
+ code: 'UNSUPPORTED_PLATFORM',
5
+ message: 'Uploados native uploads are not available on web.',
6
+ retryable: false,
7
+ taskId: '',
8
+ };
9
+ throw error;
10
+ }
11
+ class Uploados extends NativeModule {
12
+ async createUploadAsync(_options) {
13
+ unsupported();
14
+ }
15
+ async cancelUploadAsync(_taskId) {
16
+ unsupported();
17
+ }
18
+ async retryUploadAsync(_taskId) {
19
+ unsupported();
20
+ }
21
+ async getTaskAsync(_taskId) {
22
+ unsupported();
23
+ }
24
+ async getAllTasksAsync() {
25
+ unsupported();
26
+ }
27
+ async restoreQueueAsync() {
28
+ unsupported();
29
+ }
30
+ }
31
+ // SDK 52 types only the one-argument form; newer SDKs support it at runtime.
32
+ export default registerWebModule(Uploados);
33
+ //# sourceMappingURL=UploadosModule.web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UploadosModule.web.js","sourceRoot":"","sources":["../src/UploadosModule.web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AASvD,SAAS,WAAW;IAClB,MAAM,KAAK,GAAuB;QAChC,IAAI,EAAE,sBAAsB;QAC5B,OAAO,EAAE,mDAAmD;QAC5D,SAAS,EAAE,KAAK;QAChB,MAAM,EAAE,EAAE;KACX,CAAC;IACF,MAAM,KAAK,CAAC;AACd,CAAC;AAED,MAAM,QAAS,SAAQ,YAAkC;IACvD,KAAK,CAAC,iBAAiB,CAAC,QAA6B;QACnD,WAAW,EAAE,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,OAAe;QACrC,WAAW,EAAE,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,OAAe;QACpC,WAAW,EAAE,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAe;QAChC,WAAW,EAAE,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,WAAW,EAAE,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,iBAAiB;QACrB,WAAW,EAAE,CAAC;IAChB,CAAC;CACF;AAID,6EAA6E;AAC7E,eAAgB,iBAAwD,CAAC,QAAQ,CAAC,CAAC","sourcesContent":["import { NativeModule, registerWebModule } from 'expo';\n\nimport type {\n CreateUploadOptions,\n UploadErrorPayload,\n UploadosModuleEvents,\n UploadTaskSnapshot,\n} from './Uploados.types';\n\nfunction unsupported(): never {\n const error: UploadErrorPayload = {\n code: 'UNSUPPORTED_PLATFORM',\n message: 'Uploados native uploads are not available on web.',\n retryable: false,\n taskId: '',\n };\n throw error;\n}\n\nclass Uploados extends NativeModule<UploadosModuleEvents> {\n async createUploadAsync(_options: CreateUploadOptions): Promise<UploadTaskSnapshot> {\n unsupported();\n }\n\n async cancelUploadAsync(_taskId: string): Promise<UploadTaskSnapshot> {\n unsupported();\n }\n\n async retryUploadAsync(_taskId: string): Promise<UploadTaskSnapshot> {\n unsupported();\n }\n\n async getTaskAsync(_taskId: string): Promise<UploadTaskSnapshot | null> {\n unsupported();\n }\n\n async getAllTasksAsync(): Promise<UploadTaskSnapshot[]> {\n unsupported();\n }\n\n async restoreQueueAsync(): Promise<UploadTaskSnapshot[]> {\n unsupported();\n }\n}\n\ntype RegisterWebModuleCompat = (moduleImplementation: typeof Uploados) => Uploados;\n\n// SDK 52 types only the one-argument form; newer SDKs support it at runtime.\nexport default (registerWebModule as unknown as RegisterWebModuleCompat)(Uploados);\n"]}
@@ -0,0 +1,3 @@
1
+ import type { Uploader, UploaderConfig } from './Uploados.types';
2
+ export declare function createUploader(config?: UploaderConfig): Uploader;
3
+ //# sourceMappingURL=createUploader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createUploader.d.ts","sourceRoot":"","sources":["../src/createUploader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAQV,QAAQ,EACR,cAAc,EACf,MAAM,kBAAkB,CAAC;AAmE1B,wBAAgB,cAAc,CAAC,MAAM,GAAE,cAAmB,GAAG,QAAQ,CAoEpE"}
@@ -0,0 +1,108 @@
1
+ import UploadosModule from './UploadosModule';
2
+ import { normalizeDirectUploadOptions, normalizeProviderUploadOptions, } from './normalizeUploadOptions';
3
+ import { assertProviderDirectUploadSupported, assertUploadProvider, } from './providers/defineUploadProvider';
4
+ function throwMultipartNotReady() {
5
+ const error = {
6
+ code: 'MULTIPART_FAILED',
7
+ message: 'Multipart provider uploads require the P1-E native multipart engine. Use direct signed-URL uploads for now.',
8
+ retryable: false,
9
+ taskId: '',
10
+ };
11
+ throw error;
12
+ }
13
+ function isDirectUploadOptions(options) {
14
+ return 'uploadUrl' in options;
15
+ }
16
+ function isProviderUploadOptions(options) {
17
+ return 'key' in options;
18
+ }
19
+ function getEventTaskId(event) {
20
+ if (event.type === 'created') {
21
+ return event.task.id;
22
+ }
23
+ return event.taskId;
24
+ }
25
+ function createTaskHandle(snapshot, subscribe, module) {
26
+ const taskId = snapshot.id;
27
+ const onTaskEvent = (type, listener) => subscribe((event) => {
28
+ if (getEventTaskId(event) === taskId && event.type === type) {
29
+ listener(event);
30
+ }
31
+ });
32
+ return {
33
+ id: taskId,
34
+ snapshot,
35
+ cancel: () => module.cancelUploadAsync(taskId),
36
+ retry: () => module.retryUploadAsync(taskId),
37
+ getSnapshot: () => module.getTaskAsync(taskId),
38
+ onProgress: (listener) => onTaskEvent('progress', (event) => listener(event.progress)),
39
+ onComplete: (listener) => onTaskEvent('completed', (event) => listener(event.task)),
40
+ onFailed: (listener) => onTaskEvent('failed', (event) => listener(event.error)),
41
+ onCancelled: (listener) => onTaskEvent('cancelled', () => listener()),
42
+ };
43
+ }
44
+ export function createUploader(config = {}) {
45
+ const listeners = new Set();
46
+ let moduleSubscription = null;
47
+ const provider = config.provider;
48
+ const ensureModuleSubscription = () => {
49
+ if (moduleSubscription) {
50
+ return;
51
+ }
52
+ moduleSubscription = UploadosModule.addListener('onUploadEvent', (event) => {
53
+ listeners.forEach((listener) => {
54
+ listener(event);
55
+ });
56
+ });
57
+ };
58
+ const subscribe = (listener) => {
59
+ ensureModuleSubscription();
60
+ listeners.add(listener);
61
+ return () => {
62
+ listeners.delete(listener);
63
+ if (listeners.size === 0 && moduleSubscription) {
64
+ moduleSubscription.remove();
65
+ moduleSubscription = null;
66
+ }
67
+ };
68
+ };
69
+ return {
70
+ async upload(options) {
71
+ if (isProviderUploadOptions(options)) {
72
+ const resolvedProvider = assertUploadProvider(provider);
73
+ if (options.multipart === true) {
74
+ throwMultipartNotReady();
75
+ }
76
+ assertProviderDirectUploadSupported(resolvedProvider);
77
+ const signed = await resolvedProvider.getUploadUrl({
78
+ key: options.key.trim(),
79
+ contentType: options.contentType,
80
+ });
81
+ const normalized = normalizeProviderUploadOptions(config, options, {
82
+ uploadUrl: signed.url,
83
+ method: signed.method,
84
+ headers: signed.headers,
85
+ });
86
+ const snapshot = await UploadosModule.createUploadAsync(normalized);
87
+ return createTaskHandle(snapshot, subscribe, UploadosModule);
88
+ }
89
+ if (!isDirectUploadOptions(options)) {
90
+ throw Object.assign(new Error('Invalid upload options.'), {
91
+ code: 'UNKNOWN',
92
+ retryable: false,
93
+ taskId: '',
94
+ });
95
+ }
96
+ const normalized = normalizeDirectUploadOptions(config, options);
97
+ const snapshot = await UploadosModule.createUploadAsync(normalized);
98
+ return createTaskHandle(snapshot, subscribe, UploadosModule);
99
+ },
100
+ cancel: (taskId) => UploadosModule.cancelUploadAsync(taskId),
101
+ retry: (taskId) => UploadosModule.retryUploadAsync(taskId),
102
+ getTask: (taskId) => UploadosModule.getTaskAsync(taskId),
103
+ getAllTasks: () => UploadosModule.getAllTasksAsync(),
104
+ restoreQueue: () => UploadosModule.restoreQueueAsync(),
105
+ subscribe,
106
+ };
107
+ }
108
+ //# sourceMappingURL=createUploader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createUploader.js","sourceRoot":"","sources":["../src/createUploader.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n DirectUploadOptions,\n ProviderUploadOptions,\n UploadErrorPayload,\n UploadEvent,\n UploadOptions,\n UploadTaskHandle,\n UploadTaskSnapshot,\n Uploader,\n UploaderConfig,\n} from './Uploados.types';\nimport UploadosModule from './UploadosModule';\nimport {\n normalizeDirectUploadOptions,\n normalizeProviderUploadOptions,\n} from './normalizeUploadOptions';\nimport {\n assertProviderDirectUploadSupported,\n assertUploadProvider,\n} from './providers/defineUploadProvider';\n\nfunction throwMultipartNotReady(): never {\n const error: UploadErrorPayload = {\n code: 'MULTIPART_FAILED',\n message:\n 'Multipart provider uploads require the P1-E native multipart engine. Use direct signed-URL uploads for now.',\n retryable: false,\n taskId: '',\n };\n throw error;\n}\n\nfunction isDirectUploadOptions(options: UploadOptions): options is DirectUploadOptions {\n return 'uploadUrl' in options;\n}\n\nfunction isProviderUploadOptions(options: UploadOptions): options is ProviderUploadOptions {\n return 'key' in options;\n}\n\nfunction getEventTaskId(event: UploadEvent): string | undefined {\n if (event.type === 'created') {\n return event.task.id;\n }\n return event.taskId;\n}\n\nfunction createTaskHandle(\n snapshot: UploadTaskSnapshot,\n subscribe: Uploader['subscribe'],\n module: typeof UploadosModule\n): UploadTaskHandle {\n const taskId = snapshot.id;\n\n const onTaskEvent = <T extends UploadEvent['type']>(\n type: T,\n listener: (event: Extract<UploadEvent, { type: T }>) => void\n ): (() => void) =>\n subscribe((event) => {\n if (getEventTaskId(event) === taskId && event.type === type) {\n listener(event as Extract<UploadEvent, { type: T }>);\n }\n });\n\n return {\n id: taskId,\n snapshot,\n cancel: () => module.cancelUploadAsync(taskId),\n retry: () => module.retryUploadAsync(taskId),\n getSnapshot: () => module.getTaskAsync(taskId),\n onProgress: (listener) => onTaskEvent('progress', (event) => listener(event.progress)),\n onComplete: (listener) => onTaskEvent('completed', (event) => listener(event.task)),\n onFailed: (listener) => onTaskEvent('failed', (event) => listener(event.error)),\n onCancelled: (listener) => onTaskEvent('cancelled', () => listener()),\n };\n}\n\nexport function createUploader(config: UploaderConfig = {}): Uploader {\n const listeners = new Set<(event: UploadEvent) => void>();\n let moduleSubscription: { remove: () => void } | null = null;\n const provider = config.provider;\n\n const ensureModuleSubscription = () => {\n if (moduleSubscription) {\n return;\n }\n moduleSubscription = UploadosModule.addListener('onUploadEvent', (event: UploadEvent) => {\n listeners.forEach((listener) => {\n listener(event);\n });\n });\n };\n\n const subscribe = (listener: (event: UploadEvent) => void): (() => void) => {\n ensureModuleSubscription();\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n if (listeners.size === 0 && moduleSubscription) {\n moduleSubscription.remove();\n moduleSubscription = null;\n }\n };\n };\n\n return {\n async upload(options: UploadOptions): Promise<UploadTaskHandle> {\n if (isProviderUploadOptions(options)) {\n const resolvedProvider = assertUploadProvider(provider);\n if (options.multipart === true) {\n throwMultipartNotReady();\n }\n assertProviderDirectUploadSupported(resolvedProvider);\n const signed = await resolvedProvider.getUploadUrl!({\n key: options.key.trim(),\n contentType: options.contentType,\n });\n const normalized = normalizeProviderUploadOptions(config, options, {\n uploadUrl: signed.url,\n method: signed.method,\n headers: signed.headers,\n });\n const snapshot = await UploadosModule.createUploadAsync(normalized);\n return createTaskHandle(snapshot, subscribe, UploadosModule);\n }\n\n if (!isDirectUploadOptions(options)) {\n throw Object.assign(new Error('Invalid upload options.'), {\n code: 'UNKNOWN',\n retryable: false,\n taskId: '',\n });\n }\n\n const normalized = normalizeDirectUploadOptions(config, options);\n const snapshot = await UploadosModule.createUploadAsync(normalized);\n return createTaskHandle(snapshot, subscribe, UploadosModule);\n },\n cancel: (taskId) => UploadosModule.cancelUploadAsync(taskId),\n retry: (taskId) => UploadosModule.retryUploadAsync(taskId),\n getTask: (taskId) => UploadosModule.getTaskAsync(taskId),\n getAllTasks: () => UploadosModule.getAllTasksAsync(),\n restoreQueue: () => UploadosModule.restoreQueueAsync(),\n subscribe,\n };\n}\n"]}
@@ -0,0 +1,5 @@
1
+ export { createUploader } from './createUploader';
2
+ export { defineUploadProvider } from './providers/defineUploadProvider';
3
+ export { createMultipartUploadPlan, DEFAULT_MULTIPART_PART_SIZE } from './providers/multipartPlan';
4
+ export * from './Uploados.types';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,yBAAyB,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AACnG,cAAc,kBAAkB,CAAC"}
package/build/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export { createUploader } from './createUploader';
2
+ export { defineUploadProvider } from './providers/defineUploadProvider';
3
+ export { createMultipartUploadPlan, DEFAULT_MULTIPART_PART_SIZE } from './providers/multipartPlan';
4
+ export * from './Uploados.types';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,yBAAyB,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AACnG,cAAc,kBAAkB,CAAC","sourcesContent":["export { createUploader } from './createUploader';\nexport { defineUploadProvider } from './providers/defineUploadProvider';\nexport { createMultipartUploadPlan, DEFAULT_MULTIPART_PART_SIZE } from './providers/multipartPlan';\nexport * from './Uploados.types';\n"]}
@@ -0,0 +1,9 @@
1
+ import type { CompressionOptions, CreateUploadOptions, DirectUploadOptions, ProviderUploadOptions, UploadHttpMethod, UploaderConfig } from './Uploados.types';
2
+ export declare function assertFutureUploadOptionsSupported(compression?: CompressionOptions, multipart?: boolean): void;
3
+ export declare function normalizeDirectUploadOptions(config: UploaderConfig, input: DirectUploadOptions): CreateUploadOptions;
4
+ export declare function normalizeProviderUploadOptions(config: UploaderConfig, input: ProviderUploadOptions, signed: {
5
+ uploadUrl: string;
6
+ method?: UploadHttpMethod;
7
+ headers?: Record<string, string>;
8
+ }): CreateUploadOptions;
9
+ //# sourceMappingURL=normalizeUploadOptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalizeUploadOptions.d.ts","sourceRoot":"","sources":["../src/normalizeUploadOptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAElB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EAErB,gBAAgB,EAEhB,cAAc,EACf,MAAM,kBAAkB,CAAC;AAoB1B,wBAAgB,kCAAkC,CAChD,WAAW,CAAC,EAAE,kBAAkB,EAChC,SAAS,CAAC,EAAE,OAAO,GAClB,IAAI,CAiBN;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,mBAAmB,GACzB,mBAAmB,CA+BrB;AAED,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,qBAAqB,EAC5B,MAAM,EAAE;IACN,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC,GACA,mBAAmB,CAmCrB"}
@@ -0,0 +1,81 @@
1
+ const DEFAULT_MAX_ATTEMPTS = 3;
2
+ const DEFAULT_METHOD = 'PUT';
3
+ const DEFAULT_NETWORK_POLICY = 'wait';
4
+ const DEFAULT_BACKGROUND = false;
5
+ function throwValidationError(message, code = 'UNKNOWN') {
6
+ const error = {
7
+ code,
8
+ message,
9
+ retryable: false,
10
+ taskId: '',
11
+ };
12
+ throw error;
13
+ }
14
+ export function assertFutureUploadOptionsSupported(compression, multipart) {
15
+ if (compression?.enabled === true && compression.preset) {
16
+ const validPresets = ['balanced', 'inspection', 'avatar'];
17
+ if (!validPresets.includes(compression.preset)) {
18
+ throwValidationError(`Unsupported compression preset "${compression.preset}". Use balanced, inspection, or avatar.`, 'COMPRESSION_FAILED');
19
+ }
20
+ }
21
+ if (multipart === true) {
22
+ throwValidationError('Multipart uploads are not available yet. Use direct signed-URL uploads until P1-E ships.', 'MULTIPART_FAILED');
23
+ }
24
+ }
25
+ export function normalizeDirectUploadOptions(config, input) {
26
+ assertFutureUploadOptionsSupported(input.compression, input.multipart);
27
+ const localUri = input.file.trim();
28
+ const uploadUrl = input.uploadUrl.trim();
29
+ if (!localUri) {
30
+ throwValidationError('Upload file URI is required.', 'FILE_NOT_FOUND');
31
+ }
32
+ if (!uploadUrl) {
33
+ throwValidationError('Upload URL is required.', 'PROVIDER_ERROR');
34
+ }
35
+ const background = input.background ?? config.background ?? DEFAULT_BACKGROUND;
36
+ const networkPolicy = background
37
+ ? 'wait'
38
+ : (input.networkPolicy ?? config.networkPolicy ?? DEFAULT_NETWORK_POLICY);
39
+ const maxAttempts = Math.max(1, input.retry?.maxAttempts ?? config.retry?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS);
40
+ return {
41
+ localUri,
42
+ uploadUrl,
43
+ method: input.method ?? DEFAULT_METHOD,
44
+ headers: input.headers ?? {},
45
+ background,
46
+ networkPolicy,
47
+ retry: { maxAttempts },
48
+ compression: input.compression,
49
+ };
50
+ }
51
+ export function normalizeProviderUploadOptions(config, input, signed) {
52
+ assertFutureUploadOptionsSupported(input.compression, input.multipart);
53
+ const localUri = input.file.trim();
54
+ const uploadUrl = signed.uploadUrl.trim();
55
+ const key = input.key.trim();
56
+ if (!localUri) {
57
+ throwValidationError('Upload file URI is required.', 'FILE_NOT_FOUND');
58
+ }
59
+ if (!key) {
60
+ throwValidationError('Upload key is required.', 'PROVIDER_ERROR');
61
+ }
62
+ if (!uploadUrl) {
63
+ throwValidationError('Provider did not return an upload URL.', 'PROVIDER_ERROR');
64
+ }
65
+ const background = input.background ?? config.background ?? DEFAULT_BACKGROUND;
66
+ const networkPolicy = background
67
+ ? 'wait'
68
+ : (input.networkPolicy ?? config.networkPolicy ?? DEFAULT_NETWORK_POLICY);
69
+ const maxAttempts = Math.max(1, input.retry?.maxAttempts ?? config.retry?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS);
70
+ return {
71
+ localUri,
72
+ uploadUrl,
73
+ method: signed.method ?? DEFAULT_METHOD,
74
+ headers: signed.headers ?? {},
75
+ background,
76
+ networkPolicy,
77
+ retry: { maxAttempts },
78
+ compression: input.compression,
79
+ };
80
+ }
81
+ //# sourceMappingURL=normalizeUploadOptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalizeUploadOptions.js","sourceRoot":"","sources":["../src/normalizeUploadOptions.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n CompressionOptions,\n CompressionPreset,\n CreateUploadOptions,\n DirectUploadOptions,\n ProviderUploadOptions,\n UploadErrorPayload,\n UploadHttpMethod,\n UploadNetworkPolicy,\n UploaderConfig,\n} from './Uploados.types';\n\nconst DEFAULT_MAX_ATTEMPTS = 3;\nconst DEFAULT_METHOD: UploadHttpMethod = 'PUT';\nconst DEFAULT_NETWORK_POLICY: UploadNetworkPolicy = 'wait';\nconst DEFAULT_BACKGROUND = false;\n\nfunction throwValidationError(\n message: string,\n code: UploadErrorPayload['code'] = 'UNKNOWN'\n): never {\n const error: UploadErrorPayload = {\n code,\n message,\n retryable: false,\n taskId: '',\n };\n throw error;\n}\n\nexport function assertFutureUploadOptionsSupported(\n compression?: CompressionOptions,\n multipart?: boolean\n): void {\n if (compression?.enabled === true && compression.preset) {\n const validPresets: CompressionPreset[] = ['balanced', 'inspection', 'avatar'];\n if (!validPresets.includes(compression.preset)) {\n throwValidationError(\n `Unsupported compression preset \"${compression.preset}\". Use balanced, inspection, or avatar.`,\n 'COMPRESSION_FAILED'\n );\n }\n }\n\n if (multipart === true) {\n throwValidationError(\n 'Multipart uploads are not available yet. Use direct signed-URL uploads until P1-E ships.',\n 'MULTIPART_FAILED'\n );\n }\n}\n\nexport function normalizeDirectUploadOptions(\n config: UploaderConfig,\n input: DirectUploadOptions\n): CreateUploadOptions {\n assertFutureUploadOptionsSupported(input.compression, input.multipart);\n\n const localUri = input.file.trim();\n const uploadUrl = input.uploadUrl.trim();\n if (!localUri) {\n throwValidationError('Upload file URI is required.', 'FILE_NOT_FOUND');\n }\n if (!uploadUrl) {\n throwValidationError('Upload URL is required.', 'PROVIDER_ERROR');\n }\n\n const background = input.background ?? config.background ?? DEFAULT_BACKGROUND;\n const networkPolicy = background\n ? 'wait'\n : (input.networkPolicy ?? config.networkPolicy ?? DEFAULT_NETWORK_POLICY);\n const maxAttempts = Math.max(\n 1,\n input.retry?.maxAttempts ?? config.retry?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS\n );\n\n return {\n localUri,\n uploadUrl,\n method: input.method ?? DEFAULT_METHOD,\n headers: input.headers ?? {},\n background,\n networkPolicy,\n retry: { maxAttempts },\n compression: input.compression,\n };\n}\n\nexport function normalizeProviderUploadOptions(\n config: UploaderConfig,\n input: ProviderUploadOptions,\n signed: {\n uploadUrl: string;\n method?: UploadHttpMethod;\n headers?: Record<string, string>;\n }\n): CreateUploadOptions {\n assertFutureUploadOptionsSupported(input.compression, input.multipart);\n\n const localUri = input.file.trim();\n const uploadUrl = signed.uploadUrl.trim();\n const key = input.key.trim();\n if (!localUri) {\n throwValidationError('Upload file URI is required.', 'FILE_NOT_FOUND');\n }\n if (!key) {\n throwValidationError('Upload key is required.', 'PROVIDER_ERROR');\n }\n if (!uploadUrl) {\n throwValidationError('Provider did not return an upload URL.', 'PROVIDER_ERROR');\n }\n\n const background = input.background ?? config.background ?? DEFAULT_BACKGROUND;\n const networkPolicy = background\n ? 'wait'\n : (input.networkPolicy ?? config.networkPolicy ?? DEFAULT_NETWORK_POLICY);\n const maxAttempts = Math.max(\n 1,\n input.retry?.maxAttempts ?? config.retry?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS\n );\n\n return {\n localUri,\n uploadUrl,\n method: signed.method ?? DEFAULT_METHOD,\n headers: signed.headers ?? {},\n background,\n networkPolicy,\n retry: { maxAttempts },\n compression: input.compression,\n };\n}\n"]}