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

109 lines 3.79 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.TimeoutMiddleware = void 0; exports.createTimeoutMiddleware = createTimeoutMiddleware; const events_1 = require("events"); class TimeoutMiddleware extends events_1.EventEmitter { constructor(config = {}) { super(); this.stats = { totalRequests: 0, timedOutRequests: 0, averageResponseTime: 0 }; this.config = { timeout: config.timeout || 30000, message: config.message || 'Request timeout', skipPaths: config.skipPaths || [], onTimeout: config.onTimeout, dynamicTimeout: config.dynamicTimeout }; } middleware(overrideTimeout) { return (req, res, next) => { if (this.config.skipPaths.includes(req.path)) { return next(); } this.stats.totalRequests++; const startTime = Date.now(); let timeout = overrideTimeout || this.config.timeout; if (this.config.dynamicTimeout) { timeout = this.config.dynamicTimeout(req); } let timedOut = false; const timer = setTimeout(() => { timedOut = true; this.stats.timedOutRequests++; this.emit('timeout', { path: req.path, method: req.method, timeout, duration: Date.now() - startTime }); if (this.config.onTimeout) { this.config.onTimeout(req, res); } else { res.status(504).json({ error: this.config.message, timeout, path: req.path }); } }, timeout); const originalSend = res.send; const originalJson = res.json; const originalEnd = res.end; const clearTimer = () => { if (!timedOut) { clearTimeout(timer); const duration = Date.now() - startTime; this.updateAverageResponseTime(duration); this.emit('complete', { path: req.path, method: req.method, duration }); } }; res.send = function (body) { clearTimer(); return originalSend.call(this, body); }; res.json = function (body) { clearTimer(); return originalJson.call(this, body); }; res.end = function (chunk, encoding) { clearTimer(); return originalEnd.call(this, chunk, encoding); }; next(); }; } updateAverageResponseTime(duration) { const total = this.stats.totalRequests; const current = this.stats.averageResponseTime; this.stats.averageResponseTime = (current * (total - 1) + duration) / total; } getStats() { return { ...this.stats, timeoutRate: this.stats.totalRequests > 0 ? (this.stats.timedOutRequests / this.stats.totalRequests) * 100 : 0 }; } resetStats() { this.stats = { totalRequests: 0, timedOutRequests: 0, averageResponseTime: 0 }; } } exports.TimeoutMiddleware = TimeoutMiddleware; function createTimeoutMiddleware(config) { return new TimeoutMiddleware(config); } //# sourceMappingURL=timeout-middleware.js.map