@scaffoldly/serverless-util
Version:
Scaffoldly Serverless Helper Functionality
108 lines • 4.19 kB
JavaScript
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
;