UNPKG

ndn-js-contrib

Version:

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

100 lines (99 loc) 2.96 kB
var NameTree = require("./NameTree.js"); function FIB() { this._nameTree = new NameTree(); } FIB.prototype.insert = function FIB_insert(prefix, face) { var self = this; return new Promise(function FIB_insert_Promise(resolve, reject) { var node = self._nameTree.get(prefix); if (!node.getItem()) node.setItem(new FIB.Entry()); var fibEntry = node.getItem(); if (fibEntry.addNextHop(face)) resolve(face); else reject(new Error("FIB.insert(prefix, face): duplicate prefix and face combination")); }); }; FIB.prototype.remove = function FIB_remove(face) { var prefixes = face.registeredPrefixTable; for (var i in prefixes) this._nameTree.get(prefixes[i]).getItem().removeFace(face); }; FIB.prototype.lookup = function FIB_lookup(interest, face) { var self = this; return new Promise(function FIB_lookup_Promise(resolve, reject) { self._nameTree.up(interest.name); self._nameTree.skip(function(node) { var fibEntry = node.getItem(); return (!fibEntry || (fibEntry.getNextHops().length === 0) || ((fibEntry.getNextHops().length === 1) && (fibEntry.getNextHops()[0].face === face))); }); 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 node = $__1.value; { var nexthops = node.getItem().getNextHops(); for (var i in nexthops) { var dup = false; for (var j in results) if (nexthops[i].face === results[j].face) { dup = true; break; } if (!dup && (nexthops[i].face !== face)) results.push(nexthops[i]); } } } } catch ($__6) { $__4 = true; $__5 = $__6; } finally { try { if (!$__3 && $__0.return != null) { $__0.return(); } } finally { if ($__4) { throw $__5; } } } if (results.length) resolve(results); else reject(new Error("FIB.lookup(interest, face): no valid nexthops for that interest")); }); }; FIB.Entry = function FIB_Entry() { this._nextHops = []; }; FIB.Entry.prototype.getNextHops = function FIB_Entry_getNextHops() { return this._nextHops; }; FIB.Entry.prototype.addNextHop = function FIB_Entry_addNextHop(face) { for (var i in this._nextHops) if (this._nextHops[i].face === face) return false; this._nextHops.push({ face: face, measurements: { Fulfilled: 0, timeouts: 0 } }); return true; }; FIB.Entry.prototype.removeFace = function FIB_Entry_removeFace(face) { for (var i in this._nextHops) if (this._nextHops[i].face === face) { this._nextHops.splice(i, 1); break; } }; module.exports = FIB;