tianji/src/server/model/serverStatus.ts
2024-08-16 00:22:24 +08:00

84 lines
1.8 KiB
TypeScript

import { ServerStatusInfo } from '../../types/index.js';
import { createSubscribeInitializer, subscribeEventBus } from '../ws/shared.js';
import { isServerOnline } from '@tianji/shared';
const serverMap: Record<
string, // workspaceId
Record<
string, // nodeName or hostname
ServerStatusInfo
>
> = {};
createSubscribeInitializer('onServerStatusUpdate', (workspaceId) => {
if (!serverMap[workspaceId]) {
serverMap[workspaceId] = {};
}
return serverMap[workspaceId];
});
export function recordServerStatus(info: ServerStatusInfo) {
const { workspaceId, name, hostname, timeout, payload } = info;
if (!workspaceId || !name || !hostname) {
console.warn(
'[ServerStatus] lost some necessary params, request will be ignore',
info
);
return;
}
if (!serverMap[workspaceId]) {
serverMap[workspaceId] = {};
}
serverMap[workspaceId][name || hostname] = {
workspaceId,
name,
hostname,
timeout,
updatedAt: Date.now(),
payload,
};
subscribeEventBus.emit(
'onServerStatusUpdate',
workspaceId,
serverMap[workspaceId]
);
}
export function clearOfflineServerStatus(workspaceId: string) {
if (!serverMap[workspaceId]) {
return;
}
const offlineNode: string[] = [];
Object.entries(serverMap[workspaceId]).forEach(([key, info]) => {
if (!isServerOnline(info)) {
offlineNode.push(key);
}
});
for (const node of offlineNode) {
delete serverMap[workspaceId][node];
}
subscribeEventBus.emit(
'onServerStatusUpdate',
workspaceId,
serverMap[workspaceId]
);
return serverMap[workspaceId];
}
export function getServerCount(workspaceId: string): number {
if (!serverMap[workspaceId]) {
return 0;
}
return Object.keys(serverMap[workspaceId]).length;
}