All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 3s
69 lines
1.7 KiB
TypeScript
69 lines
1.7 KiB
TypeScript
import type { WSContext } from "hono/ws";
|
|
import type { ContainerInfo, ContainerStats } from "./types.js";
|
|
|
|
export function sendContainerInfo(
|
|
containerClients: Set<WSContext<WebSocket>>,
|
|
containerInfo: ContainerInfo | ContainerInfo[]
|
|
) {
|
|
const containers = Array.isArray(containerInfo)
|
|
? containerInfo
|
|
: [containerInfo];
|
|
const payload = JSON.stringify({ containers });
|
|
sendToClientSet(containerClients, payload);
|
|
}
|
|
|
|
export function sendStats(
|
|
statsClients: Set<WSContext<WebSocket>>,
|
|
stats: ContainerStats
|
|
) {
|
|
const payload = JSON.stringify({ stats: [stats] });
|
|
sendToClientSet(statsClients, payload);
|
|
}
|
|
|
|
export function sendCombined(
|
|
combinedClients: Set<WSContext<WebSocket>>,
|
|
containerInfo: ContainerInfo,
|
|
stats: ContainerStats
|
|
) {
|
|
const payload = JSON.stringify({
|
|
containers: [containerInfo],
|
|
stats: [stats],
|
|
});
|
|
sendToClientSet(combinedClients, payload);
|
|
}
|
|
|
|
export function sendToSingleContainer(
|
|
singleContainerClients: Map<string, Set<WSContext<WebSocket>>>,
|
|
containerId: string,
|
|
containerInfo: ContainerInfo,
|
|
stats: ContainerStats
|
|
) {
|
|
const combinedData = {
|
|
...containerInfo,
|
|
...stats,
|
|
};
|
|
const payload = JSON.stringify({ container: combinedData });
|
|
const clients = singleContainerClients.get(containerId);
|
|
if (clients) {
|
|
sendToClientSet(clients, payload);
|
|
}
|
|
}
|
|
|
|
export function sendToClientSet(
|
|
clients: Set<WSContext<WebSocket>>,
|
|
payload: string
|
|
) {
|
|
for (const ws of clients) {
|
|
if (ws.readyState === 1) {
|
|
try {
|
|
ws.send(payload);
|
|
} catch (err) {
|
|
console.error("Error sending to client:", err);
|
|
clients.delete(ws);
|
|
}
|
|
} else {
|
|
clients.delete(ws);
|
|
}
|
|
}
|
|
}
|