UNPKG

@uppy/companion

Version:

OAuth helper and remote fetcher for Uppy's (https://uppy.io) extensible file upload widget with support for drag&drop, resumable uploads, previews, restrictions, file processing/encoding, remote providers like Dropbox and Google Drive, S3 and more :dog:

94 lines (84 loc) 3.2 kB
import { S3Client } from '@aws-sdk/client-s3' /** * instantiates the aws-sdk s3 client that will be used for s3 uploads. * * @param {object} companionOptions the companion options object * @param {boolean} createPresignedPostMode whether this s3 client is for createPresignedPost */ export default function s3Client( companionOptions, createPresignedPostMode = false, ) { let s3Client = null if (companionOptions.s3) { const { s3 } = companionOptions if (s3.accessKeyId || s3.secretAccessKey) { throw new Error( 'Found `providerOptions.s3.accessKeyId` or `providerOptions.s3.secretAccessKey` configuration, but Companion requires `key` and `secret` option names instead. Please use the `key` property instead of `accessKeyId` and the `secret` property instead of `secretAccessKey`.', ) } const rawClientOptions = s3.awsClientOptions if ( rawClientOptions && (rawClientOptions.accessKeyId || rawClientOptions.secretAccessKey) ) { throw new Error( 'Found unsupported `providerOptions.s3.awsClientOptions.accessKeyId` or `providerOptions.s3.awsClientOptions.secretAccessKey` configuration. Please use the `providerOptions.s3.key` and `providerOptions.s3.secret` options instead.', ) } let { endpoint } = s3 if (typeof endpoint === 'string') { // TODO: deprecate those replacements in favor of what AWS SDK supports out of the box. endpoint = endpoint .replace(/{service}/, 's3') .replace(/{region}/, s3.region) } /** @type {import('@aws-sdk/client-s3').S3ClientConfig} */ let s3ClientOptions = { region: s3.region, forcePathStyle: s3.forcePathStyle, } if (s3.useAccelerateEndpoint) { // https://github.com/transloadit/uppy/issues/4809#issuecomment-1847320742 if (createPresignedPostMode) { if (s3.bucket != null) { s3ClientOptions = { ...s3ClientOptions, useAccelerateEndpoint: true, // This is a workaround for lacking support for useAccelerateEndpoint in createPresignedPost // See https://github.com/transloadit/uppy/issues/4135#issuecomment-1276450023 endpoint: `https://${s3.bucket}.s3-accelerate.amazonaws.com/`, } } } else { // normal useAccelerateEndpoint mode s3ClientOptions = { ...s3ClientOptions, useAccelerateEndpoint: true, } } } else { // no accelearate, we allow custom s3 endpoint s3ClientOptions = { ...s3ClientOptions, endpoint, } } s3ClientOptions = { ...s3ClientOptions, ...rawClientOptions, } // Use credentials to allow assumed roles to pass STS sessions in. // If the user doesn't specify key and secret, the default credentials (process-env) // will be used by S3 in calls below. if (s3.key && s3.secret && !s3ClientOptions.credentials) { s3ClientOptions.credentials = { accessKeyId: s3.key, secretAccessKey: s3.secret, sessionToken: s3.sessionToken, } } s3Client = new S3Client(s3ClientOptions) } return s3Client }