feat: Add support for S3 transfer acceleration
This commit is contained in:
@@ -6,22 +6,28 @@ import fetch from "fetch-with-proxy";
|
||||
import { v4 as uuidv4 } from "uuid";
|
||||
import Logger from "@server/logging/logger";
|
||||
|
||||
const AWS_S3_ACCELERATE_URL = process.env.AWS_S3_ACCELERATE_URL;
|
||||
const AWS_SECRET_ACCESS_KEY = process.env.AWS_SECRET_ACCESS_KEY;
|
||||
const AWS_S3_UPLOAD_BUCKET_URL = process.env.AWS_S3_UPLOAD_BUCKET_URL || "";
|
||||
const AWS_ACCESS_KEY_ID = process.env.AWS_ACCESS_KEY_ID;
|
||||
const AWS_REGION = process.env.AWS_REGION || "";
|
||||
const AWS_S3_UPLOAD_BUCKET_NAME = process.env.AWS_S3_UPLOAD_BUCKET_NAME || "";
|
||||
const AWS_S3_FORCE_PATH_STYLE = process.env.AWS_S3_FORCE_PATH_STYLE !== "false";
|
||||
|
||||
const s3 = new AWS.S3({
|
||||
s3BucketEndpoint: AWS_S3_ACCELERATE_URL ? true : undefined,
|
||||
s3ForcePathStyle: AWS_S3_FORCE_PATH_STYLE,
|
||||
accessKeyId: AWS_ACCESS_KEY_ID,
|
||||
secretAccessKey: AWS_SECRET_ACCESS_KEY,
|
||||
region: AWS_REGION,
|
||||
endpoint: AWS_S3_UPLOAD_BUCKET_URL.includes(AWS_S3_UPLOAD_BUCKET_NAME)
|
||||
endpoint: AWS_S3_ACCELERATE_URL
|
||||
? AWS_S3_ACCELERATE_URL
|
||||
: AWS_S3_UPLOAD_BUCKET_URL.includes(AWS_S3_UPLOAD_BUCKET_NAME)
|
||||
? undefined
|
||||
: new AWS.Endpoint(AWS_S3_UPLOAD_BUCKET_URL),
|
||||
signatureVersion: "v4",
|
||||
});
|
||||
|
||||
const createPresignedPost = util.promisify(s3.createPresignedPost).bind(s3);
|
||||
|
||||
const hmac = (
|
||||
@@ -116,6 +122,10 @@ export const getPresignedPost = (
|
||||
};
|
||||
|
||||
export const publicS3Endpoint = (isServerUpload?: boolean) => {
|
||||
if (AWS_S3_ACCELERATE_URL) {
|
||||
return AWS_S3_ACCELERATE_URL;
|
||||
}
|
||||
|
||||
// lose trailing slash if there is one and convert fake-s3 url to localhost
|
||||
// for access outside of docker containers in local development
|
||||
const isDocker = AWS_S3_UPLOAD_BUCKET_URL.match(/http:\/\/s3:/);
|
||||
@@ -205,9 +215,16 @@ export const getSignedUrl = async (key: string) => {
|
||||
Key: key,
|
||||
Expires: 60,
|
||||
};
|
||||
return isDocker
|
||||
|
||||
const url = isDocker
|
||||
? `${publicS3Endpoint()}/${key}`
|
||||
: s3.getSignedUrl("getObject", params);
|
||||
: await s3.getSignedUrlPromise("getObject", params);
|
||||
|
||||
if (AWS_S3_ACCELERATE_URL) {
|
||||
return url.replace(AWS_S3_UPLOAD_BUCKET_URL, AWS_S3_ACCELERATE_URL);
|
||||
}
|
||||
|
||||
return url;
|
||||
};
|
||||
|
||||
// function assumes that acl is private
|
||||
|
||||
Reference in New Issue
Block a user