Files
jackboxpartypack-gamepicker/tests/test-session-end-websocket.js
cottongin 84398ebdd0 Reorganize project: move docs to docs/ and test scripts to tests/
Moved 9 documentation .md files from root into docs/.
Moved 4 test scripts from root into tests/.
Updated cross-references in README.md and docs to reflect new paths.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-07 14:07:39 -05:00

147 lines
4.5 KiB
JavaScript
Executable File

#!/usr/bin/env node
/**
* Test script for session.ended WebSocket event
*
* This script:
* 1. Connects to the WebSocket server
* 2. Authenticates with a JWT token
* 3. Subscribes to a session
* 4. Listens for session.ended events
*
* Usage:
* node test-session-end-websocket.js <session_id> <jwt_token>
*
* Example:
* node test-session-end-websocket.js 17 your-jwt-token-here
*/
const WebSocket = require('ws');
// Configuration
const WS_URL = process.env.WS_URL || 'ws://localhost:5000/api/sessions/live';
const SESSION_ID = process.argv[2] || '17';
const JWT_TOKEN = process.argv[3];
if (!JWT_TOKEN) {
console.error('❌ Error: JWT token is required');
console.error('Usage: node test-session-end-websocket.js <session_id> <jwt_token>');
process.exit(1);
}
console.log('🚀 Testing session.ended WebSocket event');
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
console.log(`📡 Connecting to: ${WS_URL}`);
console.log(`🎮 Session ID: ${SESSION_ID}`);
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n');
// Create WebSocket connection
const ws = new WebSocket(WS_URL);
ws.on('open', () => {
console.log('✅ Connected to WebSocket server\n');
// Step 1: Authenticate
console.log('🔐 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
console.log(`📻 Subscribing to session ${SESSION_ID}...`);
ws.send(JSON.stringify({
type: 'subscribe',
sessionId: parseInt(SESSION_ID)
}));
break;
case 'subscribed':
console.log(`✅ Subscribed to session ${message.sessionId}\n`);
console.log('👂 Listening for session.ended events...');
console.log(' (Close the session in the Picker to trigger the event)\n');
break;
case 'session.ended':
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
console.log('🎉 SESSION.ENDED EVENT RECEIVED!');
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
console.log('\n📦 Event Data:');
console.log(JSON.stringify(message, null, 2));
console.log('\n✨ Event Details:');
console.log(` Session ID: ${message.data.session.id}`);
console.log(` Active: ${message.data.session.is_active === 1 ? 'Yes' : 'No'}`);
console.log(` Games Played: ${message.data.session.games_played}`);
console.log(` Timestamp: ${message.timestamp}`);
console.log('\n✅ Test successful! The bot should now announce the session end.\n');
// Close connection after receiving the event
setTimeout(() => {
console.log('👋 Closing connection...');
ws.close();
}, 1000);
break;
case 'auth_error':
case 'error':
console.error(`❌ Error: ${message.message}`);
ws.close();
process.exit(1);
break;
case 'pong':
// Ignore pong messages
break;
default:
console.log(`📨 Received message: ${message.type}`);
console.log(JSON.stringify(message, null, 2));
}
} catch (err) {
console.error('❌ Failed to parse message:', err);
console.error('Raw data:', data.toString());
}
});
ws.on('error', (err) => {
console.error('❌ WebSocket error:', err.message);
process.exit(1);
});
ws.on('close', (code, reason) => {
console.log(`\n🔌 Connection closed (code: ${code})`);
if (reason) {
console.log(` Reason: ${reason}`);
}
process.exit(0);
});
// Handle Ctrl+C gracefully
process.on('SIGINT', () => {
console.log('\n\n👋 Shutting down...');
ws.close();
process.exit(0);
});
// Send periodic pings to keep connection alive
const pingInterval = setInterval(() => {
if (ws.readyState === WebSocket.OPEN) {
ws.send(JSON.stringify({ type: 'ping' }));
}
}, 30000);
// Clean up interval on close
ws.on('close', () => {
clearInterval(pingInterval);
});