@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:
78 lines (77 loc) • 3.58 kB
JavaScript
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;
}