ndn-js-contrib
Version:
Reusable 'Classes' for Named Data Networking: NameTree, PIT, FIB, ContentStore, Interfaces, and Transports
1 lines • 2.54 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 csEntry(a,b){var c=b.getMetaInfo().getFreshnessPeriod();return this.name=b.name,this.freshnessPeriod=c,this.uri=b.name.toUri(),this.publisherPublicKeyDigest=b.signedInfo.publisher.publisherPublicKeyDigest,Cache.set(b.name.toUri(),{entry:this,element:a}),this}var debug={};debug.debug=require("debug")("ContentStore");var lru=require("lru-cache"),lruDebug=require("debug")("lru"),Cache;csEntry.type="csEntry",csEntry.prototype.getElement=function(a){return(a=a||function(a){return a})(Cache.get(this.uri).element)},csEntry.prototype.stale=function(a){return delete a.csEntry,Cache.has(this.uri)&&Cache.del(this.uri),this};var ContentStore=function(a,b,c){return b=b||csEntry,"csEntry"===b.type&&(Cache=lru({max:c||1e7,length:function(a){return a.element.length},dispose:function(a,b){lruDebug("evicting"),delete b.entry.nameTreeNode.csEntry}})),this.nameTree=a,this.EntryClass=b,this};ContentStore.prototype.check=function(a,b,c,d,e,f){function g(a){var b=!!e.length&&!!a.parent&&a.parent.children.length>e[e.length-1]+1;return b}function h(c){return d++,e.push(0),m?k.check(a,b,c.children[c.children.length-1],d,e,f++):k.check(a,b,c.children[0],d,e,f++)}function i(c){return e[e.length-1]++,m?k.check(a,b,c.parent.children[c.parent.children.length+~e[e.length-1]],d,e,f++):k.check(a,b,c.parent.children[e[e.length-1]],d,e,f++)}function j(a,c){if(d--,e.pop(),c++>1e4)return b(null);var f=a.parent&&a.parent.parent&&a.parent.parent.children.length>e[e.length-1]+1;return f?i(a.parent):e.length>0?j(a.parent,c++):b(null)}if(b=b||function(a){return a},c=c||this.nameTree.lookup(a.name),f=f||1,f++,f++>2*Object.keys(this.nameTree).length)return b(null);var k=this;if(c[this.EntryClass.type]&&a.matchesName(c[this.EntryClass.type].name)&&pubKeyMatch(a.publisherPublicKeyDigest,c[this.EntryClass.type].publisherPublicKeyDigest))return c[this.EntryClass.type].getElement(b);d=d||0,e=e||[];var l=a.getMaxSuffixComponents(),m=(a.getMinSuffixComponents(),a.getChildSelector()),n=l&&d===l,o=c.children.length>0;return 1===e.length&&a.exclude.matches(c.prefix.get(-1))?g(c)?i(c):b(null):!c.prefix.size()||!n&&o?h(c):g(c)?i(c):e.length>1?j(c):b(null)},ContentStore.prototype.insert=function(a,b){var c=this.EntryClass,d=b.getMetaInfo().getFreshnessPeriod(),e=this.nameTree.lookup(b.name),f=new c(a,b);return e[c.type]=f,e[c.type].nameTreeNode=e,setTimeout(function(){e[c.type]&&e[c.type].stale(e)},d||20),this},module.exports=ContentStore;