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