UNPKG

ndn-js-contrib

Version:

Reusable 'Classes' for Named Data Networking: NameTree, PIT, FIB, ContentStore, Interfaces, and Transports

134 lines (133 loc) 4.72 kB
var debug = {}; debug.debug = require("debug")("ContentStore"); var lruDebug = require("debug")("lru"); var NameTree = require("./NameTree.js"); var crypto = require("ndn-js/js/crypto.js"); var Name = require("ndn-js/js/name.js").Name; var ContentStore = function ContentStore() { this._nameTree = new NameTree(); this._maxPackets = Infinity; this._packetCount = 0; this._stales = []; this._EntryClass = ContentStore.Entry; return this; }; ContentStore.prototype.setEntryClass = function(clas) { this._EntryClass = clas; return this; }; ContentStore.prototype.onMaxPackets = function ContentStore_onMaxPackets() {}; ContentStore.prototype.setOnMaxPackets = function ContentStore_setOnMaxPackets(onMaxPackets) { if (typeof onMaxPackets !== "function") throw new Error("ContentStore.setOnMaxPackets(onMaxPackets): must be a function"); this.onMaxPackets = onMaxPackets.bind(this); }; ContentStore.Entry = function ContentStore_Entry(data, cs) { this._data = data; this._stale = false; this.cs = cs; var self = this; setTimeout(function() { self.makeStale(cs); }, data.getMetaInfo().getFreshnessPeriod()); return this; }; ContentStore.Entry.prototype.getNameWithDigest = function ContentStore_Entry_getNameWithDigest() { if (!this._nameWithDigest) { this._nameWithDigest = this._data.name.getPrefix(this._data.name.size()); this._nameWithDigest.append("sha256digest=" + crypto.createHash('sha256').update(this._data.wireEncode().buffer).digest().toString('hex')); } return this._nameWithDigest; }; ContentStore.Entry.prototype.getData = function ContentStore_Entry_getData() { var self = this; return new Promise(function ContentStore_Entry_getData_Promise(resolve, reject) { resolve(self._data); }); }; ContentStore.Entry.prototype.onDataStale = function ContentStore_Entry_onDataStale() {}; ContentStore.Entry.prototype.makeStale = function ContentStore_Entry_makeStale(cs) { this._stale = true; this.onDataStale(cs); }; ContentStore.Entry.prototype.fulfillsInterest = function ContentStore_Entry_fulfillsInterest(interest) { return (interest.matchesName(this.getNameWithDigest()) && !(interest.getMustBeFresh() && this.getStale())); }; ContentStore.Entry.prototype.getStale = function ContentStore_Entry_getStale() { return this._stale; }; ContentStore.prototype.setMaxPackets = function ContentStore_setMaxPackets(int) { this._maxPackets = int; }; ContentStore.prototype.getMaxPackets = function ContentStore_getMaxPackets() { return this._maxPackets; }; ContentStore.prototype.lookup = function(interest) { var self = this; return new Promise(function ContentStore_lookup_Promise(resolve, reject) { if (interest.getChildSelector()) self._nameTree.right(interest.name); else self._nameTree.left(interest.name); var suf = interest.getMinSuffixComponents(); if (suf) { var totalDepth = suf + interest.name.size(); self._nameTree.skip(function(node) { return !(node.depth + node.prefix.size() >= totalDepth); }); } var $__3 = true; var $__4 = false; var $__5 = undefined; try { for (var $__1 = void 0, $__0 = (self._nameTree)[$traceurRuntime.toProperty(Symbol.iterator)](); !($__3 = ($__1 = $__0.next()).done); $__3 = true) { var node = $__1.value; { var entry = node.getItem(); if (entry && entry.fulfillsInterest(interest)) { return entry.getData().then(resolve).catch(reject); } } } } catch ($__6) { $__4 = true; $__5 = $__6; } finally { try { if (!$__3 && $__0.return != null) { $__0.return(); } } finally { if ($__4) { throw $__5; } } } return reject(interest); }); }; ContentStore.prototype.createNode = function ContentStore_createNode(data, store) { var self = this; return new Promise(function ContentStore_createNode_Promise(resolve, reject) { var entry = new self._EntryClass(data, self); resolve(new NameTree.Node(entry.getNameWithDigest(), entry)); }); }; ContentStore.prototype.insert = function ContentStore_insert(data, store) { var self = this; store = store || self; return store.createNode(data, store).then(function ContentStore_nameTree_insert(node) { self._nameTree.insert(node); if (++self._packetCount >= self.getMaxPackets()) return [node.getItem(), self.onMaxPackets()]; else return [node.getItem()]; }); }; ContentStore.prototype.removeNode = function ContentStore_removeNode(node) { this._nameTree.remove(node.prefix); this._packetCount--; return node.getItem(); }; module.exports = ContentStore;