-
Notifications
You must be signed in to change notification settings - Fork 0
/
websocket-server.js
2 lines (2 loc) · 40.9 KB
/
websocket-server.js
1
2
/*! ws/lib/websocket-server.js 8.16.0 */
import e from"events";import t from"http";import s from"stream";import r from"crypto";import i from"zlib";import o from"https";import n from"net";import a from"tls";import h from"url";function c(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var l={exports:{}};l.exports={isValidStatusCode:function(e){return e>=1e3&&e<=1014&&1004!==e&&1005!==e&&1006!==e||e>=3e3&&e<=4999},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]};var d=l.exports;const{tokenChars:f}=d;function _(e,t,s){void 0===e[t]?e[t]=[s]:e[t].push(s)}var u={format:function(e){return Object.keys(e).map((t=>{let s=e[t];return Array.isArray(s)||(s=[s]),s.map((e=>[t].concat(Object.keys(e).map((t=>{let s=e[t];return Array.isArray(s)||(s=[s]),s.map((e=>!0===e?t:`${t}=${e}`)).join("; ")}))).join("; "))).join(", ")})).join(", ")},parse:function(e){const t=Object.create(null);let s,r,i=Object.create(null),o=!1,n=!1,a=!1,h=-1,c=-1,l=-1,d=0;for(;d<e.length;d++)if(c=e.charCodeAt(d),void 0===s)if(-1===l&&1===f[c])-1===h&&(h=d);else if(0===d||32!==c&&9!==c){if(59!==c&&44!==c)throw new SyntaxError(`Unexpected character at index ${d}`);{if(-1===h)throw new SyntaxError(`Unexpected character at index ${d}`);-1===l&&(l=d);const r=e.slice(h,l);44===c?(_(t,r,i),i=Object.create(null)):s=r,h=l=-1}}else-1===l&&-1!==h&&(l=d);else if(void 0===r)if(-1===l&&1===f[c])-1===h&&(h=d);else if(32===c||9===c)-1===l&&-1!==h&&(l=d);else if(59===c||44===c){if(-1===h)throw new SyntaxError(`Unexpected character at index ${d}`);-1===l&&(l=d),_(i,e.slice(h,l),!0),44===c&&(_(t,s,i),i=Object.create(null),s=void 0),h=l=-1}else{if(61!==c||-1===h||-1!==l)throw new SyntaxError(`Unexpected character at index ${d}`);r=e.slice(h,d),h=l=-1}else if(n){if(1!==f[c])throw new SyntaxError(`Unexpected character at index ${d}`);-1===h?h=d:o||(o=!0),n=!1}else if(a)if(1===f[c])-1===h&&(h=d);else if(34===c&&-1!==h)a=!1,l=d;else{if(92!==c)throw new SyntaxError(`Unexpected character at index ${d}`);n=!0}else if(34===c&&61===e.charCodeAt(d-1))a=!0;else if(-1===l&&1===f[c])-1===h&&(h=d);else if(-1===h||32!==c&&9!==c){if(59!==c&&44!==c)throw new SyntaxError(`Unexpected character at index ${d}`);{if(-1===h)throw new SyntaxError(`Unexpected character at index ${d}`);-1===l&&(l=d);let n=e.slice(h,l);o&&(n=n.replace(/\\/g,""),o=!1),_(i,r,n),44===c&&(_(t,s,i),i=Object.create(null),s=void 0),r=void 0,h=l=-1}}else-1===l&&(l=d);if(-1===h||a||32===c||9===c)throw new SyntaxError("Unexpected end of input");-1===l&&(l=d);const u=e.slice(h,l);return void 0===s?_(t,u,i):(void 0===r?_(i,u,!0):_(i,r,o?u.replace(/\\/g,""):u),_(t,s,i)),t}},p={exports:{}},m={BINARY_TYPES:["nodebuffer","arraybuffer","fragments"],EMPTY_BUFFER:Buffer.alloc(0),GUID:"258EAFA5-E914-47DA-95CA-C5AB0DC85B11",kForOnEventAttribute:Symbol("kIsForOnEventAttribute"),kListener:Symbol("kListener"),kStatusCode:Symbol("status-code"),kWebSocket:Symbol("websocket"),NOOP:()=>{}};const{EMPTY_BUFFER:y}=m,v=Buffer[Symbol.species];function g(e,t,s,r,i){for(let o=0;o<i;o++)s[r+o]=e[o]^t[3&o]}function b(e,t){for(let s=0;s<e.length;s++)e[s]^=t[3&s]}if(p.exports={concat:function(e,t){if(0===e.length)return y;if(1===e.length)return e[0];const s=Buffer.allocUnsafe(t);let r=0;for(let t=0;t<e.length;t++){const i=e[t];s.set(i,r),r+=i.length}return r<t?new v(s.buffer,s.byteOffset,r):s},mask:g,toArrayBuffer:function(e){return e.length===e.buffer.byteLength?e.buffer:e.buffer.slice(e.byteOffset,e.byteOffset+e.length)},toBuffer:function e(t){if(e.readOnly=!0,Buffer.isBuffer(t))return t;let s;return t instanceof ArrayBuffer?s=new v(t):ArrayBuffer.isView(t)?s=new v(t.buffer,t.byteOffset,t.byteLength):(s=Buffer.from(t),e.readOnly=!1),s},unmask:b},!process.env.WS_NO_BUFFER_UTIL)try{const e=require("bufferutil");p.exports.mask=function(t,s,r,i,o){o<48?g(t,s,r,i,o):e.mask(t,s,r,i,o)},p.exports.unmask=function(t,s){t.length<32?b(t,s):e.unmask(t,s)}}catch(e){}var S=p.exports;const w=Symbol("kDone"),E=Symbol("kRun");const k=i,x=S,O=class{constructor(e){this[w]=()=>{this.pending--,this[E]()},this.concurrency=e||1/0,this.jobs=[],this.pending=0}add(e){this.jobs.push(e),this[E]()}[E](){if(this.pending!==this.concurrency&&this.jobs.length){const e=this.jobs.shift();this.pending++,e(this[w])}}},{kStatusCode:C}=m,N=Buffer[Symbol.species],L=Buffer.from([0,0,255,255]),T=Symbol("permessage-deflate"),P=Symbol("total-length"),B=Symbol("callback"),R=Symbol("buffers"),I=Symbol("error");let M;var U=class{constructor(e,t,s){if(this._maxPayload=0|s,this._options=e||{},this._threshold=void 0!==this._options.threshold?this._options.threshold:1024,this._isServer=!!t,this._deflate=null,this._inflate=null,this.params=null,!M){const e=void 0!==this._options.concurrencyLimit?this._options.concurrencyLimit:10;M=new O(e)}}static get extensionName(){return"permessage-deflate"}offer(){const e={};return this._options.serverNoContextTakeover&&(e.server_no_context_takeover=!0),this._options.clientNoContextTakeover&&(e.client_no_context_takeover=!0),this._options.serverMaxWindowBits&&(e.server_max_window_bits=this._options.serverMaxWindowBits),this._options.clientMaxWindowBits?e.client_max_window_bits=this._options.clientMaxWindowBits:null==this._options.clientMaxWindowBits&&(e.client_max_window_bits=!0),e}accept(e){return e=this.normalizeParams(e),this.params=this._isServer?this.acceptAsServer(e):this.acceptAsClient(e),this.params}cleanup(){if(this._inflate&&(this._inflate.close(),this._inflate=null),this._deflate){const e=this._deflate[B];this._deflate.close(),this._deflate=null,e&&e(new Error("The deflate stream was closed while data was being processed"))}}acceptAsServer(e){const t=this._options,s=e.find((e=>!(!1===t.serverNoContextTakeover&&e.server_no_context_takeover||e.server_max_window_bits&&(!1===t.serverMaxWindowBits||"number"==typeof t.serverMaxWindowBits&&t.serverMaxWindowBits>e.server_max_window_bits)||"number"==typeof t.clientMaxWindowBits&&!e.client_max_window_bits)));if(!s)throw new Error("None of the extension offers can be accepted");return t.serverNoContextTakeover&&(s.server_no_context_takeover=!0),t.clientNoContextTakeover&&(s.client_no_context_takeover=!0),"number"==typeof t.serverMaxWindowBits&&(s.server_max_window_bits=t.serverMaxWindowBits),"number"==typeof t.clientMaxWindowBits?s.client_max_window_bits=t.clientMaxWindowBits:!0!==s.client_max_window_bits&&!1!==t.clientMaxWindowBits||delete s.client_max_window_bits,s}acceptAsClient(e){const t=e[0];if(!1===this._options.clientNoContextTakeover&&t.client_no_context_takeover)throw new Error('Unexpected parameter "client_no_context_takeover"');if(t.client_max_window_bits){if(!1===this._options.clientMaxWindowBits||"number"==typeof this._options.clientMaxWindowBits&&t.client_max_window_bits>this._options.clientMaxWindowBits)throw new Error('Unexpected or invalid parameter "client_max_window_bits"')}else"number"==typeof this._options.clientMaxWindowBits&&(t.client_max_window_bits=this._options.clientMaxWindowBits);return t}normalizeParams(e){return e.forEach((e=>{Object.keys(e).forEach((t=>{let s=e[t];if(s.length>1)throw new Error(`Parameter "${t}" must have only a single value`);if(s=s[0],"client_max_window_bits"===t){if(!0!==s){const e=+s;if(!Number.isInteger(e)||e<8||e>15)throw new TypeError(`Invalid value for parameter "${t}": ${s}`);s=e}else if(!this._isServer)throw new TypeError(`Invalid value for parameter "${t}": ${s}`)}else if("server_max_window_bits"===t){const e=+s;if(!Number.isInteger(e)||e<8||e>15)throw new TypeError(`Invalid value for parameter "${t}": ${s}`);s=e}else{if("client_no_context_takeover"!==t&&"server_no_context_takeover"!==t)throw new Error(`Unknown parameter "${t}"`);if(!0!==s)throw new TypeError(`Invalid value for parameter "${t}": ${s}`)}e[t]=s}))})),e}decompress(e,t,s){M.add((r=>{this._decompress(e,t,((e,t)=>{r(),s(e,t)}))}))}compress(e,t,s){M.add((r=>{this._compress(e,t,((e,t)=>{r(),s(e,t)}))}))}_decompress(e,t,s){const r=this._isServer?"client":"server";if(!this._inflate){const e=`${r}_max_window_bits`,t="number"!=typeof this.params[e]?k.Z_DEFAULT_WINDOWBITS:this.params[e];this._inflate=k.createInflateRaw({...this._options.zlibInflateOptions,windowBits:t}),this._inflate[T]=this,this._inflate[P]=0,this._inflate[R]=[],this._inflate.on("error",D),this._inflate.on("data",A)}this._inflate[B]=s,this._inflate.write(e),t&&this._inflate.write(L),this._inflate.flush((()=>{const e=this._inflate[I];if(e)return this._inflate.close(),this._inflate=null,void s(e);const i=x.concat(this._inflate[R],this._inflate[P]);this._inflate._readableState.endEmitted?(this._inflate.close(),this._inflate=null):(this._inflate[P]=0,this._inflate[R]=[],t&&this.params[`${r}_no_context_takeover`]&&this._inflate.reset()),s(null,i)}))}_compress(e,t,s){const r=this._isServer?"server":"client";if(!this._deflate){const e=`${r}_max_window_bits`,t="number"!=typeof this.params[e]?k.Z_DEFAULT_WINDOWBITS:this.params[e];this._deflate=k.createDeflateRaw({...this._options.zlibDeflateOptions,windowBits:t}),this._deflate[P]=0,this._deflate[R]=[],this._deflate.on("data",W)}this._deflate[B]=s,this._deflate.write(e),this._deflate.flush(k.Z_SYNC_FLUSH,(()=>{if(!this._deflate)return;let e=x.concat(this._deflate[R],this._deflate[P]);t&&(e=new N(e.buffer,e.byteOffset,e.length-4)),this._deflate[B]=null,this._deflate[P]=0,this._deflate[R]=[],t&&this.params[`${r}_no_context_takeover`]&&this._deflate.reset(),s(null,e)}))}};function W(e){this[R].push(e),this[P]+=e.length}function A(e){this[P]+=e.length,this[T]._maxPayload<1||this[P]<=this[T]._maxPayload?this[R].push(e):(this[I]=new RangeError("Max payload size exceeded"),this[I].code="WS_ERR_UNSUPPORTED_MESSAGE_LENGTH",this[I][C]=1009,this.removeListener("data",A),this.reset())}function D(e){this[T]._inflate=null,e[C]=1007,this[B](e)}const{tokenChars:$}=d;var j={parse:function(e){const t=new Set;let s=-1,r=-1,i=0;for(;i<e.length;i++){const o=e.charCodeAt(i);if(-1===r&&1===$[o])-1===s&&(s=i);else if(0===i||32!==o&&9!==o){if(44!==o)throw new SyntaxError(`Unexpected character at index ${i}`);{if(-1===s)throw new SyntaxError(`Unexpected character at index ${i}`);-1===r&&(r=i);const o=e.slice(s,r);if(t.has(o))throw new SyntaxError(`The "${o}" subprotocol is duplicated`);t.add(o),s=r=-1}}else-1===r&&-1!==s&&(r=i)}if(-1===s||-1!==r)throw new SyntaxError("Unexpected end of input");const o=e.slice(s,i);if(t.has(o))throw new SyntaxError(`The "${o}" subprotocol is duplicated`);return t.add(o),t}};const{Writable:F}=s,G=U,{BINARY_TYPES:q,EMPTY_BUFFER:V,kStatusCode:z,kWebSocket:H}=m,{concat:Y,toArrayBuffer:X,unmask:K}=S,{isValidStatusCode:Z,isValidUTF8:J}=d,Q=Buffer[Symbol.species],ee=Promise.resolve(),te="function"==typeof queueMicrotask?queueMicrotask:function(e){ee.then(e).catch(ie)};var se=class extends F{constructor(e={}){super(),this._allowSynchronousEvents=!!e.allowSynchronousEvents,this._binaryType=e.binaryType||q[0],this._extensions=e.extensions||{},this._isServer=!!e.isServer,this._maxPayload=0|e.maxPayload,this[H]=void 0,this._bufferedBytes=0,this._buffers=[],this._compressed=!1,this._payloadLength=0,this._mask=void 0,this._fragmented=0,this._masked=!1,this._fin=!1,this._opcode=0,this._totalPayloadLength=0,this._messageLength=0,this._fragments=[],this._errored=!1,this._loop=!1,this._state=0}_write(e,t,s){if(8===this._opcode&&0==this._state)return s();this._bufferedBytes+=e.length,this._buffers.push(e),this.startLoop(s)}consume(e){if(this._bufferedBytes-=e,e===this._buffers[0].length)return this._buffers.shift();if(e<this._buffers[0].length){const t=this._buffers[0];return this._buffers[0]=new Q(t.buffer,t.byteOffset+e,t.length-e),new Q(t.buffer,t.byteOffset,e)}const t=Buffer.allocUnsafe(e);do{const s=this._buffers[0],r=t.length-e;e>=s.length?t.set(this._buffers.shift(),r):(t.set(new Uint8Array(s.buffer,s.byteOffset,e),r),this._buffers[0]=new Q(s.buffer,s.byteOffset+e,s.length-e)),e-=s.length}while(e>0);return t}startLoop(e){this._loop=!0;do{switch(this._state){case 0:this.getInfo(e);break;case 1:this.getPayloadLength16(e);break;case 2:this.getPayloadLength64(e);break;case 3:this.getMask();break;case 4:this.getData(e);break;case 5:case 6:return void(this._loop=!1)}}while(this._loop);this._errored||e()}getInfo(e){if(this._bufferedBytes<2)return void(this._loop=!1);const t=this.consume(2);if(0!=(48&t[0])){return void e(this.createError(RangeError,"RSV2 and RSV3 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_2_3"))}const s=64==(64&t[0]);if(!s||this._extensions[G.extensionName]){if(this._fin=128==(128&t[0]),this._opcode=15&t[0],this._payloadLength=127&t[1],0===this._opcode){if(s){return void e(this.createError(RangeError,"RSV1 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_1"))}if(!this._fragmented){return void e(this.createError(RangeError,"invalid opcode 0",!0,1002,"WS_ERR_INVALID_OPCODE"))}this._opcode=this._fragmented}else if(1===this._opcode||2===this._opcode){if(this._fragmented){return void e(this.createError(RangeError,`invalid opcode ${this._opcode}`,!0,1002,"WS_ERR_INVALID_OPCODE"))}this._compressed=s}else{if(!(this._opcode>7&&this._opcode<11)){return void e(this.createError(RangeError,`invalid opcode ${this._opcode}`,!0,1002,"WS_ERR_INVALID_OPCODE"))}if(!this._fin){return void e(this.createError(RangeError,"FIN must be set",!0,1002,"WS_ERR_EXPECTED_FIN"))}if(s){return void e(this.createError(RangeError,"RSV1 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_1"))}if(this._payloadLength>125||8===this._opcode&&1===this._payloadLength){return void e(this.createError(RangeError,`invalid payload length ${this._payloadLength}`,!0,1002,"WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH"))}}if(this._fin||this._fragmented||(this._fragmented=this._opcode),this._masked=128==(128&t[1]),this._isServer){if(!this._masked){return void e(this.createError(RangeError,"MASK must be set",!0,1002,"WS_ERR_EXPECTED_MASK"))}}else if(this._masked){return void e(this.createError(RangeError,"MASK must be clear",!0,1002,"WS_ERR_UNEXPECTED_MASK"))}126===this._payloadLength?this._state=1:127===this._payloadLength?this._state=2:this.haveLength(e)}else{e(this.createError(RangeError,"RSV1 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_1"))}}getPayloadLength16(e){this._bufferedBytes<2?this._loop=!1:(this._payloadLength=this.consume(2).readUInt16BE(0),this.haveLength(e))}getPayloadLength64(e){if(this._bufferedBytes<8)return void(this._loop=!1);const t=this.consume(8),s=t.readUInt32BE(0);if(s>Math.pow(2,21)-1){e(this.createError(RangeError,"Unsupported WebSocket frame: payload length > 2^53 - 1",!1,1009,"WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH"))}else this._payloadLength=s*Math.pow(2,32)+t.readUInt32BE(4),this.haveLength(e)}haveLength(e){if(this._payloadLength&&this._opcode<8&&(this._totalPayloadLength+=this._payloadLength,this._totalPayloadLength>this._maxPayload&&this._maxPayload>0)){e(this.createError(RangeError,"Max payload size exceeded",!1,1009,"WS_ERR_UNSUPPORTED_MESSAGE_LENGTH"))}else this._masked?this._state=3:this._state=4}getMask(){this._bufferedBytes<4?this._loop=!1:(this._mask=this.consume(4),this._state=4)}getData(e){let t=V;if(this._payloadLength){if(this._bufferedBytes<this._payloadLength)return void(this._loop=!1);t=this.consume(this._payloadLength),this._masked&&0!=(this._mask[0]|this._mask[1]|this._mask[2]|this._mask[3])&&K(t,this._mask)}if(this._opcode>7)this.controlMessage(t,e);else{if(this._compressed)return this._state=5,void this.decompress(t,e);t.length&&(this._messageLength=this._totalPayloadLength,this._fragments.push(t)),this.dataMessage(e)}}decompress(e,t){this._extensions[G.extensionName].decompress(e,this._fin,((e,s)=>{if(e)return t(e);if(s.length){if(this._messageLength+=s.length,this._messageLength>this._maxPayload&&this._maxPayload>0){const e=this.createError(RangeError,"Max payload size exceeded",!1,1009,"WS_ERR_UNSUPPORTED_MESSAGE_LENGTH");return void t(e)}this._fragments.push(s)}this.dataMessage(t),0===this._state&&this.startLoop(t)}))}dataMessage(e){if(!this._fin)return void(this._state=0);const t=this._messageLength,s=this._fragments;if(this._totalPayloadLength=0,this._messageLength=0,this._fragmented=0,this._fragments=[],2===this._opcode){let r;r="nodebuffer"===this._binaryType?Y(s,t):"arraybuffer"===this._binaryType?X(Y(s,t)):s,5===this._state||this._allowSynchronousEvents?(this.emit("message",r,!0),this._state=0):(this._state=6,te((()=>{this.emit("message",r,!0),this._state=0,this.startLoop(e)})))}else{const r=Y(s,t);5===this._state||this._allowSynchronousEvents?(this.emit("message",r,!1),this._state=0):(this._state=6,te((()=>{this.emit("message",r,!1),this._state=0,this.startLoop(e)})))}}controlMessage(e,t){if(8!==this._opcode)this._allowSynchronousEvents?(this.emit(9===this._opcode?"ping":"pong",e),this._state=0):(this._state=6,te((()=>{this.emit(9===this._opcode?"ping":"pong",e),this._state=0,this.startLoop(t)})));else{if(0===e.length)this._loop=!1,this.emit("conclude",1005,V),this.end();else{const s=e.readUInt16BE(0);if(!Z(s)){const e=this.createError(RangeError,`invalid status code ${s}`,!0,1002,"WS_ERR_INVALID_CLOSE_CODE");return void t(e)}const r=new Q(e.buffer,e.byteOffset+2,e.length-2);this._loop=!1,this.emit("conclude",s,r),this.end()}this._state=0}}createError(e,t,s,r,i){this._loop=!1,this._errored=!0;const o=new e(s?`Invalid WebSocket frame: ${t}`:t);return Error.captureStackTrace(o,this.createError),o.code=i,o[z]=r,o}};function re(e){throw e}function ie(e){process.nextTick(re,e)}const{randomFillSync:oe}=r,ne=U,{EMPTY_BUFFER:ae}=m,{isValidStatusCode:he}=d,{mask:ce,toBuffer:le}=S,de=Symbol("kByteLength"),fe=Buffer.alloc(4);var _e=class e{constructor(e,t,s){this._extensions=t||{},s&&(this._generateMask=s,this._maskBuffer=Buffer.alloc(4)),this._socket=e,this._firstFragment=!0,this._compress=!1,this._bufferedBytes=0,this._deflating=!1,this._queue=[]}static frame(e,t){let s,r,i=!1,o=2,n=!1;t.mask&&(s=t.maskBuffer||fe,t.generateMask?t.generateMask(s):oe(s,0,4),n=0==(s[0]|s[1]|s[2]|s[3]),o=6),"string"==typeof e?r=t.mask&&!n||void 0===t[de]?(e=Buffer.from(e)).length:t[de]:(r=e.length,i=t.mask&&t.readOnly&&!n);let a=r;r>=65536?(o+=8,a=127):r>125&&(o+=2,a=126);const h=Buffer.allocUnsafe(i?r+o:o);return h[0]=t.fin?128|t.opcode:t.opcode,t.rsv1&&(h[0]|=64),h[1]=a,126===a?h.writeUInt16BE(r,2):127===a&&(h[2]=h[3]=0,h.writeUIntBE(r,4,6)),t.mask?(h[1]|=128,h[o-4]=s[0],h[o-3]=s[1],h[o-2]=s[2],h[o-1]=s[3],n?[h,e]:i?(ce(e,s,h,o,r),[h]):(ce(e,s,e,0,r),[h,e])):[h,e]}close(t,s,r,i){let o;if(void 0===t)o=ae;else{if("number"!=typeof t||!he(t))throw new TypeError("First argument must be a valid error code number");if(void 0!==s&&s.length){const e=Buffer.byteLength(s);if(e>123)throw new RangeError("The message must not be greater than 123 bytes");o=Buffer.allocUnsafe(2+e),o.writeUInt16BE(t,0),"string"==typeof s?o.write(s,2):o.set(s,2)}else o=Buffer.allocUnsafe(2),o.writeUInt16BE(t,0)}const n={[de]:o.length,fin:!0,generateMask:this._generateMask,mask:r,maskBuffer:this._maskBuffer,opcode:8,readOnly:!1,rsv1:!1};this._deflating?this.enqueue([this.dispatch,o,!1,n,i]):this.sendFrame(e.frame(o,n),i)}ping(t,s,r){let i,o;if("string"==typeof t?(i=Buffer.byteLength(t),o=!1):(i=(t=le(t)).length,o=le.readOnly),i>125)throw new RangeError("The data size must not be greater than 125 bytes");const n={[de]:i,fin:!0,generateMask:this._generateMask,mask:s,maskBuffer:this._maskBuffer,opcode:9,readOnly:o,rsv1:!1};this._deflating?this.enqueue([this.dispatch,t,!1,n,r]):this.sendFrame(e.frame(t,n),r)}pong(t,s,r){let i,o;if("string"==typeof t?(i=Buffer.byteLength(t),o=!1):(i=(t=le(t)).length,o=le.readOnly),i>125)throw new RangeError("The data size must not be greater than 125 bytes");const n={[de]:i,fin:!0,generateMask:this._generateMask,mask:s,maskBuffer:this._maskBuffer,opcode:10,readOnly:o,rsv1:!1};this._deflating?this.enqueue([this.dispatch,t,!1,n,r]):this.sendFrame(e.frame(t,n),r)}send(t,s,r){const i=this._extensions[ne.extensionName];let o,n,a=s.binary?2:1,h=s.compress;if("string"==typeof t?(o=Buffer.byteLength(t),n=!1):(o=(t=le(t)).length,n=le.readOnly),this._firstFragment?(this._firstFragment=!1,h&&i&&i.params[i._isServer?"server_no_context_takeover":"client_no_context_takeover"]&&(h=o>=i._threshold),this._compress=h):(h=!1,a=0),s.fin&&(this._firstFragment=!0),i){const e={[de]:o,fin:s.fin,generateMask:this._generateMask,mask:s.mask,maskBuffer:this._maskBuffer,opcode:a,readOnly:n,rsv1:h};this._deflating?this.enqueue([this.dispatch,t,this._compress,e,r]):this.dispatch(t,this._compress,e,r)}else this.sendFrame(e.frame(t,{[de]:o,fin:s.fin,generateMask:this._generateMask,mask:s.mask,maskBuffer:this._maskBuffer,opcode:a,readOnly:n,rsv1:!1}),r)}dispatch(t,s,r,i){if(!s)return void this.sendFrame(e.frame(t,r),i);const o=this._extensions[ne.extensionName];this._bufferedBytes+=r[de],this._deflating=!0,o.compress(t,r.fin,((t,s)=>{if(this._socket.destroyed){const e=new Error("The socket was closed while data was being compressed");"function"==typeof i&&i(e);for(let t=0;t<this._queue.length;t++){const s=this._queue[t],r=s[s.length-1];"function"==typeof r&&r(e)}}else this._bufferedBytes-=r[de],this._deflating=!1,r.readOnly=!1,this.sendFrame(e.frame(s,r),i),this.dequeue()}))}dequeue(){for(;!this._deflating&&this._queue.length;){const e=this._queue.shift();this._bufferedBytes-=e[3][de],Reflect.apply(e[0],this,e.slice(1))}}enqueue(e){this._bufferedBytes+=e[3][de],this._queue.push(e)}sendFrame(e,t){2===e.length?(this._socket.cork(),this._socket.write(e[0]),this._socket.write(e[1],t),this._socket.uncork()):this._socket.write(e[0],t)}};const{kForOnEventAttribute:ue,kListener:pe}=m,me=Symbol("kCode"),ye=Symbol("kData"),ve=Symbol("kError"),ge=Symbol("kMessage"),be=Symbol("kReason"),Se=Symbol("kTarget"),we=Symbol("kType"),Ee=Symbol("kWasClean");class ke{constructor(e){this[Se]=null,this[we]=e}get target(){return this[Se]}get type(){return this[we]}}Object.defineProperty(ke.prototype,"target",{enumerable:!0}),Object.defineProperty(ke.prototype,"type",{enumerable:!0});class xe extends ke{constructor(e,t={}){super(e),this[me]=void 0===t.code?0:t.code,this[be]=void 0===t.reason?"":t.reason,this[Ee]=void 0!==t.wasClean&&t.wasClean}get code(){return this[me]}get reason(){return this[be]}get wasClean(){return this[Ee]}}Object.defineProperty(xe.prototype,"code",{enumerable:!0}),Object.defineProperty(xe.prototype,"reason",{enumerable:!0}),Object.defineProperty(xe.prototype,"wasClean",{enumerable:!0});class Oe extends ke{constructor(e,t={}){super(e),this[ve]=void 0===t.error?null:t.error,this[ge]=void 0===t.message?"":t.message}get error(){return this[ve]}get message(){return this[ge]}}Object.defineProperty(Oe.prototype,"error",{enumerable:!0}),Object.defineProperty(Oe.prototype,"message",{enumerable:!0});class Ce extends ke{constructor(e,t={}){super(e),this[ye]=void 0===t.data?null:t.data}get data(){return this[ye]}}Object.defineProperty(Ce.prototype,"data",{enumerable:!0});const Ne={addEventListener(e,t,s={}){for(const r of this.listeners(e))if(!s[ue]&&r[pe]===t&&!r[ue])return;let r;if("message"===e)r=function(e,s){const r=new Ce("message",{data:s?e:e.toString()});r[Se]=this,Te(t,this,r)};else if("close"===e)r=function(e,s){const r=new xe("close",{code:e,reason:s.toString(),wasClean:this._closeFrameReceived&&this._closeFrameSent});r[Se]=this,Te(t,this,r)};else if("error"===e)r=function(e){const s=new Oe("error",{error:e,message:e.message});s[Se]=this,Te(t,this,s)};else{if("open"!==e)return;r=function(){const e=new ke("open");e[Se]=this,Te(t,this,e)}}r[ue]=!!s[ue],r[pe]=t,s.once?this.once(e,r):this.on(e,r)},removeEventListener(e,t){for(const s of this.listeners(e))if(s[pe]===t&&!s[ue]){this.removeListener(e,s);break}}};var Le={CloseEvent:xe,ErrorEvent:Oe,Event:ke,EventTarget:Ne,MessageEvent:Ce};function Te(e,t,s){"object"==typeof e&&e.handleEvent?e.handleEvent.call(e,s):e.call(t,s)}const Pe=e,Be=o,Re=t,Ie=n,Me=a,{randomBytes:Ue,createHash:We}=r,{URL:Ae}=h,De=U,$e=se,je=_e,{BINARY_TYPES:Fe,EMPTY_BUFFER:Ge,GUID:qe,kForOnEventAttribute:Ve,kListener:ze,kStatusCode:He,kWebSocket:Ye,NOOP:Xe}=m,{EventTarget:{addEventListener:Ke,removeEventListener:Ze}}=Le,{format:Je,parse:Qe}=u,{toBuffer:et}=S,tt=Symbol("kAborted"),st=[8,13],rt=["CONNECTING","OPEN","CLOSING","CLOSED"],it=/^[!#$%&'*+\-.0-9A-Z^_`|a-z~]+$/;let ot=class e extends Pe{constructor(t,s,r){super(),this._binaryType=Fe[0],this._closeCode=1006,this._closeFrameReceived=!1,this._closeFrameSent=!1,this._closeMessage=Ge,this._closeTimer=null,this._extensions={},this._paused=!1,this._protocol="",this._readyState=e.CONNECTING,this._receiver=null,this._sender=null,this._socket=null,null!==t?(this._bufferedAmount=0,this._isServer=!1,this._redirects=0,void 0===s?s=[]:Array.isArray(s)||("object"==typeof s&&null!==s?(r=s,s=[]):s=[s]),at(this,t,s,r)):(this._autoPong=r.autoPong,this._isServer=!0)}get binaryType(){return this._binaryType}set binaryType(e){Fe.includes(e)&&(this._binaryType=e,this._receiver&&(this._receiver._binaryType=e))}get bufferedAmount(){return this._socket?this._socket._writableState.length+this._sender._bufferedBytes:this._bufferedAmount}get extensions(){return Object.keys(this._extensions).join()}get isPaused(){return this._paused}get onclose(){return null}get onerror(){return null}get onopen(){return null}get onmessage(){return null}get protocol(){return this._protocol}get readyState(){return this._readyState}get url(){return this._url}setSocket(t,s,r){const i=new $e({allowSynchronousEvents:r.allowSynchronousEvents,binaryType:this.binaryType,extensions:this._extensions,isServer:this._isServer,maxPayload:r.maxPayload});this._sender=new je(t,this._extensions,r.generateMask),this._receiver=i,this._socket=t,i[Ye]=this,t[Ye]=this,i.on("conclude",_t),i.on("drain",ut),i.on("error",pt),i.on("message",yt),i.on("ping",vt),i.on("pong",gt),t.setTimeout&&t.setTimeout(0),t.setNoDelay&&t.setNoDelay(),s.length>0&&t.unshift(s),t.on("close",St),t.on("data",wt),t.on("end",Et),t.on("error",kt),this._readyState=e.OPEN,this.emit("open")}emitClose(){if(!this._socket)return this._readyState=e.CLOSED,void this.emit("close",this._closeCode,this._closeMessage);this._extensions[De.extensionName]&&this._extensions[De.extensionName].cleanup(),this._receiver.removeAllListeners(),this._readyState=e.CLOSED,this.emit("close",this._closeCode,this._closeMessage)}close(t,s){if(this.readyState!==e.CLOSED)if(this.readyState!==e.CONNECTING)this.readyState!==e.CLOSING?(this._readyState=e.CLOSING,this._sender.close(t,s,!this._isServer,(e=>{e||(this._closeFrameSent=!0,(this._closeFrameReceived||this._receiver._writableState.errorEmitted)&&this._socket.end())})),this._closeTimer=setTimeout(this._socket.destroy.bind(this._socket),3e4)):this._closeFrameSent&&(this._closeFrameReceived||this._receiver._writableState.errorEmitted)&&this._socket.end();else{const e="WebSocket was closed before the connection was established";dt(this,this._req,e)}}pause(){this.readyState!==e.CONNECTING&&this.readyState!==e.CLOSED&&(this._paused=!0,this._socket.pause())}ping(t,s,r){if(this.readyState===e.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");"function"==typeof t?(r=t,t=s=void 0):"function"==typeof s&&(r=s,s=void 0),"number"==typeof t&&(t=t.toString()),this.readyState===e.OPEN?(void 0===s&&(s=!this._isServer),this._sender.ping(t||Ge,s,r)):ft(this,t,r)}pong(t,s,r){if(this.readyState===e.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");"function"==typeof t?(r=t,t=s=void 0):"function"==typeof s&&(r=s,s=void 0),"number"==typeof t&&(t=t.toString()),this.readyState===e.OPEN?(void 0===s&&(s=!this._isServer),this._sender.pong(t||Ge,s,r)):ft(this,t,r)}resume(){this.readyState!==e.CONNECTING&&this.readyState!==e.CLOSED&&(this._paused=!1,this._receiver._writableState.needDrain||this._socket.resume())}send(t,s,r){if(this.readyState===e.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if("function"==typeof s&&(r=s,s={}),"number"==typeof t&&(t=t.toString()),this.readyState!==e.OPEN)return void ft(this,t,r);const i={binary:"string"!=typeof t,mask:!this._isServer,compress:!0,fin:!0,...s};this._extensions[De.extensionName]||(i.compress=!1),this._sender.send(t||Ge,i,r)}terminate(){if(this.readyState!==e.CLOSED)if(this.readyState!==e.CONNECTING)this._socket&&(this._readyState=e.CLOSING,this._socket.destroy());else{const e="WebSocket was closed before the connection was established";dt(this,this._req,e)}}};Object.defineProperty(ot,"CONNECTING",{enumerable:!0,value:rt.indexOf("CONNECTING")}),Object.defineProperty(ot.prototype,"CONNECTING",{enumerable:!0,value:rt.indexOf("CONNECTING")}),Object.defineProperty(ot,"OPEN",{enumerable:!0,value:rt.indexOf("OPEN")}),Object.defineProperty(ot.prototype,"OPEN",{enumerable:!0,value:rt.indexOf("OPEN")}),Object.defineProperty(ot,"CLOSING",{enumerable:!0,value:rt.indexOf("CLOSING")}),Object.defineProperty(ot.prototype,"CLOSING",{enumerable:!0,value:rt.indexOf("CLOSING")}),Object.defineProperty(ot,"CLOSED",{enumerable:!0,value:rt.indexOf("CLOSED")}),Object.defineProperty(ot.prototype,"CLOSED",{enumerable:!0,value:rt.indexOf("CLOSED")}),["binaryType","bufferedAmount","extensions","isPaused","protocol","readyState","url"].forEach((e=>{Object.defineProperty(ot.prototype,e,{enumerable:!0})})),["open","error","close","message"].forEach((e=>{Object.defineProperty(ot.prototype,`on${e}`,{enumerable:!0,get(){for(const t of this.listeners(e))if(t[Ve])return t[ze];return null},set(t){for(const t of this.listeners(e))if(t[Ve]){this.removeListener(e,t);break}"function"==typeof t&&this.addEventListener(e,t,{[Ve]:!0})}})})),ot.prototype.addEventListener=Ke,ot.prototype.removeEventListener=Ze;var nt=ot;function at(e,t,s,r){const i={allowSynchronousEvents:!1,autoPong:!0,protocolVersion:st[1],maxPayload:104857600,perMessageDeflate:!0,followRedirects:!1,maxRedirects:10,...r,createConnection:void 0,socketPath:void 0,hostname:void 0,protocol:void 0,timeout:void 0,method:"GET",host:void 0,path:void 0,port:void 0};if(e._autoPong=i.autoPong,!st.includes(i.protocolVersion))throw new RangeError(`Unsupported protocol version: ${i.protocolVersion} (supported versions: ${st.join(", ")})`);let o;if(t instanceof Ae)o=t;else try{o=new Ae(t)}catch(e){throw new SyntaxError(`Invalid URL: ${t}`)}"http:"===o.protocol?o.protocol="ws:":"https:"===o.protocol&&(o.protocol="wss:"),e._url=o.href;const n="wss:"===o.protocol,a="ws+unix:"===o.protocol;let h;if("ws:"===o.protocol||n||a?a&&!o.pathname?h="The URL's pathname is empty":o.hash&&(h="The URL contains a fragment identifier"):h='The URL\'s protocol must be one of "ws:", "wss:", "http:", "https", or "ws+unix:"',h){const t=new SyntaxError(h);if(0===e._redirects)throw t;return void ht(e,t)}const c=n?443:80,l=Ue(16).toString("base64"),d=n?Be.request:Re.request,f=new Set;let _,u;if(i.createConnection=n?lt:ct,i.defaultPort=i.defaultPort||c,i.port=o.port||c,i.host=o.hostname.startsWith("[")?o.hostname.slice(1,-1):o.hostname,i.headers={...i.headers,"Sec-WebSocket-Version":i.protocolVersion,"Sec-WebSocket-Key":l,Connection:"Upgrade",Upgrade:"websocket"},i.path=o.pathname+o.search,i.timeout=i.handshakeTimeout,i.perMessageDeflate&&(_=new De(!0!==i.perMessageDeflate?i.perMessageDeflate:{},!1,i.maxPayload),i.headers["Sec-WebSocket-Extensions"]=Je({[De.extensionName]:_.offer()})),s.length){for(const e of s){if("string"!=typeof e||!it.test(e)||f.has(e))throw new SyntaxError("An invalid or duplicated subprotocol was specified");f.add(e)}i.headers["Sec-WebSocket-Protocol"]=s.join(",")}if(i.origin&&(i.protocolVersion<13?i.headers["Sec-WebSocket-Origin"]=i.origin:i.headers.Origin=i.origin),(o.username||o.password)&&(i.auth=`${o.username}:${o.password}`),a){const e=i.path.split(":");i.socketPath=e[0],i.path=e[1]}if(i.followRedirects){if(0===e._redirects){e._originalIpc=a,e._originalSecure=n,e._originalHostOrSocketPath=a?i.socketPath:o.host;const t=r&&r.headers;if(r={...r,headers:{}},t)for(const[e,s]of Object.entries(t))r.headers[e.toLowerCase()]=s}else if(0===e.listenerCount("redirect")){const t=a?!!e._originalIpc&&i.socketPath===e._originalHostOrSocketPath:!e._originalIpc&&o.host===e._originalHostOrSocketPath;(!t||e._originalSecure&&!n)&&(delete i.headers.authorization,delete i.headers.cookie,t||delete i.headers.host,i.auth=void 0)}i.auth&&!r.headers.authorization&&(r.headers.authorization="Basic "+Buffer.from(i.auth).toString("base64")),u=e._req=d(i),e._redirects&&e.emit("redirect",e.url,u)}else u=e._req=d(i);i.timeout&&u.on("timeout",(()=>{dt(e,u,"Opening handshake has timed out")})),u.on("error",(t=>{null===u||u[tt]||(u=e._req=null,ht(e,t))})),u.on("response",(o=>{const n=o.headers.location,a=o.statusCode;if(n&&i.followRedirects&&a>=300&&a<400){if(++e._redirects>i.maxRedirects)return void dt(e,u,"Maximum redirects exceeded");let o;u.abort();try{o=new Ae(n,t)}catch(t){const s=new SyntaxError(`Invalid URL: ${n}`);return void ht(e,s)}at(e,o,s,r)}else e.emit("unexpected-response",u,o)||dt(e,u,`Unexpected server response: ${o.statusCode}`)})),u.on("upgrade",((t,s,r)=>{if(e.emit("upgrade",t),e.readyState!==ot.CONNECTING)return;if(u=e._req=null,"websocket"!==t.headers.upgrade.toLowerCase())return void dt(e,s,"Invalid Upgrade header");const o=We("sha1").update(l+qe).digest("base64");if(t.headers["sec-websocket-accept"]!==o)return void dt(e,s,"Invalid Sec-WebSocket-Accept header");const n=t.headers["sec-websocket-protocol"];let a;if(void 0!==n?f.size?f.has(n)||(a="Server sent an invalid subprotocol"):a="Server sent a subprotocol but none was requested":f.size&&(a="Server sent no subprotocol"),a)return void dt(e,s,a);n&&(e._protocol=n);const h=t.headers["sec-websocket-extensions"];if(void 0!==h){if(!_){return void dt(e,s,"Server sent a Sec-WebSocket-Extensions header but no extension was requested")}let t;try{t=Qe(h)}catch(t){return void dt(e,s,"Invalid Sec-WebSocket-Extensions header")}const r=Object.keys(t);if(1!==r.length||r[0]!==De.extensionName){return void dt(e,s,"Server indicated an extension that was not requested")}try{_.accept(t[De.extensionName])}catch(t){return void dt(e,s,"Invalid Sec-WebSocket-Extensions header")}e._extensions[De.extensionName]=_}e.setSocket(s,r,{allowSynchronousEvents:i.allowSynchronousEvents,generateMask:i.generateMask,maxPayload:i.maxPayload})})),i.finishRequest?i.finishRequest(u,e):u.end()}function ht(e,t){e._readyState=ot.CLOSING,e.emit("error",t),e.emitClose()}function ct(e){return e.path=e.socketPath,Ie.connect(e)}function lt(e){return e.path=void 0,e.servername||""===e.servername||(e.servername=Ie.isIP(e.host)?"":e.host),Me.connect(e)}function dt(e,t,s){e._readyState=ot.CLOSING;const r=new Error(s);Error.captureStackTrace(r,dt),t.setHeader?(t[tt]=!0,t.abort(),t.socket&&!t.socket.destroyed&&t.socket.destroy(),process.nextTick(ht,e,r)):(t.destroy(r),t.once("error",e.emit.bind(e,"error")),t.once("close",e.emitClose.bind(e)))}function ft(e,t,s){if(t){const s=et(t).length;e._socket?e._sender._bufferedBytes+=s:e._bufferedAmount+=s}if(s){const t=new Error(`WebSocket is not open: readyState ${e.readyState} (${rt[e.readyState]})`);process.nextTick(s,t)}}function _t(e,t){const s=this[Ye];s._closeFrameReceived=!0,s._closeMessage=t,s._closeCode=e,void 0!==s._socket[Ye]&&(s._socket.removeListener("data",wt),process.nextTick(bt,s._socket),1005===e?s.close():s.close(e,t))}function ut(){const e=this[Ye];e.isPaused||e._socket.resume()}function pt(e){const t=this[Ye];void 0!==t._socket[Ye]&&(t._socket.removeListener("data",wt),process.nextTick(bt,t._socket),t.close(e[He])),t.emit("error",e)}function mt(){this[Ye].emitClose()}function yt(e,t){this[Ye].emit("message",e,t)}function vt(e){const t=this[Ye];t._autoPong&&t.pong(e,!this._isServer,Xe),t.emit("ping",e)}function gt(e){this[Ye].emit("pong",e)}function bt(e){e.resume()}function St(){const e=this[Ye];let t;this.removeListener("close",St),this.removeListener("data",wt),this.removeListener("end",Et),e._readyState=ot.CLOSING,this._readableState.endEmitted||e._closeFrameReceived||e._receiver._writableState.errorEmitted||null===(t=e._socket.read())||e._receiver.write(t),e._receiver.end(),this[Ye]=void 0,clearTimeout(e._closeTimer),e._receiver._writableState.finished||e._receiver._writableState.errorEmitted?e.emitClose():(e._receiver.on("error",mt),e._receiver.on("finish",mt))}function wt(e){this[Ye]._receiver.write(e)||this.pause()}function Et(){const e=this[Ye];e._readyState=ot.CLOSING,e._receiver.end(),this.end()}function kt(){const e=this[Ye];this.removeListener("error",kt),this.on("error",Xe),e&&(e._readyState=ot.CLOSING,this.destroy())}const xt=e,Ot=t,{createHash:Ct}=r,Nt=u,Lt=U,Tt=j,Pt=nt,{GUID:Bt,kWebSocket:Rt}=m,It=/^[+/0-9A-Za-z]{22}==$/;function Mt(e){e._state=2,e.emit("close")}function Ut(){this.destroy()}function Wt(e,t,s,r){s=s||Ot.STATUS_CODES[t],r={Connection:"close","Content-Type":"text/html","Content-Length":Buffer.byteLength(s),...r},e.once("finish",e.destroy),e.end(`HTTP/1.1 ${t} ${Ot.STATUS_CODES[t]}\r\n`+Object.keys(r).map((e=>`${e}: ${r[e]}`)).join("\r\n")+"\r\n\r\n"+s)}function At(e,t,s,r,i){if(e.listenerCount("wsClientError")){const r=new Error(i);Error.captureStackTrace(r,At),e.emit("wsClientError",r,s,t)}else Wt(s,r,i)}const Dt=c(class extends xt{constructor(e,t){if(super(),null==(e={allowSynchronousEvents:!1,autoPong:!0,maxPayload:104857600,perMessageDeflate:!1,handleProtocols:null,clientTracking:!0,verifyClient:null,noServer:!1,backlog:null,server:null,host:null,path:null,port:null,WebSocket:Pt,...e}).port&&!e.server&&!e.noServer||null!=e.port&&(e.server||e.noServer)||e.server&&e.noServer)throw new TypeError('One and only one of the "port", "server", or "noServer" options must be specified');if(null!=e.port?(this._server=Ot.createServer(((e,t)=>{const s=Ot.STATUS_CODES[426];t.writeHead(426,{"Content-Length":s.length,"Content-Type":"text/plain"}),t.end(s)})),this._server.listen(e.port,e.host,e.backlog,t)):e.server&&(this._server=e.server),this._server){const e=this.emit.bind(this,"connection");this._removeListeners=function(e,t){for(const s of Object.keys(t))e.on(s,t[s]);return function(){for(const s of Object.keys(t))e.removeListener(s,t[s])}}(this._server,{listening:this.emit.bind(this,"listening"),error:this.emit.bind(this,"error"),upgrade:(t,s,r)=>{this.handleUpgrade(t,s,r,e)}})}!0===e.perMessageDeflate&&(e.perMessageDeflate={}),e.clientTracking&&(this.clients=new Set,this._shouldEmitClose=!1),this.options=e,this._state=0}address(){if(this.options.noServer)throw new Error('The server is operating in "noServer" mode');return this._server?this._server.address():null}close(e){if(2===this._state)return e&&this.once("close",(()=>{e(new Error("The server is not running"))})),void process.nextTick(Mt,this);if(e&&this.once("close",e),1!==this._state)if(this._state=1,this.options.noServer||this.options.server)this._server&&(this._removeListeners(),this._removeListeners=this._server=null),this.clients&&this.clients.size?this._shouldEmitClose=!0:process.nextTick(Mt,this);else{const e=this._server;this._removeListeners(),this._removeListeners=this._server=null,e.close((()=>{Mt(this)}))}}shouldHandle(e){if(this.options.path){const t=e.url.indexOf("?");if((-1!==t?e.url.slice(0,t):e.url)!==this.options.path)return!1}return!0}handleUpgrade(e,t,s,r){t.on("error",Ut);const i=e.headers["sec-websocket-key"],o=+e.headers["sec-websocket-version"];if("GET"!==e.method){return void At(this,e,t,405,"Invalid HTTP method")}if("websocket"!==e.headers.upgrade.toLowerCase()){return void At(this,e,t,400,"Invalid Upgrade header")}if(!i||!It.test(i)){return void At(this,e,t,400,"Missing or invalid Sec-WebSocket-Key header")}if(8!==o&&13!==o){return void At(this,e,t,400,"Missing or invalid Sec-WebSocket-Version header")}if(!this.shouldHandle(e))return void Wt(t,400);const n=e.headers["sec-websocket-protocol"];let a=new Set;if(void 0!==n)try{a=Tt.parse(n)}catch(s){return void At(this,e,t,400,"Invalid Sec-WebSocket-Protocol header")}const h=e.headers["sec-websocket-extensions"],c={};if(this.options.perMessageDeflate&&void 0!==h){const s=new Lt(this.options.perMessageDeflate,!0,this.options.maxPayload);try{const e=Nt.parse(h);e[Lt.extensionName]&&(s.accept(e[Lt.extensionName]),c[Lt.extensionName]=s)}catch(s){return void At(this,e,t,400,"Invalid or unacceptable Sec-WebSocket-Extensions header")}}if(this.options.verifyClient){const n={origin:e.headers[""+(8===o?"sec-websocket-origin":"origin")],secure:!(!e.socket.authorized&&!e.socket.encrypted),req:e};if(2===this.options.verifyClient.length)return void this.options.verifyClient(n,((o,n,h,l)=>{if(!o)return Wt(t,n||401,h,l);this.completeUpgrade(c,i,a,e,t,s,r)}));if(!this.options.verifyClient(n))return Wt(t,401)}this.completeUpgrade(c,i,a,e,t,s,r)}completeUpgrade(e,t,s,r,i,o,n){if(!i.readable||!i.writable)return i.destroy();if(i[Rt])throw new Error("server.handleUpgrade() was called more than once with the same socket, possibly due to a misconfiguration");if(this._state>0)return Wt(i,503);const a=["HTTP/1.1 101 Switching Protocols","Upgrade: websocket","Connection: Upgrade",`Sec-WebSocket-Accept: ${Ct("sha1").update(t+Bt).digest("base64")}`],h=new this.options.WebSocket(null,void 0,this.options);if(s.size){const e=this.options.handleProtocols?this.options.handleProtocols(s,r):s.values().next().value;e&&(a.push(`Sec-WebSocket-Protocol: ${e}`),h._protocol=e)}if(e[Lt.extensionName]){const t=e[Lt.extensionName].params,s=Nt.format({[Lt.extensionName]:[t]});a.push(`Sec-WebSocket-Extensions: ${s}`),h._extensions=e}this.emit("headers",a,r),i.write(a.concat("\r\n").join("\r\n")),i.removeListener("error",Ut),h.setSocket(i,o,{allowSynchronousEvents:this.options.allowSynchronousEvents,maxPayload:this.options.maxPayload}),this.clients&&(this.clients.add(h),h.on("close",(()=>{this.clients.delete(h),this._shouldEmitClose&&!this.clients.size&&process.nextTick(Mt,this)}))),n(h,r)}});export{Dt as default};