Skip to content

Instantly share code, notes, and snippets.

@ninabreznik
Last active October 14, 2021 18:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ninabreznik/498bbaf9da74843d7e2becc7db9e9b80 to your computer and use it in GitHub Desktop.
Save ninabreznik/498bbaf9da74843d7e2becc7db9e9b80 to your computer and use it in GitHub Desktop.
peer-1
const hypercore = require('hypercore')
// const RAM = require('random-access-memory')
// const RAM = require('random-access-memory')
const hyperswarm = require('hyperswarm')
const multiplex = require('multiplex')
const Protocol = require('hypercore-protocol')
const DHT = require('@hyperswarm/dht')
start()
async function start () {
const bootstrapper1 = new DHT({ ephemeral: true })
await bootstrapper1.bind(10001)
const bootstrapper2 = new DHT({
bootstrap: [ { host: bootstrapper1.address().address, port: bootstrapper1.address().port }, ],
ephemeral: false
})
await bootstrapper2.bind(10002)
/*-------------------------------*/
const bootstrap_nodes = [
{ host: bootstrapper1.address().address, port: bootstrapper1.address().port },
{ host: bootstrapper2.address().address, port: bootstrapper2.address().port },
]
console.log({bootstrap_nodes})
const swarm = new hyperswarm({ bootstrap: bootstrap_nodes })
const feed = new hypercore('./myfeed', {valueEncoding: 'binary'})
feed.on('ready', async () => {
console.log('FEED - feed ready')
console.log({feedkey: feed.key.toString('hex'), topic: feed.discoveryKey.toString('hex') })
// console.log(feed.length)
await append(feed, 'Hello World!')
await append(feed, 'Pozdravljen svet!')
await append(feed, '你好,世界!')
await append(feed, 'Hola Mundo!')
await append(feed, 'สวัสดีชาวโลก!')
await append(feed, 'Hallo Welt!')
await append(feed, 'Bonjour le monde!')
await append(feed, 'Здраво Свете!')
await append(feed, 'Hai dunia!')
await append(feed, 'Mhoro nyika!')
await append(feed, 'Salom Dunyo!')
await append(feed, 'Halo Dunia!')
await append(feed, 'Kumusta kalibutan!')
await append(feed, 'Hei Verden!')
await append(feed, 'Ahoj svet!')
await append(feed, 'Hej världen!')
await append(feed, 'Helló Világ!')
const topic = feed.discoveryKey
const opts = { server: true, client: false }
// await swarm.leave(topic)
const discovery = swarm.join(topic, opts)
// await discovery.flushed()
// // Wait until the topic has been fully announced to the DHT. This method is only relevant in server mode. When flushed() has completed, the server will be available to the network.
// await discovery.refresh({ client, server })
// await discovery.destroy()
// swarm.on('connection', (socket, peerInfo) => {
// console.log(swarm.connections.length === swarm.peers.length, { connections: swarm.connections.length, peers: swarm.peers.length })
// socket // is an end-to-end (Noise) encrypted Duplex stream
// peerInfo // is a PeerInfo instance
// peerInfo.publicKey // The peer's Noise public key.
// peerInfo.topics // An Array of topics that this Peer is associated with -- topics will only be updated when the Peer is in client mode.
// // Server mode will announce your keypair to the DHT,
// // so that other peers can discover your server.
// // When server connections are emitted,
// // they are not associated with a specific topic
// // -- the server only knows it received an incoming connection.
// // client connections will be emitted as connection events,
// // but in client mode they will be associated with the topic
// // -- (info.topics will be set in the connection event).
// }) // Emitted whenever the swarm connects to a new peer.
// setTimeout(() => { discovery.refresh({ server: true, client: false }) }, 10000)
const server_stream = new Protocol(false)
const client_stream = new Protocol(true)
swarm.on('connection', (socket, info) => {
console.log('new connection', socket.isInitiator)
if (socket.isInitiator) {
const replication_stream = client_stream
feed.replicate(replication_stream)
socket.pipe(replication_stream).pipe(socket)
} else {
const replication_stream = server_stream
replication_stream.on('discovery-key', () => {
feed.replicate(replication_stream)
console.log('discovery key')
})
socket.pipe(replication_stream).pipe(socket)
}
console.log({text: 'SWARM - new connection',
connections: swarm.connections._byPublicKey.keys(),
peers: swarm.peers.keys(),
id: socket.id.toString('hex') ,
myKey: socket.publicKey.toString('hex'),
remoteKey: socket.remotePublicKey.toString('hex'),
info_pubKey: info.publicKey.toString('hex'),
topics: info.topics.map(topic => topic.toString('hex')),
seenTopics: info._seenTopics
})
// console.log({text: 'New connection - peer 1 side'})
// socket.pipe(feed.replicate(socket.isInitiator)).pipe(socket)
// // console.log({feed})
// socket.on('piping', () => console.log('piping'))
// socket.on('end', () => console.log('end'))
// socket.on('close', () => console.log('close'))
// // socket.on('data', () => console.log('data'))
// socket.on('readable', () => console.log('readable'))
// socket.on('finish', () => console.log('finish'))
// socket.on('drain', () => console.log('drain'))
})
async function append (feed, data) {
return new Promise((resolve, reject) => {
feed.append(data, (err) => {
if (err) reject(err)
resolve()
})
})
}
})
// feed.on('peer-add', peer => console.log('FEED - peer add'))
// feed.on('peer-open', peer => console.log('FEED - peer open'))
// feed.on('peer-remove', peer => console.log('FEED - peer remove'))
// feed.on('upload', (index, data) => console.log('FEED - upload'))
// feed.on('download', (index, data) => console.log('FEED - download'))
// feed.on('sync', () => console.log('FEED - sync'))
// feed.on('close', () => console.log('FEED - close'))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment