OverviewFilesCommitsIssuesDocsReleasesPeers

hyper-tps / benchmarks / test-relay-peer.cjs

129 lines · javascript ref:
#!/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}...`)