@aws-amplify/storage 6.11.2-unstable.5a0e006.0 → 6.11.2-unstable.b6d4c7a.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.
- package/dist/cjs/internals/apis/remove.js +13 -12
- package/dist/cjs/internals/apis/remove.js.map +1 -1
- package/dist/cjs/providers/s3/apis/internal/remove.js +53 -29
- package/dist/cjs/providers/s3/apis/internal/remove.js.map +1 -1
- package/dist/cjs/providers/s3/apis/remove.js +6 -1
- package/dist/cjs/providers/s3/apis/remove.js.map +1 -1
- package/dist/cjs/providers/s3/apis/server/remove.js +6 -1
- package/dist/cjs/providers/s3/apis/server/remove.js.map +1 -1
- package/dist/cjs/providers/s3/utils/client/s3data/deleteObjects.js +70 -0
- package/dist/cjs/providers/s3/utils/client/s3data/deleteObjects.js.map +1 -0
- package/dist/cjs/providers/s3/utils/client/s3data/index.js +3 -1
- package/dist/cjs/providers/s3/utils/client/s3data/index.js.map +1 -1
- package/dist/cjs/providers/s3/utils/createAbortableTask.js +35 -0
- package/dist/cjs/providers/s3/utils/createAbortableTask.js.map +1 -0
- package/dist/cjs/providers/s3/utils/deleteFolderContents.js +80 -0
- package/dist/cjs/providers/s3/utils/deleteFolderContents.js.map +1 -0
- package/dist/cjs/providers/s3/utils/generateDeleteObjectsXml.js +38 -0
- package/dist/cjs/providers/s3/utils/generateDeleteObjectsXml.js.map +1 -0
- package/dist/cjs/providers/s3/utils/index.js +13 -1
- package/dist/cjs/providers/s3/utils/index.js.map +1 -1
- package/dist/cjs/providers/s3/utils/isPathFolder.js +38 -0
- package/dist/cjs/providers/s3/utils/isPathFolder.js.map +1 -0
- package/dist/cjs/providers/s3/utils/resolveFinalKey.js +22 -0
- package/dist/cjs/providers/s3/utils/resolveFinalKey.js.map +1 -0
- package/dist/cjs/providers/s3/utils/validateRemovePath.js +21 -0
- package/dist/cjs/providers/s3/utils/validateRemovePath.js.map +1 -0
- package/dist/esm/internals/apis/remove.d.ts +2 -1
- package/dist/esm/internals/apis/remove.mjs +13 -12
- package/dist/esm/internals/apis/remove.mjs.map +1 -1
- package/dist/esm/providers/s3/apis/internal/copy.mjs +8 -7
- package/dist/esm/providers/s3/apis/internal/copy.mjs.map +1 -1
- package/dist/esm/providers/s3/apis/internal/downloadData.d.ts +1 -1
- package/dist/esm/providers/s3/apis/internal/downloadData.mjs +6 -5
- package/dist/esm/providers/s3/apis/internal/downloadData.mjs.map +1 -1
- package/dist/esm/providers/s3/apis/internal/getProperties.mjs +7 -6
- package/dist/esm/providers/s3/apis/internal/getProperties.mjs.map +1 -1
- package/dist/esm/providers/s3/apis/internal/getUrl.mjs +2 -1
- package/dist/esm/providers/s3/apis/internal/getUrl.mjs.map +1 -1
- package/dist/esm/providers/s3/apis/internal/list.mjs +8 -7
- package/dist/esm/providers/s3/apis/internal/list.mjs.map +1 -1
- package/dist/esm/providers/s3/apis/internal/remove.d.ts +3 -2
- package/dist/esm/providers/s3/apis/internal/remove.mjs +58 -27
- package/dist/esm/providers/s3/apis/internal/remove.mjs.map +1 -1
- package/dist/esm/providers/s3/apis/internal/uploadData/index.mjs +13 -0
- package/dist/esm/providers/s3/apis/internal/uploadData/index.mjs.map +1 -1
- package/dist/esm/providers/s3/apis/internal/uploadData/multipart/initialUpload.mjs +1 -0
- package/dist/esm/providers/s3/apis/internal/uploadData/multipart/initialUpload.mjs.map +1 -1
- package/dist/esm/providers/s3/apis/internal/uploadData/multipart/uploadCache.mjs +1 -0
- package/dist/esm/providers/s3/apis/internal/uploadData/multipart/uploadCache.mjs.map +1 -1
- package/dist/esm/providers/s3/apis/internal/uploadData/multipart/uploadHandlers.mjs +6 -5
- package/dist/esm/providers/s3/apis/internal/uploadData/multipart/uploadHandlers.mjs.map +1 -1
- package/dist/esm/providers/s3/apis/internal/uploadData/multipart/uploadPartExecutor.mjs +1 -0
- package/dist/esm/providers/s3/apis/internal/uploadData/multipart/uploadPartExecutor.mjs.map +1 -1
- package/dist/esm/providers/s3/apis/internal/uploadData/putObjectJob.mjs +7 -6
- package/dist/esm/providers/s3/apis/internal/uploadData/putObjectJob.mjs.map +1 -1
- package/dist/esm/providers/s3/apis/remove.d.ts +6 -6
- package/dist/esm/providers/s3/apis/remove.mjs +6 -1
- package/dist/esm/providers/s3/apis/remove.mjs.map +1 -1
- package/dist/esm/providers/s3/apis/server/remove.d.ts +6 -6
- package/dist/esm/providers/s3/apis/server/remove.mjs +6 -1
- package/dist/esm/providers/s3/apis/server/remove.mjs.map +1 -1
- package/dist/esm/providers/s3/types/index.d.ts +1 -1
- package/dist/esm/providers/s3/types/inputs.d.ts +24 -1
- package/dist/esm/providers/s3/utils/client/s3data/deleteObjects.d.ts +30 -0
- package/dist/esm/providers/s3/utils/client/s3data/deleteObjects.mjs +74 -0
- package/dist/esm/providers/s3/utils/client/s3data/deleteObjects.mjs.map +1 -0
- package/dist/esm/providers/s3/utils/client/s3data/index.d.ts +1 -0
- package/dist/esm/providers/s3/utils/client/s3data/index.mjs +1 -0
- package/dist/esm/providers/s3/utils/client/s3data/index.mjs.map +1 -1
- package/dist/esm/providers/s3/utils/client/s3data/types.d.ts +26 -0
- package/dist/esm/providers/s3/utils/createAbortableTask.d.ts +6 -0
- package/dist/esm/providers/s3/utils/createAbortableTask.mjs +33 -0
- package/dist/esm/providers/s3/utils/createAbortableTask.mjs.map +1 -0
- package/dist/esm/providers/s3/utils/deleteFolderContents.d.ts +16 -0
- package/dist/esm/providers/s3/utils/deleteFolderContents.mjs +90 -0
- package/dist/esm/providers/s3/utils/deleteFolderContents.mjs.map +1 -0
- package/dist/esm/providers/s3/utils/generateDeleteObjectsXml.d.ts +10 -0
- package/dist/esm/providers/s3/utils/generateDeleteObjectsXml.mjs +35 -0
- package/dist/esm/providers/s3/utils/generateDeleteObjectsXml.mjs.map +1 -0
- package/dist/esm/providers/s3/utils/index.d.ts +6 -0
- package/dist/esm/providers/s3/utils/index.mjs +6 -0
- package/dist/esm/providers/s3/utils/index.mjs.map +1 -1
- package/dist/esm/providers/s3/utils/isPathFolder.d.ts +13 -0
- package/dist/esm/providers/s3/utils/isPathFolder.mjs +48 -0
- package/dist/esm/providers/s3/utils/isPathFolder.mjs.map +1 -0
- package/dist/esm/providers/s3/utils/resolveFinalKey.d.ts +9 -0
- package/dist/esm/providers/s3/utils/resolveFinalKey.mjs +20 -0
- package/dist/esm/providers/s3/utils/resolveFinalKey.mjs.map +1 -0
- package/dist/esm/providers/s3/utils/validateRemovePath.d.ts +8 -0
- package/dist/esm/providers/s3/utils/validateRemovePath.mjs +18 -0
- package/dist/esm/providers/s3/utils/validateRemovePath.mjs.map +1 -0
- package/dist/esm/types/common.d.ts +3 -0
- package/package.json +5 -5
- package/src/internals/apis/remove.ts +17 -10
- package/src/providers/s3/apis/internal/remove.ts +96 -41
- package/src/providers/s3/apis/remove.ts +11 -6
- package/src/providers/s3/apis/server/remove.ts +11 -6
- package/src/providers/s3/types/index.ts +2 -0
- package/src/providers/s3/types/inputs.ts +24 -1
- package/src/providers/s3/utils/client/s3data/deleteObjects.ts +122 -0
- package/src/providers/s3/utils/client/s3data/index.ts +5 -0
- package/src/providers/s3/utils/client/s3data/types.ts +20 -0
- package/src/providers/s3/utils/createAbortableTask.ts +45 -0
- package/src/providers/s3/utils/deleteFolderContents.ts +118 -0
- package/src/providers/s3/utils/generateDeleteObjectsXml.ts +38 -0
- package/src/providers/s3/utils/index.ts +6 -0
- package/src/providers/s3/utils/isPathFolder.ts +50 -0
- package/src/providers/s3/utils/resolveFinalKey.ts +22 -0
- package/src/providers/s3/utils/validateRemovePath.ts +16 -0
- package/src/types/common.ts +5 -0
|
@@ -5,12 +5,18 @@ import '../../utils/client/runtime/s3TransferHandler/fetch.mjs';
|
|
|
5
5
|
import 'fast-xml-parser';
|
|
6
6
|
import '../../utils/client/runtime/s3TransferHandler/xhr.mjs';
|
|
7
7
|
import 'buffer';
|
|
8
|
+
import { deleteFolderContents } from '../../utils/deleteFolderContents.mjs';
|
|
8
9
|
import { resolveS3ConfigAndInput } from '../../utils/resolveS3ConfigAndInput.mjs';
|
|
10
|
+
import { resolveFinalKey } from '../../utils/resolveFinalKey.mjs';
|
|
11
|
+
import { CanceledError } from '../../../../errors/CanceledError.mjs';
|
|
9
12
|
import '../../../../errors/types/validation.mjs';
|
|
10
|
-
import
|
|
13
|
+
import '../../../../utils/logger.mjs';
|
|
11
14
|
import { validateBucketOwnerID } from '../../utils/validateBucketOwnerID.mjs';
|
|
15
|
+
import { validateRemovePath } from '../../utils/validateRemovePath.mjs';
|
|
12
16
|
import { validateStorageOperationInput } from '../../utils/validateStorageOperationInput.mjs';
|
|
13
17
|
import { STORAGE_INPUT_KEY } from '../../utils/constants.mjs';
|
|
18
|
+
import { isPathFolder } from '../../utils/isPathFolder.mjs';
|
|
19
|
+
import { createAbortableTask } from '../../utils/createAbortableTask.mjs';
|
|
14
20
|
import '../../utils/client/s3data/base.mjs';
|
|
15
21
|
import '../../utils/client/s3data/getObject.mjs';
|
|
16
22
|
import '../../utils/client/s3data/listObjectsV2.mjs';
|
|
@@ -23,38 +29,63 @@ import '../../utils/client/s3data/abortMultipartUpload.mjs';
|
|
|
23
29
|
import '../../utils/client/s3data/copyObject.mjs';
|
|
24
30
|
import '../../utils/client/s3data/headObject.mjs';
|
|
25
31
|
import { deleteObject } from '../../utils/client/s3data/deleteObject.mjs';
|
|
32
|
+
import '../../utils/client/s3data/deleteObjects.mjs';
|
|
26
33
|
import { getStorageUserAgentValue } from '../../utils/userAgent.mjs';
|
|
27
34
|
|
|
28
35
|
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
29
36
|
// SPDX-License-Identifier: Apache-2.0
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
37
|
+
function remove(amplify, input) {
|
|
38
|
+
return createAbortableTask(executeRemove(amplify, input));
|
|
39
|
+
}
|
|
40
|
+
const executeRemove = (amplify, input) => async (abortController) => {
|
|
41
|
+
try {
|
|
42
|
+
const { s3Config, keyPrefix, bucket, identityId } = await resolveS3ConfigAndInput(amplify, input);
|
|
43
|
+
const { inputType, objectKey } = validateStorageOperationInput(input, identityId);
|
|
44
|
+
validateBucketOwnerID(input.options?.expectedBucketOwner);
|
|
45
|
+
const finalKey = resolveFinalKey(inputType, objectKey, keyPrefix);
|
|
46
|
+
validateRemovePath(finalKey);
|
|
47
|
+
const isFolder = finalKey.endsWith('/') ||
|
|
48
|
+
(await isPathFolder({
|
|
49
|
+
s3Config,
|
|
50
|
+
bucket,
|
|
51
|
+
key: finalKey,
|
|
52
|
+
expectedBucketOwner: input.options?.expectedBucketOwner,
|
|
53
|
+
}));
|
|
54
|
+
if (isFolder) {
|
|
55
|
+
return deleteFolderContents({
|
|
56
|
+
s3Config,
|
|
57
|
+
bucket,
|
|
58
|
+
folderKey: finalKey,
|
|
59
|
+
expectedBucketOwner: input.options?.expectedBucketOwner,
|
|
60
|
+
onProgress: input.options?.onProgress,
|
|
61
|
+
abortSignal: abortController.signal,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
if (abortController.signal.aborted) {
|
|
66
|
+
throw new CanceledError({ message: 'Operation was cancelled' });
|
|
67
|
+
}
|
|
68
|
+
await deleteObject({
|
|
69
|
+
...s3Config,
|
|
70
|
+
userAgentValue: getStorageUserAgentValue(StorageAction.Remove),
|
|
71
|
+
abortSignal: abortController.signal,
|
|
72
|
+
}, {
|
|
73
|
+
Bucket: bucket,
|
|
74
|
+
Key: finalKey,
|
|
75
|
+
ExpectedBucketOwner: input.options?.expectedBucketOwner,
|
|
76
|
+
});
|
|
77
|
+
const result = inputType === STORAGE_INPUT_KEY
|
|
78
|
+
? { key: objectKey }
|
|
79
|
+
: { path: objectKey };
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
42
82
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
}, {
|
|
47
|
-
Bucket: bucket,
|
|
48
|
-
Key: finalKey,
|
|
49
|
-
ExpectedBucketOwner: input.options?.expectedBucketOwner,
|
|
50
|
-
});
|
|
51
|
-
return inputType === STORAGE_INPUT_KEY
|
|
52
|
-
? {
|
|
53
|
-
key: objectKey,
|
|
83
|
+
catch (error) {
|
|
84
|
+
if (abortController.signal.aborted) {
|
|
85
|
+
throw new CanceledError({ message: 'Operation was cancelled' });
|
|
54
86
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
};
|
|
87
|
+
throw error;
|
|
88
|
+
}
|
|
58
89
|
};
|
|
59
90
|
|
|
60
91
|
export { remove };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remove.mjs","sources":["../../../../../../src/providers/s3/apis/internal/remove.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { StorageAction } from '@aws-amplify/core/internals/utils';\nimport { resolveS3ConfigAndInput, validateBucketOwnerID, validateStorageOperationInput, } from '../../utils';\nimport { deleteObject } from '../../utils/client/s3data';\nimport { getStorageUserAgentValue } from '../../utils/userAgent';\nimport {
|
|
1
|
+
{"version":3,"file":"remove.mjs","sources":["../../../../../../src/providers/s3/apis/internal/remove.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { StorageAction } from '@aws-amplify/core/internals/utils';\nimport { deleteFolderContents, isPathFolder, resolveFinalKey, resolveS3ConfigAndInput, validateBucketOwnerID, validateRemovePath, validateStorageOperationInput, } from '../../utils';\nimport { deleteObject } from '../../utils/client/s3data';\nimport { getStorageUserAgentValue } from '../../utils/userAgent';\nimport { STORAGE_INPUT_KEY } from '../../utils/constants';\nimport { createAbortableTask } from '../../utils/createAbortableTask';\nimport { CanceledError } from '../../../../errors/CanceledError';\nexport function remove(amplify, input) {\n return createAbortableTask(executeRemove(amplify, input));\n}\nconst executeRemove = (amplify, input) => async (abortController) => {\n try {\n const { s3Config, keyPrefix, bucket, identityId } = await resolveS3ConfigAndInput(amplify, input);\n const { inputType, objectKey } = validateStorageOperationInput(input, identityId);\n validateBucketOwnerID(input.options?.expectedBucketOwner);\n const finalKey = resolveFinalKey(inputType, objectKey, keyPrefix);\n validateRemovePath(finalKey);\n const isFolder = finalKey.endsWith('/') ||\n (await isPathFolder({\n s3Config,\n bucket,\n key: finalKey,\n expectedBucketOwner: input.options?.expectedBucketOwner,\n }));\n if (isFolder) {\n return deleteFolderContents({\n s3Config,\n bucket,\n folderKey: finalKey,\n expectedBucketOwner: input.options?.expectedBucketOwner,\n onProgress: input.options?.onProgress,\n abortSignal: abortController.signal,\n });\n }\n else {\n if (abortController.signal.aborted) {\n throw new CanceledError({ message: 'Operation was cancelled' });\n }\n await deleteObject({\n ...s3Config,\n userAgentValue: getStorageUserAgentValue(StorageAction.Remove),\n abortSignal: abortController.signal,\n }, {\n Bucket: bucket,\n Key: finalKey,\n ExpectedBucketOwner: input.options?.expectedBucketOwner,\n });\n const result = inputType === STORAGE_INPUT_KEY\n ? { key: objectKey }\n : { path: objectKey };\n return result;\n }\n }\n catch (error) {\n if (abortController.signal.aborted) {\n throw new CanceledError({ message: 'Operation was cancelled' });\n }\n throw error;\n }\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AAQO,SAAS,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE;AACvC,IAAI,OAAO,mBAAmB,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAC7D;AACA,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,KAAK,KAAK,OAAO,eAAe,KAAK;AACrE,IAAI,IAAI;AACR,QAAQ,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,uBAAuB,CAAC,OAAO,EAAE,KAAK,CAAC;AACzG,QAAQ,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,6BAA6B,CAAC,KAAK,EAAE,UAAU,CAAC;AACzF,QAAQ,qBAAqB,CAAC,KAAK,CAAC,OAAO,EAAE,mBAAmB,CAAC;AACjE,QAAQ,MAAM,QAAQ,GAAG,eAAe,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;AACzE,QAAQ,kBAAkB,CAAC,QAAQ,CAAC;AACpC,QAAQ,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC;AAC/C,aAAa,MAAM,YAAY,CAAC;AAChC,gBAAgB,QAAQ;AACxB,gBAAgB,MAAM;AACtB,gBAAgB,GAAG,EAAE,QAAQ;AAC7B,gBAAgB,mBAAmB,EAAE,KAAK,CAAC,OAAO,EAAE,mBAAmB;AACvE,aAAa,CAAC,CAAC;AACf,QAAQ,IAAI,QAAQ,EAAE;AACtB,YAAY,OAAO,oBAAoB,CAAC;AACxC,gBAAgB,QAAQ;AACxB,gBAAgB,MAAM;AACtB,gBAAgB,SAAS,EAAE,QAAQ;AACnC,gBAAgB,mBAAmB,EAAE,KAAK,CAAC,OAAO,EAAE,mBAAmB;AACvE,gBAAgB,UAAU,EAAE,KAAK,CAAC,OAAO,EAAE,UAAU;AACrD,gBAAgB,WAAW,EAAE,eAAe,CAAC,MAAM;AACnD,aAAa,CAAC;AACd,QAAQ;AACR,aAAa;AACb,YAAY,IAAI,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE;AAChD,gBAAgB,MAAM,IAAI,aAAa,CAAC,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC;AAC/E,YAAY;AACZ,YAAY,MAAM,YAAY,CAAC;AAC/B,gBAAgB,GAAG,QAAQ;AAC3B,gBAAgB,cAAc,EAAE,wBAAwB,CAAC,aAAa,CAAC,MAAM,CAAC;AAC9E,gBAAgB,WAAW,EAAE,eAAe,CAAC,MAAM;AACnD,aAAa,EAAE;AACf,gBAAgB,MAAM,EAAE,MAAM;AAC9B,gBAAgB,GAAG,EAAE,QAAQ;AAC7B,gBAAgB,mBAAmB,EAAE,KAAK,CAAC,OAAO,EAAE,mBAAmB;AACvE,aAAa,CAAC;AACd,YAAY,MAAM,MAAM,GAAG,SAAS,KAAK;AACzC,kBAAkB,EAAE,GAAG,EAAE,SAAS;AAClC,kBAAkB,EAAE,IAAI,EAAE,SAAS,EAAE;AACrC,YAAY,OAAO,MAAM;AACzB,QAAQ;AACR,IAAI;AACJ,IAAI,OAAO,KAAK,EAAE;AAClB,QAAQ,IAAI,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE;AAC5C,YAAY,MAAM,IAAI,aAAa,CAAC,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC;AAC3E,QAAQ;AACR,QAAQ,MAAM,KAAK;AACnB,IAAI;AACJ,CAAC;;;;"}
|
|
@@ -5,6 +5,19 @@ import 'fast-xml-parser';
|
|
|
5
5
|
import '../../../utils/client/runtime/s3TransferHandler/xhr.mjs';
|
|
6
6
|
import 'buffer';
|
|
7
7
|
import '@aws-amplify/core/internals/utils';
|
|
8
|
+
import '../../../utils/client/s3data/base.mjs';
|
|
9
|
+
import '../../../utils/client/s3data/getObject.mjs';
|
|
10
|
+
import '../../../utils/client/s3data/listObjectsV2.mjs';
|
|
11
|
+
import '../../../utils/client/s3data/putObject.mjs';
|
|
12
|
+
import '../../../utils/client/s3data/createMultipartUpload.mjs';
|
|
13
|
+
import '../../../utils/client/s3data/uploadPart.mjs';
|
|
14
|
+
import '../../../utils/client/s3data/completeMultipartUpload.mjs';
|
|
15
|
+
import '../../../utils/client/s3data/listParts.mjs';
|
|
16
|
+
import '../../../utils/client/s3data/abortMultipartUpload.mjs';
|
|
17
|
+
import '../../../utils/client/s3data/copyObject.mjs';
|
|
18
|
+
import '../../../utils/client/s3data/headObject.mjs';
|
|
19
|
+
import '../../../utils/client/s3data/deleteObject.mjs';
|
|
20
|
+
import '../../../utils/client/s3data/deleteObjects.mjs';
|
|
8
21
|
import { assertValidationError } from '../../../../../errors/utils/assertValidationError.mjs';
|
|
9
22
|
import { StorageValidationErrorCode } from '../../../../../errors/types/validation.mjs';
|
|
10
23
|
import { MAX_OBJECT_SIZE, DEFAULT_PART_SIZE } from '../../../utils/constants.mjs';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../../../../../src/providers/s3/apis/internal/uploadData/index.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { createUploadTask } from '../../../utils';\nimport { assertValidationError } from '../../../../../errors/utils/assertValidationError';\nimport { StorageValidationErrorCode } from '../../../../../errors/types/validation';\nimport { DEFAULT_PART_SIZE, MAX_OBJECT_SIZE } from '../../../utils/constants';\nimport { byteLength } from './byteLength';\nimport { putObjectJob } from './putObjectJob';\nimport { getMultipartUploadHandlers, } from './multipart';\nexport const uploadData = (input) => {\n const { data } = input;\n const dataByteLength = byteLength(data);\n // Using InvalidUploadSource error code because the input data must NOT be any\n // of permitted Blob, string, ArrayBuffer(View) if byteLength could not be determined.\n assertValidationError(dataByteLength !== undefined, StorageValidationErrorCode.InvalidUploadSource);\n assertValidationError(dataByteLength <= MAX_OBJECT_SIZE, StorageValidationErrorCode.ObjectIsTooLarge);\n if (dataByteLength <= DEFAULT_PART_SIZE) {\n // Single part upload\n const abortController = new AbortController();\n return createUploadTask({\n isMultipartUpload: false,\n job: putObjectJob(input, abortController.signal, dataByteLength),\n onCancel: (message) => {\n abortController.abort(message);\n },\n });\n }\n else {\n // Multipart upload\n const { multipartUploadJob, onPause, onResume, onCancel } = getMultipartUploadHandlers(input, dataByteLength);\n return createUploadTask({\n isMultipartUpload: true,\n job: multipartUploadJob,\n onCancel: (message) => {\n onCancel(message);\n },\n onPause,\n onResume,\n });\n }\n};\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../../../../../src/providers/s3/apis/internal/uploadData/index.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { createUploadTask } from '../../../utils';\nimport { assertValidationError } from '../../../../../errors/utils/assertValidationError';\nimport { StorageValidationErrorCode } from '../../../../../errors/types/validation';\nimport { DEFAULT_PART_SIZE, MAX_OBJECT_SIZE } from '../../../utils/constants';\nimport { byteLength } from './byteLength';\nimport { putObjectJob } from './putObjectJob';\nimport { getMultipartUploadHandlers, } from './multipart';\nexport const uploadData = (input) => {\n const { data } = input;\n const dataByteLength = byteLength(data);\n // Using InvalidUploadSource error code because the input data must NOT be any\n // of permitted Blob, string, ArrayBuffer(View) if byteLength could not be determined.\n assertValidationError(dataByteLength !== undefined, StorageValidationErrorCode.InvalidUploadSource);\n assertValidationError(dataByteLength <= MAX_OBJECT_SIZE, StorageValidationErrorCode.ObjectIsTooLarge);\n if (dataByteLength <= DEFAULT_PART_SIZE) {\n // Single part upload\n const abortController = new AbortController();\n return createUploadTask({\n isMultipartUpload: false,\n job: putObjectJob(input, abortController.signal, dataByteLength),\n onCancel: (message) => {\n abortController.abort(message);\n },\n });\n }\n else {\n // Multipart upload\n const { multipartUploadJob, onPause, onResume, onCancel } = getMultipartUploadHandlers(input, dataByteLength);\n return createUploadTask({\n isMultipartUpload: true,\n job: multipartUploadJob,\n onCancel: (message) => {\n onCancel(message);\n },\n onPause,\n onResume,\n });\n }\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AAQY,MAAC,UAAU,GAAG,CAAC,KAAK,KAAK;AACrC,IAAI,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK;AAC1B,IAAI,MAAM,cAAc,GAAG,UAAU,CAAC,IAAI,CAAC;AAC3C;AACA;AACA,IAAI,qBAAqB,CAAC,cAAc,KAAK,SAAS,EAAE,0BAA0B,CAAC,mBAAmB,CAAC;AACvG,IAAI,qBAAqB,CAAC,cAAc,IAAI,eAAe,EAAE,0BAA0B,CAAC,gBAAgB,CAAC;AACzG,IAAI,IAAI,cAAc,IAAI,iBAAiB,EAAE;AAC7C;AACA,QAAQ,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE;AACrD,QAAQ,OAAO,gBAAgB,CAAC;AAChC,YAAY,iBAAiB,EAAE,KAAK;AACpC,YAAY,GAAG,EAAE,YAAY,CAAC,KAAK,EAAE,eAAe,CAAC,MAAM,EAAE,cAAc,CAAC;AAC5E,YAAY,QAAQ,EAAE,CAAC,OAAO,KAAK;AACnC,gBAAgB,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC;AAC9C,YAAY,CAAC;AACb,SAAS,CAAC;AACV,IAAI;AACJ,SAAS;AACT;AACA,QAAQ,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,0BAA0B,CAAC,KAAK,EAAE,cAAc,CAAC;AACrH,QAAQ,OAAO,gBAAgB,CAAC;AAChC,YAAY,iBAAiB,EAAE,IAAI;AACnC,YAAY,GAAG,EAAE,kBAAkB;AACnC,YAAY,QAAQ,EAAE,CAAC,OAAO,KAAK;AACnC,gBAAgB,QAAQ,CAAC,OAAO,CAAC;AACjC,YAAY,CAAC;AACb,YAAY,OAAO;AACnB,YAAY,QAAQ;AACpB,SAAS,CAAC;AACV,IAAI;AACJ;;;;"}
|
|
@@ -10,6 +10,7 @@ import '../../../../utils/client/s3data/abortMultipartUpload.mjs';
|
|
|
10
10
|
import '../../../../utils/client/s3data/copyObject.mjs';
|
|
11
11
|
import '../../../../utils/client/s3data/headObject.mjs';
|
|
12
12
|
import '../../../../utils/client/s3data/deleteObject.mjs';
|
|
13
|
+
import '../../../../utils/client/s3data/deleteObjects.mjs';
|
|
13
14
|
import '../../../../../../errors/types/validation.mjs';
|
|
14
15
|
import '@aws-amplify/core/internals/utils';
|
|
15
16
|
import { logger } from '../../../../../../utils/logger.mjs';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initialUpload.mjs","sources":["../../../../../../../../src/providers/s3/apis/internal/uploadData/multipart/initialUpload.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { createMultipartUpload } from '../../../../utils/client/s3data';\nimport { logger } from '../../../../../../utils';\nimport { constructContentDisposition } from '../../../../utils/constructContentDisposition';\nimport { CHECKSUM_ALGORITHM_CRC32 } from '../../../../utils/constants';\nimport { calculateContentCRC32 } from '../../../../utils/crc32';\nimport { cacheMultipartUpload, findCachedUploadPartsAndEvictExpired, getUploadsCacheKey, } from './uploadCache';\n/**\n * Load the in-progress multipart upload from local storage or async storage(RN) if it exists, or create a new multipart\n * upload.\n *\n * @internal\n */\nexport const loadOrCreateMultipartUpload = async ({ s3Config, data, size, contentType, bucket, accessLevel, keyPrefix, key, contentDisposition, contentEncoding, metadata, abortSignal, checksumAlgorithm, optionsHash, resumableUploadsCache, expectedBucketOwner, }) => {\n const finalKey = keyPrefix !== undefined ? keyPrefix + key : key;\n let cachedUpload;\n if (!resumableUploadsCache) {\n logger.debug('uploaded cache instance cannot be determined, skipping cache.');\n cachedUpload = undefined;\n }\n else {\n const uploadCacheKey = getUploadsCacheKey({\n size,\n contentType,\n file: data instanceof File ? data : undefined,\n bucket,\n accessLevel,\n key,\n optionsHash,\n });\n const cachedUploadParts = await findCachedUploadPartsAndEvictExpired({\n s3Config,\n cacheKey: uploadCacheKey,\n bucket,\n finalKey,\n resumableUploadsCache,\n });\n cachedUpload = cachedUploadParts\n ? { ...cachedUploadParts, uploadCacheKey }\n : undefined;\n }\n if (cachedUpload) {\n return {\n uploadId: cachedUpload.uploadId,\n cachedParts: cachedUpload.parts,\n finalCrc32: cachedUpload.finalCrc32,\n };\n }\n else {\n /**\n * Note: This step reads the uploading file from beginning to end to calculate the CRC32 checksum of the entire\n * object before sending the 1st byte over the wire. This is a performance bottleneck when uploading large files.\n * The rationale to do this is S3 team wants to reduce the possibility of a file getting corrupted(on disk or in\n * memory). So we calculate the full-object checksum as soon as possible in the upload flow.\n *\n * Going forward we should re-evaluate this decision with S3 team. The alternative is calling calculateContentCRC32()\n * as we upload each part sequentially with seeds from already uploaded parts, ideally inside the data chunker.\n */\n const finalCrc32 = checksumAlgorithm === CHECKSUM_ALGORITHM_CRC32\n ? await calculateContentCRC32(data)\n : undefined;\n const { UploadId } = await createMultipartUpload({\n ...s3Config,\n abortSignal,\n }, {\n Bucket: bucket,\n Key: finalKey,\n ContentType: contentType,\n ContentDisposition: constructContentDisposition(contentDisposition),\n ContentEncoding: contentEncoding,\n Metadata: metadata,\n ChecksumAlgorithm: finalCrc32 ? 'CRC32' : undefined,\n ChecksumType: finalCrc32 ? 'FULL_OBJECT' : undefined,\n ExpectedBucketOwner: expectedBucketOwner,\n });\n if (resumableUploadsCache) {\n const uploadCacheKey = getUploadsCacheKey({\n size,\n contentType,\n file: data instanceof File ? data : undefined,\n bucket,\n accessLevel,\n key,\n optionsHash,\n });\n await cacheMultipartUpload(resumableUploadsCache, uploadCacheKey, {\n uploadId: UploadId,\n bucket,\n key,\n finalCrc32,\n fileName: data instanceof File ? data.name : '',\n });\n }\n return {\n uploadId: UploadId,\n cachedParts: [],\n finalCrc32,\n };\n }\n};\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"initialUpload.mjs","sources":["../../../../../../../../src/providers/s3/apis/internal/uploadData/multipart/initialUpload.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { createMultipartUpload } from '../../../../utils/client/s3data';\nimport { logger } from '../../../../../../utils';\nimport { constructContentDisposition } from '../../../../utils/constructContentDisposition';\nimport { CHECKSUM_ALGORITHM_CRC32 } from '../../../../utils/constants';\nimport { calculateContentCRC32 } from '../../../../utils/crc32';\nimport { cacheMultipartUpload, findCachedUploadPartsAndEvictExpired, getUploadsCacheKey, } from './uploadCache';\n/**\n * Load the in-progress multipart upload from local storage or async storage(RN) if it exists, or create a new multipart\n * upload.\n *\n * @internal\n */\nexport const loadOrCreateMultipartUpload = async ({ s3Config, data, size, contentType, bucket, accessLevel, keyPrefix, key, contentDisposition, contentEncoding, metadata, abortSignal, checksumAlgorithm, optionsHash, resumableUploadsCache, expectedBucketOwner, }) => {\n const finalKey = keyPrefix !== undefined ? keyPrefix + key : key;\n let cachedUpload;\n if (!resumableUploadsCache) {\n logger.debug('uploaded cache instance cannot be determined, skipping cache.');\n cachedUpload = undefined;\n }\n else {\n const uploadCacheKey = getUploadsCacheKey({\n size,\n contentType,\n file: data instanceof File ? data : undefined,\n bucket,\n accessLevel,\n key,\n optionsHash,\n });\n const cachedUploadParts = await findCachedUploadPartsAndEvictExpired({\n s3Config,\n cacheKey: uploadCacheKey,\n bucket,\n finalKey,\n resumableUploadsCache,\n });\n cachedUpload = cachedUploadParts\n ? { ...cachedUploadParts, uploadCacheKey }\n : undefined;\n }\n if (cachedUpload) {\n return {\n uploadId: cachedUpload.uploadId,\n cachedParts: cachedUpload.parts,\n finalCrc32: cachedUpload.finalCrc32,\n };\n }\n else {\n /**\n * Note: This step reads the uploading file from beginning to end to calculate the CRC32 checksum of the entire\n * object before sending the 1st byte over the wire. This is a performance bottleneck when uploading large files.\n * The rationale to do this is S3 team wants to reduce the possibility of a file getting corrupted(on disk or in\n * memory). So we calculate the full-object checksum as soon as possible in the upload flow.\n *\n * Going forward we should re-evaluate this decision with S3 team. The alternative is calling calculateContentCRC32()\n * as we upload each part sequentially with seeds from already uploaded parts, ideally inside the data chunker.\n */\n const finalCrc32 = checksumAlgorithm === CHECKSUM_ALGORITHM_CRC32\n ? await calculateContentCRC32(data)\n : undefined;\n const { UploadId } = await createMultipartUpload({\n ...s3Config,\n abortSignal,\n }, {\n Bucket: bucket,\n Key: finalKey,\n ContentType: contentType,\n ContentDisposition: constructContentDisposition(contentDisposition),\n ContentEncoding: contentEncoding,\n Metadata: metadata,\n ChecksumAlgorithm: finalCrc32 ? 'CRC32' : undefined,\n ChecksumType: finalCrc32 ? 'FULL_OBJECT' : undefined,\n ExpectedBucketOwner: expectedBucketOwner,\n });\n if (resumableUploadsCache) {\n const uploadCacheKey = getUploadsCacheKey({\n size,\n contentType,\n file: data instanceof File ? data : undefined,\n bucket,\n accessLevel,\n key,\n optionsHash,\n });\n await cacheMultipartUpload(resumableUploadsCache, uploadCacheKey, {\n uploadId: UploadId,\n bucket,\n key,\n finalCrc32,\n fileName: data instanceof File ? data.name : '',\n });\n }\n return {\n uploadId: UploadId,\n cachedParts: [],\n finalCrc32,\n };\n }\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,7 @@ import '../../../../utils/client/s3data/abortMultipartUpload.mjs';
|
|
|
11
11
|
import '../../../../utils/client/s3data/copyObject.mjs';
|
|
12
12
|
import '../../../../utils/client/s3data/headObject.mjs';
|
|
13
13
|
import '../../../../utils/client/s3data/deleteObject.mjs';
|
|
14
|
+
import '../../../../utils/client/s3data/deleteObjects.mjs';
|
|
14
15
|
import '../../../../../../errors/types/validation.mjs';
|
|
15
16
|
import '@aws-amplify/core/internals/utils';
|
|
16
17
|
import { logger } from '../../../../../../utils/logger.mjs';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploadCache.mjs","sources":["../../../../../../../../src/providers/s3/apis/internal/uploadData/multipart/uploadCache.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { UPLOADS_STORAGE_KEY } from '../../../../utils/constants';\nimport { listParts } from '../../../../utils/client/s3data';\nimport { logger } from '../../../../../../utils';\nimport { getContentType } from '../../../../../../utils/contentType';\nconst ONE_HOUR = 1000 * 60 * 60;\n/**\n * Find the cached multipart upload id and get the parts that have been uploaded\n * with ListParts API. If the cached upload is expired(1 hour), return null.\n */\nexport const findCachedUploadPartsAndEvictExpired = async ({ resumableUploadsCache, cacheKey, s3Config, bucket, finalKey, }) => {\n const allCachedUploads = await listCachedUploadTasks(resumableUploadsCache);\n // Evict all outdated uploads.\n const validCachedUploads = Object.fromEntries(Object.entries(allCachedUploads).filter(([_, cacheValue]) => cacheValue.lastTouched >= Date.now() - ONE_HOUR));\n if (Object.keys(validCachedUploads).length !==\n Object.keys(allCachedUploads).length) {\n await resumableUploadsCache.setItem(UPLOADS_STORAGE_KEY, JSON.stringify(validCachedUploads));\n }\n if (!validCachedUploads[cacheKey]) {\n return null;\n }\n const cachedUpload = validCachedUploads[cacheKey];\n cachedUpload.lastTouched = Date.now();\n await resumableUploadsCache.setItem(UPLOADS_STORAGE_KEY, JSON.stringify(validCachedUploads));\n try {\n const { Parts = [] } = await listParts(s3Config, {\n Bucket: bucket,\n Key: finalKey,\n UploadId: cachedUpload.uploadId,\n });\n return {\n parts: Parts,\n uploadId: cachedUpload.uploadId,\n finalCrc32: cachedUpload.finalCrc32,\n };\n }\n catch (e) {\n logger.debug('failed to list cached parts, removing cached upload.');\n await removeCachedUpload(resumableUploadsCache, cacheKey);\n return null;\n }\n};\nconst listCachedUploadTasks = async (resumableUploadsCache) => {\n try {\n return JSON.parse((await resumableUploadsCache.getItem(UPLOADS_STORAGE_KEY)) ?? '{}');\n }\n catch (e) {\n logger.debug('failed to parse cached uploads record.');\n return {};\n }\n};\n/**\n * Serialize the uploadData API options to string so it can be hashed.\n */\nexport const serializeUploadOptions = (options = {}) => {\n const unserializableOptionProperties = [\n 'onProgress',\n 'resumableUploadsCache', // Internally injected implementation not set by customers\n 'locationCredentialsProvider', // Internally injected implementation not set by customers\n ];\n const serializableOptionEntries = Object.entries(options).filter(([key]) => !unserializableOptionProperties.includes(key));\n if (options.checksumAlgorithm === 'crc-32') {\n // Additional options to differentiate the upload cache created before introducing the full-object checksum and\n // after. If full-object checksum is enabled, the previous upload caches that created with composite checksum should\n // be ignored.\n serializableOptionEntries.push(['checksumType', 'FULL_OBJECT']);\n }\n const serializableOptions = Object.fromEntries(serializableOptionEntries);\n return JSON.stringify(serializableOptions);\n};\n/**\n * Get the cache key of a multipart upload. Data source cached by different: size, content type, bucket, access level,\n * key. If the data source is a File instance, the upload is additionally indexed by file name and last modified time.\n * So the library always created a new multipart upload if the file is modified.\n */\nexport const getUploadsCacheKey = ({ file, size, contentType, bucket, accessLevel, key, optionsHash, }) => {\n let levelStr;\n const resolvedContentType = contentType ?? getContentType(file, key) ?? 'application/octet-stream';\n // If no access level is defined, we're using custom gen2 access rules\n if (accessLevel === undefined) {\n levelStr = 'custom';\n }\n else {\n levelStr = accessLevel === 'guest' ? 'public' : accessLevel;\n }\n const baseId = `${optionsHash}_${size}_${resolvedContentType}_${bucket}_${levelStr}_${key}`;\n if (file) {\n return `${file.name}_${file.lastModified}_${baseId}`;\n }\n else {\n return baseId;\n }\n};\nexport const cacheMultipartUpload = async (resumableUploadsCache, cacheKey, fileMetadata) => {\n const cachedUploads = await listCachedUploadTasks(resumableUploadsCache);\n cachedUploads[cacheKey] = {\n ...fileMetadata,\n lastTouched: Date.now(),\n };\n await resumableUploadsCache.setItem(UPLOADS_STORAGE_KEY, JSON.stringify(cachedUploads));\n};\nexport const removeCachedUpload = async (resumableUploadsCache, cacheKey) => {\n const cachedUploads = await listCachedUploadTasks(resumableUploadsCache);\n delete cachedUploads[cacheKey];\n await resumableUploadsCache.setItem(UPLOADS_STORAGE_KEY, JSON.stringify(cachedUploads));\n};\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"uploadCache.mjs","sources":["../../../../../../../../src/providers/s3/apis/internal/uploadData/multipart/uploadCache.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { UPLOADS_STORAGE_KEY } from '../../../../utils/constants';\nimport { listParts } from '../../../../utils/client/s3data';\nimport { logger } from '../../../../../../utils';\nimport { getContentType } from '../../../../../../utils/contentType';\nconst ONE_HOUR = 1000 * 60 * 60;\n/**\n * Find the cached multipart upload id and get the parts that have been uploaded\n * with ListParts API. If the cached upload is expired(1 hour), return null.\n */\nexport const findCachedUploadPartsAndEvictExpired = async ({ resumableUploadsCache, cacheKey, s3Config, bucket, finalKey, }) => {\n const allCachedUploads = await listCachedUploadTasks(resumableUploadsCache);\n // Evict all outdated uploads.\n const validCachedUploads = Object.fromEntries(Object.entries(allCachedUploads).filter(([_, cacheValue]) => cacheValue.lastTouched >= Date.now() - ONE_HOUR));\n if (Object.keys(validCachedUploads).length !==\n Object.keys(allCachedUploads).length) {\n await resumableUploadsCache.setItem(UPLOADS_STORAGE_KEY, JSON.stringify(validCachedUploads));\n }\n if (!validCachedUploads[cacheKey]) {\n return null;\n }\n const cachedUpload = validCachedUploads[cacheKey];\n cachedUpload.lastTouched = Date.now();\n await resumableUploadsCache.setItem(UPLOADS_STORAGE_KEY, JSON.stringify(validCachedUploads));\n try {\n const { Parts = [] } = await listParts(s3Config, {\n Bucket: bucket,\n Key: finalKey,\n UploadId: cachedUpload.uploadId,\n });\n return {\n parts: Parts,\n uploadId: cachedUpload.uploadId,\n finalCrc32: cachedUpload.finalCrc32,\n };\n }\n catch (e) {\n logger.debug('failed to list cached parts, removing cached upload.');\n await removeCachedUpload(resumableUploadsCache, cacheKey);\n return null;\n }\n};\nconst listCachedUploadTasks = async (resumableUploadsCache) => {\n try {\n return JSON.parse((await resumableUploadsCache.getItem(UPLOADS_STORAGE_KEY)) ?? '{}');\n }\n catch (e) {\n logger.debug('failed to parse cached uploads record.');\n return {};\n }\n};\n/**\n * Serialize the uploadData API options to string so it can be hashed.\n */\nexport const serializeUploadOptions = (options = {}) => {\n const unserializableOptionProperties = [\n 'onProgress',\n 'resumableUploadsCache', // Internally injected implementation not set by customers\n 'locationCredentialsProvider', // Internally injected implementation not set by customers\n ];\n const serializableOptionEntries = Object.entries(options).filter(([key]) => !unserializableOptionProperties.includes(key));\n if (options.checksumAlgorithm === 'crc-32') {\n // Additional options to differentiate the upload cache created before introducing the full-object checksum and\n // after. If full-object checksum is enabled, the previous upload caches that created with composite checksum should\n // be ignored.\n serializableOptionEntries.push(['checksumType', 'FULL_OBJECT']);\n }\n const serializableOptions = Object.fromEntries(serializableOptionEntries);\n return JSON.stringify(serializableOptions);\n};\n/**\n * Get the cache key of a multipart upload. Data source cached by different: size, content type, bucket, access level,\n * key. If the data source is a File instance, the upload is additionally indexed by file name and last modified time.\n * So the library always created a new multipart upload if the file is modified.\n */\nexport const getUploadsCacheKey = ({ file, size, contentType, bucket, accessLevel, key, optionsHash, }) => {\n let levelStr;\n const resolvedContentType = contentType ?? getContentType(file, key) ?? 'application/octet-stream';\n // If no access level is defined, we're using custom gen2 access rules\n if (accessLevel === undefined) {\n levelStr = 'custom';\n }\n else {\n levelStr = accessLevel === 'guest' ? 'public' : accessLevel;\n }\n const baseId = `${optionsHash}_${size}_${resolvedContentType}_${bucket}_${levelStr}_${key}`;\n if (file) {\n return `${file.name}_${file.lastModified}_${baseId}`;\n }\n else {\n return baseId;\n }\n};\nexport const cacheMultipartUpload = async (resumableUploadsCache, cacheKey, fileMetadata) => {\n const cachedUploads = await listCachedUploadTasks(resumableUploadsCache);\n cachedUploads[cacheKey] = {\n ...fileMetadata,\n lastTouched: Date.now(),\n };\n await resumableUploadsCache.setItem(UPLOADS_STORAGE_KEY, JSON.stringify(cachedUploads));\n};\nexport const removeCachedUpload = async (resumableUploadsCache, cacheKey) => {\n const cachedUploads = await listCachedUploadTasks(resumableUploadsCache);\n delete cachedUploads[cacheKey];\n await resumableUploadsCache.setItem(UPLOADS_STORAGE_KEY, JSON.stringify(cachedUploads));\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -7,12 +7,7 @@ import 'fast-xml-parser';
|
|
|
7
7
|
import '../../../../utils/client/runtime/s3TransferHandler/xhr.mjs';
|
|
8
8
|
import 'buffer';
|
|
9
9
|
import { StorageError } from '../../../../../../errors/StorageError.mjs';
|
|
10
|
-
import { resolveS3ConfigAndInput } from '../../../../utils/resolveS3ConfigAndInput.mjs';
|
|
11
10
|
import { CanceledError } from '../../../../../../errors/CanceledError.mjs';
|
|
12
|
-
import '../../../../../../errors/types/validation.mjs';
|
|
13
|
-
import { logger } from '../../../../../../utils/logger.mjs';
|
|
14
|
-
import { validateStorageOperationInput } from '../../../../utils/validateStorageOperationInput.mjs';
|
|
15
|
-
import { STORAGE_INPUT_KEY, DEFAULT_ACCESS_LEVEL, DEFAULT_QUEUE_SIZE } from '../../../../utils/constants.mjs';
|
|
16
11
|
import '../../../../utils/client/s3data/base.mjs';
|
|
17
12
|
import '../../../../utils/client/s3data/getObject.mjs';
|
|
18
13
|
import '../../../../utils/client/s3data/listObjectsV2.mjs';
|
|
@@ -25,7 +20,13 @@ import { abortMultipartUpload } from '../../../../utils/client/s3data/abortMulti
|
|
|
25
20
|
import '../../../../utils/client/s3data/copyObject.mjs';
|
|
26
21
|
import { headObject } from '../../../../utils/client/s3data/headObject.mjs';
|
|
27
22
|
import '../../../../utils/client/s3data/deleteObject.mjs';
|
|
23
|
+
import '../../../../utils/client/s3data/deleteObjects.mjs';
|
|
28
24
|
import { getStorageUserAgentValue } from '../../../../utils/userAgent.mjs';
|
|
25
|
+
import { resolveS3ConfigAndInput } from '../../../../utils/resolveS3ConfigAndInput.mjs';
|
|
26
|
+
import { STORAGE_INPUT_KEY, DEFAULT_ACCESS_LEVEL, DEFAULT_QUEUE_SIZE } from '../../../../utils/constants.mjs';
|
|
27
|
+
import '../../../../../../errors/types/validation.mjs';
|
|
28
|
+
import { logger } from '../../../../../../utils/logger.mjs';
|
|
29
|
+
import { validateStorageOperationInput } from '../../../../utils/validateStorageOperationInput.mjs';
|
|
29
30
|
import { calculateContentCRC32 } from '../../../../utils/crc32.mjs';
|
|
30
31
|
import { IntegrityError } from '../../../../../../errors/IntegrityError.mjs';
|
|
31
32
|
import { getContentType } from '../../../../../../utils/contentType.mjs';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploadHandlers.mjs","sources":["../../../../../../../../src/providers/s3/apis/internal/uploadData/multipart/uploadHandlers.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { Amplify, } from '@aws-amplify/core';\nimport { StorageAction } from '@aws-amplify/core/internals/utils';\nimport { resolveS3ConfigAndInput, validateStorageOperationInput, } from '../../../../utils';\nimport { DEFAULT_ACCESS_LEVEL, DEFAULT_QUEUE_SIZE, STORAGE_INPUT_KEY, } from '../../../../utils/constants';\nimport { StorageError } from '../../../../../../errors/StorageError';\nimport { CanceledError } from '../../../../../../errors/CanceledError';\nimport { abortMultipartUpload, completeMultipartUpload, headObject, } from '../../../../utils/client/s3data';\nimport { getStorageUserAgentValue } from '../../../../utils/userAgent';\nimport { logger } from '../../../../../../utils';\nimport { calculateContentCRC32 } from '../../../../utils/crc32';\nimport { IntegrityError } from '../../../../../../errors/IntegrityError';\nimport { getContentType } from '../../../../../../utils/contentType';\nimport { uploadPartExecutor } from './uploadPartExecutor';\nimport { getUploadsCacheKey, removeCachedUpload, serializeUploadOptions, } from './uploadCache';\nimport { getConcurrentUploadsProgressTracker } from './progressTracker';\nimport { loadOrCreateMultipartUpload } from './initialUpload';\nimport { getDataChunker } from './getDataChunker';\nimport { calculatePartSize } from './calculatePartSize';\n/**\n * Create closure hiding the multipart upload implementation details and expose the upload job and control functions(\n * onPause, onResume, onCancel).\n *\n * @internal\n */\nexport const getMultipartUploadHandlers = (uploadDataInput, size) => {\n let resolveCallback;\n let rejectCallback;\n let inProgressUpload;\n let resolvedS3Config;\n let abortController;\n let resolvedAccessLevel;\n let resolvedBucket;\n let resolvedKeyPrefix;\n let resolvedIdentityId;\n let uploadCacheKey;\n let finalKey;\n let expectedBucketOwner;\n // Special flag that differentiates HTTP requests abort error caused by pause() from ones caused by cancel().\n // The former one should NOT cause the upload job to throw, but cancels any pending HTTP requests.\n // This should be replaced by a special abort reason. However,the support of this API is lagged behind.\n let isAbortSignalFromPause = false;\n const { resumableUploadsCache } = uploadDataInput.options ?? {};\n const startUpload = async () => {\n const { options: uploadDataOptions, data } = uploadDataInput;\n const resolvedS3Options = await resolveS3ConfigAndInput(Amplify, uploadDataInput);\n abortController = new AbortController();\n isAbortSignalFromPause = false;\n resolvedS3Config = resolvedS3Options.s3Config;\n resolvedBucket = resolvedS3Options.bucket;\n resolvedIdentityId = resolvedS3Options.identityId;\n expectedBucketOwner = uploadDataOptions?.expectedBucketOwner;\n const { inputType, objectKey } = validateStorageOperationInput(uploadDataInput, resolvedIdentityId);\n const { contentDisposition, contentEncoding, contentType = uploadDataOptions?.contentType ??\n getContentType(data, objectKey) ??\n 'application/octet-stream', metadata, preventOverwrite, onProgress, } = uploadDataOptions ?? {};\n finalKey = objectKey;\n // Resolve \"key\" specific options\n if (inputType === STORAGE_INPUT_KEY) {\n const accessLevel = uploadDataOptions\n ?.accessLevel;\n resolvedKeyPrefix = resolvedS3Options.keyPrefix;\n finalKey = resolvedKeyPrefix + objectKey;\n resolvedAccessLevel = resolveAccessLevel(accessLevel);\n }\n const optionsHash = await calculateContentCRC32(serializeUploadOptions(uploadDataOptions));\n if (!inProgressUpload) {\n const { uploadId, cachedParts, finalCrc32 } = await loadOrCreateMultipartUpload({\n s3Config: resolvedS3Config,\n accessLevel: resolvedAccessLevel,\n bucket: resolvedBucket,\n keyPrefix: resolvedKeyPrefix,\n key: objectKey,\n contentType,\n contentDisposition,\n contentEncoding,\n metadata,\n data,\n size,\n abortSignal: abortController.signal,\n checksumAlgorithm: uploadDataOptions?.checksumAlgorithm,\n optionsHash,\n resumableUploadsCache,\n expectedBucketOwner,\n });\n inProgressUpload = {\n uploadId,\n completedParts: cachedParts,\n finalCrc32,\n };\n }\n uploadCacheKey = size\n ? getUploadsCacheKey({\n file: data instanceof File ? data : undefined,\n accessLevel: resolvedAccessLevel,\n contentType: uploadDataOptions?.contentType,\n bucket: resolvedBucket,\n size,\n key: objectKey,\n optionsHash,\n })\n : undefined;\n const dataChunker = getDataChunker(data, size);\n const completedPartNumberSet = new Set(inProgressUpload.completedParts.map(({ PartNumber }) => PartNumber));\n const onPartUploadCompletion = (partNumber, eTag, crc32) => {\n inProgressUpload?.completedParts.push({\n PartNumber: partNumber,\n ETag: eTag,\n // TODO: crc32 can always be added once RN also has an implementation\n ...(crc32 ? { ChecksumCRC32: crc32 } : {}),\n });\n };\n const concurrentUploadsProgressTracker = getConcurrentUploadsProgressTracker({\n size,\n onProgress,\n });\n const concurrentUploadPartExecutors = [];\n for (let index = 0; index < DEFAULT_QUEUE_SIZE; index++) {\n concurrentUploadPartExecutors.push(uploadPartExecutor({\n dataChunkerGenerator: dataChunker,\n completedPartNumberSet,\n s3Config: resolvedS3Config,\n abortSignal: abortController.signal,\n bucket: resolvedBucket,\n finalKey,\n uploadId: inProgressUpload.uploadId,\n onPartUploadCompletion,\n onProgress: concurrentUploadsProgressTracker.getOnProgressListener(),\n isObjectLockEnabled: resolvedS3Options.isObjectLockEnabled,\n useCRC32Checksum: Boolean(inProgressUpload.finalCrc32),\n expectedBucketOwner,\n }));\n }\n await Promise.all(concurrentUploadPartExecutors);\n validateCompletedParts(inProgressUpload.completedParts, size);\n const { ETag: eTag } = await completeMultipartUpload({\n ...resolvedS3Config,\n abortSignal: abortController.signal,\n userAgentValue: getStorageUserAgentValue(StorageAction.UploadData),\n }, {\n Bucket: resolvedBucket,\n Key: finalKey,\n UploadId: inProgressUpload.uploadId,\n ChecksumCRC32: inProgressUpload.finalCrc32,\n ChecksumType: inProgressUpload.finalCrc32 ? 'FULL_OBJECT' : undefined,\n IfNoneMatch: preventOverwrite ? '*' : undefined,\n MultipartUpload: {\n Parts: sortUploadParts(inProgressUpload.completedParts),\n },\n ExpectedBucketOwner: expectedBucketOwner,\n });\n // If full-object CRC32 checksum is NOT enabled, we need to ensure the upload integrity by making extra HEAD call\n // to verify the uploaded object size.\n if (!inProgressUpload.finalCrc32) {\n const { ContentLength: uploadedObjectSize, $metadata } = await headObject(resolvedS3Config, {\n Bucket: resolvedBucket,\n Key: finalKey,\n ExpectedBucketOwner: expectedBucketOwner,\n });\n if (uploadedObjectSize && uploadedObjectSize !== size) {\n throw new StorageError({\n name: 'Error',\n message: `Upload failed. Expected object size ${size}, but got ${uploadedObjectSize}.`,\n metadata: $metadata,\n });\n }\n }\n if (resumableUploadsCache && uploadCacheKey) {\n await removeCachedUpload(resumableUploadsCache, uploadCacheKey);\n }\n const result = {\n eTag,\n contentType,\n metadata,\n };\n return inputType === STORAGE_INPUT_KEY\n ? { key: objectKey, ...result }\n : { path: objectKey, ...result };\n };\n const startUploadWithResumability = () => startUpload()\n .then(resolveCallback)\n .catch(error => {\n const abortSignal = abortController?.signal;\n if (abortSignal?.aborted && isAbortSignalFromPause) {\n logger.debug('upload paused.');\n }\n else {\n // Uncaught errors should be exposed to the users.\n rejectCallback(error);\n }\n });\n const multipartUploadJob = () => new Promise((resolve, reject) => {\n resolveCallback = resolve;\n rejectCallback = reject;\n startUploadWithResumability();\n });\n const onPause = () => {\n isAbortSignalFromPause = true;\n abortController?.abort();\n };\n const onResume = () => {\n startUploadWithResumability();\n };\n const onCancel = (message) => {\n // 1. abort in-flight API requests\n abortController?.abort(message);\n const cancelUpload = async () => {\n // 2. clear upload cache.\n if (uploadCacheKey && resumableUploadsCache) {\n await removeCachedUpload(resumableUploadsCache, uploadCacheKey);\n }\n // 3. clear multipart upload on server side.\n await abortMultipartUpload(resolvedS3Config, {\n Bucket: resolvedBucket,\n Key: finalKey,\n UploadId: inProgressUpload?.uploadId,\n ExpectedBucketOwner: expectedBucketOwner,\n });\n };\n cancelUpload().catch(e => {\n logger.debug('error when cancelling upload task.', e);\n });\n rejectCallback(\n // Internal error that should not be exposed to the users. They should use isCancelError() to check if\n // the error is caused by cancel().\n new CanceledError(message ? { message } : undefined));\n };\n return {\n multipartUploadJob,\n onPause,\n onResume,\n onCancel,\n };\n};\nconst resolveAccessLevel = (accessLevel) => accessLevel ??\n Amplify.libraryOptions.Storage?.S3?.defaultAccessLevel ??\n DEFAULT_ACCESS_LEVEL;\nconst validateCompletedParts = (completedParts, size) => {\n const partsExpected = Math.ceil(size / calculatePartSize(size));\n const validPartCount = completedParts.length === partsExpected;\n const sorted = sortUploadParts(completedParts);\n const validPartNumbers = sorted.every((part, index) => part.PartNumber === index + 1);\n if (!validPartCount || !validPartNumbers) {\n throw new IntegrityError();\n }\n};\nconst sortUploadParts = (parts) => {\n return [...parts].sort((partA, partB) => partA.PartNumber - partB.PartNumber);\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"uploadHandlers.mjs","sources":["../../../../../../../../src/providers/s3/apis/internal/uploadData/multipart/uploadHandlers.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { Amplify, } from '@aws-amplify/core';\nimport { StorageAction } from '@aws-amplify/core/internals/utils';\nimport { resolveS3ConfigAndInput, validateStorageOperationInput, } from '../../../../utils';\nimport { DEFAULT_ACCESS_LEVEL, DEFAULT_QUEUE_SIZE, STORAGE_INPUT_KEY, } from '../../../../utils/constants';\nimport { StorageError } from '../../../../../../errors/StorageError';\nimport { CanceledError } from '../../../../../../errors/CanceledError';\nimport { abortMultipartUpload, completeMultipartUpload, headObject, } from '../../../../utils/client/s3data';\nimport { getStorageUserAgentValue } from '../../../../utils/userAgent';\nimport { logger } from '../../../../../../utils';\nimport { calculateContentCRC32 } from '../../../../utils/crc32';\nimport { IntegrityError } from '../../../../../../errors/IntegrityError';\nimport { getContentType } from '../../../../../../utils/contentType';\nimport { uploadPartExecutor } from './uploadPartExecutor';\nimport { getUploadsCacheKey, removeCachedUpload, serializeUploadOptions, } from './uploadCache';\nimport { getConcurrentUploadsProgressTracker } from './progressTracker';\nimport { loadOrCreateMultipartUpload } from './initialUpload';\nimport { getDataChunker } from './getDataChunker';\nimport { calculatePartSize } from './calculatePartSize';\n/**\n * Create closure hiding the multipart upload implementation details and expose the upload job and control functions(\n * onPause, onResume, onCancel).\n *\n * @internal\n */\nexport const getMultipartUploadHandlers = (uploadDataInput, size) => {\n let resolveCallback;\n let rejectCallback;\n let inProgressUpload;\n let resolvedS3Config;\n let abortController;\n let resolvedAccessLevel;\n let resolvedBucket;\n let resolvedKeyPrefix;\n let resolvedIdentityId;\n let uploadCacheKey;\n let finalKey;\n let expectedBucketOwner;\n // Special flag that differentiates HTTP requests abort error caused by pause() from ones caused by cancel().\n // The former one should NOT cause the upload job to throw, but cancels any pending HTTP requests.\n // This should be replaced by a special abort reason. However,the support of this API is lagged behind.\n let isAbortSignalFromPause = false;\n const { resumableUploadsCache } = uploadDataInput.options ?? {};\n const startUpload = async () => {\n const { options: uploadDataOptions, data } = uploadDataInput;\n const resolvedS3Options = await resolveS3ConfigAndInput(Amplify, uploadDataInput);\n abortController = new AbortController();\n isAbortSignalFromPause = false;\n resolvedS3Config = resolvedS3Options.s3Config;\n resolvedBucket = resolvedS3Options.bucket;\n resolvedIdentityId = resolvedS3Options.identityId;\n expectedBucketOwner = uploadDataOptions?.expectedBucketOwner;\n const { inputType, objectKey } = validateStorageOperationInput(uploadDataInput, resolvedIdentityId);\n const { contentDisposition, contentEncoding, contentType = uploadDataOptions?.contentType ??\n getContentType(data, objectKey) ??\n 'application/octet-stream', metadata, preventOverwrite, onProgress, } = uploadDataOptions ?? {};\n finalKey = objectKey;\n // Resolve \"key\" specific options\n if (inputType === STORAGE_INPUT_KEY) {\n const accessLevel = uploadDataOptions\n ?.accessLevel;\n resolvedKeyPrefix = resolvedS3Options.keyPrefix;\n finalKey = resolvedKeyPrefix + objectKey;\n resolvedAccessLevel = resolveAccessLevel(accessLevel);\n }\n const optionsHash = await calculateContentCRC32(serializeUploadOptions(uploadDataOptions));\n if (!inProgressUpload) {\n const { uploadId, cachedParts, finalCrc32 } = await loadOrCreateMultipartUpload({\n s3Config: resolvedS3Config,\n accessLevel: resolvedAccessLevel,\n bucket: resolvedBucket,\n keyPrefix: resolvedKeyPrefix,\n key: objectKey,\n contentType,\n contentDisposition,\n contentEncoding,\n metadata,\n data,\n size,\n abortSignal: abortController.signal,\n checksumAlgorithm: uploadDataOptions?.checksumAlgorithm,\n optionsHash,\n resumableUploadsCache,\n expectedBucketOwner,\n });\n inProgressUpload = {\n uploadId,\n completedParts: cachedParts,\n finalCrc32,\n };\n }\n uploadCacheKey = size\n ? getUploadsCacheKey({\n file: data instanceof File ? data : undefined,\n accessLevel: resolvedAccessLevel,\n contentType: uploadDataOptions?.contentType,\n bucket: resolvedBucket,\n size,\n key: objectKey,\n optionsHash,\n })\n : undefined;\n const dataChunker = getDataChunker(data, size);\n const completedPartNumberSet = new Set(inProgressUpload.completedParts.map(({ PartNumber }) => PartNumber));\n const onPartUploadCompletion = (partNumber, eTag, crc32) => {\n inProgressUpload?.completedParts.push({\n PartNumber: partNumber,\n ETag: eTag,\n // TODO: crc32 can always be added once RN also has an implementation\n ...(crc32 ? { ChecksumCRC32: crc32 } : {}),\n });\n };\n const concurrentUploadsProgressTracker = getConcurrentUploadsProgressTracker({\n size,\n onProgress,\n });\n const concurrentUploadPartExecutors = [];\n for (let index = 0; index < DEFAULT_QUEUE_SIZE; index++) {\n concurrentUploadPartExecutors.push(uploadPartExecutor({\n dataChunkerGenerator: dataChunker,\n completedPartNumberSet,\n s3Config: resolvedS3Config,\n abortSignal: abortController.signal,\n bucket: resolvedBucket,\n finalKey,\n uploadId: inProgressUpload.uploadId,\n onPartUploadCompletion,\n onProgress: concurrentUploadsProgressTracker.getOnProgressListener(),\n isObjectLockEnabled: resolvedS3Options.isObjectLockEnabled,\n useCRC32Checksum: Boolean(inProgressUpload.finalCrc32),\n expectedBucketOwner,\n }));\n }\n await Promise.all(concurrentUploadPartExecutors);\n validateCompletedParts(inProgressUpload.completedParts, size);\n const { ETag: eTag } = await completeMultipartUpload({\n ...resolvedS3Config,\n abortSignal: abortController.signal,\n userAgentValue: getStorageUserAgentValue(StorageAction.UploadData),\n }, {\n Bucket: resolvedBucket,\n Key: finalKey,\n UploadId: inProgressUpload.uploadId,\n ChecksumCRC32: inProgressUpload.finalCrc32,\n ChecksumType: inProgressUpload.finalCrc32 ? 'FULL_OBJECT' : undefined,\n IfNoneMatch: preventOverwrite ? '*' : undefined,\n MultipartUpload: {\n Parts: sortUploadParts(inProgressUpload.completedParts),\n },\n ExpectedBucketOwner: expectedBucketOwner,\n });\n // If full-object CRC32 checksum is NOT enabled, we need to ensure the upload integrity by making extra HEAD call\n // to verify the uploaded object size.\n if (!inProgressUpload.finalCrc32) {\n const { ContentLength: uploadedObjectSize, $metadata } = await headObject(resolvedS3Config, {\n Bucket: resolvedBucket,\n Key: finalKey,\n ExpectedBucketOwner: expectedBucketOwner,\n });\n if (uploadedObjectSize && uploadedObjectSize !== size) {\n throw new StorageError({\n name: 'Error',\n message: `Upload failed. Expected object size ${size}, but got ${uploadedObjectSize}.`,\n metadata: $metadata,\n });\n }\n }\n if (resumableUploadsCache && uploadCacheKey) {\n await removeCachedUpload(resumableUploadsCache, uploadCacheKey);\n }\n const result = {\n eTag,\n contentType,\n metadata,\n };\n return inputType === STORAGE_INPUT_KEY\n ? { key: objectKey, ...result }\n : { path: objectKey, ...result };\n };\n const startUploadWithResumability = () => startUpload()\n .then(resolveCallback)\n .catch(error => {\n const abortSignal = abortController?.signal;\n if (abortSignal?.aborted && isAbortSignalFromPause) {\n logger.debug('upload paused.');\n }\n else {\n // Uncaught errors should be exposed to the users.\n rejectCallback(error);\n }\n });\n const multipartUploadJob = () => new Promise((resolve, reject) => {\n resolveCallback = resolve;\n rejectCallback = reject;\n startUploadWithResumability();\n });\n const onPause = () => {\n isAbortSignalFromPause = true;\n abortController?.abort();\n };\n const onResume = () => {\n startUploadWithResumability();\n };\n const onCancel = (message) => {\n // 1. abort in-flight API requests\n abortController?.abort(message);\n const cancelUpload = async () => {\n // 2. clear upload cache.\n if (uploadCacheKey && resumableUploadsCache) {\n await removeCachedUpload(resumableUploadsCache, uploadCacheKey);\n }\n // 3. clear multipart upload on server side.\n await abortMultipartUpload(resolvedS3Config, {\n Bucket: resolvedBucket,\n Key: finalKey,\n UploadId: inProgressUpload?.uploadId,\n ExpectedBucketOwner: expectedBucketOwner,\n });\n };\n cancelUpload().catch(e => {\n logger.debug('error when cancelling upload task.', e);\n });\n rejectCallback(\n // Internal error that should not be exposed to the users. They should use isCancelError() to check if\n // the error is caused by cancel().\n new CanceledError(message ? { message } : undefined));\n };\n return {\n multipartUploadJob,\n onPause,\n onResume,\n onCancel,\n };\n};\nconst resolveAccessLevel = (accessLevel) => accessLevel ??\n Amplify.libraryOptions.Storage?.S3?.defaultAccessLevel ??\n DEFAULT_ACCESS_LEVEL;\nconst validateCompletedParts = (completedParts, size) => {\n const partsExpected = Math.ceil(size / calculatePartSize(size));\n const validPartCount = completedParts.length === partsExpected;\n const sorted = sortUploadParts(completedParts);\n const validPartNumbers = sorted.every((part, index) => part.PartNumber === index + 1);\n if (!validPartCount || !validPartNumbers) {\n throw new IntegrityError();\n }\n};\nconst sortUploadParts = (parts) => {\n return [...parts].sort((partA, partB) => partA.PartNumber - partB.PartNumber);\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,7 @@ import '../../../../utils/client/s3data/abortMultipartUpload.mjs';
|
|
|
10
10
|
import '../../../../utils/client/s3data/copyObject.mjs';
|
|
11
11
|
import '../../../../utils/client/s3data/headObject.mjs';
|
|
12
12
|
import '../../../../utils/client/s3data/deleteObject.mjs';
|
|
13
|
+
import '../../../../utils/client/s3data/deleteObjects.mjs';
|
|
13
14
|
import '../../../../../../errors/types/validation.mjs';
|
|
14
15
|
import '@aws-amplify/core/internals/utils';
|
|
15
16
|
import { logger } from '../../../../../../utils/logger.mjs';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploadPartExecutor.mjs","sources":["../../../../../../../../src/providers/s3/apis/internal/uploadData/multipart/uploadPartExecutor.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { uploadPart } from '../../../../utils/client/s3data';\nimport { logger } from '../../../../../../utils';\nimport { calculateContentCRC32 } from '../../../../utils/crc32';\nimport { calculateContentMd5 } from '../../../../utils';\nexport const uploadPartExecutor = async ({ dataChunkerGenerator, completedPartNumberSet, s3Config, abortSignal, bucket, finalKey, uploadId, onPartUploadCompletion, onProgress, isObjectLockEnabled, useCRC32Checksum, expectedBucketOwner, }) => {\n let transferredBytes = 0;\n for (const { data, partNumber, size } of dataChunkerGenerator) {\n if (abortSignal.aborted) {\n logger.debug('upload executor aborted.');\n break;\n }\n if (completedPartNumberSet.has(partNumber)) {\n logger.debug(`part ${partNumber} already uploaded.`);\n transferredBytes += size;\n onProgress?.({\n transferredBytes,\n });\n }\n else {\n // handle cancel error\n let checksumCRC32;\n if (useCRC32Checksum) {\n checksumCRC32 = await calculateContentCRC32(data);\n }\n const contentMD5 = \n // check if checksum exists. ex: should not exist in react native\n !checksumCRC32 && isObjectLockEnabled\n ? await calculateContentMd5(data)\n : undefined;\n const { ETag: eTag } = await uploadPart({\n ...s3Config,\n abortSignal,\n onUploadProgress: (event) => {\n const { transferredBytes: currentPartTransferredBytes } = event;\n onProgress?.({\n transferredBytes: transferredBytes + currentPartTransferredBytes,\n });\n },\n }, {\n Bucket: bucket,\n Key: finalKey,\n UploadId: uploadId,\n Body: data,\n PartNumber: partNumber,\n ChecksumCRC32: checksumCRC32,\n ContentMD5: contentMD5,\n ExpectedBucketOwner: expectedBucketOwner,\n });\n transferredBytes += size;\n // eTag will always be set even the S3 model interface marks it as optional.\n onPartUploadCompletion(partNumber, eTag, checksumCRC32);\n }\n }\n};\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"uploadPartExecutor.mjs","sources":["../../../../../../../../src/providers/s3/apis/internal/uploadData/multipart/uploadPartExecutor.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { uploadPart } from '../../../../utils/client/s3data';\nimport { logger } from '../../../../../../utils';\nimport { calculateContentCRC32 } from '../../../../utils/crc32';\nimport { calculateContentMd5 } from '../../../../utils';\nexport const uploadPartExecutor = async ({ dataChunkerGenerator, completedPartNumberSet, s3Config, abortSignal, bucket, finalKey, uploadId, onPartUploadCompletion, onProgress, isObjectLockEnabled, useCRC32Checksum, expectedBucketOwner, }) => {\n let transferredBytes = 0;\n for (const { data, partNumber, size } of dataChunkerGenerator) {\n if (abortSignal.aborted) {\n logger.debug('upload executor aborted.');\n break;\n }\n if (completedPartNumberSet.has(partNumber)) {\n logger.debug(`part ${partNumber} already uploaded.`);\n transferredBytes += size;\n onProgress?.({\n transferredBytes,\n });\n }\n else {\n // handle cancel error\n let checksumCRC32;\n if (useCRC32Checksum) {\n checksumCRC32 = await calculateContentCRC32(data);\n }\n const contentMD5 = \n // check if checksum exists. ex: should not exist in react native\n !checksumCRC32 && isObjectLockEnabled\n ? await calculateContentMd5(data)\n : undefined;\n const { ETag: eTag } = await uploadPart({\n ...s3Config,\n abortSignal,\n onUploadProgress: (event) => {\n const { transferredBytes: currentPartTransferredBytes } = event;\n onProgress?.({\n transferredBytes: transferredBytes + currentPartTransferredBytes,\n });\n },\n }, {\n Bucket: bucket,\n Key: finalKey,\n UploadId: uploadId,\n Body: data,\n PartNumber: partNumber,\n ChecksumCRC32: checksumCRC32,\n ContentMD5: contentMD5,\n ExpectedBucketOwner: expectedBucketOwner,\n });\n transferredBytes += size;\n // eTag will always be set even the S3 model interface marks it as optional.\n onPartUploadCompletion(partNumber, eTag, checksumCRC32);\n }\n }\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AACA;AAKY,MAAC,kBAAkB,GAAG,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,sBAAsB,EAAE,UAAU,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,mBAAmB,GAAG,KAAK;AAClP,IAAI,IAAI,gBAAgB,GAAG,CAAC;AAC5B,IAAI,KAAK,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,oBAAoB,EAAE;AACnE,QAAQ,IAAI,WAAW,CAAC,OAAO,EAAE;AACjC,YAAY,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC;AACpD,YAAY;AACZ,QAAQ;AACR,QAAQ,IAAI,sBAAsB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;AACpD,YAAY,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,UAAU,CAAC,kBAAkB,CAAC,CAAC;AAChE,YAAY,gBAAgB,IAAI,IAAI;AACpC,YAAY,UAAU,GAAG;AACzB,gBAAgB,gBAAgB;AAChC,aAAa,CAAC;AACd,QAAQ;AACR,aAAa;AACb;AACA,YAAY,IAAI,aAAa;AAC7B,YAAY,IAAI,gBAAgB,EAAE;AAClC,gBAAgB,aAAa,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC;AACjE,YAAY;AACZ,YAAY,MAAM,UAAU;AAC5B;AACA,YAAY,CAAC,aAAa,IAAI;AAC9B,kBAAkB,MAAM,mBAAmB,CAAC,IAAI;AAChD,kBAAkB,SAAS;AAC3B,YAAY,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,UAAU,CAAC;AACpD,gBAAgB,GAAG,QAAQ;AAC3B,gBAAgB,WAAW;AAC3B,gBAAgB,gBAAgB,EAAE,CAAC,KAAK,KAAK;AAC7C,oBAAoB,MAAM,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,GAAG,KAAK;AACnF,oBAAoB,UAAU,GAAG;AACjC,wBAAwB,gBAAgB,EAAE,gBAAgB,GAAG,2BAA2B;AACxF,qBAAqB,CAAC;AACtB,gBAAgB,CAAC;AACjB,aAAa,EAAE;AACf,gBAAgB,MAAM,EAAE,MAAM;AAC9B,gBAAgB,GAAG,EAAE,QAAQ;AAC7B,gBAAgB,QAAQ,EAAE,QAAQ;AAClC,gBAAgB,IAAI,EAAE,IAAI;AAC1B,gBAAgB,UAAU,EAAE,UAAU;AACtC,gBAAgB,aAAa,EAAE,aAAa;AAC5C,gBAAgB,UAAU,EAAE,UAAU;AACtC,gBAAgB,mBAAmB,EAAE,mBAAmB;AACxD,aAAa,CAAC;AACd,YAAY,gBAAgB,IAAI,IAAI;AACpC;AACA,YAAY,sBAAsB,CAAC,UAAU,EAAE,IAAI,EAAE,aAAa,CAAC;AACnE,QAAQ;AACR,IAAI;AACJ;;;;"}
|
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
import { Amplify } from '@aws-amplify/core';
|
|
2
2
|
import { StorageAction } from '@aws-amplify/core/internals/utils';
|
|
3
3
|
import { calculateContentMd5 } from '../../../utils/md5.mjs';
|
|
4
|
-
import { resolveS3ConfigAndInput } from '../../../utils/resolveS3ConfigAndInput.mjs';
|
|
5
|
-
import '../../../../../errors/types/validation.mjs';
|
|
6
|
-
import '../../../../../utils/logger.mjs';
|
|
7
|
-
import { validateBucketOwnerID } from '../../../utils/validateBucketOwnerID.mjs';
|
|
8
|
-
import { validateStorageOperationInput } from '../../../utils/validateStorageOperationInput.mjs';
|
|
9
|
-
import { CHECKSUM_ALGORITHM_CRC32, STORAGE_INPUT_KEY } from '../../../utils/constants.mjs';
|
|
10
4
|
import '../../../utils/client/s3data/base.mjs';
|
|
11
5
|
import '../../../utils/client/s3data/getObject.mjs';
|
|
12
6
|
import '../../../utils/client/s3data/listObjectsV2.mjs';
|
|
@@ -19,7 +13,14 @@ import '../../../utils/client/s3data/abortMultipartUpload.mjs';
|
|
|
19
13
|
import '../../../utils/client/s3data/copyObject.mjs';
|
|
20
14
|
import '../../../utils/client/s3data/headObject.mjs';
|
|
21
15
|
import '../../../utils/client/s3data/deleteObject.mjs';
|
|
16
|
+
import '../../../utils/client/s3data/deleteObjects.mjs';
|
|
22
17
|
import { getStorageUserAgentValue } from '../../../utils/userAgent.mjs';
|
|
18
|
+
import { resolveS3ConfigAndInput } from '../../../utils/resolveS3ConfigAndInput.mjs';
|
|
19
|
+
import { CHECKSUM_ALGORITHM_CRC32, STORAGE_INPUT_KEY } from '../../../utils/constants.mjs';
|
|
20
|
+
import '../../../../../errors/types/validation.mjs';
|
|
21
|
+
import '../../../../../utils/logger.mjs';
|
|
22
|
+
import { validateBucketOwnerID } from '../../../utils/validateBucketOwnerID.mjs';
|
|
23
|
+
import { validateStorageOperationInput } from '../../../utils/validateStorageOperationInput.mjs';
|
|
23
24
|
import { calculateContentCRC32 } from '../../../utils/crc32.mjs';
|
|
24
25
|
import { constructContentDisposition } from '../../../utils/constructContentDisposition.mjs';
|
|
25
26
|
import { getContentType } from '../../../../../utils/contentType.mjs';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"putObjectJob.mjs","sources":["../../../../../../../src/providers/s3/apis/internal/uploadData/putObjectJob.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { Amplify } from '@aws-amplify/core';\nimport { StorageAction } from '@aws-amplify/core/internals/utils';\nimport { calculateContentMd5, resolveS3ConfigAndInput, validateBucketOwnerID, validateStorageOperationInput, } from '../../../utils';\nimport { putObject } from '../../../utils/client/s3data';\nimport { getStorageUserAgentValue } from '../../../utils/userAgent';\nimport { CHECKSUM_ALGORITHM_CRC32, STORAGE_INPUT_KEY, } from '../../../utils/constants';\nimport { calculateContentCRC32 } from '../../../utils/crc32';\nimport { constructContentDisposition } from '../../../utils/constructContentDisposition';\nimport { getContentType } from '../../../../../utils/contentType';\n/**\n * Get a function the returns a promise to call putObject API to S3.\n *\n * @internal\n */\nexport const putObjectJob = (uploadDataInput, abortSignal, totalLength) => async () => {\n const { options: uploadDataOptions, data } = uploadDataInput;\n const { bucket, keyPrefix, s3Config, isObjectLockEnabled, identityId } = await resolveS3ConfigAndInput(Amplify, uploadDataInput);\n const { inputType, objectKey } = validateStorageOperationInput(uploadDataInput, identityId);\n validateBucketOwnerID(uploadDataOptions?.expectedBucketOwner);\n const finalKey = inputType === STORAGE_INPUT_KEY ? keyPrefix + objectKey : objectKey;\n const { contentDisposition, contentEncoding, contentType = uploadDataOptions?.contentType ??\n getContentType(data, objectKey) ??\n 'application/octet-stream', preventOverwrite, metadata, checksumAlgorithm, onProgress, expectedBucketOwner, cacheControl, } = uploadDataOptions ?? {};\n const checksumCRC32 = checksumAlgorithm === CHECKSUM_ALGORITHM_CRC32\n ? await calculateContentCRC32(data)\n : undefined;\n const contentMD5 = \n // check if checksum exists. ex: should not exist in react native\n !checksumCRC32 && isObjectLockEnabled\n ? await calculateContentMd5(data)\n : undefined;\n const { ETag: eTag, VersionId: versionId } = await putObject({\n ...s3Config,\n abortSignal,\n onUploadProgress: onProgress,\n userAgentValue: getStorageUserAgentValue(StorageAction.UploadData),\n }, {\n Bucket: bucket,\n Key: finalKey,\n Body: data,\n ContentType: contentType,\n ContentDisposition: constructContentDisposition(contentDisposition),\n ContentEncoding: contentEncoding,\n CacheControl: cacheControl,\n Metadata: metadata,\n ContentMD5: contentMD5,\n ChecksumCRC32: checksumCRC32,\n ExpectedBucketOwner: expectedBucketOwner,\n IfNoneMatch: preventOverwrite ? '*' : undefined,\n });\n const result = {\n eTag,\n versionId,\n contentType,\n metadata,\n size: totalLength,\n };\n return inputType === STORAGE_INPUT_KEY\n ? { key: objectKey, ...result }\n : { path: objectKey, ...result };\n};\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"putObjectJob.mjs","sources":["../../../../../../../src/providers/s3/apis/internal/uploadData/putObjectJob.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { Amplify } from '@aws-amplify/core';\nimport { StorageAction } from '@aws-amplify/core/internals/utils';\nimport { calculateContentMd5, resolveS3ConfigAndInput, validateBucketOwnerID, validateStorageOperationInput, } from '../../../utils';\nimport { putObject } from '../../../utils/client/s3data';\nimport { getStorageUserAgentValue } from '../../../utils/userAgent';\nimport { CHECKSUM_ALGORITHM_CRC32, STORAGE_INPUT_KEY, } from '../../../utils/constants';\nimport { calculateContentCRC32 } from '../../../utils/crc32';\nimport { constructContentDisposition } from '../../../utils/constructContentDisposition';\nimport { getContentType } from '../../../../../utils/contentType';\n/**\n * Get a function the returns a promise to call putObject API to S3.\n *\n * @internal\n */\nexport const putObjectJob = (uploadDataInput, abortSignal, totalLength) => async () => {\n const { options: uploadDataOptions, data } = uploadDataInput;\n const { bucket, keyPrefix, s3Config, isObjectLockEnabled, identityId } = await resolveS3ConfigAndInput(Amplify, uploadDataInput);\n const { inputType, objectKey } = validateStorageOperationInput(uploadDataInput, identityId);\n validateBucketOwnerID(uploadDataOptions?.expectedBucketOwner);\n const finalKey = inputType === STORAGE_INPUT_KEY ? keyPrefix + objectKey : objectKey;\n const { contentDisposition, contentEncoding, contentType = uploadDataOptions?.contentType ??\n getContentType(data, objectKey) ??\n 'application/octet-stream', preventOverwrite, metadata, checksumAlgorithm, onProgress, expectedBucketOwner, cacheControl, } = uploadDataOptions ?? {};\n const checksumCRC32 = checksumAlgorithm === CHECKSUM_ALGORITHM_CRC32\n ? await calculateContentCRC32(data)\n : undefined;\n const contentMD5 = \n // check if checksum exists. ex: should not exist in react native\n !checksumCRC32 && isObjectLockEnabled\n ? await calculateContentMd5(data)\n : undefined;\n const { ETag: eTag, VersionId: versionId } = await putObject({\n ...s3Config,\n abortSignal,\n onUploadProgress: onProgress,\n userAgentValue: getStorageUserAgentValue(StorageAction.UploadData),\n }, {\n Bucket: bucket,\n Key: finalKey,\n Body: data,\n ContentType: contentType,\n ContentDisposition: constructContentDisposition(contentDisposition),\n ContentEncoding: contentEncoding,\n CacheControl: cacheControl,\n Metadata: metadata,\n ContentMD5: contentMD5,\n ChecksumCRC32: checksumCRC32,\n ExpectedBucketOwner: expectedBucketOwner,\n IfNoneMatch: preventOverwrite ? '*' : undefined,\n });\n const result = {\n eTag,\n versionId,\n contentType,\n metadata,\n size: totalLength,\n };\n return inputType === STORAGE_INPUT_KEY\n ? { key: objectKey, ...result }\n : { path: objectKey, ...result };\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AAUA;AACA;AACA;AACA;AACA;AACY,MAAC,YAAY,GAAG,CAAC,eAAe,EAAE,WAAW,EAAE,WAAW,KAAK,YAAY;AACvF,IAAI,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,GAAG,eAAe;AAChE,IAAI,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,mBAAmB,EAAE,UAAU,EAAE,GAAG,MAAM,uBAAuB,CAAC,OAAO,EAAE,eAAe,CAAC;AACpI,IAAI,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,6BAA6B,CAAC,eAAe,EAAE,UAAU,CAAC;AAC/F,IAAI,qBAAqB,CAAC,iBAAiB,EAAE,mBAAmB,CAAC;AACjE,IAAI,MAAM,QAAQ,GAAG,SAAS,KAAK,iBAAiB,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS;AACxF,IAAI,MAAM,EAAE,kBAAkB,EAAE,eAAe,EAAE,WAAW,GAAG,iBAAiB,EAAE,WAAW;AAC7F,QAAQ,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC;AACvC,QAAQ,0BAA0B,EAAE,gBAAgB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,UAAU,EAAE,mBAAmB,EAAE,YAAY,GAAG,GAAG,iBAAiB,IAAI,EAAE;AAC7J,IAAI,MAAM,aAAa,GAAG,iBAAiB,KAAK;AAChD,UAAU,MAAM,qBAAqB,CAAC,IAAI;AAC1C,UAAU,SAAS;AACnB,IAAI,MAAM,UAAU;AACpB;AACA,IAAI,CAAC,aAAa,IAAI;AACtB,UAAU,MAAM,mBAAmB,CAAC,IAAI;AACxC,UAAU,SAAS;AACnB,IAAI,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,MAAM,SAAS,CAAC;AACjE,QAAQ,GAAG,QAAQ;AACnB,QAAQ,WAAW;AACnB,QAAQ,gBAAgB,EAAE,UAAU;AACpC,QAAQ,cAAc,EAAE,wBAAwB,CAAC,aAAa,CAAC,UAAU,CAAC;AAC1E,KAAK,EAAE;AACP,QAAQ,MAAM,EAAE,MAAM;AACtB,QAAQ,GAAG,EAAE,QAAQ;AACrB,QAAQ,IAAI,EAAE,IAAI;AAClB,QAAQ,WAAW,EAAE,WAAW;AAChC,QAAQ,kBAAkB,EAAE,2BAA2B,CAAC,kBAAkB,CAAC;AAC3E,QAAQ,eAAe,EAAE,eAAe;AACxC,QAAQ,YAAY,EAAE,YAAY;AAClC,QAAQ,QAAQ,EAAE,QAAQ;AAC1B,QAAQ,UAAU,EAAE,UAAU;AAC9B,QAAQ,aAAa,EAAE,aAAa;AACpC,QAAQ,mBAAmB,EAAE,mBAAmB;AAChD,QAAQ,WAAW,EAAE,gBAAgB,GAAG,GAAG,GAAG,SAAS;AACvD,KAAK,CAAC;AACN,IAAI,MAAM,MAAM,GAAG;AACnB,QAAQ,IAAI;AACZ,QAAQ,SAAS;AACjB,QAAQ,WAAW;AACnB,QAAQ,QAAQ;AAChB,QAAQ,IAAI,EAAE,WAAW;AACzB,KAAK;AACL,IAAI,OAAO,SAAS,KAAK;AACzB,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,MAAM;AACrC,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE;AACxC;;;;"}
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
import { RemoveInput, RemoveOutput, RemoveWithPathInput, RemoveWithPathOutput } from '../types';
|
|
1
|
+
import { RemoveInput, RemoveOperation, RemoveOutput, RemoveWithPathInput, RemoveWithPathOutput } from '../types';
|
|
2
2
|
/**
|
|
3
|
-
* Remove a file from your S3 bucket.
|
|
3
|
+
* Remove a file or folder from your S3 bucket.
|
|
4
4
|
* @param input - The `RemoveWithPathInput` object.
|
|
5
|
-
* @return
|
|
5
|
+
* @return Operation handle with result promise and cancellation capability.
|
|
6
6
|
* @throws service: `S3Exception` - S3 service errors thrown while while removing the object.
|
|
7
7
|
* @throws validation: `StorageValidationErrorCode` - Validation errors thrown
|
|
8
8
|
* when there is no path or path is empty or path has a leading slash.
|
|
9
9
|
*/
|
|
10
|
-
export declare function remove(input: RemoveWithPathInput):
|
|
10
|
+
export declare function remove(input: RemoveWithPathInput): RemoveOperation<RemoveWithPathOutput>;
|
|
11
11
|
/**
|
|
12
12
|
* @deprecated The `key` and `accessLevel` parameters are deprecated and may be removed in the next major version.
|
|
13
13
|
* Please use {@link https://docs.amplify.aws/react/build-a-backend/storage/remove | path} instead.
|
|
14
14
|
*
|
|
15
15
|
* Remove a file from your S3 bucket.
|
|
16
16
|
* @param input - The `RemoveInput` object.
|
|
17
|
-
* @return
|
|
17
|
+
* @return Operation handle with result promise and cancellation capability.
|
|
18
18
|
* @throws service: `S3Exception` - S3 service errors thrown while while removing the object
|
|
19
19
|
* @throws validation: `StorageValidationErrorCode` - Validation errors thrown
|
|
20
20
|
* when there is no key or its empty.
|
|
21
21
|
*/
|
|
22
|
-
export declare function remove(input: RemoveInput):
|
|
22
|
+
export declare function remove(input: RemoveInput): RemoveOperation<RemoveOutput>;
|
|
@@ -4,7 +4,12 @@ import { remove as remove$1 } from './internal/remove.mjs';
|
|
|
4
4
|
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
5
5
|
// SPDX-License-Identifier: Apache-2.0
|
|
6
6
|
function remove(input) {
|
|
7
|
-
|
|
7
|
+
if ('key' in input) {
|
|
8
|
+
return remove$1(Amplify, input);
|
|
9
|
+
}
|
|
10
|
+
else {
|
|
11
|
+
return remove$1(Amplify, input);
|
|
12
|
+
}
|
|
8
13
|
}
|
|
9
14
|
|
|
10
15
|
export { remove };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remove.mjs","sources":["../../../../../src/providers/s3/apis/remove.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { Amplify } from '@aws-amplify/core';\nimport { remove as removeInternal } from './internal/remove';\nexport function remove(input) {\n return removeInternal(Amplify, input);\n}\n"],"names":["removeInternal"],"mappings":";;;AAAA;AACA;AAGO,SAAS,MAAM,CAAC,KAAK,EAAE;AAC9B,IAAI,OAAOA,QAAc,CAAC,OAAO,EAAE,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"remove.mjs","sources":["../../../../../src/providers/s3/apis/remove.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { Amplify } from '@aws-amplify/core';\nimport { remove as removeInternal } from './internal/remove';\nexport function remove(input) {\n if ('key' in input) {\n return removeInternal(Amplify, input);\n }\n else {\n return removeInternal(Amplify, input);\n }\n}\n"],"names":["removeInternal"],"mappings":";;;AAAA;AACA;AAGO,SAAS,MAAM,CAAC,KAAK,EAAE;AAC9B,IAAI,IAAI,KAAK,IAAI,KAAK,EAAE;AACxB,QAAQ,OAAOA,QAAc,CAAC,OAAO,EAAE,KAAK,CAAC;AAC7C,IAAI;AACJ,SAAS;AACT,QAAQ,OAAOA,QAAc,CAAC,OAAO,EAAE,KAAK,CAAC;AAC7C,IAAI;AACJ;;;;"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { AmplifyServer } from '@aws-amplify/core/internals/adapter-core';
|
|
2
|
-
import { RemoveInput, RemoveOutput, RemoveWithPathInput, RemoveWithPathOutput } from '../../types';
|
|
2
|
+
import { RemoveInput, RemoveOperation, RemoveOutput, RemoveWithPathInput, RemoveWithPathOutput } from '../../types';
|
|
3
3
|
/**
|
|
4
|
-
* Remove a file from your S3 bucket.
|
|
4
|
+
* Remove a file or folder from your S3 bucket.
|
|
5
5
|
* @param input - The `RemoveWithPathInput` object.
|
|
6
6
|
* @param contextSpec - The context spec used to get the Amplify server context.
|
|
7
|
-
* @return
|
|
7
|
+
* @return Operation handle with result promise and cancellation capability.
|
|
8
8
|
* @throws service: `S3Exception` - S3 service errors thrown while while removing the object.
|
|
9
9
|
* @throws validation: `StorageValidationErrorCode` - Validation errors thrown
|
|
10
10
|
* when there is no path or path is empty or path has a leading slash.
|
|
11
11
|
*/
|
|
12
|
-
export declare function remove(contextSpec: AmplifyServer.ContextSpec, input: RemoveWithPathInput):
|
|
12
|
+
export declare function remove(contextSpec: AmplifyServer.ContextSpec, input: RemoveWithPathInput): RemoveOperation<RemoveWithPathOutput>;
|
|
13
13
|
/**
|
|
14
14
|
* @deprecated The `key` and `accessLevel` parameters are deprecated and may be removed in the next major version.
|
|
15
15
|
* Please use {@link https://docs.amplify.aws/react/build-a-backend/storage/remove | path} instead.
|
|
@@ -17,9 +17,9 @@ export declare function remove(contextSpec: AmplifyServer.ContextSpec, input: Re
|
|
|
17
17
|
* Remove a file from your S3 bucket.
|
|
18
18
|
* @param input - The `RemoveInput` object.
|
|
19
19
|
* @param contextSpec - The context spec used to get the Amplify server context.
|
|
20
|
-
* @return
|
|
20
|
+
* @return Operation handle with result promise and cancellation capability.
|
|
21
21
|
* @throws service: `S3Exception` - S3 service errors thrown while while removing the object
|
|
22
22
|
* @throws validation: `StorageValidationErrorCode` - Validation errors thrown
|
|
23
23
|
* when there is no key or its empty.
|
|
24
24
|
*/
|
|
25
|
-
export declare function remove(contextSpec: AmplifyServer.ContextSpec, input: RemoveInput):
|
|
25
|
+
export declare function remove(contextSpec: AmplifyServer.ContextSpec, input: RemoveInput): RemoveOperation<RemoveOutput>;
|
|
@@ -4,7 +4,12 @@ import { remove as remove$1 } from '../internal/remove.mjs';
|
|
|
4
4
|
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
5
5
|
// SPDX-License-Identifier: Apache-2.0
|
|
6
6
|
function remove(contextSpec, input) {
|
|
7
|
-
|
|
7
|
+
if ('key' in input) {
|
|
8
|
+
return remove$1(getAmplifyServerContext(contextSpec).amplify, input);
|
|
9
|
+
}
|
|
10
|
+
else {
|
|
11
|
+
return remove$1(getAmplifyServerContext(contextSpec).amplify, input);
|
|
12
|
+
}
|
|
8
13
|
}
|
|
9
14
|
|
|
10
15
|
export { remove };
|