UNPKG

@aws-amplify/storage

Version:

Storage category of aws-amplify

106 lines (103 loc) 4.57 kB
import { parseMetadata } from '@aws-amplify/core/internals/aws-client-utils'; import { AmplifyUrl, AmplifyUrlSearchParams } from '@aws-amplify/core/internals/utils'; import { composeServiceApi } from '@aws-amplify/core/internals/aws-client-utils/composers'; import { parseXmlBody } from '../utils/parsePayload.mjs'; import { s3TransferHandler } from '../runtime/s3TransferHandler/fetch.mjs'; import 'fast-xml-parser'; import '../runtime/s3TransferHandler/xhr.mjs'; import 'buffer'; import { buildStorageServiceError, map, deserializeNumber, deserializeBoolean, emptyArrayGuard, deserializeTimestamp } from '../utils/deserializeHelpers.mjs'; import { assignStringVariables } from '../utils/serializeHelpers.mjs'; import { IntegrityError } from '../../../../../errors/IntegrityError.mjs'; import { defaultConfig, parseXmlError } from './base.mjs'; // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 const listObjectsV2Serializer = (input, endpoint) => { const headers = assignStringVariables({ 'x-amz-request-payer': input.RequestPayer, 'x-amz-expected-bucket-owner': input.ExpectedBucketOwner, }); const query = assignStringVariables({ 'list-type': '2', 'continuation-token': input.ContinuationToken, delimiter: input.Delimiter, 'encoding-type': input.EncodingType, 'fetch-owner': input.FetchOwner, 'max-keys': input.MaxKeys, prefix: input.Prefix, 'start-after': input.StartAfter, }); const url = new AmplifyUrl(endpoint.url.toString()); url.search = new AmplifyUrlSearchParams(query).toString(); return { method: 'GET', headers, url, }; }; const listObjectsV2Deserializer = async (response) => { if (response.statusCode >= 300) { // error is always set when statusCode >= 300 throw buildStorageServiceError((await parseXmlError(response))); } else { const parsed = await parseXmlBody(response); const contents = map(parsed, { CommonPrefixes: [ 'CommonPrefixes', value => emptyArrayGuard(value, deserializeCommonPrefixList), ], Contents: [ 'Contents', value => emptyArrayGuard(value, deserializeObjectList), ], ContinuationToken: 'ContinuationToken', Delimiter: 'Delimiter', EncodingType: 'EncodingType', IsTruncated: ['IsTruncated', deserializeBoolean], KeyCount: ['KeyCount', deserializeNumber], MaxKeys: ['MaxKeys', deserializeNumber], Name: 'Name', NextContinuationToken: 'NextContinuationToken', Prefix: 'Prefix', StartAfter: 'StartAfter', }); const output = { $metadata: parseMetadata(response), ...contents, }; validateCorroboratingElements(output); return output; } }; const deserializeCommonPrefixList = (output) => output.map(deserializeCommonPrefix); const deserializeCommonPrefix = (output) => map(output, { Prefix: 'Prefix', }); const deserializeObjectList = (output) => output.map(deserializeObject); const deserializeObject = (output) => map(output, { Key: 'Key', LastModified: ['LastModified', deserializeTimestamp], ETag: 'ETag', ChecksumAlgorithm: [ 'ChecksumAlgorithm', value => emptyArrayGuard(value, deserializeChecksumAlgorithmList), ], Size: ['Size', deserializeNumber], StorageClass: 'StorageClass', Owner: ['Owner', deserializeOwner], }); const deserializeChecksumAlgorithmList = (output) => output.map(entry => String(entry)); const deserializeOwner = (output) => map(output, { DisplayName: 'DisplayName', ID: 'ID' }); const validateCorroboratingElements = (response) => { const { IsTruncated, KeyCount, Contents = [], CommonPrefixes = [], NextContinuationToken, } = response; const validTruncation = (IsTruncated && !!NextContinuationToken) || (!IsTruncated && !NextContinuationToken); const validNumberOfKeysReturned = KeyCount === Contents.length + CommonPrefixes.length; if (!validTruncation || !validNumberOfKeysReturned) { throw new IntegrityError({ metadata: response.$metadata }); } }; const listObjectsV2 = composeServiceApi(s3TransferHandler, listObjectsV2Serializer, listObjectsV2Deserializer, { ...defaultConfig, responseType: 'text' }); export { listObjectsV2 }; //# sourceMappingURL=listObjectsV2.mjs.map