Skip to content

Instantly share code, notes, and snippets.

@ninabreznik
Last active October 21, 2022 00:01
Show Gist options
  • Save ninabreznik/7acb6df94c04096157f2c8777b990738 to your computer and use it in GitHub Desktop.
Save ninabreznik/7acb6df94c04096157f2c8777b990738 to your computer and use it in GitHub Desktop.
hypercore-protocol
const hypercore = require('hypercore')
const RAM = require('random-access-memory')
const hyperswarm = require('hyperswarm')
// const HypercoreProtocol = require('hypercore-protocol')
const createTestnet = require('@hyperswarm/testnet')
start()
async function start () {
const { bootstrap } = await createTestnet(3)
var feed1_key
var feed1_topic
var feed2_key
var feed2_topic
{ // ALICE
const feed1 = await make_feed()
const feed2 = await make_feed()
feed1_key = feed1.key
feed1_topic = feed1.discoveryKey
feed2_key = feed2.key
feed2_topic = feed2.discoveryKey
const swarm1 = new hyperswarm({ bootstrap })
swarm1.on('connection', (conn, info) => {
console.log('new connection swarm1')
conn.on('error', onerror)
const proto = hypercore.createProtocolStream(conn, { ondiscoverykey })
/* const proto = new HypercoreProtocol(conn.isInitiator)
conn.pipe(proto).pipe(conn)
proto.on('discovery-key', ondiscoverykey) */
function ondiscoverykey (discoveryKey) {
console.log('ondiscoverykey', discoveryKey, [discoveryKey.equals(feed1.discoveryKey), discoveryKey.equals(feed2.discoveryKey)])
if (discoveryKey.equals(feed1.discoveryKey)) return feed1.replicate(proto)
if (discoveryKey.equals(feed2.discoveryKey)) return feed2.replicate(proto)
}
})
await swarm1.join(feed1.discoveryKey, { server: true, client: false }).flushed()
await swarm1.join(feed2.discoveryKey, { server: true, client: false }).flushed()
}
{ // BOB
const feed1 = new hypercore(RAM, feed1_key)
const feed2 = new hypercore(RAM, feed2_key)
await feed1.ready()
await feed2.ready()
const swarm2 = new hyperswarm({ bootstrap })
swarm2.on('connection', async (conn, info) => {
console.log('new connection swarm2')
conn.on('error', onerror)
const proto = hypercore.createProtocolStream(conn)
/* const proto = new HypercoreProtocol(conn.isInitiator)
conn.pipe(proto).pipe(conn) */
for (var i = 0, len = info.topics.length; i < len; i++) {
const topic = info.topics[i]
console.log('[swarm2] info topic', topic, [topic.equals(feed1_topic), topic.equals(feed2_topic)])
if (topic.equals(feed1_topic)) feed1.replicate(proto)
if (topic.equals(feed2_topic)) feed2.replicate(proto)
}
})
swarm2.join(feed1_topic, { client: true, server: false }).flushed()
swarm2.join(feed2_topic, { client: true, server: false }).flushed()
await swarm2.flush()
const foo = await feed1.get(0)
console.log({foo: foo.toString()})
const bar = await feed2.get(0)
console.log({bar: bar.toString()})
}
}
async function make_feed () {
const feed = new hypercore(RAM)
await feed.ready()
await feed.append(Buffer.from('hello world'))
await feed.append(Buffer.from('hallo welt'))
await feed.append(Buffer.from('pozdravljen svet'))
await feed.append(Buffer.from('zdravo svete'))
await feed.append(Buffer.from('juhuhu'))
await feed.append(Buffer.from('halli hallo'))
await feed.append(Buffer.from('hiya'))
const foo = await feed.get(0)
console.log('make_feed', {foo: foo.toString()})
return feed
}
function onerror (err) { console.error({err})}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment