Socket
Socket
Sign inDemoInstall

k-bucket

Package Overview
Dependencies
Maintainers
1
Versions
34
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

k-bucket - npm Package Compare versions

Comparing version 0.4.1 to 0.4.2

41

index.js

@@ -33,9 +33,30 @@ /*

var assert = require('assert'),
bufferEqual = require('buffer-equal'),
constants = require('./lib/constants.js'),
crypto = require('crypto'),
events = require('events'),
util = require('util');
var assert = require('assert');
var bufferEqual = require('buffer-equal');
var crypto = require('crypto');
var events = require('events');
var util = require('util');
/*
* `options`:
* `arbiter`: _Function_ _(Default: vectorClock arbiter)_
`function (incumbent, candidate) { return contact; }` An optional
`arbiter` function that givent two `contact` objects with the same `id`
returns the desired object to be used for updating the k-bucket. For
more details, see [arbiter function](#arbiter-function).
* `localNodeId`: _String (base64)_ or _Buffer_ An optional String or a
Buffer representing the local node id. If not provided, a local node id
will be created via `crypto.randomBytes(20)`. If a String is provided,
it will be assumed to be base64 encoded and will be converted into a
Buffer.
* `numberOfNodesPerKBucket`: _Integer_ _(Default: 20)_ The number of nodes
that a k-bucket can contain before being full or split.
* `numberOfNodesToPing`: _Integer_ _(Default: 3)_ The number of nodes to
ping when a bucket that should not be split becomes full. KBucket will
emit a `ping` event that contains `numberOfNodesToPing` nodes that have
not been contacted the longest.
* `root`: _Object_ _**CAUTION: reserved for internal use**_ Provides a
reference to the root of the tree data structure as the k-bucket splits
when new contacts are added.
*/
var KBucket = module.exports = function KBucket (options) {

@@ -61,2 +82,4 @@ var self = this;

}
self.numberOfNodesPerKBucket = options.numberOfNodesPerKBucket || 20;
self.numberOfNodesToPing = options.numberOfNodesToPing || 3;
self.root = options.root || self;

@@ -113,3 +136,3 @@

if (self.bucket.length < constants.DEFAULT_NUMBER_OF_NODES_PER_K_BUCKET) {
if (self.bucket.length < self.numberOfNodesPerKBucket) {
self.bucket.push(contact);

@@ -122,3 +145,3 @@ return self;

// we are not allowed to split the bucket
// we need to ping the first constants.DEFAULT_NUMBER_OF_NODES_TO_PING
// we need to ping the first self.numberOfNodesToPing
// in order to determine if they are alive

@@ -128,3 +151,3 @@ // only if one of the pinged nodes does not respond, can the new contact

self.root.emit('ping',
self.bucket.slice(0, constants.DEFAULT_NUMBER_OF_NODES_TO_PING),
self.bucket.slice(0, self.numberOfNodesToPing),
contact);

@@ -131,0 +154,0 @@ return self;

{
"name": "k-bucket",
"version": "0.4.1",
"version": "0.4.2",
"description": "Kademlia DHT K-bucket implementation as a binary tree",

@@ -5,0 +5,0 @@ "scripts": {

@@ -128,2 +128,4 @@ # k-bucket

* `localNodeId`: _String (base64)_ or _Buffer_ An optional String or a Buffer representing the local node id. If not provided, a local node id will be created via `crypto.randomBytes(20)`. If a String is provided, it will be assumed to be base64 encoded and will be converted into a Buffer.
* `numberOfNodesPerKBucket`: _Integer_ _(Default: 20)_ The number of nodes that a k-bucket can contain before being full or split.
* `numberOfNodesToPing`: _Integer_ _(Default: 3)_ The number of nodes to ping when a bucket that should not be split becomes full. KBucket will emit a `ping` event that contains `numberOfNodesToPing` nodes that have not been contacted the longest.
* `root`: _Object_ _**CAUTION: reserved for internal use**_ Provides a reference to the root of the tree data structure as the k-bucket splits when new contacts are added.

@@ -130,0 +132,0 @@

"use strict";
var constants = require('../lib/constants.js'),
KBucket = require('../index.js');
var KBucket = require('../index.js');

@@ -47,8 +46,8 @@ var test = module.exports = {};

var i, iString, j;
test.expect(constants.DEFAULT_NUMBER_OF_NODES_TO_PING + 2);
test.expect(3 /*numberOfNodesToPing*/ + 2);
var kBucket = new KBucket({localNodeId: new Buffer('0000', 'hex')});
kBucket.on('ping', function (contacts, replacement) {
test.equal(contacts.length, constants.DEFAULT_NUMBER_OF_NODES_TO_PING);
test.equal(contacts.length, kBucket.numberOfNodesToPing);
// console.dir(kBucket.high.bucket[0]);
for (var i = 0; i < constants.DEFAULT_NUMBER_OF_NODES_TO_PING; i++) {
for (var i = 0; i < kBucket.numberOfNodesToPing; i++) {
// the least recently contacted end of the bucket should be pinged

@@ -60,3 +59,3 @@ test.equal(contacts[i], kBucket.high.bucket[i]);

});
for (var j = 0; j < constants.DEFAULT_NUMBER_OF_NODES_PER_K_BUCKET + 1; j++) {
for (var j = 0; j < kBucket.numberOfNodesPerKBucket + 1; j++) {
iString = j.toString('16');

@@ -63,0 +62,0 @@ if (iString.length < 2) {

"use strict";
var constants = require('../lib/constants.js'),
KBucket = require('../index.js');
var KBucket = require('../index.js');

@@ -70,3 +69,3 @@ var test = module.exports = {};

var kBucket = new KBucket({localNodeId: new Buffer('0000', 'hex')});
for (i = 0; i < constants.DEFAULT_NUMBER_OF_NODES_PER_K_BUCKET; i++) {
for (i = 0; i < kBucket.numberOfNodesPerKBucket; i++) {
iString = i.toString('16');

@@ -73,0 +72,0 @@ if (iString.length < 2) {

"use strict";
var constants = require('../lib/constants.js'),
KBucket = require('../index.js');
var KBucket = require('../index.js');

@@ -6,0 +5,0 @@ var test = module.exports = {};

"use strict";
var bufferEqual = require('buffer-equal'),
constants = require('../lib/constants.js'),
KBucket = require('../index.js');
var bufferEqual = require('buffer-equal');
var KBucket = require('../index.js');

@@ -42,3 +41,3 @@ var test = module.exports = {};

var kBucket = new KBucket({localNodeId: new Buffer('0000', 'hex')});
for (var i = 0; i < constants.DEFAULT_NUMBER_OF_NODES_PER_K_BUCKET; i++) {
for (var i = 0; i < kBucket.numberOfNodesPerKBucket; i++) {
iString = i.toString('16');

@@ -45,0 +44,0 @@ if (iString.length < 2) {

"use strict";
var constants = require('../lib/constants.js'),
KBucket = require('../index.js');
var KBucket = require('../index.js');

@@ -11,3 +10,3 @@ var test = module.exports = {};

var kBucket = new KBucket({localNodeId: new Buffer('0000', 'hex')});
for (var i = 0; i < constants.DEFAULT_NUMBER_OF_NODES_PER_K_BUCKET; i++) {
for (var i = 0; i < kBucket.numberOfNodesPerKBucket; i++) {
var iString = i.toString('16');

@@ -14,0 +13,0 @@ if (iString.length < 2) {

"use strict";
var constants = require('../lib/constants.js'),
KBucket = require('../index.js');
var KBucket = require('../index.js');

@@ -18,8 +17,7 @@ var test = module.exports = {};

test['adding maximum number of contacts (per K-bucket) [' +
constants.DEFAULT_NUMBER_OF_NODES_PER_K_BUCKET + ']' +
test['adding maximum number of contacts (per K-bucket) [20]' +
' into K-bucket does not split K-bucket'] = function (test) {
test.expect(3);
var kBucket = new KBucket();
for (var i = 0; i < constants.DEFAULT_NUMBER_OF_NODES_PER_K_BUCKET; i++) {
for (var i = 0; i < kBucket.numberOfNodesPerKBucket; i++) {
kBucket.add({id: new Buffer("" + i)});

@@ -33,8 +31,7 @@ }

test['adding maximum number of contacts (per K-bucket) + 1 [' +
(constants.DEFAULT_NUMBER_OF_NODES_PER_K_BUCKET + 1) + ']' +
test['adding maximum number of contacts (per K-bucket) + 1 [21]' +
' into K-bucket splits the K-bucket'] = function (test) {
test.expect(3);
var kBucket = new KBucket();
for (var i = 0; i < constants.DEFAULT_NUMBER_OF_NODES_PER_K_BUCKET + 1; i++) {
for (var i = 0; i < kBucket.numberOfNodesPerKBucket + 1; i++) {
kBucket.add({id: new Buffer("" + i)});

@@ -49,6 +46,6 @@ }

test['split buckets contain all added contacts'] = function (test) {
test.expect(constants.DEFAULT_NUMBER_OF_NODES_PER_K_BUCKET + 2);
test.expect(20 /*numberOfNodesPerKBucket*/ + 2);
var kBucket = new KBucket({localNodeId: new Buffer('00', 'hex')});
var foundContact = {};
for (var i = 0; i < constants.DEFAULT_NUMBER_OF_NODES_PER_K_BUCKET + 1; i++) {
for (var i = 0; i < kBucket.numberOfNodesPerKBucket + 1; i++) {
var iString = i.toString('16');

@@ -83,3 +80,3 @@ if (iString.length < 2) {

var kBucket = new KBucket({localNodeId: new Buffer('00', 'hex')});
for (var i = 0; i < constants.DEFAULT_NUMBER_OF_NODES_PER_K_BUCKET + 1; i++) {
for (var i = 0; i < kBucket.numberOfNodesPerKBucket + 1; i++) {
var iString = i.toString('16');

@@ -86,0 +83,0 @@ if (iString.length < 2) {

"use strict";
var constants = require('../lib/constants.js'),
KBucket = require('../index.js');
var KBucket = require('../index.js');

@@ -20,3 +19,3 @@ var test = module.exports = {};

var kBucket = new KBucket({localNodeId: new Buffer('0000', 'hex')});
for (var i = 0; i < constants.DEFAULT_NUMBER_OF_NODES_PER_K_BUCKET; i++) {
for (var i = 0; i < kBucket.numberOfNodesPerKBucket; i++) {
iString = i.toString('16');

@@ -35,6 +34,6 @@ if (iString.length < 2) {

// console.log(require('util').inspect(contacts, {depth: null}));
test.equal(contacts.length, constants.DEFAULT_NUMBER_OF_NODES_PER_K_BUCKET + 1);
test.equal(contacts.length, kBucket.numberOfNodesPerKBucket + 1);
test.equal(contacts[0].id.toString('hex'), '00' + iString);
contacts.shift(); // get rid of low bucket contact
for (i = 0; i < constants.DEFAULT_NUMBER_OF_NODES_PER_K_BUCKET; i++) {
for (i = 0; i < kBucket.numberOfNodesPerKBucket; i++) {
test.equal(contacts[i].id.toString('hex'), expectedIds[i]);

@@ -41,0 +40,0 @@ }

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc