UNPKG

@aws-amplify/storage

Version:

Storage category of aws-amplify

81 lines (79 loc) 3.27 kB
'use strict'; // 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