ndn-js-contrib
Version:
Reusable 'Classes' for Named Data Networking: NameTree, PIT, FIB, ContentStore, Interfaces, and Transports
1 lines • 1.72 kB
JavaScript
var NameTreeNode=require("./NameTreeNode.js"),binaryIndexOf=require("./../Utility/binarySearch.js"),ndn,NameTree=function(){return this.addNode("/"),this};NameTree.Node=NameTreeNode,NameTree.installNDN=function(a){return NameTree.Node.installNDN(a),ndn=a,this},NameTree.prototype.addNode=function(a){"string"==typeof a&&(a=new ndn.Name(a));var b=this[a.toUri()];if(b)return b;for(b=this[a.toUri()]=new NameTree.Node(a);a.size()>0;){var c=a.getPrefix(-1);this[c.toUri()]||(this[c.toUri()]=new NameTree.Node(c)),this[a.toUri()].parent=this[c.toUri()],this[c.toUri()].addChild(this[a.toUri()]),a=c}return b},NameTree.prototype.removeNode=function(a,b){"string"==typeof a&&(a=new ndn.Name(a)),b=b||a;var c=this[a.toUri()];if(c){var d=c.children.shift();return void 0!==d?this.removeNode(d.prefix,b):(delete this[c.prefix.toUri()],b.equals(a)?(c.parent.removeChild(c),this):this.removeNode(a.getPrefix(-1),b))}return this},NameTree.prototype.lookup=function(a){"string"==typeof a&&(a=new ndn.Name(a));var b=this[a.toUri()];return b?b:this.addNode(a)},NameTree.prototype.findLongestPrefixMatch=function(a,b){"string"==typeof a&&(a=new ndn.Name(a)),b=b||function(){return!0};var c=this[a.toUri()];return c&&b(c)?c:a.size()>0?this.findLongestPrefixMatch(a.getPrefix(-1),b):null},NameTree.prototype.findAllMatches=function(a,b){"string"==typeof a&&(a=new ndn.Name(a)),b=b||function(){return!0};var c,d=this,e=d[a.toUri()],f={next:function(){return this.hasNext?(a=e.prefix,c=e,e=c&&c.parent&&b(c.parent)?c.parent:a.size()>0?d.findLongestPrefixMatch(a.getPrefix(-1),b):null,this.hasNext=e?!0:!1,c):null}};return e&&b(e)?(f.hasNext=!0,f):a.size()>0?this.findAllMatches(a.getPrefix(-1),b):(f.hasNext=!1,f)},module.exports=NameTree;