tianji/src/server/udp/server.ts

72 lines
1.7 KiB
TypeScript
Raw Normal View History

import dgram from 'dgram';
2023-10-03 12:45:00 +00:00
import type { ServerStatusInfo } from '../../types';
import { createSubscribeInitializer, subscribeEventBus } from '../ws/shared';
const serverMap: Record<
string, // workspaceId
Record<
string, // nodeName or hostname
ServerStatusInfo
>
> = {};
createSubscribeInitializer('onServerStatusUpdate', (workspaceId) => {
2023-10-05 15:12:49 +00:00
if (!serverMap[workspaceId]) {
serverMap[workspaceId] = {};
}
2023-10-03 12:45:00 +00:00
return serverMap[workspaceId];
});
export function initUdpServer(port: number) {
const server = dgram.createSocket('udp4');
server.on('error', (err) => {
console.log(`Init error:\n${err.stack}`);
server.close();
});
server.on('message', (msg, rinfo) => {
try {
const raw = String(msg);
const json = JSON.parse(String(msg));
2023-10-03 12:45:00 +00:00
const { workspaceId, name, hostname, timeout, payload } = json;
if (!workspaceId || !name || !hostname) {
console.warn(
'[UDP] lost some necessary params, request will be ignore',
json
);
}
console.log('recevice tianji report:', raw, 'info', rinfo);
2023-10-03 12:45:00 +00:00
if (!serverMap[workspaceId]) {
serverMap[workspaceId] = {};
}
serverMap[workspaceId][name || hostname] = {
workspaceId,
name,
hostname,
timeout,
updatedAt: Date.now(),
payload,
};
subscribeEventBus.emit(
'onServerStatusUpdate',
workspaceId,
serverMap[workspaceId]
);
} catch (err) {}
});
server.on('listening', () => {
const address = server.address();
console.log(`UDP Server is listening: ${address.address}:${address.port}`);
});
server.bind(port);
}