UNPKG

ndn-js-contrib

Version:

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

136 lines (135 loc) 4.11 kB
var NameTree = require("./NameTree.js"); var crypto = require("ndn-js/js/crypto.js"); function PIT() { this._nameTree = new NameTree(); } PIT.prototype.insert = function PIT_insert(interest, face) { var self = this; var nameTreeNode = self._nameTree.get(interest.name); if (!nameTreeNode.getItem()) nameTreeNode.setItem(new PIT.Node()); var pitNode = nameTreeNode.getItem(); return pitNode.addEntry(interest, face); }; PIT.prototype.lookup = function PIT_lookup(data, face) { var self = this; return new Promise(function PIT_lookup_Promise(resolve, reject) { var nameWithDigest = data.name.getPrefix(data.name.size()); nameWithDigest.append("sha256digest=" + crypto.createHash('sha256').update(data.wireEncode().buffer).digest().toString('hex')); self._nameTree.up(nameWithDigest); self._nameTree.skip(function(node) { return (!node.getItem()); }); var results = []; 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 ntnode = $__1.value; { var pitNode = ntnode.getItem(); for (var entry in pitNode._entries) { if (pitNode._entries[entry].interest.matchesName(data.name)) { var ent = pitNode._entries.splice(entry, 1)[0]; clearTimeout(ent.timeID); ent.resolve({ data: data, face: face, rtt: Date.now() - ent.inserted }); if (ent.face) { var dup = false; for (var face in results) { if (results[face] === ent.face) { dup = true; } } if (!dup) { results.push(ent.face); } } } } if (!pitNode._entries) self._nameTree.remove(ntnode.prefix); } } } catch ($__6) { $__4 = true; $__5 = $__6; } finally { try { if (!$__3 && $__0.return != null) { $__0.return(); } } finally { if ($__4) { throw $__5; } } } if (results.length > 0) resolve(results); else reject(new Error("PIT.lookup(data): no outbound pitentries for that data")); }); }; PIT.Node = function PIT_Node() { this._entries = []; }; PIT.Node.prototype.timeout = function PIT_Node_timeout(interest) { for (var index in this._entries) if (this._entries[index].interest === interest) { this._entries[index].reject(); return this._entries.splice(index, 1)[0]; } }; PIT.Node.prototype.addEntry = function PIT_Node_addEntry(interest, face) { var self = this; var $__3 = true; var $__4 = false; var $__5 = undefined; try { for (var $__1 = void 0, $__0 = (this._entries)[$traceurRuntime.toProperty(Symbol.iterator)](); !($__3 = ($__1 = $__0.next()).done); $__3 = true) { var entry = $__1.value; { console.log("checking for duplicate", entry.interest.getNonceAsBuffer(), interest.getNonceAsBuffer()); if (entry.interest.getNonce().equals(interest.getNonce())) return Promise.reject("Interest is Duplicate"); } } } catch ($__6) { $__4 = true; $__5 = $__6; } finally { try { if (!$__3 && $__0.return != null) { $__0.return(); } } finally { if ($__4) { throw $__5; } } } return new Promise(function PIT_Node_addEntry_Promise(resolve, reject) { self._entries.push({ interest: interest, resolve: function(res) { resolve(res); }, reject: function() { reject(interest); }, face: face, inserted: Date.now(), timeID: setTimeout(function PIT_Node_entry_timeout() { self.timeout(interest); }, interest.getInterestLifetimeMilliseconds() || 1) }); }); }; module.exports = PIT;