From 2d72ebdfa20311dbd4b0319d576b058510fb38df Mon Sep 17 00:00:00 2001 From: Mark Nadal Date: Fri, 18 Sep 2020 04:53:55 -0700 Subject: [PATCH] put back scan & once tweak --- gun.js | 37 ++++++++++++++++++++++++++----------- lib/yson.js | 1 + test/sea/sea.js | 8 ++++---- 3 files changed, 31 insertions(+), 15 deletions(-) diff --git a/gun.js b/gun.js index 0de16b90..bd316389 100644 --- a/gun.js +++ b/gun.js @@ -624,7 +624,6 @@ }); } if((msg.seen||'')[cat.id]){ return } (msg.seen || (msg.seen = function(){}))[cat.id] = cat; - //if(cat.ask && key){ if(key){ if(cat.soul && cat.ask && state >= state_is(root.graph[soul], key)){ // faster than HAM @@ -929,6 +928,18 @@ function get(as){ var at = as.via._, tmp; + as.via = as.via.back(function(at){ + if(at.soul){ return at.$ } + tmp = as.data; (as.data = {})[at.get] = tmp; + }); + if(!as.via || !as.via._.soul){ + console.log("TODO: Error! Handle non-soul put backs"); + return; + } + as.via.put(as.data, as.ack, as); + + + return; if(at.get && at.back.soul){ tmp = as.data; as.via = at.back.$; @@ -969,19 +980,24 @@ opt.ok = tag; //opt.last = {}; //gun.get(ok, opt); // TODO: PERF! Event listener leak!!!? - ((cat.act||(cat.act={}))[id = tmp||String.random(7)] = function one(msg, eve){ + function one(msg, eve){ + if(one.stun){ return } var at = msg.$._, data = at.put, tmp; + if(opt.not===u && u === data){ return } if(opt.stun===u && (tmp = root.stun) && (tmp = tmp[at.id] || tmp[at.back.id])){ // Remember! If you port this into `.get(cb` make sure you allow stun:0 skip option for `.put(`. tmp[id] = function(){one(msg,eve)}; return; } // call: if(opt.as){ - opt.ok.call(opt.as, msg, eve); + opt.ok.call(opt.as, msg, eve || one); } else { - opt.ok.call(at.$, data, msg.get || at.get, msg, eve); + opt.ok.call(at.$, data, msg.get || at.get, msg, eve || one); } - }).at = cat; + }; + one.at = cat; + (cat.act||(cat.act={}))[id = tmp||String.random(7)] = one; + one.off = function(){ one.stun = 1; if(!cat.act){ return } delete cat.act[id] } cat.on('out', {get: {}}); return gun; } @@ -993,11 +1009,11 @@ var gun = this, cat = gun._, root = cat.root, data = cat.put, id, one, tmp; //(root.act[tmp = ++root.acts] = cat.act[tmp] = function(msg, eve, to){ ((cat.act||(cat.act={}))[id = tmp||String.random(7)] = function(msg, eve, to){ - if(!(tmp = msg.put)){ + /*if(!(tmp = msg.put)){ console.log('not found'); return; - } - if('string' == typeof Gun.valid(tmp = tmp['=']||tmp[':'])){ + }*/ + if((tmp = msg.put) && 'string' == typeof Gun.valid(tmp = tmp['=']||tmp[':'])){ // probably already getting it. return; } @@ -1009,7 +1025,7 @@ one[id] = ''; if(cat.soul || cat.has){ delete cat.act[id] } if(u === (tmp = ((msg.$||'')._||'').put)){ tmp = ((msg.$$||'')._||'').put } cb.call(at.$, tmp, msg.get || at.get); - } + }; }).at = cat; cat.on('out', {get: {}}); return gun; @@ -1082,7 +1098,6 @@ if(!put){ return } var soul = put['#'], k = put['.'], val = put['=']||put[':']; // TODO: lex match! - //console.log("let's go!!!!!!!!!!!!!!!!!", k, gun._.id, gun._.get); ((tmp = gun.get(k)._).echo || (tmp.echo = {}))[cat.id] = tmp.echo[cat.id] || cat; } var noop = function(){}, event = {stun: noop, off: noop}, u; @@ -1486,13 +1501,13 @@ data = Gun.state.ify({}, tmp, Gun.state.is(data, tmp), data[tmp], soul); } if(data){ (tmp = {})[soul] = data } // back into a graph. - console.log("lS got:", tmp); root.on('in', {'@': msg['#'], put: tmp, lS:1});// || root.$}); }); root.on('put', function(msg){ this.to.next(msg); // remember to call next middleware adapter var put = msg.put, soul = put['#'], key = put['.'], tmp; // pull data off wire envelope + //console.log('lS put:', key, put[':']); disk[soul] = Gun.state.ify(disk[soul], key, put['>'], put[':'], soul); // merge into disk object if(!msg['@']){ acks.push(msg['#']) } // then ack any non-ack write. // TODO: use batch id. if(to){ return } diff --git a/lib/yson.js b/lib/yson.js index 352f728b..9d24b383 100644 --- a/lib/yson.js +++ b/lib/yson.js @@ -4,6 +4,7 @@ var yson = {}, u, sI = setTimeout.turn || (typeof setImmediate != ''+u && setImmediate) || setTimeout; yson.parseAsync = function(text, done, revive, M){ + if('string' != typeof text){ try{ done(u,JSON.parse(text)) }catch(e){ done(e) } return } var ctx = {i: 0, text: text, done: done, l: text.length, up: []}; //M = 1024 * 1024 * 100; //M = M || 1024 * 64; diff --git a/test/sea/sea.js b/test/sea/sea.js index 0f5979bd..97c16e9d 100755 --- a/test/sea/sea.js +++ b/test/sea/sea.js @@ -27,6 +27,7 @@ var Gun; } }(this)); + ;(function(){ Gun = root.Gun var SEA = Gun.SEA @@ -72,13 +73,12 @@ describe('SEA', function(){ SEA.sign('asdf', alice, function(data){ SEA.verify(data, bob.pub, function(msg){ expect(msg).to.be(undefined); - SEA.verify(data+1, alice.pub, function(msg){ + SEA.verify(data.slice(0,20)+data.slice(21), alice.pub, function(msg){ expect(msg).to.be(undefined); - SEA.encrypt('secret', alice, function(enc){ SEA.decrypt(enc, bob, function(dec){ expect(dec).to.be(undefined); - SEA.decrypt(enc+1, alice, function(dec){ + SEA.decrypt(enc.slice(0,20)+enc.slice(21), alice, function(dec){ expect(dec).to.be(undefined); done(); });});});});});});});}); @@ -218,7 +218,7 @@ describe('SEA', function(){ var old = JSON.parse(atob("eyJfIjp7IiMiOiJ+VThkS0dySFJhX01sMFZ1YlR5OUZBYTlQS1ZlYlh0eTFjS05zWWxnYjduNC5QeVd5cUVVb0ZpYVduUElOV0Nad0xBbzFobjN1MldPWTU3SzZHZnpsNjhVIiwiPiI6eyJwdWIiOjE1NDY5MDI1MDQ5NzksImFsaWFzIjoxNTQ2OTAyNTA0OTc5LCJlcHViIjoxNTQ2OTAyNTA0OTc5LCJhdXRoIjoxNTQ2OTAyNTA0OTc5fX0sInB1YiI6IlU4ZEtHckhSYV9NbDBWdWJUeTlGQWE5UEtWZWJYdHkxY0tOc1lsZ2I3bjQuUHlXeXFFVW9GaWFXblBJTldDWndMQW8xaG4zdTJXT1k1N0s2R2Z6bDY4VSIsImFsaWFzIjoiU0VBe1wibVwiOltcIn5VOGRLR3JIUmFfTWwwVnViVHk5RkFhOVBLVmViWHR5MWNLTnNZbGdiN240LlB5V3lxRVVvRmlhV25QSU5XQ1p3TEFvMWhuM3UyV09ZNTdLNkdmemw2OFVcIixcImFsaWFzXCIsXCJhbGljZVwiLDE1NDY5MDI1MDQ5NzldLFwic1wiOlwienpuaGtIZjhZdFpZM2lGd3FVd0lJUldMTjhZMmlHbmNkcnVTaStGNDNmU1BLYWpSZlI0VzhXVHM4bElSMDBndGJmTWJxS0NjQkpGN3VNSkdGRC9WV2c9PVwifSIsImVwdWIiOiJTRUF7XCJtXCI6W1wiflU4ZEtHckhSYV9NbDBWdWJUeTlGQWE5UEtWZWJYdHkxY0tOc1lsZ2I3bjQuUHlXeXFFVW9GaWFXblBJTldDWndMQW8xaG4zdTJXT1k1N0s2R2Z6bDY4VVwiLFwiZXB1YlwiLFwiRkRzM1VvNTNFZEp6eFNocEpDaVctRGZPQ3lUS0M2U3cxeS1PZVJxam5ZRS5xVGdyYTlFQk1maEpNdVlMVmNaejRZYklLRm85enNBMHpMcV82dEVPMHI0XCIsMTU0NjkwMjUwNDk3OV0sXCJzXCI6XCJPZzRVVjY4OTluSjE4dC9ybWVnV0lkdnNqN01KaEpFc29ranZYQmdteVVRUXVNVjFTdnh4cXJqOFoyV1o2Q25XSkZnTlVDbEVYYWxuMURjUFE3M1R6UT09XCJ9IiwiYXV0aCI6IlNFQXtcIm1cIjpbXCJ+VThkS0dySFJhX01sMFZ1YlR5OUZBYTlQS1ZlYlh0eTFjS05zWWxnYjduNC5QeVd5cUVVb0ZpYVduUElOV0Nad0xBbzFobjN1MldPWTU3SzZHZnpsNjhVXCIsXCJhdXRoXCIsXCJ7XFxcImVrXFxcIjpcXFwiU0VBe1xcXFxcXFwiY3RcXFxcXFxcIjpcXFxcXFxcIi94ZnNPdVNkQUtrNkJiR00zbUV6MnVlSjI3Y0tJNThYMEtUL1FsaExSZXpWcjRkNzVZb2M5QlZNRjkzejl4QXI4N080S2FDNjJUWGVoeERQN0FFa2V4N1paaEpYL2hsVm9kK1FIcVFaaUZMK2lVQzFvL2hpUEJGWElBZmtINGRrcklGOFdqcEVaU3NIVmRSOVRhY2ZzbTB3aHN5NGJXN1ZLSEUySGc9PVxcXFxcXFwiLFxcXFxcXFwiaXZcXFxcXFxcIjpcXFxcXFxcIjhWekduTStEc1lTUktIU3Z4cSszTGc9PVxcXFxcXFwiLFxcXFxcXFwic1xcXFxcXFwiOlxcXFxcXFwibVVSSlJ4TzUvdXM9XFxcXFxcXCJ9XFxcIixcXFwic1xcXCI6XFxcImE1SlA3VFpuVE9jYjEwMGJOejlscEU4dnpqcUE3TWl0NHcwN3pjQTdIOFV0bml1WnVHSmdpZnNNQlFNSGdRdE5cXFwifVwiLDE1NDY5MDI1MDQ5NzldLFwic1wiOlwiSGFzMytJaHFEZTYyN016cElXZVE1cVFrZ2NOMlk3WHRpNGw0TFU3T2JyaktxSlBnSllrVWE2bk9YdlRmQkFzV1BPVzVnemh4Q2RPVGNFQm5icWlpWXc9PVwifSJ9")); var okey = {"pub":"U8dKGrHRa_Ml0VubTy9FAa9PKVebXty1cKNsYlgb7n4.PyWyqEUoFiaWnPINWCZwLAo1hn3u2WOY57K6Gfzl68U","epub":"FDs3Uo53EdJzxShpJCiW-DfOCyTKC6Sw1y-OeRqjnYE.qTgra9EBMfhJMuYLVcZz4YbIKFo9zsA0zLq_6tEO0r4","priv":"jMy7WfcldJ4esZEijAj4LTb99smtY_H0yKJLemJl2HI","epriv":"1DszMh-85pGTPLYtRunG-Q-xB78AE4k07PPkbedYYwk"} - var gun = Gun({super: true}), tmp = Gun.node.soul(old); + var gun = Gun({super: true}), tmp = old._['#'];//Gun.node.soul(old); var graph = {}; graph[tmp] = old; var alias = SEA.opt.unpack(await SEA.verify(old.alias, false), 'alias', old);