/** * 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'); };