mirror of
https://github.com/amark/gun.git
synced 2025-03-30 15:08:33 +00:00

* tmp for hn issue * log top to stats * test for guntest peer * try big messages * parse time? * what bin/node is 11ms? * be normal for hnoon * tolerate 0.5s * try 3s for hnoon? * stop empty gets * tmp for guntest * back to normal * check hash time * back to normal in hear * screen / upload / play / pause * merge latest npm release into manhattan * merge master 0.2020.421 into manhattan manually * WIP * manually merge from master * gatling * Update upload.html * work in progress... * yson panic chat basic * after `.put(` walk * restructure acks * messy but 2 units passing! * put recursive once on map * basics * have NTS use DAM + fix other utils * Rewrote nts * Allow passing test cli args. Before, no CLI args would be passed when running `npm test`. Keeping the `mocha` at the end of the test script allows passing CLI args to Mocha. * put back scan & once tweak * PANIC user paste OK * manhattan sea * stub out nts for now * AXE tweak * tweak for quick first prod testing * tweak for first in-prod testing * tweak * tweak * sketchy in-prod debug attempt * caught it? maybe? now restore * Create download-log.html * stub out yson test prod? * ugh, gotta see what is going on * move dl * gonna stop doing commit messages for in-prod test/tweaks/debugging * a * p * squelch * console stats * stats * stop travis * restore yson * ahhh no file access without sudo * mem * no stub * fix axe * bump * back to in-prod testing, isolate/stub out code * stub all out for 17K ? CPU ? test * stub dup gc * ugh main stub * does this stop url format blocking? * re-add dup * no top :( * will this work? * get ack stats? * a map chain may ask for data not a root soul chain * move proper logic into .get( * how 2019 compat? * a couple more! * more tests passing! :D :) * even more! SO EXCITING :D * Am I alive? * wow I can't believe it works like this * THANK YOU @rogowski !!!!!! * Create trace.html Adding tracing to debuging. * @rogowski is a super star :) :) :) * Update trace.js Change `Gun.logs` to `Gun.traces` and `Gun._log` to `Gun._trace`. * Update trace.html Change `Gun.logs` to `Gun.traces` and `Gun._log` to `Gun._trace`. Overload get,put,on,map * @rogowski approved of these trace changes :) * Update trace.html More decoupled. * Update trace.js More decoupled * 2 steps backwards, 1 step forward? * back where we ( @rogowski ) started :P * YAYAYAYAYAYAYAY past where we started at! * safer to have it here * slight tweak? Let's see how long it lasts. * merge checks we left out during consolidation * ugly common.js for @rogowski * slightly better * amazing map discovery + don't clear on not found if data exists * onto next test... * all caught up!!! Now update tests from graphify to statedisk * Update common.js Tests updated from graphify to statedisk. * easy to debug & fix thanks to @rogowski 's test upgrades & trace! * hmm, IDK if we should support this anymore? * support once chaining? * check if listener order is earlier than write * in-process message passing needs to clean itself of flags for now * ack to chains that can't be reached * call sub chains on clear/empty WIP * call sub chains clear/empty OK! * into unlink. Clean/refactor later. * oh that was nice * self check not needed? * test was poorly constructed? * refactor unlink to cleaner logic * Will you blame me for this? Special case, maybe later move to cleaner place? * use stun's run id instead. * cleaner unlink logic * better map, link, and unlink logic. * unstub relay * refactor unlink * invert * if prev value would have caused unlink, do not unlink again. * w000h00! Best unlink so far. * woops, fix unlinking nested * unsubscribe nested maps (working, tho possible perf regression? check) * put check soul * add default uuid * improved browser peer retry logic, let devices sleep, etc. * Chaining API unit tests passing! * merge new panic tests into here to test * add panic utils * fix long streaming timeout/expiry issue, update examples * yield generating test data * yeah, adapter errors (like out of storage) should not affect sync/networking logic, that was a bad experiment * git glitch? * some mid debugging fixes but maybe scary changes, hopefully safe to revert here except dub * SEA unit tests passing!!! Needed quite a few fixes on async write queue stuff. * optionally make auth async * revise/correct set * Fix reverse boundary check * Add extra tests, catch bad guy, obliterate bug. * chat app with emoji examples * handle empty string keyed objects * starting lex support * tweak for lex * woops! lexical alphabetical oopsies. That was bad. * upload either way * debug * start * fix * fix * clean + feature * update dependencies in package.json (#1086) * rad lex once map once * axe polyfill for now * oops log * oops maybe without this it crashed the peer * what on earth happened to my browser/OS? "unplug & plug it back in" restart seemed to fix it. * oh, don't memory leak req/res asks. :/ duh! * no accidental #soul."" * ugh, still have to sort :(, really should polyfill weakmap then * oops, pluck needs new object to go into * oops, make sure soul is passed * updating deprecated functions * begin AXE. Next: load balance! * Update sea.js * keys are dangerous! * AXE round robin load balance * better ash hash checking * lS reuse in-mem reply chunking * state machine!!! * RAD needs to pass cache misses. * updating deprecated functions (#1088) * update dependencies in package.json * updating deprecated functions * remove where.gundb.io * Bring SEA.certify into manhattan branch (#1092) Co-authored-by: Radu Cioienaru <radu@projectmanager.com> * fix rad, make get() hookable * rad browser tests seem to be passing! * reverse user random side, add err, update styles, + more * fix pack/max, update dom * paste! * of course it'll dedup cause it just called track on hear, fix * 📦 Adding the hub feature to this branch & improvements. (#1102) * 📦 Adding the hub feature to this branch. * 🗑 Removed the container for speed improvement ! * 📝 I added some comments to the code. Co-authored-by: Hector <fairfairytotor@gmail.com> Co-authored-by: Hector <pro.hector.kub@gmail.com> * Update axe.js * 🦅 Wrap everything in a try & catch for error handling… (#1105) * 🦅 Wrap everything in a try & catch for error handling & speed improvement. * 📦 Finally here : opt.file for the hub feature ! * 📦 Finally here : opt.file for the hub feature ! And also : fixed indentation 😋 Co-authored-by: noctisatrae <pro.hector.kub@gmail.com> * probs better this way, safer * moved test/axe tests to test/panic/axe. * New test: axe load balance. * axe test: webrtc data balance(fix paths and file renamed). * test axe: renaming webrtc file. * axe test: separating webrtc test for data_balance. * axe test: test only with the relay(without webrtc). * Update sea.js Same as https://github.com/amark/gun/pull/1062 * Update gun.js var tmp * Update upload.js * merge, update stun * SEA.certify wire logic + unit tests (#1110) * SEA.certify wire logic + unit tests * picking white hair * ack err * axe tests using puppeteer. * change stun system * ~20lines * put use parent soul link if need * handle errors * finally seems fixed * cb not to * relay * nasty bug! Don't crash, tho need to find what causes it * undo local changes/notes to self * deprecation warnings * "old" data to test against * oops, forgot I played with ascii * debug * in-prod check: sites * in-prod isolate * gotta find this, by stubbing out * where? * will this work? * clearly not, lol what's the point then? maybe like this * and again * must we? * USE THIS MANHATTAN VERSION * clean * better panic hints Co-authored-by: Robin Bron <finwo@pm.me> Co-authored-by: Pavel Diatchenko <diatche@users.noreply.github.com> Co-authored-by: rogowski <163828+rogowski@users.noreply.github.com> Co-authored-by: I001962 <i001962@gmail.com> Co-authored-by: Adriano Rogowski <rogowski.adriano@gmail.com> Co-authored-by: Radu <cetatuie@gmail.com> Co-authored-by: Radu Cioienaru <radu@projectmanager.com> Co-authored-by: Hector <46224745+noctisatrae@users.noreply.github.com> Co-authored-by: Hector <fairfairytotor@gmail.com> Co-authored-by: Hector <pro.hector.kub@gmail.com> Co-authored-by: Martti Malmi <sirius@iki.fi> Co-authored-by: mimiza <dev@mimiza.com>
148 lines
8.0 KiB
JavaScript
148 lines
8.0 KiB
JavaScript
var Gun = (typeof window !== "undefined")? window.Gun : require('../gun');
|
|
|
|
Gun.on('create', function(root){
|
|
if(Gun.TESTING){ root.opt.file = 'radatatest' }
|
|
this.to.next(root);
|
|
var opt = root.opt, empty = {}, u;
|
|
if(false === opt.rad || false === opt.radisk){ return }
|
|
var Radisk = (Gun.window && Gun.window.Radisk) || require('./radisk');
|
|
var Radix = Radisk.Radix;
|
|
var dare = Radisk(opt), esc = String.fromCharCode(27);
|
|
var ST = 0;
|
|
|
|
root.on('put', function(msg){
|
|
this.to.next(msg);
|
|
if((msg._||'').rad){ return } // don't save what just came from a read.
|
|
var id = msg['#'], put = msg.put, soul = put['#'], key = put['.'], val = put[':'], state = put['>'], tmp;
|
|
var DBG = (msg._||'').DBG; DBG && (DBG.sp = DBG.sp || +new Date);
|
|
//var lot = (msg._||'').lot||''; count[id] = (count[id] || 0) + 1;
|
|
var S = (msg._||'').RPS || ((msg._||'').RPS = +new Date);
|
|
//console.log("PUT ------->>>", soul,key, val, state);
|
|
//dare(soul+esc+key, {':': val, '>': state}, dare.one[id] || function(err, ok){
|
|
dare(soul+esc+key, {':': val, '>': state}, function(err, ok){
|
|
//console.log("<<<------- PAT", soul,key, val, state, 'in', +new Date - S);
|
|
DBG && (DBG.spd = DBG.spd || +new Date);
|
|
console.STAT && console.STAT(S, +new Date - S, 'put');
|
|
//if(!err && count[id] !== lot.s){ console.log(err = "Disk count not same as ram count."); console.STAT && console.STAT(+new Date, lot.s - count[id], 'put ack != count') } delete count[id];
|
|
if(err){ root.on('in', {'@': id, err: err, DBG: DBG}); return }
|
|
root.on('in', {'@': id, ok: ok, DBG: DBG});
|
|
//}, id, DBG && (DBG.r = DBG.r || {}));
|
|
}, false && id, DBG && (DBG.r = DBG.r || {}));
|
|
DBG && (DBG.sps = DBG.sps || +new Date);
|
|
});
|
|
var count = {}, obj_empty = Object.empty;
|
|
|
|
root.on('get', function(msg){
|
|
this.to.next(msg);
|
|
var ctx = msg._||'', DBG = ctx.DBG = msg.DBG; DBG && (DBG.sg = +new Date);
|
|
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['*'])){ 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 && !o.limit){ // a soul.has must be on a soul, and not during soul*
|
|
if('string' == typeof has){
|
|
key = key+esc+(o.atom = has);
|
|
} else
|
|
if(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['%']) || o.limit){
|
|
o.limit = (tmp <= (o.pack || (1000 * 100)))? tmp : 1;
|
|
}
|
|
if(has['-'] || (soul||{})['-'] || get['-']){ o.reverse = true }
|
|
if((tmp = (root.next||'')[soul]) && tmp.put){
|
|
if(o.atom){
|
|
tmp = (tmp.next||'')[o.atom] ;
|
|
if(tmp && tmp.rad){ return }
|
|
} else
|
|
if(tmp && tmp.rad){ return }
|
|
}
|
|
var now = Gun.state();
|
|
var S = (+new Date), C = 0, SPT = 0; // STATS!
|
|
DBG && (DBG.sgm = S);
|
|
//var GID = String.random(3); console.log("GET ------->>>", GID, key, o, '?', get);
|
|
dare(key||'', function(err, data, info){
|
|
//console.log("<<<------- GOT", GID, +new Date - S, err, data);
|
|
DBG && (DBG.sgr = +new Date);
|
|
DBG && (DBG.sgi = info);
|
|
try{opt.store.stats.get.time[statg % 50] = (+new Date) - S; ++statg;
|
|
opt.store.stats.get.count++;
|
|
if(err){ opt.store.stats.get.err = err }
|
|
}catch(e){} // STATS!
|
|
//if(u === data && info.chunks > 1){ return } // if we already sent a chunk, ignore ending empty responses. // this causes tests to fail.
|
|
console.STAT && console.STAT(S, +new Date - S, 'got', JSON.stringify(key)); S = +new Date;
|
|
info = info || '';
|
|
var va, ve;
|
|
if(info.unit && data && u !== (va = data[':']) && u !== (ve = data['>'])){ // new format
|
|
var tmp = key.split(esc), so = tmp[0], ha = tmp[1];
|
|
(graph = graph || {})[so] = Gun.state.ify(graph[so], ha, ve, va, so);
|
|
root.$.get(so).get(ha)._.rad = now;
|
|
// REMEMBER TO ADD _rad TO NODE/SOUL QUERY!
|
|
} else
|
|
if(data){ // old code path
|
|
if(typeof data !== 'string'){
|
|
if(o.atom){
|
|
data = u;
|
|
} else {
|
|
Radix.map(data, each, o); // IS A RADIX TREE, NOT FUNCTION!
|
|
}
|
|
}
|
|
if(!graph && data){ each(data, '') }
|
|
// TODO: !has what about soul lookups?
|
|
if(!o.atom && !has & 'string' == typeof soul && !o.limit && !o.more){
|
|
root.$.get(soul)._.rad = now;
|
|
}
|
|
}
|
|
DBG && (DBG.sgp = +new Date);
|
|
// TODO: PERF NOTES! This is like 0.2s, but for each ack, or all? Can you cache these preps?
|
|
// TODO: PERF NOTES! This is like 0.2s, but for each ack, or all? Can you cache these preps?
|
|
// TODO: PERF NOTES! This is like 0.2s, but for each ack, or all? Can you cache these preps?
|
|
// TODO: PERF NOTES! This is like 0.2s, but for each ack, or all? Can you cache these preps?
|
|
// TODO: PERF NOTES! This is like 0.2s, but for each ack, or all? Can you cache these preps?
|
|
// Or benchmark by reusing first start date.
|
|
if(console.STAT && (ST = +new Date - S) > 9){ console.STAT(S, ST, 'got prep time'); console.STAT(S, C, 'got prep #') } SPT += ST; C = 0; S = +new Date;
|
|
var faith = function(){}; faith.faith = true; faith.rad = get; // HNPERF: We're testing performance improvement by skipping going through security again, but this should be audited.
|
|
root.on('in', {'@': id, put: graph, '%': info.more? 1 : u, err: err? err : u, _: faith, DBG: DBG});
|
|
console.STAT && (ST = +new Date - S) > 9 && console.STAT(S, ST, 'got emit', Object.keys(graph||{}).length);
|
|
graph = u; // each is outside our scope, we have to reset graph to nothing!
|
|
}, o, DBG && (DBG.r = DBG.r || {}));
|
|
DBG && (DBG.sgd = +new Date);
|
|
console.STAT && (ST = +new Date - S) > 9 && console.STAT(S, ST, 'get call'); // TODO: Perf: this was half a second??????
|
|
function each(val, has, a,b){ // TODO: THIS CODE NEEDS TO BE FASTER!!!!
|
|
C++;
|
|
if(!val){ return }
|
|
has = (key+has).split(esc);
|
|
var soul = has.slice(0,1)[0];
|
|
has = has.slice(-1)[0];
|
|
if(o.limit && o.limit <= o.count){ return true }
|
|
var va, ve, so = soul, ha = has;
|
|
//if(u !== (va = val[':']) && u !== (ve = val['>'])){ // THIS HANDLES NEW CODE!
|
|
if('string' != typeof val){ // THIS HANDLES NEW CODE!
|
|
va = val[':']; ve = val['>'];
|
|
(graph = graph || {})[so] = Gun.state.ify(graph[so], ha, ve, va, so);
|
|
//root.$.get(so).get(ha)._.rad = now;
|
|
o.count = (o.count || 0) + ((va||'').length || 9);
|
|
return;
|
|
}
|
|
o.count = (o.count || 0) + val.length;
|
|
var 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);
|
|
}
|
|
});
|
|
var val_is = Gun.valid;
|
|
(opt.store||{}).stats = {get:{time:{}, count:0}, put: {time:{}, count:0}}; // STATS!
|
|
var statg = 0, statp = 0; // STATS!
|
|
}); |