OverviewFilesCommitsIssuesDocsReleasesPeers

hyperswarm-peer / integration / test_announce_diag.js

80 lines · javascript ref:
// Diagnostic: Does C++ announce get received and verified by JS testnet nodes?
import HyperDHT from 'hyperdht'
import crypto from 'crypto'
import { writeFileSync } from 'fs'
import { createRequire } from 'module'

const require = createRequire(import.meta.url)
const createTestnet = require('hyperdht/testnet')

const testnet = await createTestnet(3)
const bootstrap = testnet.bootstrap

console.log('bootstrap:', bootstrap)

// Log each node's state
const CMD_ANNOUNCE = 4
for (let i = 0; i < testnet.nodes.length; i++) {
  const node = testnet.nodes[i]
  const addr = node.address()
  const nodeId = node.id ? node.id.toString('hex').slice(0,16) : 'null'
  console.log(`node[${i}] id=${nodeId}... port=${addr.port} ephemeral=${node.ephemeral} persistent=${node._persistent != null} table.id=${node.table.id.toString('hex').slice(0,16)}`)

  // Patch onrequest to log ANNOUNCE commands
  const origOnRequest = node.onrequest.bind(node)
  const nodeIndex = i
  node.onrequest = function(req) {
    if (req.command === CMD_ANNOUNCE) {
      console.log(`\n[node${nodeIndex}] ANNOUNCE command received!`)
      console.log(`  from=${req.from.host}:${req.from.port}`)
      console.log(`  target=${req.target?.toString('hex').slice(0,16)}...`)
      console.log(`  token_len=${req.token?.length || 0}`)
      console.log(`  value_len=${req.value?.length || 0}`)
      if (req.value) {
        console.log(`  value_hex=${req.value.toString('hex').slice(0, 80)}...`)
      }
    }
    return origOnRequest(req)
  }
}

// First test: JS announce to same testnet (for comparison)
console.log('\n--- JS announce (baseline) ---')
const dht = new HyperDHT({ bootstrap, firewalled: false })
await dht.fullyBootstrapped()
const kp = HyperDHT.keyPair()
console.log(`JS pk: ${kp.publicKey.toString('hex').slice(0,16)}`)

const topic = crypto.createHash('sha256').update('test-p2p-layer2').digest()
const srv = dht.createServer()
await srv.listen(kp)
const ann = dht.announce(topic, kp)
await ann.finished()
console.log('JS announce done\n')

// Lookup to verify
const dht2 = new HyperDHT({ bootstrap, firewalled: false })
await dht2.fullyBootstrapped()
let foundJS = false
const lookupStream = dht2.lookup(topic)
for await (const data of lookupStream) {
  if (data.peers && data.peers.length > 0) {
    foundJS = true
    console.log(`JS lookup found ${data.peers.length} peers`)
  }
}
console.log(`JS announce verified: ${foundJS}`)

await srv.close()
await dht.destroy()
await dht2.destroy()

// Now write bootstrap and wait for C++ announce
writeFileSync('/tmp/layer_bootstrap.txt', bootstrap.map(b => `${b.host}:${b.port}`).join(','))
console.log('\n--- Waiting 40s for C++ announce ---')
console.log('Run: godot4 --headless --path project --script test_dht_announce.gd')

await new Promise(r => setTimeout(r, 40000))
console.log('\nDone')
await testnet.destroy()