OverviewFilesCommitsIssuesDocsReleasesPeers

pearbrowser-desktop / scripts / check-relays.js

69 lines · javascript ref:
/**
 * Quick relay health check — boot a HiveRelayClient, see how many
 * relays we connect to via the DHT, list their pubkeys, and try a
 * tiny op against each.
 *
 * Usage:
 *   node scripts/check-relays.js [--storage <dir>]
 */

import { HiveRelayClient } from 'p2p-hiverelay-client'
import { mkdtempSync } from 'node:fs'
import { tmpdir } from 'node:os'
import { join } from 'node:path'

const storageArgIdx = process.argv.indexOf('--storage')
const storage = storageArgIdx >= 0
  ? process.argv[storageArgIdx + 1]
  : mkdtempSync(join(tmpdir(), 'check-relays-'))

console.log('🔬 HiveRelay health check')
console.log('   storage:', storage)
console.log()

const client = new HiveRelayClient(storage)
const seen = new Map() // hex pubkey → { connectedAt, capabilities? }

client.on('relay-connected', (info) => {
  const pk = info && info.publicKey
    ? Buffer.from(info.publicKey).toString('hex')
    : 'unknown'
  if (!seen.has(pk)) {
    seen.set(pk, { connectedAt: Date.now(), info })
    console.log(`  + ${pk.slice(0, 16)}…`)
  }
})

await client.start()
console.log('  · client started, discovering relays...')
console.log()

// Wait 8s for relays to appear (some come fast, some take a moment)
await new Promise((r) => setTimeout(r, 8000))

console.log('────────────────────────────')
console.log(`  ${seen.size} unique relays reachable via DHT`)
console.log(`  ${client.relays.size} live connections in client.relays`)
console.log('────────────────────────────')
console.log()

if (seen.size === 0) {
  console.log('⚠️  No relays found in 8s. The DHT may be slow today, or')
  console.log('    your network is blocking UDP. Try again, or check your')
  console.log('    machine\'s connectivity to a known DHT bootstrap node.')
} else {
  console.log('Per-relay breakdown:')
  let i = 1
  for (const [pk, entry] of seen) {
    const ageMs = Date.now() - entry.connectedAt
    console.log(`  ${i++}. ${pk.slice(0, 16)}…  (connected ${ageMs}ms ago)`)
  }
  console.log()
  console.log('All relays accept signed seed/unseed requests — see')
  console.log('scripts/pin-self-on-hiverelay.js or scripts/publish-and-pin.js')
}

await new Promise((r) => setTimeout(r, 1000))
try { await client.destroy() } catch {}
process.exit(0)