Skip to content

Instantly share code, notes, and snippets.

@shimondoodkin
Created June 22, 2014 01:36
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 shimondoodkin/825eb6f4d84a224f4df5 to your computer and use it in GitHub Desktop.
Save shimondoodkin/825eb6f4d84a224f4df5 to your computer and use it in GitHub Desktop.
//For debug log, run: DEBUG=* node simulation/example_p2p.js
var T = require('../lib/telepathine.js').Telepathine;
var startPort = 9000;
var numSeeds = 4;
var options = {
gossipIntervalMS: 250,
heartBeatIntervalMS: 250
};
var seed = new T( startPort++,
[ /* no seeds */ ],
options
).start();
// Create peers and point them at the seed
// Usually this would happen in separate processes.
// To prevent a network's single point of failure, design with multiple seeds.
for (var i = 0; i < numSeeds; i++) {
var g = new T(i + startPort + 1,
['127.0.0.1:' + (startPort + i + 2)], options).start();
//event emitted when a remote peer sets a key to a value
g.on('set', function (peer, k, v) {
console.log('me '+g.peer_name + " get " + k + "=" + g.get(k),'peer=',peer,g.peers[peer]?g.getRemote(peer, k):'no peer');
//console.log('from peer '+peer + " get " + k + "=" + peer].get(k));
console.log(this.peer_name + " knows via on('set'.. that peer " + peer + " set " + k + "=" + v);
});
//convenience method for key/value change events
g.know('somekey', function (peer, v) {
console.log(this.peer_name + " knows via know('somekey'.. that peer " + peer + " set somekey=" + v);
});
//convenience method for key change events, using wildcard
g.know('*', function (peer, v) {
console.log(this.peer_name + " knows via know('*'.. that peer " + peer + " set " + this.event + "=" + v);
});
g.on('set', function (peer, k, v,expiresAt) {
//a.my_state.max_version_seen += 1;
//a.my_state.setKey(k, v, a.my_state.max_version_seen, expiresAt);
if(g.get(k)!=v)
{
g.my_state.updateLocal(k, v, expiresAt);
//a.my_state.max_version_seen += 1;
/*if(a.my_state.attrs[k])
{
a.my_state.attrs[k][0] =v;
a.my_state.attrs[k][0] =v;
}
else
*/
//a.my_state.attrs[k] = [v, a.my_state.max_version_seen, expiresAt];
}
console.log(this.peer_name + " knows via on('set'.. that peer " + peer + " set " + k + "=" + v);
});
}
// Another peer which updates state after a delay
var a=new T(startPort,
['127.0.0.1:' + (startPort + 1)], options )
.after(1000, function () {
// indefinite memory
this.set('somekey', 'somevalue');
// temporary memory: 10 seconds from now this key will start to expire in the gossip net
//this.set('somekey2', 'somevalue', Date.now() + 10000);
// var that = this;
//setInterval(function() {
/// that.set('x', Math.random());
//}, options.heartBeatIntervalMS * 2);
/*
this.on('peer:*', function(x) {
console.log(this.event, x);
});
*/
}).start();
a.on('set', function (peer, k, v,expiresAt) {
//a.my_state.max_version_seen += 1;
//a.my_state.setKey(k, v, a.my_state.max_version_seen, expiresAt);
if(a.get(k)!=v)
{
a.my_state.updateLocal(k, v, expiresAt);
//a.my_state.max_version_seen += 1;
/*if(a.my_state.attrs[k])
{
a.my_state.attrs[k][0] =v;
a.my_state.attrs[k][0] =v;
}
else
*/
//a.my_state.attrs[k] = [v, a.my_state.max_version_seen, expiresAt];
}
console.log(this.peer_name + " knows via on('set'.. that peer " + peer + " set " + k + "=" + v);
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment