/** * Handlers for getState, getSettings, updateSettings. * Context: holesailManager, certificateAuthority, httpsProxy, connectProxy, getProxiesReadyPromise, getTunnelsRestoredPromise, scheduleNextAutoBackup, debugLog */ function register(deps) { const { holesailManager, certificateAuthority, httpsProxy, connectProxy, getProxiesReadyPromise, getTunnelsRestoredPromise, scheduleNextAutoBackup, debugLog } = deps; return [ { type: 'getState', handle: async (payload, reply) => { const proxiesReadyPromise = getProxiesReadyPromise(); const tunnelsRestoredPromise = getTunnelsRestoredPromise(); if (proxiesReadyPromise) await proxiesReadyPromise; if (tunnelsRestoredPromise) { let _fallbackTimer; await Promise.race([ tunnelsRestoredPromise.finally(() => clearTimeout(_fallbackTimer)), new Promise((r) => { _fallbackTimer = setTimeout(r, 15000); }) ]); } const servers = holesailManager.getServers(); const virtualHosts = holesailManager.getVirtualHosts(); const serviceTunnels = holesailManager.getServiceTunnels(); const proxyPort = holesailManager.getProxyPort(); const connectProxyPort = connectProxy.getPort(); const settings = holesailManager.getSettings(); const sshConnections = holesailManager.getSshConnections(); const rdpConnections = holesailManager.getRdpConnections(); debugLog('getState: servers=', servers.length, 'virtualHosts=', virtualHosts.length, 'serviceTunnels=', serviceTunnels.length, 'proxyPort=', proxyPort, 'connectProxyPort=', connectProxyPort); const caInstalled = await new Promise((resolve) => { certificateAuthority.isRootCAInstalled((installed) => resolve(!!installed)); }); reply({ ok: true, servers, virtualHosts, serviceTunnels, proxyPort, connectProxyPort: connectProxyPort ?? null, caInstalled, settings, sshConnections, rdpConnections, trafficStats: httpsProxy.getTrafficStats() }); } }, { type: 'getSettings', handle: async (payload, reply) => { reply({ ok: true, settings: holesailManager.getSettings() }); } }, { type: 'updateSettings', handle: async (payload, reply) => { const { requiresRestart } = holesailManager.updateSettings(payload); debugLog('updateSettings: applied', JSON.stringify(payload), 'requiresRestart=', requiresRestart); scheduleNextAutoBackup(); reply({ ok: true, settings: holesailManager.getSettings(), requiresRestart }); } } ]; } module.exports = { register };