UNPKG

@cdkx/web-application

Version:

Static web application hosting related constructs

154 lines 19.8 kB
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; (function (factory) { if (typeof module === "object" && typeof module.exports === "object") { var v = factory(require, exports); if (v !== undefined) module.exports = v; } else if (typeof define === "function" && define.amd) { define("@cdkx/web-application/handlers/assets-uploader", ["require", "exports", "busboy", "@cdkx/web-application/handlers/base-handler", "change-case"], factory); } })(function (require, exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AssetsUploader = void 0; const busboy_1 = __importDefault(require("busboy")); const base_handler_1 = require("@cdkx/web-application/handlers/base-handler"); const change_case_1 = require("change-case"); /** * Upload files to s3 or return upload Url * @params returnSignedUrlOnly: boolean @default false */ class AssetsUploader extends base_handler_1.BaseHandler { constructor(s3) { super(); this.s3 = s3; } run(event) { var _a, _b, _c; return __awaiter(this, void 0, void 0, function* () { const bucketName = process.env.BUCKET_NAME; if (!bucketName) { return this.encodedResponse({ statusCode: 500, body: { message: 'Missing required environment variable: BUCKET_NAME' }, }); } if (!event.body) { return this.encodedResponse({ statusCode: 400, body: { message: 'Cannot upload process request with empty body' }, }); } try { const { parsedBody } = yield this.parseFormData(event); if (!parsedBody) { throw new Error('No body after parsing.'); } if (!((_a = parsedBody.fields) === null || _a === void 0 ? void 0 : _a.s3Prefix)) { return this.encodedResponse({ statusCode: 400, body: { message: `Missing required property: s3Prefix` }, }); } const s3UploadPromises = []; for (const fileKey in parsedBody === null || parsedBody === void 0 ? void 0 : parsedBody.files) { const currentFile = parsedBody === null || parsedBody === void 0 ? void 0 : parsedBody.files[fileKey]; if (!(currentFile === null || currentFile === void 0 ? void 0 : currentFile.data)) { return this.encodedResponse({ statusCode: 400, body: `Unable to parse binary ${currentFile.fileName}`, }); } const filePublicName = (_b = currentFile.fileName) !== null && _b !== void 0 ? _b : currentFile.fieldName; console.log('Uploading File: ', filePublicName); const [name, ext] = filePublicName.split('.'); // upload each file to s3 s3UploadPromises.push(this.s3 .upload({ Bucket: bucketName, Key: `${parsedBody.fields.s3Prefix}/${[change_case_1.snakeCase(name), ext].join('.')}`, ContentType: currentFile.mimeType, Body: currentFile.data, ContentEncoding: currentFile.encoding, }) .promise()); } const response = yield Promise.all(s3UploadPromises); const responseToReturn = response.map((returnedItem) => ({ location: returnedItem.Location, key: returnedItem.Key, bucket: returnedItem.Bucket, eTag: returnedItem.ETag, })); return this.encodedResponse({ statusCode: 200, body: responseToReturn.length > 1 ? responseToReturn : responseToReturn[0], }); } catch (err) { console.log('Error processing request: ', err); return this.encodedResponse({ statusCode: 500, body: { message: (_c = err.message) !== null && _c !== void 0 ? _c : 'Something went wrong!' }, }); } }); } parseFormData(event) { const busboy = new busboy_1.default({ headers: { 'content-type': event.headers['Content-Type'] || event.headers['content-type'], }, }); const result = { files: {}, fields: {}, }; return new Promise((resolve, reject) => { busboy .on('file', (fieldName, file, fileName, encoding, mimeType) => { let fileData; file.on('data', (data) => { fileData = data; }); file.on('end', () => { result.files[fieldName] = { data: fileData, fileName, fieldName, encoding, mimeType, isBinary: true, }; }); }) .on('field', (fieldName, value) => { result.fields[fieldName] = value; }) .on('error', (err) => { console.error(err); reject(err); }) .on('finish', () => { event.parsedBody = result; resolve(event); }); busboy.write(event.body || '', event.isBase64Encoded ? 'base64' : 'binary'); busboy.end(); }); } } exports.AssetsUploader = AssetsUploader; }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzLXVwbG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvd2ViLWFwcGxpY2F0aW9uL2hhbmRsZXJzL2Fzc2V0cy11cGxvYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFFQSxvREFBNEI7SUFDNUIsK0VBQTZDO0lBQzdDLDZDQUF3QztJQVN4Qzs7O09BR0c7SUFDSCxNQUFhLGNBQWUsU0FBUSwwQkFBVztRQUM3QyxZQUFvQixFQUFNO1lBQ3hCLEtBQUssRUFBRSxDQUFDO1lBRFUsT0FBRSxHQUFGLEVBQUUsQ0FBSTtRQUUxQixDQUFDO1FBQ0ssR0FBRyxDQUNQLEtBQXNCOzs7Z0JBT3RCLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDO2dCQUUzQyxJQUFJLENBQUMsVUFBVSxFQUFFO29CQUNmLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQzt3QkFDMUIsVUFBVSxFQUFFLEdBQUc7d0JBQ2YsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLG9EQUFvRCxFQUFFO3FCQUN4RSxDQUFDLENBQUM7aUJBQ0o7Z0JBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUU7b0JBQ2YsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO3dCQUMxQixVQUFVLEVBQUUsR0FBRzt3QkFDZixJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsK0NBQStDLEVBQUU7cUJBQ25FLENBQUMsQ0FBQztpQkFDSjtnQkFFRCxJQUFJO29CQUNGLE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBRXZELElBQUksQ0FBQyxVQUFVLEVBQUU7d0JBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO3FCQUMzQztvQkFFRCxJQUFJLENBQUMsQ0FBQSxNQUFB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b0JBQzVCLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ25CLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDZCxDQUFDLENBQUM7cUJBRUQsRUFBRSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUU7b0JBQ2pCLEtBQUssQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDO29CQUMxQixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2pCLENBQUMsQ0FBQyxDQUFDO2dCQUVMLE1BQU0sQ0FBQyxLQUFLLENBQ1YsS0FBSyxDQUFDLElBQUksSUFBSSxFQUFFLEVBQ2hCLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUM1QyxDQUFDO2dCQUNGLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNmLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztLQUNGO0lBbExELHdDQWtMQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFQSUdhdGV3YXlFdmVudCB9IGZyb20gJ2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgUzMgfSBmcm9tICdhd3Mtc2RrJztcbmltcG9ydCBCdXNib3kgZnJvbSAnYnVzYm95JztcbmltcG9ydCB7IEJhc2VIYW5kbGVyIH0gZnJvbSAnLi9iYXNlLWhhbmRsZXInO1xuaW1wb3J0IHsgc25ha2VDYXNlIH0gZnJvbSAnY2hhbmdlLWNhc2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElVcGxvYWRTdWNjZXNzQm9keSB7XG4gIGxvY2F0aW9uOiBzdHJpbmc7XG4gIGtleTogc3RyaW5nO1xuICBidWNrZXQ6IHN0cmluZztcbiAgZVRhZzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFVwbG9hZCBmaWxlcyB0byBzMyBvciByZXR1cm4gdXBsb2FkIFVybFxuICogQHBhcmFtcyByZXR1cm5TaWduZWRVcmxPbmx5OiBib29sZWFuIEBkZWZhdWx0IGZhbHNlXG4gKi9cbmV4cG9ydCBjbGFzcyBBc3NldHNVcGxvYWRlciBleHRlbmRzIEJhc2VIYW5kbGVyIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzMzogUzMpIHtcbiAgICBzdXBlcigpO1xuICB9XG4gIGFzeW5jIHJ1bihcbiAgICBldmVudDogQVBJR2F0ZXdheUV2ZW50XG4gICk6IFByb21pc2U8e1xuICAgIHN0YXR1c0NvZGU6IG51bWJlcjtcbiAgICBib2R5OiBzdHJpbmc7XG4gICAgaGVhZGVycz86IHVua25vd247XG4gICAgaXNCYXNlNjRFbmNvZGVkOiBib29sZWFuO1xuICB9PiB7XG4gICAgY29uc3QgYnVja2V0TmFtZSA9IHByb2Nlc3MuZW52LkJVQ0tFVF9OQU1FO1xuXG4gICAgaWYgKCFidWNrZXROYW1lKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmNvZGVkUmVzcG9uc2Uoe1xuICAgICAgICBzdGF0dXNDb2RlOiA1MDAsXG4gICAgICAgIGJvZHk6IHsgbWVzc2FnZTogJ01pc3NpbmcgcmVxdWlyZWQgZW52aXJvbm1lbnQgdmFyaWFibGU6IEJVQ0tFVF9OQU1FJyB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFldmVudC5ib2R5KSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmNvZGVkUmVzcG9uc2Uoe1xuICAgICAgICBzdGF0dXNDb2RlOiA0MDAsXG4gICAgICAgIGJvZHk6IHsgbWVzc2FnZTogJ0Nhbm5vdCB1cGxvYWQgcHJvY2VzcyByZXF1ZXN0IHdpdGggZW1wdHkgYm9keScgfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IHBhcnNlZEJvZHkgfSA9IGF3YWl0IHRoaXMucGFyc2VGb3JtRGF0YShldmVudCk7XG5cbiAgICAgIGlmICghcGFyc2VkQm9keSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGJvZHkgYWZ0ZXIgcGFyc2luZy4nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFwYXJzZWRCb2R5LmZpZWxkcz8uczNQcmVmaXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlZFJlc3BvbnNlKHtcbiAgICAgICAgICBzdGF0dXNDb2RlOiA0MDAsXG4gICAgICAgICAgYm9keTogeyBtZXNzYWdlOiBgTWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eTogczNQcmVmaXhgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzM1VwbG9hZFByb21pc2VzID0gW10gYXMgUHJvbWlzZTxTMy5NYW5hZ2VkVXBsb2FkLlNlbmREYXRhPltdO1xuXG4gICAgICBmb3IgKGNvbnN0IGZpbGVLZXkgaW4gcGFyc2VkQm9keT8uZmlsZXMpIHtcbiAgICAgICAgY29uc3QgY3VycmVudEZpbGUgPSBwYXJzZWRCb2R5Py5maWxlc1tmaWxlS2V5XTtcbiAgICAgICAgaWYgKCFjdXJyZW50RmlsZT8uZGF0YSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmVuY29kZWRSZXNwb25zZSh7XG4gICAgICAgICAgICBzdGF0dXNDb2RlOiA0MDAsXG4gICAgICAgICAgICBib2R5OiBgVW5hYmxlIHRvIHBhcnNlIGJpbmFyeSAke2N1cnJlbnRGaWxlLmZpbGVOYW1lfWAsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWxlUHVibGljTmFtZSA9IGN1cnJlbnRGaWxlLmZpbGVOYW1lID8/IGN1cnJlbnRGaWxlLmZpZWxkTmFtZTtcbiAgICAgICAgY29uc29sZS5sb2coJ1VwbG9hZGluZyBGaWxlOiAnLCBmaWxlUHVibGljTmFtZSk7XG4gICAgICAgIGNvbnN0IFtuYW1lLCBleHRdID0gZmlsZVB1YmxpY05hbWUuc3BsaXQoJy4nKTtcblxuICAgICAgICAvLyB1cGxvYWQgZWFjaCBmaWxlIHRvIHMzXG4gICAgICAgIHMzVXBsb2FkUHJvbWlzZXMucHVzaChcbiAgICAgICAgICB0aGlzLnMzXG4gICAgICAgICAgICAudXBsb2FkKHtcbiAgICAgICAgICAgICAgQnVja2V0OiBidWNrZXROYW1lLFxuICAgICAgICAgICAgICBLZXk6IGAke3BhcnNlZEJvZHkuZmllbGRzLnMzUHJlZml4fS8ke1tzbmFrZUNhc2UobmFtZSksIGV4dF0uam9pbihcbiAgICAgICAgICAgICAgICAnLidcbiAgICAgICAgICAgICAgKX1gLFxuICAgICAgICAgICAgICBDb250ZW50VHlwZTogY3VycmVudEZpbGUubWltZVR5cGUsXG4gICAgICAgICAgICAgIEJvZHk6IGN1cnJlbnRGaWxlLmRhdGEsXG4gICAgICAgICAgICAgIENvbnRlbnRFbmNvZGluZzogY3VycmVudEZpbGUuZW5jb2RpbmcsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnByb21pc2UoKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBQcm9taXNlLmFsbChzM1VwbG9hZFByb21pc2VzKTtcblxuICAgICAgY29uc3QgcmVzcG9uc2VUb1JldHVybiA9IHJlc3BvbnNlLm1hcCgocmV0dXJuZWRJdGVtKSA9PiAoe1xuICAgICAgICBsb2NhdGlvbjogcmV0dXJuZWRJdGVtLkxvY2F0aW9uLFxuICAgICAgICBrZXk6IHJldHVybmVkSXRlbS5LZXksXG4gICAgICAgIGJ1Y2tldDogcmV0dXJuZWRJdGVtLkJ1Y2tldCxcbiAgICAgICAgZVRhZzogcmV0dXJuZWRJdGVtLkVUYWcsXG4gICAgICB9KSkgYXMgSVVwbG9hZFN1Y2Nlc3NCb2R5W107XG5cbiAgICAgIHJldHVybiB0aGlzLmVuY29kZWRSZXNwb25zZSh7XG4gICAgICAgIHN0YXR1c0NvZGU6IDIwMCxcbiAgICAgICAgYm9keTpcbiAgICAgICAgICByZXNwb25zZVRvUmV0dXJuLmxlbmd0aCA+IDEgPyByZXNwb25zZVRvUmV0dXJuIDogcmVzcG9uc2VUb1JldHVyblswXSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5sb2coJ0Vycm9yIHByb2Nlc3NpbmcgcmVxdWVzdDogJywgZXJyKTtcbiAgICAgIHJldHVybiB0aGlzLmVuY29kZWRSZXNwb25zZSh7XG4gICAgICAgIHN0YXR1c0NvZGU6IDUwMCxcbiAgICAgICAgYm9keTogeyBtZXNzYWdlOiBlcnIubWVzc2FnZSA/PyAnU29tZXRoaW5nIHdlbnQgd3JvbmchJyB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcGFyc2VGb3JtRGF0YShcbiAgICBldmVudDogQVBJR2F0ZXdheUV2ZW50ICYge1xuICAgICAgcGFyc2VkQm9keT86IHtcbiAgICAgICAgZmlsZXM6IHtcbiAgICAgICAgICBba2V5OiBzdHJpbmddOiB7XG4gICAgICAgICAgICBkYXRhPzogQnVmZmVyO1xuICAgICAgICAgICAgZmlsZU5hbWU/OiBzdHJpbmc7XG4gICAgICAgICAgICBmaWVsZE5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIGVuY29kaW5nOiBzdHJpbmc7XG4gICAgICAgICAgICBtaW1lVHlwZTogc3RyaW5nO1xuICAgICAgICAgICAgdmFsdWU/OiB1bmtub3duO1xuICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICAgIGZpZWxkczogeyBbZmllbGROYW1lOiBzdHJpbmddOiB1bmtub3duIH07XG4gICAgICB9O1xuICAgIH1cbiAgKTogUHJvbWlzZTx0eXBlb2YgZXZlbnQ+IHtcbiAgICBjb25zdCBidXNib3kgPSBuZXcgQnVzYm95KHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ2NvbnRlbnQtdHlwZSc6XG4gICAgICAgICAgZXZlbnQuaGVhZGVyc1snQ29udGVudC1UeXBlJ10gfHwgZXZlbnQuaGVhZGVyc1snY29udGVudC10eXBlJ10sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgZmlsZXM6IHt9LFxuICAgICAgZmllbGRzOiB7fSxcbiAgICB9IGFzIHtcbiAgICAgIGZpbGVzOiB7XG4gICAgICAgIFtmaWxlTmFtZTogc3RyaW5nXToge1xuICAgICAgICAgIGRhdGE/OiBCdWZmZXI7XG4gICAgICAgICAgZmlsZU5hbWU/OiBzdHJpbmc7XG4gICAgICAgICAgZmllbGROYW1lOiBzdHJpbmc7XG4gICAgICAgICAgZW5jb2Rpbmc6IHN0cmluZztcbiAgICAgICAgICBtaW1lVHlwZTogc3RyaW5nO1xuICAgICAgICAgIHZhbHVlPzogdW5rbm93bjtcbiAgICAgICAgICBpc0JpbmFyeT86IGJvb2xlYW47XG4gICAgICAgIH07XG4gICAgICB9O1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIFtmaWVsZE5hbWU6IHN0cmluZ106IHVua25vd247XG4gICAgICB9O1xuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgYnVzYm95XG4gICAgICAgIC5vbignZmlsZScsIChmaWVsZE5hbWUsIGZpbGUsIGZpbGVOYW1lLCBlbmNvZGluZywgbWltZVR5cGUpID0+IHtcbiAgICAgICAgICBsZXQgZmlsZURhdGE6IEJ1ZmZlcjtcbiAgICAgICAgICBmaWxlLm9uKCdkYXRhJywgKGRhdGE6IEJ1ZmZlcikgPT4ge1xuICAgICAgICAgICAgZmlsZURhdGEgPSBkYXRhO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgZmlsZS5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICAgICAgcmVzdWx0LmZpbGVzW2ZpZWxkTmFtZV0gPSB7XG4gICAgICAgICAgICAgIGRhdGE6IGZpbGVEYXRhLFxuICAgICAgICAgICAgICBmaWxlTmFtZSxcbiAgICAgICAgICAgICAgZmllbGROYW1lLFxuICAgICAgICAgICAgICBlbmNvZGluZyxcbiAgICAgICAgICAgICAgbWltZVR5cGUsXG4gICAgICAgICAgICAgIGlzQmluYXJ5OiB0cnVlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdmaWVsZCcsIChmaWVsZE5hbWUsIHZhbHVlKSA9PiB7XG4gICAgICAgICAgcmVzdWx0LmZpZWxkc1tmaWVsZE5hbWVdID0gdmFsdWU7XG4gICAgICAgIH0pXG4gICAgICAgIC5vbignZXJyb3InLCAoZXJyOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9KVxuXG4gICAgICAgIC5vbignZmluaXNoJywgKCkgPT4ge1xuICAgICAgICAgIGV2ZW50LnBhcnNlZEJvZHkgPSByZXN1bHQ7XG4gICAgICAgICAgcmVzb2x2ZShldmVudCk7XG4gICAgICAgIH0pO1xuXG4gICAgICBidXNib3kud3JpdGUoXG4gICAgICAgIGV2ZW50LmJvZHkgfHwgJycsXG4gICAgICAgIGV2ZW50LmlzQmFzZTY0RW5jb2RlZCA/ICdiYXNlNjQnIDogJ2JpbmFyeSdcbiAgICAgICk7XG4gICAgICBidXNib3kuZW5kKCk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==