k-bucket-sync
Version:
Synchronous and efficient implementation of k-bucket from Kademlia DHT
7 lines • 1.99 kB
JavaScript
/*
0BSD
*/
(function(){function f(f){function h(a,b){if(!(this instanceof h))return new h(a,b);this.m=a;this.j=b;this.b=l();this.f=this.g()}var l=f.ArrayMap;var m=f.ArraySet;h.prototype={set:function(a,b,c){var e;null==b&&(b=null);null==c&&(c=null);var d=this.f;for(e=0;null===d.a;)d=this.c(e,a,d),e++;if(this.b.has(a))return d.a["delete"](a),d.a.add(a),this.b.set(a,b),!0;if(d.a.size<this.j)return d.a.add(a),this.b.set(a,b),!0;if(d.i)return this.o(e,d),this.set(a,b,c);"function"==typeof c&&c(Array.from(d.a));
return!1},get_all:function(){return this.h(this.f)},h:function(a){return a.a?Array.from(a.a):this.h(a.left).concat(this.h(a.right))},get_data:function(a){return this.b.get(a)||null},has:function(a){return this.b.has(a)},count:function(){return this.b.size},del:function(a){var b;if(this.b.has(a)){var c=this.f;for(b=0;null===c.a;)c=this.c(b,a,c),b++;c.a["delete"](a);this.b["delete"](a)}},closest:function(a,b){var c,e=this;null==b&&(b=Infinity);if(this.b.size<=b)var d=Array.from(this.b.keys());else{d=
[];var k=[this.f];for(c=0;0<k.length&&d.length<b;){var g=k.pop();if(null===g.a){var f=this.c(c,a,g);c++;f===g.left?k.push(g.right,g.left):k.push(g.left,g.right)}else d=d.concat(Array.from(g.a))}}return d.map(function(b){return[e.l(b,a),b]}).sort(function(a,b){return a[0]-b[0]}).slice(0,b).map(function(a){return a[1]})},g:function(){return{a:m(),i:!0,left:null,right:null}},l:function(a,b){var c,e;var d=c=0;for(e=a.length;d<e;++d){var f=d;c=256*c+(a[f]^b[f])}return c},c:function(a,b,c){return b[~~(a/
8)]&Math.pow(2,7-a%8)?c.right:c.left},o:function(a,b){var c=this;b.left=this.g();b.right=this.g();b.a.forEach(function(e){c.c(a,e,b).a.add(e)});b.a=null;this.c(a,this.m,b)===b.left?b.right.i=!1:b.left.i=!1}};Object.defineProperty(h.prototype,"constructor",{value:h});return h}"function"===typeof define&&define.amd?define(["array-map-set"],f):"object"===typeof exports?module.exports=f(require("array-map-set")):this.k_bucket_sync=f(this.array_map_set)}).call(this);