{"version":3,"file":"uploadHandlers.mjs","sources":["../../../../../../../src/providers/s3/apis/uploadData/multipart/uploadHandlers.ts"],"sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { Amplify } from '@aws-amplify/core';\nimport { StorageAction } from '@aws-amplify/core/internals/utils';\nimport { getDataChunker } from './getDataChunker';\nimport { resolveS3ConfigAndInput } from '../../../utils';\nimport { DEFAULT_ACCESS_LEVEL, DEFAULT_QUEUE_SIZE, } from '../../../utils/constants';\nimport { loadOrCreateMultipartUpload } from './initialUpload';\nimport { getConcurrentUploadsProgressTracker } from './progressTracker';\nimport { getUploadsCacheKey, removeCachedUpload } from './uploadCache';\nimport { uploadPartExecutor } from './uploadPartExecutor';\nimport { StorageError } from '../../../../../errors/StorageError';\nimport { CanceledError } from '../../../../../errors/CanceledError';\nimport { abortMultipartUpload, completeMultipartUpload, headObject, } from '../../../utils/client';\nimport { getStorageUserAgentValue } from '../../../utils/userAgent';\nimport { logger } from '../../../../../utils';\n/**\n * Create closure hiding the multipart upload implementation details and expose the upload job and control functions(\n * onPause, onResume, onCancel).\n *\n * @internal\n */\nexport const getMultipartUploadHandlers = ({ options: uploadDataOptions, key, data }, size) => {\n    let resolveCallback;\n    let rejectCallback;\n    let inProgressUpload;\n    let s3Config;\n    let abortController;\n    let bucket;\n    let keyPrefix;\n    let uploadCacheKey;\n    // Special flag that differentiates HTTP requests abort error caused by pause() from ones caused by cancel().\n    // The former one should NOT cause the upload job to throw, but cancels any pending HTTP requests.\n    // This should be replaced by a special abort reason. However,the support of this API is lagged behind.\n    let isAbortSignalFromPause = false;\n    const startUpload = async () => {\n        const resolvedS3Options = await resolveS3ConfigAndInput(Amplify, uploadDataOptions);\n        s3Config = resolvedS3Options.s3Config;\n        bucket = resolvedS3Options.bucket;\n        keyPrefix = resolvedS3Options.keyPrefix;\n        abortController = new AbortController();\n        isAbortSignalFromPause = false;\n        const { contentDisposition, contentEncoding, contentType = 'application/octet-stream', metadata, accessLevel, onProgress, } = uploadDataOptions ?? {};\n        if (!inProgressUpload) {\n            const { uploadId, cachedParts } = await loadOrCreateMultipartUpload({\n                s3Config,\n                accessLevel: resolveAccessLevel(accessLevel),\n                bucket,\n                keyPrefix,\n                key,\n                contentType,\n                contentDisposition,\n                contentEncoding,\n                metadata,\n                data,\n                size,\n                abortSignal: abortController.signal,\n            });\n            inProgressUpload = {\n                uploadId,\n                completedParts: cachedParts,\n            };\n        }\n        const finalKey = keyPrefix + key;\n        uploadCacheKey = size\n            ? getUploadsCacheKey({\n                file: data instanceof File ? data : undefined,\n                accessLevel: resolveAccessLevel(uploadDataOptions?.accessLevel),\n                contentType: uploadDataOptions?.contentType,\n                bucket: bucket,\n                size,\n                key,\n            })\n            : undefined;\n        const dataChunker = getDataChunker(data, size);\n        const completedPartNumberSet = new Set(inProgressUpload.completedParts.map(({ PartNumber }) => PartNumber));\n        const onPartUploadCompletion = (partNumber, eTag) => {\n            inProgressUpload?.completedParts.push({\n                PartNumber: partNumber,\n                ETag: eTag,\n            });\n        };\n        const concurrentUploadsProgressTracker = getConcurrentUploadsProgressTracker({\n            size,\n            onProgress,\n        });\n        const concurrentUploadPartExecutors = [];\n        for (let index = 0; index < DEFAULT_QUEUE_SIZE; index++) {\n            concurrentUploadPartExecutors.push(uploadPartExecutor({\n                dataChunkerGenerator: dataChunker,\n                completedPartNumberSet,\n                s3Config,\n                abortSignal: abortController.signal,\n                bucket,\n                finalKey,\n                uploadId: inProgressUpload.uploadId,\n                onPartUploadCompletion,\n                onProgress: concurrentUploadsProgressTracker.getOnProgressListener(),\n                isObjectLockEnabled: resolvedS3Options.isObjectLockEnabled,\n            }));\n        }\n        await Promise.all(concurrentUploadPartExecutors);\n        const { ETag: eTag } = await completeMultipartUpload({\n            ...s3Config,\n            abortSignal: abortController.signal,\n            userAgentValue: getStorageUserAgentValue(StorageAction.UploadData),\n        }, {\n            Bucket: bucket,\n            Key: finalKey,\n            UploadId: inProgressUpload.uploadId,\n            MultipartUpload: {\n                Parts: inProgressUpload.completedParts.sort((partA, partB) => partA.PartNumber - partB.PartNumber),\n            },\n        });\n        if (size) {\n            const { ContentLength: uploadedObjectSize } = await headObject(s3Config, {\n                Bucket: bucket,\n                Key: finalKey,\n            });\n            if (uploadedObjectSize && uploadedObjectSize !== size) {\n                throw new StorageError({\n                    name: 'Error',\n                    message: `Upload failed. Expected object size ${size}, but got ${uploadedObjectSize}.`,\n                });\n            }\n        }\n        if (uploadCacheKey) {\n            await removeCachedUpload(uploadCacheKey);\n        }\n        return {\n            key,\n            eTag,\n            contentType,\n            metadata,\n        };\n    };\n    const startUploadWithResumability = () => startUpload()\n        .then(resolveCallback)\n        .catch(error => {\n        const abortSignal = abortController?.signal;\n        if (abortSignal?.aborted && isAbortSignalFromPause) {\n            logger.debug('upload paused.');\n        }\n        else {\n            // Uncaught errors should be exposed to the users.\n            rejectCallback(error);\n        }\n    });\n    const multipartUploadJob = () => new Promise((resolve, reject) => {\n        resolveCallback = resolve;\n        rejectCallback = reject;\n        startUploadWithResumability();\n    });\n    const onPause = () => {\n        isAbortSignalFromPause = true;\n        abortController?.abort();\n    };\n    const onResume = () => {\n        startUploadWithResumability();\n    };\n    const onCancel = (message) => {\n        // 1. abort in-flight API requests\n        abortController?.abort(message);\n        const cancelUpload = async () => {\n            // 2. clear upload cache.\n            if (uploadCacheKey) {\n                await removeCachedUpload(uploadCacheKey);\n            }\n            // 3. clear multipart upload on server side.\n            await abortMultipartUpload(s3Config, {\n                Bucket: bucket,\n                Key: keyPrefix + key,\n                UploadId: inProgressUpload?.uploadId,\n            });\n        };\n        cancelUpload().catch(e => {\n            logger.debug('error when cancelling upload task.', e);\n        });\n        rejectCallback(\n        // Internal error that should not be exposed to the users. They should use isCancelError() to check if\n        // the error is caused by cancel().\n        new CanceledError(message ? { message } : undefined));\n    };\n    return {\n        multipartUploadJob,\n        onPause,\n        onResume,\n        onCancel,\n    };\n};\nconst resolveAccessLevel = (accessLevel) => accessLevel ??\n    Amplify.libraryOptions.Storage?.S3?.defaultAccessLevel ??\n    DEFAULT_ACCESS_LEVEL;\n"],"names":[],"mappings":"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"}