mirror of
https://github.com/tale/headplane.git
synced 2026-08-20 18:02:17 +00:00
feat: add ws server for agent
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
// This is a "side-effect" but we want a lifecycle cache map of
|
||||
// peer statuses to prevent unnecessary fetches to the agent.
|
||||
import type { LoaderFunctionArgs } from 'remix'
|
||||
|
||||
type Context = LoaderFunctionArgs['context']
|
||||
const cache: { [nodeID: string]: unknown } = {}
|
||||
|
||||
export async function queryWS(context: Context, nodeIDs: string[]) {
|
||||
const ws = context.ws
|
||||
const firstClient = ws.clients.values().next().value
|
||||
if (!firstClient) {
|
||||
return cache
|
||||
}
|
||||
|
||||
const cached = nodeIDs.map((nodeID) => {
|
||||
const cached = cache[nodeID]
|
||||
if (cached) {
|
||||
return cached
|
||||
}
|
||||
})
|
||||
|
||||
// We only need to query the nodes that are not cached
|
||||
const uncached = nodeIDs.filter((nodeID) => !cached.includes(nodeID))
|
||||
if (uncached.length === 0) {
|
||||
return cache
|
||||
}
|
||||
|
||||
firstClient.send(JSON.stringify({ NodeIDs: uncached }))
|
||||
await new Promise((resolve) => {
|
||||
const timeout = setTimeout(() => {
|
||||
resolve()
|
||||
}, 3000)
|
||||
|
||||
firstClient.on('message', (message) => {
|
||||
const data = JSON.parse(message.toString())
|
||||
if (Object.keys(data).length === 0) {
|
||||
resolve()
|
||||
}
|
||||
|
||||
for (const [nodeID, status] of Object.entries(data)) {
|
||||
cache[nodeID] = status
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
return cache
|
||||
}
|
||||
Reference in New Issue
Block a user