37 lines
1.3 KiB
JavaScript
37 lines
1.3 KiB
JavaScript
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)`);
|