picgo-plugin-s3
Version:
picgo amazon s3 uploader
101 lines (100 loc) • 3.52 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const client_s3_1 = require("@aws-sdk/client-s3");
const s3_request_presigner_1 = require("@aws-sdk/s3-request-presigner");
const node_http_handler_1 = require("@smithy/node-http-handler");
const utils_1 = require("./utils");
function createS3Client(opts) {
var _a;
let sslEnabled = true;
if (opts.endpoint) {
try {
const u = new URL(opts.endpoint || '');
sslEnabled = u.protocol === 'https:';
}
catch (err) {
console.log('Failed to parse endpoint URL, defaulting to HTTPS:', err.message);
}
}
const httpHandlerOpts = {};
if (sslEnabled) {
httpHandlerOpts.httpsAgent = ((0, utils_1.getProxyAgent)(opts.proxy, true, opts.rejectUnauthorized));
}
else {
httpHandlerOpts.httpAgent = ((0, utils_1.getProxyAgent)(opts.proxy, false, opts.rejectUnauthorized));
}
const clientOptions = {
region: opts.region || 'auto',
endpoint: opts.endpoint || undefined,
credentials: {
accessKeyId: opts.accessKeyID,
secretAccessKey: opts.secretAccessKey,
},
tls: sslEnabled,
forcePathStyle: (_a = opts.pathStyleAccess) !== null && _a !== void 0 ? _a : false,
requestHandler: new node_http_handler_1.NodeHttpHandler(httpHandlerOpts),
requestChecksumCalculation: "WHEN_REQUIRED",
responseChecksumValidation: "WHEN_REQUIRED",
};
return new client_s3_1.S3Client(clientOptions);
}
async function createUploadTask(opts) {
let result = {
index: opts.index,
key: opts.path,
};
if (!opts.item.buffer && !opts.item.base64Image) {
result.error = new Error(`"${opts.item.fileName}" No image data provided: buffer or base64Image is required`);
return result;
}
let body;
let contentType;
let contentEncoding;
try {
({ body, contentType, contentEncoding } = await (0, utils_1.extractInfo)(opts.item));
}
catch (err) {
result.error = new Error(`Failed to extract ${opts.item.fileName} image info: ${err instanceof Error ? err.message : String(err)}`);
return result;
}
const acl = opts.acl;
const command = new client_s3_1.PutObjectCommand({
Bucket: opts.bucketName,
Key: opts.path,
ACL: acl,
Body: body,
ContentType: contentType,
ContentEncoding: contentEncoding,
});
try {
const output = await opts.client.send(command);
result.url = await getFileURL(opts, output.ETag || '', output.VersionId || '');
result.versionId = output.VersionId;
result.eTag = output.ETag;
}
catch (err) {
result.error = new Error(`Failed to upload "${opts.item.fileName}" to S3: ${err instanceof Error ? err.message : String(err)}`);
}
return result;
}
async function getFileURL(opts, eTag, versionId) {
try {
const signedUrl = await (0, s3_request_presigner_1.getSignedUrl)(opts.client, new client_s3_1.GetObjectCommand({
Bucket: opts.bucketName,
Key: opts.path,
IfMatch: eTag,
VersionId: versionId,
}), { expiresIn: 3600 });
const urlObject = new URL(signedUrl);
urlObject.search = "";
return urlObject.href;
}
catch (err) {
return Promise.reject(err);
}
}
exports.default = {
createS3Client,
createUploadTask,
getFileURL,
};