ndn-js-contrib
Version:
Reusable 'Classes' for Named Data Networking: NameTree, PIT, FIB, ContentStore, Interfaces, and Transports
137 lines (111 loc) • 3.45 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)
{
//console.log("WebSocketBrowserTransport.connect called", connectionInfo, face, this.ws)
this.elementReader = new ElementReader(face);
if (typeof this.ws === "string")
this.ws = new WebSocket(this.ws);
this.ws.binaryType = "arraybuffer";
var self = this;
face.readyStatus = 2;
if (this.ws.readyState != 1)
this.ws.onopen = function(){
console.log("websocket open")
onopenCallback();
}
else
onopenCallback();
//console.log("here2", this.ws.readyState)
this.ws.onmessage = function(evt) {
//console.log(evt);
var buf = evt.data;
if (evt.currentTarget.binaryType === "arraybuffer") {
//debug.debug("got message");
// Make a copy of data (maybe a customBuf or a String)
var buf = new Buffer(new Uint8Array(buf));
try {
//console.log('elementReader')
// Find the end of the binary XML element and call face.onReceivedElement.
self.elementReader.onReceivedData(buf);
} catch (ex) {
console.log("NDN.WebSocketServerTransport.ondata exception: " , ex);
return;
}
}
};
this.ws.onerror = function(er) {
console.log("error", er)
};
this.ws.onclose = function() {
self.ws = null;
onClose();
};
};
/**
* Send data.
*/
WebSocketServerTransport.prototype.send = function(/*Buffer*/ data)
{
//console.log("sending",data)
try{
this.ws.send(data.buffer.slice(data.byteOffset), {binary: true});
}catch (er){
console.log('connection is not established.', er);
}
};
/**
* 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;