UNPKG

picgo-plugin-s3

Version:
101 lines (100 loc) 3.52 kB
"use strict"; 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, };