/* Дымовой тест M0: сервер должен быть запущен. `pnpm --filter @idle/server smoke` */ import WebSocket from 'ws'; const seen = []; await new Promise((resolve, reject) => { const ws = new WebSocket('ws://localhost:3000/ws'); ws.on('open', () => ws.send(JSON.stringify({ t: 'hello', v: 1 }))); ws.on('message', (d) => { seen.push(JSON.parse(String(d))); if (seen.length >= 2) { ws.close(); resolve(); } }); ws.on('error', reject); setTimeout(() => reject(new Error('timeout waiting for welcome+snapshot')), 5000); }); const [welcome, snap] = seen; console.log('welcome:', JSON.stringify(welcome)); console.log( 'avatars:', snap.avatars.map((a) => `${a.name}@${a.x},${a.y} ${a.face}`).join(' | '), ); if (welcome.t !== 'welcome' || welcome.v !== 1) throw new Error('bad welcome'); if (snap.t !== 'snapshot' || snap.avatars.length !== 3) throw new Error('bad snapshot'); // неверная версия протокола — сервер обязан закрыть сокет с кодом 4001 const closeCode = await new Promise((resolve) => { const ws = new WebSocket('ws://localhost:3000/ws'); ws.on('open', () => ws.send(JSON.stringify({ t: 'hello', v: 999 }))); ws.on('close', (code) => resolve(code)); setTimeout(() => resolve('no-close'), 3000); }); console.log('close code for wrong version:', closeCode); if (closeCode !== 4001) throw new Error(`expected close 4001, got ${closeCode}`); console.log('WS smoke: OK');