ndn-js-contrib
Version:
Reusable 'Classes' for Named Data Networking: NameTree, PIT, FIB, ContentStore, Interfaces, and Transports
1 lines • 1.79 kB
JavaScript
function pubKeyMatch(a,b){if(!a)return!0;for(var c=0;c<a.length;c++)if(a[c]!==b[c])return!1;return!0}function PitEntry(a,b,c){return"object"!=typeof b&&(c=b,b=new ndn.Interest,b.wireDecode(a)),b.nonce||b.wireDecode(a),this.nonce=b.nonce,this.uri=b.name.toUri(),this.interest=b,this.element=a,"function"==typeof c?this.callback=c:this.faceID=c,this}var binarySearch=require("./../Utility/binarySearch.js"),ndn,debug={};debug.debug=require("debug")("PIT"),PitEntry.prototype.matches=function(a){return this.interest.matchesName(a.name)&&pubKeyMatch(this.interest.publisherPublicKeyDigest,a.signedInfo.publisher.publisherPublicKeyDigest)?!0:!1},PitEntry.prototype.consume=function(a){if(this.nameTreeNode){var b=binarySearch(this.nameTreeNode.pitEntries,this,"nonce");if(b>=0){var c=this.nameTreeNode.pitEntries.splice(~b,1)[0];c.callback&&!a&&c.callback(null,c.interest)}}return this};var PIT=function(a){return this.nameTree=a,this};PIT.installNDN=function(a){return ndn=a,this},PIT.Entry=PitEntry,PIT.prototype.useNameTree=function(a){return this.nameTree=a,this},PIT.prototype.insertPitEntry=function(a,b,c){var d=new PIT.Entry(a,b,c);setTimeout(function(){d.consume()},d.interest.getInterestLifetimeMilliseconds()||10);var e=this.nameTree.lookup(d.interest.name),f=binarySearch(e.pitEntries,d,"nonce");return 0>f&&(d.nameTreeNode=e,e.pitEntries.splice(~f,0,d)),this},PIT.prototype.checkDuplicate=function(a){var b=this.nameTree.lookup(a.name),c=binarySearch(b.pitEntries,a,"nonce");return 0>c?!1:!0},PIT.prototype.lookup=function(a,b,c,d){b=b||a.name,c=c||[],d=d||0;for(var e=this.nameTree.lookup(b).pitEntries,f=0;f<e.length;f++)e[f].matches(a)&&(c.push(e[f]),e[f].faceID&&(d|=1<<e[f].faceID));return b.size()>0?this.lookup(a,b.getPrefix(-1),c,d):{pitEntries:c,faces:d}},module.exports=PIT;