You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
165 lines
4.9 KiB
165 lines
4.9 KiB
"use strict"; |
|
var __importDefault = (this && this.__importDefault) || function (mod) { |
|
return (mod && mod.__esModule) ? mod : { "default": mod }; |
|
}; |
|
Object.defineProperty(exports, "__esModule", { value: true }); |
|
exports.Polling = void 0; |
|
const transport_js_1 = require("../transport.js"); |
|
const util_js_1 = require("../util.js"); |
|
const engine_io_parser_1 = require("engine.io-parser"); |
|
const debug_1 = __importDefault(require("debug")); // debug() |
|
const debug = (0, debug_1.default)("engine.io-client:polling"); // debug() |
|
class Polling extends transport_js_1.Transport { |
|
constructor() { |
|
super(...arguments); |
|
this._polling = false; |
|
} |
|
get name() { |
|
return "polling"; |
|
} |
|
/** |
|
* Opens the socket (triggers polling). We write a PING message to determine |
|
* when the transport is open. |
|
* |
|
* @protected |
|
*/ |
|
doOpen() { |
|
this._poll(); |
|
} |
|
/** |
|
* Pauses polling. |
|
* |
|
* @param {Function} onPause - callback upon buffers are flushed and transport is paused |
|
* @package |
|
*/ |
|
pause(onPause) { |
|
this.readyState = "pausing"; |
|
const pause = () => { |
|
debug("paused"); |
|
this.readyState = "paused"; |
|
onPause(); |
|
}; |
|
if (this._polling || !this.writable) { |
|
let total = 0; |
|
if (this._polling) { |
|
debug("we are currently polling - waiting to pause"); |
|
total++; |
|
this.once("pollComplete", function () { |
|
debug("pre-pause polling complete"); |
|
--total || pause(); |
|
}); |
|
} |
|
if (!this.writable) { |
|
debug("we are currently writing - waiting to pause"); |
|
total++; |
|
this.once("drain", function () { |
|
debug("pre-pause writing complete"); |
|
--total || pause(); |
|
}); |
|
} |
|
} |
|
else { |
|
pause(); |
|
} |
|
} |
|
/** |
|
* Starts polling cycle. |
|
* |
|
* @private |
|
*/ |
|
_poll() { |
|
debug("polling"); |
|
this._polling = true; |
|
this.doPoll(); |
|
this.emitReserved("poll"); |
|
} |
|
/** |
|
* Overloads onData to detect payloads. |
|
* |
|
* @protected |
|
*/ |
|
onData(data) { |
|
debug("polling got data %s", data); |
|
const callback = (packet) => { |
|
// if its the first message we consider the transport open |
|
if ("opening" === this.readyState && packet.type === "open") { |
|
this.onOpen(); |
|
} |
|
// if its a close packet, we close the ongoing requests |
|
if ("close" === packet.type) { |
|
this.onClose({ description: "transport closed by the server" }); |
|
return false; |
|
} |
|
// otherwise bypass onData and handle the message |
|
this.onPacket(packet); |
|
}; |
|
// decode payload |
|
(0, engine_io_parser_1.decodePayload)(data, this.socket.binaryType).forEach(callback); |
|
// if an event did not trigger closing |
|
if ("closed" !== this.readyState) { |
|
// if we got data we're not polling |
|
this._polling = false; |
|
this.emitReserved("pollComplete"); |
|
if ("open" === this.readyState) { |
|
this._poll(); |
|
} |
|
else { |
|
debug('ignoring poll - transport state "%s"', this.readyState); |
|
} |
|
} |
|
} |
|
/** |
|
* For polling, send a close packet. |
|
* |
|
* @protected |
|
*/ |
|
doClose() { |
|
const close = () => { |
|
debug("writing close packet"); |
|
this.write([{ type: "close" }]); |
|
}; |
|
if ("open" === this.readyState) { |
|
debug("transport open - closing"); |
|
close(); |
|
} |
|
else { |
|
// in case we're trying to close while |
|
// handshaking is in progress (GH-164) |
|
debug("transport not open - deferring close"); |
|
this.once("open", close); |
|
} |
|
} |
|
/** |
|
* Writes a packets payload. |
|
* |
|
* @param {Array} packets - data packets |
|
* @protected |
|
*/ |
|
write(packets) { |
|
this.writable = false; |
|
(0, engine_io_parser_1.encodePayload)(packets, (data) => { |
|
this.doWrite(data, () => { |
|
this.writable = true; |
|
this.emitReserved("drain"); |
|
}); |
|
}); |
|
} |
|
/** |
|
* Generates uri for connection. |
|
* |
|
* @private |
|
*/ |
|
uri() { |
|
const schema = this.opts.secure ? "https" : "http"; |
|
const query = this.query || {}; |
|
// cache busting is forced |
|
if (false !== this.opts.timestampRequests) { |
|
query[this.opts.timestampParam] = (0, util_js_1.randomString)(); |
|
} |
|
if (!this.supportsBinary && !query.sid) { |
|
query.b64 = 1; |
|
} |
|
return this.createUri(schema, query); |
|
} |
|
} |
|
exports.Polling = Polling;
|
|
|