74 lines
1.9 KiB
JavaScript
74 lines
1.9 KiB
JavaScript
const { Server: ServerIO } = require('socket.io')
|
|
const { io: ClientIO } = require('socket.io-client')
|
|
const { readHostList } = require('../utils')
|
|
const { clientPort } = require('../config')
|
|
const { verifyToken } = require('../utils')
|
|
|
|
let clientSockets = {}, clientsData = {}, timer = null
|
|
|
|
function getClientsInfo(socketId) {
|
|
let hostList = readHostList()
|
|
hostList
|
|
.map(({ host }) => {
|
|
let clientSocket = ClientIO(`http://${ host }:${ clientPort }`, {
|
|
path: '/client/os-info',
|
|
forceNew: true,
|
|
reconnectionDelay: 3000,
|
|
reconnectionAttempts: 1
|
|
})
|
|
clientSockets[socketId].push(clientSocket)
|
|
return {
|
|
host,
|
|
clientSocket
|
|
}
|
|
})
|
|
.map(({ host, clientSocket }) => {
|
|
clientSocket
|
|
.on('connect', () => {
|
|
clientSocket.on('client_data', (osData) => {
|
|
clientsData[host] = osData
|
|
})
|
|
clientSocket.on('client_error', (error) => {
|
|
clientsData[host] = error
|
|
})
|
|
})
|
|
.on('connect_error', () => {
|
|
clientsData[host] = null
|
|
})
|
|
.on('disconnect', () => {
|
|
clientsData[host] = null
|
|
})
|
|
})
|
|
}
|
|
|
|
module.exports = (httpServer) => {
|
|
const serverIo = new ServerIO(httpServer, {
|
|
path: '/clients',
|
|
cors: {
|
|
}
|
|
})
|
|
|
|
serverIo.on('connection', (socket) => {
|
|
socket.on('init_clients_data', ({ token }) => {
|
|
const { code } = verifyToken(token)
|
|
if(code !== 1) return socket.emit('token_verify_fail', 'token无效')
|
|
|
|
clientSockets[socket.id] = []
|
|
|
|
getClientsInfo(socket.id)
|
|
|
|
socket.emit('clients_data', clientsData)
|
|
|
|
timer = setInterval(() => {
|
|
socket.emit('clients_data', clientsData)
|
|
}, 1500)
|
|
|
|
socket.on('disconnect', () => {
|
|
if(timer) clearInterval(timer)
|
|
clientSockets[socket.id].forEach(socket => socket.close && socket.close())
|
|
delete clientSockets[socket.id]
|
|
})
|
|
})
|
|
})
|
|
}
|