Files
peardock/client/snapshot.js
T
snxraven 53c8040020 Ship Track B UI: smart defaults, ops shell, deploy stepper
Add host snapshot and network IPAM suggestions, image-driven form
hydration, command palette, Host/Events/Settings views, offline banner,
job drawer for deploy steps, and typed RPC errors. Mark roadmap complete.
2026-07-10 21:17:04 -04:00

89 lines
2.2 KiB
JavaScript

/**
* Host snapshot cache for dynamic UI auto-population.
*/
import { manager, Methods } from './manager.js'
const TTL_MS = 8000
/** @type {{ data: object, at: number, peerId: string }|null} */
let cache = null
/** @type {Promise<object>|null} */
let inflight = null
export function clearSnapshotCache() {
cache = null
inflight = null
}
/**
* @param {{ force?: boolean }} [opts]
*/
export async function getSnapshot(opts = {}) {
const peerId = manager.active?.id || ''
const now = Date.now()
if (
!opts.force &&
cache &&
cache.peerId === peerId &&
now - cache.at < TTL_MS
) {
return cache.data
}
if (inflight && !opts.force) return inflight
inflight = (async () => {
if (!manager.active?.connected) {
throw new Error('Not connected')
}
const data = await manager.request(Methods.getHostSnapshot, {})
cache = { data, at: Date.now(), peerId }
inflight = null
return data
})().catch((err) => {
inflight = null
throw err
})
return inflight
}
export async function suggestNetwork(opts = {}) {
if (!manager.active?.connected) throw new Error('Not connected')
return manager.request(Methods.suggestNetworkIPAM, opts)
}
export async function suggestName(kind, base) {
if (!manager.active?.connected) throw new Error('Not connected')
return manager.request(Methods.suggestResourceName, { kind, base })
}
export async function suggestFromImage(image) {
if (!manager.active?.connected) throw new Error('Not connected')
return manager.request(Methods.suggestFromImage, { image })
}
export async function suggestDefaults(kind, args = {}) {
if (!manager.active?.connected) throw new Error('Not connected')
return manager.request(Methods.suggestDefaults, { kind, ...args })
}
export async function listUsedHostPorts() {
if (!manager.active?.connected) throw new Error('Not connected')
return manager.request(Methods.listUsedHostPorts, {})
}
/** Warm cache after connect (best-effort). */
export function warmSnapshot() {
getSnapshot({ force: true }).catch(() => {})
}
export default {
getSnapshot,
clearSnapshotCache,
warmSnapshot,
suggestNetwork,
suggestName,
suggestFromImage,
suggestDefaults,
listUsedHostPorts,
}