[grade=B] DC-076: WebSocket server for real-time dashboard updates
CI / Test & Lint (push) Canceled after 0s
CI / Security audit (push) Canceled after 0s

New /api/v1/ws endpoint providing bidirectional WebSocket alongside the
existing SSE (/api/v1/events/stream). Shares the same event broadcasts
(resource alerts, health status, incidents, updates, dependencies,
auto-restart, drift, SSL, DNS propagation).

Features:
- Auth-gated in production (session cookie or token query param)
- Subscribe/unsubscribe event filtering
- Ping/pong heartbeat + dead connection sweep
- Clean shutdown removes all EventEmitter listeners
- Exact path matching (no broad includes)
- Fixed unsubscribe semantics (empty set = receive nothing)

8 WS tests, 1560 total tests pass.
This commit is contained in:
Hermes
2026-08-12 12:15:17 -07:00
parent 2feeff7d12
commit aaea3bd5d4
3 changed files with 422 additions and 0 deletions
+26
View File
@@ -68,6 +68,32 @@ process.on('uncaughtException', (error) => {
attachExecWS(server, log, authManager);
log.info('server', 'WebSocket exec handler attached (auth enforced)');
// DC-076: Attach dashboard WebSocket for real-time updates
try {
const createDashboardWS = require('./src/websocket/dashboard-ws');
const resourceMonitor = require('./src/managers/resource-monitor');
const healthChecker = require('./src/monitoring/health-checker');
const updateManager = require('./src/managers/update-manager');
const dependencyManager = require('./src/managers/dependency-manager');
const autoRestartManager = require('./src/managers/auto-restart-manager');
const configDriftDetector = require('./src/managers/config-drift-detector');
const sslMonitor = require('./src/monitoring/ssl-monitor');
createDashboardWS(server, {
resourceMonitor,
healthChecker,
updateManager,
dependencyManager,
autoRestartManager,
driftDetector: configDriftDetector,
sslMonitor,
log,
});
log.info('server', 'Dashboard WebSocket attached at /api/v1/ws');
} catch (err) {
log.error('server', 'Dashboard WebSocket failed to attach', { error: err.message });
}
// Start feature modules
const resourceMonitor = require('./src/managers/resource-monitor');
const backupManager = require('./src/utilities/backup-manager');