@scloud/lambda-local
Version:
Run typical Lambda handlers locally.
81 lines • 9.67 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.sqsLocal = void 0;
// eslint-disable-next-line import/no-extraneous-dependencies
const express_1 = __importDefault(require("express"));
const eventTemplate = {
Records: [
{
body: '',
awsRegion: '',
eventSource: '',
eventSourceARN: '',
md5OfBody: '',
messageAttributes: {},
messageId: '1',
receiptHandle: '',
attributes: {
ApproximateFirstReceiveTimestamp: '',
ApproximateReceiveCount: '',
SenderId: '',
SentTimestamp: '',
},
},
],
};
const contextTemplate = {
awsRequestId: '',
callbackWaitsForEmptyEventLoop: false,
functionName: 'test',
functionVersion: '',
invokedFunctionArn: '',
logGroupName: '',
logStreamName: '',
memoryLimitInMB: '',
getRemainingTimeInMillis: () => 0,
done: () => { },
fail: () => { },
succeed: () => { },
};
// eslint-disable-next-line no-unused-vars
function sqsLocal(handler) {
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.post('/*', async (req, res) => {
try {
// Print out the event that will be sent to the handler
console.log('Event:');
const event = { ...eventTemplate, body: req.body };
console.log(JSON.stringify(event));
Object.keys(event.Records[0]).forEach((key) => {
console.log(` - ${key}: ${JSON.stringify(event.Records[0][key])}`);
});
// Invoke the function handler:
const result = await handler(event, contextTemplate);
if (result) {
console.log('Result:');
Object.keys(result).forEach((key) => {
console.log(` - ${key}: ${JSON.stringify(result[key])}`);
});
}
// Send the response
res.status(200).send(JSON.stringify(result.batchItemFailures));
}
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 via POST http://localhost:${port}. The request body will be sent as an SQS message body`);
});
}
exports.sqsLocal = sqsLocal;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3FzTG9jYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3FzTG9jYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsNkRBQTZEO0FBQzdELHNEQUFxRDtBQUtyRCxNQUFNLGFBQWEsR0FBYTtJQUM5QixPQUFPLEVBQUU7UUFDUDtZQUNFLElBQUksRUFBRSxFQUFFO1lBQ1IsU0FBUyxFQUFFLEVBQUU7WUFDYixXQUFXLEVBQUUsRUFBRTtZQUNmLGNBQWMsRUFBRSxFQUFFO1lBQ2xCLFNBQVMsRUFBRSxFQUFFO1lBQ2IsaUJBQWlCLEVBQUUsRUFBRTtZQUNyQixTQUFTLEVBQUUsR0FBRztZQUNkLGFBQWEsRUFBRSxFQUFFO1lBQ2pCLFVBQVUsRUFBRTtnQkFDVixnQ0FBZ0MsRUFBRSxFQUFFO2dCQUNwQyx1QkFBdUIsRUFBRSxFQUFFO2dCQUMzQixRQUFRLEVBQUUsRUFBRTtnQkFDWixhQUFhLEVBQUUsRUFBRTthQUNsQjtTQUNGO0tBQ0Y7Q0FDRixDQUFDO0FBRUYsTUFBTSxlQUFlLEdBQVk7SUFDL0IsWUFBWSxFQUFFLEVBQUU7SUFDaEIsOEJBQThCLEVBQUUsS0FBSztJQUNyQyxZQUFZLEVBQUUsTUFBTTtJQUNwQixlQUFlLEVBQUUsRUFBRTtJQUNuQixrQkFBa0IsRUFBRSxFQUFFO0lBQ3RCLFlBQVksRUFBRSxFQUFFO0lBQ2hCLGFBQWEsRUFBRSxFQUFFO0lBQ2pCLGVBQWUsRUFBRSxFQUFFO0lBQ25CLHdCQUF3QixFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDakMsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDZixJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztJQUNmLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0NBQ25CLENBQUM7QUFFRiwwQ0FBMEM7QUFDMUMsU0FBZ0IsUUFBUSxDQUFDLE9BQXlFO0lBQ2hHLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsQ0FBQztJQUMzQyxNQUFNLEdBQUcsR0FBRyxJQUFBLGlCQUFPLEdBQUUsQ0FBQztJQUV0Qix3SEFBd0g7SUFDeEgsR0FBRyxDQUFDLEdBQUcsQ0FBQyxpQkFBTyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFdkMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQVksRUFBRSxHQUFhLEVBQUUsRUFBRTtRQUNuRCxJQUFJLENBQUM7WUFDSCx1REFBdUQ7WUFDdkQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN0QixNQUFNLEtBQUssR0FBRyxFQUFFLEdBQUcsYUFBYSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbkQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDbkMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQzVDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQXNCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN4RixDQUFDLENBQUMsQ0FBQztZQUVILCtCQUErQjtZQUMvQixNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxLQUFLLEVBQUUsZUFBZSxDQUFDLENBQUM7WUFFckQsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO29CQUNsQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQTZCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDckYsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1lBRUQsb0JBQW9CO1lBQ3BCLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLHdDQUF3QztZQUN4QyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2YsT0FBTyxDQUFDLEdBQUcsQ0FBRSxDQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVILEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRTtRQUNwQixPQUFPLENBQUMsR0FBRyxDQUFDLDJEQUEyRCxJQUFJLHdEQUF3RCxDQUFDLENBQUM7SUFDdkksQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBeENELDRCQXdDQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXNcbmltcG9ydCBleHByZXNzLCB7IFJlcXVlc3QsIFJlc3BvbnNlIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQge1xuICBDb250ZXh0LCBTUVNCYXRjaFJlc3BvbnNlLCBTUVNFdmVudCwgU1FTUmVjb3JkLFxufSBmcm9tICdhd3MtbGFtYmRhJztcblxuY29uc3QgZXZlbnRUZW1wbGF0ZTogU1FTRXZlbnQgPSB7XG4gIFJlY29yZHM6IFtcbiAgICB7XG4gICAgICBib2R5OiAnJyxcbiAgICAgIGF3c1JlZ2lvbjogJycsXG4gICAgICBldmVudFNvdXJjZTogJycsXG4gICAgICBldmVudFNvdXJjZUFSTjogJycsXG4gICAgICBtZDVPZkJvZHk6ICcnLFxuICAgICAgbWVzc2FnZUF0dHJpYnV0ZXM6IHt9LFxuICAgICAgbWVzc2FnZUlkOiAnMScsXG4gICAgICByZWNlaXB0SGFuZGxlOiAnJyxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgQXBwcm94aW1hdGVGaXJzdFJlY2VpdmVUaW1lc3RhbXA6ICcnLFxuICAgICAgICBBcHByb3hpbWF0ZVJlY2VpdmVDb3VudDogJycsXG4gICAgICAgIFNlbmRlcklkOiAnJyxcbiAgICAgICAgU2VudFRpbWVzdGFtcDogJycsXG4gICAgICB9LFxuICAgIH0sXG4gIF0sXG59O1xuXG5jb25zdCBjb250ZXh0VGVtcGxhdGU6IENvbnRleHQgPSB7XG4gIGF3c1JlcXVlc3RJZDogJycsXG4gIGNhbGxiYWNrV2FpdHNGb3JFbXB0eUV2ZW50TG9vcDogZmFsc2UsXG4gIGZ1bmN0aW9uTmFtZTogJ3Rlc3QnLFxuICBmdW5jdGlvblZlcnNpb246ICcnLFxuICBpbnZva2VkRnVuY3Rpb25Bcm46ICcnLFxuICBsb2dHcm91cE5hbWU6ICcnLFxuICBsb2dTdHJlYW1OYW1lOiAnJyxcbiAgbWVtb3J5TGltaXRJbk1COiAnJyxcbiAgZ2V0UmVtYWluaW5nVGltZUluTWlsbGlzOiAoKSA9PiAwLFxuICBkb25lOiAoKSA9PiB7IH0sXG4gIGZhaWw6ICgpID0+IHsgfSxcbiAgc3VjY2VlZDogKCkgPT4geyB9LFxufTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5leHBvcnQgZnVuY3Rpb24gc3FzTG9jYWwoaGFuZGxlcjogKGV2ZW50OiBTUVNFdmVudCwgY29udGV4dDogQ29udGV4dCkgPT4gUHJvbWlzZTxTUVNCYXRjaFJlc3BvbnNlPikge1xuICBjb25zdCBwb3J0ID0gKyhwcm9jZXNzLmVudi5wb3J0IHx8ICczMDAwJyk7XG4gIGNvbnN0IGFwcCA9IGV4cHJlc3MoKTtcblxuICAvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMjM0NTE2Ni9ob3ctdG8tZm9yY2UtcGFyc2UtcmVxdWVzdC1ib2R5LWFzLXBsYWluLXRleHQtaW5zdGVhZC1vZi1qc29uLWluLWV4cHJlc3NcbiAgYXBwLnVzZShleHByZXNzLnRleHQoeyB0eXBlOiAnKi8qJyB9KSk7XG5cbiAgYXBwLnBvc3QoJy8qJywgYXN5bmMgKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBQcmludCBvdXQgdGhlIGV2ZW50IHRoYXQgd2lsbCBiZSBzZW50IHRvIHRoZSBoYW5kbGVyXG4gICAgICBjb25zb2xlLmxvZygnRXZlbnQ6Jyk7XG4gICAgICBjb25zdCBldmVudCA9IHsgLi4uZXZlbnRUZW1wbGF0ZSwgYm9keTogcmVxLmJvZHkgfTtcbiAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGV2ZW50KSk7XG4gICAgICBPYmplY3Qua2V5cyhldmVudC5SZWNvcmRzWzBdKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coYCAtICR7a2V5fTogJHtKU09OLnN0cmluZ2lmeShldmVudC5SZWNvcmRzWzBdW2tleSBhcyBrZXlvZiBTUVNSZWNvcmRdKX1gKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBJbnZva2UgdGhlIGZ1bmN0aW9uIGhhbmRsZXI6XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyKGV2ZW50LCBjb250ZXh0VGVtcGxhdGUpO1xuXG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdSZXN1bHQ6Jyk7XG4gICAgICAgIE9iamVjdC5rZXlzKHJlc3VsdCkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAtICR7a2V5fTogJHtKU09OLnN0cmluZ2lmeShyZXN1bHRba2V5IGFzIGtleW9mIFNRU0JhdGNoUmVzcG9uc2VdKX1gKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNlbmQgdGhlIHJlc3BvbnNlXG4gICAgICByZXMuc3RhdHVzKDIwMCkuc2VuZChKU09OLnN0cmluZ2lmeShyZXN1bHQuYmF0Y2hJdGVtRmFpbHVyZXMpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBMb2cgdGhlIGVycm9yIGFuZCBzZW5kIGEgNTAwIHJlc3BvbnNlXG4gICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICAgIGNvbnNvbGUubG9nKChlIGFzIEVycm9yKS5zdGFjayk7XG4gICAgICByZXMuc3RhdHVzKDUwMCkuc2VuZChgJHtlfWApO1xuICAgIH1cbiAgfSk7XG5cbiAgYXBwLmxpc3Rlbihwb3J0LCAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coYExhbWJkYSBoYW5kbGVyIGNhbiBiZSBpbnZva2VkIHZpYSBQT1NUIGh0dHA6Ly9sb2NhbGhvc3Q6JHtwb3J0fS4gVGhlIHJlcXVlc3QgYm9keSB3aWxsIGJlIHNlbnQgYXMgYW4gU1FTIG1lc3NhZ2UgYm9keWApO1xuICB9KTtcbn1cbiJdfQ==