mirror of
https://github.com/amark/gun.git
synced 2025-06-04 21:26:43 +00:00
commit
b2db5f6b43
387
axe.js
387
axe.js
@ -32,198 +32,209 @@
|
||||
|
||||
var AXE = USE('./root'), Gun = (AXE.window||{}).Gun || USE('./gun', 1);
|
||||
(Gun.AXE = AXE).GUN = AXE.Gun = Gun;
|
||||
|
||||
Gun.on('opt', function(at){
|
||||
if(!at.axe){
|
||||
var axe = at.axe = {}, tmp;
|
||||
var opt = at.opt, peers = opt.peers;
|
||||
// 1. If any remembered peers or from last cache or extension
|
||||
// 2. Fallback to use hard coded peers from dApp
|
||||
// 3. Or any offered peers.
|
||||
//if(Gun.obj.empty(p)){
|
||||
// Gun.obj.map(['http://localhost:8765/gun'/*, 'https://guntest.herokuapp.com/gun'*/], function(url){
|
||||
// p[url] = {url: url, axe: {}};
|
||||
// });
|
||||
//}
|
||||
// Our current hypothesis is that it is most optimal
|
||||
// to take peers in a common network, and align
|
||||
// them in a line, where you only have left and right
|
||||
// peers, so messages propagate left and right in
|
||||
// a linear manner with reduced overlap, and
|
||||
// with one common superpeer (with ready failovers)
|
||||
// in case the p2p linear latency is high.
|
||||
// Or there could be plenty of other better options.
|
||||
var mesh = opt.mesh = opt.mesh || Gun.Mesh(at);
|
||||
console.log("AXE enabled.");
|
||||
|
||||
function verify(dht, msg) {
|
||||
var puts = Object.keys(msg.put);
|
||||
var soul = puts[0]; /// TODO: verify all souls in puts. Copy the msg only with subscribed souls?
|
||||
var subs = dht(soul);
|
||||
// console.log('[AXE] VERIFY soul: %s, subs: %s, Peers: %s, msg: ', soul, subs, Object.keys(peers), msg);
|
||||
if (!subs) { return; }
|
||||
var tmp = [];
|
||||
Gun.obj.map(subs.split(','), function(pid) {
|
||||
if (pid in peers) {
|
||||
tmp.push(pid);
|
||||
// console.log('[AXE] SEND TO >>>>> ', pid, msg.put.bob || msg.put);
|
||||
mesh.say(msg, peers[pid]);
|
||||
}
|
||||
});
|
||||
/// Only connected peers in the tmp array.
|
||||
if (opt.super) {
|
||||
dht(soul, tmp.join(','));
|
||||
}
|
||||
}
|
||||
|
||||
var Rad = (Gun.window||{}).Radix || USE('./lib/radix', 1);
|
||||
at.opt.dht = Rad();
|
||||
at.on('in', input/*USE('./lib/super', 1)*/, at);
|
||||
// at.on('out', function(msg, a) {
|
||||
// this.to.next(msg);
|
||||
// console.log('[AXE] out:', msg, a);
|
||||
// }, at);
|
||||
|
||||
|
||||
function input(msg){
|
||||
var to = this.to, peer = (msg._||{}).via;
|
||||
var dht = opt.dht;
|
||||
var routes = axe.routes || (axe.routes = {}); // USE RAD INSTEAD! TMP TESTING!
|
||||
var get = msg.get, hash, tmp;
|
||||
if(get && opt.super && peer){
|
||||
hash = Gun.obj.hash(get); // USE RAD INSTEAD!
|
||||
(routes[hash] || (routes[hash] = {}))[peer.id] = peer;
|
||||
(peer.routes || (peer.routes = {}))[hash] = routes[hash];
|
||||
|
||||
|
||||
/*if(soul = get['#']){ // SWITCH BACK TO USING DHT!
|
||||
if(key = get['.']){
|
||||
|
||||
} else {
|
||||
|
||||
}
|
||||
if (!peer.id) {console.log('[*** WARN] no peer.id %s', soul);}
|
||||
var pids = joindht(dht, soul, peer.id);
|
||||
if (pids) {
|
||||
var dht = {};
|
||||
dht[soul] = pids;
|
||||
mesh.say({dht:dht}, opt.peers[peer.id]);
|
||||
}
|
||||
}*/
|
||||
}
|
||||
if((tmp = msg['@']) && (tmp = at.dup.s[tmp]) && (tmp = tmp.it)){
|
||||
(tmp = (tmp._||ok)).ack = (tmp.ack || 0) + 1;
|
||||
}
|
||||
to.next(msg);
|
||||
|
||||
if (opt.rtc && msg.dht) {
|
||||
Gun.obj.map(msg.dht, function(pids, soul) {
|
||||
dht(soul, pids);
|
||||
Gun.obj.map(pids.split(','), function(pid) {
|
||||
/// TODO: here we can put an algorithm of who must connect?
|
||||
if (!pid || pid in opt.peers || pid === opt.pid || opt.announce[pid]) { return; }
|
||||
opt.announce[pid] = true; /// To try only one connection to the same peer.
|
||||
opt.announce(pid);
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if(at.opt.super){
|
||||
var rotate = 0;
|
||||
mesh.way = function(msg) {
|
||||
if (msg.rtc) {
|
||||
// console.log('[AXE] MSG WEBRTC: ', msg.rtc);
|
||||
if (msg.rtc.to) {
|
||||
/// Send announce to one peer only if the msg have 'to' attr
|
||||
var peer = (peers) ? peers[msg.rtc.to] : null;
|
||||
if (peer) { mesh.say(msg, peer); }
|
||||
return;
|
||||
}
|
||||
}
|
||||
if(msg.get){
|
||||
var hash = Gun.obj.hash(msg.get);
|
||||
var routes = axe.routes || (axe.routes = {}); // USE RAD INSTEAD! TMP TESTING!
|
||||
var peers = routes[hash];
|
||||
function chat(peers, old){ // what about optimizing for directed peers?
|
||||
if(!peers){ return chat(opt.peers) }
|
||||
var ids = Object.keys(peers); // TODO: BUG! THIS IS BAD PERFORMANCE!!!!
|
||||
var meta = (msg._||yes);
|
||||
clearTimeout(meta.lack);
|
||||
var id, peer, c = 1; // opt. ?redundancy?
|
||||
while((id = ids[meta.turn || 0]) && c--){ // TODO: This hits peers in order, not necessarily best for load balancing. And what about optimizing for directed peers?
|
||||
peer = peers[id];
|
||||
meta.turn = (meta.turn || 0) + 1;
|
||||
if((old && old[id]) || false === mesh.say(msg, peer)){ ++c }
|
||||
}
|
||||
//console.log("AXE:", Gun.obj.copy(msg), meta.turn, c, ids, opt.peers === peers);
|
||||
if(0 < c){
|
||||
if(peers === opt.peers){ return } // prevent infinite lack loop.
|
||||
return meta.turn = 0, chat(opt.peers, peers)
|
||||
}
|
||||
var hash = msg['##'], ack = meta.ack;
|
||||
meta.lack = setTimeout(function(){
|
||||
if(ack && hash && hash === msg['##']){ return }
|
||||
if(meta.turn >= (axe.turns || 3)){ return } // variable for later! Also consider ACK based turn limit.
|
||||
//console.log(msg['#'], "CONTINUE:", ack, hash, msg['##']);
|
||||
chat(peers, old); // keep asking for data if there is mismatching hashes.
|
||||
}, 25);
|
||||
}
|
||||
return chat(peers);
|
||||
}
|
||||
// TODO: PUTs need to only go to subs!
|
||||
mesh.say(msg, opt.peers); return; // TODO: DISABLE THIS!!! USE DHT!
|
||||
|
||||
|
||||
if (!msg.put) { mesh.say(msg); return; }
|
||||
//console.log('AXE HOOK!! ', msg);
|
||||
verify(opt.dht, msg);
|
||||
};
|
||||
} else {
|
||||
mesh.route = function(msg) {
|
||||
if (msg.rtc) {
|
||||
// console.log('[AXE] MSG WEBRTC: ', msg.rtc);
|
||||
}
|
||||
if (!msg.put) { mesh.say(msg); return; }
|
||||
verify(opt.dht, msg);
|
||||
/// Always send to superpeers?
|
||||
Gun.obj.map(peers, function(peer) {
|
||||
if (peer.url) {
|
||||
// console.log('SEND TO SUPERPEER', msg);
|
||||
mesh.say(msg, peer);
|
||||
}
|
||||
});
|
||||
};
|
||||
/*var connections = 0; // THIS HAS BEEN MOVED TO CORE NOW!
|
||||
at.on('hi', function(opt) {
|
||||
this.to.next(opt);
|
||||
//console.log('AXE PEER [HI]', new Date(), opt);
|
||||
connections++;
|
||||
/// The first connection don't need to resubscribe the nodes.
|
||||
if (connections === 1) { return; }
|
||||
/// Resubscribe all nodes.
|
||||
setTimeout(function() {
|
||||
var souls = Object.keys(at.graph);
|
||||
for (var i=0; i < souls.length; ++i) {
|
||||
//at.gun.get(souls[i]).off();
|
||||
at.next[souls[i]].ack = 0;
|
||||
at.gun.get(souls[i]).once(function(){});
|
||||
}
|
||||
//location.reload();
|
||||
}, 500);
|
||||
}, at);*/
|
||||
}
|
||||
at.on('bye', function(peer){ this.to.next(peer);
|
||||
Gun.obj.map(peer.routes, function(route, hash){
|
||||
delete route[peer.id];
|
||||
if(Gun.obj.empty(route)){
|
||||
delete axe.routes[hash];
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
start(at);
|
||||
this.to.next(at); // make sure to call the "next" middleware adapter.
|
||||
});
|
||||
|
||||
function start(at){
|
||||
if(at.axe){ return }
|
||||
var opt = at.opt, peers = opt.peers;
|
||||
if(false === opt.axe){ return }
|
||||
if(false === process.env.NO_AXE){ return }
|
||||
var axe = at.axe = {}, tmp;
|
||||
// 1. If any remembered peers or from last cache or extension
|
||||
// 2. Fallback to use hard coded peers from dApp
|
||||
// 3. Or any offered peers.
|
||||
//if(Gun.obj.empty(p)){
|
||||
// Gun.obj.map(['http://localhost:8765/gun'/*, 'https://guntest.herokuapp.com/gun'*/], function(url){
|
||||
// p[url] = {url: url, axe: {}};
|
||||
// });
|
||||
//}
|
||||
// Our current hypothesis is that it is most optimal
|
||||
// to take peers in a common network, and align
|
||||
// them in a line, where you only have left and right
|
||||
// peers, so messages propagate left and right in
|
||||
// a linear manner with reduced overlap, and
|
||||
// with one common superpeer (with ready failovers)
|
||||
// in case the p2p linear latency is high.
|
||||
// Or there could be plenty of other better options.
|
||||
var mesh = opt.mesh = opt.mesh || Gun.Mesh(at);
|
||||
console.log("AXE enabled.");
|
||||
|
||||
function verify(dht, msg) {
|
||||
var puts = Object.keys(msg.put);
|
||||
var soul = puts[0]; /// TODO: verify all souls in puts. Copy the msg only with subscribed souls?
|
||||
var subs = dht(soul);
|
||||
if (!subs) { return; }
|
||||
var tmp = [];
|
||||
Gun.obj.map(subs.split(','), function(pid) {
|
||||
if (pid in peers) {
|
||||
tmp.push(pid);
|
||||
mesh.say(msg, peers[pid]);
|
||||
}
|
||||
});
|
||||
/// Only connected peers in the tmp array.
|
||||
if (opt.super) {
|
||||
dht(soul, tmp.join(','));
|
||||
}
|
||||
}
|
||||
function route(get){ var tmp;
|
||||
if(!get){ return }
|
||||
if('string' != typeof (tmp = get['#'])){ return }
|
||||
return tmp;
|
||||
}
|
||||
|
||||
var Rad = (Gun.window||{}).Radix || USE('./lib/radix', 1);
|
||||
at.opt.dht = Rad();
|
||||
at.on('in', function input(msg){
|
||||
var to = this.to, peer = (msg._||{}).via;
|
||||
var dht = opt.dht;
|
||||
var routes = axe.routes || (axe.routes = {}); // USE RAD INSTEAD! TMP TESTING!
|
||||
var get = msg.get, hash, tmp;
|
||||
//if(get && opt.super && peer){
|
||||
if(get && opt.super && peer && (tmp = route(get))){
|
||||
hash = tmp; //Gun.obj.hash(get); // USE RAD INSTEAD!
|
||||
(routes[hash] || (routes[hash] = {}))[peer.id] = peer;
|
||||
(peer.routes || (peer.routes = {}))[hash] = routes[hash];
|
||||
|
||||
/*if(soul = get['#']){ // SWITCH BACK TO USING DHT!
|
||||
if(key = get['.']){
|
||||
|
||||
} else {
|
||||
|
||||
}
|
||||
if (!peer.id) {console.log('[*** WARN] no peer.id %s', soul);}
|
||||
var pids = joindht(dht, soul, peer.id);
|
||||
if (pids) {
|
||||
var dht = {};
|
||||
dht[soul] = pids;
|
||||
mesh.say({dht:dht}, opt.peers[peer.id]);
|
||||
}
|
||||
}*/
|
||||
}
|
||||
if((tmp = msg['@']) && (tmp = at.dup.s[tmp]) && (tmp = tmp.it)){
|
||||
(tmp = (tmp._||ok)).ack = (tmp.ack || 0) + 1; // count remote ACKs to GET.
|
||||
}
|
||||
to.next(msg);
|
||||
|
||||
if (opt.rtc && msg.dht) {
|
||||
Gun.obj.map(msg.dht, function(pids, soul) {
|
||||
dht(soul, pids);
|
||||
Gun.obj.map(pids.split(','), function(pid) {
|
||||
/// TODO: here we can put an algorithm of who must connect?
|
||||
if (!pid || pid in opt.peers || pid === opt.pid || opt.announce[pid]) { return; }
|
||||
opt.announce[pid] = true; /// To try only one connection to the same peer.
|
||||
opt.announce(pid);
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
if(at.opt.super){
|
||||
var rotate = 0;
|
||||
mesh.way = function(msg) {
|
||||
if (msg.rtc) {
|
||||
if (msg.rtc.to) {
|
||||
/// Send announce to one peer only if the msg have 'to' attr
|
||||
var peer = (peers) ? peers[msg.rtc.to] : null;
|
||||
if (peer) { mesh.say(msg, peer); }
|
||||
return;
|
||||
}
|
||||
}
|
||||
if(msg.get && (tmp = route(msg.get))){
|
||||
var hash = tmp; //Gun.obj.hash(msg.get);
|
||||
var routes = axe.routes || (axe.routes = {}); // USE RAD INSTEAD! TMP TESTING!
|
||||
var peers = routes[hash];
|
||||
function chat(peers, old){ // what about optimizing for directed peers?
|
||||
if(!peers){ return chat(opt.peers) }
|
||||
var ids = Object.keys(peers); // TODO: BUG! THIS IS BAD PERFORMANCE!!!!
|
||||
var meta = (msg._||yes);
|
||||
clearTimeout(meta.lack);
|
||||
var id, peer, c = 1; // opt. ?redundancy?
|
||||
while((id = ids[meta.turn || 0]) && c--){ // TODO: This hits peers in order, not necessarily best for load balancing. And what about optimizing for directed peers?
|
||||
peer = peers[id];
|
||||
meta.turn = (meta.turn || 0) + 1;
|
||||
if((old && old[id]) || false === mesh.say(msg, peer)){ ++c }
|
||||
}
|
||||
//console.log("AXE:", Gun.obj.copy(msg), meta.turn, c, ids, opt.peers === peers);
|
||||
if(0 < c){
|
||||
if(peers === opt.peers){ return } // prevent infinite lack loop.
|
||||
return meta.turn = 0, chat(opt.peers, peers)
|
||||
}
|
||||
var hash = msg['##'], ack = meta.ack;
|
||||
meta.lack = setTimeout(function(){
|
||||
if(ack && hash && hash === msg['##']){ return }
|
||||
if(meta.turn >= (axe.turns || 3)){ return } // variable for later! Also consider ACK based turn limit.
|
||||
//console.log(msg['#'], "CONTINUE:", ack, hash, msg['##']);
|
||||
chat(peers, old); // keep asking for data if there is mismatching hashes.
|
||||
}, 25);
|
||||
}
|
||||
return chat(peers);
|
||||
}
|
||||
// TODO: PUTs need to only go to subs!
|
||||
if(msg.put){
|
||||
var routes = axe.routes || (axe.routes = {}); // USE RAD INSTEAD! TMP TESTING!
|
||||
var peers = {};
|
||||
Gun.obj.map(msg.put, function(node, soul){
|
||||
var hash = soul; //Gun.obj.hash({'#': soul});
|
||||
var to = routes[hash];
|
||||
if(!to){ return }
|
||||
Gun.obj.to(to, peers);
|
||||
});
|
||||
mesh.say(msg, peers);
|
||||
return;
|
||||
}
|
||||
mesh.say(msg, opt.peers); return; // TODO: DISABLE THIS!!! USE DHT!
|
||||
|
||||
|
||||
if (!msg.put) { mesh.say(msg); return; }
|
||||
//console.log('AXE HOOK!! ', msg);
|
||||
verify(opt.dht, msg);
|
||||
};
|
||||
} else {
|
||||
mesh.route = function(msg) {
|
||||
if (msg.rtc) {
|
||||
}
|
||||
if (!msg.put) { mesh.say(msg); return; }
|
||||
verify(opt.dht, msg);
|
||||
/// Always send to superpeers?
|
||||
Gun.obj.map(peers, function(peer) {
|
||||
if (peer.url) {
|
||||
mesh.say(msg, peer);
|
||||
}
|
||||
});
|
||||
};
|
||||
/*var connections = 0; // THIS HAS BEEN MOVED TO CORE NOW!
|
||||
at.on('hi', function(opt) {
|
||||
this.to.next(opt);
|
||||
//console.log('AXE PEER [HI]', new Date(), opt);
|
||||
connections++;
|
||||
/// The first connection don't need to resubscribe the nodes.
|
||||
if (connections === 1) { return; }
|
||||
/// Resubscribe all nodes.
|
||||
setTimeout(function() {
|
||||
var souls = Object.keys(at.graph);
|
||||
for (var i=0; i < souls.length; ++i) {
|
||||
//at.gun.get(souls[i]).off();
|
||||
at.next[souls[i]].ack = 0;
|
||||
at.gun.get(souls[i]).once(function(){});
|
||||
}
|
||||
//location.reload();
|
||||
}, 500);
|
||||
}, at);*/
|
||||
}
|
||||
at.on('bye', function(peer){ this.to.next(peer);
|
||||
Gun.obj.map(peer.routes, function(route, hash){
|
||||
delete route[peer.id];
|
||||
if(Gun.obj.empty(route)){
|
||||
delete axe.routes[hash];
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function joindht(dht, soul, pids) {
|
||||
if (!pids || !soul || !dht) { return; }
|
||||
var subs = dht(soul);
|
||||
|
@ -39,6 +39,12 @@
|
||||
<div class="unit col leak ct-damd ct-chart tall" style="width: 49%;"></div>
|
||||
</div>
|
||||
|
||||
<div class="center leak" style="padding: 0 2em;">
|
||||
<div class="unit col leak ct-radc ct-chart tall" style="width: 49%;"></div>
|
||||
<div class="unit col leak ct-radt ct-chart tall" style="width: 49%;"></div>
|
||||
</div>
|
||||
<div class="center"><span id="rerr"></span></div>
|
||||
|
||||
<div class="center leak" style="padding: 0 2em;">
|
||||
<div class="leak ct-cpu ct-chart ct-perfect-fourth tall"></div>
|
||||
</div>
|
||||
@ -47,7 +53,7 @@
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/chartist.js/latest/chartist.min.css">
|
||||
<script src="https://cdn.jsdelivr.net/chartist.js/latest/chartist.min.js"></script>
|
||||
<script>
|
||||
var stats = {slide: [0,0,0,0,0], din: [0,0,0,0,0], dout: [0,0,0,0,0], dind: [0,0,0,0,0], doutd: [0,0,0,0,0]};
|
||||
var stats = {slide: [0,0,0,0,0], din: [0,0,0,0,0], dout: [0,0,0,0,0], dind: [0,0,0,0,0], doutd: [0,0,0,0,0], rgetc: [0,0,0,0,0], rputc: [0,0,0,0,0]};
|
||||
setInterval(function(){
|
||||
stats.show();
|
||||
}, 1000 * 15);
|
||||
@ -94,6 +100,34 @@ stats.show = function(){ $.getJSON(url.value||(location.origin+'/gun/stats.radat
|
||||
labelInterpolationFnc: function(v) { return v+'MB' }
|
||||
}});
|
||||
|
||||
try{ $('#rerr').text(data.rad.put.err || data.rad.get.err) }catch(e){}
|
||||
|
||||
try{
|
||||
stats.rgetc.push(data.rad.get.count); stats.rgetc = stats.rgetc.slice(1);
|
||||
stats.rputc.push(data.rad.put.count); stats.rputc = stats.rputc.slice(1);
|
||||
new Chartist.Line('.ct-radc', {
|
||||
// A labels array that can contain any sort of values
|
||||
labels: ['-1min', '-45s', '-30s', '-15s', '0'],
|
||||
// Our series array that contains series objects or in this case series data arrays
|
||||
series: [stats.rputc, stats.rgetc]
|
||||
}, {fullWidth: true, axisY: {
|
||||
labelInterpolationFnc: function(v) { return v+'io' }
|
||||
}});
|
||||
}catch(e){}
|
||||
|
||||
try{
|
||||
stats.radgt = Object.values(data.rad.get.time).map(function(n){ return n/1000 });
|
||||
stats.radpt = Object.values(data.rad.put.time).map(function(n){ return n/1000 });
|
||||
new Chartist.Line('.ct-radt', {
|
||||
// A labels array that can contain any sort of values
|
||||
//labels: ['-1min', '-45s', '-30s', '-15s', '0'],
|
||||
// Our series array that contains series objects or in this case series data arrays
|
||||
series: [stats.radpt, stats.radgt]
|
||||
}, {fullWidth: true, axisY: {
|
||||
labelInterpolationFnc: function(v) { return v+'sec' }
|
||||
}});
|
||||
}catch(e){}
|
||||
|
||||
new Chartist.Line('.ct-cpu', {
|
||||
// A labels array that can contain any sort of values
|
||||
labels: ['-15min', '-5min', '1min'],
|
||||
|
8
gun.js
8
gun.js
@ -2230,12 +2230,16 @@
|
||||
return wire;
|
||||
}catch(e){}}
|
||||
|
||||
var wait = 2 * 1000;
|
||||
function reconnect(peer){
|
||||
clearTimeout(peer.defer);
|
||||
peer.defer = setTimeout(function(){
|
||||
if(doc && peer.retry <= 0){ return } peer.retry = (peer.retry || opt.retry || 60) - 1;
|
||||
peer.defer = setTimeout(function to(){
|
||||
if(doc && doc.hidden){ return setTimeout(to,wait) }
|
||||
open(peer);
|
||||
}, 2 * 1000);
|
||||
}, wait);
|
||||
}
|
||||
var doc = 'undefined' !== typeof document && document;
|
||||
});
|
||||
var noop = function(){};
|
||||
})(USE, './adapters/websocket');
|
||||
|
@ -231,8 +231,9 @@ $(function(){
|
||||
});
|
||||
tmp += '}\n';
|
||||
});
|
||||
(node = document.createElement('style')).innerHTML = tmp;
|
||||
document.body.appendChild(node);
|
||||
var tag = document.createElement('style');
|
||||
tag.innerHTML = tmp;
|
||||
document.body.appendChild(tag);
|
||||
}
|
||||
}catch(e){}}());
|
||||
;(function(){
|
||||
|
@ -13,7 +13,7 @@
|
||||
require('./rs3');
|
||||
require('./wire');
|
||||
try{require('../sea');}catch(e){}
|
||||
//try{require('../axe');}catch(e){}
|
||||
try{require('../axe');}catch(e){}
|
||||
require('./file');
|
||||
require('./evict');
|
||||
require('./multicast');
|
||||
|
@ -40,9 +40,14 @@ Gun.on('opt', function(root){
|
||||
var dam = root.opt.mesh;
|
||||
if(dam){
|
||||
stats.dam = {'in': {count: dam.hear.c, done: dam.hear.d}, 'out': {count: dam.say.c, done: dam.say.d}};
|
||||
dam.hear.c = dam.hear.d = dam.say.c = dam.say.d = 0;
|
||||
dam.hear.c = dam.hear.d = dam.say.c = dam.say.d = 0; // reset
|
||||
stats.peers.time = dam.bye.time || 0;
|
||||
}
|
||||
var rad = root.opt.store; rad = rad && rad.stats;
|
||||
if(rad){
|
||||
stats.rad = rad;
|
||||
root.opt.store.stats = {get:{time:{}, count:0}, put: {time:{}, count:0}}; // reset
|
||||
}
|
||||
|
||||
fs.writeFile(__dirname+'/../stats.'+root.opt.file, JSON.stringify(stats, null, 2), function(err){});
|
||||
}, 1000 * 15);
|
||||
|
49
lib/store.js
49
lib/store.js
@ -15,6 +15,7 @@ Gun.on('create', function(root){
|
||||
this.to.next(msg);
|
||||
var id = msg['#'] || Gun.text.random(3), track = !msg['@'], acks = track? 0 : u; // only ack non-acks.
|
||||
if(msg.rad && !track){ return } // don't save our own acks
|
||||
var start = (+new Date); // STATS!
|
||||
Gun.graph.is(msg.put, null, function(val, key, node, soul){
|
||||
if(track){ ++acks }
|
||||
//console.log('put:', soul, key, val);
|
||||
@ -25,10 +26,14 @@ Gun.on('create', function(root){
|
||||
acks--;
|
||||
if(ack.err){ return }
|
||||
if(ack.err = err){
|
||||
try{opt.store.stats.put.err = err}catch(e){} // STATS!
|
||||
root.on('in', {'@': id, err: err});
|
||||
return;
|
||||
}
|
||||
if(acks){ return }
|
||||
try{opt.store.stats.put.time[statp % 50] = (+new Date) - start; ++statp;
|
||||
opt.store.stats.put.count++;
|
||||
}catch(e){} // STATS!
|
||||
//console.log("PAT!", id);
|
||||
root.on('in', {'@': id, ok: 1});
|
||||
}
|
||||
@ -36,39 +41,43 @@ Gun.on('create', function(root){
|
||||
|
||||
root.on('get', function(msg){
|
||||
this.to.next(msg);
|
||||
var id = msg['#'], get = msg.get, soul = msg.get['#'], has = msg.get['.']||'', opt = {}, graph, lex, key, tmp, force;
|
||||
var id = msg['#'], get = msg.get, soul = msg.get['#'], has = msg.get['.']||'', o = {}, graph, lex, key, tmp, force;
|
||||
if('string' == typeof soul){
|
||||
key = soul;
|
||||
} else
|
||||
if(soul){
|
||||
if(u !== (tmp = soul['*'])){ opt.limit = force = 1 }
|
||||
if(u !== soul['>']){ opt.start = soul['>'] }
|
||||
if(u !== soul['<']){ opt.end = soul['<'] }
|
||||
if(u !== (tmp = soul['*'])){ o.limit = force = 1 }
|
||||
if(u !== soul['>']){ o.start = soul['>'] }
|
||||
if(u !== soul['<']){ o.end = soul['<'] }
|
||||
key = force? (''+tmp) : tmp || soul['='];
|
||||
force = null;
|
||||
}
|
||||
if(key && !opt.limit){ // a soul.has must be on a soul, and not during soul*
|
||||
if(key && !o.limit){ // a soul.has must be on a soul, and not during soul*
|
||||
if('string' == typeof has){
|
||||
key = key+esc+(opt.atom = has);
|
||||
key = key+esc+(o.atom = has);
|
||||
} else
|
||||
if(has){
|
||||
if(u !== has['>']){ opt.start = has['>']; opt.limit = 1 }
|
||||
if(u !== has['<']){ opt.end = has['<']; opt.limit = 1 }
|
||||
if(u !== (tmp = has['*'])){ opt.limit = force = 1 }
|
||||
if(key){ key = key+esc + (force? (''+(tmp||'')) : tmp || (opt.atom = has['='] || '')) }
|
||||
if(u !== has['>']){ o.start = has['>']; o.limit = 1 }
|
||||
if(u !== has['<']){ o.end = has['<']; o.limit = 1 }
|
||||
if(u !== (tmp = has['*'])){ o.limit = force = 1 }
|
||||
if(key){ key = key+esc + (force? (''+(tmp||'')) : tmp || (o.atom = has['='] || '')) }
|
||||
}
|
||||
}
|
||||
if((tmp = get['%']) || opt.limit){
|
||||
opt.limit = (tmp <= (opt.pack || (1000 * 100)))? tmp : 1;
|
||||
if((tmp = get['%']) || o.limit){
|
||||
o.limit = (tmp <= (o.pack || (1000 * 100)))? tmp : 1;
|
||||
}
|
||||
if(has['-'] || (soul||{})['-']){ opt.reverse = true }
|
||||
//console.log("RAD get:", key, opt);
|
||||
//var start = (+new Date); // console.log("GET!", id, JSON.stringify(key));
|
||||
if(has['-'] || (soul||{})['-']){ o.reverse = true }
|
||||
//console.log("RAD get:", key, o);
|
||||
var start = (+new Date); // STATS! // console.log("GET!", id, JSON.stringify(key));
|
||||
rad(key||'', function(err, data, o){
|
||||
try{opt.store.stats.get.time[statg % 50] = (+new Date) - start; ++statg;
|
||||
opt.store.stats.get.count++;
|
||||
if(err){ opt.store.stats.get.err = err }
|
||||
}catch(e){} // STATS!
|
||||
//console.log("RAD gat:", err, data, o);
|
||||
if(data){
|
||||
if(typeof data !== 'string'){
|
||||
if(opt.atom){
|
||||
if(o.atom){
|
||||
data = u;
|
||||
} else {
|
||||
Radix.map(data, each)
|
||||
@ -78,18 +87,20 @@ Gun.on('create', function(root){
|
||||
}
|
||||
//console.log("GOT!", id, JSON.stringify(key), ((+new Date) - start));
|
||||
root.on('in', {'@': id, put: graph, err: err? err : u, rad: Radix});
|
||||
}, opt);
|
||||
}, o);
|
||||
function each(val, has, a,b){
|
||||
if(!val){ return }
|
||||
has = (key+has).split(esc);
|
||||
var soul = has.slice(0,1)[0];
|
||||
has = has.slice(-1)[0];
|
||||
opt.count = (opt.count || 0) + val.length;
|
||||
o.count = (o.count || 0) + val.length;
|
||||
tmp = val.lastIndexOf('>');
|
||||
var state = Radisk.decode(val.slice(tmp+1), null, esc);
|
||||
val = Radisk.decode(val.slice(0,tmp), null, esc);
|
||||
(graph = graph || {})[soul] = Gun.state.ify(graph[soul], has, state, val, soul);
|
||||
if(opt.limit && opt.limit <= opt.count){ return true }
|
||||
if(o.limit && o.limit <= o.count){ return true }
|
||||
}
|
||||
});
|
||||
opt.store.stats = {get:{time:{}, count:0}, put: {time:{}, count:0}}; // STATS!
|
||||
var statg = 0, statp = 0; // STATS!
|
||||
});
|
@ -78,6 +78,7 @@ Gun.on('opt', function(root){
|
||||
opt.mesh.bye(peer);
|
||||
});
|
||||
wire.on('error', function(e){});
|
||||
setTimeout(function heart(){ if(!opt.peers[peer.id]){ return } try{ wire.send("[]"); setTimeout(heart, 1000 * 20) }catch(e){} }, 1000 * 20); // Some systems, like Heroku, require heartbeats to not time out. // TODO: Make this configurable?
|
||||
});
|
||||
}
|
||||
|
||||
|
409
package-lock.json
generated
409
package-lock.json
generated
@ -1,31 +1,15 @@
|
||||
{
|
||||
"name": "gun",
|
||||
"version": "0.2019.416",
|
||||
"version": "0.2019.612",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
"accepts": {
|
||||
"version": "1.3.5",
|
||||
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
|
||||
"integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"mime-types": "~2.1.18",
|
||||
"negotiator": "0.6.1"
|
||||
}
|
||||
},
|
||||
"after": {
|
||||
"version": "0.8.2",
|
||||
"resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
|
||||
"integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=",
|
||||
"dev": true
|
||||
},
|
||||
"array-flatten": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
|
||||
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
|
||||
"dev": true
|
||||
},
|
||||
"arraybuffer.slice": {
|
||||
"version": "0.0.6",
|
||||
"resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz",
|
||||
@ -106,24 +90,6 @@
|
||||
"integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==",
|
||||
"dev": true
|
||||
},
|
||||
"body-parser": {
|
||||
"version": "1.18.2",
|
||||
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz",
|
||||
"integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"bytes": "3.0.0",
|
||||
"content-type": "~1.0.4",
|
||||
"debug": "2.6.9",
|
||||
"depd": "~1.1.1",
|
||||
"http-errors": "~1.6.2",
|
||||
"iconv-lite": "0.4.19",
|
||||
"on-finished": "~2.3.0",
|
||||
"qs": "6.5.1",
|
||||
"raw-body": "2.3.2",
|
||||
"type-is": "~1.6.15"
|
||||
}
|
||||
},
|
||||
"brace-expansion": {
|
||||
"version": "1.1.11",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||
@ -151,12 +117,6 @@
|
||||
"isarray": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"bytes": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
|
||||
"integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
|
||||
"dev": true
|
||||
},
|
||||
"callsite": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
|
||||
@ -193,69 +153,18 @@
|
||||
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
|
||||
"dev": true
|
||||
},
|
||||
"content-disposition": {
|
||||
"version": "0.5.2",
|
||||
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
|
||||
"integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=",
|
||||
"dev": true
|
||||
},
|
||||
"content-type": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
|
||||
"integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
|
||||
"dev": true
|
||||
},
|
||||
"cookie": {
|
||||
"version": "0.3.1",
|
||||
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
|
||||
"integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=",
|
||||
"dev": true
|
||||
},
|
||||
"cookie-signature": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
|
||||
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
|
||||
"dev": true
|
||||
},
|
||||
"debug": {
|
||||
"version": "2.6.9",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
||||
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ms": "2.0.0"
|
||||
}
|
||||
},
|
||||
"depd": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
|
||||
"integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
|
||||
"dev": true
|
||||
},
|
||||
"destroy": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
|
||||
"integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
|
||||
"dev": true
|
||||
},
|
||||
"diff": {
|
||||
"version": "3.5.0",
|
||||
"resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
|
||||
"integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
|
||||
"dev": true
|
||||
},
|
||||
"ee-first": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
|
||||
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
|
||||
"dev": true
|
||||
},
|
||||
"encodeurl": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
|
||||
"integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
|
||||
"dev": true
|
||||
},
|
||||
"engine.io": {
|
||||
"version": "1.8.5",
|
||||
"resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.5.tgz",
|
||||
@ -380,103 +289,18 @@
|
||||
"wtf-8": "1.0.0"
|
||||
}
|
||||
},
|
||||
"escape-html": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
|
||||
"integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
|
||||
"dev": true
|
||||
},
|
||||
"escape-string-regexp": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
|
||||
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
|
||||
"dev": true
|
||||
},
|
||||
"etag": {
|
||||
"version": "1.8.1",
|
||||
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
|
||||
"integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
|
||||
"dev": true
|
||||
},
|
||||
"events": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz",
|
||||
"integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=",
|
||||
"dev": true
|
||||
},
|
||||
"express": {
|
||||
"version": "4.16.3",
|
||||
"resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz",
|
||||
"integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"accepts": "~1.3.5",
|
||||
"array-flatten": "1.1.1",
|
||||
"body-parser": "1.18.2",
|
||||
"content-disposition": "0.5.2",
|
||||
"content-type": "~1.0.4",
|
||||
"cookie": "0.3.1",
|
||||
"cookie-signature": "1.0.6",
|
||||
"debug": "2.6.9",
|
||||
"depd": "~1.1.2",
|
||||
"encodeurl": "~1.0.2",
|
||||
"escape-html": "~1.0.3",
|
||||
"etag": "~1.8.1",
|
||||
"finalhandler": "1.1.1",
|
||||
"fresh": "0.5.2",
|
||||
"merge-descriptors": "1.0.1",
|
||||
"methods": "~1.1.2",
|
||||
"on-finished": "~2.3.0",
|
||||
"parseurl": "~1.3.2",
|
||||
"path-to-regexp": "0.1.7",
|
||||
"proxy-addr": "~2.0.3",
|
||||
"qs": "6.5.1",
|
||||
"range-parser": "~1.2.0",
|
||||
"safe-buffer": "5.1.1",
|
||||
"send": "0.16.2",
|
||||
"serve-static": "1.13.2",
|
||||
"setprototypeof": "1.1.0",
|
||||
"statuses": "~1.4.0",
|
||||
"type-is": "~1.6.16",
|
||||
"utils-merge": "1.0.1",
|
||||
"vary": "~1.1.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"safe-buffer": {
|
||||
"version": "5.1.1",
|
||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
|
||||
"integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"finalhandler": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
|
||||
"integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"debug": "2.6.9",
|
||||
"encodeurl": "~1.0.2",
|
||||
"escape-html": "~1.0.3",
|
||||
"on-finished": "~2.3.0",
|
||||
"parseurl": "~1.3.2",
|
||||
"statuses": "~1.4.0",
|
||||
"unpipe": "~1.0.0"
|
||||
}
|
||||
},
|
||||
"forwarded": {
|
||||
"version": "0.1.2",
|
||||
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
|
||||
"integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
|
||||
"dev": true
|
||||
},
|
||||
"fresh": {
|
||||
"version": "0.5.2",
|
||||
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
|
||||
"integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
|
||||
"dev": true
|
||||
},
|
||||
"fs.realpath": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
|
||||
@ -538,24 +362,6 @@
|
||||
"integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
|
||||
"dev": true
|
||||
},
|
||||
"http-errors": {
|
||||
"version": "1.6.3",
|
||||
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
|
||||
"integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"depd": "~1.1.2",
|
||||
"inherits": "2.0.3",
|
||||
"setprototypeof": "1.1.0",
|
||||
"statuses": ">= 1.4.0 < 2"
|
||||
}
|
||||
},
|
||||
"iconv-lite": {
|
||||
"version": "0.4.19",
|
||||
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
|
||||
"integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==",
|
||||
"dev": true
|
||||
},
|
||||
"ieee754": {
|
||||
"version": "1.1.8",
|
||||
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz",
|
||||
@ -590,12 +396,6 @@
|
||||
"integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
|
||||
"dev": true
|
||||
},
|
||||
"ipaddr.js": {
|
||||
"version": "1.6.0",
|
||||
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz",
|
||||
"integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=",
|
||||
"dev": true
|
||||
},
|
||||
"is-promise": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
|
||||
@ -626,30 +426,6 @@
|
||||
"integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
|
||||
"dev": true
|
||||
},
|
||||
"media-typer": {
|
||||
"version": "0.3.0",
|
||||
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
|
||||
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
|
||||
"dev": true
|
||||
},
|
||||
"merge-descriptors": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
|
||||
"integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
|
||||
"dev": true
|
||||
},
|
||||
"methods": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
|
||||
"integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
|
||||
"dev": true
|
||||
},
|
||||
"mime": {
|
||||
"version": "1.4.1",
|
||||
"resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
|
||||
"integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
|
||||
"dev": true
|
||||
},
|
||||
"mime-db": {
|
||||
"version": "1.33.0",
|
||||
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
|
||||
@ -724,9 +500,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"nan": {
|
||||
"version": "2.13.2",
|
||||
"resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz",
|
||||
"integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==",
|
||||
"version": "2.14.0",
|
||||
"resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz",
|
||||
"integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==",
|
||||
"optional": true
|
||||
},
|
||||
"negotiator": {
|
||||
@ -736,13 +512,13 @@
|
||||
"dev": true
|
||||
},
|
||||
"node-webcrypto-ossl": {
|
||||
"version": "1.0.43",
|
||||
"resolved": "https://registry.npmjs.org/node-webcrypto-ossl/-/node-webcrypto-ossl-1.0.43.tgz",
|
||||
"integrity": "sha512-AavMGbUB2MaTzli0+swjSAr4aLqf9M5jHIrs5VP9EUDXyEaIOyyio3H1z3pZCxKpaDD9coKWD3bWAiaIBuN8wg==",
|
||||
"version": "1.0.47",
|
||||
"resolved": "https://registry.npmjs.org/node-webcrypto-ossl/-/node-webcrypto-ossl-1.0.47.tgz",
|
||||
"integrity": "sha512-73q5ClXxhr7c1LE5dYajdnCVAPr0dhceX/qkATmJGQWyn7xTLgW9s727Bep/6JPqdnx5v7aBraPc+1c2nqjctw==",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"mkdirp": "^0.5.1",
|
||||
"nan": "^2.12.1",
|
||||
"nan": "^2.13.2",
|
||||
"tslib": "^1.9.3",
|
||||
"webcrypto-core": "^0.1.26"
|
||||
}
|
||||
@ -759,15 +535,6 @@
|
||||
"integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=",
|
||||
"dev": true
|
||||
},
|
||||
"on-finished": {
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
|
||||
"integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ee-first": "1.1.1"
|
||||
}
|
||||
},
|
||||
"once": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
|
||||
@ -853,147 +620,36 @@
|
||||
"better-assert": "~1.0.0"
|
||||
}
|
||||
},
|
||||
"parseurl": {
|
||||
"version": "1.3.2",
|
||||
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
|
||||
"integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=",
|
||||
"dev": true
|
||||
},
|
||||
"path-is-absolute": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
|
||||
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
|
||||
"dev": true
|
||||
},
|
||||
"path-to-regexp": {
|
||||
"version": "0.1.7",
|
||||
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
|
||||
"integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
|
||||
"dev": true
|
||||
},
|
||||
"platform": {
|
||||
"version": "1.3.1",
|
||||
"resolved": "https://registry.npmjs.org/platform/-/platform-1.3.1.tgz",
|
||||
"integrity": "sha1-SSIQiSM1vTExwKCN2i2T7DVD5CM=",
|
||||
"dev": true
|
||||
},
|
||||
"proxy-addr": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz",
|
||||
"integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"forwarded": "~0.1.2",
|
||||
"ipaddr.js": "1.6.0"
|
||||
}
|
||||
},
|
||||
"punycode": {
|
||||
"version": "1.3.2",
|
||||
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
|
||||
"integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
|
||||
"dev": true
|
||||
},
|
||||
"qs": {
|
||||
"version": "6.5.1",
|
||||
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
|
||||
"integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==",
|
||||
"dev": true
|
||||
},
|
||||
"querystring": {
|
||||
"version": "0.2.0",
|
||||
"resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
|
||||
"integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
|
||||
"dev": true
|
||||
},
|
||||
"range-parser": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
|
||||
"integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=",
|
||||
"dev": true
|
||||
},
|
||||
"raw-body": {
|
||||
"version": "2.3.2",
|
||||
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz",
|
||||
"integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"bytes": "3.0.0",
|
||||
"http-errors": "1.6.2",
|
||||
"iconv-lite": "0.4.19",
|
||||
"unpipe": "1.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"depd": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz",
|
||||
"integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=",
|
||||
"dev": true
|
||||
},
|
||||
"http-errors": {
|
||||
"version": "1.6.2",
|
||||
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz",
|
||||
"integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"depd": "1.1.1",
|
||||
"inherits": "2.0.3",
|
||||
"setprototypeof": "1.0.3",
|
||||
"statuses": ">= 1.3.1 < 2"
|
||||
}
|
||||
},
|
||||
"setprototypeof": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
|
||||
"integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"sax": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz",
|
||||
"integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=",
|
||||
"dev": true
|
||||
},
|
||||
"send": {
|
||||
"version": "0.16.2",
|
||||
"resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
|
||||
"integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"debug": "2.6.9",
|
||||
"depd": "~1.1.2",
|
||||
"destroy": "~1.0.4",
|
||||
"encodeurl": "~1.0.2",
|
||||
"escape-html": "~1.0.3",
|
||||
"etag": "~1.8.1",
|
||||
"fresh": "0.5.2",
|
||||
"http-errors": "~1.6.2",
|
||||
"mime": "1.4.1",
|
||||
"ms": "2.0.0",
|
||||
"on-finished": "~2.3.0",
|
||||
"range-parser": "~1.2.0",
|
||||
"statuses": "~1.4.0"
|
||||
}
|
||||
},
|
||||
"serve-static": {
|
||||
"version": "1.13.2",
|
||||
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
|
||||
"integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"encodeurl": "~1.0.2",
|
||||
"escape-html": "~1.0.3",
|
||||
"parseurl": "~1.3.2",
|
||||
"send": "0.16.2"
|
||||
}
|
||||
},
|
||||
"setprototypeof": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
|
||||
"integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
|
||||
"dev": true
|
||||
},
|
||||
"socket.io": {
|
||||
"version": "1.7.4",
|
||||
"resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.7.4.tgz",
|
||||
@ -1136,12 +792,6 @@
|
||||
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
|
||||
"dev": true
|
||||
},
|
||||
"statuses": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
|
||||
"integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
|
||||
"dev": true
|
||||
},
|
||||
"supports-color": {
|
||||
"version": "5.4.0",
|
||||
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
|
||||
@ -1164,19 +814,10 @@
|
||||
"dev": true
|
||||
},
|
||||
"tslib": {
|
||||
"version": "1.9.3",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
|
||||
"integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ=="
|
||||
},
|
||||
"type-is": {
|
||||
"version": "1.6.16",
|
||||
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
|
||||
"integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"media-typer": "0.3.0",
|
||||
"mime-types": "~2.1.18"
|
||||
}
|
||||
"version": "1.10.0",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
|
||||
"integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==",
|
||||
"optional": true
|
||||
},
|
||||
"uglify-js": {
|
||||
"version": "3.3.24",
|
||||
@ -1196,12 +837,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"unpipe": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
|
||||
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
|
||||
"dev": true
|
||||
},
|
||||
"url": {
|
||||
"version": "0.10.3",
|
||||
"resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz",
|
||||
@ -1212,24 +847,12 @@
|
||||
"querystring": "0.2.0"
|
||||
}
|
||||
},
|
||||
"utils-merge": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
|
||||
"integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
|
||||
"dev": true
|
||||
},
|
||||
"uuid": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz",
|
||||
"integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==",
|
||||
"dev": true
|
||||
},
|
||||
"vary": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
|
||||
"integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
|
||||
"dev": true
|
||||
},
|
||||
"webcrypto-core": {
|
||||
"version": "0.1.26",
|
||||
"resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-0.1.26.tgz",
|
||||
@ -1246,11 +869,11 @@
|
||||
"dev": true
|
||||
},
|
||||
"ws": {
|
||||
"version": "6.2.1",
|
||||
"resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz",
|
||||
"integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==",
|
||||
"version": "7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ws/-/ws-7.0.0.tgz",
|
||||
"integrity": "sha512-cknCal4k0EAOrh1SHHPPWWh4qm93g1IuGGGwBjWkXmCG7LsDtL8w9w+YVfaF+KSVwiHQKDIMsSLBVftKf9d1pg==",
|
||||
"requires": {
|
||||
"async-limiter": "~1.0.0"
|
||||
"async-limiter": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"wtf-8": {
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "gun",
|
||||
"version": "0.2019.515",
|
||||
"version": "0.2019.612",
|
||||
"description": "A realtime, decentralized, offline-first, graph data synchronization engine.",
|
||||
"main": "index.js",
|
||||
"browser": "gun.js",
|
||||
@ -51,16 +51,14 @@
|
||||
"node": ">=0.8.4"
|
||||
},
|
||||
"dependencies": {
|
||||
"ws": "~>6.2.1"
|
||||
"ws": "~>7.0.0"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"text-encoding": "^0.7.0",
|
||||
"node-webcrypto-ossl": "^1.0.43"
|
||||
"node-webcrypto-ossl": "^1.0.47"
|
||||
},
|
||||
"devDependencies": {
|
||||
"aws-sdk": ">=2.153.0",
|
||||
"concat-map": "^0.0.1",
|
||||
"express": ">=4.15.2",
|
||||
"ip": "^1.1.5",
|
||||
"mocha": "^5.2.0",
|
||||
"panic-manager": "^1.2.0",
|
||||
|
Loading…
x
Reference in New Issue
Block a user