UNPKG

@scloud/lambda-local

Version:

Run typical Lambda handlers locally.

105 lines 16.8 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.webappRoutesLocal = webappRoutesLocal; const express_1 = __importDefault(require("express")); function webappRoutesLocal(cloudfrontPathMappings, staticContent, debug = false) { const port = +(process.env.port || '3000'); const app = (0, express_1.default)(); // https://stackoverflow.com/questions/12345166/how-to-force-parse-request-body-as-plain-text-instead-of-json-in-express app.use(express_1.default.text({ type: '*/*' })); Object.keys(cloudfrontPathMappings).forEach((route) => { app.all(route, async (req, res) => { // const url = new URL(req.originalUrl, 'https://example.com'); // Headers - NB it seems that in Lambda multiValueHeaders always contains the values from headers const headers = {}; const multiValueHeaders = {}; Object.keys(req.headers).forEach((header) => { if (req.headers[header] === undefined) { headers[header] = undefined; multiValueHeaders[header] = undefined; } if (typeof req.headers[header] === 'string') { headers[header] = req.headers[header]; multiValueHeaders[header] = [req.headers[header]]; } if (Array.isArray(req.headers[header])) { multiValueHeaders[header] = req.headers[header]; } }); // Query string - basic translation const queryStringParameters = {}; const multiValueQueryStringParameters = {}; Object.keys(req.query).forEach((parameter) => { queryStringParameters[parameter] = undefined; if (typeof req.query[parameter] === 'string') queryStringParameters[parameter] = req.query[parameter]; if (Array.isArray(req.query[parameter])) multiValueQueryStringParameters[parameter] = req.query[parameter]; }); const event = { body: typeof req.body === 'string' ? req.body : JSON.stringify(req.body), headers, multiValueHeaders, httpMethod: req.method, path: req.path, queryStringParameters, multiValueQueryStringParameters, requestContext: { httpMethod: req.method, path: req.path, protocol: req.protocol, }, }; try { // Print out the event that will be sent to the handler if (debug) { console.log('Event:'); console.log(event.httpMethod, event.path); console.log(JSON.stringify(event, null, 2)); } const paths = Object.keys(cloudfrontPathMappings); // Use the handler for this Express route const handler = cloudfrontPathMappings[route]; if (!handler) console.log(`Unmatched path: ${event.path}`); // Invoke the function handler: const result = handler ? await handler(event, {}) : { statusCode: 404, body: `Path not matched: ${event.path} (${paths})` }; // Print out the response if successful if (debug) { console.log('Result:'); console.log(event.httpMethod, event.path, result.statusCode); console.log(JSON.stringify(result, null, 2)); } // Send the response res.status(result.statusCode); if (result.multiValueHeaders) { Object.keys(result.multiValueHeaders).forEach((key) => { res.set(key, result.multiValueHeaders[key].map((value) => `${value}`)); }); } if (result.headers) { Object.keys(result.headers).forEach((key) => { res.set(key, `${result.headers[key]}`); }); } // Body res.send(result.body); } catch (e) { // Log the error and send a 500 response console.log(e); console.log(e.stack); res.status(500).send(`${e}`); } }); }); if (staticContent) app.use(express_1.default.static(staticContent)); app.listen(port, () => { console.log(`Lambda handler can be invoked at http://localhost:${port}`); }); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViYXBwUm91dGVzTG9jYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd2ViYXBwUm91dGVzTG9jYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFPQSw4Q0F5R0M7QUFoSEQsc0RBQXFEO0FBT3JELFNBQWdCLGlCQUFpQixDQUFDLHNCQUE4QyxFQUFFLGFBQXNCLEVBQUUsS0FBSyxHQUFHLEtBQUs7SUFDckgsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxDQUFDO0lBQzNDLE1BQU0sR0FBRyxHQUFHLElBQUEsaUJBQU8sR0FBRSxDQUFDO0lBRXRCLHdIQUF3SDtJQUN4SCxHQUFHLENBQUMsR0FBRyxDQUFDLGlCQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUV2QyxNQUFNLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDcEQsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQVksRUFBRSxHQUFhLEVBQUUsRUFBRTtZQUNuRCwrREFBK0Q7WUFDL0QsaUdBQWlHO1lBQ2pHLE1BQU0sT0FBTyxHQUF1QyxFQUFFLENBQUM7WUFDdkQsTUFBTSxpQkFBaUIsR0FBeUMsRUFBRSxDQUFDO1lBQ25FLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUMxQyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ3RDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUM7b0JBQzVCLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxHQUFHLFNBQVMsQ0FB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RyxFQUFFLEVBQUU7d0JBQzFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLE9BQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQzFDLENBQUMsQ0FBQyxDQUFDO2dCQUNMLENBQUM7Z0JBRUQsT0FBTztnQkFDUCxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUV4QixDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDWCx3Q0FBd0M7Z0JBQ3hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2YsT0FBTyxDQUFDLEdBQUcsQ0FBRSxDQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2hDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMvQixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUksYUFBYTtRQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsaUJBQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUUxRCxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUU7UUFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxREFBcUQsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMzRSxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZXhwcmVzcywgeyBSZXF1ZXN0LCBSZXNwb25zZSB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHsgQVBJR2F0ZXdheVByb3h5RXZlbnQsIEFQSUdhdGV3YXlQcm94eVJlc3VsdCwgQ29udGV4dCB9IGZyb20gJ2F3cy1sYW1iZGEnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENsb3VkZnJvbnRQYXRoTWFwcGluZ3Mge1xuICBba2V5OiBzdHJpbmddOiAoZXZlbnQ6IEFQSUdhdGV3YXlQcm94eUV2ZW50LCBjb250ZXh0OiBDb250ZXh0KSA9PiBQcm9taXNlPEFQSUdhdGV3YXlQcm94eVJlc3VsdD47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3ZWJhcHBSb3V0ZXNMb2NhbChjbG91ZGZyb250UGF0aE1hcHBpbmdzOiBDbG91ZGZyb250UGF0aE1hcHBpbmdzLCBzdGF0aWNDb250ZW50Pzogc3RyaW5nLCBkZWJ1ZyA9IGZhbHNlKSB7XG4gIGNvbnN0IHBvcnQgPSArKHByb2Nlc3MuZW52LnBvcnQgfHwgJzMwMDAnKTtcbiAgY29uc3QgYXBwID0gZXhwcmVzcygpO1xuXG4gIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEyMzQ1MTY2L2hvdy10by1mb3JjZS1wYXJzZS1yZXF1ZXN0LWJvZHktYXMtcGxhaW4tdGV4dC1pbnN0ZWFkLW9mLWpzb24taW4tZXhwcmVzc1xuICBhcHAudXNlKGV4cHJlc3MudGV4dCh7IHR5cGU6ICcqLyonIH0pKTtcblxuICBPYmplY3Qua2V5cyhjbG91ZGZyb250UGF0aE1hcHBpbmdzKS5mb3JFYWNoKChyb3V0ZSkgPT4ge1xuICAgIGFwcC5hbGwocm91dGUsIGFzeW5jIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICAgIC8vIGNvbnN0IHVybCA9IG5ldyBVUkwocmVxLm9yaWdpbmFsVXJsLCAnaHR0cHM6Ly9leGFtcGxlLmNvbScpO1xuICAgICAgLy8gSGVhZGVycyAtIE5CIGl0IHNlZW1zIHRoYXQgaW4gTGFtYmRhIG11bHRpVmFsdWVIZWFkZXJzIGFsd2F5cyBjb250YWlucyB0aGUgdmFsdWVzIGZyb20gaGVhZGVyc1xuICAgICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiA9IHt9O1xuICAgICAgY29uc3QgbXVsdGlWYWx1ZUhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdIHwgdW5kZWZpbmVkPiA9IHt9O1xuICAgICAgT2JqZWN0LmtleXMocmVxLmhlYWRlcnMpLmZvckVhY2goKGhlYWRlcikgPT4ge1xuICAgICAgICBpZiAocmVxLmhlYWRlcnNbaGVhZGVyXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaGVhZGVyc1toZWFkZXJdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG11bHRpVmFsdWVIZWFkZXJzW2hlYWRlcl0gPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByZXEuaGVhZGVyc1toZWFkZXJdID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGhlYWRlcnNbaGVhZGVyXSA9IHJlcS5oZWFkZXJzW2hlYWRlcl0gYXMgc3RyaW5nO1xuICAgICAgICAgIG11bHRpVmFsdWVIZWFkZXJzW2hlYWRlcl0gPSBbcmVxLmhlYWRlcnNbaGVhZGVyXSBhcyBzdHJpbmddO1xuICAgICAgICB9XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlcS5oZWFkZXJzW2hlYWRlcl0pKSB7XG4gICAgICAgICAgbXVsdGlWYWx1ZUhlYWRlcnNbaGVhZGVyXSA9IHJlcS5oZWFkZXJzW2hlYWRlcl0gYXMgc3RyaW5nW107XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBRdWVyeSBzdHJpbmcgLSBiYXNpYyB0cmFuc2xhdGlvblxuICAgICAgY29uc3QgcXVlcnlTdHJpbmdQYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+ID0ge307XG4gICAgICBjb25zdCBtdWx0aVZhbHVlUXVlcnlTdHJpbmdQYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXSB8IHVuZGVmaW5lZD4gPSB7fTtcbiAgICAgIE9iamVjdC5rZXlzKHJlcS5xdWVyeSkuZm9yRWFjaCgocGFyYW1ldGVyKSA9PiB7XG4gICAgICAgIHF1ZXJ5U3RyaW5nUGFyYW1ldGVyc1twYXJhbWV0ZXJdID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAodHlwZW9mIHJlcS5xdWVyeVtwYXJhbWV0ZXJdID09PSAnc3RyaW5nJykgcXVlcnlTdHJpbmdQYXJhbWV0ZXJzW3BhcmFtZXRlcl0gPSByZXEucXVlcnlbcGFyYW1ldGVyXSBhcyBzdHJpbmc7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlcS5xdWVyeVtwYXJhbWV0ZXJdKSkgbXVsdGlWYWx1ZVF1ZXJ5U3RyaW5nUGFyYW1ldGVyc1twYXJhbWV0ZXJdID0gcmVxLnF1ZXJ5W3BhcmFtZXRlcl0gYXMgc3RyaW5nW107XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZXZlbnQ6IEFQSUdhdGV3YXlQcm94eUV2ZW50ID0ge1xuICAgICAgICBib2R5OiB0eXBlb2YgcmVxLmJvZHkgPT09ICdzdHJpbmcnID8gcmVxLmJvZHkgOiBKU09OLnN0cmluZ2lmeShyZXEuYm9keSksXG4gICAgICAgIGhlYWRlcnMsXG4gICAgICAgIG11bHRpVmFsdWVIZWFkZXJzLFxuICAgICAgICBodHRwTWV0aG9kOiByZXEubWV0aG9kLFxuICAgICAgICBwYXRoOiByZXEucGF0aCxcbiAgICAgICAgcXVlcnlTdHJpbmdQYXJhbWV0ZXJzLFxuICAgICAgICBtdWx0aVZhbHVlUXVlcnlTdHJpbmdQYXJhbWV0ZXJzLFxuICAgICAgICByZXF1ZXN0Q29udGV4dDoge1xuICAgICAgICAgIGh0dHBNZXRob2Q6IHJlcS5tZXRob2QsXG4gICAgICAgICAgcGF0aDogcmVxLnBhdGgsXG4gICAgICAgICAgcHJvdG9jb2w6IHJlcS5wcm90b2NvbCxcbiAgICAgICAgfSBhcyB1bmtub3duIGFzIEFQSUdhdGV3YXlQcm94eUV2ZW50WydyZXF1ZXN0Q29udGV4dCddLFxuICAgICAgfSBhcyB1bmtub3duIGFzIEFQSUdhdGV3YXlQcm94eUV2ZW50O1xuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBQcmludCBvdXQgdGhlIGV2ZW50IHRoYXQgd2lsbCBiZSBzZW50IHRvIHRoZSBoYW5kbGVyXG4gICAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdFdmVudDonKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhldmVudC5odHRwTWV0aG9kLCBldmVudC5wYXRoKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShldmVudCwgbnVsbCwgMikpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGF0aHMgPSBPYmplY3Qua2V5cyhjbG91ZGZyb250UGF0aE1hcHBpbmdzKTtcblxuICAgICAgICAvLyBVc2UgdGhlIGhhbmRsZXIgZm9yIHRoaXMgRXhwcmVzcyByb3V0ZVxuICAgICAgICBjb25zdCBoYW5kbGVyID0gY2xvdWRmcm9udFBhdGhNYXBwaW5nc1tyb3V0ZV07XG4gICAgICAgIGlmICghaGFuZGxlcikgY29uc29sZS5sb2coYFVubWF0Y2hlZCBwYXRoOiAke2V2ZW50LnBhdGh9YCk7XG5cbiAgICAgICAgLy8gSW52b2tlIHRoZSBmdW5jdGlvbiBoYW5kbGVyOlxuICAgICAgICBjb25zdCByZXN1bHQgPSBoYW5kbGVyID8gYXdhaXQgaGFuZGxlcihldmVudCwge30gYXMgQ29udGV4dCkgOiB7IHN0YXR1c0NvZGU6IDQwNCwgYm9keTogYFBhdGggbm90IG1hdGNoZWQ6ICR7ZXZlbnQucGF0aH0gKCR7cGF0aHN9KWAgfTtcblxuICAgICAgICAvLyBQcmludCBvdXQgdGhlIHJlc3BvbnNlIGlmIHN1Y2Nlc3NmdWxcbiAgICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1Jlc3VsdDonKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhldmVudC5odHRwTWV0aG9kLCBldmVudC5wYXRoLCByZXN1bHQuc3RhdHVzQ29kZSk7XG4gICAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZW5kIHRoZSByZXNwb25zZVxuICAgICAgICByZXMuc3RhdHVzKHJlc3VsdC5zdGF0dXNDb2RlKTtcbiAgICAgICAgaWYgKHJlc3VsdC5tdWx0aVZhbHVlSGVhZGVycykge1xuICAgICAgICAgIE9iamVjdC5rZXlzKHJlc3VsdC5tdWx0aVZhbHVlSGVhZGVycykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICByZXMuc2V0KGtleSwgcmVzdWx0Lm11bHRpVmFsdWVIZWFkZXJzIVtrZXldLm1hcCgodmFsdWUpID0+IGAke3ZhbHVlfWApKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0LmhlYWRlcnMpIHtcbiAgICAgICAgICBPYmplY3Qua2V5cyhyZXN1bHQuaGVhZGVycykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICByZXMuc2V0KGtleSwgYCR7cmVzdWx0LmhlYWRlcnMhW2tleV19YCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCb2R5XG4gICAgICAgIHJlcy5zZW5kKHJlc3VsdC5ib2R5KTtcblxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBMb2cgdGhlIGVycm9yIGFuZCBzZW5kIGEgNTAwIHJlc3BvbnNlXG4gICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICBjb25zb2xlLmxvZygoZSBhcyBFcnJvcikuc3RhY2spO1xuICAgICAgICByZXMuc3RhdHVzKDUwMCkuc2VuZChgJHtlfWApO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBpZiAoc3RhdGljQ29udGVudCkgYXBwLnVzZShleHByZXNzLnN0YXRpYyhzdGF0aWNDb250ZW50KSk7XG5cbiAgYXBwLmxpc3Rlbihwb3J0LCAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coYExhbWJkYSBoYW5kbGVyIGNhbiBiZSBpbnZva2VkIGF0IGh0dHA6Ly9sb2NhbGhvc3Q6JHtwb3J0fWApO1xuICB9KTtcbn1cbiJdfQ==