UNPKG

ndn-js-contrib

Version:

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

145 lines (101 loc) 3.73 kB
/** * 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;