UNPKG

ndn-js-contrib

Version:

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

137 lines (111 loc) 3.45 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) { //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;