thrilled-be-core
Version:
Core Express backend package with middleware, logging, security, and base application setup
72 lines (71 loc) • 2.39 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.SecurityMiddleware = void 0;
const tslib_1 = require("tslib");
const express_rate_limit_1 = tslib_1.__importDefault(require("express-rate-limit"));
const helmet_1 = tslib_1.__importDefault(require("helmet"));
const cors_1 = tslib_1.__importDefault(require("cors"));
class SecurityMiddleware {
/**
* Create rate limiting middleware
*/
static rateLimit(config) {
return (0, express_rate_limit_1.default)({
windowMs: config.windowMs || 15 * 60 * 1000, // 15 minutes
max: config.max || 100, // limit each IP to 100 requests per windowMs
message: config.message || 'Too many requests from this IP',
standardHeaders: true,
legacyHeaders: false,
...config,
});
}
/**
* Create helmet security middleware
*/
static helmet(config) {
return (0, helmet_1.default)(config);
}
/**
* Create CORS middleware
*/
static cors(config) {
return (0, cors_1.default)(config);
}
/**
* Create request ID middleware for correlation tracking
*/
static requestId() {
return (req, res, next) => {
const requestId = req.headers['x-request-id'] || this.generateId();
// Add to request for access in handlers - extending Request interface
req.requestId = requestId;
// Add to response headers
res.setHeader('X-Request-ID', requestId);
next();
};
}
/**
* Create request timeout middleware
*/
static timeout(ms = 30000) {
return (_req, res, next) => {
const timeout = setTimeout(() => {
if (!res.headersSent) {
res.status(408).json({
success: false,
message: 'Request timeout',
statusCode: 408,
});
}
}, ms);
res.on('finish', () => clearTimeout(timeout));
res.on('close', () => clearTimeout(timeout));
next();
};
}
static generateId() {
return (Math.random().toString(36).substring(2, 15) +
Math.random().toString(36).substring(2, 15));
}
}
exports.SecurityMiddleware = SecurityMiddleware;