UNPKG

node-os-utils

Version:

Advanced cross-platform operating system monitoring utilities with TypeScript support

312 lines 8.71 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.BaseMonitor = void 0; const events_1 = require("events"); const cache_manager_1 = require("./cache-manager"); const errors_1 = require("../types/errors"); /** * 监控订阅实现 */ class MonitorSubscriptionImpl { constructor(callback, interval, monitorFn, errorHandler) { this.callback = callback; this.interval = interval; this.monitorFn = monitorFn; this.errorHandler = errorHandler; this.active = true; this.paused = false; this.start(); } unsubscribe() { this.stop(); this.active = false; } isActive() { return this.active; } pause() { if (this.active && !this.paused) { this.stop(); this.paused = true; } } resume() { if (this.active && this.paused) { this.start(); this.paused = false; } } getStatus() { if (!this.active) return 'stopped'; return this.paused ? 'paused' : 'active'; } start() { if (this.timer) { clearInterval(this.timer); } this.timer = setInterval(async () => { try { const result = await this.monitorFn(); this.callback(result); } catch (error) { if (this.errorHandler) { this.errorHandler(error); } } }, this.interval); } stop() { if (this.timer) { clearInterval(this.timer); this.timer = undefined; } } } /** * 基础监控器抽象类 * * 提供所有监控器的通用功能,包括缓存、事件、配置管理等 */ class BaseMonitor extends events_1.EventEmitter { constructor(adapter, config = {}, cache) { super(); this.subscriptions = new Set(); this.adapter = adapter; this.config = { ...this.getDefaultConfig(), ...config }; this.cache = cache || new cache_manager_1.CacheManager({ defaultTTL: this.config.cacheTTL || 5000, enabled: this.config.cacheEnabled !== false }); // 设置最大监听器数量 this.setMaxListeners(100); } // 通用方法 /** * 配置监控器 */ withConfig(config) { this.config = { ...this.config, ...config }; // 如果缓存配置发生变化,更新缓存管理器 if (config.cacheTTL && this.cache) { this.cache.setDefaultTTL(config.cacheTTL); } return this; } /** * 配置缓存 */ withCaching(enabled, ttl) { this.config.cacheEnabled = enabled; if (ttl !== undefined) { this.config.cacheTTL = ttl; if (this.cache) { this.cache.setDefaultTTL(ttl); } } return this; } /** * 实时监控 */ monitor(interval, callback) { const monitorFn = async () => { const result = await this.info(); if (result.success) { return result.data; } else { throw result.error; } }; const errorHandler = (error) => { this.emit('error', error); }; const subscription = new MonitorSubscriptionImpl(callback, interval, monitorFn, errorHandler); this.subscriptions.add(subscription); // 当订阅被取消时,从集合中移除 const originalUnsubscribe = subscription.unsubscribe.bind(subscription); subscription.unsubscribe = () => { originalUnsubscribe(); this.subscriptions.delete(subscription); }; return subscription; } /** * 获取配置 */ getConfig() { return { ...this.config }; } /** * 获取缓存统计 */ getCacheStats() { return this.cache ? this.cache.getStats() : null; } /** * 清空缓存 */ clearCache() { if (this.cache) { this.cache.clear(); } } /** * 停止所有监控订阅 */ stopAllMonitoring() { for (const subscription of this.subscriptions) { subscription.unsubscribe(); } this.subscriptions.clear(); } /** * 获取活跃订阅数量 */ getActiveSubscriptions() { return Array.from(this.subscriptions).filter(sub => sub.isActive()).length; } /** * 销毁监控器 */ destroy() { this.stopAllMonitoring(); if (this.cache) { this.cache.destroy(); } this.removeAllListeners(); } // 受保护的辅助方法 /** * 获取缓存结果 */ getCachedResult(key) { if (!this.config.cacheEnabled || !this.cache) { return undefined; } return this.cache.get(key); } /** * 设置缓存结果 */ setCachedResult(key, result, ttl) { if (!this.config.cacheEnabled || !this.cache) { return; } this.cache.set(key, result, ttl); } /** * 创建成功结果 */ createSuccessResult(data, cached = false) { return { success: true, data, timestamp: Date.now(), cached, platform: this.adapter.getPlatform() }; } /** * 创建失败结果 */ createErrorResult(error) { return { success: false, error, platform: this.adapter.getPlatform(), timestamp: Date.now() }; } /** * 处理错误并转换为 MonitorResult */ handleError(error) { let monitorError; if (error instanceof errors_1.MonitorError) { monitorError = error; } else if (error instanceof Error) { monitorError = new errors_1.MonitorError(error.message, errors_1.ErrorCode.COMMAND_FAILED, this.adapter.getPlatform(), { originalError: error }); } else { monitorError = new errors_1.MonitorError('Unknown error occurred', errors_1.ErrorCode.COMMAND_FAILED, this.adapter.getPlatform(), { error }); } // 发射错误事件 this.emit('error', monitorError); return this.createErrorResult(monitorError); } /** * 执行带缓存的操作 */ async executeWithCache(cacheKey, operation, ttl) { try { // 尝试从缓存获取 const cached = this.getCachedResult(cacheKey); if (cached !== undefined) { return this.createSuccessResult(cached, true); } // 执行操作 const result = await operation(); // 缓存结果 this.setCachedResult(cacheKey, result, ttl); return this.createSuccessResult(result, false); } catch (error) { return this.handleError(error); } } /** * 验证平台支持 */ validatePlatformSupport(feature) { if (!this.adapter.isSupported(feature)) { throw errors_1.MonitorError.createPlatformNotSupported(this.adapter.getPlatform(), feature); } } /** * 创建不支持功能的错误 */ createUnsupportedError(feature) { return errors_1.MonitorError.createPlatformNotSupported(this.adapter.getPlatform(), feature); } /** * 安全执行异步操作 */ async safeExecute(operation, fallback) { try { return await operation(); } catch (error) { if (fallback !== undefined) { return fallback; } throw error; } } /** * 创建超时 Promise */ createTimeoutPromise(timeoutMs, errorMessage) { return new Promise((_, reject) => { setTimeout(() => { const error = new errors_1.MonitorError(errorMessage || `Operation timed out after ${timeoutMs}ms`, errors_1.ErrorCode.TIMEOUT, this.adapter.getPlatform(), { timeout: timeoutMs }); reject(error); }, timeoutMs); }); } /** * 带超时执行操作 */ async executeWithTimeout(operation, timeoutMs) { const timeout = timeoutMs || this.config.timeout || 10000; return Promise.race([ operation(), this.createTimeoutPromise(timeout) ]); } } exports.BaseMonitor = BaseMonitor; //# sourceMappingURL=base-monitor.js.map