// e2e/ws-test.js // Simple WebSocket handshake tester using 'ws' // Usage: // node e2e/ws-test.js [--insecure] // Or set env TOKEN to attach: TOKEN=abc node e2e/ws-test.js wss://host:port const url = process.argv[2] || process.env.WS_URL; const insecure = process.argv.includes('--insecure'); const token = process.env.TOKEN || process.argv.find(a => a.startsWith('token='))?.split('=')[1]; if (!url) { console.error('Usage: node e2e/ws-test.js [--insecure]'); process.exit(2); } const WebSocket = require('ws'); const finalUrl = token && !url.includes('?') ? `${url}?token=${token}` : (token ? `${url}&token=${token}` : url); console.log('Connecting to', finalUrl, 'insecure=', insecure); const opts = {}; if (insecure) opts.rejectUnauthorized = false; const ws = new WebSocket(finalUrl, opts); let opened = false; const timer = setTimeout(() => { if (!opened) { console.error('TIMEOUT waiting for open (10s)'); ws.terminate(); process.exit(3); } }, 10000); ws.on('open', () => { opened = true; clearTimeout(timer); console.log('WS_OPEN'); try { const ping = JSON.stringify({ type: 'ping', ts: Date.now() }); ws.send(ping); } catch(e){} // Wait for message or close within 8s setTimeout(() => { console.log('Closing socket after wait'); ws.close(); }, 8000); }); ws.on('message', (data) => { console.log('WS_MESSAGE', data.toString().slice(0,1000)); }); ws.on('close', (code, reason) => { console.log('WS_CLOSE', code, (reason || '').toString().slice(0,300)); process.exit(0); }); ws.on('error', (err) => { console.error('WS_ERROR', err && err.message ? err.message : err); process.exit(4); });