cloudstorm 0.10.7 → 0.10.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,2 +1,18 @@
1
- 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 __esm=(fn,res)=>function __init(){return fn&&(res=(0,fn[__getOwnPropNames(fn)[0]])(fn=0)),res};var __commonJS=(cb,mod)=>function __require(){return mod||(0,cb[__getOwnPropNames(cb)[0]])((mod={exports:{}}).exports,mod),mod.exports};var __export=(target,all2)=>{for(var name in all2)__defProp(target,name,{get:all2[name],enumerable:true})};var __copyProps=(to,from,except,desc)=>{if(from&&typeof from==="object"||typeof from==="function"){for(let key of __getOwnPropNames(from))if(!__hasOwnProp.call(to,key)&&key!==except)__defProp(to,key,{get:()=>from[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 __toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:true}),mod);var require_package=__commonJS({"package.json"(exports2,module2){module2.exports={name:"cloudstorm",version:"0.10.7",description:"Minimalistic Discord Gateway library",main:"./dist/index.js",engines:{node:">=14.8.0"},types:"./dist/index.d.ts",scripts:{"build:src":"tsup src/index.ts --clean --dts --sourcemap --format cjs --target node14 --minify-whitespace","build:docs":"typedoc --name CloudStorm --excludeExternals --sort static-first --sort alphabetical"},author:"wolke <wolke@weeb.sh>",license:"MIT",dependencies:{"discord-api-types":"^0.37.69",snowtransfer:"^0.10.4"},devDependencies:{"@types/node":"20.11.17","@typescript-eslint/eslint-plugin":"^6.21.0","@typescript-eslint/parser":"^6.21.0",eslint:"^8.56.0",tsup:"^8.0.1",typedoc:"^0.25.8","typedoc-plugin-mdn-links":"^3.1.15",typescript:"^5.3.0"},files:["dist","README.md","LICENSE.md"]}}});var require_Constants=__commonJS({"src/Constants.ts"(exports2,module2){"use strict";var Constants2={GATEWAY_OP_CODES:{DISPATCH:0,HEARTBEAT:1,IDENTIFY:2,PRESENCE_UPDATE:3,VOICE_STATE_UPDATE:4,RESUME:6,RECONNECT:7,REQUEST_GUILD_MEMBERS:8,INVALID_SESSION:9,HELLO:10,HEARTBEAT_ACK:11},GATEWAY_VERSION:10};module2.exports=Constants2}});var require_BetterWs=__commonJS({"src/BetterWs.ts"(exports2,module2){"use strict";var import_events=require("events");var import_crypto=require("crypto");var import_zlib=require("zlib");var import_Constants=__toESM(require_Constants());var import_snowtransfer=require("snowtransfer");var https=require("https");var http=require("http");var util=require("util");var BetterWs=class extends import_events.EventEmitter{constructor(address,options){super();this.address=address;this.options=options;this.wsBucket=new import_snowtransfer.LocalBucket(120,6e4);this.presenceBucket=new import_snowtransfer.LocalBucket(5,6e4);this._socket=null;this._internal={openRejector:null,closePromise:null,zlib:null};this._connecting=false;this._lastCloseCode=null;this._lastCloseReason=null;this.encoding=options.encoding??"other";this.compress=options.compress??false}get status(){const internal=this._internal;if(this._connecting)return 2;if(internal.closePromise)return 3;if(!this._socket)return 4;return 1}connect(){if(this._socket||this._connecting)return Promise.resolve(void 0);this._connecting=true;const key=(0,import_crypto.randomBytes)(16).toString("base64");const url=new URL(this.address);const useHTTPS=url.protocol==="https:"||url.protocol==="wss:"||url.port==="443";const port=url.port||(useHTTPS?"443":"80");const req=(useHTTPS?https:http).request({hostname:url.hostname,path:`${url.pathname}${url.search}`,port,headers:{"Connection":"Upgrade","Upgrade":"websocket","Sec-WebSocket-Key":key,"Sec-WebSocket-Version":"13",...this.options.headers}});let onErrorRef;let cameFromOnError=false;return new Promise((resolve2,reject)=>{this._internal.openRejector=reject;const upgrade=this._onUpgrade.bind(this,key,req,resolve2,reject);onErrorRef=e=>{this._internal.openRejector=null;cameFromOnError=true;this._connecting=false;req.removeListener("upgrade",upgrade);reject(e)};req.once("upgrade",upgrade);req.once("error",onErrorRef);req.end()}).catch(reason=>{if(onErrorRef&&!cameFromOnError){req.destroy();req.removeListener("error",onErrorRef);onErrorRef(reason)}return Promise.reject(reason)})}async close(code,reason){const internal=this._internal;if(internal.closePromise)return internal.closePromise;if(!this._socket)return Promise.resolve(void 0);let resolver;const promise=new Promise(resolve2=>{resolver=resolve2;const from=Buffer.from([code>>8,code&255]);this._write(reason?Buffer.concat([from,Buffer.from(reason)]):from,8)}).then(()=>{internal.closePromise=null});promise.resolve=resolver;internal.closePromise=promise;return promise}sendMessage(data){return new Promise(res=>{const presence=(data==null?void 0:data.op)===import_Constants.GATEWAY_OP_CODES.PRESENCE_UPDATE;const sendMsg=()=>{const fn=()=>{this.emit("ws_send",data);if(this.encoding==="json")this._write(Buffer.from(JSON.stringify(data)),1);else if(this.encoding==="etf")this._write(writeETF(data),2);else if(this.encoding==="other")this._write(Buffer.from(data),2);res(void 0)};if(this.options.bypassBuckets)fn();else this.wsBucket.queue(fn)};if(presence&&!this.options.bypassBuckets)this.presenceBucket.queue(sendMsg);else sendMsg()})}_write(packet,opcode){const socket=this._socket;if(!(socket==null?void 0:socket.writable))return;const length=packet.length;let frame;if(length<126){frame=Buffer.allocUnsafe(6+length);frame[1]=128+length}else if(length<1<<16){frame=Buffer.allocUnsafe(8+length);frame[1]=254;frame[2]=length>>8;frame[3]=length&255}else{frame=Buffer.allocUnsafe(14+length);frame[1]=255;frame.writeBigUInt64BE(BigInt(length),2)}frame[0]=128+opcode;frame.writeUInt32BE(0,frame.length-length-4);frame.set(packet,frame.length-length);socket.write(frame)}_onUpgrade(key,req,resolve2,reject,res,socket){this._internal.openRejector=null;const hash=(0,import_crypto.createHash)("sha1").update(key+"258EAFA5-E914-47DA-95CA-C5AB0DC85B11").digest("base64");const accept=res.headers["sec-websocket-accept"];if(hash!==accept){socket.end(()=>{this.emit("debug","Failed websocket-key validation");this._connecting=false;reject(new Error(`Invalid Sec-Websocket-Accept | expected: ${hash} | received: ${accept}`))});return}socket.once("error",this._onError.bind(this));socket.once("close",this._onClose.bind(this));socket.on("readable",this._onReadable.bind(this));this._socket=socket;this._connecting=false;if(this.compress){const z=(0,import_zlib.createInflate)();z._c=z.close;z._h=z._handle;z._hc=z._handle.close;z._v=()=>void 0;this._internal.zlib=z}this.emit("ws_open");resolve2(void 0);req.removeAllListeners("error")}_onError(error){if(!this._socket)return;this.emit("debug",util.inspect(error,true,1,false));this._write(Buffer.allocUnsafe(0),8)}_onClose(){const socket=this._socket;const internal=this._internal;if(!socket)return;socket.removeListener("data",this._onReadable);socket.removeListener("error",this._onError);this.wsBucket.dropQueue();this.presenceBucket.dropQueue();this._socket=null;this.emit("ws_close",this._lastCloseCode??1006,this._lastCloseReason??"Abnormal Closure");this._lastCloseCode=null;this._lastCloseReason=null;if(internal.zlib){internal.zlib.close();internal.zlib=null}if(internal.closePromise)internal.closePromise.resolve(void 0)}_onReadable(){const socket=this._socket;while(((socket==null?void 0:socket.readableLength)||0)>1){let length=readRange(socket,1,1)&127;let bytes=0;if(length>125){bytes=length===126?2:8;if(socket.readableLength<2+bytes)return;length=readRange(socket,2,bytes)}const frame=socket.read(2+bytes+length);if(!frame)return;const fin=frame[0]>>7;const opcode=frame[0]&15;if(fin!==1||opcode===0)this.emit("debug","discord actually does send messages with fin=0. if you see this error let me know");const payload=frame.subarray(2+bytes);this._processFrame(opcode,payload)}}_processFrame(opcode,message){const internal=this._internal;switch(opcode){case 1:{let packet;if(this.encoding==="json")packet=JSON.parse(message.toString());else if(this.encoding==="other")packet=message;this.emit("ws_receive",packet);break}case 2:{let packet;if(this.compress){const z=internal.zlib;let error=null;let data=null;z.close=z._handle.close=z._v;try{data=z._processChunk(message,import_zlib.constants.Z_SYNC_FLUSH)}catch(e){error=e}const l=message.length;if(message[l-4]!==0||message[l-3]!==0||message[l-2]!==255||message[l-1]!==255)this.emit("debug","discord actually does send fragmented zlib messages. If you see this error let me know");z.close=z._c;z._handle=z._h;z._handle.close=z._hc;z._events.error=void 0;z._eventCount--;z.removeAllListeners("error");if(error){this.emit("debug","Zlib error processing chunk");this._write(Buffer.allocUnsafe(0),8);return}if(!data){this.emit("debug","Data from zlib processing was null. If you see this error let me know");return}if(this.encoding==="json")packet=JSON.parse(String(data));else if(this.encoding==="etf")packet=readETF(data,1);else if(this.encoding==="other")packet=data}else if(this.encoding==="json")packet=JSON.parse((0,import_zlib.inflateSync)(message).toString());else if(this.encoding==="etf")packet=readETF(message,1);else if(this.encoding==="other")packet=message;this.emit("ws_receive",packet);break}case 8:{this._lastCloseCode=message.length>1?(message[0]<<8)+message[1]:0;this._lastCloseReason=message.length>2?message.subarray(2).toString():"";this._write(Buffer.from([this._lastCloseCode>>8,this._lastCloseCode&255]),8);break}case 9:{this._write(message,10);break}}}};function readRange(socket,index,bytes){let head=socket._readableState.buffer.head;let cursor=0;let read=0;let num=0;do{for(const element of head.data){if(++cursor>index){num*=256;num+=element;if(++read===bytes)return num}}}while(head=head.next);throw new Error("readRange failed?")}function readETF(data,start){let view;let x=start;const loop=()=>{const type=data[x++];switch(type){case 97:{return data[x++]}case 98:{const int=data.readInt32BE(x);x+=4;return int}case 100:{const length=data.readUInt16BE(x);let atom="";if(length>30){atom=data.latin1Slice(x+=2,x+length)}else{for(let i=x+=2;i<x+length;i++){atom+=String.fromCharCode(data[i])}}x+=length;if(!atom)return void 0;if(atom==="nil"||atom==="null")return null;if(atom==="true")return true;if(atom==="false")return false;return atom}case 108:case 106:{const array=[];if(type===108){const length=data.readUInt32BE(x);x+=4;for(let i=0;i<length;i++){array.push(loop())}x++}return array}case 107:{const array=[];const length=data.readUInt16BE(x);x+=2;for(let i=0;i<length;i++){array.push(data[x++])}return array}case 109:{const length=data.readUInt32BE(x);let str="";if(length>30){str=data.utf8Slice(x+=4,x+length)}else{let i=x+=4;const l=x+length;while(i<l){const byte=data[i++];if(byte<128)str+=String.fromCharCode(byte);else if(byte<224)str+=String.fromCharCode(((byte&31)<<6)+(data[i++]&63));else if(byte<240)str+=String.fromCharCode(((byte&15)<<12)+((data[i++]&63)<<6)+(data[i++]&63));else str+=String.fromCodePoint(((byte&7)<<18)+((data[i++]&63)<<12)+((data[i++]&63)<<6)+(data[i++]&63))}}x+=length;return str}case 110:{if(!view)view=new DataView(data.buffer,data.offset,data.byteLength);const length=data[x++];const sign=data[x++];let left=length;let num=BigInt(0);while(left>0){if(left>=8){num<<=BigInt(64);num+=view.getBigUint64(x+(left-=8),true)}else if(left>=4){num<<=BigInt(32);num+=BigInt(view.getUint32(x+(left-=4)),true)}else if(left>=2){num<<=BigInt(16);num+=BigInt(view.getUint16(x+(left-=2)),true)}else{num<<=BigInt(8);num+=BigInt(data[x]);left--}}x+=length;return(sign?-num:num).toString()}case 116:{const obj={};const length=data.readUInt32BE(x);x+=4;for(let i=0;i<length;i++){const key=loop();obj[key]=loop()}return obj}}throw new Error(`Missing etf type: ${type}`)};return loop()}function writeETF(data){const b=Buffer.allocUnsafe(1<<12);b[0]=131;let i=1;const loop=obj=>{const type=typeof obj;switch(type){case"boolean":{b[i++]=100;if(obj){b.writeUInt16BE(4,i);b.latin1Write("true",i+=2);i+=4}else{b.writeUInt16BE(5,i);b.latin1Write("false",i+=2);i+=5}break}case"string":{const length=Buffer.byteLength(obj);b[i++]=109;b.writeUInt32BE(length,i);b.utf8Write(obj,i+=4);i+=length;break}case"number":{if(Number.isInteger(obj)){const abs=Math.abs(obj);if(abs<2147483648){b[i++]=98;b.writeInt32BE(obj,i);i+=4}else if(abs<Number.MAX_SAFE_INTEGER){b[i++]=110;b[i++]=8;b[i++]=Number(obj<0);b.writeBigUInt64LE(BigInt(abs),i);i+=8;break}else{b[i++]=70;b.writeDoubleBE(obj,i);i+=8}}else{b[i++]=70;b.writeDoubleBE(obj,i);i+=8}break}case"bigint":{b[i++]=110;b[i++]=8;b[i++]=Number(obj<0);b.writeBigUInt64LE(obj,i);i+=8;break}case"object":{if(obj===null){b[i++]=100;b.writeUInt16BE(3,i);b.latin1Write("nil",i+=2);i+=3}else if(Array.isArray(obj)){if(obj.length){b[i++]=108;b.writeUInt32BE(obj.length,i);i+=4;for(const item of obj){loop(item)}}b[i++]=106}else{const entries=Object.entries(obj).filter(x=>typeof x[1]!=="undefined");b[i++]=116;b.writeUInt32BE(entries.length,i);i+=4;for(const[key,value]of entries){loop(key);loop(value)}}break}}};loop(data);return Buffer.from(b.subarray(0,i))}module2.exports=BetterWs}});var Intents_exports={};__export(Intents_exports,{all:()=>all,default:()=>Intents_default,flags:()=>flags,non_privileged:()=>non_privileged,privileged:()=>privileged,resolve:()=>resolve});function resolve(bit=0){if(typeof bit==="number"&&bit>=0)return bit;if(typeof bit==="string"&&flags[bit])return flags[bit]|0;if(Array.isArray(bit))return bit.map(p=>resolve(p)).reduce((prev,p)=>prev|p,0);throw new RangeError("BITFIELD_INVALID")}var flags,privileged,all,non_privileged,Intents_default;var init_Intents=__esm({"src/Intents.ts"(){"use strict";flags={GUILDS:1<<0,GUILD_MEMBERS:1<<1,GUILD_MODERATION:1<<2,GUILD_EMOJIS_AND_STICKERS:1<<3,GUILD_INTEGRATIONS:1<<4,GUILD_WEBHOOKS:1<<5,GUILD_INVITES:1<<6,GUILD_VOICE_STATES:1<<7,GUILD_PRESENCES:1<<8,GUILD_MESSAGES:1<<9,GUILD_MESSAGE_REACTIONS:1<<10,GUILD_MESSAGE_TYPING:1<<11,DIRECT_MESSAGES:1<<12,DIRECT_MESSAGE_REACTIONS:1<<13,DIRECT_MESSAGE_TYPING:1<<14,MESSAGE_CONTENT:1<<15,GUILD_SCHEDULED_EVENTS:1<<16,AUTO_MODERATION_CONFIGURATION:1<<20,AUTO_MODERATION_EXECUTION:1<<21};privileged=flags.GUILD_MEMBERS|flags.GUILD_PRESENCES|flags.MESSAGE_CONTENT;all=Object.values(flags).reduce((acc,p)=>acc|p,0);non_privileged=all&~privileged;Intents_default={flags,privileged,all,non_privileged,resolve}}});var require_DiscordConnector=__commonJS({"src/DiscordConnector.ts"(exports2,module2){"use strict";var import_events=require("events");var import_Constants=__toESM(require_Constants());var import_v10=require("discord-api-types/v10");var BetterWs=require_BetterWs();var Intents2=(init_Intents(),__toCommonJS(Intents_exports));var resumableCodes=[4008,4005,4003,4002,4001,4e3,1006,1001];var shouldntAttemptReconnectCodes=[4014,4013,4012,4011,4010,4004];var disconnectMessages={4014:"Disallowed Intents, check your client options and application page.",4013:"Invalid Intents data, check your client options.",4012:"Invalid API version.",4011:"Shard would be on over 2500 guilds. Add more shards.",4010:"Invalid sharding data, check your client options.",4009:"Session timed out.",4008:"You are being rate limited. Wait before sending more packets.",4007:"Invalid sequence. Reconnecting and starting a new session.",4005:"You sent more than one OP 2 IDENTIFY payload while the websocket was open.",4004:"Tried to connect with an invalid token.",4003:"You tried to send a packet before sending an OP 2 IDENTIFY or OP 6 RESUME.",4002:"You sent an invalid payload.",4001:"You sent an invalid opcode or invalid payload for an opcode."};var connectionError=new Error("WS took too long to connect. Is your internet okay?");var wsStatusTypes=["Whatever 0 is. Report if you see this","connected","connecting","closing","closed"];var DiscordConnector=class extends import_events.EventEmitter{constructor(id,client){super();this.id=id;this.client=client;this.heartbeatTimeout=null;this.heartbeatInterval=0;this._trace=null;this.seq=0;this.status="disconnected";this.sessionId=null;this.lastACKAt=0;this.lastHeartbeatSend=0;this.latency=0;this.resumeAddress=null;this.reconnecting=false;this._closing=false;this._closeCalled=false;this._openToHeartbeatTimeout=null;this._initialHeartbeatTimeout=null;this.options=client.options;this.reconnect=this.options.reconnect??true;this.identifyAddress=this.options.endpoint;this.betterWs=new BetterWs(this.identifyAddress,this.options.ws);this.betterWs.on("ws_open",()=>{this.status="connecting";this.emit("stateChange","connecting");this.reconnecting=false;this._openToHeartbeatTimeout=setTimeout(()=>{this.client.emit("debug",`Shard ${this.id} didn't receive a HELLO after the ws was opened in time`);this._reconnect(true)},1e4)});this.betterWs.on("ws_receive",msg=>this.messageAction(msg));this.betterWs.on("ws_close",(code,reason)=>this.handleWsClose(code,reason));this.betterWs.on("debug",event=>this.client.emit("error",event));this.betterWs.on("ws_send",data=>this.client.emit("rawSend",data))}async connect(){this._closing=false;this._closeCalled=false;this.client.emit("debug",`Shard ${this.id} connecting to gateway`);return this.betterWs.connect().catch(e=>{if(e===connectionError)return;setTimeout(()=>{if(!this._closeCalled)this.connect()},5e3)})}async disconnect(){this._closing=true;this._closeCalled=true;return this.betterWs.close(1e3,"Disconnected by User")}async messageAction(message){this.client.emit("rawReceive",message);const withShardID=Object.assign(message,{shard_id:this.id});this.client.emit("event",withShardID);switch(withShardID.op){case import_Constants.GATEWAY_OP_CODES.DISPATCH:this.handleDispatch(withShardID);break;case import_Constants.GATEWAY_OP_CODES.HEARTBEAT:this.heartbeat();break;case import_Constants.GATEWAY_OP_CODES.RECONNECT:this.client.emit("debug",`Gateway asked shard ${this.id} to reconnect`);if(this.reconnect)this._reconnect(true);else this.disconnect();break;case import_Constants.GATEWAY_OP_CODES.INVALID_SESSION:this.client.emit("debug",`Shard ${this.id}'s session was invalidated`);if(withShardID.d&&this.sessionId)this.resume();else{this.seq=0;this.sessionId="";this.emit("queueIdentify",this.id)}break;case import_Constants.GATEWAY_OP_CODES.HELLO:if(this._openToHeartbeatTimeout)clearTimeout(this._openToHeartbeatTimeout);this.client.emit("debug",`Shard ${this.id} received HELLO`);this.lastACKAt=Date.now();this.heartbeatInterval=withShardID.d.heartbeat_interval;this._initialHeartbeatTimeout=setTimeout(()=>this.heartbeat(),this.heartbeatInterval*Math.random());this._trace=withShardID.d._trace;this._onHello();break;case import_Constants.GATEWAY_OP_CODES.HEARTBEAT_ACK:this.lastACKAt=Date.now();this.latency=this.lastACKAt-this.lastHeartbeatSend;break;default:}}async _reconnect(resume=false){var _a,_b;(_b=(_a=this.betterWs._internal).openRejector)==null?void 0:_b.call(_a,connectionError);this.reconnecting=resume;await this.betterWs.close(resume?4e3:1012,"reconnecting");if(resume){this.clearHeartBeat();if(this.resumeAddress)this.betterWs.address=this.resumeAddress;else this.betterWs.address=this.identifyAddress}else{this.reset();this.betterWs.address=this.identifyAddress}this.connect()}reset(){this.sessionId=null;this.seq=0;this.lastACKAt=0;this._trace=null;this.clearHeartBeat()}setHeartBeat(){this.heartbeatTimeout=setInterval(()=>{if(this.lastACKAt<=Date.now()-(this.heartbeatInterval+5e3)){this.client.emit("debug",`Shard ${this.id} has not received a heartbeat ACK in ${this.heartbeatInterval+5e3}ms.`);if(this.reconnect)this._reconnect(true);else this.disconnect()}else this.heartbeat()},this.heartbeatInterval)}clearHeartBeat(){if(this.heartbeatTimeout)clearInterval(this.heartbeatTimeout);if(this._initialHeartbeatTimeout)clearTimeout(this._initialHeartbeatTimeout);this.heartbeatTimeout=null;this._initialHeartbeatTimeout=null;this.heartbeatInterval=0}_onHello(){if(this.sessionId)return void this.resume();else this.emit("queueIdentify",this.id)}async identify(){if(this.betterWs.status!==1){this.client.emit("error",`Shard ${this.id} was attempting to identify when the ws was not open. Was ${wsStatusTypes[this.betterWs.status]}`);return this._reconnect(true)}this.client.emit("debug",`Shard ${this.id} is identifying`);this.status="identifying";this.emit("stateChange","identifying");const data={op:import_Constants.GATEWAY_OP_CODES.IDENTIFY,d:{token:this.options.token,properties:{os:process.platform,browser:"CloudStorm",device:"CloudStorm"},large_threshold:this.options.largeGuildThreshold,shard:[this.id,this.options.totalShards??1],intents:this.options.intents?Intents2.resolve(this.options.intents):0}};if(this.options.initialPresence)data.d.presence=this._checkPresenceData(this.options.initialPresence);return this.betterWs.sendMessage(data)}async resume(){if(this.betterWs.status!==1){this.client.emit("error",`Shard ${this.id} was attempting to resume when the ws was not open. Was ${wsStatusTypes[this.betterWs.status]}`);return this._reconnect(true)}this.client.emit("debug",`Shard ${this.id} is resuming`);this.status="resuming";this.emit("stateChange","resuming");return this.betterWs.sendMessage({op:import_Constants.GATEWAY_OP_CODES.RESUME,d:{seq:this.seq,token:this.options.token,session_id:this.sessionId}})}heartbeat(){if(this.betterWs.status!==1){this.client.emit("error",`Shard ${this.id} was attempting to heartbeat when the ws was not open. Was ${wsStatusTypes[this.betterWs.status]}`);return void this._reconnect(true)}this.betterWs.sendMessage({op:import_Constants.GATEWAY_OP_CODES.HEARTBEAT,d:this.seq===0?null:this.seq});this.lastHeartbeatSend=Date.now();if(this._initialHeartbeatTimeout){clearTimeout(this._initialHeartbeatTimeout);this._initialHeartbeatTimeout=null}if(!this.heartbeatTimeout)this.setHeartBeat()}handleDispatch(message){var _a,_b;this.client.emit("dispatch",message);if(message.s){if(message.s>this.seq+1){this.client.emit("debug",`Shard ${this.id} invalid sequence: { current: ${this.seq} message: ${message.s} }`);this.seq=message.s;this.resume()}this.seq=message.s}switch(message.t){case"READY":case"RESUMED":if(message.t==="READY"){if(message.d.resume_gateway_url)this.resumeAddress=`${message.d.resume_gateway_url}?v=${import_Constants.GATEWAY_VERSION}&encoding=${((_a=this.options.ws)==null?void 0:_a.encoding)==="etf"?"etf":"json"}${((_b=this.options.ws)==null?void 0:_b.compress)?"&compress=zlib-stream":""}`;this.sessionId=message.d.session_id}this.status="ready";this.emit("stateChange","ready");this._trace=message.d._trace;this.emit("ready",message.t==="RESUMED");break;default:}}handleWsClose(code,reason){let gracefulClose=false;this.status="disconnected";this.emit("stateChange","disconnected");this.clearHeartBeat();const isManualClose=code===1e3&&this._closing;const message=disconnectMessages[code];const isRecoverable=resumableCodes.includes(code);const shouldntReconnect=shouldntAttemptReconnectCodes.includes(code)||isManualClose;if(isRecoverable&&this.resumeAddress)this.betterWs.address=this.resumeAddress;else this.betterWs.address=this.identifyAddress;if(message)this.client.emit("error",message);if(isManualClose||this.reconnecting)gracefulClose=true;this._closing=false;this.emit("disconnect",code,reason,gracefulClose);if(!shouldntReconnect&&this.reconnect)this.connect()}async presenceUpdate(data){return this.betterWs.sendMessage({op:import_Constants.GATEWAY_OP_CODES.PRESENCE_UPDATE,d:this._checkPresenceData(data)})}async voiceStateUpdate(data){if(!data)return Promise.resolve();return this.betterWs.sendMessage({op:import_Constants.GATEWAY_OP_CODES.VOICE_STATE_UPDATE,d:this._checkVoiceStateUpdateData(data)})}async requestGuildMembers(data){return this.betterWs.sendMessage({op:import_Constants.GATEWAY_OP_CODES.REQUEST_GUILD_MEMBERS,d:this._checkRequestGuildMembersData(data)})}_checkPresenceData(data){data.status=data.status??import_v10.PresenceUpdateStatus.Online;data.activities=data.activities&&Array.isArray(data.activities)?data.activities:[];if(data.activities){for(const activity of data.activities){const index=data.activities.indexOf(activity);if(activity.type===void 0)activity.type=activity.url?1:0;if(!activity.name){if(activity.state&&activity.type===4)activity.name="Custom Status";else data.activities.splice(index,1)}}}data.afk=data.afk??false;data.since=data.since??Date.now();return data}_checkVoiceStateUpdateData(data){data.channel_id=data.channel_id??null;data.self_mute=data.self_mute??false;data.self_deaf=data.self_deaf??false;return data}_checkRequestGuildMembersData(data){const withQuery=data;const withUserIDs=data;if(!withQuery.query&&!withUserIDs.user_ids)withQuery.query="";if(withQuery.query&&withUserIDs.user_ids)delete data.query;data.limit=data.limit??10;return data}};module2.exports=DiscordConnector}});var require_Shard=__commonJS({"src/Shard.ts"(exports2,module2){"use strict";var import_events=require("events");var DC=require_DiscordConnector();var Shard=class extends import_events.EventEmitter{constructor(id,client){super();this.id=id;this.client=client;this.ready=false;this.connector=new DC(id,client);this.connector.on("disconnect",(...args)=>{this.ready=false;this.emit("disconnect",...args)});this.connector.on("ready",resume=>this.emit("ready",resume));this.connector.on("queueIdentify",()=>this.emit("queueIdentify",this.id))}get latency(){return this.connector.latency}connect(){this.connector.connect()}disconnect(){return this.connector.disconnect()}presenceUpdate(data){return this.connector.presenceUpdate(data)}voiceStateUpdate(data){return this.connector.voiceStateUpdate(data)}requestGuildMembers(data){return this.connector.requestGuildMembers(data)}};module2.exports=Shard}});var require_ShardManager=__commonJS({"src/ShardManager.ts"(exports2,module2){"use strict";var import_snowtransfer=require("snowtransfer");var Shard=require_Shard();var ShardManager=class{constructor(client){this.client=client;this.shards={};this.identifyBucket=new import_snowtransfer.LocalBucket(1e3,1e3*60*60*24);this.concurrencyBucket=null;this.options=client.options}spawn(){if(!this.concurrencyBucket)throw new Error("Trying to spawn shards without calling Client.connect()");for(const id of this.options.shards==="auto"?Array(this.options.totalShards).fill(0).map((_,index)=>index):this.options.shards??[0]){this.client.emit("debug",`Spawned shard ${id}`);this.shards[id]=new Shard(id,this.client);this._addListener(this.shards[id]);this.shards[id].connector.connect()}}disconnect(){for(const shardKey in this.shards){this.shards[shardKey].disconnect()}}_addListener(shard){shard.on("ready",resume=>{shard.ready=true;this.client.emit("debug",`Shard ${shard.id} ${resume?"has resumed":"is ready"}`);this.client.emit("shardReady",{id:shard.id,ready:!resume});this._checkReady()});shard.on("queueIdentify",shardId=>{var _a;if(!this.shards[shardId])return this.client.emit("debug",`Received a queueIdentify event for shard ${shardId} but it does not exist. Was it removed?`);this.client.emit("debug",`Shard ${shardId} is ready to identify`);if(shard.connector.reconnecting)return shard.connector.resume();(_a=this.concurrencyBucket)==null?void 0:_a.queue(()=>{this.identifyBucket.queue(()=>this.shards[shardId].connector.identify())})});shard.on("disconnect",(code,reason,gracefulClose)=>{this.client.emit("debug",`Websocket of shard ${shard.id} closed with code ${code} and reason: ${reason??"None"}`);if(code===1e3&&gracefulClose)return this._checkDisconnect()})}_checkReady(){for(const shardId in this.shards){if(this.shards[shardId]){if(!this.shards[shardId].ready)return}}this.client.emit("ready")}_checkDisconnect(){for(const shardId in this.shards){if(this.shards[shardId]){if(this.shards[shardId].connector.status!=="disconnected")return}}this.client.emit("disconnected")}async presenceUpdate(data){for(const shardKey in this.shards){if(this.shards[shardKey]){const shard=this.shards[shardKey];this.shardPresenceUpdate(shard.id,data)}}}shardPresenceUpdate(shardId,data){return new Promise((res,rej)=>{const shard=this.shards[shardId];if(!shard)rej(new Error(`Shard ${shardId} does not exist`));if(!shard.ready)return;shard.presenceUpdate(data).then(result=>res(result)).catch(e=>rej(e))})}voiceStateUpdate(shardId,data){return new Promise((res,rej)=>{const shard=this.shards[shardId];if(!shard)rej(new Error(`Shard ${shardId} does not exist`));if(!shard.ready)return;shard.voiceStateUpdate(data).then(result=>res(result)).catch(e=>rej(e))})}requestGuildMembers(shardId,data){return new Promise((res,rej)=>{const shard=this.shards[shardId];if(!shard)rej(new Error(`Shard ${shardId} does not exist`));if(!shard.ready)return;shard.requestGuildMembers(data).then(result=>res(result)).catch(e=>rej(e))})}};module2.exports=ShardManager}});var require_Client=__commonJS({"src/Client.ts"(exports2,module2){"use strict";var import_events=require("events");var import_snowtransfer=require("snowtransfer");var version=require_package().version;var Constants2=require_Constants();var ShardManager=require_ShardManager();var Client=class extends import_events.EventEmitter{constructor(token,options={}){super();this.version=version;if(!token)throw new Error("Missing token!");this.options={largeGuildThreshold:250,shards:"auto",reconnect:true,intents:0,token:"",ws:{compress:true,encoding:"json"}};this._restClient=options.snowtransferInstance?options.snowtransferInstance:new import_snowtransfer.SnowTransfer(token);delete options.snowtransferInstance;this.token=token.startsWith("Bot ")?token.substring(4):token;Object.assign(this.options,options);this.options.token=token;this.shardManager=new ShardManager(this)}async connect(){const initial=await this.fetchConnectInfo();if(this.options.shards==="auto")this.options.totalShards=initial;this.shardManager.spawn()}async fetchConnectInfo(){var _a;const gateway=await this.getGatewayBot();this._updateEndpoint(gateway.url);const oldQueueConcurrency=[];const oldQueueIdentify=[];if((_a=this.shardManager.concurrencyBucket)==null?void 0:_a.fnQueue.length){oldQueueConcurrency.push(...this.shardManager.concurrencyBucket.fnQueue);this.shardManager.concurrencyBucket.dropQueue()}if(this.shardManager.identifyBucket.fnQueue.length)oldQueueIdentify.push(...this.shardManager.identifyBucket.fnQueue);this.shardManager.identifyBucket.dropQueue();this.shardManager.concurrencyBucket=new import_snowtransfer.LocalBucket(gateway.session_start_limit.max_concurrency,5e3);this.shardManager.identifyBucket.remaining=gateway.session_start_limit.remaining;this.shardManager.identifyBucket.reset=gateway.session_start_limit.reset_after;for(const fn of oldQueueConcurrency){this.shardManager.concurrencyBucket.queue(fn)}for(const fn of oldQueueIdentify){this.shardManager.identifyBucket.queue(fn)}return gateway.shards}async getGateway(){const gatewayData=await this._restClient.bot.getGateway();return gatewayData.url}async getGatewayBot(){return this._restClient.bot.getGatewayBot()}disconnect(){return this.shardManager.disconnect()}async presenceUpdate(data){return this.shardManager.presenceUpdate(data)}shardStatusUpdate(shardId,data){return this.shardManager.shardPresenceUpdate(shardId,data)}voiceStateUpdate(shardId,data){return this.shardManager.voiceStateUpdate(shardId,data)}requestGuildMembers(shardId,data){if(!data.guild_id)throw new Error("You need to pass a guild_id");return this.shardManager.requestGuildMembers(shardId,data)}_updateEndpoint(gatewayUrl){var _a,_b;this.options.endpoint=`${gatewayUrl}?v=${Constants2.GATEWAY_VERSION}&encoding=${((_a=this.options.ws)==null?void 0:_a.encoding)==="etf"?"etf":"json"}${((_b=this.options.ws)==null?void 0:_b.compress)?"&compress=zlib-stream":""}`}};module2.exports=Client}});var src_exports={};__export(src_exports,{BetterWs:()=>BetterWs2,Client:()=>Client2,Constants:()=>Constants,Intents:()=>Intents,Shard:()=>Shard2,ShardManager:()=>ShardManager2});module.exports=__toCommonJS(src_exports);var Client2=require_Client();var Constants=require_Constants();var Intents=(init_Intents(),__toCommonJS(Intents_exports));var Shard2=require_Shard();var ShardManager2=require_ShardManager();var BetterWs2=require_BetterWs();0&&(module.exports={BetterWs,Client,Constants,Intents,Shard,ShardManager});
1
+ 'use strict';
2
+
3
+ var events = require('events');
4
+ var crypto = require('crypto');
5
+ var zlib = require('zlib');
6
+ var snowtransfer = require('snowtransfer');
7
+ var v10 = require('discord-api-types/v10');
8
+
9
+ var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty;var __require=(x=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(x,{get:(a,b)=>(typeof require<"u"?require:a)[b]}):x)(function(x){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+x+'" is not supported')});var __esm=(fn,res)=>function(){return fn&&(res=(0, fn[__getOwnPropNames(fn)[0]])(fn=0)),res};var __commonJS=(cb,mod)=>function(){return mod||(0, cb[__getOwnPropNames(cb)[0]])((mod={exports:{}}).exports,mod),mod.exports};var __export=(target,all2)=>{for(var name in all2)__defProp(target,name,{get:all2[name],enumerable:!0});},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[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:!0}):target,mod)),__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod);var require_Constants=__commonJS({"src/Constants.ts"(exports,module){var Constants2={GATEWAY_OP_CODES:{DISPATCH:0,HEARTBEAT:1,IDENTIFY:2,PRESENCE_UPDATE:3,VOICE_STATE_UPDATE:4,RESUME:6,RECONNECT:7,REQUEST_GUILD_MEMBERS:8,INVALID_SESSION:9,HELLO:10,HEARTBEAT_ACK:11},GATEWAY_VERSION:10};module.exports=Constants2;}});var require_BetterWs=__commonJS({"src/BetterWs.ts"(exports,module){var import_Constants=__toESM(require_Constants()),https=__require("https"),http=__require("http"),util=__require("util"),BetterWs=class extends events.EventEmitter{constructor(address,options){super();this.address=address;this.options=options;this.wsBucket=new snowtransfer.LocalBucket(120,6e4);this.presenceBucket=new snowtransfer.LocalBucket(5,6e4);this._socket=null;this._internal={openRejector:null,closePromise:null,zlib:null};this._connecting=!1;this._lastCloseCode=null;this._lastCloseReason=null;this.encoding=options.encoding??"other",this.compress=options.compress??!1;}get status(){let internal=this._internal;return this._connecting?2:internal.closePromise?3:this._socket?1:4}connect(){if(this._socket||this._connecting)return Promise.resolve(void 0);this._connecting=!0;let key=crypto.randomBytes(16).toString("base64"),url=new URL(this.address),useHTTPS=url.protocol==="https:"||url.protocol==="wss:"||url.port==="443",port=url.port||(useHTTPS?"443":"80"),req=(useHTTPS?https:http).request({hostname:url.hostname,path:`${url.pathname}${url.search}`,port,headers:{Connection:"Upgrade",Upgrade:"websocket","Sec-WebSocket-Key":key,"Sec-WebSocket-Version":"13",...this.options.headers}}),onErrorRef,cameFromOnError=!1;return new Promise((resolve2,reject)=>{this._internal.openRejector=reject;let upgrade=this._onUpgrade.bind(this,key,req,resolve2,reject);onErrorRef=e=>{this._internal.openRejector=null,cameFromOnError=!0,this._connecting=!1,req.removeListener("upgrade",upgrade),reject(e);},req.once("upgrade",upgrade),req.once("error",onErrorRef),req.end();}).catch(reason=>(onErrorRef&&!cameFromOnError&&(req.destroy(),req.removeListener("error",onErrorRef),onErrorRef(reason)),Promise.reject(reason)))}async close(code,reason){let internal=this._internal;if(internal.closePromise)return internal.closePromise;if(!this._socket)return Promise.resolve(void 0);let resolver,promise=new Promise(resolve2=>{resolver=resolve2;let from=Buffer.from([code>>8,code&255]);this._write(reason?Buffer.concat([from,Buffer.from(reason)]):from,8);}).then(()=>{internal.closePromise=null;});return promise.resolve=resolver,internal.closePromise=promise,promise}sendMessage(data){return new Promise(res=>{let presence=(data==null?void 0:data.op)===import_Constants.GATEWAY_OP_CODES.PRESENCE_UPDATE,sendMsg=()=>{let fn=()=>{this.emit("ws_send",data),this.encoding==="json"?this._write(Buffer.from(JSON.stringify(data)),1):this.encoding==="etf"?this._write(writeETF(data),2):this.encoding==="other"&&this._write(Buffer.from(data),2),res(void 0);};this.options.bypassBuckets?fn():this.wsBucket.queue(fn);};presence&&!this.options.bypassBuckets?this.presenceBucket.queue(sendMsg):sendMsg();})}_write(packet,opcode){let socket=this._socket;if(!(socket!=null&&socket.writable))return;let length=packet.length,frame;length<126?(frame=Buffer.allocUnsafe(6+length),frame[1]=128+length):length<65536?(frame=Buffer.allocUnsafe(8+length),frame[1]=254,frame[2]=length>>8,frame[3]=length&255):(frame=Buffer.allocUnsafe(14+length),frame[1]=255,frame.writeBigUInt64BE(BigInt(length),2)),frame[0]=128+opcode,frame.writeUInt32BE(0,frame.length-length-4),frame.set(packet,frame.length-length),socket.write(frame);}_onUpgrade(key,req,resolve2,reject,res,socket){this._internal.openRejector=null;let hash=crypto.createHash("sha1").update(key+"258EAFA5-E914-47DA-95CA-C5AB0DC85B11").digest("base64"),accept=res.headers["sec-websocket-accept"];if(hash!==accept){socket.end(()=>{this.emit("debug","Failed websocket-key validation"),this._connecting=!1,reject(new Error(`Invalid Sec-Websocket-Accept | expected: ${hash} | received: ${accept}`));});return}if(socket.once("error",this._onError.bind(this)),socket.once("close",this._onClose.bind(this)),socket.on("readable",this._onReadable.bind(this)),this._socket=socket,this._connecting=!1,this.compress){let z=zlib.createInflate();z._c=z.close,z._h=z._handle,z._hc=z._handle.close,z._v=()=>{},this._internal.zlib=z;}this.emit("ws_open"),resolve2(void 0),req.removeAllListeners("error");}_onError(error){this._socket&&(this.emit("debug",util.inspect(error,!0,1,!1)),this._write(Buffer.allocUnsafe(0),8));}_onClose(){let socket=this._socket,internal=this._internal;socket&&(socket.removeListener("data",this._onReadable),socket.removeListener("error",this._onError),this.wsBucket.dropQueue(),this.presenceBucket.dropQueue(),this._socket=null,this.emit("ws_close",this._lastCloseCode??1006,this._lastCloseReason??"Abnormal Closure"),this._lastCloseCode=null,this._lastCloseReason=null,internal.zlib&&(internal.zlib.close(),internal.zlib=null),internal.closePromise&&internal.closePromise.resolve(void 0));}_onReadable(){let socket=this._socket;for(;((socket==null?void 0:socket.readableLength)||0)>1;){let length=readRange(socket,1,1)&127,bytes=0;if(length>125){if(bytes=length===126?2:8,socket.readableLength<2+bytes)return;length=readRange(socket,2,bytes);}let frame=socket.read(2+bytes+length);if(!frame)return;let fin=frame[0]>>7,opcode=frame[0]&15;(fin!==1||opcode===0)&&this.emit("debug","discord actually does send messages with fin=0. if you see this error let me know");let payload=frame.subarray(2+bytes);this._processFrame(opcode,payload);}}_processFrame(opcode,message){let internal=this._internal;switch(opcode){case 1:{let packet;this.encoding==="json"?packet=JSON.parse(message.toString()):this.encoding==="other"&&(packet=message),this.emit("ws_receive",packet);break}case 2:{let packet;if(this.compress){let z=internal.zlib,error=null,data=null;z.close=z._handle.close=z._v;try{data=z._processChunk(message,zlib.constants.Z_SYNC_FLUSH);}catch(e){error=e;}let l=message.length;if((message[l-4]!==0||message[l-3]!==0||message[l-2]!==255||message[l-1]!==255)&&this.emit("debug","discord actually does send fragmented zlib messages. If you see this error let me know"),z.close=z._c,z._handle=z._h,z._handle.close=z._hc,z._events.error=void 0,z._eventCount--,z.removeAllListeners("error"),error){this.emit("debug","Zlib error processing chunk"),this._write(Buffer.allocUnsafe(0),8);return}if(!data){this.emit("debug","Data from zlib processing was null. If you see this error let me know");return}this.encoding==="json"?packet=JSON.parse(String(data)):this.encoding==="etf"?packet=readETF(data,1):this.encoding==="other"&&(packet=data);}else this.encoding==="json"?packet=JSON.parse(zlib.inflateSync(message).toString()):this.encoding==="etf"?packet=readETF(message,1):this.encoding==="other"&&(packet=message);this.emit("ws_receive",packet);break}case 8:{this._lastCloseCode=message.length>1?(message[0]<<8)+message[1]:0,this._lastCloseReason=message.length>2?message.subarray(2).toString():"",this._write(Buffer.from([this._lastCloseCode>>8,this._lastCloseCode&255]),8);break}case 9:{this._write(message,10);break}}}};function readRange(socket,index,bytes){let cursor=0,read=0,num=0,readable=socket._readableState,currentBufferIndex=readable.bufferIndex,currentBuffer=readable.buffer.head??readable.buffer[currentBufferIndex];do{let data=currentBuffer.data??currentBuffer;for(let element of data)if(++cursor>index&&(num*=256,num+=element,++read===bytes))return num}while(currentBuffer=currentBuffer.next??readable.buffer[++currentBufferIndex]);throw new Error("readRange failed?")}function readETF(data,start){let view,x=start,loop=()=>{let type=data[x++];switch(type){case 97:return data[x++];case 98:{let int=data.readInt32BE(x);return x+=4,int}case 100:{let length=data.readUInt16BE(x),atom="";if(length>30)atom=data.latin1Slice(x+=2,x+length);else for(let i=x+=2;i<x+length;i++)atom+=String.fromCharCode(data[i]);return x+=length,atom?atom==="nil"||atom==="null"?null:atom==="true"?!0:atom==="false"?!1:atom:void 0}case 108:case 106:{let array=[];if(type===108){let length=data.readUInt32BE(x);x+=4;for(let i=0;i<length;i++)array.push(loop());x++;}return array}case 107:{let array=[],length=data.readUInt16BE(x);x+=2;for(let i=0;i<length;i++)array.push(data[x++]);return array}case 109:{let length=data.readUInt32BE(x),str="";if(length>30)str=data.utf8Slice(x+=4,x+length);else {let i=x+=4,l=x+length;for(;i<l;){let byte=data[i++];byte<128?str+=String.fromCharCode(byte):byte<224?str+=String.fromCharCode(((byte&31)<<6)+(data[i++]&63)):byte<240?str+=String.fromCharCode(((byte&15)<<12)+((data[i++]&63)<<6)+(data[i++]&63)):str+=String.fromCodePoint(((byte&7)<<18)+((data[i++]&63)<<12)+((data[i++]&63)<<6)+(data[i++]&63));}}return x+=length,str}case 110:{view||(view=new DataView(data.buffer,data.offset,data.byteLength));let length=data[x++],sign=data[x++],left=length,num=BigInt(0);for(;left>0;)left>=8?(num<<=BigInt(64),num+=view.getBigUint64(x+(left-=8),!0)):left>=4?(num<<=BigInt(32),num+=BigInt(view.getUint32(x+(left-=4)),!0)):left>=2?(num<<=BigInt(16),num+=BigInt(view.getUint16(x+(left-=2)),!0)):(num<<=BigInt(8),num+=BigInt(data[x]),left--);return x+=length,(sign?-num:num).toString()}case 116:{let obj={},length=data.readUInt32BE(x);x+=4;for(let i=0;i<length;i++){let key=loop();obj[key]=loop();}return obj}}throw new Error(`Missing etf type: ${type}`)};return loop()}function writeETF(data){let b=Buffer.allocUnsafe(4096);b[0]=131;let i=1,loop=obj=>{switch(typeof obj){case"boolean":{b[i++]=100,obj?(b.writeUInt16BE(4,i),b.latin1Write("true",i+=2),i+=4):(b.writeUInt16BE(5,i),b.latin1Write("false",i+=2),i+=5);break}case"string":{let length=Buffer.byteLength(obj);b[i++]=109,b.writeUInt32BE(length,i),b.utf8Write(obj,i+=4),i+=length;break}case"number":{if(Number.isInteger(obj)){let abs=Math.abs(obj);if(abs<2147483648)b[i++]=98,b.writeInt32BE(obj,i),i+=4;else if(abs<Number.MAX_SAFE_INTEGER){b[i++]=110,b[i++]=8,b[i++]=+(obj<0),b.writeBigUInt64LE(BigInt(abs),i),i+=8;break}else b[i++]=70,b.writeDoubleBE(obj,i),i+=8;}else b[i++]=70,b.writeDoubleBE(obj,i),i+=8;break}case"bigint":{b[i++]=110,b[i++]=8,b[i++]=+(obj<0),b.writeBigUInt64LE(obj,i),i+=8;break}case"object":{if(obj===null)b[i++]=100,b.writeUInt16BE(3,i),b.latin1Write("nil",i+=2),i+=3;else if(Array.isArray(obj)){if(obj.length){b[i++]=108,b.writeUInt32BE(obj.length,i),i+=4;for(let item of obj)loop(item);}b[i++]=106;}else {let entries=Object.entries(obj).filter(x=>typeof x[1]<"u");b[i++]=116,b.writeUInt32BE(entries.length,i),i+=4;for(let[key,value]of entries)loop(key),loop(value);}break}}};return loop(data),Buffer.from(b.subarray(0,i))}module.exports=BetterWs;}});var Intents_exports={};__export(Intents_exports,{all:()=>all,default:()=>Intents_default,flags:()=>flags,non_privileged:()=>non_privileged,privileged:()=>privileged,resolve:()=>resolve});function resolve(bit=0){if(typeof bit=="number"&&bit>=0)return bit;if(typeof bit=="string"&&flags[bit])return flags[bit]|0;if(Array.isArray(bit))return bit.map(p=>resolve(p)).reduce((prev,p)=>prev|p,0);throw new RangeError("BITFIELD_INVALID")}var flags,privileged,all,non_privileged,Intents_default,init_Intents=__esm({"src/Intents.ts"(){flags={GUILDS:1,GUILD_MEMBERS:2,GUILD_MODERATION:4,GUILD_EMOJIS_AND_STICKERS:8,GUILD_INTEGRATIONS:16,GUILD_WEBHOOKS:32,GUILD_INVITES:64,GUILD_VOICE_STATES:128,GUILD_PRESENCES:256,GUILD_MESSAGES:512,GUILD_MESSAGE_REACTIONS:1024,GUILD_MESSAGE_TYPING:2048,DIRECT_MESSAGES:4096,DIRECT_MESSAGE_REACTIONS:8192,DIRECT_MESSAGE_TYPING:16384,MESSAGE_CONTENT:32768,GUILD_SCHEDULED_EVENTS:65536,AUTO_MODERATION_CONFIGURATION:1048576,AUTO_MODERATION_EXECUTION:2097152},privileged=flags.GUILD_MEMBERS|flags.GUILD_PRESENCES|flags.MESSAGE_CONTENT,all=Object.values(flags).reduce((acc,p)=>acc|p,0),non_privileged=all&~privileged;Intents_default={flags,privileged,all,non_privileged,resolve};}});var require_DiscordConnector=__commonJS({"src/DiscordConnector.ts"(exports,module){var import_Constants=__toESM(require_Constants()),BetterWs=require_BetterWs(),Intents2=(init_Intents(),__toCommonJS(Intents_exports)),resumableCodes=[4008,4005,4003,4002,4001,4e3,1006,1001],shouldntAttemptReconnectCodes=[4014,4013,4012,4011,4010,4004],disconnectMessages={4014:"Disallowed Intents, check your client options and application page.",4013:"Invalid Intents data, check your client options.",4012:"Invalid API version.",4011:"Shard would be on over 2500 guilds. Add more shards.",4010:"Invalid sharding data, check your client options.",4009:"Session timed out.",4008:"You are being rate limited. Wait before sending more packets.",4007:"Invalid sequence. Reconnecting and starting a new session.",4005:"You sent more than one OP 2 IDENTIFY payload while the websocket was open.",4004:"Tried to connect with an invalid token.",4003:"You tried to send a packet before sending an OP 2 IDENTIFY or OP 6 RESUME.",4002:"You sent an invalid payload.",4001:"You sent an invalid opcode or invalid payload for an opcode."},connectionError=new Error("WS took too long to connect. Is your internet okay?"),wsStatusTypes=["Whatever 0 is. Report if you see this","connected","connecting","closing","closed"],DiscordConnector=class extends events.EventEmitter{constructor(id,client){super();this.id=id;this.client=client;this.heartbeatTimeout=null;this.heartbeatInterval=0;this._trace=null;this.seq=0;this.status="disconnected";this.sessionId=null;this.lastACKAt=0;this.lastHeartbeatSend=0;this.latency=0;this.resumeAddress=null;this.reconnecting=!1;this._closing=!1;this._closeCalled=!1;this._openToHeartbeatTimeout=null;this._initialHeartbeatTimeout=null;this.options=client.options,this.reconnect=this.options.reconnect??!0,this.identifyAddress=this.options.endpoint,this.betterWs=new BetterWs(this.identifyAddress,this.options.ws),this.betterWs.on("ws_open",()=>{this.status="connecting",this.emit("stateChange","connecting"),this.reconnecting=!1,this._openToHeartbeatTimeout=setTimeout(()=>{this.client.emit("debug",`Shard ${this.id} didn't receive a HELLO after the ws was opened in time`),this._reconnect(!0);},1e4);}),this.betterWs.on("ws_receive",msg=>this.messageAction(msg)),this.betterWs.on("ws_close",(code,reason)=>this.handleWsClose(code,reason)),this.betterWs.on("debug",event=>this.client.emit("error",event)),this.betterWs.on("ws_send",data=>this.client.emit("rawSend",data));}async connect(){return this._closing=!1,this._closeCalled=!1,this.client.emit("debug",`Shard ${this.id} connecting to gateway`),this.betterWs.connect().catch(e=>{e!==connectionError&&setTimeout(()=>{this._closeCalled||this.connect();},5e3);})}async disconnect(){return this._closing=!0,this._closeCalled=!0,this.betterWs.close(1e3,"Disconnected by User")}async messageAction(message){this.client.emit("rawReceive",message);let withShardID=Object.assign(message,{shard_id:this.id});switch(this.client.emit("event",withShardID),withShardID.op){case import_Constants.GATEWAY_OP_CODES.DISPATCH:this.handleDispatch(withShardID);break;case import_Constants.GATEWAY_OP_CODES.HEARTBEAT:this.heartbeat();break;case import_Constants.GATEWAY_OP_CODES.RECONNECT:this.client.emit("debug",`Gateway asked shard ${this.id} to reconnect`),this.reconnect?this._reconnect(!0):this.disconnect();break;case import_Constants.GATEWAY_OP_CODES.INVALID_SESSION:this.client.emit("debug",`Shard ${this.id}'s session was invalidated`),withShardID.d&&this.sessionId?this.resume():(this.seq=0,this.sessionId="",this.emit("queueIdentify",this.id));break;case import_Constants.GATEWAY_OP_CODES.HELLO:this._openToHeartbeatTimeout&&clearTimeout(this._openToHeartbeatTimeout),this.client.emit("debug",`Shard ${this.id} received HELLO`),this.lastACKAt=Date.now(),this.heartbeatInterval=withShardID.d.heartbeat_interval,this._initialHeartbeatTimeout=setTimeout(()=>this.heartbeat(),this.heartbeatInterval*Math.random()),this._trace=withShardID.d._trace,this._onHello();break;case import_Constants.GATEWAY_OP_CODES.HEARTBEAT_ACK:this.lastACKAt=Date.now(),this.latency=this.lastACKAt-this.lastHeartbeatSend;break;}}async _reconnect(resume=!1){var _a,_b;(_b=(_a=this.betterWs._internal).openRejector)==null||_b.call(_a,connectionError),this.reconnecting=resume,await this.betterWs.close(resume?4e3:1012,"reconnecting"),resume?(this.clearHeartBeat(),this.resumeAddress?this.betterWs.address=this.resumeAddress:this.betterWs.address=this.identifyAddress):(this.reset(),this.betterWs.address=this.identifyAddress),this.connect();}reset(){this.sessionId=null,this.seq=0,this.lastACKAt=0,this._trace=null,this.clearHeartBeat();}setHeartBeat(){this.heartbeatTimeout=setInterval(()=>{this.lastACKAt<=Date.now()-(this.heartbeatInterval+5e3)?(this.client.emit("debug",`Shard ${this.id} has not received a heartbeat ACK in ${this.heartbeatInterval+5e3}ms.`),this.reconnect?this._reconnect(!0):this.disconnect()):this.heartbeat();},this.heartbeatInterval);}clearHeartBeat(){this.heartbeatTimeout&&clearInterval(this.heartbeatTimeout),this._initialHeartbeatTimeout&&clearTimeout(this._initialHeartbeatTimeout),this.heartbeatTimeout=null,this._initialHeartbeatTimeout=null,this.heartbeatInterval=0;}_onHello(){if(this.sessionId)return void this.resume();this.emit("queueIdentify",this.id);}async identify(){if(this.betterWs.status!==1)return this.client.emit("error",`Shard ${this.id} was attempting to identify when the ws was not open. Was ${wsStatusTypes[this.betterWs.status]}`),this._reconnect(!0);this.client.emit("debug",`Shard ${this.id} is identifying`),this.status="identifying",this.emit("stateChange","identifying");let data={op:import_Constants.GATEWAY_OP_CODES.IDENTIFY,d:{token:this.options.token,properties:{os:process.platform,browser:"CloudStorm",device:"CloudStorm"},large_threshold:this.options.largeGuildThreshold,shard:[this.id,this.options.totalShards??1],intents:this.options.intents?Intents2.resolve(this.options.intents):0}};return this.options.initialPresence&&(data.d.presence=this._checkPresenceData(this.options.initialPresence)),this.betterWs.sendMessage(data)}async resume(){return this.betterWs.status!==1?(this.client.emit("error",`Shard ${this.id} was attempting to resume when the ws was not open. Was ${wsStatusTypes[this.betterWs.status]}`),this._reconnect(!0)):(this.client.emit("debug",`Shard ${this.id} is resuming`),this.status="resuming",this.emit("stateChange","resuming"),this.betterWs.sendMessage({op:import_Constants.GATEWAY_OP_CODES.RESUME,d:{seq:this.seq,token:this.options.token,session_id:this.sessionId}}))}heartbeat(){if(this.betterWs.status!==1)return this.client.emit("error",`Shard ${this.id} was attempting to heartbeat when the ws was not open. Was ${wsStatusTypes[this.betterWs.status]}`),void this._reconnect(!0);this.betterWs.sendMessage({op:import_Constants.GATEWAY_OP_CODES.HEARTBEAT,d:this.seq===0?null:this.seq}),this.lastHeartbeatSend=Date.now(),this._initialHeartbeatTimeout&&(clearTimeout(this._initialHeartbeatTimeout),this._initialHeartbeatTimeout=null),this.heartbeatTimeout||this.setHeartBeat();}handleDispatch(message){var _a,_b;switch(this.client.emit("dispatch",message),message.s&&(message.s>this.seq+1&&(this.client.emit("debug",`Shard ${this.id} invalid sequence: { current: ${this.seq} message: ${message.s} }`),this.seq=message.s,this.resume()),this.seq=message.s),message.t){case"READY":case"RESUMED":message.t==="READY"&&(message.d.resume_gateway_url&&(this.resumeAddress=`${message.d.resume_gateway_url}?v=${import_Constants.GATEWAY_VERSION}&encoding=${((_a=this.options.ws)==null?void 0:_a.encoding)==="etf"?"etf":"json"}${(_b=this.options.ws)!=null&&_b.compress?"&compress=zlib-stream":""}`),this.sessionId=message.d.session_id),this.status="ready",this.emit("stateChange","ready"),this._trace=message.d._trace,this.emit("ready",message.t==="RESUMED");break;}}handleWsClose(code,reason){let gracefulClose=!1;this.status="disconnected",this.emit("stateChange","disconnected"),this.clearHeartBeat();let isManualClose=code===1e3&&this._closing,message=disconnectMessages[code],isRecoverable=resumableCodes.includes(code),shouldntReconnect=shouldntAttemptReconnectCodes.includes(code)||isManualClose;isRecoverable&&this.resumeAddress?this.betterWs.address=this.resumeAddress:this.betterWs.address=this.identifyAddress,message&&this.client.emit("error",message),(isManualClose||this.reconnecting)&&(gracefulClose=!0),this._closing=!1,this.emit("disconnect",code,reason,gracefulClose),!shouldntReconnect&&this.reconnect&&this.connect();}async presenceUpdate(data){return this.betterWs.sendMessage({op:import_Constants.GATEWAY_OP_CODES.PRESENCE_UPDATE,d:this._checkPresenceData(data)})}async voiceStateUpdate(data){return data?this.betterWs.sendMessage({op:import_Constants.GATEWAY_OP_CODES.VOICE_STATE_UPDATE,d:this._checkVoiceStateUpdateData(data)}):Promise.resolve()}async requestGuildMembers(data){return this.betterWs.sendMessage({op:import_Constants.GATEWAY_OP_CODES.REQUEST_GUILD_MEMBERS,d:this._checkRequestGuildMembersData(data)})}_checkPresenceData(data){if(data.status=data.status??v10.PresenceUpdateStatus.Online,data.activities=data.activities&&Array.isArray(data.activities)?data.activities:[],data.activities)for(let activity of data.activities){let index=data.activities.indexOf(activity);activity.type===void 0&&(activity.type=activity.url?1:0),activity.name||(activity.state&&activity.type===4?activity.name="Custom Status":data.activities.splice(index,1));}return data.afk=data.afk??!1,data.since=data.since??Date.now(),data}_checkVoiceStateUpdateData(data){return data.channel_id=data.channel_id??null,data.self_mute=data.self_mute??!1,data.self_deaf=data.self_deaf??!1,data}_checkRequestGuildMembersData(data){let withQuery=data,withUserIDs=data;return !withQuery.query&&!withUserIDs.user_ids&&(withQuery.query=""),withQuery.query&&withUserIDs.user_ids&&delete data.query,data.limit=data.limit??10,data}};module.exports=DiscordConnector;}});var require_Shard=__commonJS({"src/Shard.ts"(exports,module){var DC=require_DiscordConnector(),Shard=class extends events.EventEmitter{constructor(id,client){super();this.id=id;this.client=client;this.ready=!1;this.connector=new DC(id,client),this.connector.on("disconnect",(...args)=>{this.ready=!1,this.emit("disconnect",...args);}),this.connector.on("ready",resume=>this.emit("ready",resume)),this.connector.on("queueIdentify",()=>this.emit("queueIdentify",this.id));}get latency(){return this.connector.latency}connect(){this.connector.connect();}disconnect(){return this.connector.disconnect()}presenceUpdate(data){return this.connector.presenceUpdate(data)}voiceStateUpdate(data){return this.connector.voiceStateUpdate(data)}requestGuildMembers(data){return this.connector.requestGuildMembers(data)}};module.exports=Shard;}});var require_ShardManager=__commonJS({"src/ShardManager.ts"(exports,module){var Shard=require_Shard(),ShardManager=class{constructor(client){this.client=client;this.shards={};this.identifyBucket=new snowtransfer.LocalBucket(1e3,1e3*60*60*24);this.concurrencyBucket=null;this.options=client.options;}spawn(){if(!this.concurrencyBucket)throw new Error("Trying to spawn shards without calling Client.connect()");for(let id of this.options.shards==="auto"?Array(this.options.totalShards).fill(0).map((_,index)=>index):this.options.shards??[0])this.client.emit("debug",`Spawned shard ${id}`),this.shards[id]=new Shard(id,this.client),this._addListener(this.shards[id]),this.shards[id].connector.connect();}disconnect(){for(let shardKey in this.shards)this.shards[shardKey].disconnect();}_addListener(shard){shard.on("ready",resume=>{shard.ready=!0,this.client.emit("debug",`Shard ${shard.id} ${resume?"has resumed":"is ready"}`),this.client.emit("shardReady",{id:shard.id,ready:!resume}),this._checkReady();}),shard.on("queueIdentify",shardId=>{var _a;if(!this.shards[shardId])return this.client.emit("debug",`Received a queueIdentify event for shard ${shardId} but it does not exist. Was it removed?`);if(this.client.emit("debug",`Shard ${shardId} is ready to identify`),shard.connector.reconnecting)return shard.connector.resume();(_a=this.concurrencyBucket)==null||_a.queue(()=>{this.identifyBucket.queue(()=>this.shards[shardId].connector.identify());});}),shard.on("disconnect",(code,reason,gracefulClose)=>{if(this.client.emit("debug",`Websocket of shard ${shard.id} closed with code ${code} and reason: ${reason??"None"}`),code===1e3&&gracefulClose)return this._checkDisconnect()});}_checkReady(){for(let shardId in this.shards)if(this.shards[shardId]&&!this.shards[shardId].ready)return;this.client.emit("ready");}_checkDisconnect(){for(let shardId in this.shards)if(this.shards[shardId]&&this.shards[shardId].connector.status!=="disconnected")return;this.client.emit("disconnected");}async presenceUpdate(data){for(let shardKey in this.shards)if(this.shards[shardKey]){let shard=this.shards[shardKey];this.shardPresenceUpdate(shard.id,data);}}shardPresenceUpdate(shardId,data){return new Promise((res,rej)=>{let shard=this.shards[shardId];shard||rej(new Error(`Shard ${shardId} does not exist`)),shard.ready&&shard.presenceUpdate(data).then(result=>res(result)).catch(e=>rej(e));})}voiceStateUpdate(shardId,data){return new Promise((res,rej)=>{let shard=this.shards[shardId];shard||rej(new Error(`Shard ${shardId} does not exist`)),shard.ready&&shard.voiceStateUpdate(data).then(result=>res(result)).catch(e=>rej(e));})}requestGuildMembers(shardId,data){return new Promise((res,rej)=>{let shard=this.shards[shardId];shard||rej(new Error(`Shard ${shardId} does not exist`)),shard.ready&&shard.requestGuildMembers(data).then(result=>res(result)).catch(e=>rej(e));})}};module.exports=ShardManager;}});var require_Client=__commonJS({"src/Client.ts"(exports,module){var fs=__require("fs"),path=__require("path"),version=JSON.parse(fs.readFileSync(path.join(__dirname,"../package.json"),{encoding:"utf8"})).version,Constants2=require_Constants(),ShardManager=require_ShardManager(),Client=class extends events.EventEmitter{constructor(token,options={}){super();this.version=version;if(!token)throw new Error("Missing token!");this.options={largeGuildThreshold:250,shards:"auto",reconnect:!0,intents:0,token:"",ws:{compress:!0,encoding:"json"}},this._restClient=options.snowtransferInstance?options.snowtransferInstance:new snowtransfer.SnowTransfer(token),delete options.snowtransferInstance,this.token=token.startsWith("Bot ")?token.substring(4):token,Object.assign(this.options,options),this.options.token=token,this.shardManager=new ShardManager(this);}async connect(){let initial=await this.fetchConnectInfo();this.options.shards==="auto"&&(this.options.totalShards=initial),this.shardManager.spawn();}async fetchConnectInfo(){var _a;let gateway=await this.getGatewayBot();this._updateEndpoint(gateway.url);let oldQueueConcurrency=[],oldQueueIdentify=[];(_a=this.shardManager.concurrencyBucket)!=null&&_a.fnQueue.length&&(oldQueueConcurrency.push(...this.shardManager.concurrencyBucket.fnQueue),this.shardManager.concurrencyBucket.dropQueue()),this.shardManager.identifyBucket.fnQueue.length&&oldQueueIdentify.push(...this.shardManager.identifyBucket.fnQueue),this.shardManager.identifyBucket.dropQueue(),this.shardManager.concurrencyBucket=new snowtransfer.LocalBucket(gateway.session_start_limit.max_concurrency,5e3),this.shardManager.identifyBucket.remaining=gateway.session_start_limit.remaining,this.shardManager.identifyBucket.reset=gateway.session_start_limit.reset_after;for(let fn of oldQueueConcurrency)this.shardManager.concurrencyBucket.queue(fn);for(let fn of oldQueueIdentify)this.shardManager.identifyBucket.queue(fn);return gateway.shards}async getGateway(){return (await this._restClient.bot.getGateway()).url}async getGatewayBot(){return this._restClient.bot.getGatewayBot()}disconnect(){return this.shardManager.disconnect()}async presenceUpdate(data){return this.shardManager.presenceUpdate(data)}shardStatusUpdate(shardId,data){return this.shardManager.shardPresenceUpdate(shardId,data)}voiceStateUpdate(shardId,data){return this.shardManager.voiceStateUpdate(shardId,data)}requestGuildMembers(shardId,data){if(!data.guild_id)throw new Error("You need to pass a guild_id");return this.shardManager.requestGuildMembers(shardId,data)}_updateEndpoint(gatewayUrl){var _a,_b;this.options.endpoint=`${gatewayUrl}?v=${Constants2.GATEWAY_VERSION}&encoding=${((_a=this.options.ws)==null?void 0:_a.encoding)==="etf"?"etf":"json"}${(_b=this.options.ws)!=null&&_b.compress?"&compress=zlib-stream":""}`;}};module.exports=Client;}});var Client2=require_Client(),Constants=require_Constants(),Intents=(init_Intents(),__toCommonJS(Intents_exports)),Shard2=require_Shard(),ShardManager2=require_ShardManager(),BetterWs2=require_BetterWs();
10
+
11
+ exports.BetterWs = BetterWs2;
12
+ exports.Client = Client2;
13
+ exports.Constants = Constants;
14
+ exports.Intents = Intents;
15
+ exports.Shard = Shard2;
16
+ exports.ShardManager = ShardManager2;
17
+ //# sourceMappingURL=out.js.map
2
18
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../package.json","../src/Constants.ts","../src/BetterWs.ts","../src/Intents.ts","../src/DiscordConnector.ts","../src/Shard.ts","../src/ShardManager.ts","../src/Client.ts","../src/index.ts"],"sourcesContent":["{\r\n \"name\": \"cloudstorm\",\r\n \"version\": \"0.10.7\",\r\n \"description\": \"Minimalistic Discord Gateway library\",\r\n \"main\": \"./dist/index.js\",\r\n \"engines\": {\r\n \"node\": \">=14.8.0\"\r\n },\r\n \"types\": \"./dist/index.d.ts\",\r\n \"scripts\": {\r\n \"build:src\": \"tsup src/index.ts --clean --dts --sourcemap --format cjs --target node14 --minify-whitespace\",\r\n \"build:docs\": \"typedoc --name CloudStorm --excludeExternals --sort static-first --sort alphabetical\"\r\n },\r\n \"author\": \"wolke <wolke@weeb.sh>\",\r\n \"license\": \"MIT\",\r\n \"dependencies\": {\r\n \"discord-api-types\": \"^0.37.69\",\r\n \"snowtransfer\": \"^0.10.4\"\r\n },\r\n \"devDependencies\": {\r\n \"@types/node\": \"20.11.17\",\r\n \"@typescript-eslint/eslint-plugin\": \"^6.21.0\",\r\n \"@typescript-eslint/parser\": \"^6.21.0\",\r\n \"eslint\": \"^8.56.0\",\r\n \"tsup\": \"^8.0.1\",\r\n \"typedoc\": \"^0.25.8\",\r\n \"typedoc-plugin-mdn-links\": \"^3.1.15\",\r\n \"typescript\": \"^5.3.0\"\r\n },\r\n \"files\": [\r\n \"dist\",\r\n \"README.md\",\r\n \"LICENSE.md\"\r\n ]\r\n}\r\n","\"use strict\";\r\n\r\nconst Constants = {\r\n\tGATEWAY_OP_CODES: {\r\n\t\t/**\r\n\t\t * Receive.\r\n\t\t */\r\n\t\tDISPATCH: 0 as const,\r\n\t\t/**\r\n\t\t * Send/Receive.\r\n\t\t */\r\n\t\tHEARTBEAT: 1 as const,\r\n\t\t/**\r\n\t\t * Send.\r\n\t\t */\r\n\t\tIDENTIFY: 2 as const,\r\n\t\t/**\r\n\t\t * Send.\r\n\t\t */\r\n\t\tPRESENCE_UPDATE: 3 as const,\r\n\t\t/**\r\n\t\t * Send.\r\n\t\t */\r\n\t\tVOICE_STATE_UPDATE: 4 as const,\r\n\t\t/**\r\n\t\t * Send.\r\n\t\t */\r\n\t\tRESUME: 6 as const,\r\n\t\t/**\r\n\t\t * Receive.\r\n\t\t */\r\n\t\tRECONNECT: 7 as const,\r\n\t\t/**\r\n\t\t * Send.\r\n\t\t */\r\n\t\tREQUEST_GUILD_MEMBERS: 8 as const,\r\n\t\t/**\r\n\t\t * Receive.\r\n\t\t */\r\n\t\tINVALID_SESSION: 9 as const,\r\n\t\t/**\r\n\t\t * Receive.\r\n\t\t */\r\n\t\tHELLO: 10 as const,\r\n\t\t/**\r\n\t\t * Receive.\r\n\t\t */\r\n\t\tHEARTBEAT_ACK: 11 as const\r\n\t},\r\n\tGATEWAY_VERSION: 10 as const\r\n};\r\n\r\nexport = Constants;\r\n","\"use strict\";\r\n\r\n// This ultra light weigth WS code is a slimmed down version originally found at https://github.com/timotejroiko/tiny-discord\r\n// Modifications and use of this code was granted for this project by the author, Timotej Roiko.\r\n// A major thank you to Tim for better performing software.\r\n\r\nimport { EventEmitter } from \"events\";\r\nimport { randomBytes, createHash } from \"crypto\";\r\nimport { createInflate, inflateSync, constants } from \"zlib\";\r\nimport https = require(\"https\");\r\nimport http = require(\"http\");\r\nimport util = require(\"util\");\r\nimport { GATEWAY_OP_CODES } from \"./Constants\";\r\n\r\nimport { LocalBucket } from \"snowtransfer\";\r\n\r\nimport type { Socket } from \"net\";\r\n\r\ninterface BWSEvents {\r\n\tws_open: [];\r\n\tws_close: [number, string];\r\n\tws_receive: [any];\r\n\tws_send: [any];\r\n\tdebug: [string];\r\n}\r\n\r\ninterface BetterWs {\r\n\taddListener<E extends keyof BWSEvents>(event: E, listener: (...args: BWSEvents[E]) => any): this;\r\n\temit<E extends keyof BWSEvents>(event: E, ...args: BWSEvents[E]): boolean;\r\n\teventNames(): Array<keyof BWSEvents>;\r\n\tlistenerCount(event: keyof BWSEvents): number;\r\n\tlisteners(event: keyof BWSEvents): Array<(...args: Array<any>) => any>;\r\n\toff<E extends keyof BWSEvents>(event: E, listener: (...args: BWSEvents[E]) => any): this;\r\n\ton<E extends keyof BWSEvents>(event: E, listener: (...args: BWSEvents[E]) => any): this;\r\n\tonce<E extends keyof BWSEvents>(event: E, listener: (...args: BWSEvents[E]) => any): this;\r\n\tprependListener<E extends keyof BWSEvents>(event: E, listener: (...args: BWSEvents[E]) => any): this;\r\n\tprependOnceListener<E extends keyof BWSEvents>(event: E, listener: (...args: BWSEvents[E]) => any): this;\r\n\trawListeners(event: keyof BWSEvents): Array<(...args: Array<any>) => any>;\r\n\tremoveAllListeners(event?: keyof BWSEvents): this;\r\n\tremoveListener<E extends keyof BWSEvents>(event: E, listener: (...args: BWSEvents[E]) => any): this;\r\n}\r\n\r\n/**\r\n * Helper Class for simplifying the websocket connection to Discord.\r\n */\r\nclass BetterWs extends EventEmitter {\r\n\t/** The encoding to send/receive messages to/from the server with. */\r\n\tpublic encoding: \"etf\" | \"json\" | \"other\";\r\n\t/** If the messages sent/received are compressed with zlib. */\r\n\tpublic compress: boolean;\r\n\t/** The ratelimit bucket for how many packets this ws can send within a time frame. */\r\n\tpublic wsBucket = new LocalBucket(120, 60000);\r\n\t/** The ratelimit bucket for how many presence update specific packets this ws can send within a time frame. Is still affected by the overall packet send bucket. */\r\n\tpublic presenceBucket = new LocalBucket(5, 60000);\r\n\r\n\t/** The raw net.Socket retreived from upgrading the connection or null if not upgraded/closed. */\r\n\tprivate _socket: Socket | null = null;\r\n\t/** Internal properties that need a funny way to be referenced. */\r\n\tpublic _internal: {\r\n\t\topenRejector: ((reason?: any) => void) | null;\r\n\t\t/** A promise that resolves when the connection is fully closed or null if not closing the connection if any. */\r\n\t\tclosePromise: Promise<void> | null;\r\n\t\t/** A zlib Inflate instance if messages sent/received are going to be compressed. Auto created on connect. */\r\n\t\tzlib: import(\"zlib\").Inflate | null;\r\n\t} = {\r\n\t\t\topenRejector: null,\r\n\t\t\tclosePromise: null,\r\n\t\t\tzlib: null\r\n\t\t};\r\n\t/** If a request is going through to initiate a WebSocket connection and hasn't been upgraded by the server yet. */\r\n\tprivate _connecting = false;\r\n\t/** Code received from frame op 8 */\r\n\tprivate _lastCloseCode: number | null = null;\r\n\t/** Reason received from frame op 8 */\r\n\tprivate _lastCloseReason: string | null = null;\r\n\r\n\t/**\r\n\t * Creates a new lightweight WebSocket.\r\n\t * @param address The http(s):// or ws(s):// URL cooresponding to the server to connect to.\r\n\t * @param options Options specific to this WebSocket.\r\n\t */\r\n\tpublic constructor(public address: string, public options: Omit<import(\"./Types\").IClientWSOptions, \"encoding\"> & { encoding?: import(\"./Types\").IClientWSOptions[\"encoding\"] | \"other\" }) {\r\n\t\tsuper();\r\n\r\n\t\tthis.encoding = options.encoding ?? \"other\";\r\n\t\tthis.compress = options.compress ?? false;\r\n\t}\r\n\r\n\t/**\r\n\t * The state this WebSocket is in. 1 is connected, 2 is connecting, 3 is closing, and 4 is closed.\r\n\t */\r\n\tpublic get status(): 1 | 2 | 3 | 4 {\r\n\t\tconst internal = this._internal;\r\n\t\tif (this._connecting) return 2;\r\n\t\tif (internal.closePromise) return 3; // closing\r\n\t\tif (!this._socket) return 4; // closed\r\n\t\treturn 1; // connected\r\n\t}\r\n\r\n\t/**\r\n\t * Initiates a WebSocket connection to the server.\r\n\t */\r\n\tpublic connect(): Promise<void> {\r\n\t\tif (this._socket || this._connecting) return Promise.resolve(void 0);\r\n\t\tthis._connecting = true;\r\n\t\tconst key = randomBytes(16).toString(\"base64\");\r\n\t\tconst url = new URL(this.address);\r\n\t\tconst useHTTPS = (url.protocol === \"https:\" || url.protocol === \"wss:\") || url.port === \"443\";\r\n\t\tconst port = url.port || (useHTTPS ? \"443\" : \"80\");\r\n\t\tconst req = (useHTTPS ? https : http).request({\r\n\t\t\thostname: url.hostname,\r\n\t\t\tpath: `${url.pathname}${url.search}`,\r\n\t\t\tport: port,\r\n\t\t\theaders: {\r\n\t\t\t\t\"Connection\": \"Upgrade\",\r\n\t\t\t\t\"Upgrade\": \"websocket\",\r\n\t\t\t\t\"Sec-WebSocket-Key\": key,\r\n\t\t\t\t\"Sec-WebSocket-Version\": \"13\",\r\n\t\t\t\t...this.options.headers\r\n\t\t\t}\r\n\t\t});\r\n\t\tlet onErrorRef: ((e: Error) => void) | undefined;\r\n\t\tlet cameFromOnError = false;\r\n\t\treturn new Promise<void>((resolve, reject) => {\r\n\t\t\tthis._internal.openRejector = reject;\r\n\t\t\tconst upgrade = this._onUpgrade.bind(this, key, req, resolve, reject);\r\n\t\t\tonErrorRef = e => { // Promises can only be resolved/rejected once. _onUpgrade removes all req error events after resolve\r\n\t\t\t\tthis._internal.openRejector = null;\r\n\t\t\t\tcameFromOnError = true;\r\n\t\t\t\tthis._connecting = false;\r\n\t\t\t\treq.removeListener(\"upgrade\", upgrade);\r\n\t\t\t\treject(e);\r\n\t\t\t};\r\n\t\t\treq.once(\"upgrade\", upgrade);\r\n\t\t\treq.once(\"error\", onErrorRef);\r\n\t\t\treq.end();\r\n\t\t}).catch(reason => {\r\n\t\t\tif (onErrorRef && !cameFromOnError) {\r\n\t\t\t\treq.destroy();\r\n\t\t\t\treq.removeListener(\"error\", onErrorRef);\r\n\t\t\t\tonErrorRef(reason);\r\n\t\t\t}\r\n\t\t\treturn Promise.reject(reason);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Disconnects from the server.\r\n\t * @param code The close code.\r\n\t * @param reason The reason for closing if any.\r\n\t * @returns A Promise that resolves when the connection is fully closed.\r\n\t */\r\n\tpublic async close(code: number, reason?: string): Promise<void> {\r\n\t\tconst internal = this._internal;\r\n\t\tif (internal.closePromise) return internal.closePromise;\r\n\t\tif (!this._socket) return Promise.resolve(void 0);\r\n\t\tlet resolver: ((value: unknown) => void) | undefined;\r\n\t\tconst promise = new Promise(resolve => {\r\n\t\t\tresolver = resolve;\r\n\t\t\tconst from = Buffer.from([code >> 8, code & 255]);\r\n\t\t\tthis._write(reason ? Buffer.concat([from, Buffer.from(reason)]) : from, 8);\r\n\t\t}).then(() => {\r\n\t\t\tinternal.closePromise = null;\r\n\t\t});\r\n\t\t// @ts-ignore\r\n\t\tpromise.resolve = resolver;\r\n\t\tinternal.closePromise = promise;\r\n\t\treturn promise;\r\n\t}\r\n\r\n\t/**\r\n\t * Sends a message to the server in the format of { op: number, d: any } (before any encoding/compression).\r\n\t * @param data What to send to the server.\r\n\t * @returns A Promise that resolves when the message passes the bucket queue(s) and is written to the socket's Buffer to send.\r\n\t */\r\n\tpublic sendMessage(data: any): Promise<void> {\r\n\t\treturn new Promise(res => {\r\n\t\t\tconst presence = data?.op === GATEWAY_OP_CODES.PRESENCE_UPDATE;\r\n\t\t\tconst sendMsg = () => {\r\n\t\t\t\tconst fn = () => {\r\n\t\t\t\t\tthis.emit(\"ws_send\", data);\r\n\t\t\t\t\tif (this.encoding === \"json\") this._write(Buffer.from(JSON.stringify(data)), 1);\r\n\t\t\t\t\telse if (this.encoding === \"etf\") this._write(writeETF(data), 2);\r\n\t\t\t\t\telse if (this.encoding === \"other\") this._write(Buffer.from(data), 2);\r\n\t\t\t\t\tres(void 0);\r\n\t\t\t\t};\r\n\t\t\t\tif (this.options.bypassBuckets) fn();\r\n\t\t\t\telse this.wsBucket.queue(fn);\r\n\t\t\t};\r\n\t\t\tif (presence && !this.options.bypassBuckets) this.presenceBucket.queue(sendMsg);\r\n\t\t\telse sendMsg();\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Method to raw write messages to the server.\r\n\t * @param packet Buffer containing the message to send.\r\n\t * @param opcode WebSocket spec op code.\r\n\t */\r\n\tprivate _write(packet: Buffer, opcode: number): void {\r\n\t\tconst socket = this._socket;\r\n\t\tif (!socket?.writable) return;\r\n\t\tconst length = packet.length;\r\n\t\tlet frame: Buffer | undefined;\r\n\t\tif (length < 126) {\r\n\t\t\tframe = Buffer.allocUnsafe(6 + length);\r\n\t\t\tframe[1] = 128 + length;\r\n\t\t} else if (length < (1 << 16)) {\r\n\t\t\tframe = Buffer.allocUnsafe(8 + length);\r\n\t\t\tframe[1] = 254;\r\n\t\t\tframe[2] = length >> 8;\r\n\t\t\tframe[3] = length & 255;\r\n\t\t} else {\r\n\t\t\tframe = Buffer.allocUnsafe(14 + length);\r\n\t\t\tframe[1] = 255;\r\n\t\t\tframe.writeBigUInt64BE(BigInt(length), 2);\r\n\t\t}\r\n\t\tframe[0] = 128 + opcode;\r\n\t\tframe.writeUInt32BE(0, frame.length - length - 4);\r\n\t\tframe.set(packet, frame.length - length);\r\n\t\tsocket.write(frame);\r\n\t}\r\n\r\n\t/**\r\n\t * Handler for when requests from connect are upgraded to WebSockets.\r\n\t * @param key The sec key from connect.\r\n\t * @param req The HTTP request from connect.\r\n\t * @param resolve Promise resolver from connect.\r\n\t * @param reject Promise rejector from connect.\r\n\t * @param res The HTTP response from the server from connect.\r\n\t * @param socket The raw socket from upgrading the request from connect.\r\n\t */\r\n\tprivate _onUpgrade(key: string, req: http.ClientRequest, resolve: (value: void | PromiseLike<void>) => void, reject: (reason?: any) => void, res: http.IncomingMessage, socket: Socket): void {\r\n\t\tthis._internal.openRejector = null;\r\n\t\tconst hash = createHash(\"sha1\").update(key + \"258EAFA5-E914-47DA-95CA-C5AB0DC85B11\").digest(\"base64\");\r\n\t\tconst accept = res.headers[\"sec-websocket-accept\"];\r\n\t\tif (hash !== accept) {\r\n\t\t\tsocket.end(() => {\r\n\t\t\t\tthis.emit(\"debug\", \"Failed websocket-key validation\");\r\n\t\t\t\tthis._connecting = false;\r\n\t\t\t\treject(new Error(`Invalid Sec-Websocket-Accept | expected: ${hash} | received: ${accept}`));\r\n\t\t\t});\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tsocket.once(\"error\", this._onError.bind(this)); // the conection is closed after 1 error\r\n\t\tsocket.once(\"close\", this._onClose.bind(this)); // socket gets de-referenced from this on close\r\n\t\tsocket.on(\"readable\", this._onReadable.bind(this));\r\n\t\tthis._socket = socket;\r\n\t\tthis._connecting = false;\r\n\t\tif (this.compress) {\r\n\t\t\tconst z = createInflate();\r\n\t\t\t// @ts-ignore\r\n\t\t\tz._c = z.close; z._h = z._handle; z._hc = z._handle.close; z._v = () => void 0;\r\n\t\t\tthis._internal.zlib = z;\r\n\t\t}\r\n\t\tthis.emit(\"ws_open\");\r\n\t\tresolve(void 0);\r\n\t\treq.removeAllListeners(\"error\");\r\n\t}\r\n\r\n\t/**\r\n\t * Handler for when the raw socket to the server encounters an error.\r\n\t * @param error What happened.\r\n\t */\r\n\tprivate _onError(error: Error): void {\r\n\t\tif (!this._socket) return;\r\n\t\tthis.emit(\"debug\", util.inspect(error, true, 1, false));\r\n\t\tthis._write(Buffer.allocUnsafe(0), 8);\r\n\t}\r\n\r\n\t/**\r\n\t * Handler for when the raw socket is fully closed and cleans up this WebSocket.\r\n\t */\r\n\tprivate _onClose(): void {\r\n\t\tconst socket = this._socket;\r\n\t\tconst internal = this._internal;\r\n\t\tif (!socket) return;\r\n\t\tsocket.removeListener(\"data\", this._onReadable);\r\n\t\tsocket.removeListener(\"error\", this._onError);\r\n\t\tthis.wsBucket.dropQueue();\r\n\t\tthis.presenceBucket.dropQueue();\r\n\t\tthis._socket = null;\r\n\t\tthis.emit(\"ws_close\", this._lastCloseCode ?? 1006, this._lastCloseReason ?? \"Abnormal Closure\");\r\n\t\tthis._lastCloseCode = null;\r\n\t\tthis._lastCloseReason = null;\r\n\t\tif (internal.zlib) {\r\n\t\t\tinternal.zlib.close();\r\n\t\t\tinternal.zlib = null;\r\n\t\t}\r\n\t\t// @ts-ignore\r\n\t\tif (internal.closePromise) internal.closePromise.resolve(void 0);\r\n\t}\r\n\r\n\t/**\r\n\t * Handler for when there is data in the socket's Buffer to read.\r\n\t */\r\n\tprivate _onReadable(): void {\r\n\t\tconst socket = this._socket;\r\n\t\twhile((socket?.readableLength || 0) > 1) {\r\n\t\t\tlet length = readRange(socket!, 1, 1) & 127;\r\n\t\t\tlet bytes = 0;\r\n\t\t\tif (length > 125) {\r\n\t\t\t\tbytes = length === 126 ? 2 : 8;\r\n\t\t\t\tif (socket!.readableLength < 2 + bytes) return;\r\n\t\t\t\tlength = readRange(socket!, 2, bytes);\r\n\t\t\t}\r\n\t\t\tconst frame = socket!.read(2 + bytes + length) as Buffer;\r\n\t\t\tif (!frame) return;\r\n\t\t\tconst fin = frame[0] >> 7;\r\n\t\t\tconst opcode = frame[0] & 15;\r\n\t\t\tif (fin !== 1 || opcode === 0) this.emit(\"debug\", \"discord actually does send messages with fin=0. if you see this error let me know\");\r\n\t\t\tconst payload = frame.subarray(2 + bytes);\r\n\t\t\tthis._processFrame(opcode, payload);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Transforms/reads raw messages from the server and emits the appropriate event.\r\n\t * @param opcode WebSocket spec op code.\r\n\t * @param message Buffer of data to transform/read.\r\n\t */\r\n\tprivate _processFrame(opcode: number, message: Buffer): void {\r\n\t\tconst internal = this._internal;\r\n\t\tswitch (opcode) {\r\n\t\tcase 1: {\r\n\t\t\tlet packet: any;\r\n\t\t\tif (this.encoding === \"json\") packet = JSON.parse(message.toString());\r\n\t\t\telse if (this.encoding === \"other\") packet = message;\r\n\t\t\tthis.emit(\"ws_receive\", packet);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tcase 2: {\r\n\t\t\tlet packet;\r\n\t\t\tif (this.compress) {\r\n\t\t\t\tconst z = internal.zlib;\r\n\t\t\t\tlet error = null;\r\n\t\t\t\tlet data = null;\r\n\t\t\t\t// @ts-ignore\r\n\t\t\t\tz.close = z._handle.close = z._v;\r\n\t\t\t\ttry {\r\n\t\t\t\t\t// @ts-ignore\r\n\t\t\t\t\tdata = z._processChunk(message, constants.Z_SYNC_FLUSH);\r\n\t\t\t\t} catch(e) {\r\n\t\t\t\t\terror = e;\r\n\t\t\t\t}\r\n\t\t\t\tconst l = message.length;\r\n\t\t\t\tif (message[l - 4] !== 0 || message[l - 3] !== 0 || message[l - 2] !== 255 || message[l - 1] !== 255) this.emit(\"debug\", \"discord actually does send fragmented zlib messages. If you see this error let me know\");\r\n\t\t\t\t// @ts-ignore\r\n\t\t\t\tz.close = z._c;\r\n\t\t\t\t// @ts-ignore\r\n\t\t\t\tz._handle = z._h;\r\n\t\t\t\t// @ts-ignore\r\n\t\t\t\tz._handle.close = z._hc;\r\n\t\t\t\t// @ts-ignore\r\n\t\t\t\tz._events.error = void 0;\r\n\t\t\t\t// @ts-ignore\r\n\t\t\t\tz._eventCount--;\r\n\t\t\t\tz!.removeAllListeners(\"error\");\r\n\t\t\t\tif (error) {\r\n\t\t\t\t\tthis.emit(\"debug\", \"Zlib error processing chunk\");\r\n\t\t\t\t\tthis._write(Buffer.allocUnsafe(0), 8);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tif (!data) {\r\n\t\t\t\t\tthis.emit(\"debug\", \"Data from zlib processing was null. If you see this error let me know\"); // This should never run, but TS is lame\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tif (this.encoding === \"json\") packet = JSON.parse(String(data));\r\n\t\t\t\telse if (this.encoding === \"etf\") packet = readETF(data, 1);\r\n\t\t\t\telse if (this.encoding === \"other\") packet = data;\r\n\t\t\t} else if (this.encoding === \"json\") packet = JSON.parse(inflateSync(message).toString());\r\n\t\t\telse if (this.encoding === \"etf\") packet = readETF(message, 1);\r\n\t\t\telse if (this.encoding === \"other\") packet = message;\r\n\t\t\tthis.emit(\"ws_receive\", packet);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tcase 8: {\r\n\t\t\tthis._lastCloseCode = message.length > 1 ? (message[0] << 8) + message[1] : 0;\r\n\t\t\tthis._lastCloseReason = message.length > 2 ? message.subarray(2).toString() : \"\";\r\n\t\t\tthis._write(Buffer.from([this._lastCloseCode >> 8, this._lastCloseCode & 255]), 8);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tcase 9: {\r\n\t\t\tthis._write(message, 10);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nfunction readRange(socket: import(\"net\").Socket, index: number, bytes: number): number {\r\n\t// @ts-ignore\r\n\tlet head = socket._readableState.buffer.head;\r\n\tlet cursor = 0;\r\n\tlet read = 0;\r\n\tlet num = 0;\r\n\tdo {\r\n\t\tfor (const element of head.data) {\r\n\t\t\tif (++cursor > index) {\r\n\t\t\t\tnum *= 256;\r\n\t\t\t\tnum += element;\r\n\t\t\t\tif (++read === bytes) return num;\r\n\t\t\t}\r\n\t\t}\r\n\t} while((head = head.next));\r\n\tthrow new Error(\"readRange failed?\");\r\n}\r\n\r\nfunction readETF(data: Buffer, start: number): Record<any, any> | null | undefined {\r\n\tlet view: DataView | undefined;\r\n\tlet x = start;\r\n\tconst loop = () => {\r\n\t\tconst type = data[x++];\r\n\t\tswitch(type) {\r\n\t\tcase 97: {\r\n\t\t\treturn data[x++];\r\n\t\t}\r\n\t\tcase 98: {\r\n\t\t\tconst int = data.readInt32BE(x);\r\n\t\t\tx += 4;\r\n\t\t\treturn int;\r\n\t\t}\r\n\t\tcase 100: {\r\n\t\t\tconst length = data.readUInt16BE(x);\r\n\t\t\tlet atom = \"\";\r\n\t\t\tif (length > 30) {\r\n\t\t\t\t// @ts-ignore\r\n\t\t\t\tatom = data.latin1Slice(x += 2, x + length);\r\n\t\t\t} else {\r\n\t\t\t\tfor (let i = x += 2; i < x + length; i++) {\r\n\t\t\t\t\tatom += String.fromCharCode(data[i]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tx += length;\r\n\t\t\tif (!atom) return undefined;\r\n\t\t\tif (atom === \"nil\" || atom === \"null\") return null;\r\n\t\t\tif (atom === \"true\") return true;\r\n\t\t\tif (atom === \"false\") return false;\r\n\t\t\treturn atom;\r\n\t\t}\r\n\t\tcase 108: case 106: {\r\n\t\t\tconst array = [] as Array<any>;\r\n\t\t\tif (type === 108) {\r\n\t\t\t\tconst length = data.readUInt32BE(x);\r\n\t\t\t\tx += 4;\r\n\t\t\t\tfor (let i = 0; i < length; i++) {\r\n\t\t\t\t\tarray.push(loop());\r\n\t\t\t\t}\r\n\t\t\t\tx++;\r\n\t\t\t}\r\n\t\t\treturn array;\r\n\t\t}\r\n\t\tcase 107: {\r\n\t\t\tconst array = [] as Array<number>;\r\n\t\t\tconst length = data.readUInt16BE(x);\r\n\t\t\tx += 2;\r\n\t\t\tfor (let i = 0; i < length; i++) {\r\n\t\t\t\tarray.push(data[x++]);\r\n\t\t\t}\r\n\t\t\treturn array;\r\n\t\t}\r\n\t\tcase 109: {\r\n\t\t\tconst length = data.readUInt32BE(x);\r\n\t\t\tlet str = \"\";\r\n\t\t\tif (length > 30) {\r\n\t\t\t\t// @ts-ignore\r\n\t\t\t\tstr = data.utf8Slice(x += 4, x + length);\r\n\t\t\t} else {\r\n\t\t\t\tlet i = x += 4;\r\n\t\t\t\tconst l = x + length;\r\n\t\t\t\twhile(i < l) {\r\n\t\t\t\t\tconst byte = data[i++];\r\n\t\t\t\t\tif (byte < 128) str += String.fromCharCode(byte);\r\n\t\t\t\t\telse if (byte < 224) str += String.fromCharCode(((byte & 31) << 6) + (data[i++] & 63));\r\n\t\t\t\t\telse if (byte < 240) str += String.fromCharCode(((byte & 15) << 12) + ((data[i++] & 63) << 6) + (data[i++] & 63));\r\n\t\t\t\t\telse str += String.fromCodePoint(((byte & 7) << 18) + ((data[i++] & 63) << 12) + ((data[i++] & 63) << 6) + (data[i++] & 63));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tx += length;\r\n\t\t\treturn str;\r\n\t\t}\r\n\t\tcase 110: {\r\n\t\t\t// @ts-ignore\r\n\t\t\tif (!view) view = new DataView(data.buffer, data.offset, data.byteLength);\r\n\t\t\tconst length = data[x++];\r\n\t\t\tconst sign = data[x++];\r\n\t\t\tlet left = length;\r\n\t\t\tlet num = BigInt(0);\r\n\t\t\twhile(left > 0) {\r\n\t\t\t\tif (left >= 8) {\r\n\t\t\t\t\tnum <<= BigInt(64);\r\n\t\t\t\t\tnum += view.getBigUint64(x + (left -= 8), true);\r\n\t\t\t\t} else if (left >= 4) {\r\n\t\t\t\t\tnum <<= BigInt(32);\r\n\t\t\t\t\t// @ts-ignore\r\n\t\t\t\t\tnum += BigInt(view.getUint32(x + (left -= 4)), true);\r\n\t\t\t\t} else if (left >= 2) {\r\n\t\t\t\t\tnum <<= BigInt(16);\r\n\t\t\t\t\t// @ts-ignore\r\n\t\t\t\t\tnum += BigInt(view.getUint16(x + (left -= 2)), true);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tnum <<= BigInt(8);\r\n\t\t\t\t\tnum += BigInt(data[x]);\r\n\t\t\t\t\tleft--;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tx += length;\r\n\t\t\treturn (sign ? -num : num).toString();\r\n\t\t}\r\n\t\tcase 116: {\r\n\t\t\tconst obj = {};\r\n\t\t\tconst length = data.readUInt32BE(x);\r\n\t\t\tx += 4;\r\n\t\t\tfor(let i = 0; i < length; i++) {\r\n\t\t\t\tconst key = loop();\r\n\t\t\t\t// @ts-ignore\r\n\t\t\t\tobj[key] = loop();\r\n\t\t\t}\r\n\t\t\treturn obj;\r\n\t\t}\r\n\t\t}\r\n\t\tthrow new Error(`Missing etf type: ${type}`);\r\n\t};\r\n\treturn loop();\r\n}\r\n\r\nfunction writeETF(data: any): Buffer {\r\n\tconst b = Buffer.allocUnsafe(1 << 12);\r\n\tb[0] = 131;\r\n\tlet i = 1;\r\n\tconst loop = (obj: any) => {\r\n\t\tconst type = typeof obj;\r\n\t\tswitch(type) {\r\n\t\tcase \"boolean\": {\r\n\t\t\tb[i++] = 100;\r\n\t\t\tif (obj) {\r\n\t\t\t\tb.writeUInt16BE(4, i);\r\n\t\t\t\t// @ts-ignore\r\n\t\t\t\tb.latin1Write(\"true\", i += 2);\r\n\t\t\t\ti += 4;\r\n\t\t\t} else {\r\n\t\t\t\tb.writeUInt16BE(5, i);\r\n\t\t\t\t// @ts-ignore\r\n\t\t\t\tb.latin1Write(\"false\", i += 2);\r\n\t\t\t\ti += 5;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tcase \"string\": {\r\n\t\t\tconst length = Buffer.byteLength(obj);\r\n\t\t\tb[i++] = 109;\r\n\t\t\tb.writeUInt32BE(length, i);\r\n\t\t\t// @ts-ignore\r\n\t\t\tb.utf8Write(obj, i += 4);\r\n\t\t\ti += length;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tcase \"number\": {\r\n\t\t\tif (Number.isInteger(obj)) {\r\n\t\t\t\tconst abs = Math.abs(obj);\r\n\t\t\t\tif (abs < 2147483648) {\r\n\t\t\t\t\tb[i++] = 98;\r\n\t\t\t\t\tb.writeInt32BE(obj, i);\r\n\t\t\t\t\ti += 4;\r\n\t\t\t\t} else if (abs < Number.MAX_SAFE_INTEGER) {\r\n\t\t\t\t\tb[i++] = 110;\r\n\t\t\t\t\tb[i++] = 8;\r\n\t\t\t\t\tb[i++] = Number(obj < 0);\r\n\t\t\t\t\tb.writeBigUInt64LE(BigInt(abs), i);\r\n\t\t\t\t\ti += 8;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tb[i++] = 70;\r\n\t\t\t\t\tb.writeDoubleBE(obj, i);\r\n\t\t\t\t\ti += 8;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tb[i++] = 70;\r\n\t\t\t\tb.writeDoubleBE(obj, i);\r\n\t\t\t\ti += 8;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tcase \"bigint\": {\r\n\t\t\tb[i++] = 110;\r\n\t\t\tb[i++] = 8;\r\n\t\t\tb[i++] = Number(obj < 0);\r\n\t\t\tb.writeBigUInt64LE(obj, i);\r\n\t\t\ti += 8;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tcase \"object\": {\r\n\t\t\tif (obj === null) {\r\n\t\t\t\tb[i++] = 100;\r\n\t\t\t\tb.writeUInt16BE(3, i);\r\n\t\t\t\t// @ts-ignore\r\n\t\t\t\tb.latin1Write(\"nil\", i += 2);\r\n\t\t\t\ti += 3;\r\n\t\t\t} else if (Array.isArray(obj)) {\r\n\t\t\t\tif (obj.length) {\r\n\t\t\t\t\tb[i++] = 108;\r\n\t\t\t\t\tb.writeUInt32BE(obj.length, i);\r\n\t\t\t\t\ti += 4;\r\n\t\t\t\t\tfor (const item of obj) {\r\n\t\t\t\t\t\tloop(item);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tb[i++] = 106;\r\n\t\t\t} else {\r\n\t\t\t\tconst entries = Object.entries(obj).filter(x => typeof x[1] !== \"undefined\");\r\n\t\t\t\tb[i++] = 116;\r\n\t\t\t\tb.writeUInt32BE(entries.length, i);\r\n\t\t\t\ti += 4;\r\n\t\t\t\tfor(const [key, value] of entries) {\r\n\t\t\t\t\tloop(key);\r\n\t\t\t\t\tloop(value);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\t}\r\n\t};\r\n\tloop(data);\r\n\treturn Buffer.from(b.subarray(0, i));\r\n}\r\n\r\n\r\nexport = BetterWs;\r\n","\"use strict\";\r\n\r\nexport type IntentFlags = typeof flags;\r\nexport type IntentResolvable = number | Array<number> | keyof IntentFlags | Array<keyof IntentFlags>;\r\n\r\n/**\r\n * Bit flags representing Discord intents.\r\n */\r\nexport const flags = {\r\n\tGUILDS: 1 << 0,\r\n\tGUILD_MEMBERS: 1 << 1,\r\n\tGUILD_MODERATION: 1 << 2,\r\n\tGUILD_EMOJIS_AND_STICKERS: 1 << 3,\r\n\tGUILD_INTEGRATIONS: 1 << 4,\r\n\tGUILD_WEBHOOKS: 1 << 5,\r\n\tGUILD_INVITES: 1 << 6,\r\n\tGUILD_VOICE_STATES: 1 << 7,\r\n\tGUILD_PRESENCES: 1 << 8,\r\n\tGUILD_MESSAGES: 1 << 9,\r\n\tGUILD_MESSAGE_REACTIONS: 1 << 10,\r\n\tGUILD_MESSAGE_TYPING: 1 << 11,\r\n\tDIRECT_MESSAGES: 1 << 12,\r\n\tDIRECT_MESSAGE_REACTIONS: 1 << 13,\r\n\tDIRECT_MESSAGE_TYPING: 1 << 14,\r\n\tMESSAGE_CONTENT: 1 << 15,\r\n\tGUILD_SCHEDULED_EVENTS: 1 << 16,\r\n\tAUTO_MODERATION_CONFIGURATION: 1 << 20,\r\n\tAUTO_MODERATION_EXECUTION: 1 << 21\r\n};\r\n\r\n/** All bit flags that would require Discord to grant manually OR'd together. */\r\nexport const privileged = flags.GUILD_MEMBERS | flags.GUILD_PRESENCES | flags.MESSAGE_CONTENT;\r\n/** All bit flags OR'd together. */\r\nexport const all = Object.values(flags).reduce((acc, p) => acc | p, 0);\r\n/** All bit flags excluding those that would require Discord to grant manually OR'd together. */\r\nexport const non_privileged = all & ~privileged;\r\n\r\n/**\r\n * A function to resolve either bit number(s) or human readable string(s) to a bit collection number Discord can accept as client intents.\r\n * @param bit Data representing intents that can be resolved to a bit collection number Discord can accept.\r\n * @returns A bit collection number Discord can accept as the client intents.\r\n */\r\nexport function resolve(bit: IntentResolvable = 0): number {\r\n\tif (typeof bit === \"number\" && bit >= 0) return bit;\r\n\tif (typeof bit === \"string\" && flags[bit]) return flags[bit] | 0;\r\n\tif (Array.isArray(bit)) return bit.map((p: IntentResolvable) => resolve(p)).reduce((prev, p) => prev | p, 0);\r\n\tthrow new RangeError(\"BITFIELD_INVALID\");\r\n}\r\n\r\nexport default { flags, privileged, all, non_privileged, resolve };\r\n","\"use strict\";\r\n\r\nimport { EventEmitter } from \"events\";\r\nimport BetterWs = require(\"./BetterWs\");\r\nimport { GATEWAY_OP_CODES as OP, GATEWAY_VERSION } from \"./Constants\";\r\nimport Intents = require(\"./Intents\");\r\n\r\nimport type {\r\n\tGatewayReceivePayload,\r\n\tGatewayIdentify,\r\n\tGatewayPresenceUpdateData,\r\n\tGatewayVoiceStateUpdateData,\r\n\tGatewayRequestGuildMembersData,\r\n\tGatewayRequestGuildMembersDataWithQuery,\r\n\tGatewayRequestGuildMembersDataWithUserIds\r\n} from \"discord-api-types/v10\";\r\n\r\nimport { PresenceUpdateStatus } from \"discord-api-types/v10\";\r\n\r\ninterface ConnectorEvents {\r\n\tqueueIdentify: [number];\r\n\tready: [boolean];\r\n\tdisconnect: [number, string, boolean];\r\n\tstateChange: [\"connecting\" | \"identifying\" | \"resuming\" | \"ready\" | \"disconnected\"]\r\n}\r\n\r\ninterface DiscordConnector {\r\n\taddListener<E extends keyof ConnectorEvents>(event: E, listener: (...args: ConnectorEvents[E]) => any): this;\r\n\temit<E extends keyof ConnectorEvents>(event: E, ...args: ConnectorEvents[E]): boolean;\r\n\teventNames(): Array<keyof ConnectorEvents>;\r\n\tlistenerCount(event: keyof ConnectorEvents): number;\r\n\tlisteners(event: keyof ConnectorEvents): Array<(...args: Array<any>) => any>;\r\n\toff<E extends keyof ConnectorEvents>(event: E, listener: (...args: ConnectorEvents[E]) => any): this;\r\n\ton<E extends keyof ConnectorEvents>(event: E, listener: (...args: ConnectorEvents[E]) => any): this;\r\n\tonce<E extends keyof ConnectorEvents>(event: E, listener: (...args: ConnectorEvents[E]) => any): this;\r\n\tprependListener<E extends keyof ConnectorEvents>(event: E, listener: (...args: ConnectorEvents[E]) => any): this;\r\n\tprependOnceListener<E extends keyof ConnectorEvents>(event: E, listener: (...args: ConnectorEvents[E]) => any): this;\r\n\trawListeners(event: keyof ConnectorEvents): Array<(...args: Array<any>) => any>;\r\n\tremoveAllListeners(event?: keyof ConnectorEvents): this;\r\n\tremoveListener<E extends keyof ConnectorEvents>(event: E, listener: (...args: ConnectorEvents[E]) => any): this;\r\n}\r\n\r\nconst resumableCodes = [4008, 4005, 4003, 4002, 4001, 4000, 1006, 1001];\r\nconst shouldntAttemptReconnectCodes = [4014, 4013, 4012, 4011, 4010, 4004];\r\nconst disconnectMessages = {\r\n\t4014: \"Disallowed Intents, check your client options and application page.\",\r\n\t4013: \"Invalid Intents data, check your client options.\",\r\n\t4012: \"Invalid API version.\",\r\n\t4011: \"Shard would be on over 2500 guilds. Add more shards.\",\r\n\t4010: \"Invalid sharding data, check your client options.\",\r\n\t4009: \"Session timed out.\",\r\n\t4008: \"You are being rate limited. Wait before sending more packets.\",\r\n\t4007: \"Invalid sequence. Reconnecting and starting a new session.\",\r\n\t4005: \"You sent more than one OP 2 IDENTIFY payload while the websocket was open.\",\r\n\t4004: \"Tried to connect with an invalid token.\",\r\n\t4003: \"You tried to send a packet before sending an OP 2 IDENTIFY or OP 6 RESUME.\",\r\n\t4002: \"You sent an invalid payload.\",\r\n\t4001: \"You sent an invalid opcode or invalid payload for an opcode.\"\r\n};\r\n\r\nconst connectionError = new Error(\"WS took too long to connect. Is your internet okay?\");\r\n\r\nconst wsStatusTypes = [\"Whatever 0 is. Report if you see this\", \"connected\", \"connecting\", \"closing\", \"closed\"];\r\n\r\n/**\r\n * Class used for acting based on received events.\r\n *\r\n * This class is automatically instantiated by the library and is documented for reference.\r\n */\r\nclass DiscordConnector extends EventEmitter {\r\n\t/** The options used by the client */\r\n\tpublic options: DiscordConnector[\"client\"][\"options\"];\r\n\t/** If this connector will attempt to automatically reconnect */\r\n\tpublic reconnect: boolean;\r\n\t/** The WebSocket this connector uses */\r\n\tpublic betterWs: BetterWs;\r\n\t/** A Timeout that, when triggered, will send an op 1 heartbeat. Is null if Discord hasn't told this connector how often to heartbeat */\r\n\tpublic heartbeatTimeout: NodeJS.Timeout | null = null;\r\n\t/** How often this connector should heartbeat if not 0 */\r\n\tpublic heartbeatInterval = 0;\r\n\t/** The _trace as sent by the Discord READY and RESUMED payloads */\r\n\tpublic _trace: string | null = null;\r\n\t/** The sequence, which is the number of events received by Discord within the session if any session */\r\n\tpublic seq = 0;\r\n\t/** The status of this connector */\r\n\tpublic status: \"connecting\" | \"identifying\" | \"resuming\" | \"ready\" | \"disconnected\" = \"disconnected\";\r\n\t/** The session ID used for resuming or null if Discord hasn't sent one yet */\r\n\tpublic sessionId: string | null = null;\r\n\t/** The ms timestamp when this connector last received an op 11 heartbeat ack if not 0 */\r\n\tpublic lastACKAt = 0;\r\n\t/** The ms timestamp when this connector last sent an op 1 heartbeat if not 0 */\r\n\tpublic lastHeartbeatSend = 0;\r\n\t/** The time in milliseconds it took for Discord to send an op 11 heartbeat ack in response to an op 1 heartbeat */\r\n\tpublic latency = 0;\r\n\t/** The address the WebSocket will use to connect to the Discord gateway if not resuming */\r\n\tpublic identifyAddress: string;\r\n\t/** The address the WebSocket will use to connect to the Discord gateway if resuming */\r\n\tpublic resumeAddress: string | null = null;\r\n\t/** If this connector is disconnected/disconnecting currently, but will reconnect eventually */\r\n\tpublic reconnecting = false;\r\n\r\n\t/** If this connector is waiting to be fully closed */\r\n\tprivate _closing = false;\r\n\t/** If the disconnect method on this class was called and the connect method hasn't been called yet */\r\n\tprivate _closeCalled = false;\r\n\t/** A Timeout that, when triggered, closes the connection because op HELLO hasn't been received and may never be received */\r\n\tprivate _openToHeartbeatTimeout: NodeJS.Timeout | null = null;\r\n\t/** A Timeout that, when triggered, sends the first heartbeat */\r\n\tprivate _initialHeartbeatTimeout: NodeJS.Timeout | null = null;\r\n\r\n\t/**\r\n\t * Creates a new Discord Connector.\r\n\t * @param id id of the shard that created this class.\r\n\t * @param client Main client instance.\r\n\t */\r\n\tpublic constructor(public id: number, public client: EventEmitter & { options: Omit<import(\"./Types\").IClientOptions, \"snowtransferInstance\"> & { token: string; endpoint?: string; } }) {\r\n\t\tsuper();\r\n\r\n\t\tthis.options = client.options;\r\n\t\tthis.reconnect = this.options.reconnect ?? true;\r\n\t\tthis.identifyAddress = this.options.endpoint!;\r\n\r\n\t\tthis.betterWs = new BetterWs(this.identifyAddress, this.options.ws!);\r\n\r\n\t\tthis.betterWs.on(\"ws_open\", () => {\r\n\t\t\tthis.status = \"connecting\";\r\n\t\t\tthis.emit(\"stateChange\", \"connecting\");\r\n\t\t\tthis.reconnecting = false;\r\n\t\t\tthis._openToHeartbeatTimeout = setTimeout(() => {\r\n\t\t\t\tthis.client.emit(\"debug\", `Shard ${this.id} didn't receive a HELLO after the ws was opened in time`);\r\n\t\t\t\tthis._reconnect(true);\r\n\t\t\t}, 10000);\r\n\t\t});\r\n\t\tthis.betterWs.on(\"ws_receive\", msg => this.messageAction(msg));\r\n\t\tthis.betterWs.on<\"ws_close\">(\"ws_close\", (code, reason) => this.handleWsClose(code, reason));\r\n\t\tthis.betterWs.on(\"debug\", event => this.client.emit(\"error\", event));\r\n\t\tthis.betterWs.on(\"ws_send\", data => this.client.emit(\"rawSend\", data));\r\n\t}\r\n\r\n\t/**\r\n\t * Connect to Discord.\r\n\t */\r\n\tpublic async connect(): Promise<void> {\r\n\t\tthis._closing = false;\r\n\t\tthis._closeCalled = false;\r\n\t\tthis.client.emit(\"debug\", `Shard ${this.id} connecting to gateway`);\r\n\t\t// The address should already be updated if resuming/identifying\r\n\t\treturn this.betterWs.connect()\r\n\t\t\t.catch(e => { // All errors unless irrecoverable should attempt to reconnect\r\n\t\t\t\tif (e === connectionError) return;\r\n\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\tif (!this._closeCalled) this.connect();\r\n\t\t\t\t}, 5000);\r\n\t\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Close the websocket connection and disconnect.\r\n\t */\r\n\tpublic async disconnect(): Promise<void> {\r\n\t\tthis._closing = true;\r\n\t\tthis._closeCalled = true;\r\n\t\treturn this.betterWs.close(1000, \"Disconnected by User\");\r\n\t}\r\n\r\n\t/**\r\n\t * Called with a parsed Websocket message to execute further actions.\r\n\t * @param message Message that was received.\r\n\t */\r\n\tprivate async messageAction(message: GatewayReceivePayload): Promise<void> {\r\n\t\tthis.client.emit(\"rawReceive\", message);\r\n\t\tconst withShardID: import(\"./Types\").IGatewayMessage = Object.assign(message, { shard_id: this.id });\r\n\t\tthis.client.emit(\"event\", withShardID);\r\n\r\n\t\tswitch (withShardID.op) {\r\n\t\tcase OP.DISPATCH:\r\n\t\t\tthis.handleDispatch(withShardID);\r\n\t\t\tbreak;\r\n\r\n\t\tcase OP.HEARTBEAT:\r\n\t\t\tthis.heartbeat();\r\n\t\t\tbreak;\r\n\r\n\t\tcase OP.RECONNECT:\r\n\t\t\tthis.client.emit(\"debug\", `Gateway asked shard ${this.id} to reconnect`);\r\n\t\t\tif (this.reconnect) this._reconnect(true);\r\n\t\t\telse this.disconnect();\r\n\t\t\tbreak;\r\n\r\n\t\tcase OP.INVALID_SESSION:\r\n\t\t\tthis.client.emit(\"debug\", `Shard ${this.id}'s session was invalidated`);\r\n\t\t\tif (withShardID.d && this.sessionId) this.resume();\r\n\t\t\telse {\r\n\t\t\t\tthis.seq = 0;\r\n\t\t\t\tthis.sessionId = \"\";\r\n\t\t\t\tthis.emit(\"queueIdentify\", this.id);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\r\n\t\tcase OP.HELLO:\r\n\t\t\tif (this._openToHeartbeatTimeout) clearTimeout(this._openToHeartbeatTimeout);\r\n\t\t\tthis.client.emit(\"debug\", `Shard ${this.id} received HELLO`);\r\n\t\t\tthis.lastACKAt = Date.now();\r\n\t\t\tthis.heartbeatInterval = withShardID.d.heartbeat_interval;\r\n\t\t\tthis._initialHeartbeatTimeout = setTimeout(() => this.heartbeat(), this.heartbeatInterval * Math.random());\r\n\t\t\tthis._trace = (withShardID.d as unknown as { _trace: string })._trace;\r\n\t\t\tthis._onHello();\r\n\t\t\tbreak;\r\n\r\n\t\tcase OP.HEARTBEAT_ACK:\r\n\t\t\tthis.lastACKAt = Date.now();\r\n\t\t\tthis.latency = this.lastACKAt - this.lastHeartbeatSend;\r\n\t\t\tbreak;\r\n\r\n\t\tdefault:\r\n\t\t\tvoid 0;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Reset this connector to be ready to resume or hard reconnect, then connect.\r\n\t * @param resume Whether or not the client intends to send an OP 6 RESUME later.\r\n\t */\r\n\tprivate async _reconnect(resume = false): Promise<void> {\r\n\t\tthis.betterWs._internal.openRejector?.(connectionError); // If the client is still attempting to connect, but _reconnect is *somehow* called, destroy the request and just try to reconnect.\r\n\t\tthis.reconnecting = resume;\r\n\t\tawait this.betterWs.close(resume ? 4000 : 1012, \"reconnecting\");\r\n\t\tif (resume) {\r\n\t\t\tthis.clearHeartBeat();\r\n\t\t\tif (this.resumeAddress) this.betterWs.address = this.resumeAddress;\r\n\t\t\telse this.betterWs.address = this.identifyAddress;\r\n\t\t} else {\r\n\t\t\tthis.reset();\r\n\t\t\tthis.betterWs.address = this.identifyAddress;\r\n\t\t}\r\n\t\tthis.connect();\r\n\t}\r\n\r\n\t/**\r\n\t * Hard reset this connector.\r\n\t */\r\n\tprivate reset(): void {\r\n\t\tthis.sessionId = null;\r\n\t\tthis.seq = 0;\r\n\t\tthis.lastACKAt = 0;\r\n\t\tthis._trace = null;\r\n\t\tthis.clearHeartBeat();\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the this.heartbeatTimeout Interval.\r\n\t */\r\n\tprivate setHeartBeat(): void {\r\n\t\tthis.heartbeatTimeout = setInterval(() => {\r\n\t\t\tif (this.lastACKAt <= Date.now() - (this.heartbeatInterval + 5000)) {\r\n\t\t\t\tthis.client.emit(\"debug\", `Shard ${this.id} has not received a heartbeat ACK in ${this.heartbeatInterval + 5000}ms.`);\r\n\t\t\t\tif (this.reconnect) this._reconnect(true);\r\n\t\t\t\telse this.disconnect();\r\n\t\t\t} else this.heartbeat();\r\n\t\t}, this.heartbeatInterval);\r\n\t}\r\n\r\n\t/**\r\n\t * Clear the heart beat interval, set it to null and set the cached heartbeat_interval as 0.\r\n\t */\r\n\tprivate clearHeartBeat(): void {\r\n\t\tif (this.heartbeatTimeout) clearInterval(this.heartbeatTimeout);\r\n\t\tif (this._initialHeartbeatTimeout) clearTimeout(this._initialHeartbeatTimeout);\r\n\t\tthis.heartbeatTimeout = null;\r\n\t\tthis._initialHeartbeatTimeout = null;\r\n\t\tthis.heartbeatInterval = 0;\r\n\t}\r\n\r\n\tprivate _onHello(): void {\r\n\t\tif (this.sessionId) return void this.resume();\r\n\t\telse this.emit(\"queueIdentify\", this.id);\r\n\t}\r\n\r\n\t/**\r\n\t * Send an OP 2 IDENTIFY to the gateway.\r\n\t */\r\n\tpublic async identify(): Promise<void> {\r\n\t\tif (this.betterWs.status !== 1) {\r\n\t\t\tthis.client.emit(\"error\", `Shard ${this.id} was attempting to identify when the ws was not open. Was ${wsStatusTypes[this.betterWs.status]}`);\r\n\t\t\treturn this._reconnect(true);\r\n\t\t}\r\n\t\tthis.client.emit(\"debug\", `Shard ${this.id} is identifying`);\r\n\r\n\t\tthis.status = \"identifying\";\r\n\t\tthis.emit(\"stateChange\", \"identifying\");\r\n\r\n\t\tconst data = {\r\n\t\t\top: OP.IDENTIFY,\r\n\t\t\td: {\r\n\t\t\t\ttoken: this.options.token,\r\n\t\t\t\tproperties: {\r\n\t\t\t\t\tos: process.platform,\r\n\t\t\t\t\tbrowser: \"CloudStorm\",\r\n\t\t\t\t\tdevice: \"CloudStorm\"\r\n\t\t\t\t},\r\n\t\t\t\tlarge_threshold: this.options.largeGuildThreshold,\r\n\t\t\t\tshard: [this.id, this.options.totalShards ?? 1],\r\n\t\t\t\tintents: this.options.intents ? Intents.resolve(this.options.intents) : 0\r\n\t\t\t}\r\n\t\t} as GatewayIdentify;\r\n\r\n\t\tif (this.options.initialPresence) data.d.presence = this._checkPresenceData(this.options.initialPresence);\r\n\t\treturn this.betterWs.sendMessage(data);\r\n\t}\r\n\r\n\t/**\r\n\t * Send an OP 6 RESUME to the gateway.\r\n\t */\r\n\tpublic async resume(): Promise<void> {\r\n\t\tif (this.betterWs.status !== 1) {\r\n\t\t\tthis.client.emit(\"error\", `Shard ${this.id} was attempting to resume when the ws was not open. Was ${wsStatusTypes[this.betterWs.status]}`);\r\n\t\t\treturn this._reconnect(true);\r\n\t\t}\r\n\t\tthis.client.emit(\"debug\", `Shard ${this.id} is resuming`);\r\n\r\n\t\tthis.status = \"resuming\";\r\n\t\tthis.emit(\"stateChange\", \"resuming\");\r\n\r\n\t\treturn this.betterWs.sendMessage({\r\n\t\t\top: OP.RESUME,\r\n\t\t\td: { seq: this.seq, token: this.options.token, session_id: this.sessionId! }\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Send an OP 1 HEARTBEAT to the gateway.\r\n\t */\r\n\tprivate heartbeat(): void {\r\n\t\tif (this.betterWs.status !== 1) {\r\n\t\t\tthis.client.emit(\"error\", `Shard ${this.id} was attempting to heartbeat when the ws was not open. Was ${wsStatusTypes[this.betterWs.status]}`);\r\n\t\t\treturn void this._reconnect(true);\r\n\t\t}\r\n\t\tthis.betterWs.sendMessage({ op: OP.HEARTBEAT, d: this.seq === 0 ? null : this.seq });\r\n\t\tthis.lastHeartbeatSend = Date.now();\r\n\t\tif (this._initialHeartbeatTimeout) {\r\n\t\t\tclearTimeout(this._initialHeartbeatTimeout);\r\n\t\t\tthis._initialHeartbeatTimeout = null;\r\n\t\t}\r\n\t\tif (!this.heartbeatTimeout) this.setHeartBeat();\r\n\t}\r\n\r\n\t/**\r\n\t * Handle dispatch events.\r\n\t * @param message Message received from the websocket.\r\n\t */\r\n\tprivate handleDispatch(message: import(\"./Types\").IGatewayDispatch): void {\r\n\t\tthis.client.emit(\"dispatch\", message);\r\n\r\n\t\tif (message.s) { // sequence is from dispatch\r\n\t\t\tif (message.s > this.seq + 1) {\r\n\t\t\t\tthis.client.emit(\"debug\", `Shard ${this.id} invalid sequence: { current: ${this.seq} message: ${message.s} }`);\r\n\t\t\t\tthis.seq = message.s;\r\n\t\t\t\tthis.resume();\r\n\t\t\t}\r\n\t\t\tthis.seq = message.s;\r\n\t\t}\r\n\t\tswitch (message.t) {\r\n\t\tcase \"READY\":\r\n\t\tcase \"RESUMED\":\r\n\t\t\tif (message.t === \"READY\") {\r\n\t\t\t\tif (message.d.resume_gateway_url) this.resumeAddress = `${message.d.resume_gateway_url}?v=${GATEWAY_VERSION}&encoding=${this.options.ws?.encoding === \"etf\" ? \"etf\" : \"json\"}${this.options.ws?.compress ? \"&compress=zlib-stream\" : \"\"}`;\r\n\t\t\t\tthis.sessionId = message.d.session_id;\r\n\t\t\t}\r\n\t\t\tthis.status = \"ready\";\r\n\t\t\tthis.emit(\"stateChange\", \"ready\");\r\n\t\t\tthis._trace = (message.d as unknown as { _trace: string })._trace;\r\n\t\t\tthis.emit(\"ready\", message.t === \"RESUMED\");\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\tvoid 0;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handle a close from the underlying websocket.\r\n\t * @param code Websocket close code.\r\n\t * @param reason Close reason if any.\r\n\t */\r\n\tprivate handleWsClose(code: number, reason: string): void {\r\n\t\tlet gracefulClose = false;\r\n\t\tthis.status = \"disconnected\";\r\n\t\tthis.emit(\"stateChange\", \"disconnected\");\r\n\t\tthis.clearHeartBeat();\r\n\r\n\t\tconst isManualClose = code === 1000 && this._closing;\r\n\r\n\t\tconst message = disconnectMessages[code as keyof typeof disconnectMessages];\r\n\t\tconst isRecoverable = resumableCodes.includes(code);\r\n\t\tconst shouldntReconnect = shouldntAttemptReconnectCodes.includes(code) || isManualClose;\r\n\r\n\t\tif (isRecoverable && this.resumeAddress) this.betterWs.address = this.resumeAddress;\r\n\t\telse this.betterWs.address = this.identifyAddress;\r\n\r\n\t\tif (message) this.client.emit(\"error\", message);\r\n\r\n\t\tif (isManualClose || this.reconnecting) gracefulClose = true;\r\n\r\n\t\tthis._closing = false;\r\n\r\n\t\tthis.emit(\"disconnect\", code, reason, gracefulClose);\r\n\r\n\t\tif (!shouldntReconnect && this.reconnect) this.connect();\r\n\t}\r\n\r\n\t/**\r\n\t * Send an OP 3 PRESENCE_UPDATE to the gateway.\r\n\t * @param data Presence data to send.\r\n\t */\r\n\tpublic async presenceUpdate(data: Partial<GatewayPresenceUpdateData>): Promise<void> {\r\n\t\treturn this.betterWs.sendMessage({ op: OP.PRESENCE_UPDATE, d: this._checkPresenceData(data) });\r\n\t}\r\n\r\n\t/**\r\n\t * Send an OP 4 VOICE_STATE_UPDATE to the gateway.\r\n\t * @param data Voice state update data to send.\r\n\t */\r\n\tpublic async voiceStateUpdate(data: GatewayVoiceStateUpdateData & { self_deaf?: boolean; self_mute?: boolean; }): Promise<void> {\r\n\t\tif (!data) return Promise.resolve();\r\n\t\treturn this.betterWs.sendMessage({ op: OP.VOICE_STATE_UPDATE, d: this._checkVoiceStateUpdateData(data) });\r\n\t}\r\n\r\n\t/**\r\n\t * Send an OP 8 REQUEST_GUILD_MEMBERS to the gateway.\r\n\t * @param data Data to send.\r\n\t */\r\n\tpublic async requestGuildMembers(data: GatewayRequestGuildMembersData & { limit?: number; }): Promise<void> {\r\n\t\treturn this.betterWs.sendMessage({ op: OP.REQUEST_GUILD_MEMBERS, d: this._checkRequestGuildMembersData(data) });\r\n\t}\r\n\r\n\t/**\r\n\t * Checks presence data and fills in missing elements.\r\n\t * @param data Data to send.\r\n\t * @returns Data after it's fixed/checked.\r\n\t */\r\n\tprivate _checkPresenceData(data: Parameters<DiscordConnector[\"presenceUpdate\"]>[\"0\"]): GatewayPresenceUpdateData {\r\n\t\tdata.status = data.status ?? PresenceUpdateStatus.Online;\r\n\t\tdata.activities = data.activities && Array.isArray(data.activities) ? data.activities : [];\r\n\r\n\t\tif (data.activities) {\r\n\t\t\tfor (const activity of data.activities) {\r\n\t\t\t\tconst index = data.activities.indexOf(activity);\r\n\t\t\t\tif (activity.type === undefined) activity.type = activity.url ? 1 : 0;\r\n\t\t\t\tif (!activity.name) {\r\n\t\t\t\t\tif (activity.state && activity.type === 4) activity.name = \"Custom Status\"; // Discord requires name to not be empty even on custom status\r\n\t\t\t\t\telse data.activities.splice(index, 1);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tdata.afk = data.afk ?? false;\r\n\t\tdata.since = data.since ?? Date.now();\r\n\t\treturn data as GatewayPresenceUpdateData;\r\n\t}\r\n\r\n\t/**\r\n\t * Checks voice state update data and fills in missing elements.\r\n\t * @param data Data to send.\r\n\t * @returns Data after it's fixed/checked.\r\n\t */\r\n\tprivate _checkVoiceStateUpdateData(data: Parameters<DiscordConnector[\"voiceStateUpdate\"]>[\"0\"]): GatewayVoiceStateUpdateData {\r\n\t\tdata.channel_id = data.channel_id ?? null;\r\n\t\tdata.self_mute = data.self_mute ?? false;\r\n\t\tdata.self_deaf = data.self_deaf ?? false;\r\n\t\treturn data;\r\n\t}\r\n\r\n\t/**\r\n\t * Checks request guild members data and fills in missing elements.\r\n\t * @param data Data to send.\r\n\t * @returns Data after it's fixed/checked.\r\n\t */\r\n\tprivate _checkRequestGuildMembersData(data: Parameters<DiscordConnector[\"requestGuildMembers\"]>[\"0\"]): GatewayRequestGuildMembersData {\r\n\t\tconst withQuery = data as GatewayRequestGuildMembersDataWithQuery;\r\n\t\tconst withUserIDs = data as GatewayRequestGuildMembersDataWithUserIds;\r\n\t\tif (!withQuery.query && !withUserIDs.user_ids) withQuery.query = \"\";\r\n\t\tif (withQuery.query && withUserIDs.user_ids) delete (data as { query?: string; }).query; // the intention may be to get users by ID\r\n\t\tdata.limit = data.limit ?? 10;\r\n\t\treturn data;\r\n\t}\r\n}\r\n\r\nexport = DiscordConnector;\r\n","\"use strict\";\r\n\r\nimport { EventEmitter } from \"events\";\r\nimport DC = require(\"./DiscordConnector\");\r\n\r\ninterface ShardEvents {\r\n\tdisconnect: [number, string, boolean];\r\n\tready: [boolean];\r\n\tqueueIdentify: [number];\r\n}\r\n\r\ninterface Shard {\r\n\taddListener<E extends keyof ShardEvents>(event: E, listener: (...args: ShardEvents[E]) => any): this;\r\n\temit<E extends keyof ShardEvents>(event: E, ...args: ShardEvents[E]): boolean;\r\n\teventNames(): Array<keyof ShardEvents>;\r\n\tlistenerCount(event: keyof ShardEvents): number;\r\n\tlisteners(event: keyof ShardEvents): Array<(...args: Array<any>) => any>;\r\n\toff<E extends keyof ShardEvents>(event: E, listener: (...args: ShardEvents[E]) => any): this;\r\n\ton<E extends keyof ShardEvents>(event: E, listener: (...args: ShardEvents[E]) => any): this;\r\n\tonce<E extends keyof ShardEvents>(event: E, listener: (...args: ShardEvents[E]) => any): this;\r\n\tprependListener<E extends keyof ShardEvents>(event: E, listener: (...args: ShardEvents[E]) => any): this;\r\n\tprependOnceListener<E extends keyof ShardEvents>(event: E, listener: (...args: ShardEvents[E]) => any): this;\r\n\trawListeners(event: keyof ShardEvents): Array<(...args: Array<any>) => any>;\r\n\tremoveAllListeners(event?: keyof ShardEvents): this;\r\n\tremoveListener<E extends keyof ShardEvents>(event: E, listener: (...args: ShardEvents[E]) => any): this;\r\n}\r\n\r\n/**\r\n * Shard class, which provides a wrapper around the DiscordConnector with metadata like the id of the shard.\r\n *\r\n * This class is automatically instantiated by the library and is documented for reference.\r\n */\r\nclass Shard extends EventEmitter {\r\n\t/** If this shard has received the READY or RESUMED payload and isn't disconnected yet. */\r\n\tpublic ready = false;\r\n\t/** The connector that handles all of the Discord specific connection logic. */\r\n\tpublic connector: DC;\r\n\r\n\t/**\r\n\t * Create a new Shard.\r\n\t * @param id id of the shard.\r\n\t * @param client Main class used for forwarding events.\r\n\t */\r\n\tpublic constructor(public id: number, public client: EventEmitter & { options: Omit<import(\"./Types\").IClientOptions, \"snowtransferInstance\"> & { token: string; endpoint?: string; } }) {\r\n\t\tsuper();\r\n\r\n\t\tthis.connector = new DC(id, client);\r\n\t\tthis.connector.on(\"disconnect\", (...args) => {\r\n\t\t\tthis.ready = false;\r\n\t\t\tthis.emit(\"disconnect\", ...args);\r\n\t\t});\r\n\t\tthis.connector.on(\"ready\", resume => this.emit(\"ready\", resume));\r\n\t\tthis.connector.on(\"queueIdentify\", () => this.emit(\"queueIdentify\", this.id));\r\n\t}\r\n\r\n\t/**\r\n\t * Time in ms it took for Discord to ackknowledge an OP 1 HEARTBEAT.\r\n\t */\r\n\tpublic get latency(): number {\r\n\t\treturn this.connector.latency;\r\n\t}\r\n\r\n\t/**\r\n\t * Create a new connection to Discord.\r\n\t */\r\n\tpublic connect(): void {\r\n\t\tthis.connector.connect();\r\n\t}\r\n\r\n\t/**\r\n\t * Close the current connection to Discord.\r\n\t */\r\n\tpublic disconnect(): Promise<void> {\r\n\t\treturn this.connector.disconnect();\r\n\t}\r\n\r\n\t/**\r\n\t * Send an OP 3 PRESENCE_UPDATE to Discord.\r\n\t * @param data Data to send.\r\n\t */\r\n\tpublic presenceUpdate(data: Parameters<Shard[\"connector\"][\"presenceUpdate\"]>[\"0\"]): Promise<void> {\r\n\t\treturn this.connector.presenceUpdate(data);\r\n\t}\r\n\r\n\t/**\r\n\t * Send an OP 4 VOICE_STATE_UPDATE to Discord.\r\n\t * @param data Data to send\r\n\t */\r\n\tpublic voiceStateUpdate(data: Parameters<Shard[\"connector\"][\"voiceStateUpdate\"]>[\"0\"]): Promise<void> {\r\n\t\treturn this.connector.voiceStateUpdate(data);\r\n\t}\r\n\r\n\t/**\r\n\t * Send an OP 8 REQUEST_GUILD_MEMBERS to Discord.\r\n\t * @param data Data to send.\r\n\t */\r\n\tpublic requestGuildMembers(data: Parameters<Shard[\"connector\"][\"requestGuildMembers\"]>[\"0\"]): Promise<void> {\r\n\t\treturn this.connector.requestGuildMembers(data);\r\n\t}\r\n}\r\n\r\nexport = Shard;\r\n","\"use strict\";\r\n\r\nimport Shard = require(\"./Shard\");\r\nimport { LocalBucket } from \"snowtransfer\";\r\n\r\n/**\r\n * Class used for managing shards for the user.\r\n *\r\n * This class is automatically instantiated by the library and is documented for reference.\r\n */\r\nclass ShardManager {\r\n\t/** The options used by the client */\r\n\tpublic options: ShardManager[\"client\"][\"options\"];\r\n\t/** A Record of shards keyed by their ID */\r\n\tpublic shards: { [id: number]: Shard } = {};\r\n\t/** The bucket used to identify a certain number of shards within a day. */\r\n\tpublic identifyBucket = new LocalBucket(1000, 1000 * 60 * 60 * 24);\r\n\t/** The bucket used to identify x number of shards within 5 second intervals. Larger bots benefit from this, but doesn't change how many times per day any shards can identify. */\r\n\tpublic concurrencyBucket: LocalBucket | null = null;\r\n\r\n\t/**\r\n\t * Create a new ShardManager.\r\n\t */\r\n\tpublic constructor(public client: import(\"events\").EventEmitter & { options: Omit<import(\"./Types\").IClientOptions, \"snowtransferInstance\"> & { token: string; endpoint?: string; } }) {\r\n\t\tthis.options = client.options;\r\n\t}\r\n\r\n\t/**\r\n\t * Create shard instances and add them to the connection queue.\r\n\t */\r\n\tpublic spawn(): void {\r\n\t\tif (!this.concurrencyBucket) throw new Error(\"Trying to spawn shards without calling Client.connect()\");\r\n\t\tfor (const id of (this.options.shards === \"auto\" ? Array(this.options.totalShards).fill(0).map((_, index) => index) : this.options.shards ?? [0])) {\r\n\t\t\tthis.client.emit(\"debug\", `Spawned shard ${id}`);\r\n\t\t\tthis.shards[id] = new Shard(id, this.client);\r\n\t\t\tthis._addListener(this.shards[id]);\r\n\t\t\tthis.shards[id].connector.connect();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Disconnect all shards facilitated by this manager.\r\n\t */\r\n\tpublic disconnect(): void {\r\n\t\tfor (const shardKey in this.shards) {\r\n\t\t\tthis.shards[shardKey].disconnect();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Add event listeners to a shard to that the manager can act on received events.\r\n\t * @param shard Shard to add the event listeners to.\r\n\t */\r\n\tprivate _addListener(shard: Shard): void {\r\n\t\tshard.on(\"ready\", (resume) => {\r\n\t\t\tshard.ready = true;\r\n\t\t\tthis.client.emit(\"debug\", `Shard ${shard.id} ${resume ? \"has resumed\" : \"is ready\"}`);\r\n\t\t\tthis.client.emit(\"shardReady\", { id: shard.id, ready: !resume });\r\n\t\t\tthis._checkReady();\r\n\t\t});\r\n\t\tshard.on(\"queueIdentify\", (shardId) => {\r\n\t\t\tif (!this.shards[shardId]) return this.client.emit(\"debug\", `Received a queueIdentify event for shard ${shardId} but it does not exist. Was it removed?`);\r\n\t\t\tthis.client.emit(\"debug\", `Shard ${shardId} is ready to identify`);\r\n\t\t\tif (shard.connector.reconnecting) return shard.connector.resume();\r\n\t\t\tthis.concurrencyBucket?.queue(() => {\r\n\t\t\t\tthis.identifyBucket.queue(() => this.shards[shardId].connector.identify());\r\n\t\t\t});\r\n\t\t});\r\n\t\tshard.on(\"disconnect\", (code, reason, gracefulClose) => {\r\n\t\t\tthis.client.emit(\"debug\", `Websocket of shard ${shard.id} closed with code ${code} and reason: ${reason ?? \"None\"}`);\r\n\t\t\tif (code === 1000 && gracefulClose) return this._checkDisconnect();\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if all shards spawned by this manager are ready.\r\n\t */\r\n\tprivate _checkReady(): void {\r\n\t\tfor (const shardId in this.shards) {\r\n\t\t\tif (this.shards[shardId]) {\r\n\t\t\t\tif (!this.shards[shardId].ready) return;\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.client.emit(\"ready\");\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if all shards spawned by this manager are disconnected.\r\n\t */\r\n\tprivate _checkDisconnect(): void {\r\n\t\tfor (const shardId in this.shards) {\r\n\t\t\tif (this.shards[shardId]) {\r\n\t\t\t\tif (this.shards[shardId].connector.status !== \"disconnected\") return;\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.client.emit(\"disconnected\");\r\n\t}\r\n\r\n\t/**\r\n\t * Update the status of all currently connected shards which have been spawned by this manager.\r\n\t * @param data Data to send.\r\n\t */\r\n\tpublic async presenceUpdate(data: Parameters<Shard[\"presenceUpdate\"]>[\"0\"]): Promise<void> {\r\n\t\tfor (const shardKey in this.shards) {\r\n\t\t\tif (this.shards[shardKey]) {\r\n\t\t\t\tconst shard = this.shards[shardKey];\r\n\t\t\t\tthis.shardPresenceUpdate(shard.id, data);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Update the status of a single connected shard which has been spawned by this manager.\r\n\t * @param shardId id of the shard.\r\n\t * @param data Data to send.\r\n\t */\r\n\tpublic shardPresenceUpdate(shardId: number, data: Parameters<Shard[\"presenceUpdate\"]>[\"0\"]): Promise<void> {\r\n\t\treturn new Promise((res, rej) => {\r\n\t\t\tconst shard = this.shards[shardId];\r\n\t\t\tif (!shard) rej(new Error(`Shard ${shardId} does not exist`));\r\n\t\t\tif (!shard.ready) return;\r\n\t\t\tshard.presenceUpdate(data).then(result => res(result)).catch(e => rej(e));\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Send an OP 4 VOICE_STATE_UPDATE with a certain shard.\r\n\t * @param shardId id of the shard.\r\n\t * @param data Data to send.\r\n\t */\r\n\tpublic voiceStateUpdate(shardId: number, data: Parameters<Shard[\"voiceStateUpdate\"]>[\"0\"]): Promise<void> {\r\n\t\treturn new Promise((res, rej) => {\r\n\t\t\tconst shard = this.shards[shardId];\r\n\t\t\tif (!shard) rej(new Error(`Shard ${shardId} does not exist`));\r\n\t\t\tif (!shard.ready) return;\r\n\t\t\tshard.voiceStateUpdate(data).then(result => res(result)).catch(e => rej(e));\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Send an OP 8 REQUEST_GUILD_MEMBERS with a certain shard.\r\n\t * @param shardId id of the shard.\r\n\t * @param data Data to send.\r\n\t */\r\n\tpublic requestGuildMembers(shardId: number, data: Parameters<Shard[\"requestGuildMembers\"]>[\"0\"]): Promise<void> {\r\n\t\treturn new Promise((res, rej) => {\r\n\t\t\tconst shard = this.shards[shardId];\r\n\t\t\tif (!shard) rej(new Error(`Shard ${shardId} does not exist`));\r\n\t\t\tif (!shard.ready) return;\r\n\t\t\tshard.requestGuildMembers(data).then(result => res(result)).catch(e => rej(e));\r\n\t\t});\r\n\t}\r\n}\r\n\r\nexport = ShardManager;\r\n","\"use strict\";\r\n\r\nconst version = require(\"../package.json\").version as string;\r\nimport { EventEmitter } from \"events\";\r\nimport Constants = require(\"./Constants\");\r\nimport { SnowTransfer, LocalBucket } from \"snowtransfer\";\r\nimport ShardManager = require(\"./ShardManager\");\r\nimport type {\r\n\tGatewaySendPayload,\r\n\tGatewayReceivePayload,\r\n\tAPIGatewayBotInfo\r\n} from \"discord-api-types/v10\";\r\n\r\ninterface ClientEvents {\r\n\tdebug: [string];\r\n\trawSend: [GatewaySendPayload];\r\n\trawReceive: [GatewayReceivePayload];\r\n\terror: [string]; // no processing messages\r\n\r\n\tevent: [import(\"./Types\").IGatewayMessage];\r\n\tdispatch: [import(\"./Types\").IGatewayDispatch];\r\n\tshardReady: [{ id: number; ready: boolean; }];\r\n\tready: [];\r\n\tdisconnected: [];\r\n}\r\n\r\ninterface Client {\r\n\taddListener<E extends keyof ClientEvents>(event: E, listener: (...args: ClientEvents[E]) => any): this;\r\n\temit<E extends keyof ClientEvents>(event: E, ...args: ClientEvents[E]): boolean;\r\n\teventNames(): Array<keyof ClientEvents>;\r\n\tlistenerCount(event: keyof ClientEvents): number;\r\n\tlisteners(event: keyof ClientEvents): Array<(...args: Array<any>) => any>;\r\n\toff<E extends keyof ClientEvents>(event: E, listener: (...args: ClientEvents[E]) => any): this;\r\n\ton<E extends keyof ClientEvents>(event: E, listener: (...args: ClientEvents[E]) => any): this;\r\n\tonce<E extends keyof ClientEvents>(event: E, listener: (...args: ClientEvents[E]) => any): this;\r\n\tprependListener<E extends keyof ClientEvents>(event: E, listener: (...args: ClientEvents[E]) => any): this;\r\n\tprependOnceListener<E extends keyof ClientEvents>(event: E, listener: (...args: ClientEvents[E]) => any): this;\r\n\trawListeners(event: keyof ClientEvents): Array<(...args: Array<any>) => any>;\r\n\tremoveAllListeners(event?: keyof ClientEvents): this;\r\n\tremoveListener<E extends keyof ClientEvents>(event: E, listener: (...args: ClientEvents[E]) => any): this;\r\n}\r\n\r\n/**\r\n * Main class used for receiving events and interacting with the Discord gateway.\r\n */\r\nclass Client extends EventEmitter {\r\n\t/** The Discord auth token to connect with. */\r\n\tpublic token: string;\r\n\t/** User specific options filled in with defaults if not specified. */\r\n\tpublic options: Omit<import(\"./Types\").IClientOptions, \"snowtransferInstance\"> & { token: string; endpoint?: string; };\r\n\t/** The manager of all of the shards used to connect to Discord. */\r\n\tpublic shardManager: ShardManager;\r\n\t/** The version string of CloudStorm. */\r\n\tpublic version = version;\r\n\t/** The SnowTransfer instance to use to make some requests to get connect info. */\r\n\tprivate _restClient: SnowTransfer;\r\n\r\n\t/**\r\n\t * Create a new Client to connect to the Discord gateway.\r\n\t * @param token Token received from creating a discord bot user, which will be used to connect to the gateway.\r\n\t * @param options Baseline options to use. Will be filled with defaults if not specified.\r\n\t */\r\n\tpublic constructor(token: string, options: import(\"./Types\").IClientOptions = {}) {\r\n\t\tsuper();\r\n\t\tif (!token) throw new Error(\"Missing token!\");\r\n\t\tthis.options = {\r\n\t\t\tlargeGuildThreshold: 250,\r\n\t\t\tshards: \"auto\",\r\n\t\t\treconnect: true,\r\n\t\t\tintents: 0,\r\n\t\t\ttoken: \"\",\r\n\t\t\tws: {\r\n\t\t\t\tcompress: true,\r\n\t\t\t\tencoding: \"json\"\r\n\t\t\t}\r\n\t\t};\r\n\t\tthis._restClient = options.snowtransferInstance ? options.snowtransferInstance : new SnowTransfer(token);\r\n\t\tdelete options.snowtransferInstance;\r\n\t\tthis.token = token.startsWith(\"Bot \") ? token.substring(4) : token;\r\n\t\tObject.assign(this.options, options);\r\n\t\tthis.options.token = token;\r\n\t\tthis.shardManager = new ShardManager(this);\r\n\t}\r\n\r\n\t/**\r\n\t * Create one or more connections (depending on the selected amount of shards) to the Discord gateway.\r\n\t * @returns This function returns a promise which is solely used for awaiting the getGateway() method's return value.\r\n\t */\r\n\tpublic async connect(): Promise<void> {\r\n\t\tconst initial = await this.fetchConnectInfo();\r\n\t\tif (this.options.shards === \"auto\") this.options.totalShards = initial;\r\n\t\tthis.shardManager.spawn();\r\n\t}\r\n\r\n\t/**\r\n\t * Method to grab initial connection info from Discord.\r\n\t * Should only be called automatically by the lib unless you are a large bot with a max_concurrency not equal to 1.\r\n\t * If you are a large bot, you should call this method at a rate of your own discretion to update your max_concurrency cached value to have up to date bucket info.\r\n\t * @returns The amount of shards the bot should spawn if set to auto.\r\n\t */\r\n\tpublic async fetchConnectInfo(): Promise<number> {\r\n\t\tconst gateway = await this.getGatewayBot();\r\n\t\tthis._updateEndpoint(gateway.url);\r\n\t\tconst oldQueueConcurrency = [] as Array<() => unknown>;\r\n\t\tconst oldQueueIdentify = [] as Array<() => unknown>;\r\n\t\tif (this.shardManager.concurrencyBucket?.fnQueue.length) {\r\n\t\t\toldQueueConcurrency.push(...this.shardManager.concurrencyBucket.fnQueue);\r\n\t\t\tthis.shardManager.concurrencyBucket.dropQueue();\r\n\t\t}\r\n\t\tif (this.shardManager.identifyBucket.fnQueue.length) oldQueueIdentify.push(...this.shardManager.identifyBucket.fnQueue);\r\n\t\tthis.shardManager.identifyBucket.dropQueue();\r\n\t\tthis.shardManager.concurrencyBucket = new LocalBucket(gateway.session_start_limit.max_concurrency, 5000);\r\n\t\tthis.shardManager.identifyBucket.remaining = gateway.session_start_limit.remaining;\r\n\t\tthis.shardManager.identifyBucket.reset = gateway.session_start_limit.reset_after;\r\n\t\tfor (const fn of oldQueueConcurrency) {\r\n\t\t\tthis.shardManager.concurrencyBucket.queue(fn);\r\n\t\t}\r\n\t\tfor (const fn of oldQueueIdentify) {\r\n\t\t\tthis.shardManager.identifyBucket.queue(fn);\r\n\t\t}\r\n\t\treturn gateway.shards;\r\n\t}\r\n\r\n\t/**\r\n\t * Get the gateway endpoint to connect to.\r\n\t * @returns String url with the Gateway Endpoint to connect to.\r\n\t */\r\n\tpublic async getGateway(): Promise<string> {\r\n\t\tconst gatewayData = await this._restClient.bot.getGateway();\r\n\t\treturn gatewayData.url;\r\n\t}\r\n\r\n\t/**\r\n\t * Get the GatewayData including recommended amount of shards and other helpful info.\r\n\t * @returns Object with url and shards to use to connect to discord.\r\n\t */\r\n\tpublic async getGatewayBot(): Promise<APIGatewayBotInfo> {\r\n\t\treturn this._restClient.bot.getGatewayBot();\r\n\t}\r\n\r\n\t/**\r\n\t * Disconnect the bot gracefully,\r\n\t * you will receive a 'disconnected' event once the ShardManager successfully closes all shard websocket connections.\r\n\t */\r\n\tpublic disconnect(): void {\r\n\t\treturn this.shardManager.disconnect();\r\n\t}\r\n\r\n\t/**\r\n\t * Send an OP 3 PRESENCE_UPDATE to Discord, which updates the status of all shards facilitated by this client's ShardManager.\r\n\t * @returns Promise that's resolved once all shards have sent the websocket payload.\r\n\t *\r\n\t * @example\r\n\t * // Connect to Discord and set status to do not disturb and activity to \"Memes are Dreams\".\r\n\t * const CloudStorm = require(\"cloudstorm\"); // CloudStorm also supports import statements.\r\n\t * const token = \"token\";\r\n\t * const client = new CloudStorm.Client(token);\r\n\t * client.connect();\r\n\t * client.once(\"ready\", () => {\r\n\t * \t// Client is connected to Discord and is ready, so we can update the status.\r\n\t * \tclient.presenceUpdate({ status: \"dnd\", activities: [{ name: \"Memes are Dreams\", type: 0 }] });\r\n\t * });\r\n\t */\r\n\tpublic async presenceUpdate(data: Parameters<Client[\"shardManager\"][\"presenceUpdate\"]>[\"0\"]): Promise<void> {\r\n\t\treturn this.shardManager.presenceUpdate(data);\r\n\t}\r\n\r\n\t/**\r\n\t * Send an OP 3 PRESENCE_UPDATE to Discord, which updates the status of a single shard facilitated by this client's ShardManager.\r\n\t * @param shardId id of the shard that should update it's status.\r\n\t * @param data Presence data to send.\r\n\t * @returns Promise that's resolved once the shard has sent the websocket payload.\r\n\t *\r\n\t * @example\r\n\t * // Connect to Discord and set status to do not disturb and activity to \"Im shard 0\".\r\n\t * const CloudStorm = require(\"cloudstorm\"); // CloudStorm also supports import statements.\r\n\t * const token = \"token\";\r\n\t * const client = new CloudStorm.Client(token);\r\n\t * client.connect();\r\n\t * client.once(\"ready\", () => {\r\n\t * \t// Client is connected to Discord and is ready, so we can update the status of shard 0.\r\n\t * \tclient.shardPresenceUpdate(0, { status: \"dnd\", activities: [{ name: \"Im shard 0\", type: 0 }] });\r\n\t * });\r\n\t */\r\n\tpublic shardStatusUpdate(shardId: number, data: Parameters<Client[\"shardManager\"][\"shardPresenceUpdate\"]>[\"1\"]): Promise<void> {\r\n\t\treturn this.shardManager.shardPresenceUpdate(shardId, data);\r\n\t}\r\n\r\n\t/**\r\n\t * Send an OP 4 VOICE_STATE_UPDATE to Discord. this does **not** allow you to send audio with CloudStorm itself,\r\n\t * it just provides the necessary data for another application to send audio data to Discord.\r\n\t * @param shardId id of the shard that should send the payload.\r\n\t * @param data Voice state update data to send.\r\n\t * @returns Promise that's resolved once the payload was sent to Discord.\r\n\t *\r\n\t * @example\r\n\t * // Connect to Discord and join a voice channel\r\n\t * const CloudStorm = require(\"cloudstorm\"); // CloudStorm also supports import statements.\r\n\t * const token = \"token\";\r\n\t * const client = new CloudStorm.Client(token);\r\n\t * client.connect();\r\n\t * client.once(\"ready\", () => {\r\n\t * \t// Client is connected to Discord and is ready, so we can join a voice channel.\r\n\t * \t// We will use shard 0 as the shard to send the payload.\r\n\t * \tclient.voiceStateUpdate(0, { guild_id: \"id\", channel_id: \"id\", self_mute: false, self_deaf: false });\r\n\t * });\r\n\t */\r\n\tpublic voiceStateUpdate(shardId: number, data: Parameters<Client[\"shardManager\"][\"voiceStateUpdate\"]>[\"1\"]): Promise<void> {\r\n\t\treturn this.shardManager.voiceStateUpdate(shardId, data);\r\n\t}\r\n\r\n\t/**\r\n\t * Send an OP 8 REQUEST_GUILD_MEMBERS to Discord.\r\n\t * @param shardId id of the shard that should send the payload.\r\n\t * @param data Request guild members data to send.\r\n\t * @returns Promise that's resolved once the payload was send to Discord.\r\n\t *\r\n\t * @example\r\n\t * // Connect to Discord and request guild members.\r\n\t * const CloudStorm = require(\"cloudstorm\"); // CloudStorm also supports import statements.\r\n\t * const token = \"token\";\r\n\t * const client = new CloudStorm.Client(token);\r\n\t * client.connect();\r\n\t * client.once(\"ready\", () => {\r\n\t * \t// Client is connected to Discord and is ready, so we can send the request guild members payload.\r\n\t * \t// We will use shard 0 as the shard to send the payload.\r\n\t * \tclient.requestGuildMembers(0, { guild_id: \"id\" });\r\n\t * });\r\n\t */\r\n\tpublic requestGuildMembers(shardId: number, data: Parameters<Client[\"shardManager\"][\"requestGuildMembers\"]>[\"1\"]): Promise<void> {\r\n\t\tif (!data.guild_id) throw new Error(\"You need to pass a guild_id\");\r\n\t\treturn this.shardManager.requestGuildMembers(shardId, data);\r\n\t}\r\n\r\n\t/**\r\n\t * Update the endpoint shard websockets will connect to.\r\n\t * @param gatewayUrl Base gateway wss url to update the cached endpoint to.\r\n\t */\r\n\tprivate _updateEndpoint(gatewayUrl: string): void {\r\n\t\tthis.options.endpoint = `${gatewayUrl}?v=${Constants.GATEWAY_VERSION}&encoding=${this.options.ws?.encoding === \"etf\" ? \"etf\" : \"json\"}${this.options.ws?.compress ? \"&compress=zlib-stream\" : \"\"}`;\r\n\t}\r\n}\r\n\r\nexport = Client;\r\n","import Client2 = require(\"./Client\");\r\nimport Constants = require(\"./Constants\");\r\nimport Intents = require(\"./Intents\");\r\n\r\nimport Shard2 = require(\"./Shard\");\r\nimport ShardManager2 = require(\"./ShardManager\");\r\n\r\nimport BetterWs2 = require(\"./BetterWs\");\r\n\r\nexport { BetterWs2 as BetterWs, Client2 as Client, Constants, Intents, Shard2 as Shard, ShardManager2 as ShardManager };\r\nexport * from \"./Types\";\r\n"],"mappings":"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","names":["exports","module","exports","module","Constants","exports","module","resolve","exports","module","Intents","OP","exports","module","exports","module","exports","module","Constants"]}
1
+ {"version":3,"sources":["../src/Constants.ts","../src/BetterWs.ts","../src/Intents.ts","../src/DiscordConnector.ts","../src/Shard.ts","../src/ShardManager.ts","../src/Client.ts","../src/index.ts"],"names":["Constants","resolve","EventEmitter","Intents","OP","LocalBucket"],"mappings":"02CAAA,kFAEA,IAAMA,WAAY,CACjB,iBAAkB,CAIjB,SAAU,EAIV,UAAW,EAIX,SAAU,EAIV,gBAAiB,EAIjB,mBAAoB,EAIpB,OAAQ,EAIR,UAAW,EAIX,sBAAuB,EAIvB,gBAAiB,EAIjB,MAAO,GAIP,cAAe,EAChB,EACA,gBAAiB,EAClB,EAEA,eAASA,cC9CT,OAAS,iBAAoB,SAC7B,OAAS,YAAa,eAAkB,SACxC,OAAS,cAAe,YAAa,cAAiB,OAMtD,OAAS,gBAAmB,eAd5B,gFAYA,qBAAiC,6BAH1B,MAAQ,UAAQ,SAChB,KAAO,UAAQ,QACf,KAAO,UAAQ,QAkChB,SAAN,cAAuB,YAAa,CAoC5B,YAAmB,QAAwB,QAAyI,CAC1L,MAAM,EADmB,qBAAwB,qBA9BlD,KAAO,SAAW,IAAI,YAAY,IAAK,GAAK,EAE5C,KAAO,eAAiB,IAAI,YAAY,EAAG,GAAK,EAGhD,KAAQ,QAAyB,KAEjC,KAAO,UAMH,CACF,aAAc,KACd,aAAc,KACd,KAAM,IACP,EAED,KAAQ,YAAc,GAEtB,KAAQ,eAAgC,KAExC,KAAQ,iBAAkC,KAUzC,KAAK,SAAW,QAAQ,UAAY,QACpC,KAAK,SAAW,QAAQ,UAAY,EACrC,CAKA,IAAW,QAAwB,CAClC,IAAM,SAAW,KAAK,UACtB,OAAI,KAAK,YAAoB,EACzB,SAAS,aAAqB,EAC7B,KAAK,QACH,EADmB,CAE3B,CAKO,SAAyB,CAC/B,GAAI,KAAK,SAAW,KAAK,YAAa,OAAO,QAAQ,QAAQ,MAAM,EACnE,KAAK,YAAc,GACnB,IAAM,IAAM,YAAY,EAAE,EAAE,SAAS,QAAQ,EACvC,IAAM,IAAI,IAAI,KAAK,OAAO,EAC1B,SAAY,IAAI,WAAa,UAAY,IAAI,WAAa,QAAW,IAAI,OAAS,MAClF,KAAO,IAAI,OAAS,SAAW,MAAQ,MACvC,KAAO,SAAW,MAAQ,MAAM,QAAQ,CAC7C,SAAU,IAAI,SACd,KAAM,GAAG,IAAI,QAAQ,GAAG,IAAI,MAAM,GAClC,KACA,QAAS,CACR,WAAc,UACd,QAAW,YACX,oBAAqB,IACrB,wBAAyB,KACzB,GAAG,KAAK,QAAQ,OACjB,CACD,CAAC,EACG,WACA,gBAAkB,GACtB,OAAO,IAAI,QAAc,CAACC,SAAS,SAAW,CAC7C,KAAK,UAAU,aAAe,OAC9B,IAAM,QAAU,KAAK,WAAW,KAAK,KAAM,IAAK,IAAKA,SAAS,MAAM,EACpE,WAAa,GAAK,CACjB,KAAK,UAAU,aAAe,KAC9B,gBAAkB,GAClB,KAAK,YAAc,GACnB,IAAI,eAAe,UAAW,OAAO,EACrC,OAAO,CAAC,CACT,EACA,IAAI,KAAK,UAAW,OAAO,EAC3B,IAAI,KAAK,QAAS,UAAU,EAC5B,IAAI,IAAI,CACT,CAAC,EAAE,MAAM,SACJ,YAAc,CAAC,kBAClB,IAAI,QAAQ,EACZ,IAAI,eAAe,QAAS,UAAU,EACtC,WAAW,MAAM,GAEX,QAAQ,OAAO,MAAM,EAC5B,CACF,CAQA,MAAa,MAAM,KAAc,OAAgC,CAChE,IAAM,SAAW,KAAK,UACtB,GAAI,SAAS,aAAc,OAAO,SAAS,aAC3C,GAAI,CAAC,KAAK,QAAS,OAAO,QAAQ,QAAQ,MAAM,EAChD,IAAI,SACE,QAAU,IAAI,QAAQA,UAAW,CACtC,SAAWA,SACX,IAAM,KAAO,OAAO,KAAK,CAAC,MAAQ,EAAG,KAAO,GAAG,CAAC,EAChD,KAAK,OAAO,OAAS,OAAO,OAAO,CAAC,KAAM,OAAO,KAAK,MAAM,CAAC,CAAC,EAAI,KAAM,CAAC,CAC1E,CAAC,EAAE,KAAK,IAAM,CACb,SAAS,aAAe,IACzB,CAAC,EAED,eAAQ,QAAU,SAClB,SAAS,aAAe,QACjB,OACR,CAOO,YAAY,KAA0B,CAC5C,OAAO,IAAI,QAAQ,KAAO,CACzB,IAAM,UAAW,uBAAM,MAAO,kCAAiB,gBACzC,QAAU,IAAM,CACrB,IAAM,GAAK,IAAM,CAChB,KAAK,KAAK,UAAW,IAAI,EACrB,KAAK,WAAa,OAAQ,KAAK,OAAO,OAAO,KAAK,KAAK,UAAU,IAAI,CAAC,EAAG,CAAC,EACrE,KAAK,WAAa,MAAO,KAAK,OAAO,SAAS,IAAI,EAAG,CAAC,EACtD,KAAK,WAAa,SAAS,KAAK,OAAO,OAAO,KAAK,IAAI,EAAG,CAAC,EACpE,IAAI,MAAM,CACX,EACI,KAAK,QAAQ,cAAe,GAAG,EAC9B,KAAK,SAAS,MAAM,EAAE,CAC5B,EACI,UAAY,CAAC,KAAK,QAAQ,cAAe,KAAK,eAAe,MAAM,OAAO,EACzE,QAAQ,CACd,CAAC,CACF,CAOQ,OAAO,OAAgB,OAAsB,CACpD,IAAM,OAAS,KAAK,QACpB,GAAI,EAAC,qBAAQ,UAAU,OACvB,IAAM,OAAS,OAAO,OAClB,MACA,OAAS,KACZ,MAAQ,OAAO,YAAY,EAAI,MAAM,EACrC,MAAM,CAAC,EAAI,IAAM,QACP,OAAU,OACpB,MAAQ,OAAO,YAAY,EAAI,MAAM,EACrC,MAAM,CAAC,EAAI,IACX,MAAM,CAAC,EAAI,QAAU,EACrB,MAAM,CAAC,EAAI,OAAS,MAEpB,MAAQ,OAAO,YAAY,GAAK,MAAM,EACtC,MAAM,CAAC,EAAI,IACX,MAAM,iBAAiB,OAAO,MAAM,EAAG,CAAC,GAEzC,MAAM,CAAC,EAAI,IAAM,OACjB,MAAM,cAAc,EAAG,MAAM,OAAS,OAAS,CAAC,EAChD,MAAM,IAAI,OAAQ,MAAM,OAAS,MAAM,EACvC,OAAO,MAAM,KAAK,CACnB,CAWQ,WAAW,IAAa,IAAyBA,SAAoD,OAAgC,IAA2B,OAAsB,CAC7L,KAAK,UAAU,aAAe,KAC9B,IAAM,KAAO,WAAW,MAAM,EAAE,OAAO,IAAM,sCAAsC,EAAE,OAAO,QAAQ,EAC9F,OAAS,IAAI,QAAQ,sBAAsB,EACjD,GAAI,OAAS,OAAQ,CACpB,OAAO,IAAI,IAAM,CAChB,KAAK,KAAK,QAAS,iCAAiC,EACpD,KAAK,YAAc,GACnB,OAAO,IAAI,MAAM,4CAA4C,IAAI,gBAAgB,MAAM,EAAE,CAAC,CAC3F,CAAC,EACD,MACD,CAMA,GALA,OAAO,KAAK,QAAS,KAAK,SAAS,KAAK,IAAI,CAAC,EAC7C,OAAO,KAAK,QAAS,KAAK,SAAS,KAAK,IAAI,CAAC,EAC7C,OAAO,GAAG,WAAY,KAAK,YAAY,KAAK,IAAI,CAAC,EACjD,KAAK,QAAU,OACf,KAAK,YAAc,GACf,KAAK,SAAU,CAClB,IAAM,EAAI,cAAc,EAExB,EAAE,GAAK,EAAE,MAAO,EAAE,GAAK,EAAE,QAAS,EAAE,IAAM,EAAE,QAAQ,MAAO,EAAE,GAAK,IAAG,GACrE,KAAK,UAAU,KAAO,CACvB,CACA,KAAK,KAAK,SAAS,EACnBA,SAAQ,MAAM,EACd,IAAI,mBAAmB,OAAO,CAC/B,CAMQ,SAAS,MAAoB,CAC/B,KAAK,UACV,KAAK,KAAK,QAAS,KAAK,QAAQ,MAAO,GAAM,EAAG,EAAK,CAAC,EACtD,KAAK,OAAO,OAAO,YAAY,CAAC,EAAG,CAAC,EACrC,CAKQ,UAAiB,CACxB,IAAM,OAAS,KAAK,QACd,SAAW,KAAK,UACjB,SACL,OAAO,eAAe,OAAQ,KAAK,WAAW,EAC9C,OAAO,eAAe,QAAS,KAAK,QAAQ,EAC5C,KAAK,SAAS,UAAU,EACxB,KAAK,eAAe,UAAU,EAC9B,KAAK,QAAU,KACf,KAAK,KAAK,WAAY,KAAK,gBAAkB,KAAM,KAAK,kBAAoB,kBAAkB,EAC9F,KAAK,eAAiB,KACtB,KAAK,iBAAmB,KACpB,SAAS,OACZ,SAAS,KAAK,MAAM,EACpB,SAAS,KAAO,MAGb,SAAS,cAAc,SAAS,aAAa,QAAQ,MAAM,EAChE,CAKQ,aAAoB,CAC3B,IAAM,OAAS,KAAK,QACpB,OAAO,2BAAQ,iBAAkB,GAAK,GAAG,CACxC,IAAI,OAAS,UAAU,OAAS,EAAG,CAAC,EAAI,IACpC,MAAQ,EACZ,GAAI,OAAS,IAAK,CAEjB,GADA,MAAQ,SAAW,IAAM,EAAI,EACzB,OAAQ,eAAiB,EAAI,MAAO,OACxC,OAAS,UAAU,OAAS,EAAG,KAAK,CACrC,CACA,IAAM,MAAQ,OAAQ,KAAK,EAAI,MAAQ,MAAM,EAC7C,GAAI,CAAC,MAAO,OACZ,IAAM,IAAM,MAAM,CAAC,GAAK,EAClB,OAAS,MAAM,CAAC,EAAI,IACtB,MAAQ,GAAK,SAAW,IAAG,KAAK,KAAK,QAAS,mFAAmF,EACrI,IAAM,QAAU,MAAM,SAAS,EAAI,KAAK,EACxC,KAAK,cAAc,OAAQ,OAAO,CACnC,CACD,CAOQ,cAAc,OAAgB,QAAuB,CAC5D,IAAM,SAAW,KAAK,UACtB,OAAQ,OAAQ,CAChB,IAAK,GAAG,CACP,IAAI,OACA,KAAK,WAAa,OAAQ,OAAS,KAAK,MAAM,QAAQ,SAAS,CAAC,EAC3D,KAAK,WAAa,UAAS,OAAS,SAC7C,KAAK,KAAK,aAAc,MAAM,EAC9B,KACD,CACA,IAAK,GAAG,CACP,IAAI,OACJ,GAAI,KAAK,SAAU,CAClB,IAAM,EAAI,SAAS,KACf,MAAQ,KACR,KAAO,KAEX,EAAE,MAAQ,EAAE,QAAQ,MAAQ,EAAE,GAC9B,GAAI,CAEH,KAAO,EAAE,cAAc,QAAS,UAAU,YAAY,CACvD,OAAQ,EAAG,CACV,MAAQ,CACT,CACA,IAAM,EAAI,QAAQ,OAalB,IAZI,QAAQ,EAAI,CAAC,IAAM,GAAK,QAAQ,EAAI,CAAC,IAAM,GAAK,QAAQ,EAAI,CAAC,IAAM,KAAO,QAAQ,EAAI,CAAC,IAAM,MAAK,KAAK,KAAK,QAAS,wFAAwF,EAEjN,EAAE,MAAQ,EAAE,GAEZ,EAAE,QAAU,EAAE,GAEd,EAAE,QAAQ,MAAQ,EAAE,IAEpB,EAAE,QAAQ,MAAQ,OAElB,EAAE,cACF,EAAG,mBAAmB,OAAO,EACzB,MAAO,CACV,KAAK,KAAK,QAAS,6BAA6B,EAChD,KAAK,OAAO,OAAO,YAAY,CAAC,EAAG,CAAC,EACpC,MACD,CACA,GAAI,CAAC,KAAM,CACV,KAAK,KAAK,QAAS,uEAAuE,EAC1F,MACD,CACI,KAAK,WAAa,OAAQ,OAAS,KAAK,MAAM,OAAO,IAAI,CAAC,EACrD,KAAK,WAAa,MAAO,OAAS,QAAQ,KAAM,CAAC,EACjD,KAAK,WAAa,UAAS,OAAS,KAC9C,MAAW,KAAK,WAAa,OAAQ,OAAS,KAAK,MAAM,YAAY,OAAO,EAAE,SAAS,CAAC,EAC/E,KAAK,WAAa,MAAO,OAAS,QAAQ,QAAS,CAAC,EACpD,KAAK,WAAa,UAAS,OAAS,SAC7C,KAAK,KAAK,aAAc,MAAM,EAC9B,KACD,CACA,IAAK,GAAG,CACP,KAAK,eAAiB,QAAQ,OAAS,GAAK,QAAQ,CAAC,GAAK,GAAK,QAAQ,CAAC,EAAI,EAC5E,KAAK,iBAAmB,QAAQ,OAAS,EAAI,QAAQ,SAAS,CAAC,EAAE,SAAS,EAAI,GAC9E,KAAK,OAAO,OAAO,KAAK,CAAC,KAAK,gBAAkB,EAAG,KAAK,eAAiB,GAAG,CAAC,EAAG,CAAC,EACjF,KACD,CACA,IAAK,GAAG,CACP,KAAK,OAAO,QAAS,EAAE,EACvB,KACD,CACA,CACD,CACD,EAEA,SAAS,UAAU,OAA8B,MAAe,MAAuB,CACtF,IAAI,OAAS,EACT,KAAO,EACP,IAAM,EAGJ,SAAW,OAAO,eACpB,mBAAqB,SAAS,YAC9B,cAAgB,SAAS,OAAO,MAAQ,SAAS,OAAO,kBAAkB,EAE9E,EAAG,CACF,IAAM,KAAO,cAAc,MAAQ,cACnC,QAAW,WAAW,KACrB,GAAI,EAAE,OAAS,QACd,KAAO,IACP,KAAO,QACH,EAAE,OAAS,OAAO,OAAO,GAGhC,OAAS,cAAiB,cAAc,MAAQ,SAAS,OAAO,EAAE,kBAAkB,GACpF,MAAM,IAAI,MAAM,mBAAmB,CACpC,CAEA,SAAS,QAAQ,KAAc,MAAoD,CAClF,IAAI,KACA,EAAI,MACF,KAAO,IAAM,CAClB,IAAM,KAAO,KAAK,GAAG,EACrB,OAAO,KAAM,CACb,IAAK,IACJ,OAAO,KAAK,GAAG,EAEhB,IAAK,IAAI,CACR,IAAM,IAAM,KAAK,YAAY,CAAC,EAC9B,UAAK,EACE,GACR,CACA,IAAK,KAAK,CACT,IAAM,OAAS,KAAK,aAAa,CAAC,EAC9B,KAAO,GACX,GAAI,OAAS,GAEZ,KAAO,KAAK,YAAY,GAAK,EAAG,EAAI,MAAM,MAE1C,SAAS,EAAI,GAAK,EAAG,EAAI,EAAI,OAAQ,IACpC,MAAQ,OAAO,aAAa,KAAK,CAAC,CAAC,EAIrC,OADA,GAAK,OACA,KACD,OAAS,OAAS,OAAS,OAAe,KAC1C,OAAS,OAAe,GACxB,OAAS,QAAgB,GACtB,KAJI,MAKZ,CACA,IAAK,KAAK,IAAK,KAAK,CACnB,IAAM,MAAQ,CAAC,EACf,GAAI,OAAS,IAAK,CACjB,IAAM,OAAS,KAAK,aAAa,CAAC,EAClC,GAAK,EACL,QAAS,EAAI,EAAG,EAAI,OAAQ,IAC3B,MAAM,KAAK,KAAK,CAAC,EAElB,GACD,CACA,OAAO,KACR,CACA,IAAK,KAAK,CACT,IAAM,MAAQ,CAAC,EACT,OAAS,KAAK,aAAa,CAAC,EAClC,GAAK,EACL,QAAS,EAAI,EAAG,EAAI,OAAQ,IAC3B,MAAM,KAAK,KAAK,GAAG,CAAC,EAErB,OAAO,KACR,CACA,IAAK,KAAK,CACT,IAAM,OAAS,KAAK,aAAa,CAAC,EAC9B,IAAM,GACV,GAAI,OAAS,GAEZ,IAAM,KAAK,UAAU,GAAK,EAAG,EAAI,MAAM,MACjC,CACN,IAAI,EAAI,GAAK,EACP,EAAI,EAAI,OACd,KAAM,EAAI,GAAG,CACZ,IAAM,KAAO,KAAK,GAAG,EACjB,KAAO,IAAK,KAAO,OAAO,aAAa,IAAI,EACtC,KAAO,IAAK,KAAO,OAAO,eAAe,KAAO,KAAO,IAAM,KAAK,GAAG,EAAI,GAAG,EAC5E,KAAO,IAAK,KAAO,OAAO,eAAe,KAAO,KAAO,MAAQ,KAAK,GAAG,EAAI,KAAO,IAAM,KAAK,GAAG,EAAI,GAAG,EAC3G,KAAO,OAAO,gBAAgB,KAAO,IAAM,MAAQ,KAAK,GAAG,EAAI,KAAO,MAAQ,KAAK,GAAG,EAAI,KAAO,IAAM,KAAK,GAAG,EAAI,GAAG,CAC5H,CACD,CACA,UAAK,OACE,GACR,CACA,IAAK,KAAK,CAEJ,OAAM,KAAO,IAAI,SAAS,KAAK,OAAQ,KAAK,OAAQ,KAAK,UAAU,GACxE,IAAM,OAAS,KAAK,GAAG,EACjB,KAAO,KAAK,GAAG,EACjB,KAAO,OACP,IAAM,OAAO,CAAC,EAClB,KAAM,KAAO,GACR,MAAQ,GACX,MAAQ,OAAO,EAAE,EACjB,KAAO,KAAK,aAAa,GAAK,MAAQ,GAAI,EAAI,GACpC,MAAQ,GAClB,MAAQ,OAAO,EAAE,EAEjB,KAAO,OAAO,KAAK,UAAU,GAAK,MAAQ,EAAE,EAAG,EAAI,GACzC,MAAQ,GAClB,MAAQ,OAAO,EAAE,EAEjB,KAAO,OAAO,KAAK,UAAU,GAAK,MAAQ,EAAE,EAAG,EAAI,IAEnD,MAAQ,OAAO,CAAC,EAChB,KAAO,OAAO,KAAK,CAAC,CAAC,EACrB,QAGF,UAAK,QACG,KAAO,CAAC,IAAM,KAAK,SAAS,CACrC,CACA,IAAK,KAAK,CACT,IAAM,IAAM,CAAC,EACP,OAAS,KAAK,aAAa,CAAC,EAClC,GAAK,EACL,QAAQ,EAAI,EAAG,EAAI,OAAQ,IAAK,CAC/B,IAAM,IAAM,KAAK,EAEjB,IAAI,GAAG,EAAI,KAAK,CACjB,CACA,OAAO,GACR,CACA,CACA,MAAM,IAAI,MAAM,qBAAqB,IAAI,EAAE,CAC5C,EACA,OAAO,KAAK,CACb,CAEA,SAAS,SAAS,KAAmB,CACpC,IAAM,EAAI,OAAO,YAAY,IAAO,EACpC,EAAE,CAAC,EAAI,IACP,IAAI,EAAI,EACF,KAAQ,KAAa,CAE1B,OADa,OAAO,IACP,CACb,IAAK,UAAW,CACf,EAAE,GAAG,EAAI,IACL,KACH,EAAE,cAAc,EAAG,CAAC,EAEpB,EAAE,YAAY,OAAQ,GAAK,CAAC,EAC5B,GAAK,IAEL,EAAE,cAAc,EAAG,CAAC,EAEpB,EAAE,YAAY,QAAS,GAAK,CAAC,EAC7B,GAAK,GAEN,KACD,CACA,IAAK,SAAU,CACd,IAAM,OAAS,OAAO,WAAW,GAAG,EACpC,EAAE,GAAG,EAAI,IACT,EAAE,cAAc,OAAQ,CAAC,EAEzB,EAAE,UAAU,IAAK,GAAK,CAAC,EACvB,GAAK,OACL,KACD,CACA,IAAK,SAAU,CACd,GAAI,OAAO,UAAU,GAAG,EAAG,CAC1B,IAAM,IAAM,KAAK,IAAI,GAAG,EACxB,GAAI,IAAM,WACT,EAAE,GAAG,EAAI,GACT,EAAE,aAAa,IAAK,CAAC,EACrB,GAAK,UACK,IAAM,OAAO,iBAAkB,CACzC,EAAE,GAAG,EAAI,IACT,EAAE,GAAG,EAAI,EACT,EAAE,GAAG,EAAI,EAAO,IAAM,GACtB,EAAE,iBAAiB,OAAO,GAAG,EAAG,CAAC,EACjC,GAAK,EACL,KACD,MACC,EAAE,GAAG,EAAI,GACT,EAAE,cAAc,IAAK,CAAC,EACtB,GAAK,CAEP,MACC,EAAE,GAAG,EAAI,GACT,EAAE,cAAc,IAAK,CAAC,EACtB,GAAK,EAEN,KACD,CACA,IAAK,SAAU,CACd,EAAE,GAAG,EAAI,IACT,EAAE,GAAG,EAAI,EACT,EAAE,GAAG,EAAI,EAAO,IAAM,GACtB,EAAE,iBAAiB,IAAK,CAAC,EACzB,GAAK,EACL,KACD,CACA,IAAK,SAAU,CACd,GAAI,MAAQ,KACX,EAAE,GAAG,EAAI,IACT,EAAE,cAAc,EAAG,CAAC,EAEpB,EAAE,YAAY,MAAO,GAAK,CAAC,EAC3B,GAAK,UACK,MAAM,QAAQ,GAAG,EAAG,CAC9B,GAAI,IAAI,OAAQ,CACf,EAAE,GAAG,EAAI,IACT,EAAE,cAAc,IAAI,OAAQ,CAAC,EAC7B,GAAK,EACL,QAAW,QAAQ,IAClB,KAAK,IAAI,CAEX,CACA,EAAE,GAAG,EAAI,GACV,KAAO,CACN,IAAM,QAAU,OAAO,QAAQ,GAAG,EAAE,OAAO,GAAK,OAAO,EAAE,CAAC,EAAM,GAAW,EAC3E,EAAE,GAAG,EAAI,IACT,EAAE,cAAc,QAAQ,OAAQ,CAAC,EACjC,GAAK,EACL,OAAU,CAAC,IAAK,KAAK,IAAK,QACzB,KAAK,GAAG,EACR,KAAK,KAAK,CAEZ,CACA,KACD,CACA,CACD,EACA,YAAK,IAAI,EACF,OAAO,KAAK,EAAE,SAAS,EAAG,CAAC,CAAC,CACpC,CAGA,eAAS,YCxnBT,2LA0CO,SAAS,QAAQ,IAAwB,EAAW,CAC1D,GAAI,OAAO,KAAQ,UAAY,KAAO,EAAG,OAAO,IAChD,GAAI,OAAO,KAAQ,UAAY,MAAM,GAAG,EAAG,OAAO,MAAM,GAAG,EAAI,EAC/D,GAAI,MAAM,QAAQ,GAAG,EAAG,OAAO,IAAI,IAAK,GAAwB,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,KAAM,IAAM,KAAO,EAAG,CAAC,EAC3G,MAAM,IAAI,WAAW,kBAAkB,CACxC,CA/CA,IAQa,MAuBA,WAEA,IAEA,eAcN,gBAjDP,oDAQa,MAAQ,CACpB,OAAQ,EACR,cAAe,EACf,iBAAkB,EAClB,0BAA2B,EAC3B,mBAAoB,GACpB,eAAgB,GAChB,cAAe,GACf,mBAAoB,IACpB,gBAAiB,IACjB,eAAgB,IAChB,wBAAyB,KACzB,qBAAsB,KACtB,gBAAiB,KACjB,yBAA0B,KAC1B,sBAAuB,MACvB,gBAAiB,MACjB,uBAAwB,MACxB,8BAA+B,QAC/B,0BAA2B,OAC5B,EAGa,WAAa,MAAM,cAAgB,MAAM,gBAAkB,MAAM,gBAEjE,IAAM,OAAO,OAAO,KAAK,EAAE,OAAO,CAAC,IAAK,IAAM,IAAM,EAAG,CAAC,EAExD,eAAiB,IAAM,CAAC,WAc9B,gBAAQ,CAAE,MAAO,WAAY,IAAK,eAAgB,OAAQ,KC/CjE,OAAS,gBAAAC,kBAAoB,SAe7B,OAAS,yBAA4B,wBAjBrC,gGAIA,qBAAwD,6BADjD,SAAW,mBAEXC,SAAU,+CAqCX,eAAiB,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,IAAM,KAAM,IAAI,EAChE,8BAAgC,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,IAAI,EACnE,mBAAqB,CAC1B,KAAM,sEACN,KAAM,mDACN,KAAM,uBACN,KAAM,uDACN,KAAM,oDACN,KAAM,qBACN,KAAM,gEACN,KAAM,6DACN,KAAM,6EACN,KAAM,0CACN,KAAM,6EACN,KAAM,+BACN,KAAM,8DACP,EAEM,gBAAkB,IAAI,MAAM,qDAAqD,EAEjF,cAAgB,CAAC,wCAAyC,YAAa,aAAc,UAAW,QAAQ,EAOxG,iBAAN,cAA+BD,aAAa,CA8CpC,YAAmB,GAAmB,OAA4I,CACxL,MAAM,EADmB,WAAmB,mBAtC7C,KAAO,iBAA0C,KAEjD,KAAO,kBAAoB,EAE3B,KAAO,OAAwB,KAE/B,KAAO,IAAM,EAEb,KAAO,OAA+E,eAEtF,KAAO,UAA2B,KAElC,KAAO,UAAY,EAEnB,KAAO,kBAAoB,EAE3B,KAAO,QAAU,EAIjB,KAAO,cAA+B,KAEtC,KAAO,aAAe,GAGtB,KAAQ,SAAW,GAEnB,KAAQ,aAAe,GAEvB,KAAQ,wBAAiD,KAEzD,KAAQ,yBAAkD,KAUzD,KAAK,QAAU,OAAO,QACtB,KAAK,UAAY,KAAK,QAAQ,WAAa,GAC3C,KAAK,gBAAkB,KAAK,QAAQ,SAEpC,KAAK,SAAW,IAAI,SAAS,KAAK,gBAAiB,KAAK,QAAQ,EAAG,EAEnE,KAAK,SAAS,GAAG,UAAW,IAAM,CACjC,KAAK,OAAS,aACd,KAAK,KAAK,cAAe,YAAY,EACrC,KAAK,aAAe,GACpB,KAAK,wBAA0B,WAAW,IAAM,CAC/C,KAAK,OAAO,KAAK,QAAS,SAAS,KAAK,EAAE,yDAAyD,EACnG,KAAK,WAAW,EAAI,CACrB,EAAG,GAAK,CACT,CAAC,EACD,KAAK,SAAS,GAAG,aAAc,KAAO,KAAK,cAAc,GAAG,CAAC,EAC7D,KAAK,SAAS,GAAe,WAAY,CAAC,KAAM,SAAW,KAAK,cAAc,KAAM,MAAM,CAAC,EAC3F,KAAK,SAAS,GAAG,QAAS,OAAS,KAAK,OAAO,KAAK,QAAS,KAAK,CAAC,EACnE,KAAK,SAAS,GAAG,UAAW,MAAQ,KAAK,OAAO,KAAK,UAAW,IAAI,CAAC,CACtE,CAKA,MAAa,SAAyB,CACrC,YAAK,SAAW,GAChB,KAAK,aAAe,GACpB,KAAK,OAAO,KAAK,QAAS,SAAS,KAAK,EAAE,wBAAwB,EAE3D,KAAK,SAAS,QAAQ,EAC3B,MAAM,GAAK,CACP,IAAM,iBACV,WAAW,IAAM,CACX,KAAK,cAAc,KAAK,QAAQ,CACtC,EAAG,GAAI,CACR,CAAC,CACH,CAKA,MAAa,YAA4B,CACxC,YAAK,SAAW,GAChB,KAAK,aAAe,GACb,KAAK,SAAS,MAAM,IAAM,sBAAsB,CACxD,CAMA,MAAc,cAAc,QAA+C,CAC1E,KAAK,OAAO,KAAK,aAAc,OAAO,EACtC,IAAM,YAAiD,OAAO,OAAO,QAAS,CAAE,SAAU,KAAK,EAAG,CAAC,EAGnG,OAFA,KAAK,OAAO,KAAK,QAAS,WAAW,EAE7B,YAAY,GAAI,CACxB,KAAK,iBAAAE,iBAAG,SACP,KAAK,eAAe,WAAW,EAC/B,MAED,KAAK,iBAAAA,iBAAG,UACP,KAAK,UAAU,EACf,MAED,KAAK,iBAAAA,iBAAG,UACP,KAAK,OAAO,KAAK,QAAS,uBAAuB,KAAK,EAAE,eAAe,EACnE,KAAK,UAAW,KAAK,WAAW,EAAI,EACnC,KAAK,WAAW,EACrB,MAED,KAAK,iBAAAA,iBAAG,gBACP,KAAK,OAAO,KAAK,QAAS,SAAS,KAAK,EAAE,4BAA4B,EAClE,YAAY,GAAK,KAAK,UAAW,KAAK,OAAO,GAEhD,KAAK,IAAM,EACX,KAAK,UAAY,GACjB,KAAK,KAAK,gBAAiB,KAAK,EAAE,GAEnC,MAED,KAAK,iBAAAA,iBAAG,MACH,KAAK,yBAAyB,aAAa,KAAK,uBAAuB,EAC3E,KAAK,OAAO,KAAK,QAAS,SAAS,KAAK,EAAE,iBAAiB,EAC3D,KAAK,UAAY,KAAK,IAAI,EAC1B,KAAK,kBAAoB,YAAY,EAAE,mBACvC,KAAK,yBAA2B,WAAW,IAAM,KAAK,UAAU,EAAG,KAAK,kBAAoB,KAAK,OAAO,CAAC,EACzG,KAAK,OAAU,YAAY,EAAoC,OAC/D,KAAK,SAAS,EACd,MAED,KAAK,iBAAAA,iBAAG,cACP,KAAK,UAAY,KAAK,IAAI,EAC1B,KAAK,QAAU,KAAK,UAAY,KAAK,kBACrC,MAED,QAEA,CACD,CAMA,MAAc,WAAW,OAAS,GAAsB,CA/NzD,WAgOE,YAAK,SAAS,WAAU,eAAxB,iBAAuC,iBACvC,KAAK,aAAe,OACpB,MAAM,KAAK,SAAS,MAAM,OAAS,IAAO,KAAM,cAAc,EAC1D,QACH,KAAK,eAAe,EAChB,KAAK,cAAe,KAAK,SAAS,QAAU,KAAK,cAChD,KAAK,SAAS,QAAU,KAAK,kBAElC,KAAK,MAAM,EACX,KAAK,SAAS,QAAU,KAAK,iBAE9B,KAAK,QAAQ,CACd,CAKQ,OAAc,CACrB,KAAK,UAAY,KACjB,KAAK,IAAM,EACX,KAAK,UAAY,EACjB,KAAK,OAAS,KACd,KAAK,eAAe,CACrB,CAKQ,cAAqB,CAC5B,KAAK,iBAAmB,YAAY,IAAM,CACrC,KAAK,WAAa,KAAK,IAAI,GAAK,KAAK,kBAAoB,MAC5D,KAAK,OAAO,KAAK,QAAS,SAAS,KAAK,EAAE,wCAAwC,KAAK,kBAAoB,GAAI,KAAK,EAChH,KAAK,UAAW,KAAK,WAAW,EAAI,EACnC,KAAK,WAAW,GACf,KAAK,UAAU,CACvB,EAAG,KAAK,iBAAiB,CAC1B,CAKQ,gBAAuB,CAC1B,KAAK,kBAAkB,cAAc,KAAK,gBAAgB,EAC1D,KAAK,0BAA0B,aAAa,KAAK,wBAAwB,EAC7E,KAAK,iBAAmB,KACxB,KAAK,yBAA2B,KAChC,KAAK,kBAAoB,CAC1B,CAEQ,UAAiB,CACxB,GAAI,KAAK,UAAW,OAAO,KAAK,KAAK,OAAO,EACvC,KAAK,KAAK,gBAAiB,KAAK,EAAE,CACxC,CAKA,MAAa,UAA0B,CACtC,GAAI,KAAK,SAAS,SAAW,EAC5B,YAAK,OAAO,KAAK,QAAS,SAAS,KAAK,EAAE,6DAA6D,cAAc,KAAK,SAAS,MAAM,CAAC,EAAE,EACrI,KAAK,WAAW,EAAI,EAE5B,KAAK,OAAO,KAAK,QAAS,SAAS,KAAK,EAAE,iBAAiB,EAE3D,KAAK,OAAS,cACd,KAAK,KAAK,cAAe,aAAa,EAEtC,IAAM,KAAO,CACZ,GAAI,iBAAAA,iBAAG,SACP,EAAG,CACF,MAAO,KAAK,QAAQ,MACpB,WAAY,CACX,GAAI,QAAQ,SACZ,QAAS,aACT,OAAQ,YACT,EACA,gBAAiB,KAAK,QAAQ,oBAC9B,MAAO,CAAC,KAAK,GAAI,KAAK,QAAQ,aAAe,CAAC,EAC9C,QAAS,KAAK,QAAQ,QAAUD,SAAQ,QAAQ,KAAK,QAAQ,OAAO,EAAI,CACzE,CACD,EAEA,OAAI,KAAK,QAAQ,kBAAiB,KAAK,EAAE,SAAW,KAAK,mBAAmB,KAAK,QAAQ,eAAe,GACjG,KAAK,SAAS,YAAY,IAAI,CACtC,CAKA,MAAa,QAAwB,CACpC,OAAI,KAAK,SAAS,SAAW,GAC5B,KAAK,OAAO,KAAK,QAAS,SAAS,KAAK,EAAE,2DAA2D,cAAc,KAAK,SAAS,MAAM,CAAC,EAAE,EACnI,KAAK,WAAW,EAAI,IAE5B,KAAK,OAAO,KAAK,QAAS,SAAS,KAAK,EAAE,cAAc,EAExD,KAAK,OAAS,WACd,KAAK,KAAK,cAAe,UAAU,EAE5B,KAAK,SAAS,YAAY,CAChC,GAAI,iBAAAC,iBAAG,OACP,EAAG,CAAE,IAAK,KAAK,IAAK,MAAO,KAAK,QAAQ,MAAO,WAAY,KAAK,SAAW,CAC5E,CAAC,EACF,CAKQ,WAAkB,CACzB,GAAI,KAAK,SAAS,SAAW,EAC5B,YAAK,OAAO,KAAK,QAAS,SAAS,KAAK,EAAE,8DAA8D,cAAc,KAAK,SAAS,MAAM,CAAC,EAAE,EACtI,KAAK,KAAK,WAAW,EAAI,EAEjC,KAAK,SAAS,YAAY,CAAE,GAAI,iBAAAA,iBAAG,UAAW,EAAG,KAAK,MAAQ,EAAI,KAAO,KAAK,GAAI,CAAC,EACnF,KAAK,kBAAoB,KAAK,IAAI,EAC9B,KAAK,2BACR,aAAa,KAAK,wBAAwB,EAC1C,KAAK,yBAA2B,MAE5B,KAAK,kBAAkB,KAAK,aAAa,CAC/C,CAMQ,eAAe,QAAmD,CA9V3E,UAyWE,OAVA,KAAK,OAAO,KAAK,WAAY,OAAO,EAEhC,QAAQ,IACP,QAAQ,EAAI,KAAK,IAAM,IAC1B,KAAK,OAAO,KAAK,QAAS,SAAS,KAAK,EAAE,iCAAiC,KAAK,GAAG,aAAa,QAAQ,CAAC,IAAI,EAC7G,KAAK,IAAM,QAAQ,EACnB,KAAK,OAAO,GAEb,KAAK,IAAM,QAAQ,GAEZ,QAAQ,EAAG,CACnB,IAAK,QACL,IAAK,UACA,QAAQ,IAAM,UACb,QAAQ,EAAE,qBAAoB,KAAK,cAAgB,GAAG,QAAQ,EAAE,kBAAkB,MAAM,gCAAe,eAAa,QAAK,QAAQ,KAAb,eAAiB,YAAa,MAAQ,MAAQ,MAAM,IAAG,QAAK,QAAQ,KAAb,SAAiB,SAAW,wBAA0B,EAAE,IACvO,KAAK,UAAY,QAAQ,EAAE,YAE5B,KAAK,OAAS,QACd,KAAK,KAAK,cAAe,OAAO,EAChC,KAAK,OAAU,QAAQ,EAAoC,OAC3D,KAAK,KAAK,QAAS,QAAQ,IAAM,SAAS,EAC1C,MACD,QAEA,CACD,CAOQ,cAAc,KAAc,OAAsB,CACzD,IAAI,cAAgB,GACpB,KAAK,OAAS,eACd,KAAK,KAAK,cAAe,cAAc,EACvC,KAAK,eAAe,EAEpB,IAAM,cAAgB,OAAS,KAAQ,KAAK,SAEtC,QAAU,mBAAmB,IAAuC,EACpE,cAAgB,eAAe,SAAS,IAAI,EAC5C,kBAAoB,8BAA8B,SAAS,IAAI,GAAK,cAEtE,eAAiB,KAAK,cAAe,KAAK,SAAS,QAAU,KAAK,cACjE,KAAK,SAAS,QAAU,KAAK,gBAE9B,SAAS,KAAK,OAAO,KAAK,QAAS,OAAO,GAE1C,eAAiB,KAAK,gBAAc,cAAgB,IAExD,KAAK,SAAW,GAEhB,KAAK,KAAK,aAAc,KAAM,OAAQ,aAAa,EAE/C,CAAC,mBAAqB,KAAK,WAAW,KAAK,QAAQ,CACxD,CAMA,MAAa,eAAe,KAAyD,CACpF,OAAO,KAAK,SAAS,YAAY,CAAE,GAAI,iBAAAA,iBAAG,gBAAiB,EAAG,KAAK,mBAAmB,IAAI,CAAE,CAAC,CAC9F,CAMA,MAAa,iBAAiB,KAAkG,CAC/H,OAAK,KACE,KAAK,SAAS,YAAY,CAAE,GAAI,iBAAAA,iBAAG,mBAAoB,EAAG,KAAK,2BAA2B,IAAI,CAAE,CAAC,EADtF,QAAQ,QAAQ,CAEnC,CAMA,MAAa,oBAAoB,KAA2E,CAC3G,OAAO,KAAK,SAAS,YAAY,CAAE,GAAI,iBAAAA,iBAAG,sBAAuB,EAAG,KAAK,8BAA8B,IAAI,CAAE,CAAC,CAC/G,CAOQ,mBAAmB,KAAsF,CAIhH,GAHA,KAAK,OAAS,KAAK,QAAU,qBAAqB,OAClD,KAAK,WAAa,KAAK,YAAc,MAAM,QAAQ,KAAK,UAAU,EAAI,KAAK,WAAa,CAAC,EAErF,KAAK,WACR,QAAW,YAAY,KAAK,WAAY,CACvC,IAAM,MAAQ,KAAK,WAAW,QAAQ,QAAQ,EAC1C,SAAS,OAAS,SAAW,SAAS,KAAO,SAAS,IAAM,EAAI,GAC/D,SAAS,OACT,SAAS,OAAS,SAAS,OAAS,EAAG,SAAS,KAAO,gBACtD,KAAK,WAAW,OAAO,MAAO,CAAC,EAEtC,CAGD,YAAK,IAAM,KAAK,KAAO,GACvB,KAAK,MAAQ,KAAK,OAAS,KAAK,IAAI,EAC7B,IACR,CAOQ,2BAA2B,KAA0F,CAC5H,YAAK,WAAa,KAAK,YAAc,KACrC,KAAK,UAAY,KAAK,WAAa,GACnC,KAAK,UAAY,KAAK,WAAa,GAC5B,IACR,CAOQ,8BAA8B,KAAgG,CACrI,IAAM,UAAY,KACZ,YAAc,KACpB,MAAI,CAAC,UAAU,OAAS,CAAC,YAAY,WAAU,UAAU,MAAQ,IAC7D,UAAU,OAAS,YAAY,UAAU,OAAQ,KAA6B,MAClF,KAAK,MAAQ,KAAK,OAAS,GACpB,IACR,CACD,EAEA,eAAS,oBCpeT,OAAS,gBAAAF,kBAAoB,SAF7B,0EAGA,IAAO,GAAK,2BA6BN,MAAN,cAAoBA,aAAa,CAWzB,YAAmB,GAAmB,OAA4I,CACxL,MAAM,EADmB,WAAmB,mBAT7C,KAAO,MAAQ,GAYd,KAAK,UAAY,IAAI,GAAG,GAAI,MAAM,EAClC,KAAK,UAAU,GAAG,aAAc,IAAI,OAAS,CAC5C,KAAK,MAAQ,GACb,KAAK,KAAK,aAAc,GAAG,IAAI,CAChC,CAAC,EACD,KAAK,UAAU,GAAG,QAAS,QAAU,KAAK,KAAK,QAAS,MAAM,CAAC,EAC/D,KAAK,UAAU,GAAG,gBAAiB,IAAM,KAAK,KAAK,gBAAiB,KAAK,EAAE,CAAC,CAC7E,CAKA,IAAW,SAAkB,CAC5B,OAAO,KAAK,UAAU,OACvB,CAKO,SAAgB,CACtB,KAAK,UAAU,QAAQ,CACxB,CAKO,YAA4B,CAClC,OAAO,KAAK,UAAU,WAAW,CAClC,CAMO,eAAe,KAA4E,CACjG,OAAO,KAAK,UAAU,eAAe,IAAI,CAC1C,CAMO,iBAAiB,KAA8E,CACrG,OAAO,KAAK,UAAU,iBAAiB,IAAI,CAC5C,CAMO,oBAAoB,KAAiF,CAC3G,OAAO,KAAK,UAAU,oBAAoB,IAAI,CAC/C,CACD,EAEA,eAAS,SClGT,OAAS,eAAAG,iBAAmB,eAH5B,wFAEA,IAAO,MAAQ,gBAQT,aAAN,KAAmB,CAaX,YAAmB,OAA6J,CAA7J,mBAT1B,KAAO,OAAkC,CAAC,EAE1C,KAAO,eAAiB,IAAIA,aAAY,IAAM,IAAO,GAAK,GAAK,EAAE,EAEjE,KAAO,kBAAwC,KAM9C,KAAK,QAAU,OAAO,OACvB,CAKO,OAAc,CACpB,GAAI,CAAC,KAAK,kBAAmB,MAAM,IAAI,MAAM,yDAAyD,EACtG,QAAW,MAAO,KAAK,QAAQ,SAAW,OAAS,MAAM,KAAK,QAAQ,WAAW,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,EAAG,QAAU,KAAK,EAAI,KAAK,QAAQ,QAAU,CAAC,CAAC,EAC9I,KAAK,OAAO,KAAK,QAAS,iBAAiB,EAAE,EAAE,EAC/C,KAAK,OAAO,EAAE,EAAI,IAAI,MAAM,GAAI,KAAK,MAAM,EAC3C,KAAK,aAAa,KAAK,OAAO,EAAE,CAAC,EACjC,KAAK,OAAO,EAAE,EAAE,UAAU,QAAQ,CAEpC,CAKO,YAAmB,CACzB,QAAW,YAAY,KAAK,OAC3B,KAAK,OAAO,QAAQ,EAAE,WAAW,CAEnC,CAMQ,aAAa,MAAoB,CACxC,MAAM,GAAG,QAAU,QAAW,CAC7B,MAAM,MAAQ,GACd,KAAK,OAAO,KAAK,QAAS,SAAS,MAAM,EAAE,IAAI,OAAS,cAAgB,UAAU,EAAE,EACpF,KAAK,OAAO,KAAK,aAAc,CAAE,GAAI,MAAM,GAAI,MAAO,CAAC,MAAO,CAAC,EAC/D,KAAK,YAAY,CAClB,CAAC,EACD,MAAM,GAAG,gBAAkB,SAAY,CA5DzC,OA6DG,GAAI,CAAC,KAAK,OAAO,OAAO,EAAG,OAAO,KAAK,OAAO,KAAK,QAAS,4CAA4C,OAAO,yCAAyC,EAExJ,GADA,KAAK,OAAO,KAAK,QAAS,SAAS,OAAO,uBAAuB,EAC7D,MAAM,UAAU,aAAc,OAAO,MAAM,UAAU,OAAO,GAChE,QAAK,oBAAL,SAAwB,MAAM,IAAM,CACnC,KAAK,eAAe,MAAM,IAAM,KAAK,OAAO,OAAO,EAAE,UAAU,SAAS,CAAC,CAC1E,EACD,CAAC,EACD,MAAM,GAAG,aAAc,CAAC,KAAM,OAAQ,gBAAkB,CAEvD,GADA,KAAK,OAAO,KAAK,QAAS,sBAAsB,MAAM,EAAE,qBAAqB,IAAI,gBAAgB,QAAU,MAAM,EAAE,EAC/G,OAAS,KAAQ,cAAe,OAAO,KAAK,iBAAiB,CAClE,CAAC,CACF,CAKQ,aAAoB,CAC3B,QAAW,WAAW,KAAK,OAC1B,GAAI,KAAK,OAAO,OAAO,GAClB,CAAC,KAAK,OAAO,OAAO,EAAE,MAAO,OAGnC,KAAK,OAAO,KAAK,OAAO,CACzB,CAKQ,kBAAyB,CAChC,QAAW,WAAW,KAAK,OAC1B,GAAI,KAAK,OAAO,OAAO,GAClB,KAAK,OAAO,OAAO,EAAE,UAAU,SAAW,eAAgB,OAGhE,KAAK,OAAO,KAAK,cAAc,CAChC,CAMA,MAAa,eAAe,KAA+D,CAC1F,QAAW,YAAY,KAAK,OAC3B,GAAI,KAAK,OAAO,QAAQ,EAAG,CAC1B,IAAM,MAAQ,KAAK,OAAO,QAAQ,EAClC,KAAK,oBAAoB,MAAM,GAAI,IAAI,CACxC,CAEF,CAOO,oBAAoB,QAAiB,KAA+D,CAC1G,OAAO,IAAI,QAAQ,CAAC,IAAK,MAAQ,CAChC,IAAM,MAAQ,KAAK,OAAO,OAAO,EAC5B,OAAO,IAAI,IAAI,MAAM,SAAS,OAAO,iBAAiB,CAAC,EACvD,MAAM,OACX,MAAM,eAAe,IAAI,EAAE,KAAK,QAAU,IAAI,MAAM,CAAC,EAAE,MAAM,GAAK,IAAI,CAAC,CAAC,CACzE,CAAC,CACF,CAOO,iBAAiB,QAAiB,KAAiE,CACzG,OAAO,IAAI,QAAQ,CAAC,IAAK,MAAQ,CAChC,IAAM,MAAQ,KAAK,OAAO,OAAO,EAC5B,OAAO,IAAI,IAAI,MAAM,SAAS,OAAO,iBAAiB,CAAC,EACvD,MAAM,OACX,MAAM,iBAAiB,IAAI,EAAE,KAAK,QAAU,IAAI,MAAM,CAAC,EAAE,MAAM,GAAK,IAAI,CAAC,CAAC,CAC3E,CAAC,CACF,CAOO,oBAAoB,QAAiB,KAAoE,CAC/G,OAAO,IAAI,QAAQ,CAAC,IAAK,MAAQ,CAChC,IAAM,MAAQ,KAAK,OAAO,OAAO,EAC5B,OAAO,IAAI,IAAI,MAAM,SAAS,OAAO,iBAAiB,CAAC,EACvD,MAAM,OACX,MAAM,oBAAoB,IAAI,EAAE,KAAK,QAAU,IAAI,MAAM,CAAC,EAAE,MAAM,GAAK,IAAI,CAAC,CAAC,CAC9E,CAAC,CACF,CACD,EAEA,eAAS,gBCpJT,OAAS,gBAAAH,kBAAoB,SAE7B,OAAS,aAAc,eAAAG,iBAAmB,eAR1C,4EAEA,IAAO,GAAK,UAAQ,MACb,KAAO,UAAQ,QAEhB,QAAU,KAAK,MAAM,GAAG,aAAa,KAAK,KAAK,UAAW,iBAAiB,EAAG,CAAE,SAAU,MAAO,CAAC,CAAC,EAAE,QAEpGL,WAAY,oBAEZ,aAAe,uBAuChB,OAAN,cAAqBE,aAAa,CAiB1B,YAAY,MAAe,QAA4C,CAAC,EAAG,CACjF,MAAM,EAVP,KAAO,QAAU,QAWZ,IAAC,MAAO,MAAM,IAAI,MAAM,gBAAgB,EAC5C,KAAK,QAAU,CACd,oBAAqB,IACrB,OAAQ,OACR,UAAW,GACX,QAAS,EACT,MAAO,GACP,GAAI,CACH,SAAU,GACV,SAAU,MACX,CACD,EACA,KAAK,YAAc,QAAQ,qBAAuB,QAAQ,qBAAuB,IAAI,aAAa,KAAK,EACvG,OAAO,QAAQ,qBACf,KAAK,MAAQ,MAAM,WAAW,MAAM,EAAI,MAAM,UAAU,CAAC,EAAI,MAC7D,OAAO,OAAO,KAAK,QAAS,OAAO,EACnC,KAAK,QAAQ,MAAQ,MACrB,KAAK,aAAe,IAAI,aAAa,IAAI,CAC1C,CAMA,MAAa,SAAyB,CACrC,IAAM,QAAU,MAAM,KAAK,iBAAiB,EACxC,KAAK,QAAQ,SAAW,SAAQ,KAAK,QAAQ,YAAc,SAC/D,KAAK,aAAa,MAAM,CACzB,CAQA,MAAa,kBAAoC,CAvGlD,OAwGE,IAAM,QAAU,MAAM,KAAK,cAAc,EACzC,KAAK,gBAAgB,QAAQ,GAAG,EAChC,IAAM,oBAAsB,CAAC,EACvB,iBAAmB,CAAC,GACtB,QAAK,aAAa,oBAAlB,SAAqC,QAAQ,SAChD,oBAAoB,KAAK,GAAG,KAAK,aAAa,kBAAkB,OAAO,EACvE,KAAK,aAAa,kBAAkB,UAAU,GAE3C,KAAK,aAAa,eAAe,QAAQ,QAAQ,iBAAiB,KAAK,GAAG,KAAK,aAAa,eAAe,OAAO,EACtH,KAAK,aAAa,eAAe,UAAU,EAC3C,KAAK,aAAa,kBAAoB,IAAIG,aAAY,QAAQ,oBAAoB,gBAAiB,GAAI,EACvG,KAAK,aAAa,eAAe,UAAY,QAAQ,oBAAoB,UACzE,KAAK,aAAa,eAAe,MAAQ,QAAQ,oBAAoB,YACrE,QAAW,MAAM,oBAChB,KAAK,aAAa,kBAAkB,MAAM,EAAE,EAE7C,QAAW,MAAM,iBAChB,KAAK,aAAa,eAAe,MAAM,EAAE,EAE1C,OAAO,QAAQ,MAChB,CAMA,MAAa,YAA8B,CAE1C,OADoB,MAAM,KAAK,YAAY,IAAI,WAAW,GACvC,GACpB,CAMA,MAAa,eAA4C,CACxD,OAAO,KAAK,YAAY,IAAI,cAAc,CAC3C,CAMO,YAAmB,CACzB,OAAO,KAAK,aAAa,WAAW,CACrC,CAiBA,MAAa,eAAe,KAAgF,CAC3G,OAAO,KAAK,aAAa,eAAe,IAAI,CAC7C,CAmBO,kBAAkB,QAAiB,KAAqF,CAC9H,OAAO,KAAK,aAAa,oBAAoB,QAAS,IAAI,CAC3D,CAqBO,iBAAiB,QAAiB,KAAkF,CAC1H,OAAO,KAAK,aAAa,iBAAiB,QAAS,IAAI,CACxD,CAoBO,oBAAoB,QAAiB,KAAqF,CAChI,GAAI,CAAC,KAAK,SAAU,MAAM,IAAI,MAAM,6BAA6B,EACjE,OAAO,KAAK,aAAa,oBAAoB,QAAS,IAAI,CAC3D,CAMQ,gBAAgB,WAA0B,CAjPnD,UAkPE,KAAK,QAAQ,SAAW,GAAG,UAAU,MAAML,WAAU,eAAe,eAAa,QAAK,QAAQ,KAAb,eAAiB,YAAa,MAAQ,MAAQ,MAAM,IAAG,QAAK,QAAQ,KAAb,SAAiB,SAAW,wBAA0B,EAAE,EACjM,CACD,EAEA,eAAS,UCtPT,IAAO,QAAU,iBACV,UAAY,oBACZ,QAAU,+CAEV,OAAS,gBACT,cAAgB,uBAEhB,UAAY","sourcesContent":["\"use strict\";\r\n\r\nconst Constants = {\r\n\tGATEWAY_OP_CODES: {\r\n\r\n\r\n\r\n\t\tDISPATCH: 0 as const,\r\n\r\n\r\n\r\n\t\tHEARTBEAT: 1 as const,\r\n\r\n\r\n\r\n\t\tIDENTIFY: 2 as const,\r\n\r\n\r\n\r\n\t\tPRESENCE_UPDATE: 3 as const,\r\n\r\n\r\n\r\n\t\tVOICE_STATE_UPDATE: 4 as const,\r\n\r\n\r\n\r\n\t\tRESUME: 6 as const,\r\n\r\n\r\n\r\n\t\tRECONNECT: 7 as const,\r\n\r\n\r\n\r\n\t\tREQUEST_GUILD_MEMBERS: 8 as const,\r\n\r\n\r\n\r\n\t\tINVALID_SESSION: 9 as const,\r\n\r\n\r\n\r\n\t\tHELLO: 10 as const,\r\n\r\n\r\n\r\n\t\tHEARTBEAT_ACK: 11 as const\r\n\t},\r\n\tGATEWAY_VERSION: 10 as const\r\n};\r\n\r\nexport = Constants;\r\n","\"use strict\";\r\n\r\n\r\n\r\n\r\n\r\nimport { EventEmitter } from \"events\";\r\nimport { randomBytes, createHash } from \"crypto\";\r\nimport { createInflate, inflateSync, constants } from \"zlib\";\r\nimport https = require(\"https\");\r\nimport http = require(\"http\");\r\nimport util = require(\"util\");\r\nimport { GATEWAY_OP_CODES } from \"./Constants\";\r\n\r\nimport { LocalBucket } from \"snowtransfer\";\r\n\r\nimport type { Socket } from \"net\";\r\n\r\ninterface BWSEvents {\r\n\tws_open: [];\r\n\tws_close: [number, string];\r\n\tws_receive: [any];\r\n\tws_send: [any];\r\n\tdebug: [string];\r\n}\r\n\r\ninterface BetterWs {\r\n\taddListener<E extends keyof BWSEvents>(event: E, listener: (...args: BWSEvents[E]) => any): this;\r\n\temit<E extends keyof BWSEvents>(event: E, ...args: BWSEvents[E]): boolean;\r\n\teventNames(): Array<keyof BWSEvents>;\r\n\tlistenerCount(event: keyof BWSEvents): number;\r\n\tlisteners(event: keyof BWSEvents): Array<(...args: Array<any>) => any>;\r\n\toff<E extends keyof BWSEvents>(event: E, listener: (...args: BWSEvents[E]) => any): this;\r\n\ton<E extends keyof BWSEvents>(event: E, listener: (...args: BWSEvents[E]) => any): this;\r\n\tonce<E extends keyof BWSEvents>(event: E, listener: (...args: BWSEvents[E]) => any): this;\r\n\tprependListener<E extends keyof BWSEvents>(event: E, listener: (...args: BWSEvents[E]) => any): this;\r\n\tprependOnceListener<E extends keyof BWSEvents>(event: E, listener: (...args: BWSEvents[E]) => any): this;\r\n\trawListeners(event: keyof BWSEvents): Array<(...args: Array<any>) => any>;\r\n\tremoveAllListeners(event?: keyof BWSEvents): this;\r\n\tremoveListener<E extends keyof BWSEvents>(event: E, listener: (...args: BWSEvents[E]) => any): this;\r\n}\r\n\r\n\r\n\r\n\r\nclass BetterWs extends EventEmitter {\r\n\r\n\tpublic encoding: \"etf\" | \"json\" | \"other\";\r\n\r\n\tpublic compress: boolean;\r\n\r\n\tpublic wsBucket = new LocalBucket(120, 60000);\r\n\r\n\tpublic presenceBucket = new LocalBucket(5, 60000);\r\n\r\n\r\n\tprivate _socket: Socket | null = null;\r\n\r\n\tpublic _internal: {\r\n\t\topenRejector: ((reason?: any) => void) | null;\r\n\r\n\t\tclosePromise: Promise<void> | null;\r\n\r\n\t\tzlib: import(\"zlib\").Inflate | null;\r\n\t} = {\r\n\t\t\topenRejector: null,\r\n\t\t\tclosePromise: null,\r\n\t\t\tzlib: null\r\n\t\t};\r\n\r\n\tprivate _connecting = false;\r\n\r\n\tprivate _lastCloseCode: number | null = null;\r\n\r\n\tprivate _lastCloseReason: string | null = null;\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic constructor(public address: string, public options: Omit<import(\"./Types\").IClientWSOptions, \"encoding\"> & { encoding?: import(\"./Types\").IClientWSOptions[\"encoding\"] | \"other\" }) {\r\n\t\tsuper();\r\n\r\n\t\tthis.encoding = options.encoding ?? \"other\";\r\n\t\tthis.compress = options.compress ?? false;\r\n\t}\r\n\r\n\r\n\r\n\r\n\tpublic get status(): 1 | 2 | 3 | 4 {\r\n\t\tconst internal = this._internal;\r\n\t\tif (this._connecting) return 2;\r\n\t\tif (internal.closePromise) return 3;\r\n\t\tif (!this._socket) return 4;\r\n\t\treturn 1;\r\n\t}\r\n\r\n\r\n\r\n\r\n\tpublic connect(): Promise<void> {\r\n\t\tif (this._socket || this._connecting) return Promise.resolve(void 0);\r\n\t\tthis._connecting = true;\r\n\t\tconst key = randomBytes(16).toString(\"base64\");\r\n\t\tconst url = new URL(this.address);\r\n\t\tconst useHTTPS = (url.protocol === \"https:\" || url.protocol === \"wss:\") || url.port === \"443\";\r\n\t\tconst port = url.port || (useHTTPS ? \"443\" : \"80\");\r\n\t\tconst req = (useHTTPS ? https : http).request({\r\n\t\t\thostname: url.hostname,\r\n\t\t\tpath: `${url.pathname}${url.search}`,\r\n\t\t\tport: port,\r\n\t\t\theaders: {\r\n\t\t\t\t\"Connection\": \"Upgrade\",\r\n\t\t\t\t\"Upgrade\": \"websocket\",\r\n\t\t\t\t\"Sec-WebSocket-Key\": key,\r\n\t\t\t\t\"Sec-WebSocket-Version\": \"13\",\r\n\t\t\t\t...this.options.headers\r\n\t\t\t}\r\n\t\t});\r\n\t\tlet onErrorRef: ((e: Error) => void) | undefined;\r\n\t\tlet cameFromOnError = false;\r\n\t\treturn new Promise<void>((resolve, reject) => {\r\n\t\t\tthis._internal.openRejector = reject;\r\n\t\t\tconst upgrade = this._onUpgrade.bind(this, key, req, resolve, reject);\r\n\t\t\tonErrorRef = e => {\r\n\t\t\t\tthis._internal.openRejector = null;\r\n\t\t\t\tcameFromOnError = true;\r\n\t\t\t\tthis._connecting = false;\r\n\t\t\t\treq.removeListener(\"upgrade\", upgrade);\r\n\t\t\t\treject(e);\r\n\t\t\t};\r\n\t\t\treq.once(\"upgrade\", upgrade);\r\n\t\t\treq.once(\"error\", onErrorRef);\r\n\t\t\treq.end();\r\n\t\t}).catch(reason => {\r\n\t\t\tif (onErrorRef && !cameFromOnError) {\r\n\t\t\t\treq.destroy();\r\n\t\t\t\treq.removeListener(\"error\", onErrorRef);\r\n\t\t\t\tonErrorRef(reason);\r\n\t\t\t}\r\n\t\t\treturn Promise.reject(reason);\r\n\t\t});\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic async close(code: number, reason?: string): Promise<void> {\r\n\t\tconst internal = this._internal;\r\n\t\tif (internal.closePromise) return internal.closePromise;\r\n\t\tif (!this._socket) return Promise.resolve(void 0);\r\n\t\tlet resolver: ((value: unknown) => void) | undefined;\r\n\t\tconst promise = new Promise(resolve => {\r\n\t\t\tresolver = resolve;\r\n\t\t\tconst from = Buffer.from([code >> 8, code & 255]);\r\n\t\t\tthis._write(reason ? Buffer.concat([from, Buffer.from(reason)]) : from, 8);\r\n\t\t}).then(() => {\r\n\t\t\tinternal.closePromise = null;\r\n\t\t});\r\n\r\n\t\tpromise.resolve = resolver;\r\n\t\tinternal.closePromise = promise;\r\n\t\treturn promise;\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic sendMessage(data: any): Promise<void> {\r\n\t\treturn new Promise(res => {\r\n\t\t\tconst presence = data?.op === GATEWAY_OP_CODES.PRESENCE_UPDATE;\r\n\t\t\tconst sendMsg = () => {\r\n\t\t\t\tconst fn = () => {\r\n\t\t\t\t\tthis.emit(\"ws_send\", data);\r\n\t\t\t\t\tif (this.encoding === \"json\") this._write(Buffer.from(JSON.stringify(data)), 1);\r\n\t\t\t\t\telse if (this.encoding === \"etf\") this._write(writeETF(data), 2);\r\n\t\t\t\t\telse if (this.encoding === \"other\") this._write(Buffer.from(data), 2);\r\n\t\t\t\t\tres(void 0);\r\n\t\t\t\t};\r\n\t\t\t\tif (this.options.bypassBuckets) fn();\r\n\t\t\t\telse this.wsBucket.queue(fn);\r\n\t\t\t};\r\n\t\t\tif (presence && !this.options.bypassBuckets) this.presenceBucket.queue(sendMsg);\r\n\t\t\telse sendMsg();\r\n\t\t});\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tprivate _write(packet: Buffer, opcode: number): void {\r\n\t\tconst socket = this._socket;\r\n\t\tif (!socket?.writable) return;\r\n\t\tconst length = packet.length;\r\n\t\tlet frame: Buffer | undefined;\r\n\t\tif (length < 126) {\r\n\t\t\tframe = Buffer.allocUnsafe(6 + length);\r\n\t\t\tframe[1] = 128 + length;\r\n\t\t} else if (length < (1 << 16)) {\r\n\t\t\tframe = Buffer.allocUnsafe(8 + length);\r\n\t\t\tframe[1] = 254;\r\n\t\t\tframe[2] = length >> 8;\r\n\t\t\tframe[3] = length & 255;\r\n\t\t} else {\r\n\t\t\tframe = Buffer.allocUnsafe(14 + length);\r\n\t\t\tframe[1] = 255;\r\n\t\t\tframe.writeBigUInt64BE(BigInt(length), 2);\r\n\t\t}\r\n\t\tframe[0] = 128 + opcode;\r\n\t\tframe.writeUInt32BE(0, frame.length - length - 4);\r\n\t\tframe.set(packet, frame.length - length);\r\n\t\tsocket.write(frame);\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tprivate _onUpgrade(key: string, req: http.ClientRequest, resolve: (value: void | PromiseLike<void>) => void, reject: (reason?: any) => void, res: http.IncomingMessage, socket: Socket): void {\r\n\t\tthis._internal.openRejector = null;\r\n\t\tconst hash = createHash(\"sha1\").update(key + \"258EAFA5-E914-47DA-95CA-C5AB0DC85B11\").digest(\"base64\");\r\n\t\tconst accept = res.headers[\"sec-websocket-accept\"];\r\n\t\tif (hash !== accept) {\r\n\t\t\tsocket.end(() => {\r\n\t\t\t\tthis.emit(\"debug\", \"Failed websocket-key validation\");\r\n\t\t\t\tthis._connecting = false;\r\n\t\t\t\treject(new Error(`Invalid Sec-Websocket-Accept | expected: ${hash} | received: ${accept}`));\r\n\t\t\t});\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tsocket.once(\"error\", this._onError.bind(this));\r\n\t\tsocket.once(\"close\", this._onClose.bind(this));\r\n\t\tsocket.on(\"readable\", this._onReadable.bind(this));\r\n\t\tthis._socket = socket;\r\n\t\tthis._connecting = false;\r\n\t\tif (this.compress) {\r\n\t\t\tconst z = createInflate();\r\n\r\n\t\t\tz._c = z.close; z._h = z._handle; z._hc = z._handle.close; z._v = () => void 0;\r\n\t\t\tthis._internal.zlib = z;\r\n\t\t}\r\n\t\tthis.emit(\"ws_open\");\r\n\t\tresolve(void 0);\r\n\t\treq.removeAllListeners(\"error\");\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tprivate _onError(error: Error): void {\r\n\t\tif (!this._socket) return;\r\n\t\tthis.emit(\"debug\", util.inspect(error, true, 1, false));\r\n\t\tthis._write(Buffer.allocUnsafe(0), 8);\r\n\t}\r\n\r\n\r\n\r\n\r\n\tprivate _onClose(): void {\r\n\t\tconst socket = this._socket;\r\n\t\tconst internal = this._internal;\r\n\t\tif (!socket) return;\r\n\t\tsocket.removeListener(\"data\", this._onReadable);\r\n\t\tsocket.removeListener(\"error\", this._onError);\r\n\t\tthis.wsBucket.dropQueue();\r\n\t\tthis.presenceBucket.dropQueue();\r\n\t\tthis._socket = null;\r\n\t\tthis.emit(\"ws_close\", this._lastCloseCode ?? 1006, this._lastCloseReason ?? \"Abnormal Closure\");\r\n\t\tthis._lastCloseCode = null;\r\n\t\tthis._lastCloseReason = null;\r\n\t\tif (internal.zlib) {\r\n\t\t\tinternal.zlib.close();\r\n\t\t\tinternal.zlib = null;\r\n\t\t}\r\n\r\n\t\tif (internal.closePromise) internal.closePromise.resolve(void 0);\r\n\t}\r\n\r\n\r\n\r\n\r\n\tprivate _onReadable(): void {\r\n\t\tconst socket = this._socket;\r\n\t\twhile((socket?.readableLength || 0) > 1) {\r\n\t\t\tlet length = readRange(socket!, 1, 1) & 127;\r\n\t\t\tlet bytes = 0;\r\n\t\t\tif (length > 125) {\r\n\t\t\t\tbytes = length === 126 ? 2 : 8;\r\n\t\t\t\tif (socket!.readableLength < 2 + bytes) return;\r\n\t\t\t\tlength = readRange(socket!, 2, bytes);\r\n\t\t\t}\r\n\t\t\tconst frame = socket!.read(2 + bytes + length) as Buffer;\r\n\t\t\tif (!frame) return;\r\n\t\t\tconst fin = frame[0] >> 7;\r\n\t\t\tconst opcode = frame[0] & 15;\r\n\t\t\tif (fin !== 1 || opcode === 0) this.emit(\"debug\", \"discord actually does send messages with fin=0. if you see this error let me know\");\r\n\t\t\tconst payload = frame.subarray(2 + bytes);\r\n\t\t\tthis._processFrame(opcode, payload);\r\n\t\t}\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tprivate _processFrame(opcode: number, message: Buffer): void {\r\n\t\tconst internal = this._internal;\r\n\t\tswitch (opcode) {\r\n\t\tcase 1: {\r\n\t\t\tlet packet: any;\r\n\t\t\tif (this.encoding === \"json\") packet = JSON.parse(message.toString());\r\n\t\t\telse if (this.encoding === \"other\") packet = message;\r\n\t\t\tthis.emit(\"ws_receive\", packet);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tcase 2: {\r\n\t\t\tlet packet;\r\n\t\t\tif (this.compress) {\r\n\t\t\t\tconst z = internal.zlib;\r\n\t\t\t\tlet error = null;\r\n\t\t\t\tlet data = null;\r\n\r\n\t\t\t\tz.close = z._handle.close = z._v;\r\n\t\t\t\ttry {\r\n\r\n\t\t\t\t\tdata = z._processChunk(message, constants.Z_SYNC_FLUSH);\r\n\t\t\t\t} catch(e) {\r\n\t\t\t\t\terror = e;\r\n\t\t\t\t}\r\n\t\t\t\tconst l = message.length;\r\n\t\t\t\tif (message[l - 4] !== 0 || message[l - 3] !== 0 || message[l - 2] !== 255 || message[l - 1] !== 255) this.emit(\"debug\", \"discord actually does send fragmented zlib messages. If you see this error let me know\");\r\n\r\n\t\t\t\tz.close = z._c;\r\n\r\n\t\t\t\tz._handle = z._h;\r\n\r\n\t\t\t\tz._handle.close = z._hc;\r\n\r\n\t\t\t\tz._events.error = void 0;\r\n\r\n\t\t\t\tz._eventCount--;\r\n\t\t\t\tz!.removeAllListeners(\"error\");\r\n\t\t\t\tif (error) {\r\n\t\t\t\t\tthis.emit(\"debug\", \"Zlib error processing chunk\");\r\n\t\t\t\t\tthis._write(Buffer.allocUnsafe(0), 8);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tif (!data) {\r\n\t\t\t\t\tthis.emit(\"debug\", \"Data from zlib processing was null. If you see this error let me know\");\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tif (this.encoding === \"json\") packet = JSON.parse(String(data));\r\n\t\t\t\telse if (this.encoding === \"etf\") packet = readETF(data, 1);\r\n\t\t\t\telse if (this.encoding === \"other\") packet = data;\r\n\t\t\t} else if (this.encoding === \"json\") packet = JSON.parse(inflateSync(message).toString());\r\n\t\t\telse if (this.encoding === \"etf\") packet = readETF(message, 1);\r\n\t\t\telse if (this.encoding === \"other\") packet = message;\r\n\t\t\tthis.emit(\"ws_receive\", packet);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tcase 8: {\r\n\t\t\tthis._lastCloseCode = message.length > 1 ? (message[0] << 8) + message[1] : 0;\r\n\t\t\tthis._lastCloseReason = message.length > 2 ? message.subarray(2).toString() : \"\";\r\n\t\t\tthis._write(Buffer.from([this._lastCloseCode >> 8, this._lastCloseCode & 255]), 8);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tcase 9: {\r\n\t\t\tthis._write(message, 10);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nfunction readRange(socket: import(\"net\").Socket, index: number, bytes: number): number {\r\n\tlet cursor = 0;\r\n\tlet read = 0;\r\n\tlet num = 0;\r\n\r\n\r\n\tconst readable = socket._readableState;\r\n\tlet currentBufferIndex = readable.bufferIndex;\r\n\tlet currentBuffer = readable.buffer.head ?? readable.buffer[currentBufferIndex];\r\n\r\n\tdo {\r\n\t\tconst data = currentBuffer.data ?? currentBuffer;\r\n\t\tfor (const element of data) {\r\n\t\t\tif (++cursor > index) {\r\n\t\t\t\tnum *= 256;\r\n\t\t\t\tnum += element;\r\n\t\t\t\tif (++read === bytes) return num;\r\n\t\t\t}\r\n\t\t}\r\n\t} while((currentBuffer = (currentBuffer.next ?? readable.buffer[++currentBufferIndex])));\r\n\tthrow new Error(\"readRange failed?\");\r\n}\r\n\r\nfunction readETF(data: Buffer, start: number): Record<any, any> | null | undefined {\r\n\tlet view: DataView | undefined;\r\n\tlet x = start;\r\n\tconst loop = () => {\r\n\t\tconst type = data[x++];\r\n\t\tswitch(type) {\r\n\t\tcase 97: {\r\n\t\t\treturn data[x++];\r\n\t\t}\r\n\t\tcase 98: {\r\n\t\t\tconst int = data.readInt32BE(x);\r\n\t\t\tx += 4;\r\n\t\t\treturn int;\r\n\t\t}\r\n\t\tcase 100: {\r\n\t\t\tconst length = data.readUInt16BE(x);\r\n\t\t\tlet atom = \"\";\r\n\t\t\tif (length > 30) {\r\n\r\n\t\t\t\tatom = data.latin1Slice(x += 2, x + length);\r\n\t\t\t} else {\r\n\t\t\t\tfor (let i = x += 2; i < x + length; i++) {\r\n\t\t\t\t\tatom += String.fromCharCode(data[i]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tx += length;\r\n\t\t\tif (!atom) return undefined;\r\n\t\t\tif (atom === \"nil\" || atom === \"null\") return null;\r\n\t\t\tif (atom === \"true\") return true;\r\n\t\t\tif (atom === \"false\") return false;\r\n\t\t\treturn atom;\r\n\t\t}\r\n\t\tcase 108: case 106: {\r\n\t\t\tconst array = [] as Array<any>;\r\n\t\t\tif (type === 108) {\r\n\t\t\t\tconst length = data.readUInt32BE(x);\r\n\t\t\t\tx += 4;\r\n\t\t\t\tfor (let i = 0; i < length; i++) {\r\n\t\t\t\t\tarray.push(loop());\r\n\t\t\t\t}\r\n\t\t\t\tx++;\r\n\t\t\t}\r\n\t\t\treturn array;\r\n\t\t}\r\n\t\tcase 107: {\r\n\t\t\tconst array = [] as Array<number>;\r\n\t\t\tconst length = data.readUInt16BE(x);\r\n\t\t\tx += 2;\r\n\t\t\tfor (let i = 0; i < length; i++) {\r\n\t\t\t\tarray.push(data[x++]);\r\n\t\t\t}\r\n\t\t\treturn array;\r\n\t\t}\r\n\t\tcase 109: {\r\n\t\t\tconst length = data.readUInt32BE(x);\r\n\t\t\tlet str = \"\";\r\n\t\t\tif (length > 30) {\r\n\r\n\t\t\t\tstr = data.utf8Slice(x += 4, x + length);\r\n\t\t\t} else {\r\n\t\t\t\tlet i = x += 4;\r\n\t\t\t\tconst l = x + length;\r\n\t\t\t\twhile(i < l) {\r\n\t\t\t\t\tconst byte = data[i++];\r\n\t\t\t\t\tif (byte < 128) str += String.fromCharCode(byte);\r\n\t\t\t\t\telse if (byte < 224) str += String.fromCharCode(((byte & 31) << 6) + (data[i++] & 63));\r\n\t\t\t\t\telse if (byte < 240) str += String.fromCharCode(((byte & 15) << 12) + ((data[i++] & 63) << 6) + (data[i++] & 63));\r\n\t\t\t\t\telse str += String.fromCodePoint(((byte & 7) << 18) + ((data[i++] & 63) << 12) + ((data[i++] & 63) << 6) + (data[i++] & 63));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tx += length;\r\n\t\t\treturn str;\r\n\t\t}\r\n\t\tcase 110: {\r\n\r\n\t\t\tif (!view) view = new DataView(data.buffer, data.offset, data.byteLength);\r\n\t\t\tconst length = data[x++];\r\n\t\t\tconst sign = data[x++];\r\n\t\t\tlet left = length;\r\n\t\t\tlet num = BigInt(0);\r\n\t\t\twhile(left > 0) {\r\n\t\t\t\tif (left >= 8) {\r\n\t\t\t\t\tnum <<= BigInt(64);\r\n\t\t\t\t\tnum += view.getBigUint64(x + (left -= 8), true);\r\n\t\t\t\t} else if (left >= 4) {\r\n\t\t\t\t\tnum <<= BigInt(32);\r\n\r\n\t\t\t\t\tnum += BigInt(view.getUint32(x + (left -= 4)), true);\r\n\t\t\t\t} else if (left >= 2) {\r\n\t\t\t\t\tnum <<= BigInt(16);\r\n\r\n\t\t\t\t\tnum += BigInt(view.getUint16(x + (left -= 2)), true);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tnum <<= BigInt(8);\r\n\t\t\t\t\tnum += BigInt(data[x]);\r\n\t\t\t\t\tleft--;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tx += length;\r\n\t\t\treturn (sign ? -num : num).toString();\r\n\t\t}\r\n\t\tcase 116: {\r\n\t\t\tconst obj = {};\r\n\t\t\tconst length = data.readUInt32BE(x);\r\n\t\t\tx += 4;\r\n\t\t\tfor(let i = 0; i < length; i++) {\r\n\t\t\t\tconst key = loop();\r\n\r\n\t\t\t\tobj[key] = loop();\r\n\t\t\t}\r\n\t\t\treturn obj;\r\n\t\t}\r\n\t\t}\r\n\t\tthrow new Error(`Missing etf type: ${type}`);\r\n\t};\r\n\treturn loop();\r\n}\r\n\r\nfunction writeETF(data: any): Buffer {\r\n\tconst b = Buffer.allocUnsafe(1 << 12);\r\n\tb[0] = 131;\r\n\tlet i = 1;\r\n\tconst loop = (obj: any) => {\r\n\t\tconst type = typeof obj;\r\n\t\tswitch(type) {\r\n\t\tcase \"boolean\": {\r\n\t\t\tb[i++] = 100;\r\n\t\t\tif (obj) {\r\n\t\t\t\tb.writeUInt16BE(4, i);\r\n\r\n\t\t\t\tb.latin1Write(\"true\", i += 2);\r\n\t\t\t\ti += 4;\r\n\t\t\t} else {\r\n\t\t\t\tb.writeUInt16BE(5, i);\r\n\r\n\t\t\t\tb.latin1Write(\"false\", i += 2);\r\n\t\t\t\ti += 5;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tcase \"string\": {\r\n\t\t\tconst length = Buffer.byteLength(obj);\r\n\t\t\tb[i++] = 109;\r\n\t\t\tb.writeUInt32BE(length, i);\r\n\r\n\t\t\tb.utf8Write(obj, i += 4);\r\n\t\t\ti += length;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tcase \"number\": {\r\n\t\t\tif (Number.isInteger(obj)) {\r\n\t\t\t\tconst abs = Math.abs(obj);\r\n\t\t\t\tif (abs < 2147483648) {\r\n\t\t\t\t\tb[i++] = 98;\r\n\t\t\t\t\tb.writeInt32BE(obj, i);\r\n\t\t\t\t\ti += 4;\r\n\t\t\t\t} else if (abs < Number.MAX_SAFE_INTEGER) {\r\n\t\t\t\t\tb[i++] = 110;\r\n\t\t\t\t\tb[i++] = 8;\r\n\t\t\t\t\tb[i++] = Number(obj < 0);\r\n\t\t\t\t\tb.writeBigUInt64LE(BigInt(abs), i);\r\n\t\t\t\t\ti += 8;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tb[i++] = 70;\r\n\t\t\t\t\tb.writeDoubleBE(obj, i);\r\n\t\t\t\t\ti += 8;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tb[i++] = 70;\r\n\t\t\t\tb.writeDoubleBE(obj, i);\r\n\t\t\t\ti += 8;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tcase \"bigint\": {\r\n\t\t\tb[i++] = 110;\r\n\t\t\tb[i++] = 8;\r\n\t\t\tb[i++] = Number(obj < 0);\r\n\t\t\tb.writeBigUInt64LE(obj, i);\r\n\t\t\ti += 8;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tcase \"object\": {\r\n\t\t\tif (obj === null) {\r\n\t\t\t\tb[i++] = 100;\r\n\t\t\t\tb.writeUInt16BE(3, i);\r\n\r\n\t\t\t\tb.latin1Write(\"nil\", i += 2);\r\n\t\t\t\ti += 3;\r\n\t\t\t} else if (Array.isArray(obj)) {\r\n\t\t\t\tif (obj.length) {\r\n\t\t\t\t\tb[i++] = 108;\r\n\t\t\t\t\tb.writeUInt32BE(obj.length, i);\r\n\t\t\t\t\ti += 4;\r\n\t\t\t\t\tfor (const item of obj) {\r\n\t\t\t\t\t\tloop(item);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tb[i++] = 106;\r\n\t\t\t} else {\r\n\t\t\t\tconst entries = Object.entries(obj).filter(x => typeof x[1] !== \"undefined\");\r\n\t\t\t\tb[i++] = 116;\r\n\t\t\t\tb.writeUInt32BE(entries.length, i);\r\n\t\t\t\ti += 4;\r\n\t\t\t\tfor(const [key, value] of entries) {\r\n\t\t\t\t\tloop(key);\r\n\t\t\t\t\tloop(value);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\t}\r\n\t};\r\n\tloop(data);\r\n\treturn Buffer.from(b.subarray(0, i));\r\n}\r\n\r\n\r\nexport = BetterWs;\r\n","\"use strict\";\r\n\r\nexport type IntentFlags = typeof flags;\r\nexport type IntentResolvable = number | Array<number> | keyof IntentFlags | Array<keyof IntentFlags>;\r\n\r\n\r\n\r\n\r\nexport const flags = {\r\n\tGUILDS: 1 << 0,\r\n\tGUILD_MEMBERS: 1 << 1,\r\n\tGUILD_MODERATION: 1 << 2,\r\n\tGUILD_EMOJIS_AND_STICKERS: 1 << 3,\r\n\tGUILD_INTEGRATIONS: 1 << 4,\r\n\tGUILD_WEBHOOKS: 1 << 5,\r\n\tGUILD_INVITES: 1 << 6,\r\n\tGUILD_VOICE_STATES: 1 << 7,\r\n\tGUILD_PRESENCES: 1 << 8,\r\n\tGUILD_MESSAGES: 1 << 9,\r\n\tGUILD_MESSAGE_REACTIONS: 1 << 10,\r\n\tGUILD_MESSAGE_TYPING: 1 << 11,\r\n\tDIRECT_MESSAGES: 1 << 12,\r\n\tDIRECT_MESSAGE_REACTIONS: 1 << 13,\r\n\tDIRECT_MESSAGE_TYPING: 1 << 14,\r\n\tMESSAGE_CONTENT: 1 << 15,\r\n\tGUILD_SCHEDULED_EVENTS: 1 << 16,\r\n\tAUTO_MODERATION_CONFIGURATION: 1 << 20,\r\n\tAUTO_MODERATION_EXECUTION: 1 << 21\r\n};\r\n\r\n\r\nexport const privileged = flags.GUILD_MEMBERS | flags.GUILD_PRESENCES | flags.MESSAGE_CONTENT;\r\n\r\nexport const all = Object.values(flags).reduce((acc, p) => acc | p, 0);\r\n\r\nexport const non_privileged = all & ~privileged;\r\n\r\n\r\n\r\n\r\n\r\n\r\nexport function resolve(bit: IntentResolvable = 0): number {\r\n\tif (typeof bit === \"number\" && bit >= 0) return bit;\r\n\tif (typeof bit === \"string\" && flags[bit]) return flags[bit] | 0;\r\n\tif (Array.isArray(bit)) return bit.map((p: IntentResolvable) => resolve(p)).reduce((prev, p) => prev | p, 0);\r\n\tthrow new RangeError(\"BITFIELD_INVALID\");\r\n}\r\n\r\nexport default { flags, privileged, all, non_privileged, resolve };\r\n","\"use strict\";\r\n\r\nimport { EventEmitter } from \"events\";\r\nimport BetterWs = require(\"./BetterWs\");\r\nimport { GATEWAY_OP_CODES as OP, GATEWAY_VERSION } from \"./Constants\";\r\nimport Intents = require(\"./Intents\");\r\n\r\nimport type {\r\n\tGatewayReceivePayload,\r\n\tGatewayIdentify,\r\n\tGatewayPresenceUpdateData,\r\n\tGatewayVoiceStateUpdateData,\r\n\tGatewayRequestGuildMembersData,\r\n\tGatewayRequestGuildMembersDataWithQuery,\r\n\tGatewayRequestGuildMembersDataWithUserIds\r\n} from \"discord-api-types/v10\";\r\n\r\nimport { PresenceUpdateStatus } from \"discord-api-types/v10\";\r\n\r\ninterface ConnectorEvents {\r\n\tqueueIdentify: [number];\r\n\tready: [boolean];\r\n\tdisconnect: [number, string, boolean];\r\n\tstateChange: [\"connecting\" | \"identifying\" | \"resuming\" | \"ready\" | \"disconnected\"]\r\n}\r\n\r\ninterface DiscordConnector {\r\n\taddListener<E extends keyof ConnectorEvents>(event: E, listener: (...args: ConnectorEvents[E]) => any): this;\r\n\temit<E extends keyof ConnectorEvents>(event: E, ...args: ConnectorEvents[E]): boolean;\r\n\teventNames(): Array<keyof ConnectorEvents>;\r\n\tlistenerCount(event: keyof ConnectorEvents): number;\r\n\tlisteners(event: keyof ConnectorEvents): Array<(...args: Array<any>) => any>;\r\n\toff<E extends keyof ConnectorEvents>(event: E, listener: (...args: ConnectorEvents[E]) => any): this;\r\n\ton<E extends keyof ConnectorEvents>(event: E, listener: (...args: ConnectorEvents[E]) => any): this;\r\n\tonce<E extends keyof ConnectorEvents>(event: E, listener: (...args: ConnectorEvents[E]) => any): this;\r\n\tprependListener<E extends keyof ConnectorEvents>(event: E, listener: (...args: ConnectorEvents[E]) => any): this;\r\n\tprependOnceListener<E extends keyof ConnectorEvents>(event: E, listener: (...args: ConnectorEvents[E]) => any): this;\r\n\trawListeners(event: keyof ConnectorEvents): Array<(...args: Array<any>) => any>;\r\n\tremoveAllListeners(event?: keyof ConnectorEvents): this;\r\n\tremoveListener<E extends keyof ConnectorEvents>(event: E, listener: (...args: ConnectorEvents[E]) => any): this;\r\n}\r\n\r\nconst resumableCodes = [4008, 4005, 4003, 4002, 4001, 4000, 1006, 1001];\r\nconst shouldntAttemptReconnectCodes = [4014, 4013, 4012, 4011, 4010, 4004];\r\nconst disconnectMessages = {\r\n\t4014: \"Disallowed Intents, check your client options and application page.\",\r\n\t4013: \"Invalid Intents data, check your client options.\",\r\n\t4012: \"Invalid API version.\",\r\n\t4011: \"Shard would be on over 2500 guilds. Add more shards.\",\r\n\t4010: \"Invalid sharding data, check your client options.\",\r\n\t4009: \"Session timed out.\",\r\n\t4008: \"You are being rate limited. Wait before sending more packets.\",\r\n\t4007: \"Invalid sequence. Reconnecting and starting a new session.\",\r\n\t4005: \"You sent more than one OP 2 IDENTIFY payload while the websocket was open.\",\r\n\t4004: \"Tried to connect with an invalid token.\",\r\n\t4003: \"You tried to send a packet before sending an OP 2 IDENTIFY or OP 6 RESUME.\",\r\n\t4002: \"You sent an invalid payload.\",\r\n\t4001: \"You sent an invalid opcode or invalid payload for an opcode.\"\r\n};\r\n\r\nconst connectionError = new Error(\"WS took too long to connect. Is your internet okay?\");\r\n\r\nconst wsStatusTypes = [\"Whatever 0 is. Report if you see this\", \"connected\", \"connecting\", \"closing\", \"closed\"];\r\n\r\n\r\n\r\n\r\n\r\n\r\nclass DiscordConnector extends EventEmitter {\r\n\r\n\tpublic options: DiscordConnector[\"client\"][\"options\"];\r\n\r\n\tpublic reconnect: boolean;\r\n\r\n\tpublic betterWs: BetterWs;\r\n\r\n\tpublic heartbeatTimeout: NodeJS.Timeout | null = null;\r\n\r\n\tpublic heartbeatInterval = 0;\r\n\r\n\tpublic _trace: string | null = null;\r\n\r\n\tpublic seq = 0;\r\n\r\n\tpublic status: \"connecting\" | \"identifying\" | \"resuming\" | \"ready\" | \"disconnected\" = \"disconnected\";\r\n\r\n\tpublic sessionId: string | null = null;\r\n\r\n\tpublic lastACKAt = 0;\r\n\r\n\tpublic lastHeartbeatSend = 0;\r\n\r\n\tpublic latency = 0;\r\n\r\n\tpublic identifyAddress: string;\r\n\r\n\tpublic resumeAddress: string | null = null;\r\n\r\n\tpublic reconnecting = false;\r\n\r\n\r\n\tprivate _closing = false;\r\n\r\n\tprivate _closeCalled = false;\r\n\r\n\tprivate _openToHeartbeatTimeout: NodeJS.Timeout | null = null;\r\n\r\n\tprivate _initialHeartbeatTimeout: NodeJS.Timeout | null = null;\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic constructor(public id: number, public client: EventEmitter & { options: Omit<import(\"./Types\").IClientOptions, \"snowtransferInstance\"> & { token: string; endpoint?: string; } }) {\r\n\t\tsuper();\r\n\r\n\t\tthis.options = client.options;\r\n\t\tthis.reconnect = this.options.reconnect ?? true;\r\n\t\tthis.identifyAddress = this.options.endpoint!;\r\n\r\n\t\tthis.betterWs = new BetterWs(this.identifyAddress, this.options.ws!);\r\n\r\n\t\tthis.betterWs.on(\"ws_open\", () => {\r\n\t\t\tthis.status = \"connecting\";\r\n\t\t\tthis.emit(\"stateChange\", \"connecting\");\r\n\t\t\tthis.reconnecting = false;\r\n\t\t\tthis._openToHeartbeatTimeout = setTimeout(() => {\r\n\t\t\t\tthis.client.emit(\"debug\", `Shard ${this.id} didn't receive a HELLO after the ws was opened in time`);\r\n\t\t\t\tthis._reconnect(true);\r\n\t\t\t}, 10000);\r\n\t\t});\r\n\t\tthis.betterWs.on(\"ws_receive\", msg => this.messageAction(msg));\r\n\t\tthis.betterWs.on<\"ws_close\">(\"ws_close\", (code, reason) => this.handleWsClose(code, reason));\r\n\t\tthis.betterWs.on(\"debug\", event => this.client.emit(\"error\", event));\r\n\t\tthis.betterWs.on(\"ws_send\", data => this.client.emit(\"rawSend\", data));\r\n\t}\r\n\r\n\r\n\r\n\r\n\tpublic async connect(): Promise<void> {\r\n\t\tthis._closing = false;\r\n\t\tthis._closeCalled = false;\r\n\t\tthis.client.emit(\"debug\", `Shard ${this.id} connecting to gateway`);\r\n\r\n\t\treturn this.betterWs.connect()\r\n\t\t\t.catch(e => {\r\n\t\t\t\tif (e === connectionError) return;\r\n\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\tif (!this._closeCalled) this.connect();\r\n\t\t\t\t}, 5000);\r\n\t\t\t});\r\n\t}\r\n\r\n\r\n\r\n\r\n\tpublic async disconnect(): Promise<void> {\r\n\t\tthis._closing = true;\r\n\t\tthis._closeCalled = true;\r\n\t\treturn this.betterWs.close(1000, \"Disconnected by User\");\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tprivate async messageAction(message: GatewayReceivePayload): Promise<void> {\r\n\t\tthis.client.emit(\"rawReceive\", message);\r\n\t\tconst withShardID: import(\"./Types\").IGatewayMessage = Object.assign(message, { shard_id: this.id });\r\n\t\tthis.client.emit(\"event\", withShardID);\r\n\r\n\t\tswitch (withShardID.op) {\r\n\t\tcase OP.DISPATCH:\r\n\t\t\tthis.handleDispatch(withShardID);\r\n\t\t\tbreak;\r\n\r\n\t\tcase OP.HEARTBEAT:\r\n\t\t\tthis.heartbeat();\r\n\t\t\tbreak;\r\n\r\n\t\tcase OP.RECONNECT:\r\n\t\t\tthis.client.emit(\"debug\", `Gateway asked shard ${this.id} to reconnect`);\r\n\t\t\tif (this.reconnect) this._reconnect(true);\r\n\t\t\telse this.disconnect();\r\n\t\t\tbreak;\r\n\r\n\t\tcase OP.INVALID_SESSION:\r\n\t\t\tthis.client.emit(\"debug\", `Shard ${this.id}'s session was invalidated`);\r\n\t\t\tif (withShardID.d && this.sessionId) this.resume();\r\n\t\t\telse {\r\n\t\t\t\tthis.seq = 0;\r\n\t\t\t\tthis.sessionId = \"\";\r\n\t\t\t\tthis.emit(\"queueIdentify\", this.id);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\r\n\t\tcase OP.HELLO:\r\n\t\t\tif (this._openToHeartbeatTimeout) clearTimeout(this._openToHeartbeatTimeout);\r\n\t\t\tthis.client.emit(\"debug\", `Shard ${this.id} received HELLO`);\r\n\t\t\tthis.lastACKAt = Date.now();\r\n\t\t\tthis.heartbeatInterval = withShardID.d.heartbeat_interval;\r\n\t\t\tthis._initialHeartbeatTimeout = setTimeout(() => this.heartbeat(), this.heartbeatInterval * Math.random());\r\n\t\t\tthis._trace = (withShardID.d as unknown as { _trace: string })._trace;\r\n\t\t\tthis._onHello();\r\n\t\t\tbreak;\r\n\r\n\t\tcase OP.HEARTBEAT_ACK:\r\n\t\t\tthis.lastACKAt = Date.now();\r\n\t\t\tthis.latency = this.lastACKAt - this.lastHeartbeatSend;\r\n\t\t\tbreak;\r\n\r\n\t\tdefault:\r\n\t\t\tvoid 0;\r\n\t\t}\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tprivate async _reconnect(resume = false): Promise<void> {\r\n\t\tthis.betterWs._internal.openRejector?.(connectionError);\r\n\t\tthis.reconnecting = resume;\r\n\t\tawait this.betterWs.close(resume ? 4000 : 1012, \"reconnecting\");\r\n\t\tif (resume) {\r\n\t\t\tthis.clearHeartBeat();\r\n\t\t\tif (this.resumeAddress) this.betterWs.address = this.resumeAddress;\r\n\t\t\telse this.betterWs.address = this.identifyAddress;\r\n\t\t} else {\r\n\t\t\tthis.reset();\r\n\t\t\tthis.betterWs.address = this.identifyAddress;\r\n\t\t}\r\n\t\tthis.connect();\r\n\t}\r\n\r\n\r\n\r\n\r\n\tprivate reset(): void {\r\n\t\tthis.sessionId = null;\r\n\t\tthis.seq = 0;\r\n\t\tthis.lastACKAt = 0;\r\n\t\tthis._trace = null;\r\n\t\tthis.clearHeartBeat();\r\n\t}\r\n\r\n\r\n\r\n\r\n\tprivate setHeartBeat(): void {\r\n\t\tthis.heartbeatTimeout = setInterval(() => {\r\n\t\t\tif (this.lastACKAt <= Date.now() - (this.heartbeatInterval + 5000)) {\r\n\t\t\t\tthis.client.emit(\"debug\", `Shard ${this.id} has not received a heartbeat ACK in ${this.heartbeatInterval + 5000}ms.`);\r\n\t\t\t\tif (this.reconnect) this._reconnect(true);\r\n\t\t\t\telse this.disconnect();\r\n\t\t\t} else this.heartbeat();\r\n\t\t}, this.heartbeatInterval);\r\n\t}\r\n\r\n\r\n\r\n\r\n\tprivate clearHeartBeat(): void {\r\n\t\tif (this.heartbeatTimeout) clearInterval(this.heartbeatTimeout);\r\n\t\tif (this._initialHeartbeatTimeout) clearTimeout(this._initialHeartbeatTimeout);\r\n\t\tthis.heartbeatTimeout = null;\r\n\t\tthis._initialHeartbeatTimeout = null;\r\n\t\tthis.heartbeatInterval = 0;\r\n\t}\r\n\r\n\tprivate _onHello(): void {\r\n\t\tif (this.sessionId) return void this.resume();\r\n\t\telse this.emit(\"queueIdentify\", this.id);\r\n\t}\r\n\r\n\r\n\r\n\r\n\tpublic async identify(): Promise<void> {\r\n\t\tif (this.betterWs.status !== 1) {\r\n\t\t\tthis.client.emit(\"error\", `Shard ${this.id} was attempting to identify when the ws was not open. Was ${wsStatusTypes[this.betterWs.status]}`);\r\n\t\t\treturn this._reconnect(true);\r\n\t\t}\r\n\t\tthis.client.emit(\"debug\", `Shard ${this.id} is identifying`);\r\n\r\n\t\tthis.status = \"identifying\";\r\n\t\tthis.emit(\"stateChange\", \"identifying\");\r\n\r\n\t\tconst data = {\r\n\t\t\top: OP.IDENTIFY,\r\n\t\t\td: {\r\n\t\t\t\ttoken: this.options.token,\r\n\t\t\t\tproperties: {\r\n\t\t\t\t\tos: process.platform,\r\n\t\t\t\t\tbrowser: \"CloudStorm\",\r\n\t\t\t\t\tdevice: \"CloudStorm\"\r\n\t\t\t\t},\r\n\t\t\t\tlarge_threshold: this.options.largeGuildThreshold,\r\n\t\t\t\tshard: [this.id, this.options.totalShards ?? 1],\r\n\t\t\t\tintents: this.options.intents ? Intents.resolve(this.options.intents) : 0\r\n\t\t\t}\r\n\t\t} as GatewayIdentify;\r\n\r\n\t\tif (this.options.initialPresence) data.d.presence = this._checkPresenceData(this.options.initialPresence);\r\n\t\treturn this.betterWs.sendMessage(data);\r\n\t}\r\n\r\n\r\n\r\n\r\n\tpublic async resume(): Promise<void> {\r\n\t\tif (this.betterWs.status !== 1) {\r\n\t\t\tthis.client.emit(\"error\", `Shard ${this.id} was attempting to resume when the ws was not open. Was ${wsStatusTypes[this.betterWs.status]}`);\r\n\t\t\treturn this._reconnect(true);\r\n\t\t}\r\n\t\tthis.client.emit(\"debug\", `Shard ${this.id} is resuming`);\r\n\r\n\t\tthis.status = \"resuming\";\r\n\t\tthis.emit(\"stateChange\", \"resuming\");\r\n\r\n\t\treturn this.betterWs.sendMessage({\r\n\t\t\top: OP.RESUME,\r\n\t\t\td: { seq: this.seq, token: this.options.token, session_id: this.sessionId! }\r\n\t\t});\r\n\t}\r\n\r\n\r\n\r\n\r\n\tprivate heartbeat(): void {\r\n\t\tif (this.betterWs.status !== 1) {\r\n\t\t\tthis.client.emit(\"error\", `Shard ${this.id} was attempting to heartbeat when the ws was not open. Was ${wsStatusTypes[this.betterWs.status]}`);\r\n\t\t\treturn void this._reconnect(true);\r\n\t\t}\r\n\t\tthis.betterWs.sendMessage({ op: OP.HEARTBEAT, d: this.seq === 0 ? null : this.seq });\r\n\t\tthis.lastHeartbeatSend = Date.now();\r\n\t\tif (this._initialHeartbeatTimeout) {\r\n\t\t\tclearTimeout(this._initialHeartbeatTimeout);\r\n\t\t\tthis._initialHeartbeatTimeout = null;\r\n\t\t}\r\n\t\tif (!this.heartbeatTimeout) this.setHeartBeat();\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tprivate handleDispatch(message: import(\"./Types\").IGatewayDispatch): void {\r\n\t\tthis.client.emit(\"dispatch\", message);\r\n\r\n\t\tif (message.s) {\r\n\t\t\tif (message.s > this.seq + 1) {\r\n\t\t\t\tthis.client.emit(\"debug\", `Shard ${this.id} invalid sequence: { current: ${this.seq} message: ${message.s} }`);\r\n\t\t\t\tthis.seq = message.s;\r\n\t\t\t\tthis.resume();\r\n\t\t\t}\r\n\t\t\tthis.seq = message.s;\r\n\t\t}\r\n\t\tswitch (message.t) {\r\n\t\tcase \"READY\":\r\n\t\tcase \"RESUMED\":\r\n\t\t\tif (message.t === \"READY\") {\r\n\t\t\t\tif (message.d.resume_gateway_url) this.resumeAddress = `${message.d.resume_gateway_url}?v=${GATEWAY_VERSION}&encoding=${this.options.ws?.encoding === \"etf\" ? \"etf\" : \"json\"}${this.options.ws?.compress ? \"&compress=zlib-stream\" : \"\"}`;\r\n\t\t\t\tthis.sessionId = message.d.session_id;\r\n\t\t\t}\r\n\t\t\tthis.status = \"ready\";\r\n\t\t\tthis.emit(\"stateChange\", \"ready\");\r\n\t\t\tthis._trace = (message.d as unknown as { _trace: string })._trace;\r\n\t\t\tthis.emit(\"ready\", message.t === \"RESUMED\");\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\tvoid 0;\r\n\t\t}\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tprivate handleWsClose(code: number, reason: string): void {\r\n\t\tlet gracefulClose = false;\r\n\t\tthis.status = \"disconnected\";\r\n\t\tthis.emit(\"stateChange\", \"disconnected\");\r\n\t\tthis.clearHeartBeat();\r\n\r\n\t\tconst isManualClose = code === 1000 && this._closing;\r\n\r\n\t\tconst message = disconnectMessages[code as keyof typeof disconnectMessages];\r\n\t\tconst isRecoverable = resumableCodes.includes(code);\r\n\t\tconst shouldntReconnect = shouldntAttemptReconnectCodes.includes(code) || isManualClose;\r\n\r\n\t\tif (isRecoverable && this.resumeAddress) this.betterWs.address = this.resumeAddress;\r\n\t\telse this.betterWs.address = this.identifyAddress;\r\n\r\n\t\tif (message) this.client.emit(\"error\", message);\r\n\r\n\t\tif (isManualClose || this.reconnecting) gracefulClose = true;\r\n\r\n\t\tthis._closing = false;\r\n\r\n\t\tthis.emit(\"disconnect\", code, reason, gracefulClose);\r\n\r\n\t\tif (!shouldntReconnect && this.reconnect) this.connect();\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tpublic async presenceUpdate(data: Partial<GatewayPresenceUpdateData>): Promise<void> {\r\n\t\treturn this.betterWs.sendMessage({ op: OP.PRESENCE_UPDATE, d: this._checkPresenceData(data) });\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tpublic async voiceStateUpdate(data: GatewayVoiceStateUpdateData & { self_deaf?: boolean; self_mute?: boolean; }): Promise<void> {\r\n\t\tif (!data) return Promise.resolve();\r\n\t\treturn this.betterWs.sendMessage({ op: OP.VOICE_STATE_UPDATE, d: this._checkVoiceStateUpdateData(data) });\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tpublic async requestGuildMembers(data: GatewayRequestGuildMembersData & { limit?: number; }): Promise<void> {\r\n\t\treturn this.betterWs.sendMessage({ op: OP.REQUEST_GUILD_MEMBERS, d: this._checkRequestGuildMembersData(data) });\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tprivate _checkPresenceData(data: Parameters<DiscordConnector[\"presenceUpdate\"]>[\"0\"]): GatewayPresenceUpdateData {\r\n\t\tdata.status = data.status ?? PresenceUpdateStatus.Online;\r\n\t\tdata.activities = data.activities && Array.isArray(data.activities) ? data.activities : [];\r\n\r\n\t\tif (data.activities) {\r\n\t\t\tfor (const activity of data.activities) {\r\n\t\t\t\tconst index = data.activities.indexOf(activity);\r\n\t\t\t\tif (activity.type === undefined) activity.type = activity.url ? 1 : 0;\r\n\t\t\t\tif (!activity.name) {\r\n\t\t\t\t\tif (activity.state && activity.type === 4) activity.name = \"Custom Status\";\r\n\t\t\t\t\telse data.activities.splice(index, 1);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tdata.afk = data.afk ?? false;\r\n\t\tdata.since = data.since ?? Date.now();\r\n\t\treturn data as GatewayPresenceUpdateData;\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tprivate _checkVoiceStateUpdateData(data: Parameters<DiscordConnector[\"voiceStateUpdate\"]>[\"0\"]): GatewayVoiceStateUpdateData {\r\n\t\tdata.channel_id = data.channel_id ?? null;\r\n\t\tdata.self_mute = data.self_mute ?? false;\r\n\t\tdata.self_deaf = data.self_deaf ?? false;\r\n\t\treturn data;\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tprivate _checkRequestGuildMembersData(data: Parameters<DiscordConnector[\"requestGuildMembers\"]>[\"0\"]): GatewayRequestGuildMembersData {\r\n\t\tconst withQuery = data as GatewayRequestGuildMembersDataWithQuery;\r\n\t\tconst withUserIDs = data as GatewayRequestGuildMembersDataWithUserIds;\r\n\t\tif (!withQuery.query && !withUserIDs.user_ids) withQuery.query = \"\";\r\n\t\tif (withQuery.query && withUserIDs.user_ids) delete (data as { query?: string; }).query;\r\n\t\tdata.limit = data.limit ?? 10;\r\n\t\treturn data;\r\n\t}\r\n}\r\n\r\nexport = DiscordConnector;\r\n","\"use strict\";\r\n\r\nimport { EventEmitter } from \"events\";\r\nimport DC = require(\"./DiscordConnector\");\r\n\r\ninterface ShardEvents {\r\n\tdisconnect: [number, string, boolean];\r\n\tready: [boolean];\r\n\tqueueIdentify: [number];\r\n}\r\n\r\ninterface Shard {\r\n\taddListener<E extends keyof ShardEvents>(event: E, listener: (...args: ShardEvents[E]) => any): this;\r\n\temit<E extends keyof ShardEvents>(event: E, ...args: ShardEvents[E]): boolean;\r\n\teventNames(): Array<keyof ShardEvents>;\r\n\tlistenerCount(event: keyof ShardEvents): number;\r\n\tlisteners(event: keyof ShardEvents): Array<(...args: Array<any>) => any>;\r\n\toff<E extends keyof ShardEvents>(event: E, listener: (...args: ShardEvents[E]) => any): this;\r\n\ton<E extends keyof ShardEvents>(event: E, listener: (...args: ShardEvents[E]) => any): this;\r\n\tonce<E extends keyof ShardEvents>(event: E, listener: (...args: ShardEvents[E]) => any): this;\r\n\tprependListener<E extends keyof ShardEvents>(event: E, listener: (...args: ShardEvents[E]) => any): this;\r\n\tprependOnceListener<E extends keyof ShardEvents>(event: E, listener: (...args: ShardEvents[E]) => any): this;\r\n\trawListeners(event: keyof ShardEvents): Array<(...args: Array<any>) => any>;\r\n\tremoveAllListeners(event?: keyof ShardEvents): this;\r\n\tremoveListener<E extends keyof ShardEvents>(event: E, listener: (...args: ShardEvents[E]) => any): this;\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\nclass Shard extends EventEmitter {\r\n\r\n\tpublic ready = false;\r\n\r\n\tpublic connector: DC;\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic constructor(public id: number, public client: EventEmitter & { options: Omit<import(\"./Types\").IClientOptions, \"snowtransferInstance\"> & { token: string; endpoint?: string; } }) {\r\n\t\tsuper();\r\n\r\n\t\tthis.connector = new DC(id, client);\r\n\t\tthis.connector.on(\"disconnect\", (...args) => {\r\n\t\t\tthis.ready = false;\r\n\t\t\tthis.emit(\"disconnect\", ...args);\r\n\t\t});\r\n\t\tthis.connector.on(\"ready\", resume => this.emit(\"ready\", resume));\r\n\t\tthis.connector.on(\"queueIdentify\", () => this.emit(\"queueIdentify\", this.id));\r\n\t}\r\n\r\n\r\n\r\n\r\n\tpublic get latency(): number {\r\n\t\treturn this.connector.latency;\r\n\t}\r\n\r\n\r\n\r\n\r\n\tpublic connect(): void {\r\n\t\tthis.connector.connect();\r\n\t}\r\n\r\n\r\n\r\n\r\n\tpublic disconnect(): Promise<void> {\r\n\t\treturn this.connector.disconnect();\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tpublic presenceUpdate(data: Parameters<Shard[\"connector\"][\"presenceUpdate\"]>[\"0\"]): Promise<void> {\r\n\t\treturn this.connector.presenceUpdate(data);\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tpublic voiceStateUpdate(data: Parameters<Shard[\"connector\"][\"voiceStateUpdate\"]>[\"0\"]): Promise<void> {\r\n\t\treturn this.connector.voiceStateUpdate(data);\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tpublic requestGuildMembers(data: Parameters<Shard[\"connector\"][\"requestGuildMembers\"]>[\"0\"]): Promise<void> {\r\n\t\treturn this.connector.requestGuildMembers(data);\r\n\t}\r\n}\r\n\r\nexport = Shard;\r\n","\"use strict\";\r\n\r\nimport Shard = require(\"./Shard\");\r\nimport { LocalBucket } from \"snowtransfer\";\r\n\r\n\r\n\r\n\r\n\r\n\r\nclass ShardManager {\r\n\r\n\tpublic options: ShardManager[\"client\"][\"options\"];\r\n\r\n\tpublic shards: { [id: number]: Shard } = {};\r\n\r\n\tpublic identifyBucket = new LocalBucket(1000, 1000 * 60 * 60 * 24);\r\n\r\n\tpublic concurrencyBucket: LocalBucket | null = null;\r\n\r\n\r\n\r\n\r\n\tpublic constructor(public client: import(\"events\").EventEmitter & { options: Omit<import(\"./Types\").IClientOptions, \"snowtransferInstance\"> & { token: string; endpoint?: string; } }) {\r\n\t\tthis.options = client.options;\r\n\t}\r\n\r\n\r\n\r\n\r\n\tpublic spawn(): void {\r\n\t\tif (!this.concurrencyBucket) throw new Error(\"Trying to spawn shards without calling Client.connect()\");\r\n\t\tfor (const id of (this.options.shards === \"auto\" ? Array(this.options.totalShards).fill(0).map((_, index) => index) : this.options.shards ?? [0])) {\r\n\t\t\tthis.client.emit(\"debug\", `Spawned shard ${id}`);\r\n\t\t\tthis.shards[id] = new Shard(id, this.client);\r\n\t\t\tthis._addListener(this.shards[id]);\r\n\t\t\tthis.shards[id].connector.connect();\r\n\t\t}\r\n\t}\r\n\r\n\r\n\r\n\r\n\tpublic disconnect(): void {\r\n\t\tfor (const shardKey in this.shards) {\r\n\t\t\tthis.shards[shardKey].disconnect();\r\n\t\t}\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tprivate _addListener(shard: Shard): void {\r\n\t\tshard.on(\"ready\", (resume) => {\r\n\t\t\tshard.ready = true;\r\n\t\t\tthis.client.emit(\"debug\", `Shard ${shard.id} ${resume ? \"has resumed\" : \"is ready\"}`);\r\n\t\t\tthis.client.emit(\"shardReady\", { id: shard.id, ready: !resume });\r\n\t\t\tthis._checkReady();\r\n\t\t});\r\n\t\tshard.on(\"queueIdentify\", (shardId) => {\r\n\t\t\tif (!this.shards[shardId]) return this.client.emit(\"debug\", `Received a queueIdentify event for shard ${shardId} but it does not exist. Was it removed?`);\r\n\t\t\tthis.client.emit(\"debug\", `Shard ${shardId} is ready to identify`);\r\n\t\t\tif (shard.connector.reconnecting) return shard.connector.resume();\r\n\t\t\tthis.concurrencyBucket?.queue(() => {\r\n\t\t\t\tthis.identifyBucket.queue(() => this.shards[shardId].connector.identify());\r\n\t\t\t});\r\n\t\t});\r\n\t\tshard.on(\"disconnect\", (code, reason, gracefulClose) => {\r\n\t\t\tthis.client.emit(\"debug\", `Websocket of shard ${shard.id} closed with code ${code} and reason: ${reason ?? \"None\"}`);\r\n\t\t\tif (code === 1000 && gracefulClose) return this._checkDisconnect();\r\n\t\t});\r\n\t}\r\n\r\n\r\n\r\n\r\n\tprivate _checkReady(): void {\r\n\t\tfor (const shardId in this.shards) {\r\n\t\t\tif (this.shards[shardId]) {\r\n\t\t\t\tif (!this.shards[shardId].ready) return;\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.client.emit(\"ready\");\r\n\t}\r\n\r\n\r\n\r\n\r\n\tprivate _checkDisconnect(): void {\r\n\t\tfor (const shardId in this.shards) {\r\n\t\t\tif (this.shards[shardId]) {\r\n\t\t\t\tif (this.shards[shardId].connector.status !== \"disconnected\") return;\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.client.emit(\"disconnected\");\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tpublic async presenceUpdate(data: Parameters<Shard[\"presenceUpdate\"]>[\"0\"]): Promise<void> {\r\n\t\tfor (const shardKey in this.shards) {\r\n\t\t\tif (this.shards[shardKey]) {\r\n\t\t\t\tconst shard = this.shards[shardKey];\r\n\t\t\t\tthis.shardPresenceUpdate(shard.id, data);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic shardPresenceUpdate(shardId: number, data: Parameters<Shard[\"presenceUpdate\"]>[\"0\"]): Promise<void> {\r\n\t\treturn new Promise((res, rej) => {\r\n\t\t\tconst shard = this.shards[shardId];\r\n\t\t\tif (!shard) rej(new Error(`Shard ${shardId} does not exist`));\r\n\t\t\tif (!shard.ready) return;\r\n\t\t\tshard.presenceUpdate(data).then(result => res(result)).catch(e => rej(e));\r\n\t\t});\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic voiceStateUpdate(shardId: number, data: Parameters<Shard[\"voiceStateUpdate\"]>[\"0\"]): Promise<void> {\r\n\t\treturn new Promise((res, rej) => {\r\n\t\t\tconst shard = this.shards[shardId];\r\n\t\t\tif (!shard) rej(new Error(`Shard ${shardId} does not exist`));\r\n\t\t\tif (!shard.ready) return;\r\n\t\t\tshard.voiceStateUpdate(data).then(result => res(result)).catch(e => rej(e));\r\n\t\t});\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic requestGuildMembers(shardId: number, data: Parameters<Shard[\"requestGuildMembers\"]>[\"0\"]): Promise<void> {\r\n\t\treturn new Promise((res, rej) => {\r\n\t\t\tconst shard = this.shards[shardId];\r\n\t\t\tif (!shard) rej(new Error(`Shard ${shardId} does not exist`));\r\n\t\t\tif (!shard.ready) return;\r\n\t\t\tshard.requestGuildMembers(data).then(result => res(result)).catch(e => rej(e));\r\n\t\t});\r\n\t}\r\n}\r\n\r\nexport = ShardManager;\r\n","\"use strict\";\r\n\r\nimport fs = require(\"fs\");\r\nimport path = require(\"path\");\r\n\r\nconst version = JSON.parse(fs.readFileSync(path.join(__dirname, \"../package.json\"), { encoding: \"utf8\" })).version as string;\r\nimport { EventEmitter } from \"events\";\r\nimport Constants = require(\"./Constants\");\r\nimport { SnowTransfer, LocalBucket } from \"snowtransfer\";\r\nimport ShardManager = require(\"./ShardManager\");\r\nimport type {\r\n\tGatewaySendPayload,\r\n\tGatewayReceivePayload,\r\n\tAPIGatewayBotInfo\r\n} from \"discord-api-types/v10\";\r\n\r\ninterface ClientEvents {\r\n\tdebug: [string];\r\n\trawSend: [GatewaySendPayload];\r\n\trawReceive: [GatewayReceivePayload];\r\n\terror: [string];\r\n\r\n\tevent: [import(\"./Types\").IGatewayMessage];\r\n\tdispatch: [import(\"./Types\").IGatewayDispatch];\r\n\tshardReady: [{ id: number; ready: boolean; }];\r\n\tready: [];\r\n\tdisconnected: [];\r\n}\r\n\r\ninterface Client {\r\n\taddListener<E extends keyof ClientEvents>(event: E, listener: (...args: ClientEvents[E]) => any): this;\r\n\temit<E extends keyof ClientEvents>(event: E, ...args: ClientEvents[E]): boolean;\r\n\teventNames(): Array<keyof ClientEvents>;\r\n\tlistenerCount(event: keyof ClientEvents): number;\r\n\tlisteners(event: keyof ClientEvents): Array<(...args: Array<any>) => any>;\r\n\toff<E extends keyof ClientEvents>(event: E, listener: (...args: ClientEvents[E]) => any): this;\r\n\ton<E extends keyof ClientEvents>(event: E, listener: (...args: ClientEvents[E]) => any): this;\r\n\tonce<E extends keyof ClientEvents>(event: E, listener: (...args: ClientEvents[E]) => any): this;\r\n\tprependListener<E extends keyof ClientEvents>(event: E, listener: (...args: ClientEvents[E]) => any): this;\r\n\tprependOnceListener<E extends keyof ClientEvents>(event: E, listener: (...args: ClientEvents[E]) => any): this;\r\n\trawListeners(event: keyof ClientEvents): Array<(...args: Array<any>) => any>;\r\n\tremoveAllListeners(event?: keyof ClientEvents): this;\r\n\tremoveListener<E extends keyof ClientEvents>(event: E, listener: (...args: ClientEvents[E]) => any): this;\r\n}\r\n\r\n\r\n\r\n\r\nclass Client extends EventEmitter {\r\n\r\n\tpublic token: string;\r\n\r\n\tpublic options: Omit<import(\"./Types\").IClientOptions, \"snowtransferInstance\"> & { token: string; endpoint?: string; };\r\n\r\n\tpublic shardManager: ShardManager;\r\n\r\n\tpublic version = version;\r\n\r\n\tprivate _restClient: SnowTransfer;\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic constructor(token: string, options: import(\"./Types\").IClientOptions = {}) {\r\n\t\tsuper();\r\n\t\tif (!token) throw new Error(\"Missing token!\");\r\n\t\tthis.options = {\r\n\t\t\tlargeGuildThreshold: 250,\r\n\t\t\tshards: \"auto\",\r\n\t\t\treconnect: true,\r\n\t\t\tintents: 0,\r\n\t\t\ttoken: \"\",\r\n\t\t\tws: {\r\n\t\t\t\tcompress: true,\r\n\t\t\t\tencoding: \"json\"\r\n\t\t\t}\r\n\t\t};\r\n\t\tthis._restClient = options.snowtransferInstance ? options.snowtransferInstance : new SnowTransfer(token);\r\n\t\tdelete options.snowtransferInstance;\r\n\t\tthis.token = token.startsWith(\"Bot \") ? token.substring(4) : token;\r\n\t\tObject.assign(this.options, options);\r\n\t\tthis.options.token = token;\r\n\t\tthis.shardManager = new ShardManager(this);\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tpublic async connect(): Promise<void> {\r\n\t\tconst initial = await this.fetchConnectInfo();\r\n\t\tif (this.options.shards === \"auto\") this.options.totalShards = initial;\r\n\t\tthis.shardManager.spawn();\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic async fetchConnectInfo(): Promise<number> {\r\n\t\tconst gateway = await this.getGatewayBot();\r\n\t\tthis._updateEndpoint(gateway.url);\r\n\t\tconst oldQueueConcurrency = [] as Array<() => unknown>;\r\n\t\tconst oldQueueIdentify = [] as Array<() => unknown>;\r\n\t\tif (this.shardManager.concurrencyBucket?.fnQueue.length) {\r\n\t\t\toldQueueConcurrency.push(...this.shardManager.concurrencyBucket.fnQueue);\r\n\t\t\tthis.shardManager.concurrencyBucket.dropQueue();\r\n\t\t}\r\n\t\tif (this.shardManager.identifyBucket.fnQueue.length) oldQueueIdentify.push(...this.shardManager.identifyBucket.fnQueue);\r\n\t\tthis.shardManager.identifyBucket.dropQueue();\r\n\t\tthis.shardManager.concurrencyBucket = new LocalBucket(gateway.session_start_limit.max_concurrency, 5000);\r\n\t\tthis.shardManager.identifyBucket.remaining = gateway.session_start_limit.remaining;\r\n\t\tthis.shardManager.identifyBucket.reset = gateway.session_start_limit.reset_after;\r\n\t\tfor (const fn of oldQueueConcurrency) {\r\n\t\t\tthis.shardManager.concurrencyBucket.queue(fn);\r\n\t\t}\r\n\t\tfor (const fn of oldQueueIdentify) {\r\n\t\t\tthis.shardManager.identifyBucket.queue(fn);\r\n\t\t}\r\n\t\treturn gateway.shards;\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tpublic async getGateway(): Promise<string> {\r\n\t\tconst gatewayData = await this._restClient.bot.getGateway();\r\n\t\treturn gatewayData.url;\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tpublic async getGatewayBot(): Promise<APIGatewayBotInfo> {\r\n\t\treturn this._restClient.bot.getGatewayBot();\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tpublic disconnect(): void {\r\n\t\treturn this.shardManager.disconnect();\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic async presenceUpdate(data: Parameters<Client[\"shardManager\"][\"presenceUpdate\"]>[\"0\"]): Promise<void> {\r\n\t\treturn this.shardManager.presenceUpdate(data);\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic shardStatusUpdate(shardId: number, data: Parameters<Client[\"shardManager\"][\"shardPresenceUpdate\"]>[\"1\"]): Promise<void> {\r\n\t\treturn this.shardManager.shardPresenceUpdate(shardId, data);\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic voiceStateUpdate(shardId: number, data: Parameters<Client[\"shardManager\"][\"voiceStateUpdate\"]>[\"1\"]): Promise<void> {\r\n\t\treturn this.shardManager.voiceStateUpdate(shardId, data);\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic requestGuildMembers(shardId: number, data: Parameters<Client[\"shardManager\"][\"requestGuildMembers\"]>[\"1\"]): Promise<void> {\r\n\t\tif (!data.guild_id) throw new Error(\"You need to pass a guild_id\");\r\n\t\treturn this.shardManager.requestGuildMembers(shardId, data);\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tprivate _updateEndpoint(gatewayUrl: string): void {\r\n\t\tthis.options.endpoint = `${gatewayUrl}?v=${Constants.GATEWAY_VERSION}&encoding=${this.options.ws?.encoding === \"etf\" ? \"etf\" : \"json\"}${this.options.ws?.compress ? \"&compress=zlib-stream\" : \"\"}`;\r\n\t}\r\n}\r\n\r\nexport = Client;\r\n","import Client2 = require(\"./Client\");\r\nimport Constants = require(\"./Constants\");\r\nimport Intents = require(\"./Intents\");\r\n\r\nimport Shard2 = require(\"./Shard\");\r\nimport ShardManager2 = require(\"./ShardManager\");\r\n\r\nimport BetterWs2 = require(\"./BetterWs\");\r\n\r\nexport { BetterWs2 as BetterWs, Client2 as Client, Constants, Intents, Shard2 as Shard, ShardManager2 as ShardManager };\r\nexport * from \"./Types\";\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cloudstorm",
3
- "version": "0.10.7",
3
+ "version": "0.10.8",
4
4
  "description": "Minimalistic Discord Gateway library",
5
5
  "main": "./dist/index.js",
6
6
  "engines": {
@@ -8,24 +8,24 @@
8
8
  },
9
9
  "types": "./dist/index.d.ts",
10
10
  "scripts": {
11
- "build:src": "tsup src/index.ts --clean --dts --sourcemap --format cjs --target node14 --minify-whitespace",
11
+ "build:src": "tsup src/index.ts --clean --dts --sourcemap --format cjs --target node14 --minify-whitespace --minify-syntax --treeshake && node ./sourceMapPostProcess.js",
12
12
  "build:docs": "typedoc --name CloudStorm --excludeExternals --sort static-first --sort alphabetical"
13
13
  },
14
14
  "author": "wolke <wolke@weeb.sh>",
15
15
  "license": "MIT",
16
16
  "dependencies": {
17
- "discord-api-types": "^0.37.69",
18
- "snowtransfer": "^0.10.4"
17
+ "discord-api-types": "^0.37.70",
18
+ "snowtransfer": "^0.10.5"
19
19
  },
20
20
  "devDependencies": {
21
- "@types/node": "20.11.17",
22
- "@typescript-eslint/eslint-plugin": "^6.21.0",
23
- "@typescript-eslint/parser": "^6.21.0",
21
+ "@types/node": "20.11.19",
22
+ "@typescript-eslint/eslint-plugin": "^7.0.2",
23
+ "@typescript-eslint/parser": "^7.0.2",
24
24
  "eslint": "^8.56.0",
25
- "tsup": "^8.0.1",
25
+ "tsup": "^8.0.2",
26
26
  "typedoc": "^0.25.8",
27
- "typedoc-plugin-mdn-links": "^3.1.15",
28
- "typescript": "^5.3.0"
27
+ "typedoc-plugin-mdn-links": "^3.1.16",
28
+ "typescript": "^5.3.3"
29
29
  },
30
30
  "files": [
31
31
  "dist",