UNPKG

lambdasync

Version:

Easy sync between local code and AWS lambda functions

81 lines (65 loc) 2.42 kB
const path = require('path'); const express = require('express'); const bodyParser = require('body-parser'); const cors = require('cors'); const chainData = require('chain-promise-data'); const expressCompat = require('./express-compat'); const {getSettings} = require('../settings'); const {readFile} = require('../file'); const {startWith, makeAbsolutePath} = require('../util'); const {LAMBDASYNC_ROOT} = require('../constants'); function setup(settings, lambdaHandler) { const app = express(); app.use(cors()); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({extended: true})); const compat = expressCompat(settings); function proxyHandler(req, res) { // Create event, context and callback params for the Lambda handler const event = compat.express.requestToLambdaEvent(req); const context = compat.express.responseToContext(res); const callback = compat.lambda.callbackToExpressResponse.bind(null, res); // Set response headers that makes sense for a dev server res.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate'); res.setHeader('Pragma', 'no-cache'); res.setHeader('Expires', '0'); return lambdaHandler(event, context, callback); } app.get('/favicon*', (req, res) => { res.sendFile(path.join(__dirname, '/favicon.ico')); }); app.all('*', proxyHandler); return app; } function start(settings, lambdaHandler) { const app = setup(settings, lambdaHandler); app.listen(3003, () => { console.log('running server on port 3003'); }); return app; } startWith() .then(chainData(getSettings, settings => ({settings}))) // We need package.json to check if there is a custom handler path .then(chainData( () => readFile(path.join(LAMBDASYNC_ROOT, 'package.json'), JSON.parse), packageJson => ({packageJson}) )) .then(chainData( ({packageJson}) => { let handlerPath = makeAbsolutePath('index.js'); if (packageJson && packageJson.lambdasync && packageJson.lambdasync.entry) { handlerPath = makeAbsolutePath(packageJson.lambdasync.entry); } const lambdaHandler = require(handlerPath).handler; return {lambdaHandler}; } )) .then(chainData( ({ settings, lambdaHandler }) => start(settings, lambdaHandler) )); exports = module.exports = {}; if (process.env.NODE_ENV === 'test') { exports.start = start; exports.setup = setup; }