/**
* Module dependencies.
*/
var EventEmitter = require('events').EventEmitter;
var parser = require('engine.io-parser');
var util = require('util');
var debug = require('debug')('engine:transport');
/**
* Expose the constructor.
*/
module.exports = Transport;
/**
* Noop function.
*
* @api private
*/
function noop () {}
/**
* Transport constructor.
*
* @param {http.IncomingMessage} request
* @api public
*/
function Transport (req) {
this.readyState = 'open';
this.discarded = false;
}
/**
* Inherits from EventEmitter.
*/
util.inherits(Transport, EventEmitter);
/**
* Flags the transport as discarded.
*
* @api private
*/
Transport.prototype.discard = function () {
this.discarded = true;
};
/**
* Called with an incoming HTTP request.
*
* @param {http.IncomingMessage} request
* @api private
*/
Transport.prototype.onRequest = function (req) {
debug('setting request');
this.req = req;
};
/**
* Closes the transport.
*
* @api private
*/
Transport.prototype.close = function (fn) {
if ('closed' === this.readyState || 'closing' === this.readyState) return;
this.readyState = 'closing';
this.doClose(fn || noop);
};
/**
* Called with a transport error.
*
* @param {String} message error
* @param {Object} error description
* @api private
*/
Transport.prototype.onError = function (msg, desc) {
if (this.listeners('error').length) {
var err = new Error(msg);
err.type = 'TransportError';
err.description = desc;
this.emit('error', err);
} else {
debug('ignored transport error %s (%s)', msg, desc);
}
};
/**
* Called with parsed out a packets from the data stream.
*
* @param {Object} packet
* @api private
*/
Transport.prototype.onPacket = function (packet) {
this.emit('packet', packet);
};
/**
* Called with the encoded packet data.
*
* @param {String} data
* @api private
*/
Transport.prototype.onData = function (data) {
this.onPacket(parser.decodePacket(data));
};
/**
* Called upon transport close.
*
* @api private
*/
Transport.prototype.onClose = function () {
this.readyState = 'closed';
this.emit('close');
};