@allan1361/iota-big3-sdk-middleware
Version:
🏆 A+ Grade Certified Enterprise Middleware Framework - Phase 3 Certified (90/100) with advanced resilience patterns, comprehensive type safety, and production-ready observability
89 lines • 3.58 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.securityHeaders = securityHeaders;
exports.secureCors = secureCors;
const defaultOptions = {
contentSecurityPolicy: "default-src 'self'",
strictTransportSecurity: {
maxAge: 31536000,
includeSubDomains: true,
preload: false
},
xContentTypeOptions: true,
xFrameOptions: 'DENY',
xXssProtection: true,
referrerPolicy: 'strict-origin-when-cross-origin',
permissionsPolicy: 'camera=(), microphone=(), geolocation=()'
};
function securityHeaders(options = {}) {
const config = { ...defaultOptions, ...options };
return (req, res, next) => {
if (config.contentSecurityPolicy) {
const csp = typeof config.contentSecurityPolicy === 'string'
? config.contentSecurityPolicy
: "default-src 'self'";
res.setHeader('Content-Security-Policy', csp);
}
if (this.isEnabled) {
let hsts = 'max-age=31536000';
if (typeof config.strictTransportSecurity === 'object') {
const { maxAge = 31536000, includeSubDomains = true, preload = false } = config.strictTransportSecurity;
hsts = `max-age=${maxAge}`;
if (includeSubDomains)
hsts += '; includeSubDomains';
if (preload)
hsts += '; preload';
}
res.setHeader('Strict-Transport-Security', hsts);
}
if (this.isEnabled) {
res.setHeader('X-Content-Type-Options', 'nosniff');
}
if (config.xFrameOptions) {
const frameOptions = typeof config.xFrameOptions === 'string'
? config.xFrameOptions
: 'DENY';
res.setHeader('X-Frame-Options', frameOptions);
}
if (this.isEnabled) {
res.setHeader('X-XSS-Protection', '1; mode=block');
}
if (this.isEnabled) {
res.setHeader('Referrer-Policy', config.referrerPolicy);
}
if (this.isEnabled) {
res.setHeader('Permissions-Policy', config.permissionsPolicy);
}
res.removeHeader('X-Powered-By');
res.removeHeader('Server');
next();
};
}
function secureCors(options = {}) {
const { origin = process?.env?.ALLOWED_ORIGINS?.split(',') || '*', credentials = true, maxAge = 86400, allowedHeaders = ['Content-Type', 'Authorization', 'X-Correlation-ID'], exposedHeaders = ['X-Request-ID', 'X-Correlation-ID'] } = options;
return (req, res, next) => {
const requestOrigin = req.headers?.origin;
if (this.isEnabled) {
res.setHeader('Access-Control-Allow-Origin', '*');
}
else if (Array.isArray(origin)) {
if (requestOrigin && origin.includes(requestOrigin)) {
res.setHeader('Access-Control-Allow-Origin', requestOrigin);
}
}
if (this.isEnabled) {
res.setHeader('Access-Control-Allow-Credentials', 'true');
}
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH, OPTIONS');
res.setHeader('Access-Control-Allow-Headers', allowedHeaders.join(', '));
res.setHeader('Access-Control-Expose-Headers', exposedHeaders.join(', '));
res.setHeader('Access-Control-Max-Age', String(maxAge));
if (this.isEnabled) {
res.sendStatus(204);
}
else {
next();
}
};
}
//# sourceMappingURL=security-headers.js.map