UNPKG

@scaffoldly/serverless-util

Version:
108 lines 4.19 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.registerVersion = exports.registerDocs = exports.errorHandler = exports.corsHandler = exports.createApp = void 0; /* eslint-disable @typescript-eslint/dot-notation */ const tsoa_1 = require("tsoa"); const cors_1 = __importDefault(require("cors")); const express_1 = __importDefault(require("express")); const morgan_body_1 = __importDefault(require("morgan-body")); const exports_1 = require("./exports"); const errors_1 = require("./errors"); const constants_1 = require("./constants"); const createApp = ({ logHeaders = false } = {}) => { const app = express_1.default(); app.disable('x-powered-by'); app.use(express_1.default.json({ limit: 5242880 })); morgan_body_1.default(app, { noColors: true, immediateReqLog: true, prettify: false, logAllReqHeader: logHeaders, stream: { write(data) { console.log(data); return false; }, }, }); return app; }; exports.createApp = createApp; function corsHandler(options = {}) { return cors_1.default({ origin: options.origin ? options.origin : true, methods: ['GET', 'HEAD', 'PUT', 'PATCH', 'POST', 'DELETE'], maxAge: options.maxAge ? options.maxAge : 7200, allowedHeaders: [ 'Content-Type', 'Authorization', 'X-Amz-Date', 'X-Api-Key', 'X-Amz-Security-Token', 'X-Amz-User-Agent', 'X-Retry', ...(options.headers && options.headers.length ? options.headers : []), ], credentials: options.withCredentials, exposedHeaders: ['X-Amzn-Trace-Id', ...(options.headers && options.headers.length ? options.headers : [])], optionsSuccessStatus: 200, preflightContinue: true, }); } exports.corsHandler = corsHandler; function errorHandler(version) { return (err, req, res, next) => { const traceId = process.env[exports_1.XRAY_ENV_TRACE_ID] || 'Unknown-Trace-Id'; console.warn(`[Error] [${traceId}] [${err.name || Object.getPrototypeOf(err)}] Message: ${err.message}`, err); const tracking = { method: req.method, path: req.path, version, }; let httpError; if (err instanceof errors_1.HttpError) { httpError = err; } else if (err instanceof tsoa_1.ValidateError || err.name === 'ValidateError') { httpError = new errors_1.HttpError(err.status, 'Validation Failed', { fields: err.fields }); } else if (err.statusCode) { httpError = new errors_1.HttpError(err.statusCode, err.message || err.name, err); } else if (err.isAxiosError && err.response && err.response.status && err.response.statusText) { httpError = new errors_1.HttpError(err.response.status, err.message, err.response.data); } else { httpError = new errors_1.HttpError(500, err.message || 'Internal Server Error', err); } const errorResponse = { message: httpError.message, traceId, tracking, context: httpError.context, }; if (req.header(constants_1.MAPPED_EVENT_HEADER)) { console.log('Error from mapped event (i.e. not an HTTP API invocation). Re-throwing error to trigger retries', errorResponse); throw err; } res.status(httpError.statusCode).json(errorResponse); next(); }; } exports.errorHandler = errorHandler; const registerDocs = (app, swaggerJson) => { app.get('/openapi.json', (_req, res) => { res.send(JSON.stringify(swaggerJson)); }); }; exports.registerDocs = registerDocs; const registerVersion = (app, version) => { app.get('/version', (_req, res) => { res.send(JSON.stringify({ version })); }); }; exports.registerVersion = registerVersion; //# sourceMappingURL=express.js.map