UNPKG

@aws-amplify/storage

Version:

Storage category of aws-amplify

1 lines 9.85 kB
{"version":3,"file":"completeMultipartUpload.mjs","sources":["../../../../../../../src/providers/s3/utils/client/s3data/completeMultipartUpload.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { parseMetadata, } from '@aws-amplify/core/internals/aws-client-utils';\nimport { AmplifyUrl, AmplifyUrlSearchParams, } from '@aws-amplify/core/internals/utils';\nimport { composeServiceApi } from '@aws-amplify/core/internals/aws-client-utils/composers';\nimport { assignStringVariables, buildStorageServiceError, map, parseXmlBody, s3TransferHandler, serializePathnameObjectKey, validateS3RequiredParameter, } from '../utils';\nimport { validateObjectUrl } from '../../validateObjectUrl';\nimport { validateMultipartUploadXML } from '../../validateMultipartUploadXML';\nimport { defaultConfig, parseXmlError, retryDecider } from './base';\nconst INVALID_PARAMETER_ERROR_MSG = 'Invalid parameter for CompleteMultipartUpload API';\nconst MISSING_ETAG_ERROR_MSG = 'ETag missing from multipart upload';\nconst MISSING_ETAG_ERROR_SUGGESTION = 'Please ensure S3 bucket CORS configuration includes ETag as part of its `ExposeHeaders` element';\nconst completeMultipartUploadSerializer = async (input, endpoint) => {\n const headers = {\n 'content-type': 'application/xml',\n ...assignStringVariables({\n 'x-amz-checksum-crc32': input.ChecksumCRC32,\n 'x-amz-expected-bucket-owner': input.ExpectedBucketOwner,\n 'If-None-Match': input.IfNoneMatch,\n }),\n };\n const url = new AmplifyUrl(endpoint.url.toString());\n validateS3RequiredParameter(!!input.Key, 'Key');\n url.pathname = serializePathnameObjectKey(url, input.Key);\n validateS3RequiredParameter(!!input.UploadId, 'UploadId');\n url.search = new AmplifyUrlSearchParams({\n uploadId: input.UploadId,\n }).toString();\n validateS3RequiredParameter(!!input.MultipartUpload, 'MultipartUpload');\n validateObjectUrl({\n bucketName: input.Bucket,\n key: input.Key,\n objectURL: url,\n });\n const xml = serializeCompletedMultipartUpload(input.MultipartUpload);\n validateMultipartUploadXML(input.MultipartUpload, xml);\n return {\n method: 'POST',\n headers,\n url,\n body: '<?xml version=\"1.0\" encoding=\"UTF-8\"?>' + xml,\n };\n};\nconst serializeCompletedMultipartUpload = (input) => {\n if (!input.Parts?.length) {\n throw new Error(`${INVALID_PARAMETER_ERROR_MSG}: ${JSON.stringify(input)}`);\n }\n return `<CompleteMultipartUpload xmlns=\"http://s3.amazonaws.com/doc/2006-03-01/\">${input.Parts.map(serializeCompletedPartList).join('')}</CompleteMultipartUpload>`;\n};\nconst serializeCompletedPartList = (input) => {\n if (input.PartNumber == null) {\n throw new Error(`${INVALID_PARAMETER_ERROR_MSG}: ${JSON.stringify(input)}`);\n }\n if (!input.ETag) {\n throw new Error(`${MISSING_ETAG_ERROR_MSG}: ${JSON.stringify(input)}. ${MISSING_ETAG_ERROR_SUGGESTION}`);\n }\n const eTag = `<ETag>${input.ETag}</ETag>`;\n const partNumber = `<PartNumber>${input.PartNumber}</PartNumber>`;\n const checksumCRC32 = input.ChecksumCRC32\n ? `<ChecksumCRC32>${input.ChecksumCRC32}</ChecksumCRC32>`\n : '';\n return `<Part>${eTag}${partNumber}${checksumCRC32}</Part>`;\n};\n/**\n * Parse CompleteMultipartUpload API response payload, which may be empty or error indicating internal\n * server error, even when the status code is 200.\n *\n * Ref: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html#API_CompleteMultipartUpload_Example_4\n */\nconst parseXmlBodyOrThrow = async (response) => {\n const parsed = await parseXmlBody(response); // Handles empty body case\n if (parsed.Code !== undefined && parsed.Message !== undefined) {\n const error = await parseXmlError({\n ...response,\n statusCode: 500, // To workaround the >=300 status code check common to other APIs.\n });\n error.$metadata.httpStatusCode = response.statusCode;\n throw buildStorageServiceError(error);\n }\n return parsed;\n};\nconst completeMultipartUploadDeserializer = async (response) => {\n if (response.statusCode >= 300) {\n // error is always set when statusCode >= 300\n throw buildStorageServiceError((await parseXmlError(response)));\n }\n else {\n const parsed = await parseXmlBodyOrThrow(response);\n const contents = map(parsed, {\n ETag: 'ETag',\n Key: 'Key',\n Location: 'Location',\n });\n return {\n $metadata: parseMetadata(response),\n ...contents,\n };\n }\n};\n// CompleteMultiPartUpload API returns 200 status code with empty body or error message.\n// This indicates internal server error after the response has been sent to the client.\n// Ref: https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html#API_CompleteMultipartUpload_Example_4\nconst retryWhenErrorWith200StatusCode = async (response, error, middlewareContext) => {\n if (!response) {\n return { retryable: false };\n }\n if (response.statusCode === 200) {\n if (!response.body) {\n return { retryable: true };\n }\n const parsed = await parseXmlBody(response);\n if (parsed.Code !== undefined && parsed.Message !== undefined) {\n return { retryable: true };\n }\n return { retryable: false };\n }\n return retryDecider(response, error, middlewareContext);\n};\nexport const completeMultipartUpload = composeServiceApi(s3TransferHandler, completeMultipartUploadSerializer, completeMultipartUploadDeserializer, {\n ...defaultConfig,\n responseType: 'text',\n retryDecider: retryWhenErrorWith200StatusCode,\n});\n"],"names":[],"mappings":"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"}