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.
116 lines
2.7 KiB
116 lines
2.7 KiB
import { decodePacket } from "engine.io-parser"; |
|
import { Emitter } from "@socket.io/component-emitter"; |
|
import { installTimerFunctions } from "./util.js"; |
|
class TransportError extends Error { |
|
constructor(reason, description, context) { |
|
super(reason); |
|
this.description = description; |
|
this.context = context; |
|
this.type = "TransportError"; |
|
} |
|
} |
|
export class Transport extends Emitter { |
|
/** |
|
* Transport abstract constructor. |
|
* |
|
* @param {Object} options. |
|
* @api private |
|
*/ |
|
constructor(opts) { |
|
super(); |
|
this.writable = false; |
|
installTimerFunctions(this, opts); |
|
this.opts = opts; |
|
this.query = opts.query; |
|
this.readyState = ""; |
|
this.socket = opts.socket; |
|
} |
|
/** |
|
* Emits an error. |
|
* |
|
* @param {String} reason |
|
* @param description |
|
* @param context - the error context |
|
* @return {Transport} for chaining |
|
* @api protected |
|
*/ |
|
onError(reason, description, context) { |
|
super.emitReserved("error", new TransportError(reason, description, context)); |
|
return this; |
|
} |
|
/** |
|
* Opens the transport. |
|
* |
|
* @api public |
|
*/ |
|
open() { |
|
if ("closed" === this.readyState || "" === this.readyState) { |
|
this.readyState = "opening"; |
|
this.doOpen(); |
|
} |
|
return this; |
|
} |
|
/** |
|
* Closes the transport. |
|
* |
|
* @api public |
|
*/ |
|
close() { |
|
if ("opening" === this.readyState || "open" === this.readyState) { |
|
this.doClose(); |
|
this.onClose(); |
|
} |
|
return this; |
|
} |
|
/** |
|
* Sends multiple packets. |
|
* |
|
* @param {Array} packets |
|
* @api public |
|
*/ |
|
send(packets) { |
|
if ("open" === this.readyState) { |
|
this.write(packets); |
|
} |
|
else { |
|
// this might happen if the transport was silently closed in the beforeunload event handler |
|
} |
|
} |
|
/** |
|
* Called upon open |
|
* |
|
* @api protected |
|
*/ |
|
onOpen() { |
|
this.readyState = "open"; |
|
this.writable = true; |
|
super.emitReserved("open"); |
|
} |
|
/** |
|
* Called with data. |
|
* |
|
* @param {String} data |
|
* @api protected |
|
*/ |
|
onData(data) { |
|
const packet = decodePacket(data, this.socket.binaryType); |
|
this.onPacket(packet); |
|
} |
|
/** |
|
* Called with a decoded packet. |
|
* |
|
* @api protected |
|
*/ |
|
onPacket(packet) { |
|
super.emitReserved("packet", packet); |
|
} |
|
/** |
|
* Called upon close. |
|
* |
|
* @api protected |
|
*/ |
|
onClose(details) { |
|
this.readyState = "closed"; |
|
super.emitReserved("close", details); |
|
} |
|
}
|
|
|