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