@aws-amplify/storage
Version:
Storage category of aws-amplify
81 lines (79 loc) • 3.27 kB
JavaScript
;
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
Object.defineProperty(exports, "__esModule", { value: true });
exports.deleteFolderContents = void 0;
const utils_1 = require("@aws-amplify/core/internals/utils");
const CanceledError_1 = require("../../../errors/CanceledError");
const s3data_1 = require("./client/s3data");
const userAgent_1 = require("./userAgent");
const MAX_KEYS_PER_BATCH = 1000;
/**
* Deletes all contents of a folder in S3 using batch operations
*
* @param params - Configuration object for the delete operation
* @returns Promise that resolves to the removal result
*/
const deleteFolderContents = async (params) => {
const { s3Config, bucket, folderKey, expectedBucketOwner, onProgress, abortSignal, } = params;
try {
const prefix = folderKey.endsWith('/') ? folderKey : `${folderKey}/`;
const progressCallback = onProgress ??
(() => {
// no-op
});
let continuationToken;
do {
if (abortSignal?.aborted) {
throw new CanceledError_1.CanceledError({ message: 'Operation was canceled' });
}
const listResult = await (0, s3data_1.listObjectsV2)({
...s3Config,
userAgentValue: (0, userAgent_1.getStorageUserAgentValue)(utils_1.StorageAction.Remove),
abortSignal,
}, {
Bucket: bucket,
Prefix: prefix,
MaxKeys: MAX_KEYS_PER_BATCH,
ContinuationToken: continuationToken,
ExpectedBucketOwner: expectedBucketOwner,
});
if (!listResult.Contents || listResult.Contents.length === 0) {
break;
}
if (abortSignal?.aborted) {
throw new CanceledError_1.CanceledError({ message: 'Operation was canceled' });
}
const batch = listResult.Contents.map(obj => ({ Key: obj.Key }));
const deleteResult = await (0, s3data_1.deleteObjects)({
...s3Config,
userAgentValue: (0, userAgent_1.getStorageUserAgentValue)(utils_1.StorageAction.Remove),
abortSignal,
}, {
Bucket: bucket,
Delete: {
Objects: batch,
Quiet: false,
},
ExpectedBucketOwner: expectedBucketOwner,
});
const deleted = deleteResult.Deleted?.map(obj => ({ path: obj.Key })) || [];
const failed = deleteResult.Errors?.map(err => ({
path: err.Key,
code: err.Code,
message: err.Message,
})) || [];
progressCallback({ deleted, failed });
continuationToken = listResult.NextContinuationToken;
} while (continuationToken);
return { path: folderKey };
}
catch (error) {
if (abortSignal?.aborted) {
throw new CanceledError_1.CanceledError({ message: 'Operation was canceled' });
}
throw error;
}
};
exports.deleteFolderContents = deleteFolderContents;
//# sourceMappingURL=deleteFolderContents.js.map