#!/usr/bin/env node /** * WebSocket Test Client * * Tests the WebSocket event system for the Jackbox Game Picker API * * Usage: * JWT_TOKEN="your_token" node test-websocket.js */ const WebSocket = require('ws'); const API_URL = process.env.API_URL || 'ws://localhost:5000'; const JWT_TOKEN = process.env.JWT_TOKEN || ''; if (!JWT_TOKEN) { console.error('\nāŒ ERROR: JWT_TOKEN not set!'); console.error('\nGet your token:'); console.error(' curl -X POST "http://localhost:5000/api/auth/login" \\'); console.error(' -H "Content-Type: application/json" \\'); console.error(' -d \'{"key":"YOUR_ADMIN_KEY"}\''); console.error('\nThen run:'); console.error(' JWT_TOKEN="your_token" node test-websocket.js\n'); process.exit(1); } console.log('\nšŸš€ WebSocket Test Client'); console.log('═══════════════════════════════════════════════════════\n'); console.log(`Connecting to: ${API_URL}/api/sessions/live`); console.log(''); const ws = new WebSocket(`${API_URL}/api/sessions/live`); ws.on('open', () => { console.log('āœ… Connected to WebSocket server\n'); // Step 1: Authenticate console.log('šŸ“ Step 1: Authenticating...'); ws.send(JSON.stringify({ type: 'auth', token: JWT_TOKEN })); }); ws.on('message', (data) => { try { const message = JSON.parse(data.toString()); switch (message.type) { case 'auth_success': console.log('āœ… Authentication successful\n'); // Step 2: Subscribe to session (you can change this ID) console.log('šŸ“ Step 2: Subscribing to session 1...'); ws.send(JSON.stringify({ type: 'subscribe', sessionId: 1 })); break; case 'auth_error': console.error('āŒ Authentication failed:', message.message); process.exit(1); break; case 'subscribed': console.log(`āœ… Subscribed to session ${message.sessionId}\n`); console.log('šŸŽ§ Listening for events...'); console.log(' Add a game in the Picker page to see events here'); console.log(' Press Ctrl+C to exit\n'); // Start heartbeat setInterval(() => { ws.send(JSON.stringify({ type: 'ping' })); }, 30000); break; case 'game.added': console.log('\nšŸŽ® GAME ADDED EVENT RECEIVED!'); console.log('═══════════════════════════════════════════════════════'); console.log('Game:', message.data.game.title); console.log('Pack:', message.data.game.pack_name); console.log('Players:', `${message.data.game.min_players}-${message.data.game.max_players}`); console.log('Session ID:', message.data.session.id); console.log('Games Played:', message.data.session.games_played); console.log('Timestamp:', message.timestamp); console.log('═══════════════════════════════════════════════════════\n'); break; case 'pong': console.log('šŸ’“ Heartbeat'); break; case 'error': console.error('āŒ Error:', message.message); break; default: console.log('šŸ“Ø Received:', message); } } catch (err) { console.error('Failed to parse message:', err); } }); ws.on('error', (err) => { console.error('\nāŒ WebSocket error:', err.message); process.exit(1); }); ws.on('close', () => { console.log('\nšŸ‘‹ Connection closed'); process.exit(0); }); // Handle Ctrl+C process.on('SIGINT', () => { console.log('\n\nāš ļø Closing connection...'); ws.close(); });