arnaucube
arnaucube/socketioMEANseedPublic Self-hosted repository
socketioMEANseed/server/node_modules/engine.io/lib/transports/websocket.js
server/node_modules/engine.io/lib/transports/websocket.jsRaw
  1
  2/**
  3 * Module dependencies.
  4 */
  5
  6var Transport = require('../transport');
  7var parser = require('engine.io-parser');
  8var util = require('util');
  9var debug = require('debug')('engine:ws');
 10
 11/**
 12 * Export the constructor.
 13 */
 14
 15module.exports = WebSocket;
 16
 17/**
 18 * WebSocket transport
 19 *
 20 * @param {http.IncomingMessage}
 21 * @api public
 22 */
 23
 24function WebSocket (req) {
 25  Transport.call(this, req);
 26  var self = this;
 27  this.socket = req.websocket;
 28  this.socket.on('message', this.onData.bind(this));
 29  this.socket.once('close', this.onClose.bind(this));
 30  this.socket.on('error', this.onError.bind(this));
 31  this.socket.on('headers', onHeaders);
 32  this.writable = true;
 33  this.perMessageDeflate = null;
 34
 35  function onHeaders (headers) {
 36    self.emit('headers', headers);
 37  }
 38}
 39
 40/**
 41 * Inherits from Transport.
 42 */
 43
 44util.inherits(WebSocket, Transport);
 45
 46/**
 47 * Transport name
 48 *
 49 * @api public
 50 */
 51
 52WebSocket.prototype.name = 'websocket';
 53
 54/**
 55 * Advertise upgrade support.
 56 *
 57 * @api public
 58 */
 59
 60WebSocket.prototype.handlesUpgrades = true;
 61
 62/**
 63 * Advertise framing support.
 64 *
 65 * @api public
 66 */
 67
 68WebSocket.prototype.supportsFraming = true;
 69
 70/**
 71 * Processes the incoming data.
 72 *
 73 * @param {String} encoded packet
 74 * @api private
 75 */
 76
 77WebSocket.prototype.onData = function (data) {
 78  debug('received "%s"', data);
 79  Transport.prototype.onData.call(this, data);
 80};
 81
 82/**
 83 * Writes a packet payload.
 84 *
 85 * @param {Array} packets
 86 * @api private
 87 */
 88
 89WebSocket.prototype.send = function (packets) {
 90  var self = this;
 91
 92  for (var i = 0; i < packets.length; i++) {
 93    var packet = packets[i];
 94    parser.encodePacket(packet, self.supportsBinary, send);
 95  }
 96
 97  function send (data) {
 98    debug('writing "%s"', data);
 99
100    // always creates a new object since ws modifies it
101    var opts = {};
102    if (packet.options) {
103      opts.compress = packet.options.compress;
104    }
105
106    if (self.perMessageDeflate) {
107      var len = 'string' === typeof data ? Buffer.byteLength(data) : data.length;
108      if (len < self.perMessageDeflate.threshold) {
109        opts.compress = false;
110      }
111    }
112
113    self.writable = false;
114    self.socket.send(data, opts, onEnd);
115  }
116
117  function onEnd (err) {
118    if (err) return self.onError('write error', err.stack);
119    self.writable = true;
120    self.emit('drain');
121  }
122};
123
124/**
125 * Closes the transport.
126 *
127 * @api private
128 */
129
130WebSocket.prototype.doClose = function (fn) {
131  debug('closing');
132  this.socket.close();
133  fn && fn();
134};