ndn-js-contrib
Version:
Reusable 'Classes' for Named Data Networking: NameTree, PIT, FIB, ContentStore, Interfaces, and Transports
145 lines (101 loc) • 3.73 kB
JavaScript
/**
* Copyright (C) 2013-2014 Regents of the University of California.
* @author: Wentao Shang, forked and adapted by Ryan Bennett.
* See COPYING for copyright and distribution information.
*/
var ElementReader = require("ndn-js/js/encoding/element-reader.js").ElementReader
, Transport = require("ndn-js/js/transport/transport.js").Transport
, net = require('net')
, debug = {};
debug.debug = require("debug")("TCPServerTransport");
var TCPServerTransport = function serverTcpTransport(socketOrAddress)
{
var self = this;
if (typeof socketOrAddress === "string"){
this.socket = net.connect(socketOrAddress.split(":")[2] || 8484, socketOrAddress.split("://")[1].split(":")[0] || 'localhost', function(sock){
self.connectedHost = socketOrAddress.split("://")[1] || 'localhost'; // Read by Face.
self.connectedPort = socketOrAddress.split(":")[2] || 8484;
self.sock_ready = true;
});
} else {
this.socket = socketOrAddress;
this.connectedHost = null; // Read by Face.
this.connectedPort = null; // Read by Face.
}
return this;
};
TCPServerTransport.prototype = new Transport();
TCPServerTransport.prototype.name = "TCPServerTransport";
TCPServerTransport.ConnectionInfo = function TCPServerTransportConnectionInfo(socket){
Transport.ConnectionInfo.call(this);
this.socket = socket;
};
TCPServerTransport.ConnectionInfo.prototype = new Transport.ConnectionInfo();
TCPServerTransport.ConnectionInfo.prototype.name = "TCPServerTransport.ConnectionInfo";
TCPServerTransport.ConnectionInfo.prototype.getSocket = function()
{
return this.socket;
};
/**Define a connection listener for the {@link Interfaces} module. This Class method must be called before installing the class into Interfaces (if you want a Listener)
*@param {Number=} - port the port for the listener to listen on, default 8585
*/
TCPServerTransport.defineListener = function(Subject, port){
port = port || 8484;
this.Listener = function (interfaces) {
this.server = net.createServer(function(socket){
socket.on('end', function() {
});
interfaces.newFace("TCPServerTransport", socket, function(id){
var toConnect = interfaces.Faces.get(id);
toConnect.transport.connect({}, toConnect, function(){}, function(){});
}, function(){
});
});
this.server.listen(port, function(){
});
};
};
TCPServerTransport.prototype.connect = function(connectionInfo, elementListener, onopenCallback, onclosedCallback)
{
this.elementReader = new ElementReader(elementListener);
// Connect to local ndnd via TCP
var self = this;
elementListener.readyStatus = 2;
this.socket.on('data', function(data) {
if (typeof data === 'object') {
// Make a copy of data (maybe a customBuf or a String)
var buf = new Buffer(data);
try {
// Find the end of the binary XML element and call face.onReceivedElement.
self.elementReader.onReceivedData(buf);
} catch (ex) {
return;
}
}
});
this.socket.on('error', function() {
});
this.socket.on('close', function() {
self.socket = null;
// Close Face when TCP Socket is closed
elementListener.closeByTransport();
});
this.socket.on('connection', function() {
onopenCallback();
});
onopenCallback();
this.connectedHost = 111;
this.connectedPort = 111;
};
TCPServerTransport.prototype.send = function(/*Buffer*/ data)
{
try {
this.socket.write(data);
}catch (e){
}
};
TCPServerTransport.prototype.close = function()
{
this.socket.end();
};
module.exports = TCPServerTransport;