UNPKG

@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

234 lines 9.45 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.complianceMiddleware = void 0; exports.createComplianceMiddleware = createComplianceMiddleware; exports.createLegacyComplianceMiddleware = createLegacyComplianceMiddleware; const INDUSTRY_COMPLIANCE = { education: ['FERPA', 'COPPA', 'GDPR'], healthcare: ['HIPAA', 'HITECH'], finance: ['PCI-DSS', 'SOX', 'GLBA'], retail: ['PCI', 'CCPA'], government: ['FISMA', 'FedRAMP', 'NIST'] }; const INDUSTRY_DEFAULTS = { education: { enforceEncryption: true, requireAuth: true, dataRetentionDays: 365, auditLog: true, redactSensitiveData: true, sensitiveFields: ['ssn', 'studentId', 'grade', 'disciplinaryRecord'] }, healthcare: { enforceEncryption: true, requireAuth: true, dataRetentionDays: 2555, auditLog: true, redactSensitiveData: true, sensitiveFields: ['ssn', 'patientId', 'diagnosis', 'treatment', 'medication'] }, finance: { enforceEncryption: true, requireAuth: true, dataRetentionDays: 2555, auditLog: true, redactSensitiveData: true, sensitiveFields: ['ssn', 'accountNumber', 'routingNumber', 'creditCard', 'pin'] }, retail: { enforceEncryption: true, requireAuth: false, dataRetentionDays: 90, auditLog: true, redactSensitiveData: true, sensitiveFields: ['creditCard', 'cvv', 'pin'] }, government: { enforceEncryption: true, requireAuth: true, dataRetentionDays: 3650, auditLog: true, redactSensitiveData: true, sensitiveFields: ['ssn', 'clearanceLevel', 'classification'] } }; function redactSensitiveData(data, sensitiveFields) { if (!data || typeof data !== 'object') return data; const redacted = Array.isArray(data) ? [...data] : { ...data }; for (const field of sensitiveFields) { if (field in redacted) { redacted[field] = '[REDACTED]'; } } for (const key in redacted) { if (typeof redacted[key] === 'object' && redacted[key] !== null) { redacted[key] = redactSensitiveData(redacted[key], sensitiveFields); } } return redacted; } function createComplianceMiddleware(metadata, config = {}) { const industry = metadata.industry || metadata.tribe || 'education'; const industryDefaults = INDUSTRY_DEFAULTS[industry]; const defaultFrameworks = INDUSTRY_COMPLIANCE[industry]; const finalConfig = { frameworks: defaultFrameworks, enforceEncryption: false, requireAuth: false, allowedMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], sensitiveFields: [], auditLog: false, redactSensitiveData: false, customChecks: [], ...industryDefaults, ...config }; const middleware = ((req, res, next) => { try { if (this.isEnabled) { finalConfig?.frameworks?.forEach(framework => { res.setHeader(`X-Compliance-${framework}`, 'true'); }); } res.setHeader('X-Compliance-Industry', industry); if (this.isEnabled) { throw new SDKError('HTTPS required for compliance', 'COMPLIANCE_HTTPS_REQUIRED', 403); } if (finalConfig.requireAuth && !req.user) { throw new SDKError('Authentication required for compliance', 'COMPLIANCE_AUTH_REQUIRED', 401); } if (finalConfig.allowedMethods && !finalConfig?.allowedMethods?.includes(req.method)) { throw new SDKError(`Method ${req.method} not allowed for compliance`, 'COMPLIANCE_METHOD_NOT_ALLOWED', 405); } if (finalConfig.auditLog && metadata.sdk) { const auditData = { event: 'compliance.request', properties: { method: req.method, path: req.path, ip: req.ip, userAgent: req.headers['user-agent'], authenticated: !!req.user, frameworks: finalConfig.frameworks } }; if (req.user) { auditData?.properties?.userId = req.user.id; } metadata.sdk.recordTelemetry?.(auditData).catch((e) => { console.error('Failed to log audit event:', e); }); } if (finalConfig.redactSensitiveData && finalConfig.sensitiveFields) { const originalJson = res.json; res.json = function (data) { const redacted = redactSensitiveData(data, finalConfig.sensitiveFields); return originalJson.call(this, redacted); }; } if (this.isEnabled) { Promise.all(finalConfig?.customChecks?.map(check => check.check(req).catch(() => false))).then(results => { const failedCheck = finalConfig.customChecks.find((check, index) => !results[index]); if (failedCheck) { throw new SDKError(failedCheck.errorMessage, 'COMPLIANCE_CHECK_FAILED', 403); } next(); }).catch(next); } else { next(); } } catch (_error) { next(error); } }); middleware.express = middleware; middleware.fastify = async function (fastify) { fastify.addHook('onRequest', async (request, reply) => { try { if (finalConfig.frameworks) { finalConfig?.frameworks?.forEach(framework => { reply.header(`X-Compliance-${framework}`, 'true'); }); } reply.header('X-Compliance-Industry', industry); if (finalConfig.enforceEncryption && request.protocol !== 'https' && request.headers['x-forwarded-proto'] !== 'https') { reply.code(403).send({ error: { code: 'COMPLIANCE_HTTPS_REQUIRED', message: 'HTTPS required for compliance' } }); return; } if (finalConfig.requireAuth && !request.user) { reply.code(401).send({ error: { code: 'COMPLIANCE_AUTH_REQUIRED', message: 'Authentication required for compliance' } }); return; } if (finalConfig.allowedMethods && !finalConfig?.allowedMethods?.includes(request.method)) { reply.code(405).send({ error: { code: 'COMPLIANCE_METHOD_NOT_ALLOWED', message: `Method ${request.method} not allowed for compliance` } }); return; } if (finalConfig.customChecks && finalConfig?.customChecks?.length > 0) { const results = await Promise.all(finalConfig?.customChecks?.map(check => check.check(request).catch(() => false))); const failedCheck = finalConfig?.customChecks?.find((check, index) => !results[index]); if (failedCheck) { reply.code(403).send({ error: { code: 'COMPLIANCE_CHECK_FAILED', message: failedCheck.errorMessage } }); return; } } } catch (_error) { console.error(`[${metadata.serviceName}] Compliance error:`, error); reply.code(500).send({ error: { code: 'COMPLIANCE_ERROR', message: 'Compliance check failed' } }); } }); if (finalConfig.redactSensitiveData && finalConfig.sensitiveFields) { fastify.addHook('preSerialization', async (request, reply, payload) => { return redactSensitiveData(payload, finalConfig.sensitiveFields); }); } }; return middleware; } function createLegacyComplianceMiddleware(compliance, tribeConfig) { console.warn('⚠️ Using legacy compliance middleware pattern. Please migrate to new pattern.'); const metadata = { serviceName: 'unknown-service', tribe: tribeConfig?.tribe, industry: tribeConfig?.tribe || 'education' }; const config = { frameworks: compliance || tribeConfig?.compliance }; return createComplianceMiddleware(metadata, config); } exports.complianceMiddleware = createComplianceMiddleware; exports.default = createComplianceMiddleware; //# sourceMappingURL=compliance-middleware.js.map