UNPKG

bb-inspired

Version:

Core library for BB-inspired NestJS backend

110 lines 4.51 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var WebsocketHealthService_1; Object.defineProperty(exports, "__esModule", { value: true }); exports.WebsocketHealthService = void 0; const common_1 = require("@nestjs/common"); const websocket_gateway_1 = require("./websocket.gateway"); const logger_1 = require("../../utils/logger"); let WebsocketHealthService = WebsocketHealthService_1 = class WebsocketHealthService { constructor(wsGateway) { this.wsGateway = wsGateway; this.logger = new logger_1.AppLogger(WebsocketHealthService_1.name); this.messagesCount = 0; this.connectionAttempts = 0; this.failedConnections = 0; this.latencyMeasurements = []; this.lastMetricsReset = Date.now(); setInterval(() => this.resetMetrics(), 60 * 1000); } async check() { try { const serverStatus = this.wsGateway.getServerStatus(); const activeConnections = this.wsGateway.getActiveConnectionsCount(); const activeChannels = this.wsGateway.getActiveChannelsCount(); const messagesPerMinute = this.messagesCount; const averageLatency = this.calculateAverageLatency(); let status = 'up'; if (!serverStatus.running) { status = 'down'; } else if (this.failedConnections > 10 || averageLatency > 1000 || (activeConnections > 0 && this.messagesCount === 0)) { status = 'degraded'; } return { status, serverRunning: serverStatus.running, activeConnections, activeChannels, metrics: { messagesPerMinute, connectionAttempts: this.connectionAttempts, failedConnections: this.failedConnections, averageLatency }, timestamp: new Date().toISOString() }; } catch (error) { this.logger.error(`Health check failed: ${error.message}`); return { status: 'down', serverRunning: false, activeConnections: 0, activeChannels: 0, metrics: { messagesPerMinute: 0, connectionAttempts: 0, failedConnections: 0, averageLatency: 0 }, timestamp: new Date().toISOString() }; } } trackMessage() { this.messagesCount++; } trackConnection(success) { this.connectionAttempts++; if (!success) { this.failedConnections++; } } trackLatency(latencyMs) { this.latencyMeasurements.push(latencyMs); if (this.latencyMeasurements.length > 1000) { this.latencyMeasurements.shift(); } } resetMetrics() { this.lastMetricsReset = Date.now(); this.messagesCount = 0; this.connectionAttempts = 0; this.failedConnections = 0; this.latencyMeasurements = []; } calculateAverageLatency() { if (this.latencyMeasurements.length === 0) { return 0; } const sum = this.latencyMeasurements.reduce((acc, val) => acc + val, 0); return Math.round(sum / this.latencyMeasurements.length); } }; exports.WebsocketHealthService = WebsocketHealthService; exports.WebsocketHealthService = WebsocketHealthService = WebsocketHealthService_1 = __decorate([ (0, common_1.Injectable)(), __metadata("design:paramtypes", [websocket_gateway_1.WebsocketGateway]) ], WebsocketHealthService); //# sourceMappingURL=websocket.health.js.map