OverviewFilesCommitsIssuesDocsReleasesPeers

p2p-bridge / test-production-dht.js

78 lines · javascript ref:
#!/usr/bin/env node
'use strict'

// Test same-machine connectivity on PRODUCTION DHT
// with the flushed() fix applied

const Hyperswarm = require('hyperswarm')
const crypto = require('hypercore-crypto')
const b4a = require('b4a')

async function test () {
  const topic = crypto.hash(b4a.from('atomspace-bridge-test-' + Date.now()))

  console.log('Topic:', b4a.toString(topic, 'hex').slice(0, 24) + '...')
  console.log('Using PRODUCTION DHT (no testnet)\n')

  // Server swarm
  const server = new Hyperswarm()
  let serverConnected = false
  server.on('connection', (conn, info) => {
    serverConnected = true
    console.log('[server] Got connection from', b4a.toString(info.publicKey, 'hex').slice(0, 12))
    conn.on('data', d => console.log('[server] Received:', d.toString()))
    conn.write('hello from server')
    conn.on('error', () => {})
  })

  // Client swarm
  const client = new Hyperswarm()
  let clientConnected = false
  client.on('connection', (conn, info) => {
    clientConnected = true
    console.log('[client] Got connection to', b4a.toString(info.publicKey, 'hex').slice(0, 12))
    conn.on('data', d => console.log('[client] Received:', d.toString()))
    conn.write('hello from client')
    conn.on('error', () => {})
  })

  // Server: join + wait for DHT announce (THE FIX)
  console.log('Server: joining topic + waiting for flushed()...')
  const t0 = Date.now()
  const discovery = server.join(topic, { server: true, client: false })
  await discovery.flushed()
  const announceMs = Date.now() - t0
  console.log('Server: DHT announce complete (' + announceMs + 'ms)')
  console.log('Server: DHT bootstrapped')

  // Client: join + wait for connection
  console.log('\nClient: joining topic + flushing...')
  const t1 = Date.now()
  client.join(topic, { server: false, client: true })
  await client.flush()
  const lookupMs = Date.now() - t1
  console.log('Client: flush complete (' + lookupMs + 'ms)')

  // Wait for connection events
  await new Promise(r => setTimeout(r, 2000))

  console.log('\nServer connections:', server.connections.size, '(event fired:', serverConnected + ')')
  console.log('Client connections:', client.connections.size, '(event fired:', clientConnected + ')')

  if (serverConnected && clientConnected) {
    console.log('\n✓ SUCCESS — production DHT works with flushed()!')
    console.log('  Announce: ' + announceMs + 'ms, Lookup: ' + lookupMs + 'ms')
  } else {
    console.log('\n✗ FAILED — need testnet for same-machine connections')
  }

  await server.destroy()
  await client.destroy()
  process.exit(0)
}

test().catch(err => {
  console.error('Test failed:', err)
  process.exit(1)
})