#!/usr/bin/env node
/**
* Relay test peer — the "other side" for the GDScript relay test.
*
* Connects to a sidecar, discovers peers, and auto-responds to relay pings.
* Run this on machine B while Godot runs test_relay.tscn on machine A.
*
* Both machines must be running their own sidecar.js:
* node sidecar.js 3118
*
* Usage:
* node benchmarks/test-relay-peer.cjs [sidecar-port]
*/
const net = require('net')
const PORT = parseInt(process.argv[2] || '3118', 10)
let buffer = ''
let myKey = ''
let peerKey = ''
let pingCount = 0
let pongCount = 0
const socket = net.createConnection(PORT, '127.0.0.1', () => {
console.log(`[relay-peer] Connected to sidecar on port ${PORT}`)
send({ method: 'start', gameName: 'hyper-tps-relay-test' })
})
socket.on('data', (chunk) => {
buffer += chunk.toString()
let idx
while ((idx = buffer.indexOf('\n')) !== -1) {
const line = buffer.slice(0, idx).trim()
buffer = buffer.slice(idx + 1)
if (!line) continue
try {
handleEvent(JSON.parse(line))
} catch {}
}
})
socket.on('error', (err) => {
console.error('[relay-peer] Socket error:', err.message)
process.exit(1)
})
socket.on('close', () => {
console.log('[relay-peer] Disconnected')
console.log(`[relay-peer] Stats: sent ${pongCount} pongs for ${pingCount} pings received`)
process.exit(0)
})
function send (msg) {
socket.write(JSON.stringify(msg) + '\n')
}
function handleEvent (data) {
const event = data.event || ''
switch (event) {
case 'identity':
myKey = data.publicKey || ''
console.log(`[relay-peer] Identity: ${data.name} (key: ${myKey.slice(0, 12)}...)`)
break
case 'lobby-ready':
console.log('[relay-peer] Lobby ready, waiting for Godot peer...')
break
case 'peer-discovered': {
const pk = data.publicKey || ''
const name = data.name || 'Unknown'
console.log(`[relay-peer] Peer found: ${name} (${pk.slice(0, 12)}...)`)
if (!peerKey) {
peerKey = pk
console.log(`[relay-peer] Will echo pings from ${name}`)
}
break
}
case 'peer-gone': {
const pk = data.publicKey || ''
console.log(`[relay-peer] Peer gone: ${pk.slice(0, 12)}...`)
if (pk === peerKey) peerKey = ''
break
}
case 'relay-data': {
const from = data.from || ''
const payload = data.data || {}
if (payload.type === 'ping') {
pingCount++
// Echo as pong
send({
method: 'relay',
target: from,
data: {
type: 'pong',
ts: payload.ts,
size: payload.size || 0
}
})
pongCount++
if (pingCount <= 5 || pingCount % 50 === 0) {
console.log(`[relay-peer] ping #${pingCount} from ${from.slice(0, 12)}... → pong`)
}
} else if (payload.type === 'pong') {
// We received a pong — this node must have also been sending pings
console.log(`[relay-peer] Got pong (unexpected — this is the echo side)`)
}
break
}
case 'error':
console.error(`[relay-peer] Sidecar error: ${data.message}`)
break
}
}
// Graceful shutdown
process.on('SIGINT', () => {
console.log('\n[relay-peer] Shutting down...')
send({ method: 'shutdown' })
setTimeout(() => process.exit(0), 500)
})
console.log(`[relay-peer] Connecting to sidecar on 127.0.0.1:${PORT}...`)