const WebSocket = require('ws') const base = 'ws://127.0.0.1:3000/ws?room=SCOREQA' function connect(name) { return new Promise((resolve, reject) => { const ws = new WebSocket(base) const messages = [] ws.on('message', (data) => { const msg = JSON.parse(data.toString()) messages.push(msg) if (msg.type === 'joined') resolve({ ws, messages, team: msg.team }) }) ws.on('error', reject) }) } function waitFor(condFn, timeout = 5000) { const start = Date.now() return new Promise((resolve, reject) => { const check = () => { if (condFn()) return resolve(undefined) if (Date.now() - start > timeout) return reject(new Error('timeout')) setTimeout(check, 50) } check() }) } ;(async () => { const p1 = await connect('p1') const p2 = await connect('p2') await waitFor(() => p1.messages.some(m => m.type === 'game_state')) let state = p1.messages.find(m => m.type === 'game_state') console.log('start turn', state.turn_team, 'hammer', state.hammer) const thrower1 = state.turn_team === p1.team ? p1 : p2 thrower1.ws.send(JSON.stringify({ type: 'throw', broom_x: 0.2, broom_y: 38.7, weight: 9, curl: 1, friction: 1.0 })) await waitFor(() => p1.messages.some(m => m.type === 'trajectory'), 15000) await waitFor(() => p1.messages.slice(-1)[0]?.type === 'game_state', 15000) await new Promise(r => setTimeout(r, 500)) state = p1.messages.slice(-1)[0] console.log('After first throw:', state) const thrower2 = state.turn_team === p1.team ? p1 : p2 thrower2.ws.send(JSON.stringify({ type: 'throw', broom_x: -0.1, broom_y: 38.8, weight: 9, curl: 1, friction: 1.0 })) await waitFor(() => p1.messages.filter(m => m.type === 'trajectory').length >= 2, 15000) await waitFor(() => p1.messages.slice(-1)[0]?.type === 'game_state', 15000) await new Promise(r => setTimeout(r, 500)) console.log('Final stones', p1.messages.slice(-1)[0].stones) p1.ws.close() p2.ws.close() process.exit(0) })().catch(e => { console.error(e) process.exit(1) })