UNPKG

nuxi

Version:
1,570 lines (1,569 loc) 95.7 kB
import { createRequire } from "node:module"; //#region ../../node_modules/.pnpm/crossws@0.4.5_srvx@0.11.15/node_modules/crossws/dist/_chunks/adapter.mjs var AdapterHookable = class { options; constructor(options) { this.options = options || {}; } callHook(name, arg1, arg2) { const globalHook = this.options.hooks?.[name]; const globalPromise = globalHook?.(arg1, arg2); const request = arg1.request || arg1; const resolveHooksPromise = this.options.resolve?.(request); if (!resolveHooksPromise) return globalPromise; const resolvePromise = resolveHooksPromise instanceof Promise ? resolveHooksPromise.then((hooks) => hooks?.[name]) : resolveHooksPromise?.[name]; return Promise.all([globalPromise, resolvePromise]).then(([globalRes, hook]) => { const hookResPromise = hook?.(arg1, arg2); return hookResPromise instanceof Promise ? hookResPromise.then((hookRes) => hookRes || globalRes) : hookResPromise || globalRes; }); } async upgrade(request) { let namespace = this.options.getNamespace?.(request) ?? new URL(request.url).pathname; const context = request.context || {}; try { const res = await this.callHook("upgrade", request); if (!res) return { context, namespace }; if (res.namespace) namespace = res.namespace; if (res.context) Object.assign(context, res.context); if (res instanceof Response) return { context, namespace, endResponse: res }; if (res.handled) return { context, namespace, handled: true }; if (res.headers) return { context, namespace, upgradeHeaders: res.headers }; } catch (error) { const errResponse = error.response || error; if (errResponse instanceof Response) return { context, namespace, endResponse: errResponse }; throw error; } return { context, namespace }; } }; function adapterUtils(globalPeers) { return { peers: globalPeers, publish(topic, message, options) { for (const peers of options?.namespace ? [globalPeers.get(options.namespace) || []] : globalPeers.values()) { let firstPeerWithTopic; for (const peer of peers) if (peer.topics.has(topic)) { firstPeerWithTopic = peer; break; } if (firstPeerWithTopic) { firstPeerWithTopic.send(message, options); firstPeerWithTopic.publish(topic, message, options); } } } }; } function getPeers(globalPeers, namespace) { if (!namespace) throw new Error("Websocket publish namespace missing."); let peers = globalPeers.get(namespace); if (!peers) { peers = /* @__PURE__ */ new Set(); globalPeers.set(namespace, peers); } return peers; } //#endregion //#region ../../node_modules/.pnpm/crossws@0.4.5_srvx@0.11.15/node_modules/crossws/dist/_chunks/rolldown-runtime.mjs var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __commonJSMin = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports); var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) { key = keys[i]; if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: ((k) => from[k]).bind(null, key), enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod)); var __require = /* @__PURE__ */ createRequire(import.meta.url); //#endregion //#region ../../node_modules/.pnpm/crossws@0.4.5_srvx@0.11.15/node_modules/crossws/dist/_chunks/libs/ws.mjs var require_constants = /* @__PURE__ */ __commonJSMin(((exports, module) => { const BINARY_TYPES = [ "nodebuffer", "arraybuffer", "fragments" ]; const hasBlob = typeof Blob !== "undefined"; if (hasBlob) BINARY_TYPES.push("blob"); module.exports = { BINARY_TYPES, CLOSE_TIMEOUT: 3e4, EMPTY_BUFFER: Buffer.alloc(0), GUID: "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", hasBlob, kForOnEventAttribute: Symbol("kIsForOnEventAttribute"), kListener: Symbol("kListener"), kStatusCode: Symbol("status-code"), kWebSocket: Symbol("websocket"), NOOP: () => {} }; })); var require_buffer_util = /* @__PURE__ */ __commonJSMin(((exports, module) => { const { EMPTY_BUFFER } = require_constants(); const FastBuffer = Buffer[Symbol.species]; function concat(list, totalLength) { if (list.length === 0) return EMPTY_BUFFER; if (list.length === 1) return list[0]; const target = Buffer.allocUnsafe(totalLength); let offset = 0; for (let i = 0; i < list.length; i++) { const buf = list[i]; target.set(buf, offset); offset += buf.length; } if (offset < totalLength) return new FastBuffer(target.buffer, target.byteOffset, offset); return target; } function _mask(source, mask, output, offset, length) { for (let i = 0; i < length; i++) output[offset + i] = source[i] ^ mask[i & 3]; } function _unmask(buffer, mask) { for (let i = 0; i < buffer.length; i++) buffer[i] ^= mask[i & 3]; } function toArrayBuffer(buf) { if (buf.length === buf.buffer.byteLength) return buf.buffer; return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.length); } function toBuffer(data) { toBuffer.readOnly = true; if (Buffer.isBuffer(data)) return data; let buf; if (data instanceof ArrayBuffer) buf = new FastBuffer(data); else if (ArrayBuffer.isView(data)) buf = new FastBuffer(data.buffer, data.byteOffset, data.byteLength); else { buf = Buffer.from(data); toBuffer.readOnly = false; } return buf; } module.exports = { concat, mask: _mask, toArrayBuffer, toBuffer, unmask: _unmask }; if (!process.env.WS_NO_BUFFER_UTIL) try { const bufferUtil = __require("bufferutil"); module.exports.mask = function(source, mask, output, offset, length) { if (length < 48) _mask(source, mask, output, offset, length); else bufferUtil.mask(source, mask, output, offset, length); }; module.exports.unmask = function(buffer, mask) { if (buffer.length < 32) _unmask(buffer, mask); else bufferUtil.unmask(buffer, mask); }; } catch (e) {} })); var require_limiter = /* @__PURE__ */ __commonJSMin(((exports, module) => { const kDone = Symbol("kDone"); const kRun = Symbol("kRun"); var Limiter = class { constructor(concurrency) { this[kDone] = () => { this.pending--; this[kRun](); }; this.concurrency = concurrency || Infinity; this.jobs = []; this.pending = 0; } add(job) { this.jobs.push(job); this[kRun](); } [kRun]() { if (this.pending === this.concurrency) return; if (this.jobs.length) { const job = this.jobs.shift(); this.pending++; job(this[kDone]); } } }; module.exports = Limiter; })); var require_permessage_deflate = /* @__PURE__ */ __commonJSMin(((exports, module) => { const zlib = __require("zlib"); const bufferUtil = require_buffer_util(); const Limiter = require_limiter(); const { kStatusCode } = require_constants(); const FastBuffer = Buffer[Symbol.species]; const TRAILER = Buffer.from([ 0, 0, 255, 255 ]); const kPerMessageDeflate = Symbol("permessage-deflate"); const kTotalLength = Symbol("total-length"); const kCallback = Symbol("callback"); const kBuffers = Symbol("buffers"); const kError = Symbol("error"); let zlibLimiter; var PerMessageDeflate = class { constructor(options) { this._options = options || {}; this._threshold = this._options.threshold !== void 0 ? this._options.threshold : 1024; this._maxPayload = this._options.maxPayload | 0; this._isServer = !!this._options.isServer; this._deflate = null; this._inflate = null; this.params = null; if (!zlibLimiter) zlibLimiter = new Limiter(this._options.concurrencyLimit !== void 0 ? this._options.concurrencyLimit : 10); } static get extensionName() { return "permessage-deflate"; } offer() { const params = {}; if (this._options.serverNoContextTakeover) params.server_no_context_takeover = true; if (this._options.clientNoContextTakeover) params.client_no_context_takeover = true; if (this._options.serverMaxWindowBits) params.server_max_window_bits = this._options.serverMaxWindowBits; if (this._options.clientMaxWindowBits) params.client_max_window_bits = this._options.clientMaxWindowBits; else if (this._options.clientMaxWindowBits == null) params.client_max_window_bits = true; return params; } accept(configurations) { configurations = this.normalizeParams(configurations); this.params = this._isServer ? this.acceptAsServer(configurations) : this.acceptAsClient(configurations); return this.params; } cleanup() { if (this._inflate) { this._inflate.close(); this._inflate = null; } if (this._deflate) { const callback = this._deflate[kCallback]; this._deflate.close(); this._deflate = null; if (callback) callback(/* @__PURE__ */ new Error("The deflate stream was closed while data was being processed")); } } acceptAsServer(offers) { const opts = this._options; const accepted = offers.find((params) => { if (opts.serverNoContextTakeover === false && params.server_no_context_takeover || params.server_max_window_bits && (opts.serverMaxWindowBits === false || typeof opts.serverMaxWindowBits === "number" && opts.serverMaxWindowBits > params.server_max_window_bits) || typeof opts.clientMaxWindowBits === "number" && !params.client_max_window_bits) return false; return true; }); if (!accepted) throw new Error("None of the extension offers can be accepted"); if (opts.serverNoContextTakeover) accepted.server_no_context_takeover = true; if (opts.clientNoContextTakeover) accepted.client_no_context_takeover = true; if (typeof opts.serverMaxWindowBits === "number") accepted.server_max_window_bits = opts.serverMaxWindowBits; if (typeof opts.clientMaxWindowBits === "number") accepted.client_max_window_bits = opts.clientMaxWindowBits; else if (accepted.client_max_window_bits === true || opts.clientMaxWindowBits === false) delete accepted.client_max_window_bits; return accepted; } acceptAsClient(response) { const params = response[0]; if (this._options.clientNoContextTakeover === false && params.client_no_context_takeover) throw new Error("Unexpected parameter \"client_no_context_takeover\""); if (!params.client_max_window_bits) { if (typeof this._options.clientMaxWindowBits === "number") params.client_max_window_bits = this._options.clientMaxWindowBits; } else if (this._options.clientMaxWindowBits === false || typeof this._options.clientMaxWindowBits === "number" && params.client_max_window_bits > this._options.clientMaxWindowBits) throw new Error("Unexpected or invalid parameter \"client_max_window_bits\""); return params; } normalizeParams(configurations) { configurations.forEach((params) => { Object.keys(params).forEach((key) => { let value = params[key]; if (value.length > 1) throw new Error(`Parameter "${key}" must have only a single value`); value = value[0]; if (key === "client_max_window_bits") { if (value !== true) { const num = +value; if (!Number.isInteger(num) || num < 8 || num > 15) throw new TypeError(`Invalid value for parameter "${key}": ${value}`); value = num; } else if (!this._isServer) throw new TypeError(`Invalid value for parameter "${key}": ${value}`); } else if (key === "server_max_window_bits") { const num = +value; if (!Number.isInteger(num) || num < 8 || num > 15) throw new TypeError(`Invalid value for parameter "${key}": ${value}`); value = num; } else if (key === "client_no_context_takeover" || key === "server_no_context_takeover") { if (value !== true) throw new TypeError(`Invalid value for parameter "${key}": ${value}`); } else throw new Error(`Unknown parameter "${key}"`); params[key] = value; }); }); return configurations; } decompress(data, fin, callback) { zlibLimiter.add((done) => { this._decompress(data, fin, (err, result) => { done(); callback(err, result); }); }); } compress(data, fin, callback) { zlibLimiter.add((done) => { this._compress(data, fin, (err, result) => { done(); callback(err, result); }); }); } _decompress(data, fin, callback) { const endpoint = this._isServer ? "client" : "server"; if (!this._inflate) { const key = `${endpoint}_max_window_bits`; const windowBits = typeof this.params[key] !== "number" ? zlib.Z_DEFAULT_WINDOWBITS : this.params[key]; this._inflate = zlib.createInflateRaw({ ...this._options.zlibInflateOptions, windowBits }); this._inflate[kPerMessageDeflate] = this; this._inflate[kTotalLength] = 0; this._inflate[kBuffers] = []; this._inflate.on("error", inflateOnError); this._inflate.on("data", inflateOnData); } this._inflate[kCallback] = callback; this._inflate.write(data); if (fin) this._inflate.write(TRAILER); this._inflate.flush(() => { const err = this._inflate[kError]; if (err) { this._inflate.close(); this._inflate = null; callback(err); return; } const data = bufferUtil.concat(this._inflate[kBuffers], this._inflate[kTotalLength]); if (this._inflate._readableState.endEmitted) { this._inflate.close(); this._inflate = null; } else { this._inflate[kTotalLength] = 0; this._inflate[kBuffers] = []; if (fin && this.params[`${endpoint}_no_context_takeover`]) this._inflate.reset(); } callback(null, data); }); } _compress(data, fin, callback) { const endpoint = this._isServer ? "server" : "client"; if (!this._deflate) { const key = `${endpoint}_max_window_bits`; const windowBits = typeof this.params[key] !== "number" ? zlib.Z_DEFAULT_WINDOWBITS : this.params[key]; this._deflate = zlib.createDeflateRaw({ ...this._options.zlibDeflateOptions, windowBits }); this._deflate[kTotalLength] = 0; this._deflate[kBuffers] = []; this._deflate.on("data", deflateOnData); } this._deflate[kCallback] = callback; this._deflate.write(data); this._deflate.flush(zlib.Z_SYNC_FLUSH, () => { if (!this._deflate) return; let data = bufferUtil.concat(this._deflate[kBuffers], this._deflate[kTotalLength]); if (fin) data = new FastBuffer(data.buffer, data.byteOffset, data.length - 4); this._deflate[kCallback] = null; this._deflate[kTotalLength] = 0; this._deflate[kBuffers] = []; if (fin && this.params[`${endpoint}_no_context_takeover`]) this._deflate.reset(); callback(null, data); }); } }; module.exports = PerMessageDeflate; function deflateOnData(chunk) { this[kBuffers].push(chunk); this[kTotalLength] += chunk.length; } function inflateOnData(chunk) { this[kTotalLength] += chunk.length; if (this[kPerMessageDeflate]._maxPayload < 1 || this[kTotalLength] <= this[kPerMessageDeflate]._maxPayload) { this[kBuffers].push(chunk); return; } this[kError] = /* @__PURE__ */ new RangeError("Max payload size exceeded"); this[kError].code = "WS_ERR_UNSUPPORTED_MESSAGE_LENGTH"; this[kError][kStatusCode] = 1009; this.removeListener("data", inflateOnData); this.reset(); } function inflateOnError(err) { this[kPerMessageDeflate]._inflate = null; if (this[kError]) { this[kCallback](this[kError]); return; } err[kStatusCode] = 1007; this[kCallback](err); } })); var require_validation = /* @__PURE__ */ __commonJSMin(((exports, module) => { const { isUtf8 } = __require("buffer"); const { hasBlob } = require_constants(); const tokenChars = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0 ]; function isValidStatusCode(code) { return code >= 1e3 && code <= 1014 && code !== 1004 && code !== 1005 && code !== 1006 || code >= 3e3 && code <= 4999; } function _isValidUTF8(buf) { const len = buf.length; let i = 0; while (i < len) if ((buf[i] & 128) === 0) i++; else if ((buf[i] & 224) === 192) { if (i + 1 === len || (buf[i + 1] & 192) !== 128 || (buf[i] & 254) === 192) return false; i += 2; } else if ((buf[i] & 240) === 224) { if (i + 2 >= len || (buf[i + 1] & 192) !== 128 || (buf[i + 2] & 192) !== 128 || buf[i] === 224 && (buf[i + 1] & 224) === 128 || buf[i] === 237 && (buf[i + 1] & 224) === 160) return false; i += 3; } else if ((buf[i] & 248) === 240) { if (i + 3 >= len || (buf[i + 1] & 192) !== 128 || (buf[i + 2] & 192) !== 128 || (buf[i + 3] & 192) !== 128 || buf[i] === 240 && (buf[i + 1] & 240) === 128 || buf[i] === 244 && buf[i + 1] > 143 || buf[i] > 244) return false; i += 4; } else return false; return true; } function isBlob(value) { return hasBlob && typeof value === "object" && typeof value.arrayBuffer === "function" && typeof value.type === "string" && typeof value.stream === "function" && (value[Symbol.toStringTag] === "Blob" || value[Symbol.toStringTag] === "File"); } module.exports = { isBlob, isValidStatusCode, isValidUTF8: _isValidUTF8, tokenChars }; if (isUtf8) module.exports.isValidUTF8 = function(buf) { return buf.length < 24 ? _isValidUTF8(buf) : isUtf8(buf); }; else if (!process.env.WS_NO_UTF_8_VALIDATE) try { const isValidUTF8 = __require("utf-8-validate"); module.exports.isValidUTF8 = function(buf) { return buf.length < 32 ? _isValidUTF8(buf) : isValidUTF8(buf); }; } catch (e) {} })); var require_receiver = /* @__PURE__ */ __commonJSMin(((exports, module) => { const { Writable } = __require("stream"); const PerMessageDeflate = require_permessage_deflate(); const { BINARY_TYPES, EMPTY_BUFFER, kStatusCode, kWebSocket } = require_constants(); const { concat, toArrayBuffer, unmask } = require_buffer_util(); const { isValidStatusCode, isValidUTF8 } = require_validation(); const FastBuffer = Buffer[Symbol.species]; const GET_INFO = 0; const GET_PAYLOAD_LENGTH_16 = 1; const GET_PAYLOAD_LENGTH_64 = 2; const GET_MASK = 3; const GET_DATA = 4; const INFLATING = 5; const DEFER_EVENT = 6; var Receiver = class extends Writable { constructor(options = {}) { super(); this._allowSynchronousEvents = options.allowSynchronousEvents !== void 0 ? options.allowSynchronousEvents : true; this._binaryType = options.binaryType || BINARY_TYPES[0]; this._extensions = options.extensions || {}; this._isServer = !!options.isServer; this._maxPayload = options.maxPayload | 0; this._skipUTF8Validation = !!options.skipUTF8Validation; this[kWebSocket] = void 0; this._bufferedBytes = 0; this._buffers = []; this._compressed = false; this._payloadLength = 0; this._mask = void 0; this._fragmented = 0; this._masked = false; this._fin = false; this._opcode = 0; this._totalPayloadLength = 0; this._messageLength = 0; this._fragments = []; this._errored = false; this._loop = false; this._state = GET_INFO; } _write(chunk, encoding, cb) { if (this._opcode === 8 && this._state == GET_INFO) return cb(); this._bufferedBytes += chunk.length; this._buffers.push(chunk); this.startLoop(cb); } consume(n) { this._bufferedBytes -= n; if (n === this._buffers[0].length) return this._buffers.shift(); if (n < this._buffers[0].length) { const buf = this._buffers[0]; this._buffers[0] = new FastBuffer(buf.buffer, buf.byteOffset + n, buf.length - n); return new FastBuffer(buf.buffer, buf.byteOffset, n); } const dst = Buffer.allocUnsafe(n); do { const buf = this._buffers[0]; const offset = dst.length - n; if (n >= buf.length) dst.set(this._buffers.shift(), offset); else { dst.set(new Uint8Array(buf.buffer, buf.byteOffset, n), offset); this._buffers[0] = new FastBuffer(buf.buffer, buf.byteOffset + n, buf.length - n); } n -= buf.length; } while (n > 0); return dst; } startLoop(cb) { this._loop = true; do switch (this._state) { case GET_INFO: this.getInfo(cb); break; case GET_PAYLOAD_LENGTH_16: this.getPayloadLength16(cb); break; case GET_PAYLOAD_LENGTH_64: this.getPayloadLength64(cb); break; case GET_MASK: this.getMask(); break; case GET_DATA: this.getData(cb); break; case INFLATING: case DEFER_EVENT: this._loop = false; return; } while (this._loop); if (!this._errored) cb(); } getInfo(cb) { if (this._bufferedBytes < 2) { this._loop = false; return; } const buf = this.consume(2); if ((buf[0] & 48) !== 0) { cb(this.createError(RangeError, "RSV2 and RSV3 must be clear", true, 1002, "WS_ERR_UNEXPECTED_RSV_2_3")); return; } const compressed = (buf[0] & 64) === 64; if (compressed && !this._extensions[PerMessageDeflate.extensionName]) { cb(this.createError(RangeError, "RSV1 must be clear", true, 1002, "WS_ERR_UNEXPECTED_RSV_1")); return; } this._fin = (buf[0] & 128) === 128; this._opcode = buf[0] & 15; this._payloadLength = buf[1] & 127; if (this._opcode === 0) { if (compressed) { cb(this.createError(RangeError, "RSV1 must be clear", true, 1002, "WS_ERR_UNEXPECTED_RSV_1")); return; } if (!this._fragmented) { cb(this.createError(RangeError, "invalid opcode 0", true, 1002, "WS_ERR_INVALID_OPCODE")); return; } this._opcode = this._fragmented; } else if (this._opcode === 1 || this._opcode === 2) { if (this._fragmented) { cb(this.createError(RangeError, `invalid opcode ${this._opcode}`, true, 1002, "WS_ERR_INVALID_OPCODE")); return; } this._compressed = compressed; } else if (this._opcode > 7 && this._opcode < 11) { if (!this._fin) { cb(this.createError(RangeError, "FIN must be set", true, 1002, "WS_ERR_EXPECTED_FIN")); return; } if (compressed) { cb(this.createError(RangeError, "RSV1 must be clear", true, 1002, "WS_ERR_UNEXPECTED_RSV_1")); return; } if (this._payloadLength > 125 || this._opcode === 8 && this._payloadLength === 1) { cb(this.createError(RangeError, `invalid payload length ${this._payloadLength}`, true, 1002, "WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH")); return; } } else { cb(this.createError(RangeError, `invalid opcode ${this._opcode}`, true, 1002, "WS_ERR_INVALID_OPCODE")); return; } if (!this._fin && !this._fragmented) this._fragmented = this._opcode; this._masked = (buf[1] & 128) === 128; if (this._isServer) { if (!this._masked) { cb(this.createError(RangeError, "MASK must be set", true, 1002, "WS_ERR_EXPECTED_MASK")); return; } } else if (this._masked) { cb(this.createError(RangeError, "MASK must be clear", true, 1002, "WS_ERR_UNEXPECTED_MASK")); return; } if (this._payloadLength === 126) this._state = GET_PAYLOAD_LENGTH_16; else if (this._payloadLength === 127) this._state = GET_PAYLOAD_LENGTH_64; else this.haveLength(cb); } getPayloadLength16(cb) { if (this._bufferedBytes < 2) { this._loop = false; return; } this._payloadLength = this.consume(2).readUInt16BE(0); this.haveLength(cb); } getPayloadLength64(cb) { if (this._bufferedBytes < 8) { this._loop = false; return; } const buf = this.consume(8); const num = buf.readUInt32BE(0); if (num > Math.pow(2, 21) - 1) { cb(this.createError(RangeError, "Unsupported WebSocket frame: payload length > 2^53 - 1", false, 1009, "WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH")); return; } this._payloadLength = num * Math.pow(2, 32) + buf.readUInt32BE(4); this.haveLength(cb); } haveLength(cb) { if (this._payloadLength && this._opcode < 8) { this._totalPayloadLength += this._payloadLength; if (this._totalPayloadLength > this._maxPayload && this._maxPayload > 0) { cb(this.createError(RangeError, "Max payload size exceeded", false, 1009, "WS_ERR_UNSUPPORTED_MESSAGE_LENGTH")); return; } } if (this._masked) this._state = GET_MASK; else this._state = GET_DATA; } getMask() { if (this._bufferedBytes < 4) { this._loop = false; return; } this._mask = this.consume(4); this._state = GET_DATA; } getData(cb) { let data = EMPTY_BUFFER; if (this._payloadLength) { if (this._bufferedBytes < this._payloadLength) { this._loop = false; return; } data = this.consume(this._payloadLength); if (this._masked && (this._mask[0] | this._mask[1] | this._mask[2] | this._mask[3]) !== 0) unmask(data, this._mask); } if (this._opcode > 7) { this.controlMessage(data, cb); return; } if (this._compressed) { this._state = INFLATING; this.decompress(data, cb); return; } if (data.length) { this._messageLength = this._totalPayloadLength; this._fragments.push(data); } this.dataMessage(cb); } decompress(data, cb) { this._extensions[PerMessageDeflate.extensionName].decompress(data, this._fin, (err, buf) => { if (err) return cb(err); if (buf.length) { this._messageLength += buf.length; if (this._messageLength > this._maxPayload && this._maxPayload > 0) { cb(this.createError(RangeError, "Max payload size exceeded", false, 1009, "WS_ERR_UNSUPPORTED_MESSAGE_LENGTH")); return; } this._fragments.push(buf); } this.dataMessage(cb); if (this._state === GET_INFO) this.startLoop(cb); }); } dataMessage(cb) { if (!this._fin) { this._state = GET_INFO; return; } const messageLength = this._messageLength; const fragments = this._fragments; this._totalPayloadLength = 0; this._messageLength = 0; this._fragmented = 0; this._fragments = []; if (this._opcode === 2) { let data; if (this._binaryType === "nodebuffer") data = concat(fragments, messageLength); else if (this._binaryType === "arraybuffer") data = toArrayBuffer(concat(fragments, messageLength)); else if (this._binaryType === "blob") data = new Blob(fragments); else data = fragments; if (this._allowSynchronousEvents) { this.emit("message", data, true); this._state = GET_INFO; } else { this._state = DEFER_EVENT; setImmediate(() => { this.emit("message", data, true); this._state = GET_INFO; this.startLoop(cb); }); } } else { const buf = concat(fragments, messageLength); if (!this._skipUTF8Validation && !isValidUTF8(buf)) { cb(this.createError(Error, "invalid UTF-8 sequence", true, 1007, "WS_ERR_INVALID_UTF8")); return; } if (this._state === INFLATING || this._allowSynchronousEvents) { this.emit("message", buf, false); this._state = GET_INFO; } else { this._state = DEFER_EVENT; setImmediate(() => { this.emit("message", buf, false); this._state = GET_INFO; this.startLoop(cb); }); } } } controlMessage(data, cb) { if (this._opcode === 8) { if (data.length === 0) { this._loop = false; this.emit("conclude", 1005, EMPTY_BUFFER); this.end(); } else { const code = data.readUInt16BE(0); if (!isValidStatusCode(code)) { cb(this.createError(RangeError, `invalid status code ${code}`, true, 1002, "WS_ERR_INVALID_CLOSE_CODE")); return; } const buf = new FastBuffer(data.buffer, data.byteOffset + 2, data.length - 2); if (!this._skipUTF8Validation && !isValidUTF8(buf)) { cb(this.createError(Error, "invalid UTF-8 sequence", true, 1007, "WS_ERR_INVALID_UTF8")); return; } this._loop = false; this.emit("conclude", code, buf); this.end(); } this._state = GET_INFO; return; } if (this._allowSynchronousEvents) { this.emit(this._opcode === 9 ? "ping" : "pong", data); this._state = GET_INFO; } else { this._state = DEFER_EVENT; setImmediate(() => { this.emit(this._opcode === 9 ? "ping" : "pong", data); this._state = GET_INFO; this.startLoop(cb); }); } } createError(ErrorCtor, message, prefix, statusCode, errorCode) { this._loop = false; this._errored = true; const err = new ErrorCtor(prefix ? `Invalid WebSocket frame: ${message}` : message); Error.captureStackTrace(err, this.createError); err.code = errorCode; err[kStatusCode] = statusCode; return err; } }; module.exports = Receiver; })); var require_sender = /* @__PURE__ */ __commonJSMin(((exports, module) => { const { Duplex: Duplex$3 } = __require("stream"); const { randomFillSync } = __require("crypto"); const PerMessageDeflate = require_permessage_deflate(); const { EMPTY_BUFFER, kWebSocket, NOOP } = require_constants(); const { isBlob, isValidStatusCode } = require_validation(); const { mask: applyMask, toBuffer } = require_buffer_util(); const kByteLength = Symbol("kByteLength"); const maskBuffer = Buffer.alloc(4); const RANDOM_POOL_SIZE = 8 * 1024; let randomPool; let randomPoolPointer = RANDOM_POOL_SIZE; const DEFAULT = 0; const DEFLATING = 1; const GET_BLOB_DATA = 2; module.exports = class Sender { constructor(socket, extensions, generateMask) { this._extensions = extensions || {}; if (generateMask) { this._generateMask = generateMask; this._maskBuffer = Buffer.alloc(4); } this._socket = socket; this._firstFragment = true; this._compress = false; this._bufferedBytes = 0; this._queue = []; this._state = DEFAULT; this.onerror = NOOP; this[kWebSocket] = void 0; } static frame(data, options) { let mask; let merge = false; let offset = 2; let skipMasking = false; if (options.mask) { mask = options.maskBuffer || maskBuffer; if (options.generateMask) options.generateMask(mask); else { if (randomPoolPointer === RANDOM_POOL_SIZE) { if (randomPool === void 0) randomPool = Buffer.alloc(RANDOM_POOL_SIZE); randomFillSync(randomPool, 0, RANDOM_POOL_SIZE); randomPoolPointer = 0; } mask[0] = randomPool[randomPoolPointer++]; mask[1] = randomPool[randomPoolPointer++]; mask[2] = randomPool[randomPoolPointer++]; mask[3] = randomPool[randomPoolPointer++]; } skipMasking = (mask[0] | mask[1] | mask[2] | mask[3]) === 0; offset = 6; } let dataLength; if (typeof data === "string") if ((!options.mask || skipMasking) && options[kByteLength] !== void 0) dataLength = options[kByteLength]; else { data = Buffer.from(data); dataLength = data.length; } else { dataLength = data.length; merge = options.mask && options.readOnly && !skipMasking; } let payloadLength = dataLength; if (dataLength >= 65536) { offset += 8; payloadLength = 127; } else if (dataLength > 125) { offset += 2; payloadLength = 126; } const target = Buffer.allocUnsafe(merge ? dataLength + offset : offset); target[0] = options.fin ? options.opcode | 128 : options.opcode; if (options.rsv1) target[0] |= 64; target[1] = payloadLength; if (payloadLength === 126) target.writeUInt16BE(dataLength, 2); else if (payloadLength === 127) { target[2] = target[3] = 0; target.writeUIntBE(dataLength, 4, 6); } if (!options.mask) return [target, data]; target[1] |= 128; target[offset - 4] = mask[0]; target[offset - 3] = mask[1]; target[offset - 2] = mask[2]; target[offset - 1] = mask[3]; if (skipMasking) return [target, data]; if (merge) { applyMask(data, mask, target, offset, dataLength); return [target]; } applyMask(data, mask, data, 0, dataLength); return [target, data]; } close(code, data, mask, cb) { let buf; if (code === void 0) buf = EMPTY_BUFFER; else if (typeof code !== "number" || !isValidStatusCode(code)) throw new TypeError("First argument must be a valid error code number"); else if (data === void 0 || !data.length) { buf = Buffer.allocUnsafe(2); buf.writeUInt16BE(code, 0); } else { const length = Buffer.byteLength(data); if (length > 123) throw new RangeError("The message must not be greater than 123 bytes"); buf = Buffer.allocUnsafe(2 + length); buf.writeUInt16BE(code, 0); if (typeof data === "string") buf.write(data, 2); else buf.set(data, 2); } const options = { [kByteLength]: buf.length, fin: true, generateMask: this._generateMask, mask, maskBuffer: this._maskBuffer, opcode: 8, readOnly: false, rsv1: false }; if (this._state !== DEFAULT) this.enqueue([ this.dispatch, buf, false, options, cb ]); else this.sendFrame(Sender.frame(buf, options), cb); } ping(data, mask, cb) { let byteLength; let readOnly; if (typeof data === "string") { byteLength = Buffer.byteLength(data); readOnly = false; } else if (isBlob(data)) { byteLength = data.size; readOnly = false; } else { data = toBuffer(data); byteLength = data.length; readOnly = toBuffer.readOnly; } if (byteLength > 125) throw new RangeError("The data size must not be greater than 125 bytes"); const options = { [kByteLength]: byteLength, fin: true, generateMask: this._generateMask, mask, maskBuffer: this._maskBuffer, opcode: 9, readOnly, rsv1: false }; if (isBlob(data)) if (this._state !== DEFAULT) this.enqueue([ this.getBlobData, data, false, options, cb ]); else this.getBlobData(data, false, options, cb); else if (this._state !== DEFAULT) this.enqueue([ this.dispatch, data, false, options, cb ]); else this.sendFrame(Sender.frame(data, options), cb); } pong(data, mask, cb) { let byteLength; let readOnly; if (typeof data === "string") { byteLength = Buffer.byteLength(data); readOnly = false; } else if (isBlob(data)) { byteLength = data.size; readOnly = false; } else { data = toBuffer(data); byteLength = data.length; readOnly = toBuffer.readOnly; } if (byteLength > 125) throw new RangeError("The data size must not be greater than 125 bytes"); const options = { [kByteLength]: byteLength, fin: true, generateMask: this._generateMask, mask, maskBuffer: this._maskBuffer, opcode: 10, readOnly, rsv1: false }; if (isBlob(data)) if (this._state !== DEFAULT) this.enqueue([ this.getBlobData, data, false, options, cb ]); else this.getBlobData(data, false, options, cb); else if (this._state !== DEFAULT) this.enqueue([ this.dispatch, data, false, options, cb ]); else this.sendFrame(Sender.frame(data, options), cb); } send(data, options, cb) { const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName]; let opcode = options.binary ? 2 : 1; let rsv1 = options.compress; let byteLength; let readOnly; if (typeof data === "string") { byteLength = Buffer.byteLength(data); readOnly = false; } else if (isBlob(data)) { byteLength = data.size; readOnly = false; } else { data = toBuffer(data); byteLength = data.length; readOnly = toBuffer.readOnly; } if (this._firstFragment) { this._firstFragment = false; if (rsv1 && perMessageDeflate && perMessageDeflate.params[perMessageDeflate._isServer ? "server_no_context_takeover" : "client_no_context_takeover"]) rsv1 = byteLength >= perMessageDeflate._threshold; this._compress = rsv1; } else { rsv1 = false; opcode = 0; } if (options.fin) this._firstFragment = true; const opts = { [kByteLength]: byteLength, fin: options.fin, generateMask: this._generateMask, mask: options.mask, maskBuffer: this._maskBuffer, opcode, readOnly, rsv1 }; if (isBlob(data)) if (this._state !== DEFAULT) this.enqueue([ this.getBlobData, data, this._compress, opts, cb ]); else this.getBlobData(data, this._compress, opts, cb); else if (this._state !== DEFAULT) this.enqueue([ this.dispatch, data, this._compress, opts, cb ]); else this.dispatch(data, this._compress, opts, cb); } getBlobData(blob, compress, options, cb) { this._bufferedBytes += options[kByteLength]; this._state = GET_BLOB_DATA; blob.arrayBuffer().then((arrayBuffer) => { if (this._socket.destroyed) { const err = /* @__PURE__ */ new Error("The socket was closed while the blob was being read"); process.nextTick(callCallbacks, this, err, cb); return; } this._bufferedBytes -= options[kByteLength]; const data = toBuffer(arrayBuffer); if (!compress) { this._state = DEFAULT; this.sendFrame(Sender.frame(data, options), cb); this.dequeue(); } else this.dispatch(data, compress, options, cb); }).catch((err) => { process.nextTick(onError, this, err, cb); }); } dispatch(data, compress, options, cb) { if (!compress) { this.sendFrame(Sender.frame(data, options), cb); return; } const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName]; this._bufferedBytes += options[kByteLength]; this._state = DEFLATING; perMessageDeflate.compress(data, options.fin, (_, buf) => { if (this._socket.destroyed) { callCallbacks(this, /* @__PURE__ */ new Error("The socket was closed while data was being compressed"), cb); return; } this._bufferedBytes -= options[kByteLength]; this._state = DEFAULT; options.readOnly = false; this.sendFrame(Sender.frame(buf, options), cb); this.dequeue(); }); } dequeue() { while (this._state === DEFAULT && this._queue.length) { const params = this._queue.shift(); this._bufferedBytes -= params[3][kByteLength]; Reflect.apply(params[0], this, params.slice(1)); } } enqueue(params) { this._bufferedBytes += params[3][kByteLength]; this._queue.push(params); } sendFrame(list, cb) { if (list.length === 2) { this._socket.cork(); this._socket.write(list[0]); this._socket.write(list[1], cb); this._socket.uncork(); } else this._socket.write(list[0], cb); } }; function callCallbacks(sender, err, cb) { if (typeof cb === "function") cb(err); for (let i = 0; i < sender._queue.length; i++) { const params = sender._queue[i]; const callback = params[params.length - 1]; if (typeof callback === "function") callback(err); } } function onError(sender, err, cb) { callCallbacks(sender, err, cb); sender.onerror(err); } })); var require_event_target = /* @__PURE__ */ __commonJSMin(((exports, module) => { const { kForOnEventAttribute, kListener } = require_constants(); const kCode = Symbol("kCode"); const kData = Symbol("kData"); const kError = Symbol("kError"); const kMessage = Symbol("kMessage"); const kReason = Symbol("kReason"); const kTarget = Symbol("kTarget"); const kType = Symbol("kType"); const kWasClean = Symbol("kWasClean"); var Event = class { constructor(type) { this[kTarget] = null; this[kType] = type; } get target() { return this[kTarget]; } get type() { return this[kType]; } }; Object.defineProperty(Event.prototype, "target", { enumerable: true }); Object.defineProperty(Event.prototype, "type", { enumerable: true }); var CloseEvent = class extends Event { constructor(type, options = {}) { super(type); this[kCode] = options.code === void 0 ? 0 : options.code; this[kReason] = options.reason === void 0 ? "" : options.reason; this[kWasClean] = options.wasClean === void 0 ? false : options.wasClean; } get code() { return this[kCode]; } get reason() { return this[kReason]; } get wasClean() { return this[kWasClean]; } }; Object.defineProperty(CloseEvent.prototype, "code", { enumerable: true }); Object.defineProperty(CloseEvent.prototype, "reason", { enumerable: true }); Object.defineProperty(CloseEvent.prototype, "wasClean", { enumerable: true }); var ErrorEvent = class extends Event { constructor(type, options = {}) { super(type); this[kError] = options.error === void 0 ? null : options.error; this[kMessage] = options.message === void 0 ? "" : options.message; } get error() { return this[kError]; } get message() { return this[kMessage]; } }; Object.defineProperty(ErrorEvent.prototype, "error", { enumerable: true }); Object.defineProperty(ErrorEvent.prototype, "message", { enumerable: true }); var MessageEvent = class extends Event { constructor(type, options = {}) { super(type); this[kData] = options.data === void 0 ? null : options.data; } get data() { return this[kData]; } }; Object.defineProperty(MessageEvent.prototype, "data", { enumerable: true }); module.exports = { CloseEvent, ErrorEvent, Event, EventTarget: { addEventListener(type, handler, options = {}) { for (const listener of this.listeners(type)) if (!options[kForOnEventAttribute] && listener[kListener] === handler && !listener[kForOnEventAttribute]) return; let wrapper; if (type === "message") wrapper = function onMessage(data, isBinary) { const event = new MessageEvent("message", { data: isBinary ? data : data.toString() }); event[kTarget] = this; callListener(handler, this, event); }; else if (type === "close") wrapper = function onClose(code, message) { const event = new CloseEvent("close", { code, reason: message.toString(), wasClean: this._closeFrameReceived && this._closeFrameSent }); event[kTarget] = this; callListener(handler, this, event); }; else if (type === "error") wrapper = function onError(error) { const event = new ErrorEvent("error", { error, message: error.message }); event[kTarget] = this; callListener(handler, this, event); }; else if (type === "open") wrapper = function onOpen() { const event = new Event("open"); event[kTarget] = this; callListener(handler, this, event); }; else return; wrapper[kForOnEventAttribute] = !!options[kForOnEventAttribute]; wrapper[kListener] = handler; if (options.once) this.once(type, wrapper); else this.on(type, wrapper); }, removeEventListener(type, handler) { for (const listener of this.listeners(type)) if (listener[kListener] === handler && !listener[kForOnEventAttribute]) { this.removeListener(type, listener); break; } } }, MessageEvent }; function callListener(listener, thisArg, event) { if (typeof listener === "object" && listener.handleEvent) listener.handleEvent.call(listener, event); else listener.call(thisArg, event); } })); var require_extension = /* @__PURE__ */ __commonJSMin(((exports, module) => { const { tokenChars } = require_validation(); function push(dest, name, elem) { if (dest[name] === void 0) dest[name] = [elem]; else dest[name].push(elem); } function parse(header) { const offers = Object.create(null); let params = Object.create(null); let mustUnescape = false; let isEscaping = false; let inQuotes = false; let extensionName; let paramName; let start = -1; let code = -1; let end = -1; let i = 0; for (; i < header.length; i++) { code = header.charCodeAt(i); if (extensionName === void 0) if (end === -1 && tokenChars[code] === 1) { if (start === -1) start = i; } else if (i !== 0 && (code === 32 || code === 9)) { if (end === -1 && start !== -1) end = i; } else if (code === 59 || code === 44) { if (start === -1) throw new SyntaxError(`Unexpected character at index ${i}`); if (end === -1) end = i; const name = header.slice(start, end); if (code === 44) { push(offers, name, params); params = Object.create(null); } else extensionName = name; start = end = -1; } else throw new SyntaxError(`Unexpected character at index ${i}`); else if (paramName === void 0) if (end === -1 && tokenChars[code] === 1) { if (start === -1) start = i; } else if (code === 32 || code === 9) { if (end === -1 && start !== -1) end = i; } else if (code === 59 || code === 44) { if (start === -1) throw new SyntaxError(`Unexpected character at index ${i}`); if (end === -1) end = i; push(params, header.slice(start, end), true); if (code === 44) { push(offers, extensionName, params); params = Object.create(null); extensionName = void 0; } start = end = -1; } else if (code === 61 && start !== -1 && end === -1) { paramName = header.slice(start, i); start = end = -1; } else throw new SyntaxError(`Unexpected character at index ${i}`); else if (isEscaping) { if (tokenChars[code] !== 1) throw new SyntaxError(`Unexpected character at index ${i}`); if (start === -1) start = i; else if (!mustUnescape) mustUnescape = true; isEscaping = false; } else if (inQuotes) if (tokenChars[code] === 1) { if (start === -1) start = i; } else if (code === 34 && start !== -1) { inQuotes = false; end = i; } else if (code === 92) isEscaping = true; else throw new SyntaxError(`Unexpected character at index ${i}`); else if (code === 34 && header.charCodeAt(i - 1) === 61) inQuotes = true; else if (end === -1 && tokenChars[code] === 1) { if (start === -1) start = i; } else if (start !== -1 && (code === 32 || code === 9)) { if (end === -1) end = i; } else if (code === 59 || code === 44) { if (start === -1) throw new SyntaxError(`Unexpected character at index ${i}`); if (end === -1) end = i; let value = header.slice(start, end); if (mustUnescape) { value = value.replace(/\\/g, ""); mustUnescape = false; } push(params, paramName, value); if (code === 44) { push(offers, extensionName, params); params = Object.create(null); extensionName = void 0; } paramName = void 0; start = end = -1; } else throw new SyntaxError(`Unexpected character at index ${i}`); } if (start === -1 || inQuotes || code === 32 || code === 9) throw new SyntaxError("Unexpected end of input"); if (end === -1) end = i; const token = header.slice(start, end); if (extensionName === void 0) push(offers, token, params); else { if (paramName === void 0) push(params, token, true); else if (mustUnescape) push(params, paramName, token.replace(/\\/g, "")); else push(params, paramName, token); push(offers, extensionName, params); } return offers; } function format(extensions) { return Object.keys(extensions).map((extension) => { let configurations = extensions[extension]; if (!Array.isArray(configurations)) configurations = [configurations]; return configurations.map((params) => { return [extension].concat(Object.keys(params).map((k) => { let values = params[k]; if (!Array.isArray(values)) values = [values]; return values.map((v) => v === true ? k : `${k}=${v}`).join("; "); })).join("; "); }).join(", "); }).join(", "); } module.exports = { format, parse }; })); var require_websocket = /* @__PURE__ */ __commonJSMin(((exports, module) => { const EventEmitter$1 = __require("events"); const https = __require("https"); const http$1 = __require("http"); const net = __require("net"); const tls = __require("tls"); const { randomBytes, createHash: createHash$1 } = __require("crypto"); const { Duplex: Duplex$2, Readable } = __require("stream"); const { URL } = __require("url"); const PerMessageDeflate = require_permessage_deflate(); const Receiver = require_receiver(); const Sender = require_sender(); const { isBlob } = require_validation(); const { BINARY_TYPES, CLOSE_TIMEOUT, EMPTY_BUFFER, GUID, kForOnEventAttribute, kListener, kStatusCode, kWebSocket, NOOP } = require_constants(); const { EventTarget: { addEventListener, removeEventListener } } = require_event_target(); const { format, parse } = require_extension(); const { toBuffer } = require_buffer_util(); const kAborted = Symbol("kAborted"); const protocolVersions = [8, 13]; const readyStates = [ "CONNECTING", "OPEN", "CLOSING", "CLOSED" ]; const subprotocolRegex = /^[!#$%&'*+\-.0-9A-Z^_`|a-z~]+$/; var WebSocket = class WebSocket extends EventEmitter$1 { constructor(address, protocols, options) { super(); this._binaryType = BINARY_TYPES[0]; this._closeCode = 1006; this._closeFrameReceived = false; this._closeFrameSent = false; this._closeMessage = EMPTY_BUFFER; this._closeTimer = null; this._errorEmitted = false; this._extensions = {}; this._paused = false; this._protocol = ""; this._readyState = WebSocket.CONNECTING; this._receiver = null; this._sender = null; this._socket = null; if (address !== null) { this._bufferedAmount = 0; this._isServer = false; this._redirects = 0; if (protocols === void 0) protocols = []; else if (!Array.isArray(protocols)) if (typeof protocols === "object" && protocols !== null) { options = protocols; protocols = []; } else protocols = [protocols];