const EventEmitter = require("events"); const parser_v4 = require("engine.io-parser"); const parser_v3 = require("./parser-v3/index"); const debug = require("debug")("engine:transport"); /** * Noop function. * * @api private */ function noop() {} class Transport extends EventEmitter { /** * Transport constructor. * * @param {http.IncomingMessage} request * @api public */ constructor(req) { super(); this.readyState = "open"; this.discarded = false; this.protocol = req._query.EIO === "3" ? 3 : 4; // 4th revision by default this.parser = this.protocol === 3 ? parser_v3 : parser_v4; } /** * Flags the transport as discarded. * * @api private */ discard() { this.discarded = true; } /** * Called with an incoming HTTP request. * * @param {http.IncomingMessage} request * @api private */ onRequest(req) { debug("setting request"); this.req = req; } /** * Closes the transport. * * @api private */ close(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 */ onError(msg, desc) { if (this.listeners("error").length) { const 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 */ onPacket(packet) { this.emit("packet", packet); } /** * Called with the encoded packet data. * * @param {String} data * @api private */ onData(data) { this.onPacket(this.parser.decodePacket(data)); } /** * Called upon transport close. * * @api private */ onClose() { this.readyState = "closed"; this.emit("close"); } } module.exports = Transport;