84 lines
1.8 KiB
TypeScript
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;
|
|
}
|