@scloud/lambda-local
Version:
Run typical Lambda handlers locally.
117 lines • 17.5 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.cloudfrontLocal = cloudfrontLocal;
const express_1 = __importDefault(require("express"));
function cloudfrontLocal(cloudfrontPathMappings, 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: '*/*' }));
app.all('/*', 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,
},
};
if (debug) {
// Print out the event that will be sent to the handler
console.log('Event:');
console.log(event.httpMethod, event.path);
console.log(JSON.stringify(event, null, 2));
}
try {
const paths = Object.keys(cloudfrontPathMappings);
// Try a simple mapping
let handler = cloudfrontPathMappings[event.path];
// Fall back to a '*' match:
paths.forEach((path) => {
let partialMatch = path;
// Strip leading slash:
if (partialMatch.startsWith('/')) {
partialMatch = path.slice(1);
}
// Remove trailing '*' wildcard:
if (partialMatch.endsWith('*')) {
partialMatch = path.slice(0, -1);
}
// Get the first match:
const candidate = event.path.startsWith(partialMatch) ? cloudfrontPathMappings[path] : undefined;
handler = handler || candidate;
});
// 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) {
for (const key of Object.keys(result.multiValueHeaders)) {
res.set(key, result.multiValueHeaders[key].map((value) => `${value}`));
}
;
}
if (result.headers) {
for (const key of Object.keys(result.headers)) {
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}`);
}
;
});
app.listen(port, () => {
console.log(`Lambda handler can be invoked at http://localhost:${port}`);
});
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvdWRmcm9udExvY2FsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Nsb3VkZnJvbnRMb2NhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQVFBLDBDQW9IQztBQTNIRCxzREFBcUQ7QUFPckQsU0FBZ0IsZUFBZSxDQUFDLHNCQUE4QyxFQUFFLEtBQUssR0FBRyxLQUFLO0lBQzNGLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsQ0FBQztJQUMzQyxNQUFNLEdBQUcsR0FBRyxJQUFBLGlCQUFPLEdBQUUsQ0FBQztJQUV0Qix3SEFBd0g7SUFDeEgsR0FBRyxDQUFDLEdBQUcsQ0FBQyxpQkFBTyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFdkMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQVksRUFBRSxHQUFhLEVBQUUsRUFBRTtRQUNsRCwrREFBK0Q7UUFDL0QsaUdBQWlHO1FBQ2pHLE1BQU0sT0FBTyxHQUF1QyxFQUFFLENBQUM7UUFDdkQsTUFBTSxpQkFBaUIsR0FBeUMsRUFBRSxDQUFDO1FBQ25FLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQzFDLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDdEMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLFNBQVMsQ0FBQztnQkFDNUIsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDO1lBQ3hDLENBQUM7WUFDRCxJQUFJLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDNUMsT0FBTyxD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LENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IGV4cHJlc3MsIHsgUmVxdWVzdCwgUmVzcG9uc2UgfSBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IEFQSUdhdGV3YXlQcm94eUV2ZW50LCBBUElHYXRld2F5UHJveHlSZXN1bHQsIENvbnRleHQgfSBmcm9tICdhd3MtbGFtYmRhJztcblxuZXhwb3J0IGludGVyZmFjZSBDbG91ZGZyb250UGF0aE1hcHBpbmdzIHtcbiAgW2tleTogc3RyaW5nXTogKGV2ZW50OiBBUElHYXRld2F5UHJveHlFdmVudCwgY29udGV4dDogQ29udGV4dCkgPT4gUHJvbWlzZTxBUElHYXRld2F5UHJveHlSZXN1bHQ+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xvdWRmcm9udExvY2FsKGNsb3VkZnJvbnRQYXRoTWFwcGluZ3M6IENsb3VkZnJvbnRQYXRoTWFwcGluZ3MsIGRlYnVnID0gZmFsc2UpIHtcbiAgY29uc3QgcG9ydCA9ICsocHJvY2Vzcy5lbnYucG9ydCB8fCAnMzAwMCcpO1xuICBjb25zdCBhcHAgPSBleHByZXNzKCk7XG5cbiAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTIzNDUxNjYvaG93LXRvLWZvcmNlLXBhcnNlLXJlcXVlc3QtYm9keS1hcy1wbGFpbi10ZXh0LWluc3RlYWQtb2YtanNvbi1pbi1leHByZXNzXG4gIGFwcC51c2UoZXhwcmVzcy50ZXh0KHsgdHlwZTogJyovKicgfSkpO1xuXG4gIGFwcC5hbGwoJy8qJywgYXN5bmMgKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4ge1xuICAgIC8vIGNvbnN0IHVybCA9IG5ldyBVUkwocmVxLm9yaWdpbmFsVXJsLCAnaHR0cHM6Ly9leGFtcGxlLmNvbScpO1xuICAgIC8vIEhlYWRlcnMgLSBOQiBpdCBzZWVtcyB0aGF0IGluIExhbWJkYSBtdWx0aVZhbHVlSGVhZGVycyBhbHdheXMgY29udGFpbnMgdGhlIHZhbHVlcyBmcm9tIGhlYWRlcnNcbiAgICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+ID0ge307XG4gICAgY29uc3QgbXVsdGlWYWx1ZUhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdIHwgdW5kZWZpbmVkPiA9IHt9O1xuICAgIE9iamVjdC5rZXlzKHJlcS5oZWFkZXJzKS5mb3JFYWNoKChoZWFkZXIpID0+IHtcbiAgICAgIGlmIChyZXEuaGVhZGVyc1toZWFkZXJdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaGVhZGVyc1toZWFkZXJdID0gdW5kZWZpbmVkO1xuICAgICAgICBtdWx0aVZhbHVlSGVhZGVyc1toZWFkZXJdID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiByZXEuaGVhZGVyc1toZWFkZXJdID09PSAnc3RyaW5nJykge1xuICAgICAgICBoZWFkZXJzW2hlYWRlcl0gPSByZXEuaGVhZGVyc1toZWFkZXJdIGFzIHN0cmluZztcbiAgICAgICAgbXVsdGlWYWx1ZUhlYWRlcnNbaGVhZGVyXSA9IFtyZXEuaGVhZGVyc1toZWFkZXJdIGFzIHN0cmluZ107XG4gICAgICB9XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXEuaGVhZGVyc1toZWFkZXJdKSkge1xuICAgICAgICBtdWx0aVZhbHVlSGVhZGVyc1toZWFkZXJdID0gcmVxLmhlYWRlcnNbaGVhZGVyXSBhcyBzdHJpbmdbXTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFF1ZXJ5IHN0cmluZyAtIGJhc2ljIHRyYW5zbGF0aW9uXG4gICAgY29uc3QgcXVlcnlTdHJpbmdQYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+ID0ge307XG4gICAgY29uc3QgbXVsdGlWYWx1ZVF1ZXJ5U3RyaW5nUGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10gfCB1bmRlZmluZWQ+ID0ge307XG4gICAgT2JqZWN0LmtleXMocmVxLnF1ZXJ5KS5mb3JFYWNoKChwYXJhbWV0ZXIpID0+IHtcbiAgICAgIHF1ZXJ5U3RyaW5nUGFyYW1ldGVyc1twYXJhbWV0ZXJdID0gdW5kZWZpbmVkO1xuICAgICAgaWYgKHR5cGVvZiByZXEucXVlcnlbcGFyYW1ldGVyXSA9PT0gJ3N0cmluZycpIHF1ZXJ5U3RyaW5nUGFyYW1ldGVyc1twYXJhbWV0ZXJdID0gcmVxLnF1ZXJ5W3BhcmFtZXRlcl0gYXMgc3RyaW5nO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVxLnF1ZXJ5W3BhcmFtZXRlcl0pKSBtdWx0aVZhbHVlUXVlcnlTdHJpbmdQYXJhbWV0ZXJzW3BhcmFtZXRlcl0gPSByZXEucXVlcnlbcGFyYW1ldGVyXSBhcyBzdHJpbmdbXTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGV2ZW50OiBBUElHYXRld2F5UHJveHlFdmVudCA9IHtcbiAgICAgIGJvZHk6IHR5cGVvZiByZXEuYm9keSA9PT0gJ3N0cmluZycgPyByZXEuYm9keSA6IEpTT04uc3RyaW5naWZ5KHJlcS5ib2R5KSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtdWx0aVZhbHVlSGVhZGVycyxcbiAgICAgIGh0dHBNZXRob2Q6IHJlcS5tZXRob2QsXG4gICAgICBwYXRoOiByZXEucGF0aCxcbiAgICAgIHF1ZXJ5U3RyaW5nUGFyYW1ldGVycyxcbiAgICAgIG11bHRpVmFsdWVRdWVyeVN0cmluZ1BhcmFtZXRlcnMsXG4gICAgICByZXF1ZXN0Q29udGV4dDoge1xuICAgICAgICBodHRwTWV0aG9kOiByZXEubWV0aG9kLFxuICAgICAgICBwYXRoOiByZXEucGF0aCxcbiAgICAgICAgcHJvdG9jb2w6IHJlcS5wcm90b2NvbCxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBBUElHYXRld2F5UHJveHlFdmVudFsncmVxdWVzdENvbnRleHQnXSxcbiAgICB9IGFzIHVua25vd24gYXMgQVBJR2F0ZXdheVByb3h5RXZlbnQ7XG5cbiAgICBpZiAoZGVidWcpIHtcbiAgICAgIC8vIFByaW50IG91dCB0aGUgZXZlbnQgdGhhdCB3aWxsIGJlIHNlbnQgdG8gdGhlIGhhbmRsZXJcbiAgICAgIGNvbnNvbGUubG9nKCdFdmVudDonKTtcbiAgICAgIGNvbnNvbGUubG9nKGV2ZW50Lmh0dHBNZXRob2QsIGV2ZW50LnBhdGgpO1xuICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoZXZlbnQsIG51bGwsIDIpKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcGF0aHMgPSBPYmplY3Qua2V5cyhjbG91ZGZyb250UGF0aE1hcHBpbmdzKTtcblxuICAgICAgLy8gVHJ5IGEgc2ltcGxlIG1hcHBpbmdcbiAgICAgIGxldCBoYW5kbGVyID0gY2xvdWRmcm9udFBhdGhNYXBwaW5nc1tldmVudC5wYXRoXTtcblxuICAgICAgLy8gRmFsbCBiYWNrIHRvIGEgJyonIG1hdGNoOlxuICAgICAgcGF0aHMuZm9yRWFjaCgocGF0aCkgPT4ge1xuICAgICAgICBsZXQgcGFydGlhbE1hdGNoID0gcGF0aDtcbiAgICAgICAgLy8gU3RyaXAgbGVhZGluZyBzbGFzaDpcbiAgICAgICAgaWYgKHBhcnRpYWxNYXRjaC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgICBwYXJ0aWFsTWF0Y2ggPSBwYXRoLnNsaWNlKDEpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlbW92ZSB0cmFpbGluZyAnKicgd2lsZGNhcmQ6XG4gICAgICAgIGlmIChwYXJ0aWFsTWF0Y2guZW5kc1dpdGgoJyonKSkge1xuICAgICAgICAgIHBhcnRpYWxNYXRjaCA9IHBhdGguc2xpY2UoMCwgLTEpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEdldCB0aGUgZmlyc3QgbWF0Y2g6XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IGV2ZW50LnBhdGguc3RhcnRzV2l0aChwYXJ0aWFsTWF0Y2gpID8gY2xvdWRmcm9udFBhdGhNYXBwaW5nc1twYXRoXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgaGFuZGxlciA9IGhhbmRsZXIgfHwgY2FuZGlkYXRlO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIEludm9rZSB0aGUgZnVuY3Rpb24gaGFuZGxlcjpcbiAgICAgIGNvbnN0IHJlc3VsdDogQVBJR2F0ZXdheVByb3h5UmVzdWx0ID0gaGFuZGxlciA/IGF3YWl0IGhhbmRsZXIoZXZlbnQsIHt9IGFzIENvbnRleHQpIDogeyBzdGF0dXNDb2RlOiA0MDQsIGJvZHk6IGBQYXRoIG5vdCBtYXRjaGVkOiAke2V2ZW50LnBhdGh9ICgke3BhdGhzfSlgIH07XG5cbiAgICAgIC8vIFByaW50IG91dCB0aGUgcmVzcG9uc2UgaWYgc3VjY2Vzc2Z1bFxuICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdSZXN1bHQ6Jyk7XG4gICAgICAgIGNvbnNvbGUubG9nKGV2ZW50Lmh0dHBNZXRob2QsIGV2ZW50LnBhdGgsIHJlc3VsdC5zdGF0dXNDb2RlKTtcbiAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNlbmQgdGhlIHJlc3BvbnNlXG4gICAgICByZXMuc3RhdHVzKHJlc3VsdC5zdGF0dXNDb2RlKTtcbiAgICAgIGlmIChyZXN1bHQubXVsdGlWYWx1ZUhlYWRlcnMpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocmVzdWx0Lm11bHRpVmFsdWVIZWFkZXJzKSkge1xuICAgICAgICAgIHJlcy5zZXQoa2V5LCByZXN1bHQubXVsdGlWYWx1ZUhlYWRlcnMhW2tleV0ubWFwKCh2YWx1ZSkgPT4gYCR7dmFsdWV9YCkpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdC5oZWFkZXJzKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJlc3VsdC5oZWFkZXJzKSkge1xuICAgICAgICAgIHJlcy5zZXQoa2V5LCBgJHtyZXN1bHQuaGVhZGVycyFba2V5XX1gKTtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQm9keVxuICAgICAgcmVzLnNlbmQocmVzdWx0LmJvZHkpO1xuXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gTG9nIHRoZSBlcnJvciBhbmQgc2VuZCBhIDUwMCByZXNwb25zZVxuICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICBjb25zb2xlLmxvZygoZSBhcyBFcnJvcikuc3RhY2spO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLnNlbmQoYCR7ZX1gKTtcbiAgICB9O1xuICB9KTtcblxuICBhcHAubGlzdGVuKHBvcnQsICgpID0+IHtcbiAgICBjb25zb2xlLmxvZyhgTGFtYmRhIGhhbmRsZXIgY2FuIGJlIGludm9rZWQgYXQgaHR0cDovL2xvY2FsaG9zdDoke3BvcnR9YCk7XG4gIH0pO1xufVxuIl19