cloudstorm 0.10.3 → 0.10.5
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 +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
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.3",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.67",snowtransfer:"^0.10.1"},devDependencies:{"@types/node":"20.11.7","@typescript-eslint/eslint-plugin":"^6.19.1","@typescript-eslint/parser":"^6.19.1",eslint:"^8.56.0",tsup:"^8.0.1",typedoc:"^0.25.7","typedoc-plugin-mdn-links":"^3.1.13",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??"json";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"}});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){if(!isValidRequest(data))return Promise.reject(new Error("Invalid request"));return new Promise(res=>{const presence=data.op===import_Constants.GATEWAY_OP_CODES.PRESENCE_UPDATE;const sendMsg=()=>{this.wsBucket.queue(()=>{this.emit("ws_send",data);if(this.encoding==="json")this._write(Buffer.from(JSON.stringify(data)),1);else{const etf=writeETF(data);this._write(etf,2)}res(void 0)})};if(presence)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:{const packet=JSON.parse(message.toString());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}packet=this.encoding==="json"?JSON.parse(String(data)):readETF(data,1)}else if(this.encoding==="json"){const data=(0,import_zlib.inflateSync)(message);packet=JSON.parse(data.toString())}else packet=readETF(message,1);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 isValidRequest(value){return value&&typeof value==="object"&&Number.isInteger(value.op)&&typeof value.d!=="undefined"}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,1e3];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.options.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.options.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 message=disconnectMessages[code];const isRecoverable=resumableCodes.includes(code);const shouldntReconnect=shouldntAttemptReconnectCodes.includes(code);if(isRecoverable&&this.resumeAddress)this.betterWs.address=this.resumeAddress;else this.betterWs.address=this.identifyAddress;if(message)this.client.emit("error",message);if(code===1e3&&this._closing||this.reconnecting)gracefulClose=true;if(!shouldntReconnect&&this.reconnect)this.connect();this._closing=false;this.emit("disconnect",code,reason,gracefulClose)}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
|
+
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.5",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.67",snowtransfer:"^0.10.4"},devDependencies:{"@types/node":"20.11.7","@typescript-eslint/eslint-plugin":"^6.19.1","@typescript-eslint/parser":"^6.19.1",eslint:"^8.56.0",tsup:"^8.0.1",typedoc:"^0.25.7","typedoc-plugin-mdn-links":"^3.1.13",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??"json";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"}});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){if(!isValidRequest(data))return Promise.reject(new Error("Invalid request"));return new Promise(res=>{const presence=data.op===import_Constants.GATEWAY_OP_CODES.PRESENCE_UPDATE;const sendMsg=()=>{this.wsBucket.queue(()=>{this.emit("ws_send",data);if(this.encoding==="json")this._write(Buffer.from(JSON.stringify(data)),1);else{const etf=writeETF(data);this._write(etf,2)}res(void 0)})};if(presence)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:{const packet=JSON.parse(message.toString());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}packet=this.encoding==="json"?JSON.parse(String(data)):readETF(data,1)}else if(this.encoding==="json"){const data=(0,import_zlib.inflateSync)(message);packet=JSON.parse(data.toString())}else packet=readETF(message,1);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 isValidRequest(value){return value&&typeof value==="object"&&Number.isInteger(value.op)&&typeof value.d!=="undefined"}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,1e3];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.options.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.options.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 message=disconnectMessages[code];const isRecoverable=resumableCodes.includes(code);const shouldntReconnect=shouldntAttemptReconnectCodes.includes(code);if(isRecoverable&&this.resumeAddress)this.betterWs.address=this.resumeAddress;else this.betterWs.address=this.identifyAddress;if(message)this.client.emit("error",message);if(code===1e3&&this._closing||this.reconnecting)gracefulClose=true;if(!shouldntReconnect&&this.reconnect)this.connect();this._closing=false;this.emit("disconnect",code,reason,gracefulClose)}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});
|
|
2
2
|
//# 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.3\",\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.67\",\r\n \"snowtransfer\": \"^0.10.1\"\r\n },\r\n \"devDependencies\": {\r\n \"@types/node\": \"20.11.7\",\r\n \"@typescript-eslint/eslint-plugin\": \"^6.19.1\",\r\n \"@typescript-eslint/parser\": \"^6.19.1\",\r\n \"eslint\": \"^8.56.0\",\r\n \"tsup\": \"^8.0.1\",\r\n \"typedoc\": \"^0.25.7\",\r\n \"typedoc-plugin-mdn-links\": \"^3.1.13\",\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 { GatewayReceivePayload, GatewaySendPayload } from \"discord-api-types/v10\";\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: [GatewayReceivePayload];\r\n\tws_send: [GatewaySendPayload];\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\";\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: import(\"./Types\").IClientWSOptions) {\r\n\t\tsuper();\r\n\r\n\t\tthis.encoding = options.encoding ?? \"json\";\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}\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: GatewaySendPayload): Promise<void> {\r\n\t\tif (!isValidRequest(data)) return Promise.reject(new Error(\"Invalid request\"));\r\n\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\tthis.wsBucket.queue(() => {\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 {\r\n\t\t\t\t\t\tconst etf = writeETF(data);\r\n\t\t\t\t\t\tthis._write(etf, 2);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tres(void 0);\r\n\t\t\t\t});\r\n\t\t\t};\r\n\t\t\tif (presence) 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\tconst packet = JSON.parse(message.toString());\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\tpacket = this.encoding === \"json\" ? JSON.parse(String(data)) : readETF(data, 1);\r\n\t\t\t} else if (this.encoding === \"json\") {\r\n\t\t\t\tconst data = inflateSync(message);\r\n\t\t\t\tpacket = JSON.parse(data.toString());\r\n\t\t\t} else packet = readETF(message, 1);\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 isValidRequest(value: GatewaySendPayload): boolean {\r\n\treturn value && typeof value === \"object\" && Number.isInteger(value.op) && typeof value.d !== \"undefined\";\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, 1000];\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.options.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.options.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 message = disconnectMessages[code as keyof typeof disconnectMessages];\r\n\t\tconst isRecoverable = resumableCodes.includes(code);\r\n\t\tconst shouldntReconnect = shouldntAttemptReconnectCodes.includes(code);\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 ((code === 1000 && this._closing) || this.reconnecting) gracefulClose = true;\r\n\r\n\t\tif (!shouldntReconnect && this.reconnect) this.connect();\r\n\r\n\t\tthis._closing = false;\r\n\r\n\t\tthis.emit(\"disconnect\", code, reason, gracefulClose);\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} 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() {\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":["../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.5\",\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.67\",\r\n \"snowtransfer\": \"^0.10.4\"\r\n },\r\n \"devDependencies\": {\r\n \"@types/node\": \"20.11.7\",\r\n \"@typescript-eslint/eslint-plugin\": \"^6.19.1\",\r\n \"@typescript-eslint/parser\": \"^6.19.1\",\r\n \"eslint\": \"^8.56.0\",\r\n \"tsup\": \"^8.0.1\",\r\n \"typedoc\": \"^0.25.7\",\r\n \"typedoc-plugin-mdn-links\": \"^3.1.13\",\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 { GatewayReceivePayload, GatewaySendPayload } from \"discord-api-types/v10\";\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: [GatewayReceivePayload];\r\n\tws_send: [GatewaySendPayload];\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\";\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: import(\"./Types\").IClientWSOptions) {\r\n\t\tsuper();\r\n\r\n\t\tthis.encoding = options.encoding ?? \"json\";\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}\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: GatewaySendPayload): Promise<void> {\r\n\t\tif (!isValidRequest(data)) return Promise.reject(new Error(\"Invalid request\"));\r\n\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\tthis.wsBucket.queue(() => {\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 {\r\n\t\t\t\t\t\tconst etf = writeETF(data);\r\n\t\t\t\t\t\tthis._write(etf, 2);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tres(void 0);\r\n\t\t\t\t});\r\n\t\t\t};\r\n\t\t\tif (presence) 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\tconst packet = JSON.parse(message.toString());\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\tpacket = this.encoding === \"json\" ? JSON.parse(String(data)) : readETF(data, 1);\r\n\t\t\t} else if (this.encoding === \"json\") {\r\n\t\t\t\tconst data = inflateSync(message);\r\n\t\t\t\tpacket = JSON.parse(data.toString());\r\n\t\t\t} else packet = readETF(message, 1);\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 isValidRequest(value: GatewaySendPayload): boolean {\r\n\treturn value && typeof value === \"object\" && Number.isInteger(value.op) && typeof value.d !== \"undefined\";\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, 1000];\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.options.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.options.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 message = disconnectMessages[code as keyof typeof disconnectMessages];\r\n\t\tconst isRecoverable = resumableCodes.includes(code);\r\n\t\tconst shouldntReconnect = shouldntAttemptReconnectCodes.includes(code);\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 ((code === 1000 && this._closing) || this.reconnecting) gracefulClose = true;\r\n\r\n\t\tif (!shouldntReconnect && this.reconnect) this.connect();\r\n\r\n\t\tthis._closing = false;\r\n\r\n\t\tthis.emit(\"disconnect\", code, reason, gracefulClose);\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} 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() {\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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cloudstorm",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.5",
|
|
4
4
|
"description": "Minimalistic Discord Gateway library",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"engines": {
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"license": "MIT",
|
|
16
16
|
"dependencies": {
|
|
17
17
|
"discord-api-types": "^0.37.67",
|
|
18
|
-
"snowtransfer": "^0.10.
|
|
18
|
+
"snowtransfer": "^0.10.4"
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|
|
21
21
|
"@types/node": "20.11.7",
|