UNPKG

convert-lambda-to-express

Version:

Wrapper to run lambda on express. Works great for running lambdas as an express server during development but is production ready. Developed to work in conjunction with matthewkeil/full-stack-pattern cdk construct.

82 lines (81 loc) 3.09 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.convertResponseFactory = exports.coerceBody = exports.setResponseHeaders = void 0; function isObject(response) { return typeof response === 'object' && response !== null && !Array.isArray(response) && !Buffer.isBuffer(response); } function setResponseHeaders({ res, response, options }) { if (options === null || options === void 0 ? void 0 : options.defaultResponseHeaders) { for (const [name, value] of Object.entries(options === null || options === void 0 ? void 0 : options.defaultResponseHeaders)) { res.header(name, value); } } if (isObject(response)) { if (isObject(response.headers)) { for (const [name, value] of Object.entries(response.headers)) { res.header(name, `${value}`); } } if (isObject(response.multiValueHeaders)) { for (const [name, value] of Object.entries(response.multiValueHeaders)) { res.header(name, Array.isArray(value) ? value.map(val => `${val}`).join(', ') : `${value}`); } } } } exports.setResponseHeaders = setResponseHeaders; function coerceBody(body) { if (typeof body === 'string' || typeof body === 'number' || typeof body === 'boolean' || typeof body === 'bigint') { return `${body}`; } if (Buffer.isBuffer(body)) { return body.toString(); } if ( // cases of Object or Array typeof body === 'object' && body !== null && !Buffer.isBuffer(body)) { return JSON.stringify(body); } if (body) { // possible function/ArrayBuffer/symbol/etc attempt toString() try { return body.toString(); // eslint-disable-line @typescript-eslint/no-explicit-any } catch (_a) { // everything failed } } return ''; } exports.coerceBody = coerceBody; function convertResponseFactory({ res, logger, options }) { function sendError({ message, name, stack }) { const errorOutput = { errorMessage: message, errorType: name, trace: stack === null || stack === void 0 ? void 0 : stack.split('\n') }; logger.error('End - Error:'); logger.error(errorOutput); return res.status(500).json(errorOutput); } return function convertResponse(err, response) { setResponseHeaders({ res, options, response }); if (err) { return sendError(err); } try { const coerced = isObject(response) && 'body' in response ? coerceBody(response.body) : coerceBody(response); logger.info('End - Result:'); logger.info(coerced); const statusCode = isObject(response) && !!response.statusCode ? parseInt(`${response.statusCode}`) : 200; return res.status(statusCode).send(coerced); } catch (error) { return sendError(error); } }; } exports.convertResponseFactory = convertResponseFactory;