@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
JavaScript
"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