const net = require('net') const Hypercore = require('hypercore'); const RAM = require('random-access-memory') const hostname = '127.0.0.1' let [mode, port, key] = process.argv.slice(2) if (['client', 'server'].indexOf(mode) === -1 || !port) { exit('usage: node replicate.js [client|server] PORT (KEY)') } const hypercore = new Hypercore((_) => new RAM(), key) hypercore.info().then((_info) => { console.log('KEY=' + hypercore.key.toString('hex')) console.log() if (hypercore.writable && !key) { hypercore.append(['hi\n', 'ola\n', 'hello\n', 'mundo\n']) } }) const opts = { hypercore, mode, port, hostname } start(opts) function start (opts) { const { port, hostname, mode } = opts const isInitiator = mode === 'client' opts.isInitiator = isInitiator if (mode === 'client') { const socket = net.connect(port, hostname) onconnection({ ...opts, socket }) } else { const server = net.createServer(socket => onconnection({ ...opts, socket })) server.listen(port, hostname, () => { const { address, port } = server.address() console.error(`server listening on ${address}:${port}`) }) } } function onconnection (opts) { const { socket, isInitiator, mode, hypercore } = opts const { remoteAddress, remotePort } = socket if (!isInitiator) { console.error(`new connection from ${remoteAddress}:${remotePort}`) } socket.on('close', () => { if (!isInitiator) { console.error(`connection closed from ${remoteAddress}:${remotePort}`) } else { console.error('connection closed from server') } }) hypercore.on('append', _ => { console.log(`${mode} got append, new length ${hypercore.length} and byte length ${hypercore.byteLength}, replaying:`) console.log(""); console.log("### Results (Press Ctrl-C to exit)"); console.log(""); console.log("Replication succeeded if you see '0: hi', '1: ola', '2: hello' and '3: mundo' (not necessarily in that order)") console.log(""); for (let i = 0; i < hypercore.length; i++) { hypercore.get(i).then(value => { console.log(`${i}: ${value}`); }); } }) socket.pipe(hypercore.replicate(isInitiator)).pipe(socket) } function exit (msg) { console.error(msg) process.exit(1) }