ndn-js-contrib
Version:
Reusable 'Classes' for Named Data Networking: NameTree, PIT, FIB, ContentStore, Interfaces, and Transports
132 lines (109 loc) • 3.28 kB
JavaScript
/**
* Copyright (C) 2013-2014 Regents of the University of California.
* @author: Wentao Shang
* 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
, WebSocket = require("ws") || WebSocket;
/** ServerSide websocket transport,
*@constructor
*@param {WebSocket} ws a connected websocket
*@returns {Transport} the transport
*/
var WebSocketServerTransport = function WebSocketServerTransport(socket)
{
var Self = this;
Transport.call(this);
if (typeof socket === "string"){
if (socket.split(":").length === 2){
socket = socket + ":8686";
}
this.ws = socket;
} else{
this.ws = socket;
}
this.connectionInfo = new WebSocketServerTransport.ConnectionInfo(socket);
return this;
};
/**
*@property {String} protocolKey "wsServer"
*/
WebSocketServerTransport.prototype = new Transport();
WebSocketServerTransport.prototype.name = "WebSocketServerTransport";
WebSocketServerTransport.ConnectionInfo = function WebSocketServerTransportConnectionInfo(socket){
Transport.ConnectionInfo.call(this);
this.socket = socket;
};
WebSocketServerTransport.ConnectionInfo.prototype = new Transport.ConnectionInfo();
WebSocketServerTransport.ConnectionInfo.prototype.name = "WebSocketServerTransport.ConnectionInfo";
WebSocketServerTransport.ConnectionInfo.prototype.getSocket = function()
{
return this.socket;
};
WebSocketServerTransport.prototype.connect = function(connectionInfo,face, onopenCallback, onClose)
{
this.onClose = onClose;
this.elementReader = new ElementReader(face);
if (typeof this.ws === "string")
this.ws = new WebSocket(this.ws);
var self = this;
face.readyStatus = 2;
if (this.ws.readyState != 1)
this.ws.on('open',function(){
console.log("websocket open")
onopenCallback();
})
else
onopenCallback();
//console.log("here2", this.ws.readyState)
this.ws.on('message', function(data) {
//console.log("got ws data")
if (typeof data === 'object') {
//debug.debug("got message");
// 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) {
//debug.debug("NDN.WebSocketServerTransport.ondata exception: " + ex);
return;
}
}
});
this.ws.on('error', function(er) {
console.log("error", er)
});
this.ws.on('close', function() {
onClose();
self.ws = null;
});
};
/**
* Send data.
*/
WebSocketServerTransport.prototype.send = function(/*Buffer*/ data)
{
try{
//console.log("sending", data)
this.ws.send(data, {binary: true});
}catch (er){
this.onClose()
console.log('connection is not established.', er, er.stack.toString());
}
};
/**
* Close transport
*/
WebSocketServerTransport.prototype.close = function()
{
try {
this.ws.end();
} catch (er){
console.log("error closing wsServer transport", er);
}
this.onClose();
console.log('WS connection closed.');
};
module.exports = WebSocketServerTransport;