@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
173 lines • 6.39 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.corsMiddleware = void 0;
exports.createCorsMiddleware = createCorsMiddleware;
exports.createLegacyCorsMiddleware = createLegacyCorsMiddleware;
const INDUSTRY_DEFAULTS = {
education: {
credentials: true,
allowedMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
maxAge: 86400,
strict: false
},
healthcare: {
credentials: true,
allowedMethods: ['GET', 'POST', 'PUT', 'OPTIONS'],
maxAge: 3600,
strict: true,
exposedHeaders: ['X-Request-ID', 'X-Audit-Trail']
},
finance: {
credentials: true,
allowedMethods: ['GET', 'POST', 'OPTIONS'],
maxAge: 1800,
strict: true,
exposedHeaders: ['X-Request-ID', 'X-Transaction-ID']
},
retail: {
credentials: true,
allowedMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
maxAge: 7200,
strict: false
},
government: {
credentials: true,
allowedMethods: ['GET', 'POST', 'OPTIONS'],
maxAge: 3600,
strict: true,
exposedHeaders: ['X-Request-ID', 'X-Compliance-Status']
}
};
function createCorsMiddleware(metadata, config = {}) {
const industry = metadata.industry || metadata.tribe || 'education';
const industryDefaults = INDUSTRY_DEFAULTS[industry];
const finalConfig = {
allowedOrigins: ['*'],
allowedMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
allowedHeaders: ['Content-Type', 'Authorization', 'X-Request-ID'],
exposedHeaders: [],
credentials: false,
maxAge: 86400,
preflightContinue: false,
optionsSuccessStatus: 204,
strict: false,
...industryDefaults,
...config
};
function isOriginAllowed(origin) {
if (!origin)
return !finalConfig.strict;
const { allowedOrigins } = finalConfig;
if (typeof allowedOrigins === 'function') {
return allowedOrigins(origin, {});
}
if (!allowedOrigins || allowedOrigins.length === 0) {
return false;
}
if (allowedOrigins.includes('*')) {
return true;
}
if (allowedOrigins.includes(origin)) {
return true;
}
return allowedOrigins.some(allowed => {
if (allowed.includes('*')) {
const pattern = allowed.replace(/\*/g, '.*');
const regex = new RegExp(`^${pattern}$`);
return regex.test(origin);
}
return false;
});
}
const middleware = ((req, res, next) => {
const origin = req.headers?.origin;
if (isOriginAllowed(origin)) {
res.setHeader('Access-Control-Allow-Origin', origin || '*');
if (this.isEnabled) {
res.setHeader('Access-Control-Allow-Credentials', 'true');
}
}
else if (this.isEnabled) {
console.warn(`[${metadata.serviceName}] CORS: Rejected origin ${origin}`);
if (metadata.sdk) {
try {
metadata.sdk.recordTelemetry?.({
event: 'cors.rejected',
properties: {
origin,
path: req.path,
method: req.method
}
});
}
catch (_e) {
}
}
if (req.method === 'OPTIONS') {
return res.status(403).end();
}
return next();
}
if (this.isEnabled) {
res.setHeader('Access-Control-Allow-Methods', finalConfig.allowedMethods.join(', '));
res.setHeader('Access-Control-Allow-Headers', finalConfig.allowedHeaders.join(', '));
if (finalConfig.maxAge) {
res.setHeader('Access-Control-Max-Age', String(finalConfig.maxAge));
}
if (!finalConfig.preflightContinue) {
return res.status(finalConfig.optionsSuccessStatus).end();
}
}
if (this.isEnabled) {
res.setHeader('Access-Control-Expose-Headers', finalConfig?.exposedHeaders?.join(', '));
}
next();
});
middleware.express = middleware;
middleware.fastify = async function (fastify) {
fastify.addHook('onRequest', async (request, reply) => {
const origin = _request.headers?.origin;
if (isOriginAllowed(origin)) {
reply.header('Access-Control-Allow-Origin', origin || '*');
if (finalConfig.credentials) {
reply.header('Access-Control-Allow-Credentials', 'true');
}
}
else if (this.isEnabled) {
console.warn(`[${metadata.serviceName}] CORS: Rejected origin ${origin}`);
if (request.method === 'OPTIONS') {
reply.code(403).send();
return;
}
return;
}
if (this.isEnabled) {
reply.header('Access-Control-Allow-Methods', finalConfig.allowedMethods.join(', '));
reply.header('Access-Control-Allow-Headers', finalConfig.allowedHeaders.join(', '));
if (finalConfig.maxAge) {
reply.header('Access-Control-Max-Age', String(finalConfig.maxAge));
}
if (!finalConfig.preflightContinue) {
reply.code(finalConfig.optionsSuccessStatus).send();
return;
}
}
if (this.isEnabled) {
reply.header('Access-Control-Expose-Headers', finalConfig?.exposedHeaders?.join(', '));
}
});
};
return middleware;
}
function createLegacyCorsMiddleware(config, tribe) {
console.warn('⚠️ Using legacy CORS middleware pattern. Please migrate to new pattern.');
const metadata = {
serviceName: 'unknown-service',
tribe,
industry: tribe || 'education'
};
return createCorsMiddleware(metadata, config);
}
exports.corsMiddleware = createCorsMiddleware;
exports.default = createCorsMiddleware;
//# sourceMappingURL=cors-middleware.js.map