Files
electron/admin-server/services/websocket.js
T
2026-08-08 00:15:48 +03:00

93 lines
3.1 KiB
JavaScript

const WebSocket = require('ws');
const iconv = require('iconv-lite');
const { spawn } = require('child_process');
const logger = require('../logger');
function setupWebSocket(server) {
const wss = new WebSocket.Server({ server });
wss.on('connection', (ws) => {
logger.info('New WebSocket connection');
let pingProcess = null;
ws.on('message', (message) => {
try {
const data = JSON.parse(message);
if (data.type === 'ping') {
const ip = data.ip;
// Валидация IP
if (!ip || !/^[a-zA-Z0-9\.\-_:]+$/.test(ip)) {
ws.send(JSON.stringify({
type: 'error',
message: 'Invalid IP address format'
}));
return;
}
// Завершаем предыдущий процесс, если есть
if (pingProcess) {
pingProcess.kill();
}
// Запускаем ping (для Windows)
pingProcess = spawn('ping', ['-t', ip]);
// Обработка вывода
pingProcess.stdout.on('data', (data) => {
const decodedData = iconv.decode(data, 'cp866');
ws.send(JSON.stringify({
type: 'data',
data: decodedData
}));
});
pingProcess.stderr.on('data', (data) => {
const decodedData = iconv.decode(data, 'cp866');
ws.send(JSON.stringify({
type: 'error',
data: decodedData
}));
});
pingProcess.on('close', (code) => {
ws.send(JSON.stringify({
type: 'close',
data: `Process exited with code ${code}`
}));
pingProcess = null;
});
}
} catch (e) {
logger.error('WebSocket message error:', e);
ws.send(JSON.stringify({
type: 'error',
message: 'Invalid message format',
details: e.message
}));
}
});
ws.on('close', () => {
logger.info('WebSocket connection closed');
if (pingProcess) {
pingProcess.kill();
pingProcess = null;
}
});
ws.on('error', (error) => {
logger.error('WebSocket error:', error);
if (pingProcess) {
pingProcess.kill();
pingProcess = null;
}
});
});
return wss;
}
module.exports = setupWebSocket;