ndn-js-contrib
Version:
Reusable 'Classes' for Named Data Networking: NameTree, PIT, FIB, ContentStore, Interfaces, and Transports
100 lines (99 loc) • 2.96 kB
JavaScript
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;