| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- "use strict";
- var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
- };
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.WS = exports.BaseWS = 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 globals_node_js_1 = require("../globals.node.js");
- const debug_1 = __importDefault(require("debug")); // debug()
- const debug = (0, debug_1.default)("engine.io-client:websocket"); // debug()
- // detect ReactNative environment
- const isReactNative = typeof navigator !== "undefined" &&
- typeof navigator.product === "string" &&
- navigator.product.toLowerCase() === "reactnative";
- class BaseWS extends transport_js_1.Transport {
- get name() {
- return "websocket";
- }
- doOpen() {
- const uri = this.uri();
- const protocols = this.opts.protocols;
- // React Native only supports the 'headers' option, and will print a warning if anything else is passed
- const opts = isReactNative
- ? {}
- : (0, util_js_1.pick)(this.opts, "agent", "perMessageDeflate", "pfx", "key", "passphrase", "cert", "ca", "ciphers", "rejectUnauthorized", "localAddress", "protocolVersion", "origin", "maxPayload", "family", "checkServerIdentity");
- if (this.opts.extraHeaders) {
- opts.headers = this.opts.extraHeaders;
- }
- try {
- this.ws = this.createSocket(uri, protocols, opts);
- }
- catch (err) {
- return this.emitReserved("error", err);
- }
- this.ws.binaryType = this.socket.binaryType;
- this.addEventListeners();
- }
- /**
- * Adds event listeners to the socket
- *
- * @private
- */
- addEventListeners() {
- this.ws.onopen = () => {
- if (this.opts.autoUnref) {
- this.ws._socket.unref();
- }
- this.onOpen();
- };
- this.ws.onclose = (closeEvent) => this.onClose({
- description: "websocket connection closed",
- context: closeEvent,
- });
- this.ws.onmessage = (ev) => this.onData(ev.data);
- this.ws.onerror = (e) => this.onError("websocket error", e);
- }
- write(packets) {
- this.writable = false;
- // encodePacket efficient as it uses WS framing
- // no need for encodePayload
- for (let i = 0; i < packets.length; i++) {
- const packet = packets[i];
- const lastPacket = i === packets.length - 1;
- (0, engine_io_parser_1.encodePacket)(packet, this.supportsBinary, (data) => {
- // Sometimes the websocket has already been closed but the browser didn't
- // have a chance of informing us about it yet, in that case send will
- // throw an error
- try {
- this.doWrite(packet, data);
- }
- catch (e) {
- debug("websocket closed before onclose event");
- }
- if (lastPacket) {
- // fake drain
- // defer to next tick to allow Socket to clear writeBuffer
- (0, globals_node_js_1.nextTick)(() => {
- this.writable = true;
- this.emitReserved("drain");
- }, this.setTimeoutFn);
- }
- });
- }
- }
- doClose() {
- if (typeof this.ws !== "undefined") {
- this.ws.close();
- this.ws = null;
- }
- }
- /**
- * Generates uri for connection.
- *
- * @private
- */
- uri() {
- const schema = this.opts.secure ? "wss" : "ws";
- const query = this.query || {};
- // append timestamp to URI
- if (this.opts.timestampRequests) {
- query[this.opts.timestampParam] = (0, util_js_1.randomString)();
- }
- // communicate binary support capabilities
- if (!this.supportsBinary) {
- query.b64 = 1;
- }
- return this.createUri(schema, query);
- }
- }
- exports.BaseWS = BaseWS;
- const WebSocketCtor = globals_node_js_1.globalThisShim.WebSocket || globals_node_js_1.globalThisShim.MozWebSocket;
- /**
- * WebSocket transport based on the built-in `WebSocket` object.
- *
- * Usage: browser, Node.js (since v21), Deno, Bun
- *
- * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket
- * @see https://caniuse.com/mdn-api_websocket
- * @see https://nodejs.org/api/globals.html#websocket
- */
- class WS extends BaseWS {
- createSocket(uri, protocols, opts) {
- return !isReactNative
- ? protocols
- ? new WebSocketCtor(uri, protocols)
- : new WebSocketCtor(uri)
- : new WebSocketCtor(uri, protocols, opts);
- }
- doWrite(_packet, data) {
- this.ws.send(data);
- }
- }
- exports.WS = WS;
|