plasmid
Version:
A low-level implementation of the anti-entropy gossip protocol scuttlebutt.
83 lines (68 loc) • 1.55 kB
JavaScript
Error.stackTraceLimit = Infinity;
var Host = require('./lib/').Host
var opts = { syncHistory: true, peerSelection: 'random', gossipRate: 30 }
var a = new Host('A', opts)
a.set('a', 'A')
var b = new Host('B', opts)
b.set('b', 'B')
var c = new Host('C', opts)
c.set('c', 'C')
var as = a.createStream({ end: false })
as.pipe(b.exchange())
.pipe(as)
var bs = b.createStream({ end: false })
bs.pipe(c.exchange())
.pipe(bs)
var cs = c.createStream({ end: false })
cs.pipe(a.exchange())
.pipe(cs)
function gossip() {
as.gossip()
bs.gossip()
cs.gossip()
}
repeat(gossip, 6, function() {
console.log(a.state.states)
console.log(b.state.states)
console.log(c.state.states)
})
// net.createServer(function (socket) {
//
// // digest -> deltas
// socket.pipe(b).pipe(socket)
// b.createDigestStream().pipe(socket).pipe(b)
//
// }).listen(8000, function () {
//
// var socket = net.connect(8000)
// // deltas -> update
// a.createDigestStream().pipe(socket).pipe(a)
//
// })
// var as = a.createStream()
// var bs = b.createStream()
// var cs = c.createStream()
//
// as.pipe(b.createStream()).pipe(as)
// bs.pipe(c.createStream()).pipe(bs)
// cs.pipe(a.createStream()).pipe(cs)
//
// setTimeout(function() {
// a.end()
// b.end()
// c.end()
//
// console.log(a.states)
// console.log(b.states)
// console.log(c.states)
// }, 7000)
function repeat(fn, times, callback) {
fn()
setImmediate(function() {
if (--times > 1) {
repeat(fn, times, callback)
} else {
callback()
}
})
}