63 lines
1.6 KiB
JavaScript
63 lines
1.6 KiB
JavaScript
|
const test = require('tape')
|
||
|
const Hyperswarm = require('hyperswarm')
|
||
|
const sodium = require('sodium-universal')
|
||
|
const b4a = require('b4a')
|
||
|
const { default: DHTFlood } = require('./')
|
||
|
const crypto = require('crypto')
|
||
|
|
||
|
const topicName = crypto.randomBytes(10)
|
||
|
|
||
|
test('Broadcast through several peers', (t) => {
|
||
|
const peer1 = createPeer()
|
||
|
const peer2 = createPeer()
|
||
|
const peer3 = createPeer()
|
||
|
t.plan(2)
|
||
|
|
||
|
Promise.all([peer1, peer2, peer3]).then((peers) => {
|
||
|
const peer1 = peers.shift()
|
||
|
const peer2 = peers.shift()
|
||
|
const peer3 = peers.shift()
|
||
|
|
||
|
const flood1 = new DHTFlood({ swarm: peer1 })
|
||
|
const flood2 = new DHTFlood({ swarm: peer2 })
|
||
|
const flood3 = new DHTFlood({ swarm: peer3 })
|
||
|
const data = Buffer.from('Hello World')
|
||
|
|
||
|
flood1.on('message', () => t.error('Got own message'))
|
||
|
|
||
|
flood2.on('message', (message) => {
|
||
|
t.deepEquals(message, data, 'Data got broadcast')
|
||
|
})
|
||
|
flood3.on('message', (message) => {
|
||
|
t.deepEquals(message, data, 'Data got broadcast')
|
||
|
})
|
||
|
|
||
|
function maybeFlood () {
|
||
|
if (peer1.peers.size === 2) {
|
||
|
flood1.broadcast(data)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
peer1.on('connection', () => {
|
||
|
maybeFlood()
|
||
|
})
|
||
|
|
||
|
t.teardown(() => {
|
||
|
[peer1, peer2, peer3].forEach((item) => item.destroy())
|
||
|
})
|
||
|
})
|
||
|
})
|
||
|
|
||
|
async function createPeer () {
|
||
|
const swarm = new Hyperswarm()
|
||
|
await swarm.dht.ready()
|
||
|
await swarm.listen()
|
||
|
|
||
|
const topic = b4a.allocUnsafe(32)
|
||
|
sodium.crypto_generichash(topic, b4a.from(topicName))
|
||
|
|
||
|
swarm.join(topic)
|
||
|
|
||
|
return swarm
|
||
|
}
|