import assert from 'node:assert/strict'; const base = process.env.PHOENIX_TEST_WS_BASE || 'ws://127.0.0.1:8789'; function openSocket(path) { return new Promise((resolve, reject) => { const socket = new WebSocket(`${base}${path}`); socket.addEventListener('open', () => resolve(socket), { once: true }); socket.addEventListener('error', () => reject(new Error(`failed to open ${path}`)), { once: true }); }); } const sockets = await Promise.all([ openSocket('/api/v1/metrics/ws'), openSocket('/api/v1/spectro/ws'), openSocket('/api/v1/visuals/ws'), ]); const [metrics] = sockets; let count = 0; let lastSeq = 0; let invalidPayload = false; metrics.addEventListener('message', (event) => { const frame = JSON.parse(String(event.data)); const seq = Number(frame.seq); if (seq <= lastSeq || 'spectro' in frame || 'wave_env' in frame || 'xy_l' in frame || 'wave_l' in frame) { invalidPayload = true; } lastSeq = seq; count += 1; }); await new Promise((resolve) => setTimeout(resolve, 1100)); sockets.forEach((socket) => socket.close()); assert.equal(invalidPayload, false, 'metrics must be ordered and contain no large visual payloads'); assert.ok(count >= 50 && count <= 75, `expected about 60 metrics/s, received ${count}`); console.log(`runtime websocket test passed (${count} metrics in 1.1 s; all three streams opened)`);