UNPKG

@aws-amplify/storage

Version:

Storage category of aws-amplify

188 lines (185 loc) • 7.25 kB
import { StorageAction } from '@aws-amplify/core/internals/utils'; import '@smithy/md5-js'; import '@aws-amplify/core/internals/aws-client-utils'; import '../../utils/client/runtime/s3TransferHandler/fetch.mjs'; import 'fast-xml-parser'; import '../../utils/client/runtime/s3TransferHandler/xhr.mjs'; import 'buffer'; import { resolveS3ConfigAndInput } from '../../utils/resolveS3ConfigAndInput.mjs'; import '../../../../errors/types/validation.mjs'; import { logger } from '../../../../utils/logger.mjs'; import { DEFAULT_DELIMITER, STORAGE_INPUT_PREFIX } from '../../utils/constants.mjs'; import { validateStorageOperationInputWithPrefix } from '../../utils/validateStorageOperationInputWithPrefix.mjs'; import '../../utils/client/base.mjs'; import '../../utils/client/getObject.mjs'; import { listObjectsV2 } from '../../utils/client/listObjectsV2.mjs'; import '../../utils/client/putObject.mjs'; import '../../utils/client/createMultipartUpload.mjs'; import '../../utils/client/uploadPart.mjs'; import '../../utils/client/completeMultipartUpload.mjs'; import '../../utils/client/listParts.mjs'; import '../../utils/client/abortMultipartUpload.mjs'; import '../../utils/client/copyObject.mjs'; import '../../utils/client/headObject.mjs'; import '../../utils/client/deleteObject.mjs'; import { getStorageUserAgentValue } from '../../utils/userAgent.mjs'; // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 const MAX_PAGE_SIZE = 1000; const list = async (amplify, input) => { const { options = {} } = input; const { s3Config, bucket, keyPrefix: generatedPrefix, identityId, } = await resolveS3ConfigAndInput(amplify, options); const { inputType, objectKey } = validateStorageOperationInputWithPrefix(input, identityId); const isInputWithPrefix = inputType === STORAGE_INPUT_PREFIX; // @ts-expect-error pageSize and nextToken should not coexist with listAll if (options?.listAll && (options?.pageSize || options?.nextToken)) { const anyOptions = options; logger.debug(`listAll is set to true, ignoring ${anyOptions?.pageSize ? `pageSize: ${anyOptions?.pageSize}` : ''} ${anyOptions?.nextToken ? `nextToken: ${anyOptions?.nextToken}` : ''}.`); } const listParams = { Bucket: bucket, Prefix: isInputWithPrefix ? `${generatedPrefix}${objectKey}` : objectKey, MaxKeys: options?.listAll ? undefined : options?.pageSize, ContinuationToken: options?.listAll ? undefined : options?.nextToken, Delimiter: getDelimiter(options), }; logger.debug(`listing items from "${listParams.Prefix}"`); const listInputArgs = { s3Config, listParams, }; if (options.listAll) { if (isInputWithPrefix) { return _listAllWithPrefix({ ...listInputArgs, generatedPrefix, }); } else { return _listAllWithPath(listInputArgs); } } else { if (isInputWithPrefix) { return _listWithPrefix({ ...listInputArgs, generatedPrefix }); } else { return _listWithPath(listInputArgs); } } }; /** @deprecated Use {@link _listAllWithPath} instead. */ const _listAllWithPrefix = async ({ s3Config, listParams, generatedPrefix, }) => { const listResult = []; let continuationToken = listParams.ContinuationToken; do { const { items: pageResults, nextToken: pageNextToken } = await _listWithPrefix({ generatedPrefix, s3Config, listParams: { ...listParams, ContinuationToken: continuationToken, MaxKeys: MAX_PAGE_SIZE, }, }); listResult.push(...pageResults); continuationToken = pageNextToken; } while (continuationToken); return { items: listResult, }; }; /** @deprecated Use {@link _listWithPath} instead. */ const _listWithPrefix = async ({ s3Config, listParams, generatedPrefix, }) => { const listParamsClone = { ...listParams }; if (!listParamsClone.MaxKeys || listParamsClone.MaxKeys > MAX_PAGE_SIZE) { logger.debug(`defaulting pageSize to ${MAX_PAGE_SIZE}.`); listParamsClone.MaxKeys = MAX_PAGE_SIZE; } const response = await listObjectsV2({ ...s3Config, userAgentValue: getStorageUserAgentValue(StorageAction.List), }, listParamsClone); if (!response?.Contents) { return { items: [], }; } return { items: response.Contents.map(item => ({ key: generatedPrefix ? item.Key.substring(generatedPrefix.length) : item.Key, eTag: item.ETag, lastModified: item.LastModified, size: item.Size, })), nextToken: response.NextContinuationToken, }; }; const _listAllWithPath = async ({ s3Config, listParams, }) => { const listResult = []; const excludedSubpaths = []; let continuationToken = listParams.ContinuationToken; do { const { items: pageResults, excludedSubpaths: pageExcludedSubpaths, nextToken: pageNextToken, } = await _listWithPath({ s3Config, listParams: { ...listParams, ContinuationToken: continuationToken, MaxKeys: MAX_PAGE_SIZE, }, }); listResult.push(...pageResults); excludedSubpaths.push(...(pageExcludedSubpaths ?? [])); continuationToken = pageNextToken; } while (continuationToken); return { items: listResult, excludedSubpaths, }; }; const _listWithPath = async ({ s3Config, listParams, }) => { const listParamsClone = { ...listParams }; if (!listParamsClone.MaxKeys || listParamsClone.MaxKeys > MAX_PAGE_SIZE) { logger.debug(`defaulting pageSize to ${MAX_PAGE_SIZE}.`); listParamsClone.MaxKeys = MAX_PAGE_SIZE; } const { Contents: contents, NextContinuationToken: nextContinuationToken, CommonPrefixes: commonPrefixes, } = await listObjectsV2({ ...s3Config, userAgentValue: getStorageUserAgentValue(StorageAction.List), }, listParamsClone); const excludedSubpaths = commonPrefixes && mapCommonPrefixesToExcludedSubpaths(commonPrefixes); if (!contents) { return { items: [], nextToken: nextContinuationToken, excludedSubpaths, }; } return { items: contents.map(item => ({ path: item.Key, eTag: item.ETag, lastModified: item.LastModified, size: item.Size, })), nextToken: nextContinuationToken, excludedSubpaths, }; }; const mapCommonPrefixesToExcludedSubpaths = (commonPrefixes) => { return commonPrefixes.reduce((mappedSubpaths, { Prefix }) => { if (Prefix) { mappedSubpaths.push(Prefix); } return mappedSubpaths; }, []); }; const getDelimiter = (options) => { if (options?.subpathStrategy?.strategy === 'exclude') { return options?.subpathStrategy?.delimiter ?? DEFAULT_DELIMITER; } }; export { list }; //# sourceMappingURL=list.mjs.map