UNPKG

ndn-js-contrib

Version:

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

132 lines (109 loc) 3.28 kB
/** * 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;