@strapi/provider-upload-aws-s3
Version:
AWS S3 provider for strapi upload
1 lines • 38.1 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["import type { ReadStream } from 'node:fs';\nimport { getOr } from 'lodash/fp';\nimport {\n S3Client,\n GetObjectCommand,\n DeleteObjectCommand,\n DeleteObjectCommandOutput,\n HeadObjectCommand,\n PutObjectCommandInput,\n CompleteMultipartUploadCommandOutput,\n AbortMultipartUploadCommandOutput,\n S3ClientConfig,\n ObjectCannedACL,\n ChecksumAlgorithm,\n StorageClass,\n ServerSideEncryption,\n} from '@aws-sdk/client-s3';\nimport type { AwsCredentialIdentity, AwsCredentialIdentityProvider } from '@aws-sdk/types';\nimport { getSignedUrl } from '@aws-sdk/s3-request-presigner';\nimport { Upload } from '@aws-sdk/lib-storage';\nimport { extractCredentials, isUrlFromBucket } from './utils';\n\n/**\n * Supported checksum algorithms for data integrity validation.\n * CRC64NVME is recommended for best performance on modern hardware.\n */\nexport type SupportedChecksumAlgorithm = 'CRC32' | 'CRC32C' | 'SHA1' | 'SHA256' | 'CRC64NVME';\n\n/**\n * Supported S3 storage classes for cost optimization.\n */\nexport type SupportedStorageClass =\n | 'STANDARD'\n | 'REDUCED_REDUNDANCY'\n | 'STANDARD_IA'\n | 'ONEZONE_IA'\n | 'INTELLIGENT_TIERING'\n | 'GLACIER'\n | 'DEEP_ARCHIVE'\n | 'GLACIER_IR';\n\n/**\n * Server-side encryption types.\n */\nexport type EncryptionType = 'AES256' | 'aws:kms' | 'aws:kms:dsse';\n\n/**\n * Encryption configuration for server-side encryption.\n */\nexport interface EncryptionConfig {\n type: EncryptionType;\n kmsKeyId?: string;\n}\n\n/**\n * Multipart upload configuration for large files.\n */\nexport interface MultipartConfig {\n partSize?: number;\n queueSize?: number;\n leavePartsOnError?: boolean;\n}\n\nexport interface File {\n name: string;\n alternativeText?: string;\n caption?: string;\n width?: number;\n height?: number;\n formats?: Record<string, unknown>;\n hash: string;\n ext?: string;\n mime: string;\n size: number;\n sizeInBytes: number;\n url: string;\n previewUrl?: string;\n path?: string;\n provider?: string;\n provider_metadata?: Record<string, unknown>;\n stream?: ReadStream;\n buffer?: Buffer;\n etag?: string;\n}\n\nexport type UploadCommandOutput = (\n | CompleteMultipartUploadCommandOutput\n | AbortMultipartUploadCommandOutput\n) & {\n Location?: string;\n ETag?: string;\n};\n\nexport interface AWSParams {\n Bucket: string;\n ACL?: ObjectCannedACL;\n signedUrlExpires?: number;\n}\n\n/**\n * Extended configuration options for the S3 provider.\n */\nexport interface ProviderConfig {\n /**\n * Checksum algorithm for data integrity validation during upload.\n * When enabled, the SDK calculates a checksum and S3 validates it server-side.\n */\n checksumAlgorithm?: SupportedChecksumAlgorithm;\n\n /**\n * When true, uploads will fail if an object with the same key already exists.\n * This prevents accidental overwrites due to race conditions.\n */\n preventOverwrite?: boolean;\n\n /**\n * S3 storage class for uploaded objects.\n * Use lower-cost classes for infrequently accessed data.\n */\n storageClass?: SupportedStorageClass;\n\n /**\n * Server-side encryption configuration.\n */\n encryption?: EncryptionConfig;\n\n /**\n * Tags to apply to uploaded objects.\n * Useful for cost allocation and lifecycle policies.\n */\n tags?: Record<string, string>;\n\n /**\n * Multipart upload configuration for large files.\n */\n multipart?: MultipartConfig;\n}\n\nexport interface DefaultOptions extends S3ClientConfig {\n // TODO Remove this in V5\n accessKeyId?: AwsCredentialIdentity['accessKeyId'];\n secretAccessKey?: AwsCredentialIdentity['secretAccessKey'];\n // Keep this for V5. Accepts either static credentials or an AWS credential\n // provider function, which the SDK resolves (and refreshes) at runtime.\n credentials?: AwsCredentialIdentity | AwsCredentialIdentityProvider;\n params?: AWSParams;\n [k: string]: unknown;\n}\n\nexport type InitOptions = (DefaultOptions | { s3Options: DefaultOptions }) & {\n baseUrl?: string;\n rootPath?: string;\n providerConfig?: ProviderConfig;\n [k: string]: unknown;\n};\n\n/**\n * Validates that a URL uses HTTP or HTTPS protocol.\n * Rejects dangerous protocols like file://, javascript:, data:, etc.\n */\nconst assertUrlProtocol = (url: string) => {\n return /^https?:\\/\\//.test(url);\n};\n\n/**\n * Sanitizes a path component to prevent path traversal attacks.\n * Removes directory traversal sequences and normalizes the path.\n */\nconst sanitizePathComponent = (component: string | undefined): string => {\n if (!component) return '';\n return component\n .replace(/\\.\\./g, '')\n .replace(/^\\/+|\\/+$/g, '')\n .replace(/\\/+/g, '/');\n};\n\n/**\n * Maps the provider checksum algorithm to the AWS SDK checksum algorithm.\n */\nconst mapChecksumAlgorithm = (\n algorithm?: SupportedChecksumAlgorithm\n): ChecksumAlgorithm | undefined => {\n if (!algorithm) return undefined;\n const mapping: Record<SupportedChecksumAlgorithm, ChecksumAlgorithm> = {\n CRC32: ChecksumAlgorithm.CRC32,\n CRC32C: ChecksumAlgorithm.CRC32C,\n SHA1: ChecksumAlgorithm.SHA1,\n SHA256: ChecksumAlgorithm.SHA256,\n CRC64NVME: ChecksumAlgorithm.CRC64NVME,\n };\n return mapping[algorithm];\n};\n\n/**\n * Maps the provider storage class to the AWS SDK storage class.\n */\nconst mapStorageClass = (storageClass?: SupportedStorageClass): StorageClass | undefined => {\n if (!storageClass) return undefined;\n const mapping: Record<SupportedStorageClass, StorageClass> = {\n STANDARD: StorageClass.STANDARD,\n REDUCED_REDUNDANCY: StorageClass.REDUCED_REDUNDANCY,\n STANDARD_IA: StorageClass.STANDARD_IA,\n ONEZONE_IA: StorageClass.ONEZONE_IA,\n INTELLIGENT_TIERING: StorageClass.INTELLIGENT_TIERING,\n GLACIER: StorageClass.GLACIER,\n DEEP_ARCHIVE: StorageClass.DEEP_ARCHIVE,\n GLACIER_IR: StorageClass.GLACIER_IR,\n };\n return mapping[storageClass];\n};\n\n/**\n * Maps the provider encryption type to the AWS SDK server-side encryption.\n */\nconst mapServerSideEncryption = (type?: EncryptionType): ServerSideEncryption | undefined => {\n if (!type) return undefined;\n const mapping: Record<EncryptionType, ServerSideEncryption> = {\n AES256: ServerSideEncryption.AES256,\n 'aws:kms': ServerSideEncryption.aws_kms,\n 'aws:kms:dsse': ServerSideEncryption.aws_kms_dsse,\n };\n return mapping[type];\n};\n\n/**\n * Converts a tags object to the S3 Tagging header format.\n * Format: key1=value1&key2=value2\n */\nconst formatTagsForHeader = (tags?: Record<string, string>): string | undefined => {\n if (!tags || Object.keys(tags).length === 0) return undefined;\n return Object.entries(tags)\n .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n .join('&');\n};\n\n/**\n * Checks if the endpoint appears to be a non-AWS S3-compatible provider.\n */\nconst isNonAwsEndpoint = (endpoint?: string): boolean => {\n if (!endpoint) return false;\n const awsPatterns = [/\\.amazonaws\\.com$/i, /\\.amazonaws\\.com\\.cn$/i];\n return !awsPatterns.some((pattern) => pattern.test(endpoint));\n};\n\n/**\n * Validates provider configuration and emits warnings for potential compatibility issues.\n */\nconst validateProviderConfig = (\n providerConfig: ProviderConfig | undefined,\n s3Options: DefaultOptions | undefined\n): void => {\n if (!providerConfig) return;\n\n const endpoint = s3Options?.endpoint?.toString() || '';\n const isNonAws = isNonAwsEndpoint(endpoint);\n\n // Warn about AWS-specific features when using non-AWS endpoints\n if (isNonAws) {\n if (providerConfig.storageClass) {\n process.emitWarning(\n `Storage class '${providerConfig.storageClass}' is AWS S3-specific and may be ignored by your S3-compatible provider.`\n );\n }\n\n if (providerConfig.encryption?.type && providerConfig.encryption.type !== 'AES256') {\n process.emitWarning(\n `Encryption type '${providerConfig.encryption.type}' is AWS S3-specific. Consider using 'AES256' for better compatibility.`\n );\n }\n }\n\n // Validate multipart configuration\n if (providerConfig.multipart?.partSize) {\n const minPartSize = 5 * 1024 * 1024; // 5MB\n const maxPartSize = 5 * 1024 * 1024 * 1024; // 5GB\n\n if (providerConfig.multipart.partSize < minPartSize) {\n process.emitWarning(\n `Multipart partSize ${providerConfig.multipart.partSize} is below the minimum of 5MB. This may cause upload failures.`\n );\n }\n\n if (providerConfig.multipart.partSize > maxPartSize) {\n process.emitWarning(\n `Multipart partSize ${providerConfig.multipart.partSize} exceeds the maximum of 5GB. This may cause upload failures.`\n );\n }\n }\n\n if (providerConfig.multipart?.queueSize && providerConfig.multipart.queueSize > 16) {\n process.emitWarning(\n `Multipart queueSize ${providerConfig.multipart.queueSize} is high and may cause memory issues. Consider using 4-8.`\n );\n }\n};\n\nconst getConfig = ({\n s3Options,\n legacyS3Options,\n}: {\n s3Options: DefaultOptions;\n legacyS3Options: Record<string, unknown>;\n}) => {\n if (Object.keys(legacyS3Options).length > 0) {\n process.emitWarning(\n \"S3 configuration options passed at root level of the plugin's providerOptions is deprecated and will be removed in a future release. Please wrap them inside the 's3Options:{}' property.\"\n );\n }\n const credentials = extractCredentials({ s3Options, ...legacyS3Options });\n const config = {\n ...s3Options,\n ...legacyS3Options,\n ...(credentials ? { credentials } : {}),\n };\n\n if (config.params !== undefined) {\n // Only set default ACL when ACL is not explicitly present in params.\n // Since April 2023, new AWS S3 buckets have ACLs disabled by default\n // (\"Bucket owner enforced\"). Sending an ACL header to such buckets\n // throws AccessControlListNotSupported. To disable ACLs, users should\n // simply not include ACL in their params configuration.\n if (!('ACL' in config.params)) {\n config.params.ACL = ObjectCannedACL.public_read;\n }\n } else {\n throw new Error('Upload AWS S3 provider: `params` are required in the config object');\n }\n\n return config as DefaultOptions & {\n params: AWSParams;\n };\n};\n\nexport default {\n init({ baseUrl, rootPath, s3Options, providerConfig, ...legacyS3Options }: InitOptions) {\n // Validate configuration and emit warnings for potential issues\n validateProviderConfig(providerConfig, s3Options as DefaultOptions);\n\n // TODO V5 change config structure to avoid having to do this\n const config = getConfig({ s3Options: s3Options as DefaultOptions, legacyS3Options });\n const s3Client = new S3Client(config);\n const filePrefix = rootPath ? `${rootPath.replace(/\\/+$/, '')}/` : '';\n\n const getFileKey = (file: File) => {\n const sanitizedPath = sanitizePathComponent(file.path);\n const path = sanitizedPath ? `${sanitizedPath}/` : '';\n const sanitizedHash = sanitizePathComponent(file.hash);\n const sanitizedExt = file.ext ? file.ext.replace(/[^a-zA-Z0-9.]/g, '') : '';\n return `${filePrefix}${path}${sanitizedHash}${sanitizedExt}`;\n };\n\n /**\n * Builds the upload parameters including all configured features.\n */\n const buildUploadParams = (\n file: File,\n fileKey: string,\n customParams: Partial<PutObjectCommandInput> = {}\n ): PutObjectCommandInput => {\n const params: PutObjectCommandInput = {\n Bucket: config.params.Bucket,\n Key: fileKey,\n Body: file.stream || Buffer.from(file.buffer as any, 'binary'),\n // ACL is optional to support providers like Cloudflare R2 that don't support ACLs.\n // Set params.ACL to undefined or omit it entirely to disable ACL headers.\n ...(config.params.ACL ? { ACL: config.params.ACL } : {}),\n ContentType: file.mime,\n };\n\n // Checksum validation\n const checksumAlgorithm = mapChecksumAlgorithm(providerConfig?.checksumAlgorithm);\n if (checksumAlgorithm) {\n params.ChecksumAlgorithm = checksumAlgorithm;\n }\n\n // Conditional writes - prevent overwrite\n if (providerConfig?.preventOverwrite) {\n params.IfNoneMatch = '*';\n }\n\n // Storage class\n const storageClass = mapStorageClass(providerConfig?.storageClass);\n if (storageClass) {\n params.StorageClass = storageClass;\n }\n\n // Server-side encryption\n if (providerConfig?.encryption) {\n const sse = mapServerSideEncryption(providerConfig.encryption.type);\n if (sse) {\n params.ServerSideEncryption = sse;\n if (providerConfig.encryption.kmsKeyId) {\n params.SSEKMSKeyId = providerConfig.encryption.kmsKeyId;\n }\n }\n }\n\n // Object tagging\n const tagging = formatTagsForHeader(providerConfig?.tags);\n if (tagging) {\n params.Tagging = tagging;\n }\n\n // Merge customParams but preserve critical security parameters\n // Bucket, Key, and Body must not be overridden by customParams\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { Bucket, Key, Body, ...safeCustomParams } = customParams as any;\n return { ...params, ...safeCustomParams };\n };\n\n /**\n * Constructs the correct file URL.\n * Handles S3-compatible providers that return incorrect Location formats.\n *\n * Some providers (IONOS, some MinIO configs) return malformed Location\n * values like \"bucket/key\" without protocol or domain. For these, we\n * fall back to constructing the URL from the endpoint config.\n *\n * Other providers (AWS, Scaleway, DigitalOcean, Backblaze) return\n * correct Location URLs that should be trusted as-is, since they\n * already use the correct URL style (virtual-hosted or path-style).\n */\n const constructFileUrl = (fileKey: string, uploadLocation: string): string => {\n // Priority 1: Use baseUrl if configured (CDN or custom domain)\n if (baseUrl) {\n const cleanBase = baseUrl.replace(/\\/+$/, '');\n return `${cleanBase}/${fileKey}`;\n }\n\n // Priority 2: Use the Location from S3 response if it's a valid URL.\n // This preserves correct behavior for providers that return proper URLs\n // (AWS, Scaleway, DigitalOcean, Backblaze, etc.), respecting their\n // native URL format (virtual-hosted or path-style).\n if (uploadLocation && assertUrlProtocol(uploadLocation)) {\n return uploadLocation;\n }\n\n // Priority 3: Construct URL from endpoint if configured.\n // This is a fallback for providers that return malformed Location values\n // (e.g., IONOS returns \"bucket/key\" without protocol for multipart uploads,\n // some MinIO configs return similar malformed values).\n const endpoint = config.endpoint?.toString();\n if (endpoint) {\n const endpointUrl = endpoint.startsWith('http') ? endpoint : `https://${endpoint}`;\n const cleanEndpoint = endpointUrl.replace(/\\/+$/, '');\n return `${cleanEndpoint}/${config.params.Bucket}/${fileKey}`;\n }\n\n // Priority 4: Prepend https if Location exists but lacks protocol\n if (uploadLocation) {\n return `https://${uploadLocation}`;\n }\n\n // Priority 5: Construct from AWS default pattern\n return `https://${config.params.Bucket}.s3.amazonaws.com/${fileKey}`;\n };\n\n const upload = async (file: File, customParams: Partial<PutObjectCommandInput> = {}) => {\n const fileKey = getFileKey(file);\n const params = buildUploadParams(file, fileKey, customParams);\n\n const uploadOptions: {\n client: S3Client;\n params: PutObjectCommandInput;\n partSize?: number;\n queueSize?: number;\n leavePartsOnError?: boolean;\n } = {\n client: s3Client,\n params,\n };\n\n // Multipart configuration\n if (providerConfig?.multipart) {\n if (providerConfig.multipart.partSize) {\n uploadOptions.partSize = providerConfig.multipart.partSize;\n }\n if (providerConfig.multipart.queueSize) {\n uploadOptions.queueSize = providerConfig.multipart.queueSize;\n }\n if (providerConfig.multipart.leavePartsOnError !== undefined) {\n uploadOptions.leavePartsOnError = providerConfig.multipart.leavePartsOnError;\n }\n }\n\n const uploadObj = new Upload(uploadOptions);\n const result = (await uploadObj.done()) as UploadCommandOutput;\n\n file.url = constructFileUrl(fileKey, result.Location ?? '');\n\n if (result.ETag) {\n file.etag = result.ETag.replace(/\"/g, '');\n }\n };\n\n /**\n * Uploads a file only if the existing object matches the expected ETag.\n * This implements optimistic locking to prevent lost updates.\n */\n const uploadIfMatch = async (\n file: File,\n expectedETag: string,\n customParams: Partial<PutObjectCommandInput> = {}\n ) => {\n const fileKey = getFileKey(file);\n const params = buildUploadParams(file, fileKey, {\n ...customParams,\n IfMatch: expectedETag,\n });\n\n const uploadObj = new Upload({\n client: s3Client,\n params,\n });\n\n const result = (await uploadObj.done()) as UploadCommandOutput;\n\n file.url = constructFileUrl(fileKey, result.Location ?? '');\n\n if (result.ETag) {\n file.etag = result.ETag.replace(/\"/g, '');\n }\n };\n\n /**\n * Retrieves metadata for an object including its ETag.\n */\n const getObjectMetadata = async (file: File) => {\n const command = new HeadObjectCommand({\n Bucket: config.params.Bucket,\n Key: getFileKey(file),\n });\n\n const response = await s3Client.send(command);\n\n return {\n etag: response.ETag?.replace(/\"/g, ''),\n contentLength: response.ContentLength,\n contentType: response.ContentType,\n lastModified: response.LastModified,\n storageClass: response.StorageClass,\n serverSideEncryption: response.ServerSideEncryption,\n };\n };\n\n /**\n * Checks if an object exists in the bucket.\n */\n const objectExists = async (file: File): Promise<boolean> => {\n try {\n await getObjectMetadata(file);\n return true;\n } catch (error: any) {\n if (error.name === 'NotFound' || error.$metadata?.httpStatusCode === 404) {\n return false;\n }\n throw error;\n }\n };\n\n return {\n /**\n * Returns whether the bucket is configured with private ACL.\n */\n isPrivate() {\n return config.params.ACL === 'private';\n },\n\n /**\n * Returns the current provider configuration.\n */\n getProviderConfig(): ProviderConfig | undefined {\n return providerConfig;\n },\n\n /**\n * Generates a signed URL for accessing a private object.\n */\n async getSignedUrl(file: File, customParams: any): Promise<{ url: string }> {\n if (!isUrlFromBucket(file.url, config.params.Bucket, baseUrl)) {\n return { url: file.url };\n }\n const fileKey = getFileKey(file);\n\n // Spread customParams first, then override with secure values\n // This prevents malicious override of Bucket and Key\n const url = await getSignedUrl(\n s3Client,\n new GetObjectCommand({\n ...customParams,\n Bucket: config.params.Bucket,\n Key: fileKey,\n }),\n {\n expiresIn: getOr(15 * 60, ['params', 'signedUrlExpires'], config),\n }\n );\n\n return { url };\n },\n\n /**\n * Uploads a file using streaming.\n */\n uploadStream(file: File, customParams = {}) {\n return upload(file, customParams);\n },\n\n /**\n * Uploads a file to S3.\n */\n upload(file: File, customParams = {}) {\n return upload(file, customParams);\n },\n\n /**\n * Replaces an existing object in S3. Since `PutObject` with the same key\n * overwrites the existing object, this is just an upload of the new file\n * — and if the key changed, we delete the old object afterwards so we\n * never leave the bucket in a state where the asset is missing.\n */\n async replaceStream(newFile: File, oldFile: File, customParams = {}) {\n const newKey = getFileKey(newFile);\n const oldKey = getFileKey(oldFile);\n\n await upload(newFile, customParams);\n\n if (newKey !== oldKey) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { Bucket, Key, ...safeParams } = customParams as any;\n const command = new DeleteObjectCommand({\n ...safeParams,\n Bucket: config.params.Bucket,\n Key: oldKey,\n });\n await s3Client.send(command);\n }\n },\n\n async replace(newFile: File, oldFile: File, customParams = {}) {\n const newKey = getFileKey(newFile);\n const oldKey = getFileKey(oldFile);\n\n await upload(newFile, customParams);\n\n if (newKey !== oldKey) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { Bucket, Key, ...safeParams } = customParams as any;\n const command = new DeleteObjectCommand({\n ...safeParams,\n Bucket: config.params.Bucket,\n Key: oldKey,\n });\n await s3Client.send(command);\n }\n },\n\n /**\n * Uploads a file only if it matches the expected ETag (optimistic locking).\n * Throws PreconditionFailed error if ETag does not match.\n */\n uploadIfMatch(file: File, expectedETag: string, customParams = {}) {\n return uploadIfMatch(file, expectedETag, customParams);\n },\n\n /**\n * Retrieves object metadata including ETag.\n */\n getObjectMetadata(file: File) {\n return getObjectMetadata(file);\n },\n\n /**\n * Checks if an object exists in the bucket.\n */\n objectExists(file: File) {\n return objectExists(file);\n },\n\n /**\n * Deletes an object from S3.\n */\n delete(file: File, customParams = {}): Promise<DeleteObjectCommandOutput> {\n // Spread customParams first, then override with secure values\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { Bucket, Key, ...safeParams } = customParams as any;\n const command = new DeleteObjectCommand({\n ...safeParams,\n Bucket: config.params.Bucket,\n Key: getFileKey(file),\n });\n return s3Client.send(command);\n },\n };\n },\n};\n"],"names":["assertUrlProtocol","url","test","sanitizePathComponent","component","replace","mapChecksumAlgorithm","algorithm","undefined","mapping","CRC32","ChecksumAlgorithm","CRC32C","SHA1","SHA256","CRC64NVME","mapStorageClass","storageClass","STANDARD","StorageClass","REDUCED_REDUNDANCY","STANDARD_IA","ONEZONE_IA","INTELLIGENT_TIERING","GLACIER","DEEP_ARCHIVE","GLACIER_IR","mapServerSideEncryption","type","AES256","ServerSideEncryption","aws_kms","aws_kms_dsse","formatTagsForHeader","tags","Object","keys","length","entries","map","key","value","encodeURIComponent","join","isNonAwsEndpoint","endpoint","awsPatterns","some","pattern","validateProviderConfig","providerConfig","s3Options","toString","isNonAws","process","emitWarning","encryption","multipart","partSize","minPartSize","maxPartSize","queueSize","getConfig","legacyS3Options","credentials","extractCredentials","config","params","ACL","ObjectCannedACL","public_read","Error","init","baseUrl","rootPath","s3Client","S3Client","filePrefix","getFileKey","file","sanitizedPath","path","sanitizedHash","hash","sanitizedExt","ext","buildUploadParams","fileKey","customParams","Bucket","Key","Body","stream","Buffer","from","buffer","ContentType","mime","checksumAlgorithm","preventOverwrite","IfNoneMatch","sse","kmsKeyId","SSEKMSKeyId","tagging","Tagging","safeCustomParams","constructFileUrl","uploadLocation","cleanBase","endpointUrl","startsWith","cleanEndpoint","upload","uploadOptions","client","leavePartsOnError","uploadObj","Upload","result","done","Location","ETag","etag","uploadIfMatch","expectedETag","IfMatch","getObjectMetadata","command","HeadObjectCommand","response","send","contentLength","ContentLength","contentType","lastModified","LastModified","serverSideEncryption","objectExists","error","name","$metadata","httpStatusCode","isPrivate","getProviderConfig","getSignedUrl","isUrlFromBucket","GetObjectCommand","expiresIn","getOr","uploadStream","replaceStream","newFile","oldFile","newKey","oldKey","safeParams","DeleteObjectCommand","delete"],"mappings":"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"}