@webiny/sdk 6.3.0 → 6.4.0-beta.1
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.
- package/BaseError.js +8 -7
- package/BaseError.js.map +1 -1
- package/CmsSdk.js +34 -33
- package/CmsSdk.js.map +1 -1
- package/FileManagerSdk.js +50 -49
- package/FileManagerSdk.js.map +1 -1
- package/LanguagesSdk.js +10 -9
- package/LanguagesSdk.js.map +1 -1
- package/Result.js +40 -134
- package/Result.js.map +1 -1
- package/TasksSdk.js +26 -25
- package/TasksSdk.js.map +1 -1
- package/TenantManagerSdk.js +26 -25
- package/TenantManagerSdk.js.map +1 -1
- package/WebhooksSdk.d.ts +35 -0
- package/WebhooksSdk.js +49 -0
- package/WebhooksSdk.js.map +1 -0
- package/Webiny.d.ts +2 -0
- package/Webiny.js +29 -26
- package/Webiny.js.map +1 -1
- package/errors.js +31 -48
- package/errors.js.map +1 -1
- package/index.d.ts +11 -0
- package/index.js +2 -21
- package/methods/cms/cmsTypes.js +0 -3
- package/methods/cms/createEntry.js +14 -39
- package/methods/cms/createEntry.js.map +1 -1
- package/methods/cms/deleteEntryRevision.js +12 -30
- package/methods/cms/deleteEntryRevision.js.map +1 -1
- package/methods/cms/getEntry.js +15 -36
- package/methods/cms/getEntry.js.map +1 -1
- package/methods/cms/listEntries.js +22 -51
- package/methods/cms/listEntries.js.map +1 -1
- package/methods/cms/publishEntryRevision.js +14 -33
- package/methods/cms/publishEntryRevision.js.map +1 -1
- package/methods/cms/schemas.js +39 -35
- package/methods/cms/schemas.js.map +1 -1
- package/methods/cms/unpublishEntryRevision.js +14 -33
- package/methods/cms/unpublishEntryRevision.js.map +1 -1
- package/methods/cms/updateEntryRevision.js +15 -42
- package/methods/cms/updateEntryRevision.js.map +1 -1
- package/methods/executeGraphQL.js +38 -41
- package/methods/executeGraphQL.js.map +1 -1
- package/methods/fileManager/buildFieldsSelection.js +25 -67
- package/methods/fileManager/buildFieldsSelection.js.map +1 -1
- package/methods/fileManager/completeMultiPartUpload.js +12 -29
- package/methods/fileManager/completeMultiPartUpload.js.map +1 -1
- package/methods/fileManager/createFile.js +61 -125
- package/methods/fileManager/createFile.js.map +1 -1
- package/methods/fileManager/createFiles.js +41 -76
- package/methods/fileManager/createFiles.js.map +1 -1
- package/methods/fileManager/createMultiPartUpload.js +12 -29
- package/methods/fileManager/createMultiPartUpload.js.map +1 -1
- package/methods/fileManager/deleteFile.js +11 -26
- package/methods/fileManager/deleteFile.js.map +1 -1
- package/methods/fileManager/fileManagerTypes.js +19 -18
- package/methods/fileManager/fileManagerTypes.js.map +1 -1
- package/methods/fileManager/getFile.js +15 -30
- package/methods/fileManager/getFile.js.map +1 -1
- package/methods/fileManager/getPresignedPostPayload.js +17 -40
- package/methods/fileManager/getPresignedPostPayload.js.map +1 -1
- package/methods/fileManager/getPresignedPostPayloads.js +17 -32
- package/methods/fileManager/getPresignedPostPayloads.js.map +1 -1
- package/methods/fileManager/listFiles.js +22 -45
- package/methods/fileManager/listFiles.js.map +1 -1
- package/methods/fileManager/listTags.js +11 -25
- package/methods/fileManager/listTags.js.map +1 -1
- package/methods/fileManager/schemas.js +15 -14
- package/methods/fileManager/schemas.js.map +1 -1
- package/methods/fileManager/updateFile.js +12 -29
- package/methods/fileManager/updateFile.js.map +1 -1
- package/methods/fileManager/utils/fileTypeDetection.js +10 -12
- package/methods/fileManager/utils/fileTypeDetection.js.map +1 -1
- package/methods/fileManager/utils/uploadLargeFile.js +86 -165
- package/methods/fileManager/utils/uploadLargeFile.js.map +1 -1
- package/methods/fileManager/utils/uploadToS3.js +41 -94
- package/methods/fileManager/utils/uploadToS3.js.map +1 -1
- package/methods/languages/listLanguages.js +8 -11
- package/methods/languages/listLanguages.js.map +1 -1
- package/methods/tasks/abortTask.js +11 -17
- package/methods/tasks/abortTask.js.map +1 -1
- package/methods/tasks/listDefinitions.js +8 -11
- package/methods/tasks/listDefinitions.js.map +1 -1
- package/methods/tasks/listLogs.js +10 -15
- package/methods/tasks/listLogs.js.map +1 -1
- package/methods/tasks/listTasks.js +8 -11
- package/methods/tasks/listTasks.js.map +1 -1
- package/methods/tasks/schemas.js +11 -10
- package/methods/tasks/schemas.js.map +1 -1
- package/methods/tasks/taskTypes.js +0 -3
- package/methods/tasks/triggerTask.js +11 -17
- package/methods/tasks/triggerTask.js.map +1 -1
- package/methods/tenantManager/createTenant.js +10 -24
- package/methods/tenantManager/createTenant.js.map +1 -1
- package/methods/tenantManager/disableTenant.js +10 -24
- package/methods/tenantManager/disableTenant.js.map +1 -1
- package/methods/tenantManager/enableTenant.js +10 -24
- package/methods/tenantManager/enableTenant.js.map +1 -1
- package/methods/tenantManager/getCurrentTenant.js +8 -18
- package/methods/tenantManager/getCurrentTenant.js.map +1 -1
- package/methods/tenantManager/installTenant.js +10 -24
- package/methods/tenantManager/installTenant.js.map +1 -1
- package/methods/tenantManager/schemas.js +13 -12
- package/methods/tenantManager/schemas.js.map +1 -1
- package/methods/tenantManager/tenantManagerTypes.js +0 -3
- package/methods/webhooks/createWebhook.d.ts +12 -0
- package/methods/webhooks/createWebhook.js +41 -0
- package/methods/webhooks/createWebhook.js.map +1 -0
- package/methods/webhooks/deleteWebhook.d.ts +6 -0
- package/methods/webhooks/deleteWebhook.js +30 -0
- package/methods/webhooks/deleteWebhook.js.map +1 -0
- package/methods/webhooks/getWebhook.d.ts +7 -0
- package/methods/webhooks/getWebhook.js +41 -0
- package/methods/webhooks/getWebhook.js.map +1 -0
- package/methods/webhooks/getWebhookDelivery.d.ts +7 -0
- package/methods/webhooks/getWebhookDelivery.js +43 -0
- package/methods/webhooks/getWebhookDelivery.js.map +1 -0
- package/methods/webhooks/listAvailableWebhookEvents.d.ts +7 -0
- package/methods/webhooks/listAvailableWebhookEvents.js +31 -0
- package/methods/webhooks/listAvailableWebhookEvents.js.map +1 -0
- package/methods/webhooks/listWebhookDeliveries.d.ts +17 -0
- package/methods/webhooks/listWebhookDeliveries.js +53 -0
- package/methods/webhooks/listWebhookDeliveries.js.map +1 -0
- package/methods/webhooks/listWebhooks.d.ts +19 -0
- package/methods/webhooks/listWebhooks.js +51 -0
- package/methods/webhooks/listWebhooks.js.map +1 -0
- package/methods/webhooks/resendWebhookDelivery.d.ts +6 -0
- package/methods/webhooks/resendWebhookDelivery.js +30 -0
- package/methods/webhooks/resendWebhookDelivery.js.map +1 -0
- package/methods/webhooks/schemas.d.ts +46 -0
- package/methods/webhooks/schemas.js +50 -0
- package/methods/webhooks/schemas.js.map +1 -0
- package/methods/webhooks/triggerWebhook.d.ts +8 -0
- package/methods/webhooks/triggerWebhook.js +44 -0
- package/methods/webhooks/triggerWebhook.js.map +1 -0
- package/methods/webhooks/updateWebhook.d.ts +13 -0
- package/methods/webhooks/updateWebhook.js +42 -0
- package/methods/webhooks/updateWebhook.js.map +1 -0
- package/methods/webhooks/webhooksTypes.d.ts +32 -0
- package/methods/webhooks/webhooksTypes.js +0 -0
- package/package.json +5 -5
- package/types.js +0 -3
- package/utils/createMethod.js +6 -24
- package/utils/createMethod.js.map +1 -1
- package/utils/platform.js +3 -2
- package/utils/platform.js.map +1 -1
- package/utils/transformFieldErrors.js +14 -33
- package/utils/transformFieldErrors.js.map +1 -1
- package/utils/validateParams.js +13 -16
- package/utils/validateParams.js.map +1 -1
- package/index.js.map +0 -1
- package/methods/cms/cmsTypes.js.map +0 -1
- package/methods/tasks/taskTypes.js.map +0 -1
- package/methods/tenantManager/tenantManagerTypes.js.map +0 -1
- package/types.js.map +0 -1
|
@@ -1,183 +1,104 @@
|
|
|
1
1
|
import { isBrowser } from "../../../utils/platform.js";
|
|
2
|
-
import { isBuffer, isFile
|
|
3
|
-
import
|
|
4
|
-
import
|
|
2
|
+
import { getFileSize, isBuffer, isFile } from "./fileTypeDetection.js";
|
|
3
|
+
import p_map from "p-map";
|
|
4
|
+
import p_retry from "p-retry";
|
|
5
5
|
import { createMultiPartUpload } from "../createMultiPartUpload.js";
|
|
6
6
|
import { completeMultiPartUpload } from "../completeMultiPartUpload.js";
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
* @returns Promise that resolves with the uploaded file metadata
|
|
16
|
-
*/
|
|
17
|
-
export async function uploadLargeFile(file, fileData, config, fetchFn, options = {}) {
|
|
18
|
-
const {
|
|
19
|
-
onProgress,
|
|
20
|
-
signal,
|
|
21
|
-
chunkSize = 50,
|
|
22
|
-
parallelUploads = 5
|
|
23
|
-
} = options;
|
|
24
|
-
const fileSize = getFileSize(file);
|
|
25
|
-
const chunkSizeBytes = Math.max(chunkSize * 1024 * 1024, 5 * 1024 * 1024);
|
|
26
|
-
const numberOfParts = Math.ceil(fileSize / chunkSizeBytes);
|
|
27
|
-
|
|
28
|
-
// 1. Create multi-part upload.
|
|
29
|
-
const createResult = await createMultiPartUpload(config, fetchFn, {
|
|
30
|
-
data: fileData,
|
|
31
|
-
numberOfParts
|
|
32
|
-
});
|
|
33
|
-
if (createResult.isFail()) {
|
|
34
|
-
throw createResult.error;
|
|
35
|
-
}
|
|
36
|
-
const uploadData = createResult.value;
|
|
37
|
-
const progressTracker = new Map();
|
|
38
|
-
|
|
39
|
-
// Helper to track progress.
|
|
40
|
-
const updateProgress = () => {
|
|
41
|
-
if (!onProgress) {
|
|
42
|
-
return;
|
|
43
|
-
}
|
|
44
|
-
const uploaded = Array.from(progressTracker.values()).reduce((sum, value) => sum + value, 0);
|
|
45
|
-
const uploadedSize = Math.min(uploaded, fileSize);
|
|
46
|
-
onProgress({
|
|
47
|
-
sent: uploadedSize,
|
|
48
|
-
total: fileSize,
|
|
49
|
-
percentage: Math.round(uploadedSize / fileSize * 100)
|
|
7
|
+
async function uploadLargeFile(file, fileData, config, fetchFn, options = {}) {
|
|
8
|
+
const { onProgress, signal, chunkSize = 50, parallelUploads = 5 } = options;
|
|
9
|
+
const fileSize = getFileSize(file);
|
|
10
|
+
const chunkSizeBytes = Math.max(1024 * chunkSize * 1024, 5242880);
|
|
11
|
+
const numberOfParts = Math.ceil(fileSize / chunkSizeBytes);
|
|
12
|
+
const createResult = await createMultiPartUpload(config, fetchFn, {
|
|
13
|
+
data: fileData,
|
|
14
|
+
numberOfParts
|
|
50
15
|
});
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
16
|
+
if (createResult.isFail()) throw createResult.error;
|
|
17
|
+
const uploadData = createResult.value;
|
|
18
|
+
const progressTracker = new Map();
|
|
19
|
+
const updateProgress = ()=>{
|
|
20
|
+
if (!onProgress) return;
|
|
21
|
+
const uploaded = Array.from(progressTracker.values()).reduce((sum, value)=>sum + value, 0);
|
|
22
|
+
const uploadedSize = Math.min(uploaded, fileSize);
|
|
23
|
+
onProgress({
|
|
24
|
+
sent: uploadedSize,
|
|
25
|
+
total: fileSize,
|
|
26
|
+
percentage: Math.round(uploadedSize / fileSize * 100)
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
await p_map(uploadData.parts, async (part)=>{
|
|
30
|
+
if (signal?.aborted) throw new Error("Upload aborted");
|
|
31
|
+
await p_retry(async ()=>{
|
|
32
|
+
const chunk = await getFileChunk(file, part.partNumber, chunkSizeBytes, fileData.type);
|
|
33
|
+
await uploadPart(part.url, chunk, (loaded)=>{
|
|
34
|
+
progressTracker.set(part.partNumber, loaded);
|
|
35
|
+
updateProgress();
|
|
36
|
+
}, signal);
|
|
37
|
+
}, {
|
|
38
|
+
retries: 5,
|
|
39
|
+
minTimeout: 1500,
|
|
40
|
+
maxTimeout: 30000,
|
|
41
|
+
maxRetryTime: 300000
|
|
42
|
+
});
|
|
67
43
|
}, {
|
|
68
|
-
|
|
69
|
-
minTimeout: 1500,
|
|
70
|
-
maxTimeout: 30000,
|
|
71
|
-
maxRetryTime: 300000
|
|
44
|
+
concurrency: Math.min(numberOfParts, parallelUploads)
|
|
72
45
|
});
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
fileKey: uploadData.file.key,
|
|
80
|
-
uploadId: uploadData.uploadId
|
|
81
|
-
});
|
|
82
|
-
if (completeResult.isFail()) {
|
|
83
|
-
throw completeResult.error;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
// Return the file metadata.
|
|
87
|
-
return uploadData.file;
|
|
46
|
+
const completeResult = await completeMultiPartUpload(config, fetchFn, {
|
|
47
|
+
fileKey: uploadData.file.key,
|
|
48
|
+
uploadId: uploadData.uploadId
|
|
49
|
+
});
|
|
50
|
+
if (completeResult.isFail()) throw completeResult.error;
|
|
51
|
+
return uploadData.file;
|
|
88
52
|
}
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Gets a chunk of the file for a specific part number.
|
|
92
|
-
*/
|
|
93
53
|
async function getFileChunk(file, partNumber, chunkSize, fileType) {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
return file.slice(start, end);
|
|
98
|
-
|
|
99
|
-
if (isFile(file) || file instanceof Blob) {
|
|
100
|
-
return file.slice(start, end, fileType);
|
|
101
|
-
}
|
|
102
|
-
throw new Error("Unsupported file type");
|
|
54
|
+
const start = (partNumber - 1) * chunkSize;
|
|
55
|
+
const end = Math.min(start + chunkSize, getFileSize(file));
|
|
56
|
+
if (isBuffer(file)) return file.slice(start, end);
|
|
57
|
+
if (isFile(file) || file instanceof Blob) return file.slice(start, end, fileType);
|
|
58
|
+
throw new Error("Unsupported file type");
|
|
103
59
|
}
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* Uploads a single part to S3.
|
|
107
|
-
*/
|
|
108
60
|
async function uploadPart(url, chunk, onProgress, signal) {
|
|
109
|
-
|
|
110
|
-
return
|
|
111
|
-
}
|
|
112
|
-
return uploadPartWithFetch(url, chunk, signal);
|
|
61
|
+
if (isBrowser && "u" > typeof XMLHttpRequest) return uploadPartWithXHR(url, chunk, onProgress, signal);
|
|
62
|
+
return uploadPartWithFetch(url, chunk, signal);
|
|
113
63
|
}
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* Upload part using XMLHttpRequest (browser only, supports progress).
|
|
117
|
-
*/
|
|
118
64
|
function uploadPartWithXHR(url, chunk, onProgress, signal) {
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
reject(new Error("Part upload failed due to network error"));
|
|
144
|
-
});
|
|
145
|
-
xhr.addEventListener("abort", () => {
|
|
146
|
-
reject(new Error("Part upload aborted"));
|
|
147
|
-
});
|
|
148
|
-
xhr.addEventListener("timeout", () => {
|
|
149
|
-
reject(new Error("Part upload timed out"));
|
|
65
|
+
return new Promise((resolve, reject)=>{
|
|
66
|
+
const xhr = new XMLHttpRequest();
|
|
67
|
+
if (signal) signal.addEventListener("abort", ()=>xhr.abort());
|
|
68
|
+
xhr.upload.addEventListener("progress", (event)=>{
|
|
69
|
+
if (event.lengthComputable) onProgress(event.loaded);
|
|
70
|
+
});
|
|
71
|
+
xhr.addEventListener("readystatechange", ()=>{
|
|
72
|
+
if (4 === xhr.readyState && 200 === xhr.status) resolve();
|
|
73
|
+
});
|
|
74
|
+
xhr.addEventListener("error", ()=>{
|
|
75
|
+
reject(new Error("Part upload failed due to network error"));
|
|
76
|
+
});
|
|
77
|
+
xhr.addEventListener("abort", ()=>{
|
|
78
|
+
reject(new Error("Part upload aborted"));
|
|
79
|
+
});
|
|
80
|
+
xhr.addEventListener("timeout", ()=>{
|
|
81
|
+
reject(new Error("Part upload timed out"));
|
|
82
|
+
});
|
|
83
|
+
let body;
|
|
84
|
+
body = isBuffer(chunk) ? new Blob([
|
|
85
|
+
chunk
|
|
86
|
+
]) : chunk;
|
|
87
|
+
xhr.open("PUT", url);
|
|
88
|
+
xhr.send(body);
|
|
150
89
|
});
|
|
151
|
-
|
|
152
|
-
// Convert Buffer to Blob if needed.
|
|
153
|
-
let body;
|
|
154
|
-
if (isBuffer(chunk)) {
|
|
155
|
-
// Buffer is a Uint8Array, so we can pass it to Blob.
|
|
156
|
-
// Use 'as any' to work around TypeScript's strict type checking for ArrayBufferLike.
|
|
157
|
-
body = new Blob([chunk]);
|
|
158
|
-
} else {
|
|
159
|
-
body = chunk;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
// Send request.
|
|
163
|
-
xhr.open("PUT", url);
|
|
164
|
-
xhr.send(body);
|
|
165
|
-
});
|
|
166
90
|
}
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* Upload part using fetch (Node.js and browser).
|
|
170
|
-
*/
|
|
171
91
|
async function uploadPartWithFetch(url, chunk, signal) {
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
92
|
+
const response = await fetch(url, {
|
|
93
|
+
method: "PUT",
|
|
94
|
+
body: chunk,
|
|
95
|
+
signal
|
|
96
|
+
});
|
|
97
|
+
if (200 !== response.status) {
|
|
98
|
+
const text = await response.text();
|
|
99
|
+
throw new Error(`Part upload failed with status ${response.status}: ${text}`);
|
|
100
|
+
}
|
|
181
101
|
}
|
|
102
|
+
export { uploadLargeFile };
|
|
182
103
|
|
|
183
104
|
//# sourceMappingURL=uploadLargeFile.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["isBrowser","isBuffer","isFile","getFileSize","pMap","pRetry","createMultiPartUpload","completeMultiPartUpload","uploadLargeFile","file","fileData","config","fetchFn","options","onProgress","signal","chunkSize","parallelUploads","fileSize","chunkSizeBytes","Math","max","numberOfParts","ceil","createResult","data","isFail","error","uploadData","value","progressTracker","Map","updateProgress","uploaded","Array","from","values","reduce","sum","uploadedSize","min","sent","total","percentage","round","parts","part","aborted","Error","chunk","getFileChunk","partNumber","type","uploadPart","url","loaded","set","retries","minTimeout","maxTimeout","maxRetryTime","concurrency","completeResult","fileKey","key","uploadId","fileType","start","end","slice","Blob","XMLHttpRequest","uploadPartWithXHR","uploadPartWithFetch","Promise","resolve","reject","xhr","addEventListener","abort","upload","event","lengthComputable","readyState","status","body","open","send","response","fetch","method","text"],"sources":["uploadLargeFile.ts"],"sourcesContent":["import type { WebinyConfig } from \"../../../types.js\";\nimport type { FmFile, UploadProgress } from \"../fileManagerTypes.js\";\nimport { isBrowser } from \"../../../utils/platform.js\";\nimport { isBuffer, isFile, getFileSize } from \"./fileTypeDetection.js\";\nimport pMap from \"p-map\";\nimport pRetry from \"p-retry\";\nimport { createMultiPartUpload } from \"../createMultiPartUpload.js\";\nimport { completeMultiPartUpload } from \"../completeMultiPartUpload.js\";\n\nexport interface UploadLargeFileOptions {\n onProgress?: (progress: UploadProgress) => void;\n signal?: AbortSignal;\n chunkSize?: number;\n parallelUploads?: number;\n}\n\n/**\n * Uploads a large file to S3 using multi-part upload.\n *\n * @param file - The file to upload (Buffer, Blob, or File)\n * @param fileData - File metadata\n * @param config - SDK configuration\n * @param fetchFn - Fetch function to use for HTTP requests\n * @param options - Upload options\n * @returns Promise that resolves with the uploaded file metadata\n */\nexport async function uploadLargeFile(\n file: Buffer | Blob | File,\n fileData: { name: string; type: string; size: number; key?: string; keyPrefix?: string },\n config: WebinyConfig,\n fetchFn: typeof fetch,\n options: UploadLargeFileOptions = {}\n): Promise<FmFile> {\n const { onProgress, signal, chunkSize = 50, parallelUploads = 5 } = options;\n\n const fileSize = getFileSize(file);\n const chunkSizeBytes = Math.max(chunkSize * 1024 * 1024, 5 * 1024 * 1024);\n const numberOfParts = Math.ceil(fileSize / chunkSizeBytes);\n\n // 1. Create multi-part upload.\n const createResult = await createMultiPartUpload(config, fetchFn, {\n data: fileData,\n numberOfParts\n });\n\n if (createResult.isFail()) {\n throw createResult.error;\n }\n\n const uploadData = createResult.value;\n const progressTracker = new Map<number, number>();\n\n // Helper to track progress.\n const updateProgress = () => {\n if (!onProgress) {\n return;\n }\n\n const uploaded = Array.from(progressTracker.values()).reduce(\n (sum, value) => sum + value,\n 0\n );\n const uploadedSize = Math.min(uploaded, fileSize);\n\n onProgress({\n sent: uploadedSize,\n total: fileSize,\n percentage: Math.round((uploadedSize / fileSize) * 100)\n });\n };\n\n // 2. Upload parts in parallel.\n await pMap(\n uploadData.parts,\n async (part: { partNumber: number; url: string }) => {\n // Check abort signal.\n if (signal?.aborted) {\n throw new Error(\"Upload aborted\");\n }\n\n // Upload part with retry.\n await pRetry(\n async () => {\n const chunk = await getFileChunk(\n file,\n part.partNumber,\n chunkSizeBytes,\n fileData.type\n );\n\n await uploadPart(\n part.url,\n chunk,\n loaded => {\n progressTracker.set(part.partNumber, loaded);\n updateProgress();\n },\n signal\n );\n },\n {\n retries: 5,\n minTimeout: 1500,\n maxTimeout: 30000,\n maxRetryTime: 300000\n }\n );\n },\n { concurrency: Math.min(numberOfParts, parallelUploads) }\n );\n\n // 3. Complete multi-part upload.\n const completeResult = await completeMultiPartUpload(config, fetchFn, {\n fileKey: uploadData.file.key,\n uploadId: uploadData.uploadId\n });\n\n if (completeResult.isFail()) {\n throw completeResult.error;\n }\n\n // Return the file metadata.\n return uploadData.file as FmFile;\n}\n\n/**\n * Gets a chunk of the file for a specific part number.\n */\nasync function getFileChunk(\n file: Buffer | Blob | File,\n partNumber: number,\n chunkSize: number,\n fileType: string\n): Promise<Blob | Buffer> {\n const start = (partNumber - 1) * chunkSize;\n const end = Math.min(start + chunkSize, getFileSize(file));\n\n if (isBuffer(file)) {\n return file.slice(start, end);\n }\n\n if (isFile(file) || file instanceof Blob) {\n return file.slice(start, end, fileType);\n }\n\n throw new Error(\"Unsupported file type\");\n}\n\n/**\n * Uploads a single part to S3.\n */\nasync function uploadPart(\n url: string,\n chunk: Blob | Buffer,\n onProgress: (loaded: number) => void,\n signal?: AbortSignal\n): Promise<void> {\n if (isBrowser && typeof XMLHttpRequest !== \"undefined\") {\n return uploadPartWithXHR(url, chunk, onProgress, signal);\n }\n\n return uploadPartWithFetch(url, chunk, signal);\n}\n\n/**\n * Upload part using XMLHttpRequest (browser only, supports progress).\n */\nfunction uploadPartWithXHR(\n url: string,\n chunk: Blob | Buffer,\n onProgress: (loaded: number) => void,\n signal?: AbortSignal\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n\n // Handle abort signal.\n if (signal) {\n signal.addEventListener(\"abort\", () => xhr.abort());\n }\n\n // Track upload progress.\n xhr.upload.addEventListener(\"progress\", (event: ProgressEvent) => {\n if (event.lengthComputable) {\n onProgress(event.loaded);\n }\n });\n\n // Handle completion.\n xhr.addEventListener(\"readystatechange\", () => {\n if (xhr.readyState === 4 && xhr.status === 200) {\n resolve();\n }\n });\n\n // Handle errors.\n xhr.addEventListener(\"error\", () => {\n reject(new Error(\"Part upload failed due to network error\"));\n });\n\n xhr.addEventListener(\"abort\", () => {\n reject(new Error(\"Part upload aborted\"));\n });\n\n xhr.addEventListener(\"timeout\", () => {\n reject(new Error(\"Part upload timed out\"));\n });\n\n // Convert Buffer to Blob if needed.\n let body: Blob;\n if (isBuffer(chunk)) {\n // Buffer is a Uint8Array, so we can pass it to Blob.\n // Use 'as any' to work around TypeScript's strict type checking for ArrayBufferLike.\n body = new Blob([chunk as any]);\n } else {\n body = chunk;\n }\n\n // Send request.\n xhr.open(\"PUT\", url);\n xhr.send(body);\n });\n}\n\n/**\n * Upload part using fetch (Node.js and browser).\n */\nasync function uploadPartWithFetch(\n url: string,\n chunk: Blob | Buffer,\n signal?: AbortSignal\n): Promise<void> {\n const response = await fetch(url, {\n method: \"PUT\",\n body: chunk as any,\n signal\n });\n\n if (response.status !== 200) {\n const text = await response.text();\n throw new Error(`Part upload failed with status ${response.status}: ${text}`);\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"methods/fileManager/utils/uploadLargeFile.js","sources":["../../../../src/methods/fileManager/utils/uploadLargeFile.ts"],"sourcesContent":["import type { WebinyConfig } from \"../../../types.js\";\nimport type { FmFile, UploadProgress } from \"../fileManagerTypes.js\";\nimport { isBrowser } from \"../../../utils/platform.js\";\nimport { isBuffer, isFile, getFileSize } from \"./fileTypeDetection.js\";\nimport pMap from \"p-map\";\nimport pRetry from \"p-retry\";\nimport { createMultiPartUpload } from \"../createMultiPartUpload.js\";\nimport { completeMultiPartUpload } from \"../completeMultiPartUpload.js\";\n\nexport interface UploadLargeFileOptions {\n onProgress?: (progress: UploadProgress) => void;\n signal?: AbortSignal;\n chunkSize?: number;\n parallelUploads?: number;\n}\n\n/**\n * Uploads a large file to S3 using multi-part upload.\n *\n * @param file - The file to upload (Buffer, Blob, or File)\n * @param fileData - File metadata\n * @param config - SDK configuration\n * @param fetchFn - Fetch function to use for HTTP requests\n * @param options - Upload options\n * @returns Promise that resolves with the uploaded file metadata\n */\nexport async function uploadLargeFile(\n file: Buffer | Blob | File,\n fileData: { name: string; type: string; size: number; key?: string; keyPrefix?: string },\n config: WebinyConfig,\n fetchFn: typeof fetch,\n options: UploadLargeFileOptions = {}\n): Promise<FmFile> {\n const { onProgress, signal, chunkSize = 50, parallelUploads = 5 } = options;\n\n const fileSize = getFileSize(file);\n const chunkSizeBytes = Math.max(chunkSize * 1024 * 1024, 5 * 1024 * 1024);\n const numberOfParts = Math.ceil(fileSize / chunkSizeBytes);\n\n // 1. Create multi-part upload.\n const createResult = await createMultiPartUpload(config, fetchFn, {\n data: fileData,\n numberOfParts\n });\n\n if (createResult.isFail()) {\n throw createResult.error;\n }\n\n const uploadData = createResult.value;\n const progressTracker = new Map<number, number>();\n\n // Helper to track progress.\n const updateProgress = () => {\n if (!onProgress) {\n return;\n }\n\n const uploaded = Array.from(progressTracker.values()).reduce(\n (sum, value) => sum + value,\n 0\n );\n const uploadedSize = Math.min(uploaded, fileSize);\n\n onProgress({\n sent: uploadedSize,\n total: fileSize,\n percentage: Math.round((uploadedSize / fileSize) * 100)\n });\n };\n\n // 2. Upload parts in parallel.\n await pMap(\n uploadData.parts,\n async (part: { partNumber: number; url: string }) => {\n // Check abort signal.\n if (signal?.aborted) {\n throw new Error(\"Upload aborted\");\n }\n\n // Upload part with retry.\n await pRetry(\n async () => {\n const chunk = await getFileChunk(\n file,\n part.partNumber,\n chunkSizeBytes,\n fileData.type\n );\n\n await uploadPart(\n part.url,\n chunk,\n loaded => {\n progressTracker.set(part.partNumber, loaded);\n updateProgress();\n },\n signal\n );\n },\n {\n retries: 5,\n minTimeout: 1500,\n maxTimeout: 30000,\n maxRetryTime: 300000\n }\n );\n },\n { concurrency: Math.min(numberOfParts, parallelUploads) }\n );\n\n // 3. Complete multi-part upload.\n const completeResult = await completeMultiPartUpload(config, fetchFn, {\n fileKey: uploadData.file.key,\n uploadId: uploadData.uploadId\n });\n\n if (completeResult.isFail()) {\n throw completeResult.error;\n }\n\n // Return the file metadata.\n return uploadData.file as FmFile;\n}\n\n/**\n * Gets a chunk of the file for a specific part number.\n */\nasync function getFileChunk(\n file: Buffer | Blob | File,\n partNumber: number,\n chunkSize: number,\n fileType: string\n): Promise<Blob | Buffer> {\n const start = (partNumber - 1) * chunkSize;\n const end = Math.min(start + chunkSize, getFileSize(file));\n\n if (isBuffer(file)) {\n return file.slice(start, end);\n }\n\n if (isFile(file) || file instanceof Blob) {\n return file.slice(start, end, fileType);\n }\n\n throw new Error(\"Unsupported file type\");\n}\n\n/**\n * Uploads a single part to S3.\n */\nasync function uploadPart(\n url: string,\n chunk: Blob | Buffer,\n onProgress: (loaded: number) => void,\n signal?: AbortSignal\n): Promise<void> {\n if (isBrowser && typeof XMLHttpRequest !== \"undefined\") {\n return uploadPartWithXHR(url, chunk, onProgress, signal);\n }\n\n return uploadPartWithFetch(url, chunk, signal);\n}\n\n/**\n * Upload part using XMLHttpRequest (browser only, supports progress).\n */\nfunction uploadPartWithXHR(\n url: string,\n chunk: Blob | Buffer,\n onProgress: (loaded: number) => void,\n signal?: AbortSignal\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n\n // Handle abort signal.\n if (signal) {\n signal.addEventListener(\"abort\", () => xhr.abort());\n }\n\n // Track upload progress.\n xhr.upload.addEventListener(\"progress\", (event: ProgressEvent) => {\n if (event.lengthComputable) {\n onProgress(event.loaded);\n }\n });\n\n // Handle completion.\n xhr.addEventListener(\"readystatechange\", () => {\n if (xhr.readyState === 4 && xhr.status === 200) {\n resolve();\n }\n });\n\n // Handle errors.\n xhr.addEventListener(\"error\", () => {\n reject(new Error(\"Part upload failed due to network error\"));\n });\n\n xhr.addEventListener(\"abort\", () => {\n reject(new Error(\"Part upload aborted\"));\n });\n\n xhr.addEventListener(\"timeout\", () => {\n reject(new Error(\"Part upload timed out\"));\n });\n\n // Convert Buffer to Blob if needed.\n let body: Blob;\n if (isBuffer(chunk)) {\n // Buffer is a Uint8Array, so we can pass it to Blob.\n // Use 'as any' to work around TypeScript's strict type checking for ArrayBufferLike.\n body = new Blob([chunk as any]);\n } else {\n body = chunk;\n }\n\n // Send request.\n xhr.open(\"PUT\", url);\n xhr.send(body);\n });\n}\n\n/**\n * Upload part using fetch (Node.js and browser).\n */\nasync function uploadPartWithFetch(\n url: string,\n chunk: Blob | Buffer,\n signal?: AbortSignal\n): Promise<void> {\n const response = await fetch(url, {\n method: \"PUT\",\n body: chunk as any,\n signal\n });\n\n if (response.status !== 200) {\n const text = await response.text();\n throw new Error(`Part upload failed with status ${response.status}: ${text}`);\n }\n}\n"],"names":["uploadLargeFile","file","fileData","config","fetchFn","options","onProgress","signal","chunkSize","parallelUploads","fileSize","getFileSize","chunkSizeBytes","Math","numberOfParts","createResult","createMultiPartUpload","uploadData","progressTracker","Map","updateProgress","uploaded","Array","sum","value","uploadedSize","pMap","part","Error","pRetry","chunk","getFileChunk","uploadPart","loaded","completeResult","completeMultiPartUpload","partNumber","fileType","start","end","isBuffer","isFile","Blob","url","isBrowser","XMLHttpRequest","uploadPartWithXHR","uploadPartWithFetch","Promise","resolve","reject","xhr","event","body","response","fetch","text"],"mappings":";;;;;;AA0BO,eAAeA,gBAClBC,IAA0B,EAC1BC,QAAwF,EACxFC,MAAoB,EACpBC,OAAqB,EACrBC,UAAkC,CAAC,CAAC;IAEpC,MAAM,EAAEC,UAAU,EAAEC,MAAM,EAAEC,YAAY,EAAE,EAAEC,kBAAkB,CAAC,EAAE,GAAGJ;IAEpE,MAAMK,WAAWC,YAAYV;IAC7B,MAAMW,iBAAiBC,KAAK,GAAG,CAACL,AAAY,OAAZA,YAAmB,MAAM;IACzD,MAAMM,gBAAgBD,KAAK,IAAI,CAACH,WAAWE;IAG3C,MAAMG,eAAe,MAAMC,sBAAsBb,QAAQC,SAAS;QAC9D,MAAMF;QACNY;IACJ;IAEA,IAAIC,aAAa,MAAM,IACnB,MAAMA,aAAa,KAAK;IAG5B,MAAME,aAAaF,aAAa,KAAK;IACrC,MAAMG,kBAAkB,IAAIC;IAG5B,MAAMC,iBAAiB;QACnB,IAAI,CAACd,YACD;QAGJ,MAAMe,WAAWC,MAAM,IAAI,CAACJ,gBAAgB,MAAM,IAAI,MAAM,CACxD,CAACK,KAAKC,QAAUD,MAAMC,OACtB;QAEJ,MAAMC,eAAeZ,KAAK,GAAG,CAACQ,UAAUX;QAExCJ,WAAW;YACP,MAAMmB;YACN,OAAOf;YACP,YAAYG,KAAK,KAAK,CAAEY,eAAef,WAAY;QACvD;IACJ;IAGA,MAAMgB,MACFT,WAAW,KAAK,EAChB,OAAOU;QAEH,IAAIpB,QAAQ,SACR,MAAM,IAAIqB,MAAM;QAIpB,MAAMC,QACF;YACI,MAAMC,QAAQ,MAAMC,aAChB9B,MACA0B,KAAK,UAAU,EACff,gBACAV,SAAS,IAAI;YAGjB,MAAM8B,WACFL,KAAK,GAAG,EACRG,OACAG,CAAAA;gBACIf,gBAAgB,GAAG,CAACS,KAAK,UAAU,EAAEM;gBACrCb;YACJ,GACAb;QAER,GACA;YACI,SAAS;YACT,YAAY;YACZ,YAAY;YACZ,cAAc;QAClB;IAER,GACA;QAAE,aAAaM,KAAK,GAAG,CAACC,eAAeL;IAAiB;IAI5D,MAAMyB,iBAAiB,MAAMC,wBAAwBhC,QAAQC,SAAS;QAClE,SAASa,WAAW,IAAI,CAAC,GAAG;QAC5B,UAAUA,WAAW,QAAQ;IACjC;IAEA,IAAIiB,eAAe,MAAM,IACrB,MAAMA,eAAe,KAAK;IAI9B,OAAOjB,WAAW,IAAI;AAC1B;AAKA,eAAec,aACX9B,IAA0B,EAC1BmC,UAAkB,EAClB5B,SAAiB,EACjB6B,QAAgB;IAEhB,MAAMC,QAASF,AAAAA,CAAAA,aAAa,KAAK5B;IACjC,MAAM+B,MAAM1B,KAAK,GAAG,CAACyB,QAAQ9B,WAAWG,YAAYV;IAEpD,IAAIuC,SAASvC,OACT,OAAOA,KAAK,KAAK,CAACqC,OAAOC;IAG7B,IAAIE,OAAOxC,SAASA,gBAAgByC,MAChC,OAAOzC,KAAK,KAAK,CAACqC,OAAOC,KAAKF;IAGlC,MAAM,IAAIT,MAAM;AACpB;AAKA,eAAeI,WACXW,GAAW,EACXb,KAAoB,EACpBxB,UAAoC,EACpCC,MAAoB;IAEpB,IAAIqC,aAAa,AAA0B,MAA1B,OAAOC,gBACpB,OAAOC,kBAAkBH,KAAKb,OAAOxB,YAAYC;IAGrD,OAAOwC,oBAAoBJ,KAAKb,OAAOvB;AAC3C;AAKA,SAASuC,kBACLH,GAAW,EACXb,KAAoB,EACpBxB,UAAoC,EACpCC,MAAoB;IAEpB,OAAO,IAAIyC,QAAQ,CAACC,SAASC;QACzB,MAAMC,MAAM,IAAIN;QAGhB,IAAItC,QACAA,OAAO,gBAAgB,CAAC,SAAS,IAAM4C,IAAI,KAAK;QAIpDA,IAAI,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAACC;YACrC,IAAIA,MAAM,gBAAgB,EACtB9C,WAAW8C,MAAM,MAAM;QAE/B;QAGAD,IAAI,gBAAgB,CAAC,oBAAoB;YACrC,IAAIA,AAAmB,MAAnBA,IAAI,UAAU,IAAUA,AAAe,QAAfA,IAAI,MAAM,EAClCF;QAER;QAGAE,IAAI,gBAAgB,CAAC,SAAS;YAC1BD,OAAO,IAAItB,MAAM;QACrB;QAEAuB,IAAI,gBAAgB,CAAC,SAAS;YAC1BD,OAAO,IAAItB,MAAM;QACrB;QAEAuB,IAAI,gBAAgB,CAAC,WAAW;YAC5BD,OAAO,IAAItB,MAAM;QACrB;QAGA,IAAIyB;QAIAA,OAHAb,SAASV,SAGF,IAAIY,KAAK;YAACZ;SAAa,IAEvBA;QAIXqB,IAAI,IAAI,CAAC,OAAOR;QAChBQ,IAAI,IAAI,CAACE;IACb;AACJ;AAKA,eAAeN,oBACXJ,GAAW,EACXb,KAAoB,EACpBvB,MAAoB;IAEpB,MAAM+C,WAAW,MAAMC,MAAMZ,KAAK;QAC9B,QAAQ;QACR,MAAMb;QACNvB;IACJ;IAEA,IAAI+C,AAAoB,QAApBA,SAAS,MAAM,EAAU;QACzB,MAAME,OAAO,MAAMF,SAAS,IAAI;QAChC,MAAM,IAAI1B,MAAM,CAAC,+BAA+B,EAAE0B,SAAS,MAAM,CAAC,EAAE,EAAEE,MAAM;IAChF;AACJ"}
|
|
@@ -1,105 +1,52 @@
|
|
|
1
1
|
import { isBrowser } from "../../../utils/platform.js";
|
|
2
2
|
import { isBuffer } from "./fileTypeDetection.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
onProgress,
|
|
14
|
-
signal
|
|
15
|
-
} = options;
|
|
16
|
-
|
|
17
|
-
// Build FormData.
|
|
18
|
-
const formData = new FormData();
|
|
19
|
-
|
|
20
|
-
// Append all presigned POST fields.
|
|
21
|
-
for (const [key, value] of Object.entries(presignedPost.fields)) {
|
|
22
|
-
formData.append(key, value);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
// Append the file.
|
|
26
|
-
if (isBuffer(file)) {
|
|
27
|
-
// Convert Buffer to Blob for FormData.
|
|
28
|
-
// Buffer is a Uint8Array, so we can pass it to Blob.
|
|
29
|
-
// Use 'as any' to work around TypeScript's strict type checking for ArrayBufferLike.
|
|
30
|
-
formData.append("file", new Blob([file]));
|
|
31
|
-
} else {
|
|
32
|
-
formData.append("file", file);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
// Use XMLHttpRequest in browser for progress tracking.
|
|
36
|
-
if (isBrowser && onProgress) {
|
|
37
|
-
return uploadWithXHR(presignedPost.url, formData, onProgress, signal);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// Use fetch in Node.js or browser without progress.
|
|
41
|
-
return uploadWithFetch(presignedPost.url, formData, signal);
|
|
3
|
+
async function uploadToS3(file, presignedPost, options = {}) {
|
|
4
|
+
const { onProgress, signal } = options;
|
|
5
|
+
const formData = new FormData();
|
|
6
|
+
for (const [key, value] of Object.entries(presignedPost.fields))formData.append(key, value);
|
|
7
|
+
if (isBuffer(file)) formData.append("file", new Blob([
|
|
8
|
+
file
|
|
9
|
+
]));
|
|
10
|
+
else formData.append("file", file);
|
|
11
|
+
if (isBrowser && onProgress) return uploadWithXHR(presignedPost.url, formData, onProgress, signal);
|
|
12
|
+
return uploadWithFetch(presignedPost.url, formData, signal);
|
|
42
13
|
}
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Upload using XMLHttpRequest (browser only, supports progress).
|
|
46
|
-
*/
|
|
47
14
|
function uploadWithXHR(url, formData, onProgress, signal) {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
xhr.upload.addEventListener("progress", event => {
|
|
58
|
-
if (event.lengthComputable) {
|
|
59
|
-
onProgress({
|
|
60
|
-
sent: event.loaded,
|
|
61
|
-
total: event.total,
|
|
62
|
-
percentage: Math.round(event.loaded / event.total * 100)
|
|
15
|
+
return new Promise((resolve, reject)=>{
|
|
16
|
+
const xhr = new XMLHttpRequest();
|
|
17
|
+
if (signal) signal.addEventListener("abort", ()=>xhr.abort());
|
|
18
|
+
xhr.upload.addEventListener("progress", (event)=>{
|
|
19
|
+
if (event.lengthComputable) onProgress({
|
|
20
|
+
sent: event.loaded,
|
|
21
|
+
total: event.total,
|
|
22
|
+
percentage: Math.round(event.loaded / event.total * 100)
|
|
23
|
+
});
|
|
63
24
|
});
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
// Handle errors.
|
|
77
|
-
xhr.addEventListener("error", () => {
|
|
78
|
-
reject(new Error("Upload failed due to network error"));
|
|
79
|
-
});
|
|
80
|
-
xhr.addEventListener("abort", () => {
|
|
81
|
-
reject(new Error("Upload aborted"));
|
|
25
|
+
xhr.addEventListener("load", ()=>{
|
|
26
|
+
if (204 === xhr.status) resolve();
|
|
27
|
+
else reject(new Error(`Upload failed with status ${xhr.status}: ${xhr.responseText}`));
|
|
28
|
+
});
|
|
29
|
+
xhr.addEventListener("error", ()=>{
|
|
30
|
+
reject(new Error("Upload failed due to network error"));
|
|
31
|
+
});
|
|
32
|
+
xhr.addEventListener("abort", ()=>{
|
|
33
|
+
reject(new Error("Upload aborted"));
|
|
34
|
+
});
|
|
35
|
+
xhr.open("POST", url, true);
|
|
36
|
+
xhr.send(formData);
|
|
82
37
|
});
|
|
83
|
-
|
|
84
|
-
// Send request.
|
|
85
|
-
xhr.open("POST", url, true);
|
|
86
|
-
xhr.send(formData);
|
|
87
|
-
});
|
|
88
38
|
}
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Upload using fetch (Node.js and browser).
|
|
92
|
-
*/
|
|
93
39
|
async function uploadWithFetch(url, formData, signal) {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
40
|
+
const response = await fetch(url, {
|
|
41
|
+
method: "POST",
|
|
42
|
+
body: formData,
|
|
43
|
+
signal
|
|
44
|
+
});
|
|
45
|
+
if (204 !== response.status) {
|
|
46
|
+
const text = await response.text();
|
|
47
|
+
throw new Error(`Upload failed with status ${response.status}: ${text}`);
|
|
48
|
+
}
|
|
103
49
|
}
|
|
50
|
+
export { uploadToS3 };
|
|
104
51
|
|
|
105
52
|
//# sourceMappingURL=uploadToS3.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"methods/fileManager/utils/uploadToS3.js","sources":["../../../../src/methods/fileManager/utils/uploadToS3.ts"],"sourcesContent":["import type { PresignedPostPayload, UploadProgress } from \"../fileManagerTypes.js\";\nimport { isBrowser } from \"../../../utils/platform.js\";\nimport { isBuffer } from \"./fileTypeDetection.js\";\n\nexport interface UploadToS3Options {\n onProgress?: (progress: UploadProgress) => void;\n signal?: AbortSignal;\n}\n\n/**\n * Uploads a file to S3 using a presigned POST payload.\n *\n * @param file - The file to upload (Buffer, Blob, or File)\n * @param presignedPost - The presigned POST payload from S3\n * @param options - Upload options (progress callback, abort signal)\n * @returns Promise that resolves when upload is complete\n */\nexport async function uploadToS3(\n file: Buffer | Blob | File,\n presignedPost: PresignedPostPayload,\n options: UploadToS3Options = {}\n): Promise<void> {\n const { onProgress, signal } = options;\n\n // Build FormData.\n const formData = new FormData();\n\n // Append all presigned POST fields.\n for (const [key, value] of Object.entries(presignedPost.fields)) {\n formData.append(key, value);\n }\n\n // Append the file.\n if (isBuffer(file)) {\n // Convert Buffer to Blob for FormData.\n // Buffer is a Uint8Array, so we can pass it to Blob.\n // Use 'as any' to work around TypeScript's strict type checking for ArrayBufferLike.\n formData.append(\"file\", new Blob([file as any]));\n } else {\n formData.append(\"file\", file);\n }\n\n // Use XMLHttpRequest in browser for progress tracking.\n if (isBrowser && onProgress) {\n return uploadWithXHR(presignedPost.url, formData, onProgress, signal);\n }\n\n // Use fetch in Node.js or browser without progress.\n return uploadWithFetch(presignedPost.url, formData, signal);\n}\n\n/**\n * Upload using XMLHttpRequest (browser only, supports progress).\n */\nfunction uploadWithXHR(\n url: string,\n formData: FormData,\n onProgress: (progress: UploadProgress) => void,\n signal?: AbortSignal\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n\n // Handle abort signal.\n if (signal) {\n signal.addEventListener(\"abort\", () => xhr.abort());\n }\n\n // Track upload progress.\n xhr.upload.addEventListener(\"progress\", (event: ProgressEvent) => {\n if (event.lengthComputable) {\n onProgress({\n sent: event.loaded,\n total: event.total,\n percentage: Math.round((event.loaded / event.total) * 100)\n });\n }\n });\n\n // Handle completion.\n xhr.addEventListener(\"load\", () => {\n if (xhr.status === 204) {\n resolve();\n } else {\n reject(new Error(`Upload failed with status ${xhr.status}: ${xhr.responseText}`));\n }\n });\n\n // Handle errors.\n xhr.addEventListener(\"error\", () => {\n reject(new Error(\"Upload failed due to network error\"));\n });\n\n xhr.addEventListener(\"abort\", () => {\n reject(new Error(\"Upload aborted\"));\n });\n\n // Send request.\n xhr.open(\"POST\", url, true);\n xhr.send(formData);\n });\n}\n\n/**\n * Upload using fetch (Node.js and browser).\n */\nasync function uploadWithFetch(\n url: string,\n formData: FormData,\n signal?: AbortSignal\n): Promise<void> {\n const response = await fetch(url, {\n method: \"POST\",\n body: formData,\n signal\n });\n\n if (response.status !== 204) {\n const text = await response.text();\n throw new Error(`Upload failed with status ${response.status}: ${text}`);\n }\n}\n"],"names":["uploadToS3","file","presignedPost","options","onProgress","signal","formData","FormData","key","value","Object","isBuffer","Blob","isBrowser","uploadWithXHR","uploadWithFetch","url","Promise","resolve","reject","xhr","XMLHttpRequest","event","Math","Error","response","fetch","text"],"mappings":";;AAiBO,eAAeA,WAClBC,IAA0B,EAC1BC,aAAmC,EACnCC,UAA6B,CAAC,CAAC;IAE/B,MAAM,EAAEC,UAAU,EAAEC,MAAM,EAAE,GAAGF;IAG/B,MAAMG,WAAW,IAAIC;IAGrB,KAAK,MAAM,CAACC,KAAKC,MAAM,IAAIC,OAAO,OAAO,CAACR,cAAc,MAAM,EAC1DI,SAAS,MAAM,CAACE,KAAKC;IAIzB,IAAIE,SAASV,OAITK,SAAS,MAAM,CAAC,QAAQ,IAAIM,KAAK;QAACX;KAAY;SAE9CK,SAAS,MAAM,CAAC,QAAQL;IAI5B,IAAIY,aAAaT,YACb,OAAOU,cAAcZ,cAAc,GAAG,EAAEI,UAAUF,YAAYC;IAIlE,OAAOU,gBAAgBb,cAAc,GAAG,EAAEI,UAAUD;AACxD;AAKA,SAASS,cACLE,GAAW,EACXV,QAAkB,EAClBF,UAA8C,EAC9CC,MAAoB;IAEpB,OAAO,IAAIY,QAAQ,CAACC,SAASC;QACzB,MAAMC,MAAM,IAAIC;QAGhB,IAAIhB,QACAA,OAAO,gBAAgB,CAAC,SAAS,IAAMe,IAAI,KAAK;QAIpDA,IAAI,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAACE;YACrC,IAAIA,MAAM,gBAAgB,EACtBlB,WAAW;gBACP,MAAMkB,MAAM,MAAM;gBAClB,OAAOA,MAAM,KAAK;gBAClB,YAAYC,KAAK,KAAK,CAAED,MAAM,MAAM,GAAGA,MAAM,KAAK,GAAI;YAC1D;QAER;QAGAF,IAAI,gBAAgB,CAAC,QAAQ;YACzB,IAAIA,AAAe,QAAfA,IAAI,MAAM,EACVF;iBAEAC,OAAO,IAAIK,MAAM,CAAC,0BAA0B,EAAEJ,IAAI,MAAM,CAAC,EAAE,EAAEA,IAAI,YAAY,EAAE;QAEvF;QAGAA,IAAI,gBAAgB,CAAC,SAAS;YAC1BD,OAAO,IAAIK,MAAM;QACrB;QAEAJ,IAAI,gBAAgB,CAAC,SAAS;YAC1BD,OAAO,IAAIK,MAAM;QACrB;QAGAJ,IAAI,IAAI,CAAC,QAAQJ,KAAK;QACtBI,IAAI,IAAI,CAACd;IACb;AACJ;AAKA,eAAeS,gBACXC,GAAW,EACXV,QAAkB,EAClBD,MAAoB;IAEpB,MAAMoB,WAAW,MAAMC,MAAMV,KAAK;QAC9B,QAAQ;QACR,MAAMV;QACND;IACJ;IAEA,IAAIoB,AAAoB,QAApBA,SAAS,MAAM,EAAU;QACzB,MAAME,OAAO,MAAMF,SAAS,IAAI;QAChC,MAAM,IAAID,MAAM,CAAC,0BAA0B,EAAEC,SAAS,MAAM,CAAC,EAAE,EAAEE,MAAM;IAC3E;AACJ"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Result } from "../../Result.js";
|
|
2
2
|
import { executeGraphQL } from "../executeGraphQL.js";
|
|
3
3
|
import { ApiError } from "../../errors.js";
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
async function listLanguages(config, fetchFn) {
|
|
5
|
+
const query = `
|
|
6
6
|
query ListLanguages {
|
|
7
7
|
languages {
|
|
8
8
|
listLanguages {
|
|
@@ -21,15 +21,12 @@ export async function listLanguages(config, fetchFn) {
|
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
23
|
`;
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
if (responseData.languages.listLanguages.error) {
|
|
30
|
-
return Result.fail(new ApiError(responseData.languages.listLanguages.error.message, responseData.languages.listLanguages.error.code));
|
|
31
|
-
}
|
|
32
|
-
return Result.ok(responseData.languages.listLanguages.data);
|
|
24
|
+
const result = await executeGraphQL(config, fetchFn, query, {});
|
|
25
|
+
if (result.isFail()) return Result.fail(result.error);
|
|
26
|
+
const responseData = result.value;
|
|
27
|
+
if (responseData.languages.listLanguages.error) return Result.fail(new ApiError(responseData.languages.listLanguages.error.message, responseData.languages.listLanguages.error.code));
|
|
28
|
+
return Result.ok(responseData.languages.listLanguages.data);
|
|
33
29
|
}
|
|
30
|
+
export { listLanguages };
|
|
34
31
|
|
|
35
32
|
//# sourceMappingURL=listLanguages.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"methods/languages/listLanguages.js","sources":["../../../src/methods/languages/listLanguages.ts"],"sourcesContent":["import type { WebinyConfig } from \"../../types.js\";\nimport { Result } from \"../../Result.js\";\nimport type { HttpError, NetworkError } from \"../../errors.js\";\nimport { executeGraphQL } from \"../executeGraphQL.js\";\nimport { ApiError } from \"../../errors.js\";\n\nexport interface Language {\n id: string;\n code: string;\n name: string;\n direction?: \"ltr\" | \"rtl\";\n isDefault?: boolean;\n}\n\nexport async function listLanguages(\n config: WebinyConfig,\n fetchFn: typeof fetch\n): Promise<Result<Language[], HttpError | ApiError | NetworkError>> {\n const query = `\n query ListLanguages {\n languages {\n listLanguages {\n data {\n id\n code\n name\n direction\n isDefault\n }\n error {\n code\n message\n }\n }\n }\n }\n `;\n\n const result = await executeGraphQL(config, fetchFn, query, {});\n\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n const responseData = result.value;\n\n if (responseData.languages.listLanguages.error) {\n return Result.fail(\n new ApiError(\n responseData.languages.listLanguages.error.message,\n responseData.languages.listLanguages.error.code\n )\n );\n }\n\n return Result.ok(responseData.languages.listLanguages.data);\n}\n"],"names":["listLanguages","config","fetchFn","query","result","executeGraphQL","Result","responseData","ApiError"],"mappings":";;;AAcO,eAAeA,cAClBC,MAAoB,EACpBC,OAAqB;IAErB,MAAMC,QAAQ,CAAC;;;;;;;;;;;;;;;;;;IAkBf,CAAC;IAED,MAAMC,SAAS,MAAMC,eAAeJ,QAAQC,SAASC,OAAO,CAAC;IAE7D,IAAIC,OAAO,MAAM,IACb,OAAOE,OAAO,IAAI,CAACF,OAAO,KAAK;IAGnC,MAAMG,eAAeH,OAAO,KAAK;IAEjC,IAAIG,aAAa,SAAS,CAAC,aAAa,CAAC,KAAK,EAC1C,OAAOD,OAAO,IAAI,CACd,IAAIE,SACAD,aAAa,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,EAClDA,aAAa,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI;IAK3D,OAAOD,OAAO,EAAE,CAACC,aAAa,SAAS,CAAC,aAAa,CAAC,IAAI;AAC9D"}
|
|
@@ -3,11 +3,8 @@ import { createMethod } from "../../utils/createMethod.js";
|
|
|
3
3
|
import { abortTaskSchema } from "./schemas.js";
|
|
4
4
|
import { executeGraphQL } from "../executeGraphQL.js";
|
|
5
5
|
import { ApiError } from "../../errors.js";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
message
|
|
9
|
-
}) => {
|
|
10
|
-
const query = `
|
|
6
|
+
const abortTask = createMethod(abortTaskSchema, async (config, fetchFn, { id, message })=>{
|
|
7
|
+
const query = `
|
|
11
8
|
mutation AbortTask($id: ID!, $message: String) {
|
|
12
9
|
backgroundTasks {
|
|
13
10
|
abortTask(id: $id, message: $message) {
|
|
@@ -35,18 +32,15 @@ export const abortTask = createMethod(abortTaskSchema, async (config, fetchFn, {
|
|
|
35
32
|
}
|
|
36
33
|
}
|
|
37
34
|
`;
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
if (responseData.backgroundTasks.abortTask.error) {
|
|
47
|
-
return Result.fail(new ApiError(responseData.backgroundTasks.abortTask.error.message, responseData.backgroundTasks.abortTask.error.code));
|
|
48
|
-
}
|
|
49
|
-
return Result.ok(responseData.backgroundTasks.abortTask.data);
|
|
35
|
+
const result = await executeGraphQL(config, fetchFn, query, {
|
|
36
|
+
id,
|
|
37
|
+
message
|
|
38
|
+
});
|
|
39
|
+
if (result.isFail()) return Result.fail(result.error);
|
|
40
|
+
const responseData = result.value;
|
|
41
|
+
if (responseData.backgroundTasks.abortTask.error) return Result.fail(new ApiError(responseData.backgroundTasks.abortTask.error.message, responseData.backgroundTasks.abortTask.error.code));
|
|
42
|
+
return Result.ok(responseData.backgroundTasks.abortTask.data);
|
|
50
43
|
});
|
|
44
|
+
export { abortTask };
|
|
51
45
|
|
|
52
46
|
//# sourceMappingURL=abortTask.js.map
|