UNPKG

@cdkx/web-application

Version:

Static web application hosting related constructs

137 lines 15.1 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-downloader", ["require", "exports", "@cdkx/web-application/handlers/base-handler", "sharp"], factory); } })(function (require, exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AssetsDownloader = void 0; const base_handler_1 = require("@cdkx/web-application/handlers/base-handler"); const sharp_1 = __importDefault(require("sharp")); class AssetsDownloader extends base_handler_1.BaseHandler { constructor(s3) { super(); this.s3 = s3; } run(event) { var _a, _b; return __awaiter(this, void 0, void 0, function* () { const bucketName = process.env.BUCKET_NAME; const assetPublicHost = process.env.ASSETS_PUBLIC_HOST; if (!bucketName) { return this.encodedResponse({ statusCode: 500, body: { message: 'Missing required environment variable: BUCKET_NAME' }, }); } if (!assetPublicHost) { return this.encodedResponse({ statusCode: 500, body: { message: 'Missing required environment variable: ASSETS_PUBLIC_HOST', }, }); } const { size = 'cover', position = 'center', resolution, key } = (_a = event.queryStringParameters) !== null && _a !== void 0 ? _a : {}; if (!key) { return this.encodedResponse({ statusCode: 500, body: { message: 'Could not resolve file name.', }, }); } // if original file requested redirect to it if (!resolution) { return this.encodedResponse({ // permanent redirect statusCode: 301, body: '', headers: { location: `${assetPublicHost}/${key}`, }, }); } // when height or width is set to null, sharp auto assumes width/height const [width, height] = resolution .toUpperCase() .split('X') .map((seg) => (seg !== 'AUTO' ? Number.parseInt(seg) : null)); let originalFile; try { originalFile = yield this.s3 .getObject({ Bucket: bucketName, Key: key, }) .promise(); } catch (err) { if (err.code !== 'NoSuchKey') { throw err; } return this.encodedResponse({ statusCode: 404, body: '', }); } try { if (!(originalFile === null || originalFile === void 0 ? void 0 : originalFile.Body)) { throw new Error(`Could not load original file from ${bucketName}, tried key ${key}`); } const resizedImage = yield sharp_1.default(originalFile.Body) .resize(width, height, { position, fit: size, }) .toBuffer(); const uploadedResizedImage = yield this.s3 .upload({ Bucket: bucketName, Key: `${resolution}/${key}`, Body: resizedImage, ContentDisposition: originalFile.ContentDisposition, CacheControl: originalFile.CacheControl, ContentEncoding: originalFile.ContentEncoding, ContentType: originalFile.ContentType, Metadata: originalFile.Metadata, }) .promise(); return this.encodedResponse({ // permanent redirect to new uploaded image statusCode: 301, body: '', headers: { location: `${assetPublicHost}/${uploadedResizedImage.Key}`, }, }); } catch (err) { console.log('Error processing request: ', err); return this.encodedResponse({ statusCode: 500, body: { message: (_b = err.message) !== null && _b !== void 0 ? _b : 'Something went wrong!' }, }); } }); } } exports.AssetsDownloader = AssetsDownloader; }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzLWRvd25sb2FkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy93ZWItYXBwbGljYXRpb24vaGFuZGxlcnMvYXNzZXRzLWRvd25sb2FkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBRUEsK0VBQTZDO0lBQzdDLGtEQUEwQjtJQUkxQixNQUFhLGdCQUFpQixTQUFRLDBCQUFXO1FBQy9DLFlBQW9CLEVBQU07WUFDeEIsS0FBSyxFQUFFLENBQUM7WUFEVSxPQUFFLEdBQUYsRUFBRSxDQUFJO1FBRTFCLENBQUM7UUFFSyxHQUFHLENBQ1AsS0FBc0I7OztnQkFPdEIsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUM7Z0JBQzNDLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUM7Z0JBRXZELElBQUksQ0FBQyxVQUFVLEVBQUU7b0JBQ2YsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO3dCQUMxQixVQUFVLEVBQUUsR0FBRzt3QkFDZixJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsb0RBQW9ELEVBQUU7cUJBQ3hFLENBQUMsQ0FBQztpQkFDSjtnQkFDRCxJQUFJLENBQUMsZUFBZSxFQUFFO29CQUNwQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7d0JBQzFCLFVBQVUsRUFBRSxHQUFHO3dCQUNmLElBQUksRUFBRTs0QkFDSixPQUFPLEVBQUUsMkRBQTJEO3lCQUNyRTtxQkFDRixDQUFDLENBQUM7aUJBQ0o7Z0JBRUQsTUFBTSxFQUFFLElBQUksR0FBRyxPQUFPLEVBQUUsUUFBUSxHQUFHLFFBQVEsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLEdBQzVELE1BQUMsS0FBSyxDQUFDLHFCQUtMLG1DQUFJLEVBQUUsQ0FBQztnQkFFWCxJQUFJLENBQUMsR0FBRyxFQUFFO29CQUNSLE9BQU8s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Q0FBQyw0QkFBNEIsRUFBRSxHQUFHLENBQUMsQ0FBQztvQkFDL0MsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO3dCQUMxQixVQUFVLEVBQUUsR0FBRzt3QkFDZixJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBQSxHQUFHLENBQUMsT0FBTyxtQ0FBSSx1QkFBdUIsRUFBRTtxQkFDMUQsQ0FBQyxDQUFDO2lCQUNKOztTQUNGO0tBQ0Y7SUEvSEQsNENBK0hDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQVBJR2F0ZXdheUV2ZW50IH0gZnJvbSAnYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBTMyB9IGZyb20gJ2F3cy1zZGsnO1xuaW1wb3J0IHsgQmFzZUhhbmRsZXIgfSBmcm9tICcuL2Jhc2UtaGFuZGxlcic7XG5pbXBvcnQgc2hhcnAgZnJvbSAnc2hhcnAnO1xuXG50eXBlIENzc1NpemUgPSAnY29udGFpbicgfCAnY292ZXInIHwgJ2ZpbGwnIHwgJ2luc2lkZScgfCAnb3V0c2lkZSc7XG5cbmV4cG9ydCBjbGFzcyBBc3NldHNEb3dubG9hZGVyIGV4dGVuZHMgQmFzZUhhbmRsZXIge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHMzOiBTMykge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBhc3luYyBydW4oXG4gICAgZXZlbnQ6IEFQSUdhdGV3YXlFdmVudFxuICApOiBQcm9taXNlPHtcbiAgICBzdGF0dXNDb2RlOiBudW1iZXI7XG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogc3RyaW5nIH07XG4gICAgYm9keTogc3RyaW5nO1xuICAgIGlzQmFzZTY0RW5jb2RlZDogYm9vbGVhbjtcbiAgfT4ge1xuICAgIGNvbnN0IGJ1Y2tldE5hbWUgPSBwcm9jZXNzLmVudi5CVUNLRVRfTkFNRTtcbiAgICBjb25zdCBhc3NldFB1YmxpY0hvc3QgPSBwcm9jZXNzLmVudi5BU1NFVFNfUFVCTElDX0hPU1Q7XG5cbiAgICBpZiAoIWJ1Y2tldE5hbWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuY29kZWRSZXNwb25zZSh7XG4gICAgICAgIHN0YXR1c0NvZGU6IDUwMCxcbiAgICAgICAgYm9keTogeyBtZXNzYWdlOiAnTWlzc2luZyByZXF1aXJlZCBlbnZpcm9ubWVudCB2YXJpYWJsZTogQlVDS0VUX05BTUUnIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKCFhc3NldFB1YmxpY0hvc3QpIHtcbiAgICAgIHJldHVybiB0aGlzLmVuY29kZWRSZXNwb25zZSh7XG4gICAgICAgIHN0YXR1c0NvZGU6IDUwMCxcbiAgICAgICAgYm9keToge1xuICAgICAgICAgIG1lc3NhZ2U6ICdNaXNzaW5nIHJlcXVpcmVkIGVudmlyb25tZW50IHZhcmlhYmxlOiBBU1NFVFNfUFVCTElDX0hPU1QnLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBzaXplID0gJ2NvdmVyJywgcG9zaXRpb24gPSAnY2VudGVyJywgcmVzb2x1dGlvbiwga2V5IH0gPVxuICAgICAgKGV2ZW50LnF1ZXJ5U3RyaW5nUGFyYW1ldGVycyBhcyB7XG4gICAgICAgIGtleTogc3RyaW5nO1xuICAgICAgICBzaXplOiBDc3NTaXplO1xuICAgICAgICBwb3NpdGlvbjogc3RyaW5nO1xuICAgICAgICByZXNvbHV0aW9uOiBzdHJpbmc7XG4gICAgICB9KSA/PyB7fTtcblxuICAgIGlmICgha2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5lbmNvZGVkUmVzcG9uc2Uoe1xuICAgICAgICBzdGF0dXNDb2RlOiA1MDAsXG4gICAgICAgIGJvZHk6IHtcbiAgICAgICAgICBtZXNzYWdlOiAnQ291bGQgbm90IHJlc29sdmUgZmlsZSBuYW1lLicsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBpZiBvcmlnaW5hbCBmaWxlIHJlcXVlc3RlZCByZWRpcmVjdCB0byBpdFxuICAgIGlmICghcmVzb2x1dGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlZFJlc3BvbnNlKHtcbiAgICAgICAgLy8gcGVybWFuZW50IHJlZGlyZWN0XG4gICAgICAgIHN0YXR1c0NvZGU6IDMwMSxcbiAgICAgICAgYm9keTogJycsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBsb2NhdGlvbjogYCR7YXNzZXRQdWJsaWNIb3N0fS8ke2tleX1gLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gd2hlbiBoZWlnaHQgb3Igd2lkdGggaXMgc2V0IHRvIG51bGwsIHNoYXJwIGF1dG8gYXNzdW1lcyB3aWR0aC9oZWlnaHRcbiAgICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPSByZXNvbHV0aW9uXG4gICAgICAudG9VcHBlckNhc2UoKVxuICAgICAgLnNwbGl0KCdYJylcbiAgICAgIC5tYXAoKHNlZykgPT4gKHNlZyAhPT0gJ0FVVE8nID8gTnVtYmVyLnBhcnNlSW50KHNlZykgOiBudWxsKSk7XG5cbiAgICBsZXQgb3JpZ2luYWxGaWxlOiBTMy5HZXRPYmplY3RPdXRwdXQ7XG4gICAgdHJ5IHtcbiAgICAgIG9yaWdpbmFsRmlsZSA9IGF3YWl0IHRoaXMuczNcbiAgICAgICAgLmdldE9iamVjdCh7XG4gICAgICAgICAgQnVja2V0OiBidWNrZXROYW1lLFxuICAgICAgICAgIEtleToga2V5LFxuICAgICAgICB9KVxuICAgICAgICAucHJvbWlzZSgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyci5jb2RlICE9PSAnTm9TdWNoS2V5Jykge1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5lbmNvZGVkUmVzcG9uc2Uoe1xuICAgICAgICBzdGF0dXNDb2RlOiA0MDQsXG4gICAgICAgIGJvZHk6ICcnLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGlmICghb3JpZ2luYWxGaWxlPy5Cb2R5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ291bGQgbm90IGxvYWQgb3JpZ2luYWwgZmlsZSBmcm9tICR7YnVja2V0TmFtZX0sIHRyaWVkIGtleSAke2tleX1gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc2l6ZWRJbWFnZSA9IGF3YWl0IHNoYXJwKG9yaWdpbmFsRmlsZS5Cb2R5IGFzIEJ1ZmZlcilcbiAgICAgICAgLnJlc2l6ZSh3aWR0aCwgaGVpZ2h0LCB7XG4gICAgICAgICAgcG9zaXRpb24sXG4gICAgICAgICAgZml0OiBzaXplLFxuICAgICAgICB9KVxuICAgICAgICAudG9CdWZmZXIoKTtcblxuICAgICAgY29uc3QgdXBsb2FkZWRSZXNpemVkSW1hZ2UgPSBhd2FpdCB0aGlzLnMzXG4gICAgICAgIC51cGxvYWQoe1xuICAgICAgICAgIEJ1Y2tldDogYnVja2V0TmFtZSxcbiAgICAgICAgICBLZXk6IGAke3Jlc29sdXRpb259LyR7a2V5fWAsXG4gICAgICAgICAgQm9keTogcmVzaXplZEltYWdlLFxuICAgICAgICAgIENvbnRlbnREaXNwb3NpdGlvbjogb3JpZ2luYWxGaWxlLkNvbnRlbnREaXNwb3NpdGlvbixcbiAgICAgICAgICBDYWNoZUNvbnRyb2w6IG9yaWdpbmFsRmlsZS5DYWNoZUNvbnRyb2wsXG4gICAgICAgICAgQ29udGVudEVuY29kaW5nOiBvcmlnaW5hbEZpbGUuQ29udGVudEVuY29kaW5nLFxuICAgICAgICAgIENvbnRlbnRUeXBlOiBvcmlnaW5hbEZpbGUuQ29udGVudFR5cGUsXG4gICAgICAgICAgTWV0YWRhdGE6IG9yaWdpbmFsRmlsZS5NZXRhZGF0YSxcbiAgICAgICAgfSlcbiAgICAgICAgLnByb21pc2UoKTtcblxuICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlZFJlc3BvbnNlKHtcbiAgICAgICAgLy8gcGVybWFuZW50IHJlZGlyZWN0IHRvIG5ldyB1cGxvYWRlZCBpbWFnZVxuICAgICAgICBzdGF0dXNDb2RlOiAzMDEsXG4gICAgICAgIGJvZHk6ICcnLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgbG9jYXRpb246IGAke2Fzc2V0UHVibGljSG9zdH0vJHt1cGxvYWRlZFJlc2l6ZWRJbWFnZS5LZXl9YCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5sb2coJ0Vycm9yIHByb2Nlc3NpbmcgcmVxdWVzdDogJywgZXJyKTtcbiAgICAgIHJldHVybiB0aGlzLmVuY29kZWRSZXNwb25zZSh7XG4gICAgICAgIHN0YXR1c0NvZGU6IDUwMCxcbiAgICAgICAgYm9keTogeyBtZXNzYWdlOiBlcnIubWVzc2FnZSA/PyAnU29tZXRoaW5nIHdlbnQgd3JvbmchJyB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iXX0=