cloudstorm 0.13.3 → 0.14.1

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.d.ts CHANGED
@@ -1,5 +1,4 @@
1
- import { EventEmitter } from 'events';
2
- import { Inflate } from 'zlib';
1
+ import EventEmitter, { EventEmitter as EventEmitter$1 } from 'events';
3
2
  import { GatewaySendPayload, GatewayReceivePayload, GatewayDispatchPayload, GatewayPresenceUpdateData, GatewayVoiceStateUpdateData, GatewayRequestGuildMembersData, APIGatewayBotInfo } from 'discord-api-types/v10';
4
3
  import { SnowTransfer, LocalBucket } from 'snowtransfer';
5
4
 
@@ -96,6 +95,7 @@ type IClientWSOptions = {
96
95
  encoding?: "etf" | "json";
97
96
  headers?: Record<string, any>;
98
97
  bypassBuckets?: boolean;
98
+ connectThrottle?: number;
99
99
  };
100
100
  type BWSEvents = {
101
101
  ws_open: [];
@@ -130,12 +130,113 @@ type ShardEvents = {
130
130
  ready: [boolean];
131
131
  queueIdentify: [number];
132
132
  };
133
+ type SMState = {
134
+ onEnter: Array<(event: string) => unknown>;
135
+ onLeave: Array<(event: string) => unknown>;
136
+ transitions: Map<string, SMTransition>;
137
+ };
138
+ type SMTransition = {
139
+ destination: string;
140
+ onTransition?: Array<(...args: any[]) => unknown>;
141
+ };
142
+ type SMHistory = {
143
+ from: string;
144
+ event: string;
145
+ to: string;
146
+ time: number;
147
+ };
148
+
149
+ interface StateMachineEvents {
150
+ enter: [string];
151
+ }
152
+ /**
153
+ * Class used to define states code is expected to be in and transitions to other states and code to run during those transitions and states
154
+ * @since 0.14.0
155
+ */
156
+ declare class StateMachine extends EventEmitter<StateMachineEvents> {
157
+ currentStateName: string;
158
+ readonly states: Map<string, SMState>;
159
+ private editable;
160
+ private readonly deferredTransitionCreators;
161
+ private readonly history;
162
+ /**
163
+ * Create a new StateMachine
164
+ * @param currentStateName The state this state machine is currently in. When constructing the StateMachine, this is the entry state.
165
+ */
166
+ constructor(currentStateName: string);
167
+ /**
168
+ * Helper function that throws an Error when something tries to edit the state machine after it has been frozen/finalized.
169
+ * @since 0.14.0
170
+ */
171
+ guardEditable(): void;
172
+ /**
173
+ * Helper function that throws an Error when something tries to use the state machine before it has been frozen/finalized.
174
+ * @since 0.14.0
175
+ */
176
+ guardNotEditable(): void;
177
+ /**
178
+ * Define a state in the state machine.
179
+ * @since 0.14.0
180
+ * @param name The name of the state.
181
+ * @param cbs Callbacks for points during transitions relating to this state as well as transitions to other states.
182
+ */
183
+ defineState(name: string, cbs?: {
184
+ onEnter: SMState["onEnter"];
185
+ onLeave: SMState["onLeave"];
186
+ transitions: Map<string, SMTransition>;
187
+ }): this;
188
+ /**
189
+ * Define a transition between 2 states in the state machine.
190
+ * @since 0.14.0
191
+ * @param from The name of the state this transition would come from.
192
+ * @param event The event that can trigger this transition.
193
+ * @param to The name of the state this transition would go to.
194
+ * @param cb A callback to run when this transition occurs.
195
+ */
196
+ defineTransition(from: string, event: string, to: string, cb?: (...args: any[]) => unknown): this;
197
+ /**
198
+ * Define a transition from every state to another state in the state machine.
199
+ * @since 0.14.0
200
+ * @param event The event that can trigger this transition.
201
+ * @param to The name of the state this transition would go to.
202
+ */
203
+ defineUniversalTransition(event: string, to: string): this;
204
+ /**
205
+ * Finalize the state machine, making its states and transitions now readonly and usable.
206
+ * @since 0.14.0
207
+ */
208
+ freeze(): void;
209
+ /**
210
+ * Trigger an event to do a transition from the current state to another as defined previously.
211
+ *
212
+ * Will throw an Error if there is no transition from the current state to another based off the event.
213
+ * @since 0.14.0
214
+ * @param event The event that occured.
215
+ * @param args Arguments to pass to the callback of the transition's onTransition functions if any.
216
+ */
217
+ doTransition(event: string, ...args: any[]): void;
218
+ /**
219
+ * Trigger an event to do a transition from the current state to another as defined previously at a later point in time.
220
+ *
221
+ * Will throw an Error if there is no transition from the current state to another based off the event.
222
+ * @since 0.14.0
223
+ * @param event The event that occured.
224
+ * @param delayMs The time in milliseconds this transition will run in.
225
+ * @param args Arguments to pass to the callback of the transition's onTransition functions if any.
226
+ */
227
+ doTransitionLater(event: string, delayMs: number, ...args: Array<any>): void;
228
+ /**
229
+ * Print debug info about this state machine to stdout in the form of a table.
230
+ * @since 0.14.0
231
+ */
232
+ debug(): void;
233
+ }
133
234
 
134
235
  /**
135
236
  * Helper Class for simplifying the websocket connection to Discord.
136
237
  * @since 0.1.4
137
238
  */
138
- declare class BetterWs extends EventEmitter<BWSEvents> {
239
+ declare class BetterWs extends EventEmitter$1<BWSEvents> {
139
240
  address: string;
140
241
  options: Omit<IClientWSOptions, "encoding"> & {
141
242
  encoding?: IClientWSOptions["encoding"] | "other";
@@ -144,23 +245,24 @@ declare class BetterWs extends EventEmitter<BWSEvents> {
144
245
  encoding: "etf" | "json" | "other";
145
246
  /** If the messages sent/received are compressed with zlib. */
146
247
  compress: boolean;
248
+ /** How much to delay repeated calls to `connect()`. */
249
+ connectThrottle: number;
250
+ /** Tracks the state this WebSocket is in and what operations are allowed. */
251
+ sm: StateMachine;
147
252
  /** The raw net.Socket retreived from upgrading the connection or null if not upgraded/closed. */
148
253
  private _socket;
149
- /** Internal properties that need a funny way to be referenced. */
150
- _internal: {
151
- /** A promise that resolves when the connection is fully closed or null if not closing the connection if any. */
152
- closePromise: Promise<void> | null;
153
- /** A timer when the socket is half closing where the server MUST close it OR ELSE */
154
- closeTimer: NodeJS.Timeout | null;
155
- /** A zlib Inflate instance if messages sent/received are going to be compressed. Auto created on connect. */
156
- zlib: Inflate | null;
157
- };
158
254
  /** If a request is going through to initiate a WebSocket connection and hasn't been upgraded by the server yet. */
159
- private _connecting;
160
255
  /** Code received from frame op 8 */
161
256
  private _lastCloseCode;
162
257
  /** Reason received from frame op 8 */
163
258
  private _lastCloseReason;
259
+ /** A promise that resolves when the connection is fully closed or null if not closing the connection if any. */
260
+ private _closePromise;
261
+ private _closeResolver;
262
+ /** A zlib Inflate instance if messages sent/received are going to be compressed. Auto created on connect. */
263
+ private _zlib;
264
+ /** Stores when the last connection attempt was made, in order to limit reconnection loops. */
265
+ private lastConnectAttempt;
164
266
  /**
165
267
  * Creates a new lightweight WebSocket.
166
268
  * @param address The http(s):// or ws(s):// URL cooresponding to the server to connect to.
@@ -170,29 +272,26 @@ declare class BetterWs extends EventEmitter<BWSEvents> {
170
272
  encoding?: IClientWSOptions["encoding"] | "other";
171
273
  });
172
274
  /**
173
- * The state this WebSocket is in. 1 is connected, 2 is connecting, 3 is closing, and 4 is closed.
275
+ * Connects to the server.
276
+ * @since 0.5.0
174
277
  */
175
- get status(): 1 | 2 | 3 | 4;
278
+ connect(): void;
176
279
  /**
177
- * Initiates a WebSocket connection to the server.
178
- * @since 0.4.1
280
+ * Sends a message to the server.
281
+ * @since 0.1.4
282
+ * @param data What to send to the server.
283
+ * @returns A Promise that resolves when the message passes the bucket queue(s) and is written to the socket's Buffer to send.
179
284
  */
180
- connect(): Promise<void>;
285
+ sendMessage(data: any): void;
181
286
  /**
182
287
  * Disconnects from the server.
288
+ * This can only be called when connected (returns a promise) or half-close (returns the same promise)
183
289
  * @since 0.1.4
184
290
  * @param code The close code.
185
291
  * @param reason The reason for closing if any.
186
292
  * @returns A Promise that resolves when the connection is fully closed.
187
293
  */
188
294
  close(code: number, reason?: string): Promise<void>;
189
- /**
190
- * Sends a message to the server.
191
- * @since 0.1.4
192
- * @param data What to send to the server.
193
- * @returns A Promise that resolves when the message passes the bucket queue(s) and is written to the socket's Buffer to send.
194
- */
195
- sendMessage(data: any): void;
196
295
  /**
197
296
  * Method to raw write messages to the server.
198
297
  * @since 0.4.1
@@ -200,30 +299,9 @@ declare class BetterWs extends EventEmitter<BWSEvents> {
200
299
  * @param opcode WebSocket spec op code.
201
300
  */
202
301
  private _write;
203
- /**
204
- * Handler for when requests from connect are upgraded to WebSockets.
205
- * @param key The sec key from connect.
206
- * @param req The HTTP request from connect.
207
- * @param resolve Promise resolver from connect.
208
- * @param reject Promise rejector from connect.
209
- * @param res The HTTP response from the server from connect.
210
- * @param socket The raw socket from upgrading the request from connect.
211
- */
212
- private _onUpgrade;
213
- /**
214
- * Handler for when the raw socket to the server encounters an error.
215
- * @since 0.4.1
216
- * @param error What happened.
217
- */
218
- private _onError;
219
- /**
220
- * Handler for when the raw socket is fully closed and cleans up this WebSocket.
221
- * @since 0.4.1
222
- */
223
- private _onClose;
224
302
  /**
225
303
  * Handler for when there is data in the socket's Buffer to read.
226
- * @since 0.4.1
304
+ * @since 0.3.1
227
305
  */
228
306
  private _onReadable;
229
307
  /**
@@ -241,9 +319,9 @@ declare class BetterWs extends EventEmitter<BWSEvents> {
241
319
  * This class is automatically instantiated by the library and is documented for reference.
242
320
  * @since 0.1.4
243
321
  */
244
- declare class DiscordConnector extends EventEmitter<ConnectorEvents> {
322
+ declare class DiscordConnector extends EventEmitter$1<ConnectorEvents> {
245
323
  id: number;
246
- client: EventEmitter<ClientEvents> & {
324
+ client: EventEmitter$1<ClientEvents> & {
247
325
  options: Omit<IClientOptions, "snowtransferInstance"> & {
248
326
  token: string;
249
327
  endpoint?: string;
@@ -281,10 +359,10 @@ declare class DiscordConnector extends EventEmitter<ConnectorEvents> {
281
359
  wsBucket: LocalBucket;
282
360
  /** 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. */
283
361
  presenceBucket: LocalBucket;
362
+ /** The ratelimit bucket for when requesting all guild members from a guild. Is still affected by the overall packet send bucket. */
363
+ membersBucket: LocalBucket;
284
364
  /** If this connector is waiting to be fully closed */
285
365
  private _closing;
286
- /** If the disconnect method on this class was called and the connect method hasn't been called yet */
287
- private _closeCalled;
288
366
  /** A Timeout that, when triggered, closes the connection because op HELLO hasn't been received and may never be received */
289
367
  private _openToHeartbeatTimeout;
290
368
  /** A Timeout that, when triggered, sends the first heartbeat */
@@ -294,7 +372,7 @@ declare class DiscordConnector extends EventEmitter<ConnectorEvents> {
294
372
  * @param id id of the shard that created this class.
295
373
  * @param client Main client instance.
296
374
  */
297
- constructor(id: number, client: EventEmitter<ClientEvents> & {
375
+ constructor(id: number, client: EventEmitter$1<ClientEvents> & {
298
376
  options: Omit<IClientOptions, "snowtransferInstance"> & {
299
377
  token: string;
300
378
  endpoint?: string;
@@ -424,9 +502,9 @@ declare class DiscordConnector extends EventEmitter<ConnectorEvents> {
424
502
  * This class is automatically instantiated by the library and is documented for reference.
425
503
  * @since 0.1.4
426
504
  */
427
- declare class Shard extends EventEmitter<ShardEvents> {
505
+ declare class Shard extends EventEmitter$1<ShardEvents> {
428
506
  id: number;
429
- client: EventEmitter<ClientEvents> & {
507
+ client: EventEmitter$1<ClientEvents> & {
430
508
  options: Omit<IClientOptions, "snowtransferInstance"> & {
431
509
  token: string;
432
510
  endpoint?: string;
@@ -441,7 +519,7 @@ declare class Shard extends EventEmitter<ShardEvents> {
441
519
  * @param id id of the shard.
442
520
  * @param client Main class used for forwarding events.
443
521
  */
444
- constructor(id: number, client: EventEmitter<ClientEvents> & {
522
+ constructor(id: number, client: EventEmitter$1<ClientEvents> & {
445
523
  options: Omit<IClientOptions, "snowtransferInstance"> & {
446
524
  token: string;
447
525
  endpoint?: string;
@@ -449,6 +527,7 @@ declare class Shard extends EventEmitter<ShardEvents> {
449
527
  });
450
528
  /**
451
529
  * Time in ms it took for Discord to ackknowledge an OP 1 HEARTBEAT.
530
+ * @since 0.3.0
452
531
  */
453
532
  get latency(): number;
454
533
  /**
@@ -488,7 +567,7 @@ declare class Shard extends EventEmitter<ShardEvents> {
488
567
  * @since 0.1.4
489
568
  */
490
569
  declare class ShardManager {
491
- client: EventEmitter<ClientEvents> & {
570
+ client: EventEmitter$1<ClientEvents> & {
492
571
  options: Omit<IClientOptions, "snowtransferInstance"> & {
493
572
  token: string;
494
573
  endpoint?: string;
@@ -505,7 +584,7 @@ declare class ShardManager {
505
584
  /**
506
585
  * Create a new ShardManager.
507
586
  */
508
- constructor(client: EventEmitter<ClientEvents> & {
587
+ constructor(client: EventEmitter$1<ClientEvents> & {
509
588
  options: Omit<IClientOptions, "snowtransferInstance"> & {
510
589
  token: string;
511
590
  endpoint?: string;
@@ -570,7 +649,7 @@ declare class ShardManager {
570
649
  * Main class used for receiving events and interacting with the Discord gateway.
571
650
  * @since 0.1.4
572
651
  */
573
- declare class Client extends EventEmitter<ClientEvents> {
652
+ declare class Client extends EventEmitter$1<ClientEvents> {
574
653
  /** The Discord auth token to connect with. */
575
654
  token: string;
576
655
  /** User specific options filled in with defaults if not specified. */
@@ -757,4 +836,4 @@ declare const Constants: {
757
836
  GATEWAY_VERSION: 10;
758
837
  };
759
838
 
760
- export { type BWSEvents, BetterWs, Client, type ClientEvents, type ConnectorEvents, Constants, DiscordConnector, type IClientOptions, type IClientWSOptions, type IGatewayDispatch, type IGatewayMessage, _default as Intents, Shard, type ShardEvents, ShardManager };
839
+ export { type BWSEvents, BetterWs, Client, type ClientEvents, type ConnectorEvents, Constants, DiscordConnector, type IClientOptions, type IClientWSOptions, type IGatewayDispatch, type IGatewayMessage, _default as Intents, type SMHistory, type SMState, type SMTransition, Shard, type ShardEvents, ShardManager, StateMachine };
package/dist/index.js CHANGED
@@ -6,7 +6,13 @@ var zlib = require('zlib');
6
6
  var snowtransfer = require('snowtransfer');
7
7
  var v10 = require('discord-api-types/v10');
8
8
 
9
- var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty;var __require=(x=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(x,{get:(a,b)=>(typeof require<"u"?require:a)[b]}):x)(function(x){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+x+'" is not supported')});var __esm=(fn,res)=>function(){return fn&&(res=(0, fn[__getOwnPropNames(fn)[0]])(fn=0)),res};var __commonJS=(cb,mod)=>function(){return mod||(0, cb[__getOwnPropNames(cb)[0]])((mod={exports:{}}).exports,mod),mod.exports};var __export=(target,all2)=>{for(var name in all2)__defProp(target,name,{get:all2[name],enumerable:true});},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to};var __toESM=(mod,isNodeMode,target)=>(target=mod!=null?__create(__getProtoOf(mod)):{},__copyProps(!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:true}):target,mod)),__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:true}),mod);var require_Constants=__commonJS({"src/Constants.ts"(exports,module){var Constants2={GATEWAY_OP_CODES:{DISPATCH:0,HEARTBEAT:1,IDENTIFY:2,PRESENCE_UPDATE:3,VOICE_STATE_UPDATE:4,RESUME:6,RECONNECT:7,REQUEST_GUILD_MEMBERS:8,INVALID_SESSION:9,HELLO:10,HEARTBEAT_ACK:11},GATEWAY_VERSION:10};module.exports=Constants2;}});var require_BetterWs=__commonJS({"src/BetterWs.ts"(exports,module){var https=__require("https"),http=__require("http"),util=__require("util");function eventSwitch(emitter,cbs){let realListeners=new Map;return Promise.race(Object.entries(cbs).map(([event,cb])=>new Promise((resolve2,reject)=>{let l=(...args)=>(async()=>cb(...args))().then(resolve2,reject);realListeners.set(event,l),emitter.once(event,l);}))).finally(()=>{for(let[event,l]of realListeners.entries())emitter.removeListener(event,l);})}var BetterWs=class extends events.EventEmitter{constructor(address,options){super();this.address=address;this.options=options;this._socket=null;this._internal={closePromise:null,closeTimer:null,zlib:null};this._connecting=false;this._lastCloseCode=null;this._lastCloseReason=null;this.encoding=options.encoding??"other",this.compress=options.compress??false;}get status(){let internal=this._internal;return this._connecting?2:internal.closePromise?3:this._socket?1:4}connect(){if(this._socket||this._connecting)return Promise.resolve(void 0);this._connecting=true;let key=crypto.randomBytes(16).toString("base64"),url=new URL(this.address),useHTTPS=url.protocol==="https:"||url.protocol==="wss:"||url.port==="443",port=url.port||(useHTTPS?"443":"80"),req=(useHTTPS?https:http).request({hostname:url.hostname,path:`${url.pathname}${url.search}`,port,headers:{Connection:"Upgrade",Upgrade:"websocket","Sec-WebSocket-Key":key,"Sec-WebSocket-Version":"13",...this.options.headers}});req.end(),this.emit("debug","Socket sending request to upgrade");let destroyReq=()=>{req.destroy(),req.socket&&!req.socket.destroyed&&req.socket.destroy(),this._internal.closePromise=this._socket=null;};return eventSwitch(req,{upgrade:(res,socket)=>{try{this._onUpgrade(key,res,socket);}catch(e){throw destroyReq(),e}},error:e=>{throw e},response:res=>{throw destroyReq(),new Error(`Expected HTTP 101 Upgrade, but got ${res.statusCode} ${res.statusMessage}`)}}).finally(()=>{this._connecting=false;})}async close(code,reason){this.emit("debug","Socket attempting to close");let internal=this._internal;if(internal.closePromise)return internal.closePromise;if(!this._socket)return Promise.resolve(void 0);let resolver,promise=new Promise(resolve2=>{resolver=resolve2;let from=Buffer.from([code>>8,code&255]);this._write(reason?Buffer.concat([from,Buffer.from(reason)]):from,8),this.emit("debug","Socket wrote fin packet");}).then(()=>{internal.closePromise=null;});return promise.resolve=resolver,internal.closePromise=promise,internal.closeTimer&&clearTimeout(internal.closeTimer),internal.closeTimer=setTimeout(()=>{this.emit("debug","Server didn't respond for a full close in time"),this._onClose();},5e3),promise}sendMessage(data){this.encoding==="json"?this._write(Buffer.from(JSON.stringify(data)),1):this.encoding==="etf"?this._write(writeETF(data),2):this.encoding==="other"&&this._write(Buffer.from(data),2),this.emit("ws_send",data);}_write(packet,opcode){let socket=this._socket;if(!(socket!=null&&socket.writable))return;let length=packet.length,frame;length<126?(frame=Buffer.allocUnsafe(6+length),frame[1]=128+length):length<65536?(frame=Buffer.allocUnsafe(8+length),frame[1]=254,frame[2]=length>>8,frame[3]=length&255):(frame=Buffer.allocUnsafe(14+length),frame[1]=255,frame.writeBigUInt64BE(BigInt(length),2)),frame[0]=128+opcode,frame.writeUInt32BE(0,frame.length-length-4),frame.set(packet,frame.length-length),socket.write(frame);}_onUpgrade(key,res,socket){let hash=crypto.createHash("sha1").update(key+"258EAFA5-E914-47DA-95CA-C5AB0DC85B11").digest("base64"),accept=res.headers["sec-websocket-accept"];if(hash!==accept)throw socket.end(()=>{this.emit("error","Failed websocket-key validation");}),new Error(`Invalid Sec-Websocket-Accept | expected: ${hash} | received: ${accept}`);if(socket.once("error",this._onError.bind(this)),socket.once("close",this._onClose.bind(this)),socket.on("readable",this._onReadable.bind(this)),this._socket=socket,this.compress){let z=zlib.createInflate();z._c=z.close,z._h=z._handle,z._hc=z._handle.close,z._v=()=>{},this._internal.zlib=z;}this.emit("ws_open");}_onError(error){this._socket&&(this.emit("error",util.inspect(error,true,1,false)),this._write(Buffer.allocUnsafe(0),8));}_onClose(){this._internal.closeTimer&&clearTimeout(this._internal.closeTimer),this._internal.closeTimer=null;let socket=this._socket,internal=this._internal;this.emit("debug","Socket _onClose called"),socket&&(socket.removeListener("data",this._onReadable),socket.removeListener("error",this._onError),this._socket=null,internal.closePromise?(internal.closePromise.resolve(void 0),this.emit("debug","Socket closePromise resolved")):this.emit("debug","Socket didn't have a closePromise to resolve"),internal.zlib&&(internal.zlib.close(),internal.zlib=null),this.emit("ws_close",this._lastCloseCode??1006,this._lastCloseReason??"Abnormal Closure"),this._lastCloseCode=null,this._lastCloseReason=null);}_onReadable(){let socket=this._socket;for(;((socket==null?void 0:socket.readableLength)??0)>1;){let length=readRange(socket,1,1)&127,bytes=0;if(length>125){if(bytes=length===126?2:8,socket.readableLength<2+bytes)return;length=readRange(socket,2,bytes);}let frame=socket.read(2+bytes+length);if(!frame)return;let fin=frame[0]>>7,opcode=frame[0]&15;(fin!==1||opcode===0)&&this.emit("error","discord actually does send messages with fin=0. if you see this error let me know");let payload=frame.subarray(2+bytes);this._processFrame(opcode,payload);}}_processFrame(opcode,message){let internal=this._internal;switch(opcode){case 1:{let packet;this.encoding==="json"?packet=JSON.parse(message.toString()):this.encoding==="other"&&(packet=message),this.emit("ws_receive",packet);break}case 2:{let packet;if(this.compress){let z=internal.zlib,error=null,data=null;z.close=z._handle.close=z._v;try{data=z._processChunk(message,zlib.constants.Z_SYNC_FLUSH);}catch(e){error=e;}let l=message.length;if((message[l-4]!==0||message[l-3]!==0||message[l-2]!==255||message[l-1]!==255)&&this.emit("error","discord actually does send fragmented zlib messages. If you see this error let me know"),z.close=z._c,z._handle=z._h,z._handle.close=z._hc,z._events.error=void 0,z._eventCount--,z.removeAllListeners("error"),error){this.emit("error","Zlib error processing chunk"),this._write(Buffer.allocUnsafe(0),8);return}if(!data){this.emit("error","Data from zlib processing was null. If you see this error let me know");return}this.encoding==="json"?packet=JSON.parse(String(data)):this.encoding==="etf"?packet=readETF(data,1):this.encoding==="other"&&(packet=data);}else this.encoding==="json"?packet=JSON.parse(zlib.inflateSync(message).toString()):this.encoding==="etf"?packet=readETF(message,1):this.encoding==="other"&&(packet=message);this.emit("ws_receive",packet);break}case 8:{this._lastCloseCode=message.length>1?(message[0]<<8)+message[1]:0,this._lastCloseReason=message.length>2?message.subarray(2).toString():"",this._write(Buffer.from([this._lastCloseCode>>8,this._lastCloseCode&255]),8);break}case 9:{this._write(message,10);break}}}};function readRange(socket,index,bytes){let cursor=0,read=0,num=0,readable=socket._readableState,currentBufferIndex=readable.bufferIndex,currentBuffer=readable.buffer.head??readable.buffer[currentBufferIndex];do{let data=currentBuffer.data??currentBuffer;for(let element of data)if(++cursor>index&&(num*=256,num+=element,++read===bytes))return num}while(currentBuffer=currentBuffer.next??readable.buffer[++currentBufferIndex]);throw new Error("readRange failed?")}function readETF(data,start){let view,x=start,loop=()=>{let type=data[x++];switch(type){case 70:{let float=data.readDoubleBE(x);return x+=8,float}case 97:return data[x++];case 98:{let int=data.readInt32BE(x);return x+=4,int}case 100:{let length=data.readUInt16BE(x),atom="";if(length>30)atom=data.latin1Slice(x+=2,x+length);else for(let i=x+=2;i<x+length;i++)atom+=String.fromCharCode(data[i]);return x+=length,atom?atom==="nil"||atom==="null"?null:atom==="true"?true:atom==="false"?false:atom:void 0}case 108:case 106:{let array=[];if(type===108){let length=data.readUInt32BE(x);x+=4;for(let i=0;i<length;i++)array.push(loop());x++;}return array}case 107:{let array=[],length=data.readUInt16BE(x);x+=2;for(let i=0;i<length;i++)array.push(data[x++]);return array}case 109:{let length=data.readUInt32BE(x),str="";if(length>30)str=data.utf8Slice(x+=4,x+length);else {let i=x+=4,l=x+length;for(;i<l;){let byte=data[i++];byte<128?str+=String.fromCharCode(byte):byte<224?str+=String.fromCharCode(((byte&31)<<6)+(data[i++]&63)):byte<240?str+=String.fromCharCode(((byte&15)<<12)+((data[i++]&63)<<6)+(data[i++]&63)):str+=String.fromCodePoint(((byte&7)<<18)+((data[i++]&63)<<12)+((data[i++]&63)<<6)+(data[i++]&63));}}return x+=length,str}case 110:{view||(view=new DataView(data.buffer,data.offset,data.byteLength));let length=data[x++],sign=data[x++],left=length,num=BigInt(0);for(;left>0;)left>=8?(num<<=BigInt(64),num+=view.getBigUint64(x+(left-=8),true)):left>=4?(num<<=BigInt(32),num+=BigInt(view.getUint32(x+(left-=4)),true)):left>=2?(num<<=BigInt(16),num+=BigInt(view.getUint16(x+(left-=2)),true)):(num<<=BigInt(8),num+=BigInt(data[x]),left--);return x+=length,(sign?-num:num).toString()}case 116:{let obj={},length=data.readUInt32BE(x);x+=4;for(let i=0;i<length;i++){let key=loop();obj[key]=loop();}return obj}}throw new Error(`Missing etf type: ${type}`)};return loop()}function writeETF(data){let b=Buffer.allocUnsafe(4096);b[0]=131;let i=1,loop=obj=>{switch(typeof obj){case "boolean":{b[i++]=100,obj?(b.writeUInt16BE(4,i),b.latin1Write("true",i+=2),i+=4):(b.writeUInt16BE(5,i),b.latin1Write("false",i+=2),i+=5);break}case "string":{let length=Buffer.byteLength(obj);b[i++]=109,b.writeUInt32BE(length,i),b.utf8Write(obj,i+=4),i+=length;break}case "number":{if(Number.isInteger(obj)){let abs=Math.abs(obj);if(abs<2147483648)b[i++]=98,b.writeInt32BE(obj,i),i+=4;else if(abs<Number.MAX_SAFE_INTEGER){b[i++]=110,b[i++]=8,b[i++]=+(obj<0),b.writeBigUInt64LE(BigInt(abs),i),i+=8;break}else b[i++]=70,b.writeDoubleBE(obj,i),i+=8;}else b[i++]=70,b.writeDoubleBE(obj,i),i+=8;break}case "bigint":{b[i++]=110,b[i++]=8,b[i++]=+(obj<0),b.writeBigUInt64LE(obj,i),i+=8;break}case "object":{if(obj===null)b[i++]=100,b.writeUInt16BE(3,i),b.latin1Write("nil",i+=2),i+=3;else if(Array.isArray(obj)){if(obj.length){b[i++]=108,b.writeUInt32BE(obj.length,i),i+=4;for(let item of obj)loop(item);}b[i++]=106;}else {let entries=Object.entries(obj).filter(x=>typeof x[1]<"u");b[i++]=116,b.writeUInt32BE(entries.length,i),i+=4;for(let[key,value]of entries)loop(key),loop(value);}break}}};return loop(data),Buffer.from(b.subarray(0,i))}module.exports=BetterWs;}});var Intents_exports={};__export(Intents_exports,{all:()=>all,default:()=>Intents_default,flags:()=>flags,non_privileged:()=>non_privileged,privileged:()=>privileged,resolve:()=>resolve});function resolve(bit=0){if(typeof bit=="number"&&bit>=0)return bit;if(typeof bit=="string"&&flags[bit])return flags[bit]|0;if(Array.isArray(bit))return bit.map(p=>resolve(p)).reduce((prev,p)=>prev|p,0);throw new RangeError("BITFIELD_INVALID")}var flags,privileged,all,non_privileged,Intents_default,init_Intents=__esm({"src/Intents.ts"(){flags={GUILDS:1,GUILD_MEMBERS:2,GUILD_MODERATION:4,GUILD_EMOJIS_AND_STICKERS:8,GUILD_INTEGRATIONS:16,GUILD_WEBHOOKS:32,GUILD_INVITES:64,GUILD_VOICE_STATES:128,GUILD_PRESENCES:256,GUILD_MESSAGES:512,GUILD_MESSAGE_REACTIONS:1024,GUILD_MESSAGE_TYPING:2048,DIRECT_MESSAGES:4096,DIRECT_MESSAGE_REACTIONS:8192,DIRECT_MESSAGE_TYPING:16384,MESSAGE_CONTENT:32768,GUILD_SCHEDULED_EVENTS:65536,AUTO_MODERATION_CONFIGURATION:1048576,AUTO_MODERATION_EXECUTION:2097152,GUILD_MESSAGE_POLLS:16777216,DIRECT_MESSAGE_POLLS:33554432},privileged=flags.GUILD_MEMBERS|flags.GUILD_PRESENCES|flags.MESSAGE_CONTENT,all=Object.values(flags).reduce((acc,p)=>acc|p,0),non_privileged=all&~privileged;Intents_default={flags,privileged,all,non_privileged,resolve};}});var require_DiscordConnector=__commonJS({"src/DiscordConnector.ts"(exports,module){var import_Constants=__toESM(require_Constants()),BetterWs=require_BetterWs(),Intents2=(init_Intents(),__toCommonJS(Intents_exports)),resumableCodes=[4008,4005,4003,4002,4001,4e3,1006,1001],shouldntAttemptReconnectCodes=[4014,4013,4012,4011,4010,4004],disconnectMessages={4014:"Disallowed Intents, check your client options and application page.",4013:"Invalid Intents data, check your client options.",4012:"Invalid API version.",4011:"Shard would be on over 2500 guilds. Add more shards.",4010:"Invalid sharding data, check your client options.",4009:"Session timed out.",4008:"You are being rate limited. Wait before sending more packets.",4007:"Invalid sequence. Reconnecting and starting a new session.",4005:"You sent more than one OP 2 IDENTIFY payload while the websocket was open.",4004:"Tried to connect with an invalid token.",4003:"You tried to send a packet before sending an OP 2 IDENTIFY or OP 6 RESUME.",4002:"You sent an invalid payload.",4001:"You sent an invalid opcode or invalid payload for an opcode."},wsStatusTypes=["Whatever 0 is. Report if you see this","connected","connecting","closing","closed"],DiscordConnector=class extends events.EventEmitter{constructor(id,client){super();this.id=id;this.client=client;this.heartbeatTimeout=null;this.heartbeatInterval=0;this._trace=null;this.seq=0;this.status="disconnected";this.sessionId=null;this.lastACKAt=0;this.lastHeartbeatSend=0;this.latency=0;this.resumeAddress=null;this.reconnecting=false;this.wsBucket=new snowtransfer.LocalBucket(120,6e4);this.presenceBucket=new snowtransfer.LocalBucket(5,6e4);this._closing=false;this._closeCalled=false;this._openToHeartbeatTimeout=null;this._initialHeartbeatTimeout=null;this.options=client.options,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("debug",`Shard ${this.id} ${event}`)),this.betterWs.on("error",event=>this.client.emit("error",event)),this.betterWs.on("ws_send",data=>this.client.emit("rawSend",data)),this.wsBucket.queue.setBlocked(true),this.presenceBucket.queue.setBlocked(true);}async connect(){return this._closing=false,this._closeCalled=false,this.client.emit("debug",`Shard ${this.id} connecting to gateway`),this.betterWs.connect().catch(()=>{setTimeout(()=>{this._closeCalled||this.connect();},5e3);})}async disconnect(){return this._closing=true,this._closeCalled=true,this.wsBucket.queue.setBlocked(true),this.presenceBucket.queue.setBlocked(true),this.betterWs.close(1e3,"Disconnected by User")}async messageAction(message){this.client.emit("rawReceive",message);let withShardID=Object.assign(message,{shard_id:this.id});switch(this.client.emit("event",withShardID),withShardID.op){case import_Constants.GATEWAY_OP_CODES.DISPATCH:this.handleDispatch(withShardID);break;case import_Constants.GATEWAY_OP_CODES.HEARTBEAT:this.heartbeat();break;case import_Constants.GATEWAY_OP_CODES.RECONNECT:this.client.emit("debug",`Gateway asked shard ${this.id} to reconnect`),this._reconnect(true);break;case import_Constants.GATEWAY_OP_CODES.INVALID_SESSION:this.client.emit("debug",`Shard ${this.id}'s session was invalidated`),withShardID.d&&this.sessionId?this.resume():(this.seq=0,this.sessionId="",this.emit("queueIdentify",this.id));break;case import_Constants.GATEWAY_OP_CODES.HELLO: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.sessionId)return void this.resume();this.emit("queueIdentify",this.id);break;case import_Constants.GATEWAY_OP_CODES.HEARTBEAT_ACK:this.lastACKAt=Date.now(),this.latency=this.lastACKAt-this.lastHeartbeatSend;break;}}async _reconnect(resume=false){this.reconnecting=resume,this.wsBucket.queue.setBlocked(true),this.presenceBucket.queue.setBlocked(true),await this.betterWs.close(resume?4e3:1012,"reconnecting"),resume?(this.clearHeartBeat(),this.resumeAddress?this.betterWs.address=this.resumeAddress:this.betterWs.address=this.identifyAddress):(this.reset(),this.betterWs.address=this.identifyAddress);}reset(){this.sessionId=null,this.seq=0,this.lastACKAt=0,this._trace=null,this.clearHeartBeat();}setHeartBeat(){this.heartbeatTimeout=setInterval(()=>{this.lastACKAt<=Date.now()-(this.heartbeatInterval+5e3)?(this.client.emit("debug",`Shard ${this.id} has not received a heartbeat ACK in ${this.heartbeatInterval+5e3}ms.`),this._reconnect(true)):this.heartbeat();},this.heartbeatInterval);}clearHeartBeat(){this.heartbeatTimeout&&clearInterval(this.heartbeatTimeout),this._initialHeartbeatTimeout&&clearTimeout(this._initialHeartbeatTimeout),this.heartbeatTimeout=null,this._initialHeartbeatTimeout=null,this.heartbeatInterval=0;}async identify(){if(this.betterWs.status!==1)return this.client.emit("error",`Shard ${this.id} was attempting to identify when the ws was not open. Was ${wsStatusTypes[this.betterWs.status]}`),this._reconnect(true);this.client.emit("debug",`Shard ${this.id} is identifying`),this.status="identifying",this.emit("stateChange","identifying");let data={op:import_Constants.GATEWAY_OP_CODES.IDENTIFY,d:{token:this.options.token,properties:{os:process.platform,browser:"CloudStorm",device:"CloudStorm"},large_threshold:this.options.largeGuildThreshold,shard:[this.id,this.options.totalShards??1],intents:this.options.intents?Intents2.resolve(this.options.intents):0}};return this.options.initialPresence&&(data.d.presence=this._checkPresenceData(this.options.initialPresence)),this.betterWs.sendMessage(data)}async resume(){return this.betterWs.status!==1?(this.client.emit("error",`Shard ${this.id} was attempting to resume when the ws was not open. Was ${wsStatusTypes[this.betterWs.status]}`),this._reconnect(true)):(this.client.emit("debug",`Shard ${this.id} is resuming`),this.status="resuming",this.emit("stateChange","resuming"),this.betterWs.sendMessage({op:import_Constants.GATEWAY_OP_CODES.RESUME,d:{seq:this.seq,token:this.options.token,session_id:this.sessionId}}))}heartbeat(){if(this.betterWs.status!==1)return this.client.emit("error",`Shard ${this.id} was attempting to heartbeat when the ws was not open. Was ${wsStatusTypes[this.betterWs.status]}`),void this._reconnect(true);this.betterWs.sendMessage({op:import_Constants.GATEWAY_OP_CODES.HEARTBEAT,d:this.seq===0?null:this.seq}),this.lastHeartbeatSend=Date.now(),this._initialHeartbeatTimeout&&(clearTimeout(this._initialHeartbeatTimeout),this._initialHeartbeatTimeout=null),this.heartbeatTimeout||this.setHeartBeat();}handleDispatch(message){var _a,_b;switch(this.client.emit("dispatch",message),message.s&&(message.s>this.seq+1&&(this.client.emit("debug",`Shard ${this.id} invalid sequence: { current: ${this.seq} message: ${message.s} }`),this.seq=message.s,this.resume()),this.seq=message.s),message.t){case "READY":case "RESUMED":message.t==="READY"&&(message.d.resume_gateway_url&&(this.resumeAddress=`${message.d.resume_gateway_url}?v=${import_Constants.GATEWAY_VERSION}&encoding=${((_a=this.options.ws)==null?void 0:_a.encoding)==="etf"?"etf":"json"}${(_b=this.options.ws)!=null&&_b.compress?"&compress=zlib-stream":""}`),this.sessionId=message.d.session_id),this.status="ready",this.emit("stateChange","ready"),this._trace=message.d._trace,this.emit("ready",message.t==="RESUMED"),this.wsBucket.queue.setBlocked(false),this.presenceBucket.queue.setBlocked(false);break;}}handleWsClose(code,reason){let gracefulClose=false;this.status="disconnected",this.emit("stateChange","disconnected"),this.clearHeartBeat(),this.wsBucket.queue.setBlocked(true),this.presenceBucket.queue.setBlocked(true);let isManualClose=code===1e3&&this._closing,message=disconnectMessages[code],isRecoverable=resumableCodes.includes(code),shouldntReconnect=shouldntAttemptReconnectCodes.includes(code)||isManualClose;isRecoverable&&this.resumeAddress?this.betterWs.address=this.resumeAddress:this.betterWs.address=this.identifyAddress,message&&this.client.emit("error",message),(isManualClose||this.reconnecting)&&(gracefulClose=true),this._closing=false,this.emit("disconnect",code,reason,gracefulClose),shouldntReconnect||this.connect();}async presenceUpdate(data){return this.sendMessage({op:import_Constants.GATEWAY_OP_CODES.PRESENCE_UPDATE,d:this._checkPresenceData(data)})}async voiceStateUpdate(data){return data?this.sendMessage({op:import_Constants.GATEWAY_OP_CODES.VOICE_STATE_UPDATE,d:this._checkVoiceStateUpdateData(data)}):Promise.resolve()}async requestGuildMembers(data){return this.sendMessage({op:import_Constants.GATEWAY_OP_CODES.REQUEST_GUILD_MEMBERS,d:this._checkRequestGuildMembersData(data)})}async sendMessage(data){let presence=data.op===import_Constants.GATEWAY_OP_CODES.PRESENCE_UPDATE,bypass=this.options.ws.bypassBuckets;return new Promise(res=>{let sendMsg=()=>{let fn=()=>{this.betterWs.sendMessage(data),res(void 0);};bypass?fn():this.wsBucket.enqueue(fn);};presence&&!bypass?this.presenceBucket.enqueue(sendMsg):sendMsg();})}_checkPresenceData(data){if(data.status=data.status??v10.PresenceUpdateStatus.Online,data.activities=data.activities&&Array.isArray(data.activities)?data.activities:[],data.activities)for(let activity of data.activities){let index=data.activities.indexOf(activity);activity.type===void 0&&(activity.type=activity.url?1:0),activity.name||(activity.state&&activity.type===4?activity.name="Custom Status":data.activities.splice(index,1));}return data.afk=data.afk??false,data.since=data.since??Date.now(),data}_checkVoiceStateUpdateData(data){return data.channel_id=data.channel_id??null,data.self_mute=data.self_mute??false,data.self_deaf=data.self_deaf??false,data}_checkRequestGuildMembersData(data){let withQuery=data,withUserIDs=data;return !withQuery.query&&!withUserIDs.user_ids&&(withQuery.query=""),withQuery.query&&withUserIDs.user_ids&&delete data.query,data.limit=data.limit??10,data}};module.exports=DiscordConnector;}});var require_Shard=__commonJS({"src/Shard.ts"(exports,module){var DC=require_DiscordConnector(),Shard=class extends events.EventEmitter{constructor(id,client){super();this.id=id;this.client=client;this.ready=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)}};module.exports=Shard;}});var require_ShardManager=__commonJS({"src/ShardManager.ts"(exports,module){var Shard=require_Shard(),ShardManager=class{constructor(client){this.client=client;this.shards={};this.identifyBucket=new snowtransfer.LocalBucket(1e3,1e3*60*60*24);this.concurrencyBuckets={};this.options=client.options;}spawn(){if(!Object.keys(this.concurrencyBuckets).length)throw new Error("Trying to spawn shards without calling Client.connect()");for(let id of this.options.shards==="auto"?Array(this.options.totalShards).fill(0).map((_,index)=>index):this.options.shards??[0])this.client.emit("debug",`Spawned shard ${id}`),this.shards[id]=new Shard(id,this.client),this._addListener(this.shards[id]),this.shards[id].connector.connect();}disconnect(){for(let shardKey in this.shards)this.shards[shardKey].disconnect();}_addListener(shard){shard.on("ready",resume=>{shard.ready=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=>{this.client.emit("debug",`Shard ${shardId} is ready to identify`),this.identifyBucket.enqueue(()=>{let max_concurrency=Object.keys(this.concurrencyBuckets).length,concurrencyRoute=shardId%max_concurrency,bkt=this.concurrencyBuckets[concurrencyRoute];if(!bkt)return this.client.emit("error",`Received a queueIdentify event for shard ${shardId} and a concurrency route of ${concurrencyRoute} with a max_concurrency of ${max_concurrency}, but there was no bucket with that route internally.`);bkt.enqueue(()=>{shard.connector.identify();});});}),shard.on("disconnect",(code,reason,gracefulClose)=>{if(this.client.emit("debug",`Websocket of shard ${shard.id} closed with code ${code} and reason: ${reason??"None"}`),code===1e3&&gracefulClose)return this._checkDisconnect()});}_checkReady(){for(let shardId in this.shards)if(this.shards[shardId]&&!this.shards[shardId].ready)return;this.client.emit("ready");}_checkDisconnect(){for(let shardId in this.shards)if(this.shards[shardId]&&this.shards[shardId].connector.status!=="disconnected")return;this.client.emit("disconnected");}async presenceUpdate(data){for(let shardKey in this.shards)if(this.shards[shardKey]){let shard=this.shards[shardKey];this.shardPresenceUpdate(shard.id,data);}}shardPresenceUpdate(shardId,data){return new Promise((res,rej)=>{let shard=this.shards[shardId];shard||rej(new Error(`Shard ${shardId} does not exist`)),shard.ready&&shard.presenceUpdate(data).then(result=>res(result)).catch(e=>rej(e));})}voiceStateUpdate(shardId,data){return new Promise((res,rej)=>{let shard=this.shards[shardId];shard||rej(new Error(`Shard ${shardId} does not exist`)),shard.ready&&shard.voiceStateUpdate(data).then(result=>res(result)).catch(e=>rej(e));})}requestGuildMembers(shardId,data){return new Promise((res,rej)=>{let shard=this.shards[shardId];shard||rej(new Error(`Shard ${shardId} does not exist`)),shard.ready&&shard.requestGuildMembers(data).then(result=>res(result)).catch(e=>rej(e));})}};module.exports=ShardManager;}});var require_Client=__commonJS({"src/Client.ts"(exports,module){var fs=__require("fs"),path=__require("path"),version=JSON.parse(fs.readFileSync(path.join(__dirname,"../package.json"),{encoding:"utf8"})).version,Constants2=require_Constants(),ShardManager=require_ShardManager(),Client=class extends events.EventEmitter{constructor(token,options={}){super();this.version=version;if(!token)throw new Error("Missing token!");this.options={largeGuildThreshold:250,shards:"auto",intents:0,token:"",ws:{compress:true,encoding:"json"}},this._restClient=options.snowtransferInstance?options.snowtransferInstance:new snowtransfer.SnowTransfer(token),delete options.snowtransferInstance,this.token=token.startsWith("Bot ")?token.substring(4):token,options.ws&&Object.assign(this.options.ws,options.ws),delete options.ws,Object.assign(this.options,options),this.options.token=token,this.shardManager=new ShardManager(this);}async connect(){let initial=await this.fetchConnectInfo();this.options.shards==="auto"&&(this.options.totalShards=initial),this.shardManager.spawn();}async fetchConnectInfo(){let gateway=await this.getGatewayBot();this._updateEndpoint(gateway.url),this.shardManager.identifyBucket.remaining=gateway.session_start_limit.remaining,this.shardManager.identifyBucket.reset=gateway.session_start_limit.reset_after,this.shardManager.identifyBucket.makeResetTimeout(this.shardManager.identifyBucket.reset),this.shardManager.identifyBucket.queue.blocked&&this.shardManager.identifyBucket.remaining&&this.shardManager.identifyBucket.queue.setBlocked(false);for(let route of Object.keys(this.shardManager.concurrencyBuckets))delete this.shardManager.concurrencyBuckets[route];for(let i=0;i<gateway.session_start_limit.max_concurrency;i++)this.shardManager.concurrencyBuckets[i]=new snowtransfer.LocalBucket(1,5e3);return gateway.shards}async getGateway(){return (await this._restClient.bot.getGateway()).url}async getGatewayBot(){return this._restClient.bot.getGatewayBot()}disconnect(){return this.shardManager.disconnect()}async presenceUpdate(data){return this.shardManager.presenceUpdate(data)}shardPresenceUpdate(shardId,data){return this.shardManager.shardPresenceUpdate(shardId,data)}voiceStateUpdate(shardId,data){return this.shardManager.voiceStateUpdate(shardId,data)}requestGuildMembers(shardId,data){if(!data.guild_id)throw new Error("You need to pass a guild_id");return this.shardManager.requestGuildMembers(shardId,data)}_updateEndpoint(gatewayUrl){var _a,_b;this.options.endpoint=`${gatewayUrl}?v=${Constants2.GATEWAY_VERSION}&encoding=${((_a=this.options.ws)==null?void 0:_a.encoding)==="etf"?"etf":"json"}${(_b=this.options.ws)!=null&&_b.compress?"&compress=zlib-stream":""}`;}};module.exports=Client;}});var Client2=require_Client(),Constants=require_Constants(),Intents=(init_Intents(),__toCommonJS(Intents_exports)),Shard2=require_Shard(),ShardManager2=require_ShardManager(),BetterWs2=require_BetterWs(),DiscordConnector2=require_DiscordConnector();
9
+ var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty;var __require=(x=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(x,{get:(a,b)=>(typeof require<"u"?require:a)[b]}):x)(function(x){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+x+'" is not supported')});var __esm=(fn,res)=>function(){return fn&&(res=(0, fn[__getOwnPropNames(fn)[0]])(fn=0)),res};var __commonJS=(cb,mod)=>function(){return mod||(0, cb[__getOwnPropNames(cb)[0]])((mod={exports:{}}).exports,mod),mod.exports};var __export=(target,all2)=>{for(var name in all2)__defProp(target,name,{get:all2[name],enumerable:true});},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to};var __toESM=(mod,isNodeMode,target)=>(target=mod!=null?__create(__getProtoOf(mod)):{},__copyProps(!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:true}):target,mod)),__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:true}),mod);var require_Constants=__commonJS({"src/Constants.ts"(exports,module){var Constants2={GATEWAY_OP_CODES:{DISPATCH:0,HEARTBEAT:1,IDENTIFY:2,PRESENCE_UPDATE:3,VOICE_STATE_UPDATE:4,RESUME:6,RECONNECT:7,REQUEST_GUILD_MEMBERS:8,INVALID_SESSION:9,HELLO:10,HEARTBEAT_ACK:11},GATEWAY_VERSION:10};module.exports=Constants2;}});var require_StateMachine=__commonJS({"src/StateMachine.ts"(exports,module){var EventEmitter5=__require("events"),StateMachine3=class extends EventEmitter5{constructor(currentStateName){super();this.currentStateName=currentStateName;this.states=new Map;this.editable=true;this.deferredTransitionCreators=[];this.history=[];this.deferredTransitionCreators.push(()=>{this.states.has(currentStateName)||this.defineState(currentStateName);});}guardEditable(){if(!this.editable)throw new Error("tried to edit state machine after machine has been frozen")}guardNotEditable(){if(this.editable)throw new Error("tried to do transition before machine has been frozen")}defineState(name,cbs={onEnter:[],onLeave:[],transitions:new Map}){if(this.guardEditable(),this.states.has(name))throw new Error(`attempt to redefine state ${name}, please edit it instead`);return this.states.set(name,{onEnter:cbs.onEnter,onLeave:cbs.onLeave,transitions:cbs.transitions}),this}defineTransition(from,event,to,cb){this.guardEditable();let state=this.states.get(from);if(state.transitions.has(event))throw new Error(`attempt to redefine transition ${from} --${event}--> *, please only create transitions once`);let onTransition=[];return cb&&onTransition.push(cb),state.transitions.set(event,{destination:to,onTransition}),this}defineUniversalTransition(event,to){return this.guardEditable(),this.deferredTransitionCreators.push(()=>{for(let[stateName,state]of this.states.entries())state.transitions.has(event)||this.defineTransition(stateName,event,to);}),this}freeze(){this.guardEditable();for(let cb of this.deferredTransitionCreators)cb();let problems=[];for(let[stateName,state]of this.states.entries())for(let[transitionName,transition]of state.transitions.entries())this.states.has(transition.destination)||problems.push(`transition ${stateName} --${transitionName}--> ${transition.destination} has an invalid destination`);if(problems.length)throw new Error(`Consistency problems in state machine: ${problems.join(";")}`);this.editable=false;}doTransition(event,...args){this.guardNotEditable();let from=this.currentStateName,transition=this.states.get(this.currentStateName).transitions.get(event);if(!transition)throw new Error(`undefined transition: ${this.currentStateName} -> ${event} -> ?`);this.history.push({from,event,to:transition.destination,time:Date.now()}),this.history.length>20&&this.history.shift();for(let cb of this.states.get(this.currentStateName).onLeave)try{cb(event);}catch(e){throw this.debug(),new Error(`onLeave callback for state ${from} (during transition ${from} --${event}--> ${transition.destination})`,{cause:e})}this.currentStateName=transition.destination;for(let cb of transition.onTransition??[])try{cb(...args);}catch(e){throw this.debug(),new Error(`onTransition callback during ${from} --${event}--> ${transition.destination}`,{cause:e})}this.emit("enter",this.currentStateName);for(let cb of this.states.get(this.currentStateName).onEnter)try{cb(event);}catch(e){throw this.debug(),new Error(`onEnter callback for state ${from} (during transition ${this.currentStateName} --${event}--> ${transition.destination})`,{cause:e})}}doTransitionLater(event,delayMs,...args){this.guardNotEditable();let timer=setTimeout(()=>{this.doTransition(event,...args);},delayMs);this.once("enter",()=>{clearTimeout(timer);});}debug(){console.table(this.history.map(h=>({At:new Date(h.time),"From -->":h.from,"-- Event -->":h.event,"--> To":h.to})).concat({At:new Date,"From -->":this.currentStateName,"-- Event -->":"(debug)","--> To":""}));}};module.exports=StateMachine3;}});var StateMachineGraph_exports={};__export(StateMachineGraph_exports,{graph:()=>graph});function graph(stateMachine){stateMachine.guardNotEditable();let output=`digraph {
10
+ `;output+=`rankdir=LR
11
+ `,output+=`${stateMachine.currentStateName}
12
+ `;for(let[stateName,state]of stateMachine.states.entries()){state.onEnter.length&&(output+=`${stateName} [fontcolor=blue]
13
+ `);for(let[transitionName,transition]of state.transitions.entries()){output+=`${stateName} -> ${transition.destination}`;let attrs=[`label="${transitionName}"`];transition.onTransition?.length&&(attrs.push("color=blue"),attrs.push("fontcolor=blue")),output+=`[${attrs.join(" ")}]
14
+ `;}}return output+="}",output}var init_StateMachineGraph=__esm({"src/StateMachineGraph.ts"(){require_StateMachine();}});var require_BetterWs=__commonJS({"src/BetterWs.ts"(exports,module){var https=__require("https"),http=__require("http"),util=__require("util"),StateMachine3=require_StateMachine(),stateMachineGraph=(init_StateMachineGraph(),__toCommonJS(StateMachineGraph_exports));function eventSwitch(emitter,cbs){let realListeners=new Map;return Promise.race(Object.entries(cbs).map(([event,cb])=>new Promise((resolve2,reject)=>{let l=(...args)=>(async()=>cb(...args))().then(resolve2,reject);realListeners.set(event,l),emitter.once(event,l);}))).finally(()=>{for(let[event,l]of realListeners.entries())emitter.removeListener(event,l);})}var BetterWs=class extends events.EventEmitter{constructor(address,options){super();this.address=address;this.options=options;this.sm=new StateMachine3("disconnected");this._socket=null;this._lastCloseCode=null;this._lastCloseReason=null;this._closePromise=null;this._closeResolver=null;this._zlib=null;this.lastConnectAttempt=0;this.encoding=options.encoding??"other",this.compress=options.compress??false,this.connectThrottle=options.connectThrottle??1e4,this.sm.defineState("connect_wait",{onEnter:[()=>{this.sm.doTransitionLater("connect_allowed",this.lastConnectAttempt-Date.now()+this.connectThrottle);}],onLeave:[()=>{this.lastConnectAttempt=Date.now();}],transitions:new Map([["connect_allowed",{destination:"connecting"}]])}),this.sm.defineState("connecting",{onEnter:[()=>{let{req,key}=createReq(this.address,this.options);return this.emit("debug","Socket sending request to upgrade"),eventSwitch(req,{upgrade:(res,socket)=>{try{this.sm.doTransition("upgrade",key,res,socket);}catch(e){throw req.destroy(),e}},error:e=>{throw e},response:res=>{throw req.destroy(),new Error(`Expected HTTP 101 Upgrade, but got ${res.statusCode} ${res.statusMessage}`)}}).catch(error=>{this.sm.doTransition("error",error);})}],onLeave:[],transitions:new Map([["upgrade",{destination:"upgrading",onTransition:[(key,res,socket)=>{let hash=crypto.createHash("sha1").update(key+"258EAFA5-E914-47DA-95CA-C5AB0DC85B11").digest("base64"),accept=res.headers["sec-websocket-accept"];if(hash!==accept)return socket.end(()=>{this.emit("error",`Failed websocket-key validation: expected: ${hash} | received: ${accept}`);}),this.sm.doTransition("error");if(socket.on("error",e=>this.sm.doTransition("error",e)),socket.on("close",()=>this.sm.doTransition("disconnect")),socket.on("readable",this._onReadable.bind(this)),this._socket=socket,this.compress){let z=zlib.createInflate();z._c=z.close,z._h=z._handle,z._hc=z._handle.close,z._v=()=>{},this._zlib=z;}this.emit("ws_open"),this.sm.doTransition("ws_open");}]}]])}),this.sm.defineState("upgrading",{onEnter:[],onLeave:[],transitions:new Map([["ws_open",{destination:"connected"}]])}),this.sm.defineState("connected",{onEnter:[],onLeave:[],transitions:new Map([["disconnect",{destination:"disconnected"}],["user_close",{destination:"half_close",onTransition:[(code,reason)=>{this.emit("debug","User requested socket close");let from=Buffer.from([code>>8,code&255]);this._write(reason?Buffer.concat([from,Buffer.from(reason)]):from,8);}]}],["error",{destination:"half_close",onTransition:[error=>{this.emit("error",util.inspect(error,true,1,false)),this._write(Buffer.allocUnsafe(0),8);}]}]])}),this.sm.defineState("half_close",{onEnter:[()=>{this.sm.doTransitionLater("close_no_response",5e3);let{promise,resolve:resolve2}=Promise.withResolvers();return this._closePromise=promise,this._closeResolver=resolve2,this._closePromise}],onLeave:[],transitions:new Map([["user_close",{destination:"half_close",onTransition:[()=>this._closePromise]}],["close_no_response",{destination:"disconnected",onTransition:[()=>{this.emit("debug","Server didn't respond for a full close in time");}]}],["disconnect",{destination:"disconnected"}]])}),this.sm.defineState("disconnected",{onEnter:[()=>{this._closeResolver&&this._closeResolver(),this._zlib&&(this._zlib.close(),this._zlib=null),this.emit("ws_close",this._lastCloseCode??1006,this._lastCloseReason??"Abnormal Closure"),this._lastCloseCode=null,this._lastCloseReason=null,this._socket?.removeAllListeners();}],onLeave:[],transitions:new Map([["user_connect",{destination:"connect_wait"}]])}),this.sm.defineUniversalTransition("error","disconnected"),this.sm.freeze(),process.argv.includes("--state-machine-graph-betterws")&&console.log(stateMachineGraph.graph(this.sm));}connect(){this.sm.doTransition("user_connect");}sendMessage(data){this.encoding==="json"?this._write(Buffer.from(JSON.stringify(data)),1):this.encoding==="etf"?this._write(writeETF(data),2):this.encoding==="other"&&this._write(Buffer.from(data),2),this.emit("ws_send",data);}async close(code,reason){this.sm.doTransition("user_close",code,reason);}_write(packet,opcode){let socket=this._socket;if(!socket?.writable)return this.sm.doTransition("disconnect");let length=packet.length,frame;length<126?(frame=Buffer.allocUnsafe(6+length),frame[1]=128+length):length<65536?(frame=Buffer.allocUnsafe(8+length),frame[1]=254,frame[2]=length>>8,frame[3]=length&255):(frame=Buffer.allocUnsafe(14+length),frame[1]=255,frame.writeBigUInt64BE(BigInt(length),2)),frame[0]=128+opcode,frame.writeUInt32BE(0,frame.length-length-4),frame.set(packet,frame.length-length),socket.write(frame);}_onReadable(){let socket=this._socket;for(;(socket?.readableLength??0)>1;){let length=readRange(socket,1,1)&127,bytes=0;if(length>125){if(bytes=length===126?2:8,socket.readableLength<2+bytes)return;length=readRange(socket,2,bytes);}let frame=socket.read(2+bytes+length);if(!frame)return;let fin=frame[0]>>7,opcode=frame[0]&15;(fin!==1||opcode===0)&&this.emit("error","discord actually does send messages with fin=0. if you see this error let me know");let payload=frame.subarray(2+bytes);this._processFrame(opcode,payload);}}_processFrame(opcode,message){switch(opcode){case 1:{let packet;this.encoding==="json"?packet=JSON.parse(message.toString()):this.encoding==="other"&&(packet=message),this.emit("ws_receive",packet);break}case 2:{let packet;if(this.compress){let error=null,data=null,z=this._zlib;z.close=z._handle.close=z._v;try{data=z._processChunk(message,zlib.constants.Z_SYNC_FLUSH);}catch(e){error=e;}let l=message.length;if((message[l-4]!==0||message[l-3]!==0||message[l-2]!==255||message[l-1]!==255)&&this.emit("error","discord actually does send fragmented zlib messages. If you see this error let me know"),z.close=z._c,z._handle=z._h,z._handle.close=z._hc,z._events.error=void 0,z._eventCount--,z.removeAllListeners("error"),error){this.emit("error","Zlib error processing chunk"),this._write(Buffer.allocUnsafe(0),8);return}if(!data){this.emit("error","Data from zlib processing was null. If you see this error let me know");return}this.encoding==="json"?packet=JSON.parse(String(data)):this.encoding==="etf"?packet=readETF(data,1):this.encoding==="other"&&(packet=data);}else this.encoding==="json"?packet=JSON.parse(zlib.inflateSync(message).toString()):this.encoding==="etf"?packet=readETF(message,1):this.encoding==="other"&&(packet=message);this.emit("ws_receive",packet);break}case 8:{this._lastCloseCode=message.length>1?(message[0]<<8)+message[1]:0,this._lastCloseReason=message.length>2?message.subarray(2).toString():"",this._write(Buffer.from([this._lastCloseCode>>8,this._lastCloseCode&255]),8);break}case 9:{this._write(message,10);break}}}};function createReq(address,options){let key=crypto.randomBytes(16).toString("base64"),url=new URL(address),useHTTPS=url.protocol==="https:"||url.protocol==="wss:"||url.port==="443",port=url.port||(useHTTPS?"443":"80"),req=(useHTTPS?https:http).request({hostname:url.hostname,path:`${url.pathname}${url.search}`,port,headers:{Connection:"Upgrade",Upgrade:"websocket","Sec-WebSocket-Key":key,"Sec-WebSocket-Version":"13",...options.headers}});return req.end(),{req,key}}function readRange(socket,index,bytes){let cursor=0,read=0,num=0,readable=socket._readableState,currentBufferIndex=readable.bufferIndex,currentBuffer=readable.buffer.head??readable.buffer[currentBufferIndex];do{let data=currentBuffer.data??currentBuffer;for(let element of data)if(++cursor>index&&(num*=256,num+=element,++read===bytes))return num}while(currentBuffer=currentBuffer.next??readable.buffer[++currentBufferIndex]);throw new Error("readRange failed?")}function readETF(data,start){let view,x=start,loop=()=>{let type=data[x++];switch(type){case 70:{let float=data.readDoubleBE(x);return x+=8,float}case 97:return data[x++];case 98:{let int=data.readInt32BE(x);return x+=4,int}case 100:{let length=data.readUInt16BE(x),atom="";if(length>30)atom=data.latin1Slice(x+=2,x+length);else for(let i=x+=2;i<x+length;i++)atom+=String.fromCharCode(data[i]);return x+=length,atom?atom==="nil"||atom==="null"?null:atom==="true"?true:atom==="false"?false:atom:void 0}case 108:case 106:{let array=[];if(type===108){let length=data.readUInt32BE(x);x+=4;for(let i=0;i<length;i++)array.push(loop());x++;}return array}case 107:{let array=[],length=data.readUInt16BE(x);x+=2;for(let i=0;i<length;i++)array.push(data[x++]);return array}case 109:{let length=data.readUInt32BE(x),str="";if(length>30)str=data.utf8Slice(x+=4,x+length);else {let i=x+=4,l=x+length;for(;i<l;){let byte=data[i++];byte<128?str+=String.fromCharCode(byte):byte<224?str+=String.fromCharCode(((byte&31)<<6)+(data[i++]&63)):byte<240?str+=String.fromCharCode(((byte&15)<<12)+((data[i++]&63)<<6)+(data[i++]&63)):str+=String.fromCodePoint(((byte&7)<<18)+((data[i++]&63)<<12)+((data[i++]&63)<<6)+(data[i++]&63));}}return x+=length,str}case 110:{view??=new DataView(data.buffer,data.offset,data.byteLength);let length=data[x++],sign=data[x++],left=length,num=BigInt(0);for(;left>0;)left>=8?(num<<=BigInt(64),num+=view.getBigUint64(x+(left-=8),true)):left>=4?(num<<=BigInt(32),num+=BigInt(view.getUint32(x+(left-=4)),true)):left>=2?(num<<=BigInt(16),num+=BigInt(view.getUint16(x+(left-=2)),true)):(num<<=BigInt(8),num+=BigInt(data[x]),left--);return x+=length,(sign?-num:num).toString()}case 116:{let obj={},length=data.readUInt32BE(x);x+=4;for(let i=0;i<length;i++){let key=loop();obj[key]=loop();}return obj}}throw new Error(`Missing etf type: ${type}`)};return loop()}function writeETF(data){let b=Buffer.allocUnsafe(4096);b[0]=131;let i=1,loop=obj=>{switch(typeof obj){case "boolean":{b[i++]=100,obj?(b.writeUInt16BE(4,i),b.latin1Write("true",i+=2),i+=4):(b.writeUInt16BE(5,i),b.latin1Write("false",i+=2),i+=5);break}case "string":{let length=Buffer.byteLength(obj);b[i++]=109,b.writeUInt32BE(length,i),b.utf8Write(obj,i+=4),i+=length;break}case "number":{if(Number.isInteger(obj)){let abs=Math.abs(obj);if(abs<2147483648)b[i++]=98,b.writeInt32BE(obj,i),i+=4;else if(abs<Number.MAX_SAFE_INTEGER){b[i++]=110,b[i++]=8,b[i++]=+(obj<0),b.writeBigUInt64LE(BigInt(abs),i),i+=8;break}else b[i++]=70,b.writeDoubleBE(obj,i),i+=8;}else b[i++]=70,b.writeDoubleBE(obj,i),i+=8;break}case "bigint":{b[i++]=110,b[i++]=8,b[i++]=+(obj<0),b.writeBigUInt64LE(obj,i),i+=8;break}case "object":{if(obj===null)b[i++]=100,b.writeUInt16BE(3,i),b.latin1Write("nil",i+=2),i+=3;else if(Array.isArray(obj)){if(obj.length){b[i++]=108,b.writeUInt32BE(obj.length,i),i+=4;for(let item of obj)loop(item);}b[i++]=106;}else {let entries=Object.entries(obj).filter(x=>typeof x[1]<"u");b[i++]=116,b.writeUInt32BE(entries.length,i),i+=4;for(let[key,value]of entries)loop(key),loop(value);}break}}};return loop(data),Buffer.from(b.subarray(0,i))}module.exports=BetterWs;}});var Intents_exports={};__export(Intents_exports,{all:()=>all,default:()=>Intents_default,flags:()=>flags,non_privileged:()=>non_privileged,privileged:()=>privileged,resolve:()=>resolve});function resolve(bit=0){if(typeof bit=="number"&&bit>=0)return bit;if(typeof bit=="string"&&flags[bit])return flags[bit]|0;if(Array.isArray(bit))return bit.map(p=>resolve(p)).reduce((prev,p)=>prev|p,0);throw new RangeError("BITFIELD_INVALID")}var flags,privileged,all,non_privileged,Intents_default,init_Intents=__esm({"src/Intents.ts"(){flags={GUILDS:1,GUILD_MEMBERS:2,GUILD_MODERATION:4,GUILD_EMOJIS_AND_STICKERS:8,GUILD_INTEGRATIONS:16,GUILD_WEBHOOKS:32,GUILD_INVITES:64,GUILD_VOICE_STATES:128,GUILD_PRESENCES:256,GUILD_MESSAGES:512,GUILD_MESSAGE_REACTIONS:1024,GUILD_MESSAGE_TYPING:2048,DIRECT_MESSAGES:4096,DIRECT_MESSAGE_REACTIONS:8192,DIRECT_MESSAGE_TYPING:16384,MESSAGE_CONTENT:32768,GUILD_SCHEDULED_EVENTS:65536,AUTO_MODERATION_CONFIGURATION:1048576,AUTO_MODERATION_EXECUTION:2097152,GUILD_MESSAGE_POLLS:16777216,DIRECT_MESSAGE_POLLS:33554432},privileged=flags.GUILD_MEMBERS|flags.GUILD_PRESENCES|flags.MESSAGE_CONTENT,all=Object.values(flags).reduce((acc,p)=>acc|p,0),non_privileged=all&~privileged;Intents_default={flags,privileged,all,non_privileged,resolve};}});var require_DiscordConnector=__commonJS({"src/DiscordConnector.ts"(exports,module){var import_Constants=__toESM(require_Constants()),BetterWs=require_BetterWs(),Intents2=(init_Intents(),__toCommonJS(Intents_exports)),resumableCodes=[4008,4005,4003,4002,4001,4e3,1006,1001],shouldntAttemptReconnectCodes=[4014,4013,4012,4011,4010,4004],disconnectMessages={4014:"Disallowed Intents, check your client options and application page.",4013:"Invalid Intents data, check your client options.",4012:"Invalid API version.",4011:"Shard would be on over 2500 guilds. Add more shards.",4010:"Invalid sharding data, check your client options.",4009:"Session timed out.",4008:"You are being rate limited. Wait before sending more packets.",4007:"Invalid sequence. Reconnecting and starting a new session.",4005:"You sent more than one OP 2 IDENTIFY payload while the websocket was open.",4004:"Tried to connect with an invalid token.",4003:"You tried to send a packet before sending an OP 2 IDENTIFY or OP 6 RESUME.",4002:"You sent an invalid payload.",4001:"You sent an invalid opcode or invalid payload for an opcode."},DiscordConnector=class extends events.EventEmitter{constructor(id,client){super();this.id=id;this.client=client;this.heartbeatTimeout=null;this.heartbeatInterval=0;this._trace=null;this.seq=0;this.status="disconnected";this.sessionId=null;this.lastACKAt=0;this.lastHeartbeatSend=0;this.latency=0;this.resumeAddress=null;this.reconnecting=false;this.wsBucket=new snowtransfer.LocalBucket(120,6e4);this.presenceBucket=new snowtransfer.LocalBucket(5,6e4);this.membersBucket=new snowtransfer.LocalBucket(1,3e4);this._closing=false;this._openToHeartbeatTimeout=null;this._initialHeartbeatTimeout=null;this.options=client.options,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("debug",`Shard ${this.id} ${event}`)),this.betterWs.on("error",event=>this.client.emit("error",event)),this.betterWs.on("ws_send",data=>this.client.emit("rawSend",data)),this.wsBucket.queue.setBlocked(true),this.presenceBucket.queue.setBlocked(true),this.membersBucket.queue.setBlocked(true);}async connect(){return this._closing=false,this.client.emit("debug",`Shard ${this.id} connecting to gateway`),this.betterWs.connect()}async disconnect(){return this._closing=true,this.wsBucket.queue.setBlocked(true),this.presenceBucket.queue.setBlocked(true),this.membersBucket.queue.setBlocked(true),this.betterWs.close(1e3,"Disconnected by User")}async messageAction(message){this.client.emit("rawReceive",message);let withShardID=Object.assign(message,{shard_id:this.id});switch(this.client.emit("event",withShardID),withShardID.op){case import_Constants.GATEWAY_OP_CODES.DISPATCH:this.handleDispatch(withShardID);break;case import_Constants.GATEWAY_OP_CODES.HEARTBEAT:this.heartbeat();break;case import_Constants.GATEWAY_OP_CODES.RECONNECT:this.client.emit("debug",`Gateway asked shard ${this.id} to reconnect`),this._reconnect(true);break;case import_Constants.GATEWAY_OP_CODES.INVALID_SESSION:this.client.emit("debug",`Shard ${this.id}'s session was invalidated`),withShardID.d&&this.sessionId?this.resume():(this.seq=0,this.sessionId="",this.emit("queueIdentify",this.id));break;case import_Constants.GATEWAY_OP_CODES.HELLO: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.sessionId)return void this.resume();this.emit("queueIdentify",this.id);break;case import_Constants.GATEWAY_OP_CODES.HEARTBEAT_ACK:this.lastACKAt=Date.now(),this.latency=this.lastACKAt-this.lastHeartbeatSend;break;}}async _reconnect(resume=false){this.reconnecting=resume,this.wsBucket.queue.setBlocked(true),this.presenceBucket.queue.setBlocked(true),await this.betterWs.close(resume?4e3:1012,"reconnecting"),resume?(this.clearHeartBeat(),this.resumeAddress?this.betterWs.address=this.resumeAddress:this.betterWs.address=this.identifyAddress):(this.reset(),this.betterWs.address=this.identifyAddress);}reset(){this.sessionId=null,this.seq=0,this.lastACKAt=0,this._trace=null,this.clearHeartBeat();}setHeartBeat(){this.heartbeatTimeout=setInterval(()=>{this.lastACKAt<=Date.now()-(this.heartbeatInterval+5e3)?(this.client.emit("debug",`Shard ${this.id} has not received a heartbeat ACK in ${this.heartbeatInterval+5e3}ms.`),this._reconnect(true)):this.heartbeat();},this.heartbeatInterval);}clearHeartBeat(){this.heartbeatTimeout&&clearInterval(this.heartbeatTimeout),this._initialHeartbeatTimeout&&clearTimeout(this._initialHeartbeatTimeout),this.heartbeatTimeout=null,this._initialHeartbeatTimeout=null,this.heartbeatInterval=0;}async identify(){if(this.betterWs.sm.currentStateName!=="connected")return this.client.emit("error",`Shard ${this.id} was attempting to identify when the ws was not open. Current state: ${this.betterWs.sm.currentStateName}`),this._reconnect(true);this.client.emit("debug",`Shard ${this.id} is identifying`),this.status="identifying",this.emit("stateChange","identifying");let data={op:import_Constants.GATEWAY_OP_CODES.IDENTIFY,d:{token:this.options.token,properties:{os:process.platform,browser:"CloudStorm",device:"CloudStorm"},large_threshold:this.options.largeGuildThreshold,shard:[this.id,this.options.totalShards??1],intents:this.options.intents?Intents2.resolve(this.options.intents):0}};return this.options.initialPresence&&(data.d.presence=this._checkPresenceData(this.options.initialPresence)),this.betterWs.sendMessage(data)}async resume(){return this.betterWs.sm.currentStateName!=="connected"?(this.client.emit("error",`Shard ${this.id} was attempting to resume when the ws was not open. Current state: ${this.betterWs.sm.currentStateName}`),this._reconnect(true)):(this.client.emit("debug",`Shard ${this.id} is resuming`),this.status="resuming",this.emit("stateChange","resuming"),this.betterWs.sendMessage({op:import_Constants.GATEWAY_OP_CODES.RESUME,d:{seq:this.seq,token:this.options.token,session_id:this.sessionId}}))}heartbeat(){if(this.betterWs.sm.currentStateName!=="connected")return this.client.emit("error",`Shard ${this.id} was attempting to heartbeat when the ws was not open. Current state: ${this.betterWs.sm.currentStateName}`),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(),this._initialHeartbeatTimeout&&(clearTimeout(this._initialHeartbeatTimeout),this._initialHeartbeatTimeout=null),this.heartbeatTimeout||this.setHeartBeat();}handleDispatch(message){switch(this.client.emit("dispatch",message),message.s&&(message.s>this.seq+1&&(this.client.emit("debug",`Shard ${this.id} invalid sequence: { current: ${this.seq} message: ${message.s} }`),this.seq=message.s,this.resume()),this.seq=message.s),message.t){case "READY":case "RESUMED":message.t==="READY"&&(message.d.resume_gateway_url&&(this.resumeAddress=`${message.d.resume_gateway_url}?v=${import_Constants.GATEWAY_VERSION}&encoding=${this.options.ws?.encoding==="etf"?"etf":"json"}${this.options.ws?.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"),this.wsBucket.queue.setBlocked(false),this.presenceBucket.queue.setBlocked(false),this.membersBucket.queue.setBlocked(false);break;}}handleWsClose(code,reason){let gracefulClose=false;this.status="disconnected",this.emit("stateChange","disconnected"),this.clearHeartBeat(),this.wsBucket.queue.setBlocked(true),this.presenceBucket.queue.setBlocked(true);let isManualClose=code===1e3&&this._closing,message=disconnectMessages[code],isRecoverable=resumableCodes.includes(code),shouldntReconnect=shouldntAttemptReconnectCodes.includes(code)||isManualClose;isRecoverable&&this.resumeAddress?this.betterWs.address=this.resumeAddress:this.betterWs.address=this.identifyAddress,message&&this.client.emit("error",message),(isManualClose||this.reconnecting)&&(gracefulClose=true),this._closing=false,this.emit("disconnect",code,reason,gracefulClose),shouldntReconnect||this.connect();}async presenceUpdate(data){return this.sendMessage({op:import_Constants.GATEWAY_OP_CODES.PRESENCE_UPDATE,d:this._checkPresenceData(data)})}async voiceStateUpdate(data){return data?this.sendMessage({op:import_Constants.GATEWAY_OP_CODES.VOICE_STATE_UPDATE,d:this._checkVoiceStateUpdateData(data)}):Promise.resolve()}async requestGuildMembers(data){return this.sendMessage({op:import_Constants.GATEWAY_OP_CODES.REQUEST_GUILD_MEMBERS,d:this._checkRequestGuildMembersData(data)})}async sendMessage(data){let bypass=this.options.ws.bypassBuckets;return new Promise(res=>{let sendMsg=()=>{let fn=()=>{this.betterWs.sendMessage(data),res(void 0);};bypass?fn():this.wsBucket.enqueue(fn);};if(bypass)sendMsg();else switch(data.op){case import_Constants.GATEWAY_OP_CODES.PRESENCE_UPDATE:this.presenceBucket.enqueue(sendMsg);break;case import_Constants.GATEWAY_OP_CODES.REQUEST_GUILD_MEMBERS:"query"in data.d&&data.d.query.length===0&&data.d.limit===0?this.membersBucket.enqueue(sendMsg):sendMsg();break;default:sendMsg();break}})}_checkPresenceData(data){if(data.status=data.status??v10.PresenceUpdateStatus.Online,data.activities=data.activities&&Array.isArray(data.activities)?data.activities:[],data.activities)for(let activity of data.activities){let index=data.activities.indexOf(activity);activity.type??=activity.url?1:0,activity.name||(activity.state&&activity.type===4?activity.name="Custom Status":data.activities.splice(index,1));}return data.afk=data.afk??false,data.since=data.since??Date.now(),data}_checkVoiceStateUpdateData(data){return data.channel_id=data.channel_id??null,data.self_mute=data.self_mute??false,data.self_deaf=data.self_deaf??false,data}_checkRequestGuildMembersData(data){let withQuery=data,withUserIDs=data;return !withQuery.query&&!withUserIDs.user_ids&&(withQuery.query=""),withQuery.query&&withUserIDs.user_ids&&delete data.query,data.limit=data.limit??10,data}};module.exports=DiscordConnector;}});var require_Shard=__commonJS({"src/Shard.ts"(exports,module){var DC=require_DiscordConnector(),Shard=class extends events.EventEmitter{constructor(id,client){super();this.id=id;this.client=client;this.ready=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)}};module.exports=Shard;}});var require_ShardManager=__commonJS({"src/ShardManager.ts"(exports,module){var Shard=require_Shard(),ShardManager=class{constructor(client){this.client=client;this.shards={};this.identifyBucket=new snowtransfer.LocalBucket(1e3,1e3*60*60*24);this.concurrencyBuckets={};this.options=client.options;}spawn(){if(!Object.keys(this.concurrencyBuckets).length)throw new Error(`Trying to spawn shards without calling Client.fetchConnectInfo()
15
+ If you intended to just let cloudstorm handle things for you, you should just use Client.connect() instead`);for(let id of this.options.shards==="auto"?Array(this.options.totalShards).fill(0).map((_,index)=>index):this.options.shards??[0])this.client.emit("debug",`Spawned shard ${id}`),this.shards[id]=new Shard(id,this.client),this._addListener(this.shards[id]),this.shards[id].connector.connect();}disconnect(){for(let shardKey in this.shards)this.shards[shardKey].disconnect();}_addListener(shard){shard.on("ready",resume=>{shard.ready=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=>{this.client.emit("debug",`Shard ${shardId} is ready to identify`),this.identifyBucket.enqueue(()=>{let max_concurrency=Object.keys(this.concurrencyBuckets).length,concurrencyRoute=shardId%max_concurrency,bkt=this.concurrencyBuckets[concurrencyRoute];if(!bkt)return this.client.emit("error",`Received a queueIdentify event for shard ${shardId} and a concurrency route of ${concurrencyRoute} with a max_concurrency of ${max_concurrency}, but there was no bucket with that route internally.`);bkt.enqueue(()=>{shard.connector.identify();});});}),shard.on("disconnect",(code,reason,gracefulClose)=>{if(this.client.emit("debug",`Websocket of shard ${shard.id} closed with code ${code} and reason: ${reason??"None"}`),code===1e3&&gracefulClose)return this._checkDisconnect()});}_checkReady(){for(let shardId in this.shards)if(this.shards[shardId]&&!this.shards[shardId].ready)return;this.client.emit("ready");}_checkDisconnect(){for(let shardId in this.shards)if(this.shards[shardId]&&this.shards[shardId].connector.status!=="disconnected")return;this.client.emit("disconnected");}async presenceUpdate(data){for(let shardKey in this.shards)if(this.shards[shardKey]){let shard=this.shards[shardKey];this.shardPresenceUpdate(shard.id,data);}}shardPresenceUpdate(shardId,data){return new Promise((res,rej)=>{let shard=this.shards[shardId];shard||rej(new Error(`Shard ${shardId} does not exist`)),shard.ready&&shard.presenceUpdate(data).then(result=>res(result)).catch(e=>rej(e));})}voiceStateUpdate(shardId,data){return new Promise((res,rej)=>{let shard=this.shards[shardId];shard||rej(new Error(`Shard ${shardId} does not exist`)),shard.ready&&shard.voiceStateUpdate(data).then(result=>res(result)).catch(e=>rej(e));})}requestGuildMembers(shardId,data){return new Promise((res,rej)=>{let shard=this.shards[shardId];shard||rej(new Error(`Shard ${shardId} does not exist`)),shard.ready&&shard.requestGuildMembers(data).then(result=>res(result)).catch(e=>rej(e));})}};module.exports=ShardManager;}});var require_Client=__commonJS({"src/Client.ts"(exports,module){var fs=__require("fs"),path=__require("path"),version=JSON.parse(fs.readFileSync(path.join(__dirname,"../package.json"),{encoding:"utf8"})).version,Constants2=require_Constants(),ShardManager=require_ShardManager(),Client=class extends events.EventEmitter{constructor(token,options={}){super();this.version=version;if(!token)throw new Error("Missing token!");this.options={largeGuildThreshold:250,shards:"auto",intents:0,token:"",ws:{compress:true,encoding:"json"}},this._restClient=options.snowtransferInstance??new snowtransfer.SnowTransfer(token),delete options.snowtransferInstance,this.token=token.startsWith("Bot ")?token.substring(4):token,options.ws&&Object.assign(this.options.ws,options.ws),delete options.ws,Object.assign(this.options,options),this.options.token=token,this.shardManager=new ShardManager(this);}async connect(){let initial=await this.fetchConnectInfo();this.options.shards==="auto"&&(this.options.totalShards=initial),this.shardManager.spawn();}async fetchConnectInfo(){let gateway=await this.getGatewayBot();this._updateEndpoint(gateway.url),this.shardManager.identifyBucket.remaining=gateway.session_start_limit.remaining,this.shardManager.identifyBucket.reset=gateway.session_start_limit.reset_after,this.shardManager.identifyBucket.makeResetTimeout(this.shardManager.identifyBucket.reset),this.shardManager.identifyBucket.queue.blocked&&this.shardManager.identifyBucket.remaining&&this.shardManager.identifyBucket.queue.setBlocked(false);for(let route of Object.keys(this.shardManager.concurrencyBuckets))delete this.shardManager.concurrencyBuckets[route];for(let i=0;i<gateway.session_start_limit.max_concurrency;i++)this.shardManager.concurrencyBuckets[i]=new snowtransfer.LocalBucket(1,5e3);return gateway.shards}async getGateway(){return (await this._restClient.bot.getGateway()).url}async getGatewayBot(){return this._restClient.bot.getGatewayBot()}disconnect(){return this.shardManager.disconnect()}async presenceUpdate(data){return this.shardManager.presenceUpdate(data)}shardPresenceUpdate(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){this.options.endpoint=`${gatewayUrl}?v=${Constants2.GATEWAY_VERSION}&encoding=${this.options.ws?.encoding==="etf"?"etf":"json"}${this.options.ws?.compress?"&compress=zlib-stream":""}`;}};module.exports=Client;}});var Client2=require_Client(),Constants=require_Constants(),Intents=(init_Intents(),__toCommonJS(Intents_exports)),Shard2=require_Shard(),ShardManager2=require_ShardManager(),BetterWs2=require_BetterWs(),StateMachine2=require_StateMachine(),DiscordConnector2=require_DiscordConnector();
10
16
 
11
17
  exports.BetterWs = BetterWs2;
12
18
  exports.Client = Client2;
@@ -15,5 +21,6 @@ exports.DiscordConnector = DiscordConnector2;
15
21
  exports.Intents = Intents;
16
22
  exports.Shard = Shard2;
17
23
  exports.ShardManager = ShardManager2;
24
+ exports.StateMachine = StateMachine2;
18
25
  //# sourceMappingURL=index.js.map
19
26
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Constants.ts","../src/BetterWs.ts","../src/Intents.ts","../src/DiscordConnector.ts","../src/Shard.ts","../src/ShardManager.ts","../src/Client.ts","../src/index.ts"],"names":["Constants","resolve","EventEmitter","randomBytes","createHash","createInflate","constants","inflateSync","Intents","LocalBucket","OP","PresenceUpdateStatus","SnowTransfer"],"mappings":"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","file":"index.js","sourcesContent":["\"use strict\";\r\n\r\nconst Constants = {\r\n\tGATEWAY_OP_CODES: {\r\n\r\n\r\n\r\n\t\tDISPATCH: 0 as const,\r\n\r\n\r\n\r\n\t\tHEARTBEAT: 1 as const,\r\n\r\n\r\n\r\n\t\tIDENTIFY: 2 as const,\r\n\r\n\r\n\r\n\t\tPRESENCE_UPDATE: 3 as const,\r\n\r\n\r\n\r\n\t\tVOICE_STATE_UPDATE: 4 as const,\r\n\r\n\r\n\r\n\t\tRESUME: 6 as const,\r\n\r\n\r\n\r\n\t\tRECONNECT: 7 as const,\r\n\r\n\r\n\r\n\t\tREQUEST_GUILD_MEMBERS: 8 as const,\r\n\r\n\r\n\r\n\t\tINVALID_SESSION: 9 as const,\r\n\r\n\r\n\r\n\t\tHELLO: 10 as const,\r\n\r\n\r\n\r\n\t\tHEARTBEAT_ACK: 11 as const\r\n\t},\r\n\tGATEWAY_VERSION: 10 as const\r\n};\r\n\r\nexport = Constants;\r\n","\"use strict\";\r\n\r\n\r\n\r\n\r\n\r\nimport { EventEmitter } from \"events\";\r\nimport { randomBytes, createHash } from \"crypto\";\r\nimport { createInflate, inflateSync, constants, type Inflate } from \"zlib\";\r\nimport https = require(\"https\");\r\nimport http = require(\"http\");\r\nimport util = require(\"util\");\r\n\r\nimport type { Socket } from \"net\";\r\n\r\nimport type {\r\n\tBWSEvents,\r\n\tIClientWSOptions\r\n} from \"./Types\";\r\n\r\n\r\n\r\n\r\n\r\n\r\nfunction eventSwitch(emitter: EventEmitter, cbs: { [eventName: string]: (...args: any[]) => any }): Promise<void> {\r\n\tconst realListeners = new Map<string, (...args: Array<any>) => void>();\r\n\treturn Promise.race(Object.entries(cbs).map(([event, cb]) => {\r\n\t\treturn new Promise<void>((resolve, reject) => {\r\n\t\t\tconst l = (...args: Array<any>) => (async () => cb(...args))().then(resolve, reject);\r\n\t\t\trealListeners.set(event, l);\r\n\t\t\temitter.once(event, l);\r\n\t\t});\r\n\t})).finally(() => {\r\n\t\tfor (const [event, l] of realListeners.entries()) {\r\n\t\t\temitter.removeListener(event, l);\r\n\t\t}\r\n\t});\r\n}\r\n\r\n\r\n\r\n\r\n\r\nclass BetterWs extends EventEmitter<BWSEvents> {\r\n\r\n\tpublic encoding: \"etf\" | \"json\" | \"other\";\r\n\r\n\tpublic compress: boolean;\r\n\r\n\r\n\tprivate _socket: Socket | null = null;\r\n\r\n\tpublic _internal: {\r\n\r\n\t\tclosePromise: Promise<void> | null;\r\n\r\n\t\tcloseTimer: NodeJS.Timeout | null,\r\n\r\n\t\tzlib: Inflate | null;\r\n\t} = {\r\n\t\t\tclosePromise: null,\r\n\t\t\tcloseTimer: null,\r\n\t\t\tzlib: null\r\n\t\t};\r\n\r\n\tprivate _connecting = false;\r\n\r\n\tprivate _lastCloseCode: number | null = null;\r\n\r\n\tprivate _lastCloseReason: string | null = null;\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic constructor(public address: string, public options: Omit<IClientWSOptions, \"encoding\"> & { encoding?: IClientWSOptions[\"encoding\"] | \"other\" }) {\r\n\t\tsuper();\r\n\r\n\t\tthis.encoding = options.encoding ?? \"other\";\r\n\t\tthis.compress = options.compress ?? false;\r\n\t}\r\n\r\n\r\n\r\n\r\n\tpublic get status(): 1 | 2 | 3 | 4 {\r\n\t\tconst internal = this._internal;\r\n\t\tif (this._connecting) return 2;\r\n\t\tif (internal.closePromise) return 3;\r\n\t\tif (!this._socket) return 4;\r\n\t\treturn 1;\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tpublic connect(): Promise<void> {\r\n\t\tif (this._socket || this._connecting) return Promise.resolve(void 0);\r\n\t\tthis._connecting = true;\r\n\t\tconst key = randomBytes(16).toString(\"base64\");\r\n\t\tconst url = new URL(this.address);\r\n\t\tconst useHTTPS = (url.protocol === \"https:\" || url.protocol === \"wss:\") || url.port === \"443\";\r\n\t\tconst port = url.port || (useHTTPS ? \"443\" : \"80\");\r\n\t\tconst req = (useHTTPS ? https : http).request({\r\n\t\t\thostname: url.hostname,\r\n\t\t\tpath: `${url.pathname}${url.search}`,\r\n\t\t\tport: port,\r\n\t\t\theaders: {\r\n\t\t\t\t\"Connection\": \"Upgrade\",\r\n\t\t\t\t\"Upgrade\": \"websocket\",\r\n\t\t\t\t\"Sec-WebSocket-Key\": key,\r\n\t\t\t\t\"Sec-WebSocket-Version\": \"13\",\r\n\t\t\t\t...this.options.headers\r\n\t\t\t}\r\n\t\t});\r\n\t\treq.end();\r\n\t\tthis.emit(\"debug\", \"Socket sending request to upgrade\");\r\n\t\tconst destroyReq = () => {\r\n\t\t\treq.destroy();\r\n\t\t\tif (req.socket && !req.socket.destroyed) req.socket.destroy();\r\n\t\t\tthis._internal.closePromise = this._socket = null;\r\n\t\t}\r\n\t\treturn eventSwitch(req, {\r\n\t\t\tupgrade: (res: http.IncomingMessage, socket: Socket) => {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tthis._onUpgrade(key, res, socket);\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\tdestroyReq();\r\n\t\t\t\t\tthrow e;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\terror: e => {\r\n\t\t\t\tthrow e;\r\n\t\t\t},\r\n\t\t\tresponse: (res: http.ServerResponse) => {\r\n\t\t\t\tdestroyReq();\r\n\t\t\t\tthrow new Error(`Expected HTTP 101 Upgrade, but got ${res.statusCode} ${res.statusMessage}`);\r\n\t\t\t}\r\n\t\t}).finally(() => {\r\n\t\t\tthis._connecting = false;\r\n\t\t});\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic async close(code: number, reason?: string): Promise<void> {\r\n\t\tthis.emit(\"debug\", `Socket attempting to close`);\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\tthis.emit(\"debug\", \"Socket wrote fin packet\");\r\n\t\t}).then(() => {\r\n\t\t\tinternal.closePromise = null;\r\n\t\t});\r\n\r\n\t\tpromise.resolve = resolver;\r\n\t\tinternal.closePromise = promise;\r\n\t\tif (internal.closeTimer) clearTimeout(internal.closeTimer);\r\n\t\tinternal.closeTimer = setTimeout(() => {\r\n\t\t\tthis.emit(\"debug\", \"Server didn't respond for a full close in time\");\r\n\t\t\tthis._onClose();\r\n\t\t}, 5000);\r\n\t\treturn promise;\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic sendMessage(data: any): void {\r\n\t\tif (this.encoding === \"json\") this._write(Buffer.from(JSON.stringify(data)), 1);\r\n\t\telse if (this.encoding === \"etf\") this._write(writeETF(data), 2);\r\n\t\telse if (this.encoding === \"other\") this._write(Buffer.from(data), 2);\r\n\t\tthis.emit(\"ws_send\", data);\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tprivate _write(packet: Buffer, opcode: number): void {\r\n\t\tconst socket = this._socket;\r\n\t\tif (!socket?.writable) return;\r\n\t\tconst length = packet.length;\r\n\t\tlet frame: Buffer | undefined;\r\n\t\tif (length < 126) {\r\n\t\t\tframe = Buffer.allocUnsafe(6 + length);\r\n\t\t\tframe[1] = 128 + length;\r\n\t\t} else if (length < (1 << 16)) {\r\n\t\t\tframe = Buffer.allocUnsafe(8 + length);\r\n\t\t\tframe[1] = 254;\r\n\t\t\tframe[2] = length >> 8;\r\n\t\t\tframe[3] = length & 255;\r\n\t\t} else {\r\n\t\t\tframe = Buffer.allocUnsafe(14 + length);\r\n\t\t\tframe[1] = 255;\r\n\t\t\tframe.writeBigUInt64BE(BigInt(length), 2);\r\n\t\t}\r\n\t\tframe[0] = 128 + opcode;\r\n\t\tframe.writeUInt32BE(0, frame.length - length - 4);\r\n\t\tframe.set(packet, frame.length - length);\r\n\t\tsocket.write(frame);\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tprivate _onUpgrade(key: string, res: http.IncomingMessage, socket: Socket): void {\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(\"error\", \"Failed websocket-key validation\");\r\n\t\t\t});\r\n\t\t\tthrow new Error(`Invalid Sec-Websocket-Accept | expected: ${hash} | received: ${accept}`);\r\n\t\t}\r\n\t\tsocket.once(\"error\", this._onError.bind(this));\r\n\t\tsocket.once(\"close\", this._onClose.bind(this));\r\n\t\tsocket.on(\"readable\", this._onReadable.bind(this));\r\n\t\tthis._socket = socket;\r\n\t\tif (this.compress) {\r\n\t\t\tconst z = createInflate();\r\n\r\n\t\t\tz._c = z.close; z._h = z._handle; z._hc = z._handle.close; z._v = () => void 0;\r\n\t\t\tthis._internal.zlib = z;\r\n\t\t}\r\n\t\tthis.emit(\"ws_open\");\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tprivate _onError(error: Error): void {\r\n\t\tif (!this._socket) return;\r\n\t\tthis.emit(\"error\", util.inspect(error, true, 1, false));\r\n\t\tthis._write(Buffer.allocUnsafe(0), 8);\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tprivate _onClose(): void {\r\n\t\tif (this._internal.closeTimer) clearTimeout(this._internal.closeTimer);\r\n\t\tthis._internal.closeTimer = null;\r\n\t\tconst socket = this._socket;\r\n\t\tconst internal = this._internal;\r\n\t\tthis.emit(\"debug\", \"Socket _onClose called\");\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._socket = null;\r\n\r\n\t\tif (internal.closePromise) {\r\n\r\n\t\t\tinternal.closePromise.resolve(void 0);\r\n\t\t\tthis.emit(\"debug\", \"Socket closePromise resolved\");\r\n\t\t} else this.emit(\"debug\", \"Socket didn't have a closePromise to resolve\");\r\n\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\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}\r\n\r\n\r\n\r\n\r\n\r\n\tprivate _onReadable(): void {\r\n\t\tconst socket = this._socket;\r\n\t\twhile((socket?.readableLength ?? 0) > 1) {\r\n\t\t\tlet length = readRange(socket!, 1, 1) & 127;\r\n\t\t\tlet bytes = 0;\r\n\t\t\tif (length > 125) {\r\n\t\t\t\tbytes = length === 126 ? 2 : 8;\r\n\t\t\t\tif (socket!.readableLength < 2 + bytes) return;\r\n\t\t\t\tlength = readRange(socket!, 2, bytes);\r\n\t\t\t}\r\n\t\t\tconst frame = socket!.read(2 + bytes + length) as Buffer;\r\n\t\t\tif (!frame) return;\r\n\t\t\tconst fin = frame[0] >> 7;\r\n\t\t\tconst opcode = frame[0] & 15;\r\n\t\t\tif (fin !== 1 || opcode === 0) this.emit(\"error\", \"discord actually does send messages with fin=0. if you see this error let me know\");\r\n\t\t\tconst payload = frame.subarray(2 + bytes);\r\n\t\t\tthis._processFrame(opcode, payload);\r\n\t\t}\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tprivate _processFrame(opcode: number, message: Buffer): void {\r\n\t\tconst internal = this._internal;\r\n\t\tswitch (opcode) {\r\n\t\tcase 1: {\r\n\t\t\tlet packet: any;\r\n\t\t\tif (this.encoding === \"json\") packet = JSON.parse(message.toString());\r\n\t\t\telse if (this.encoding === \"other\") packet = message;\r\n\t\t\tthis.emit(\"ws_receive\", packet);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tcase 2: {\r\n\t\t\tlet packet;\r\n\t\t\tif (this.compress) {\r\n\t\t\t\tconst z = internal.zlib;\r\n\t\t\t\tlet error = null;\r\n\t\t\t\tlet data = null;\r\n\r\n\t\t\t\tz.close = z._handle.close = z._v;\r\n\t\t\t\ttry {\r\n\r\n\t\t\t\t\tdata = z._processChunk(message, constants.Z_SYNC_FLUSH);\r\n\t\t\t\t} catch(e) {\r\n\t\t\t\t\terror = e;\r\n\t\t\t\t}\r\n\t\t\t\tconst l = message.length;\r\n\t\t\t\tif (message[l - 4] !== 0 || message[l - 3] !== 0 || message[l - 2] !== 255 || message[l - 1] !== 255) this.emit(\"error\", \"discord actually does send fragmented zlib messages. If you see this error let me know\");\r\n\r\n\t\t\t\tz.close = z._c;\r\n\r\n\t\t\t\tz._handle = z._h;\r\n\r\n\t\t\t\tz._handle.close = z._hc;\r\n\r\n\t\t\t\tz._events.error = void 0;\r\n\r\n\t\t\t\tz._eventCount--;\r\n\t\t\t\tz!.removeAllListeners(\"error\");\r\n\t\t\t\tif (error) {\r\n\t\t\t\t\tthis.emit(\"error\", \"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(\"error\", \"Data from zlib processing was null. If you see this error let me know\");\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tif (this.encoding === \"json\") packet = JSON.parse(String(data));\r\n\t\t\t\telse if (this.encoding === \"etf\") packet = readETF(data, 1);\r\n\t\t\t\telse if (this.encoding === \"other\") packet = data;\r\n\t\t\t} else if (this.encoding === \"json\") packet = JSON.parse(inflateSync(message).toString());\r\n\t\t\telse if (this.encoding === \"etf\") packet = readETF(message, 1);\r\n\t\t\telse if (this.encoding === \"other\") packet = message;\r\n\t\t\tthis.emit(\"ws_receive\", packet);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tcase 8: {\r\n\t\t\tthis._lastCloseCode = message.length > 1 ? (message[0] << 8) + message[1] : 0;\r\n\t\t\tthis._lastCloseReason = message.length > 2 ? message.subarray(2).toString() : \"\";\r\n\t\t\tthis._write(Buffer.from([this._lastCloseCode >> 8, this._lastCloseCode & 255]), 8);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tcase 9: {\r\n\t\t\tthis._write(message, 10);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nfunction readRange(socket: Socket, index: number, bytes: number): number {\r\n\tlet cursor = 0;\r\n\tlet read = 0;\r\n\tlet num = 0;\r\n\r\n\r\n\tconst readable = socket._readableState;\r\n\tlet currentBufferIndex = readable.bufferIndex;\r\n\tlet currentBuffer = readable.buffer.head ?? readable.buffer[currentBufferIndex];\r\n\r\n\tdo {\r\n\t\tconst data = currentBuffer.data ?? currentBuffer;\r\n\t\tfor (const element of data) {\r\n\t\t\tif (++cursor > index) {\r\n\t\t\t\tnum *= 256;\r\n\t\t\t\tnum += element;\r\n\t\t\t\tif (++read === bytes) return num;\r\n\t\t\t}\r\n\t\t}\r\n\t} while((currentBuffer = (currentBuffer.next ?? readable.buffer[++currentBufferIndex])));\r\n\tthrow new Error(\"readRange failed?\");\r\n}\r\n\r\nfunction readETF(data: Buffer, start: number): Record<any, any> | null | undefined {\r\n\tlet view: DataView | undefined;\r\n\tlet x = start;\r\n\tconst loop = () => {\r\n\t\tconst type = data[x++];\r\n\t\tswitch(type) {\r\n\t\tcase 70: {\r\n\t\t\tconst float = data.readDoubleBE(x);\r\n\t\t\tx += 8;\r\n\t\t\treturn float;\r\n\t\t}\r\n\t\tcase 97: {\r\n\t\t\treturn data[x++];\r\n\t\t}\r\n\t\tcase 98: {\r\n\t\t\tconst int = data.readInt32BE(x);\r\n\t\t\tx += 4;\r\n\t\t\treturn int;\r\n\t\t}\r\n\t\tcase 100: {\r\n\t\t\tconst length = data.readUInt16BE(x);\r\n\t\t\tlet atom = \"\";\r\n\t\t\tif (length > 30) {\r\n\r\n\t\t\t\tatom = data.latin1Slice(x += 2, x + length);\r\n\t\t\t} else {\r\n\t\t\t\tfor (let i = x += 2; i < x + length; i++) {\r\n\t\t\t\t\tatom += String.fromCharCode(data[i]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tx += length;\r\n\t\t\tif (!atom) return undefined;\r\n\t\t\tif (atom === \"nil\" || atom === \"null\") return null;\r\n\t\t\tif (atom === \"true\") return true;\r\n\t\t\tif (atom === \"false\") return false;\r\n\t\t\treturn atom;\r\n\t\t}\r\n\t\tcase 108: case 106: {\r\n\t\t\tconst array = [] as Array<any>;\r\n\t\t\tif (type === 108) {\r\n\t\t\t\tconst length = data.readUInt32BE(x);\r\n\t\t\t\tx += 4;\r\n\t\t\t\tfor (let i = 0; i < length; i++) {\r\n\t\t\t\t\tarray.push(loop());\r\n\t\t\t\t}\r\n\t\t\t\tx++;\r\n\t\t\t}\r\n\t\t\treturn array;\r\n\t\t}\r\n\t\tcase 107: {\r\n\t\t\tconst array = [] as Array<number>;\r\n\t\t\tconst length = data.readUInt16BE(x);\r\n\t\t\tx += 2;\r\n\t\t\tfor (let i = 0; i < length; i++) {\r\n\t\t\t\tarray.push(data[x++]);\r\n\t\t\t}\r\n\t\t\treturn array;\r\n\t\t}\r\n\t\tcase 109: {\r\n\t\t\tconst length = data.readUInt32BE(x);\r\n\t\t\tlet str = \"\";\r\n\t\t\tif (length > 30) {\r\n\r\n\t\t\t\tstr = data.utf8Slice(x += 4, x + length);\r\n\t\t\t} else {\r\n\t\t\t\tlet i = x += 4;\r\n\t\t\t\tconst l = x + length;\r\n\t\t\t\twhile(i < l) {\r\n\t\t\t\t\tconst byte = data[i++];\r\n\t\t\t\t\tif (byte < 128) str += String.fromCharCode(byte);\r\n\t\t\t\t\telse if (byte < 224) str += String.fromCharCode(((byte & 31) << 6) + (data[i++] & 63));\r\n\t\t\t\t\telse if (byte < 240) str += String.fromCharCode(((byte & 15) << 12) + ((data[i++] & 63) << 6) + (data[i++] & 63));\r\n\t\t\t\t\telse str += String.fromCodePoint(((byte & 7) << 18) + ((data[i++] & 63) << 12) + ((data[i++] & 63) << 6) + (data[i++] & 63));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tx += length;\r\n\t\t\treturn str;\r\n\t\t}\r\n\t\tcase 110: {\r\n\r\n\t\t\tif (!view) view = new DataView(data.buffer, data.offset, data.byteLength);\r\n\t\t\tconst length = data[x++];\r\n\t\t\tconst sign = data[x++];\r\n\t\t\tlet left = length;\r\n\t\t\tlet num = BigInt(0);\r\n\t\t\twhile(left > 0) {\r\n\t\t\t\tif (left >= 8) {\r\n\t\t\t\t\tnum <<= BigInt(64);\r\n\t\t\t\t\tnum += view.getBigUint64(x + (left -= 8), true);\r\n\t\t\t\t} else if (left >= 4) {\r\n\t\t\t\t\tnum <<= BigInt(32);\r\n\r\n\t\t\t\t\tnum += BigInt(view.getUint32(x + (left -= 4)), true);\r\n\t\t\t\t} else if (left >= 2) {\r\n\t\t\t\t\tnum <<= BigInt(16);\r\n\r\n\t\t\t\t\tnum += BigInt(view.getUint16(x + (left -= 2)), true);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tnum <<= BigInt(8);\r\n\t\t\t\t\tnum += BigInt(data[x]);\r\n\t\t\t\t\tleft--;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tx += length;\r\n\t\t\treturn (sign ? -num : num).toString();\r\n\t\t}\r\n\t\tcase 116: {\r\n\t\t\tconst obj = {};\r\n\t\t\tconst length = data.readUInt32BE(x);\r\n\t\t\tx += 4;\r\n\t\t\tfor(let i = 0; i < length; i++) {\r\n\t\t\t\tconst key = loop();\r\n\r\n\t\t\t\tobj[key] = loop();\r\n\t\t\t}\r\n\t\t\treturn obj;\r\n\t\t}\r\n\t\t}\r\n\t\tthrow new Error(`Missing etf type: ${type}`);\r\n\t};\r\n\treturn loop();\r\n}\r\n\r\nfunction writeETF(data: any): Buffer {\r\n\tconst b = Buffer.allocUnsafe(1 << 12);\r\n\tb[0] = 131;\r\n\tlet i = 1;\r\n\tconst loop = (obj: any) => {\r\n\t\tconst type = typeof obj;\r\n\t\tswitch(type) {\r\n\t\tcase \"boolean\": {\r\n\t\t\tb[i++] = 100;\r\n\t\t\tif (obj) {\r\n\t\t\t\tb.writeUInt16BE(4, i);\r\n\r\n\t\t\t\tb.latin1Write(\"true\", i += 2);\r\n\t\t\t\ti += 4;\r\n\t\t\t} else {\r\n\t\t\t\tb.writeUInt16BE(5, i);\r\n\r\n\t\t\t\tb.latin1Write(\"false\", i += 2);\r\n\t\t\t\ti += 5;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tcase \"string\": {\r\n\t\t\tconst length = Buffer.byteLength(obj);\r\n\t\t\tb[i++] = 109;\r\n\t\t\tb.writeUInt32BE(length, i);\r\n\r\n\t\t\tb.utf8Write(obj, i += 4);\r\n\t\t\ti += length;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tcase \"number\": {\r\n\t\t\tif (Number.isInteger(obj)) {\r\n\t\t\t\tconst abs = Math.abs(obj);\r\n\t\t\t\tif (abs < 2147483648) {\r\n\t\t\t\t\tb[i++] = 98;\r\n\t\t\t\t\tb.writeInt32BE(obj, i);\r\n\t\t\t\t\ti += 4;\r\n\t\t\t\t} else if (abs < Number.MAX_SAFE_INTEGER) {\r\n\t\t\t\t\tb[i++] = 110;\r\n\t\t\t\t\tb[i++] = 8;\r\n\t\t\t\t\tb[i++] = Number(obj < 0);\r\n\t\t\t\t\tb.writeBigUInt64LE(BigInt(abs), i);\r\n\t\t\t\t\ti += 8;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tb[i++] = 70;\r\n\t\t\t\t\tb.writeDoubleBE(obj, i);\r\n\t\t\t\t\ti += 8;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tb[i++] = 70;\r\n\t\t\t\tb.writeDoubleBE(obj, i);\r\n\t\t\t\ti += 8;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tcase \"bigint\": {\r\n\t\t\tb[i++] = 110;\r\n\t\t\tb[i++] = 8;\r\n\t\t\tb[i++] = Number(obj < 0);\r\n\t\t\tb.writeBigUInt64LE(obj, i);\r\n\t\t\ti += 8;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tcase \"object\": {\r\n\t\t\tif (obj === null) {\r\n\t\t\t\tb[i++] = 100;\r\n\t\t\t\tb.writeUInt16BE(3, i);\r\n\r\n\t\t\t\tb.latin1Write(\"nil\", i += 2);\r\n\t\t\t\ti += 3;\r\n\t\t\t} else if (Array.isArray(obj)) {\r\n\t\t\t\tif (obj.length) {\r\n\t\t\t\t\tb[i++] = 108;\r\n\t\t\t\t\tb.writeUInt32BE(obj.length, i);\r\n\t\t\t\t\ti += 4;\r\n\t\t\t\t\tfor (const item of obj) {\r\n\t\t\t\t\t\tloop(item);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tb[i++] = 106;\r\n\t\t\t} else {\r\n\t\t\t\tconst entries = Object.entries(obj).filter(x => typeof x[1] !== \"undefined\");\r\n\t\t\t\tb[i++] = 116;\r\n\t\t\t\tb.writeUInt32BE(entries.length, i);\r\n\t\t\t\ti += 4;\r\n\t\t\t\tfor(const [key, value] of entries) {\r\n\t\t\t\t\tloop(key);\r\n\t\t\t\t\tloop(value);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\t}\r\n\t};\r\n\tloop(data);\r\n\treturn Buffer.from(b.subarray(0, i));\r\n}\r\n\r\n\r\nexport = BetterWs;\r\n","\"use strict\";\r\n\r\nexport type IntentFlags = typeof flags;\r\nexport type IntentResolvable = number | Array<number> | keyof IntentFlags | Array<keyof IntentFlags>;\r\n\r\n\r\n\r\n\r\nexport const flags = {\r\n\tGUILDS: 1 << 0,\r\n\tGUILD_MEMBERS: 1 << 1,\r\n\tGUILD_MODERATION: 1 << 2,\r\n\tGUILD_EMOJIS_AND_STICKERS: 1 << 3,\r\n\tGUILD_INTEGRATIONS: 1 << 4,\r\n\tGUILD_WEBHOOKS: 1 << 5,\r\n\tGUILD_INVITES: 1 << 6,\r\n\tGUILD_VOICE_STATES: 1 << 7,\r\n\tGUILD_PRESENCES: 1 << 8,\r\n\tGUILD_MESSAGES: 1 << 9,\r\n\tGUILD_MESSAGE_REACTIONS: 1 << 10,\r\n\tGUILD_MESSAGE_TYPING: 1 << 11,\r\n\tDIRECT_MESSAGES: 1 << 12,\r\n\tDIRECT_MESSAGE_REACTIONS: 1 << 13,\r\n\tDIRECT_MESSAGE_TYPING: 1 << 14,\r\n\tMESSAGE_CONTENT: 1 << 15,\r\n\tGUILD_SCHEDULED_EVENTS: 1 << 16,\r\n\tAUTO_MODERATION_CONFIGURATION: 1 << 20,\r\n\tAUTO_MODERATION_EXECUTION: 1 << 21,\r\n\tGUILD_MESSAGE_POLLS: 1 << 24,\r\n\tDIRECT_MESSAGE_POLLS: 1 << 25\r\n};\r\n\r\n\r\nexport const privileged = flags.GUILD_MEMBERS | flags.GUILD_PRESENCES | flags.MESSAGE_CONTENT;\r\n\r\nexport const all = Object.values(flags).reduce((acc, p) => acc | p, 0);\r\n\r\nexport const non_privileged = all & ~privileged;\r\n\r\n\r\n\r\n\r\n\r\n\r\nexport function resolve(bit: IntentResolvable = 0): number {\r\n\tif (typeof bit === \"number\" && bit >= 0) return bit;\r\n\tif (typeof bit === \"string\" && flags[bit]) return flags[bit] | 0;\r\n\tif (Array.isArray(bit)) return bit.map((p: IntentResolvable) => resolve(p)).reduce((prev, p) => prev | p, 0);\r\n\tthrow new RangeError(\"BITFIELD_INVALID\");\r\n}\r\n\r\nexport default { flags, privileged, all, non_privileged, resolve };\r\n","\"use strict\";\r\n\r\nimport { EventEmitter } from \"events\";\r\nimport BetterWs = require(\"./BetterWs\");\r\nimport { GATEWAY_OP_CODES as OP, GATEWAY_VERSION } from \"./Constants\";\r\nimport Intents = require(\"./Intents\");\r\n\r\nimport { LocalBucket } from \"snowtransfer\";\r\n\r\nimport {\r\n\ttype GatewayReceivePayload,\r\n\ttype GatewayIdentify,\r\n\ttype GatewayPresenceUpdateData,\r\n\ttype GatewayVoiceStateUpdateData,\r\n\ttype GatewayRequestGuildMembersData,\r\n\ttype GatewayRequestGuildMembersDataWithQuery,\r\n\ttype GatewayRequestGuildMembersDataWithUserIds,\r\n\ttype GatewaySendPayload,\r\n\r\n\tPresenceUpdateStatus\r\n} from \"discord-api-types/v10\";\r\n\r\nimport type {\r\n\tConnectorEvents,\r\n\tClientEvents,\r\n\tIClientOptions,\r\n\tIGatewayMessage,\r\n\tIGatewayDispatch\r\n} from \"./Types\";\r\n\r\nconst resumableCodes = [4008, 4005, 4003, 4002, 4001, 4000, 1006, 1001];\r\nconst shouldntAttemptReconnectCodes = [4014, 4013, 4012, 4011, 4010, 4004];\r\nconst disconnectMessages = {\r\n\t4014: \"Disallowed Intents, check your client options and application page.\",\r\n\t4013: \"Invalid Intents data, check your client options.\",\r\n\t4012: \"Invalid API version.\",\r\n\t4011: \"Shard would be on over 2500 guilds. Add more shards.\",\r\n\t4010: \"Invalid sharding data, check your client options.\",\r\n\t4009: \"Session timed out.\",\r\n\t4008: \"You are being rate limited. Wait before sending more packets.\",\r\n\t4007: \"Invalid sequence. Reconnecting and starting a new session.\",\r\n\t4005: \"You sent more than one OP 2 IDENTIFY payload while the websocket was open.\",\r\n\t4004: \"Tried to connect with an invalid token.\",\r\n\t4003: \"You tried to send a packet before sending an OP 2 IDENTIFY or OP 6 RESUME.\",\r\n\t4002: \"You sent an invalid payload.\",\r\n\t4001: \"You sent an invalid opcode or invalid payload for an opcode.\"\r\n};\r\n\r\nconst wsStatusTypes = [\"Whatever 0 is. Report if you see this\", \"connected\", \"connecting\", \"closing\", \"closed\"];\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nclass DiscordConnector extends EventEmitter<ConnectorEvents> {\r\n\r\n\tpublic options: DiscordConnector[\"client\"][\"options\"];\r\n\r\n\tpublic betterWs: BetterWs;\r\n\r\n\tpublic heartbeatTimeout: NodeJS.Timeout | null = null;\r\n\r\n\tpublic heartbeatInterval = 0;\r\n\r\n\tpublic _trace: string | null = null;\r\n\r\n\tpublic seq = 0;\r\n\r\n\tpublic status: \"connecting\" | \"identifying\" | \"resuming\" | \"ready\" | \"disconnected\" = \"disconnected\";\r\n\r\n\tpublic sessionId: string | null = null;\r\n\r\n\tpublic lastACKAt = 0;\r\n\r\n\tpublic lastHeartbeatSend = 0;\r\n\r\n\tpublic latency = 0;\r\n\r\n\tpublic identifyAddress: string;\r\n\r\n\tpublic resumeAddress: string | null = null;\r\n\r\n\tpublic reconnecting = false;\r\n\r\n\tpublic wsBucket = new LocalBucket(120, 60000);\r\n\r\n\tpublic presenceBucket = new LocalBucket(5, 60000);\r\n\r\n\r\n\tprivate _closing = false;\r\n\r\n\tprivate _closeCalled = false;\r\n\r\n\tprivate _openToHeartbeatTimeout: NodeJS.Timeout | null = null;\r\n\r\n\tprivate _initialHeartbeatTimeout: NodeJS.Timeout | null = null;\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic constructor(public id: number, public client: EventEmitter<ClientEvents> & { options: Omit<IClientOptions, \"snowtransferInstance\"> & { token: string; endpoint?: string; } }) {\r\n\t\tsuper();\r\n\r\n\t\tthis.options = client.options;\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(\"debug\", `Shard ${this.id} ${event}`));\r\n\t\tthis.betterWs.on(\"error\", event => this.client.emit(\"error\", event));\r\n\t\tthis.betterWs.on(\"ws_send\", data => this.client.emit(\"rawSend\", data));\r\n\r\n\t\tthis.wsBucket.queue.setBlocked(true);\r\n\t\tthis.presenceBucket.queue.setBlocked(true);\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tpublic async connect(): Promise<void> {\r\n\t\tthis._closing = false;\r\n\t\tthis._closeCalled = false;\r\n\t\tthis.client.emit(\"debug\", `Shard ${this.id} connecting to gateway`);\r\n\r\n\t\treturn this.betterWs.connect()\r\n\t\t\t.catch(() => {\r\n\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\tif (!this._closeCalled) this.connect();\r\n\t\t\t\t}, 5000);\r\n\t\t\t});\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tpublic async disconnect(): Promise<void> {\r\n\t\tthis._closing = true;\r\n\t\tthis._closeCalled = true;\r\n\t\tthis.wsBucket.queue.setBlocked(true);\r\n\t\tthis.presenceBucket.queue.setBlocked(true);\r\n\t\treturn this.betterWs.close(1000, \"Disconnected by User\");\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tprivate async messageAction(message: GatewayReceivePayload): Promise<void> {\r\n\t\tthis.client.emit(\"rawReceive\", message);\r\n\t\tconst withShardID: 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\tthis._reconnect(true);\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\tif (this.sessionId) return void this.resume();\r\n\t\t\telse this.emit(\"queueIdentify\", this.id);\r\n\t\t\tbreak;\r\n\r\n\t\tcase OP.HEARTBEAT_ACK:\r\n\t\t\tthis.lastACKAt = Date.now();\r\n\t\t\tthis.latency = this.lastACKAt - this.lastHeartbeatSend;\r\n\t\t\tbreak;\r\n\r\n\t\tdefault:\r\n\t\t\tvoid 0;\r\n\t\t}\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tprivate async _reconnect(resume = false): Promise<void> {\r\n\t\tthis.reconnecting = resume;\r\n\t\tthis.wsBucket.queue.setBlocked(true);\r\n\t\tthis.presenceBucket.queue.setBlocked(true);\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}\r\n\r\n\r\n\r\n\r\n\r\n\tprivate reset(): void {\r\n\t\tthis.sessionId = null;\r\n\t\tthis.seq = 0;\r\n\t\tthis.lastACKAt = 0;\r\n\t\tthis._trace = null;\r\n\t\tthis.clearHeartBeat();\r\n\t}\r\n\r\n\r\n\r\n\r\n\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\tthis._reconnect(true);\r\n\t\t\t} else this.heartbeat();\r\n\t\t}, this.heartbeatInterval);\r\n\t}\r\n\r\n\r\n\r\n\r\n\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\r\n\r\n\r\n\r\n\tpublic async identify(): Promise<void> {\r\n\t\tif (this.betterWs.status !== 1) {\r\n\t\t\tthis.client.emit(\"error\", `Shard ${this.id} was attempting to identify when the ws was not open. Was ${wsStatusTypes[this.betterWs.status]}`);\r\n\t\t\treturn this._reconnect(true);\r\n\t\t}\r\n\t\tthis.client.emit(\"debug\", `Shard ${this.id} is identifying`);\r\n\r\n\t\tthis.status = \"identifying\";\r\n\t\tthis.emit(\"stateChange\", \"identifying\");\r\n\r\n\t\tconst data = {\r\n\t\t\top: OP.IDENTIFY,\r\n\t\t\td: {\r\n\t\t\t\ttoken: this.options.token,\r\n\t\t\t\tproperties: {\r\n\t\t\t\t\tos: process.platform,\r\n\t\t\t\t\tbrowser: \"CloudStorm\",\r\n\t\t\t\t\tdevice: \"CloudStorm\"\r\n\t\t\t\t},\r\n\t\t\t\tlarge_threshold: this.options.largeGuildThreshold,\r\n\t\t\t\tshard: [this.id, this.options.totalShards ?? 1],\r\n\t\t\t\tintents: this.options.intents ? Intents.resolve(this.options.intents) : 0\r\n\t\t\t}\r\n\t\t} as GatewayIdentify;\r\n\r\n\t\tif (this.options.initialPresence) data.d.presence = this._checkPresenceData(this.options.initialPresence);\r\n\t\treturn this.betterWs.sendMessage(data);\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tpublic async resume(): Promise<void> {\r\n\t\tif (this.betterWs.status !== 1) {\r\n\t\t\tthis.client.emit(\"error\", `Shard ${this.id} was attempting to resume when the ws was not open. Was ${wsStatusTypes[this.betterWs.status]}`);\r\n\t\t\treturn this._reconnect(true);\r\n\t\t}\r\n\t\tthis.client.emit(\"debug\", `Shard ${this.id} is resuming`);\r\n\r\n\t\tthis.status = \"resuming\";\r\n\t\tthis.emit(\"stateChange\", \"resuming\");\r\n\r\n\t\treturn this.betterWs.sendMessage({\r\n\t\t\top: OP.RESUME,\r\n\t\t\td: { seq: this.seq, token: this.options.token, session_id: this.sessionId! }\r\n\t\t});\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tprivate heartbeat(): void {\r\n\t\tif (this.betterWs.status !== 1) {\r\n\t\t\tthis.client.emit(\"error\", `Shard ${this.id} was attempting to heartbeat when the ws was not open. Was ${wsStatusTypes[this.betterWs.status]}`);\r\n\t\t\treturn void this._reconnect(true);\r\n\t\t}\r\n\t\tthis.betterWs.sendMessage({ op: OP.HEARTBEAT, d: this.seq === 0 ? null : this.seq });\r\n\t\tthis.lastHeartbeatSend = Date.now();\r\n\t\tif (this._initialHeartbeatTimeout) {\r\n\t\t\tclearTimeout(this._initialHeartbeatTimeout);\r\n\t\t\tthis._initialHeartbeatTimeout = null;\r\n\t\t}\r\n\t\tif (!this.heartbeatTimeout) this.setHeartBeat();\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tprivate handleDispatch(message: IGatewayDispatch): void {\r\n\t\tthis.client.emit(\"dispatch\", message);\r\n\r\n\t\tif (message.s) {\r\n\t\t\tif (message.s > this.seq + 1) {\r\n\t\t\t\tthis.client.emit(\"debug\", `Shard ${this.id} invalid sequence: { current: ${this.seq} message: ${message.s} }`);\r\n\t\t\t\tthis.seq = message.s;\r\n\t\t\t\tthis.resume();\r\n\t\t\t}\r\n\t\t\tthis.seq = message.s;\r\n\t\t}\r\n\t\tswitch (message.t) {\r\n\t\tcase \"READY\":\r\n\t\tcase \"RESUMED\":\r\n\t\t\tif (message.t === \"READY\") {\r\n\t\t\t\tif (message.d.resume_gateway_url) this.resumeAddress = `${message.d.resume_gateway_url}?v=${GATEWAY_VERSION}&encoding=${this.options.ws?.encoding === \"etf\" ? \"etf\" : \"json\"}${this.options.ws?.compress ? \"&compress=zlib-stream\" : \"\"}`;\r\n\t\t\t\tthis.sessionId = message.d.session_id;\r\n\t\t\t}\r\n\t\t\tthis.status = \"ready\";\r\n\t\t\tthis.emit(\"stateChange\", \"ready\");\r\n\t\t\tthis._trace = (message.d as unknown as { _trace: string })._trace;\r\n\t\t\tthis.emit(\"ready\", message.t === \"RESUMED\");\r\n\t\t\tthis.wsBucket.queue.setBlocked(false);\r\n\t\t\tthis.presenceBucket.queue.setBlocked(false);\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\tvoid 0;\r\n\t\t}\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\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\t\tthis.wsBucket.queue.setBlocked(true);\r\n\t\tthis.presenceBucket.queue.setBlocked(true);\r\n\r\n\t\tconst isManualClose = code === 1000 && this._closing;\r\n\r\n\t\tconst message = disconnectMessages[code as keyof typeof disconnectMessages];\r\n\t\tconst isRecoverable = resumableCodes.includes(code);\r\n\t\tconst shouldntReconnect = shouldntAttemptReconnectCodes.includes(code) || isManualClose;\r\n\r\n\t\tif (isRecoverable && this.resumeAddress) this.betterWs.address = this.resumeAddress;\r\n\t\telse this.betterWs.address = this.identifyAddress;\r\n\r\n\t\tif (message) this.client.emit(\"error\", message);\r\n\r\n\t\tif (isManualClose || this.reconnecting) gracefulClose = true;\r\n\r\n\t\tthis._closing = false;\r\n\r\n\t\tthis.emit(\"disconnect\", code, reason, gracefulClose);\r\n\r\n\t\tif (!shouldntReconnect) this.connect();\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic async presenceUpdate(data: Partial<GatewayPresenceUpdateData>): Promise<void> {\r\n\t\treturn this.sendMessage({ op: OP.PRESENCE_UPDATE, d: this._checkPresenceData(data) });\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic async voiceStateUpdate(data: GatewayVoiceStateUpdateData & { self_deaf?: boolean; self_mute?: boolean; }): Promise<void> {\r\n\t\tif (!data) return Promise.resolve();\r\n\t\treturn this.sendMessage({ op: OP.VOICE_STATE_UPDATE, d: this._checkVoiceStateUpdateData(data) });\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic async requestGuildMembers(data: GatewayRequestGuildMembersData & { limit?: number; }): Promise<void> {\r\n\t\treturn this.sendMessage({ op: OP.REQUEST_GUILD_MEMBERS, d: this._checkRequestGuildMembersData(data) });\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic async sendMessage(data: GatewaySendPayload): Promise<void> {\r\n\t\tconst presence = data.op === OP.PRESENCE_UPDATE;\r\n\t\tconst bypass = this.options.ws!.bypassBuckets;\r\n\t\treturn new Promise<void>(res => {\r\n\t\t\tconst sendMsg = () => {\r\n\t\t\t\tconst fn = () => {\r\n\t\t\t\t\tthis.betterWs.sendMessage(data);\r\n\t\t\t\t\tres(void 0);\r\n\t\t\t\t};\r\n\t\t\t\tif (bypass) fn();\r\n\t\t\t\telse this.wsBucket.enqueue(fn);\r\n\t\t\t};\r\n\t\t\tif (presence && !bypass) this.presenceBucket.enqueue(sendMsg);\r\n\t\t\telse sendMsg();\r\n\t\t});\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tprivate _checkPresenceData(data: Parameters<DiscordConnector[\"presenceUpdate\"]>[\"0\"]): GatewayPresenceUpdateData {\r\n\t\tdata.status = data.status ?? PresenceUpdateStatus.Online;\r\n\t\tdata.activities = data.activities && Array.isArray(data.activities) ? data.activities : [];\r\n\r\n\t\tif (data.activities) {\r\n\t\t\tfor (const activity of data.activities) {\r\n\t\t\t\tconst index = data.activities.indexOf(activity);\r\n\t\t\t\tif (activity.type === undefined) activity.type = activity.url ? 1 : 0;\r\n\t\t\t\tif (!activity.name) {\r\n\t\t\t\t\tif (activity.state && activity.type === 4) activity.name = \"Custom Status\";\r\n\t\t\t\t\telse data.activities.splice(index, 1);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tdata.afk = data.afk ?? false;\r\n\t\tdata.since = data.since ?? Date.now();\r\n\t\treturn data as GatewayPresenceUpdateData;\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tprivate _checkVoiceStateUpdateData(data: Parameters<DiscordConnector[\"voiceStateUpdate\"]>[\"0\"]): GatewayVoiceStateUpdateData {\r\n\t\tdata.channel_id = data.channel_id ?? null;\r\n\t\tdata.self_mute = data.self_mute ?? false;\r\n\t\tdata.self_deaf = data.self_deaf ?? false;\r\n\t\treturn data;\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tprivate _checkRequestGuildMembersData(data: Parameters<DiscordConnector[\"requestGuildMembers\"]>[\"0\"]): GatewayRequestGuildMembersData {\r\n\t\tconst withQuery = data as GatewayRequestGuildMembersDataWithQuery;\r\n\t\tconst withUserIDs = data as GatewayRequestGuildMembersDataWithUserIds;\r\n\t\tif (!withQuery.query && !withUserIDs.user_ids) withQuery.query = \"\";\r\n\t\tif (withQuery.query && withUserIDs.user_ids) delete (data as { query?: string; }).query;\r\n\t\tdata.limit = data.limit ?? 10;\r\n\t\treturn data;\r\n\t}\r\n}\r\n\r\nexport = DiscordConnector;\r\n","\"use strict\";\r\n\r\nimport { EventEmitter } from \"events\";\r\nimport DC = require(\"./DiscordConnector\");\r\n\r\nimport type {\r\n\tShardEvents,\r\n\tClientEvents,\r\n\tIClientOptions\r\n} from \"./Types\"\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nclass Shard extends EventEmitter<ShardEvents> {\r\n\r\n\tpublic ready = false;\r\n\r\n\tpublic connector: DC;\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic constructor(public id: number, public client: EventEmitter<ClientEvents> & { options: Omit<IClientOptions, \"snowtransferInstance\"> & { token: string; endpoint?: string; } }) {\r\n\t\tsuper();\r\n\r\n\t\tthis.connector = new DC(id, client);\r\n\t\tthis.connector.on(\"disconnect\", (...args) => {\r\n\t\t\tthis.ready = false;\r\n\t\t\tthis.emit(\"disconnect\", ...args);\r\n\t\t});\r\n\t\tthis.connector.on(\"ready\", resume => this.emit(\"ready\", resume));\r\n\t\tthis.connector.on(\"queueIdentify\", () => this.emit(\"queueIdentify\", this.id));\r\n\t}\r\n\r\n\r\n\r\n\r\n\tpublic get latency(): number {\r\n\t\treturn this.connector.latency;\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tpublic connect(): void {\r\n\t\tthis.connector.connect();\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tpublic disconnect(): Promise<void> {\r\n\t\treturn this.connector.disconnect();\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic presenceUpdate(data: Parameters<Shard[\"connector\"][\"presenceUpdate\"]>[\"0\"]): Promise<void> {\r\n\t\treturn this.connector.presenceUpdate(data);\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic voiceStateUpdate(data: Parameters<Shard[\"connector\"][\"voiceStateUpdate\"]>[\"0\"]): Promise<void> {\r\n\t\treturn this.connector.voiceStateUpdate(data);\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\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 type { EventEmitter } from \"events\";\r\n\r\nimport Shard = require(\"./Shard\");\r\nimport { LocalBucket } from \"snowtransfer\";\r\n\r\nimport {\r\n\tIClientOptions,\r\n\tClientEvents\r\n} from \"./Types\";\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nclass ShardManager {\r\n\r\n\tpublic options: ShardManager[\"client\"][\"options\"];\r\n\r\n\tpublic shards: Record<string, Shard> = {};\r\n\r\n\tpublic identifyBucket = new LocalBucket(1000, 1000 * 60 * 60 * 24);\r\n\r\n\tpublic concurrencyBuckets: Record<string, LocalBucket> = {};\r\n\r\n\r\n\r\n\r\n\tpublic constructor(public client: EventEmitter<ClientEvents> & { options: Omit<IClientOptions, \"snowtransferInstance\"> & { token: string; endpoint?: string; } }) {\r\n\t\tthis.options = client.options;\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tpublic spawn(): void {\r\n\t\tif (!Object.keys(this.concurrencyBuckets).length) throw new Error(\"Trying to spawn shards without calling Client.connect()\");\r\n\t\tfor (const id of (this.options.shards === \"auto\" ? Array(this.options.totalShards).fill(0).map((_, index) => index) : this.options.shards ?? [0])) {\r\n\t\t\tthis.client.emit(\"debug\", `Spawned shard ${id}`);\r\n\t\t\tthis.shards[id] = new Shard(id, this.client);\r\n\t\t\tthis._addListener(this.shards[id]);\r\n\t\t\tthis.shards[id].connector.connect();\r\n\t\t}\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tpublic disconnect(): void {\r\n\t\tfor (const shardKey in this.shards) {\r\n\t\t\tthis.shards[shardKey].disconnect();\r\n\t\t}\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\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\tthis.client.emit(\"debug\", `Shard ${shardId} is ready to identify`);\r\n\t\t\tthis.identifyBucket.enqueue(() => {\r\n\t\t\t\tconst max_concurrency = Object.keys(this.concurrencyBuckets!).length;\r\n\t\t\t\tconst concurrencyRoute = shardId % max_concurrency;\r\n\t\t\t\tconst bkt = this.concurrencyBuckets[concurrencyRoute];\r\n\t\t\t\tif (!bkt) return this.client.emit(\"error\", `Received a queueIdentify event for shard ${shardId} and a concurrency route of ${concurrencyRoute} with a max_concurrency of ${max_concurrency}, but there was no bucket with that route internally.`);\r\n\t\t\t\tbkt.enqueue(() => {\r\n\t\t\t\t\tshard.connector.identify();\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t});\r\n\t\tshard.on(\"disconnect\", (code, reason, gracefulClose) => {\r\n\t\t\tthis.client.emit(\"debug\", `Websocket of shard ${shard.id} closed with code ${code} and reason: ${reason ?? \"None\"}`);\r\n\t\t\tif (code === 1000 && gracefulClose) return this._checkDisconnect();\r\n\t\t});\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tprivate _checkReady(): void {\r\n\t\tfor (const shardId in this.shards) {\r\n\t\t\tif (this.shards[shardId]) {\r\n\t\t\t\tif (!this.shards[shardId].ready) return;\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.client.emit(\"ready\");\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tprivate _checkDisconnect(): void {\r\n\t\tfor (const shardId in this.shards) {\r\n\t\t\tif (this.shards[shardId]) {\r\n\t\t\t\tif (this.shards[shardId].connector.status !== \"disconnected\") return;\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.client.emit(\"disconnected\");\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic async presenceUpdate(data: Parameters<Shard[\"presenceUpdate\"]>[\"0\"]): Promise<void> {\r\n\t\tfor (const shardKey in this.shards) {\r\n\t\t\tif (this.shards[shardKey]) {\r\n\t\t\t\tconst shard = this.shards[shardKey];\r\n\t\t\t\tthis.shardPresenceUpdate(shard.id, data);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\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 as Error));\r\n\t\t});\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic voiceStateUpdate(shardId: number, data: Parameters<Shard[\"voiceStateUpdate\"]>[\"0\"]): Promise<void> {\r\n\t\treturn new Promise((res, rej) => {\r\n\t\t\tconst shard = this.shards[shardId];\r\n\t\t\tif (!shard) rej(new Error(`Shard ${shardId} does not exist`));\r\n\t\t\tif (!shard.ready) return;\r\n\t\t\tshard.voiceStateUpdate(data).then(result => res(result)).catch(e => rej(e as Error));\r\n\t\t});\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic requestGuildMembers(shardId: number, data: Parameters<Shard[\"requestGuildMembers\"]>[\"0\"]): Promise<void> {\r\n\t\treturn new Promise((res, rej) => {\r\n\t\t\tconst shard = this.shards[shardId];\r\n\t\t\tif (!shard) rej(new Error(`Shard ${shardId} does not exist`));\r\n\t\t\tif (!shard.ready) return;\r\n\t\t\tshard.requestGuildMembers(data).then(result => res(result)).catch(e => rej(e as Error));\r\n\t\t});\r\n\t}\r\n}\r\n\r\nexport = ShardManager;\r\n","\"use strict\";\r\n\r\nimport fs = require(\"fs\");\r\nimport path = require(\"path\");\r\n\r\nconst version = JSON.parse(fs.readFileSync(path.join(__dirname, \"../package.json\"), { encoding: \"utf8\" })).version as string;\r\nimport { EventEmitter } from \"events\";\r\nimport Constants = require(\"./Constants\");\r\nimport { SnowTransfer, LocalBucket } from \"snowtransfer\";\r\nimport ShardManager = require(\"./ShardManager\");\r\nimport type { APIGatewayBotInfo } from \"discord-api-types/v10\";\r\n\r\nimport type {\r\n\tClientEvents,\r\n\tIClientOptions\r\n} from \"./Types\";\r\n\r\n\r\n\r\n\r\n\r\nclass Client extends EventEmitter<ClientEvents> {\r\n\r\n\tpublic token: string;\r\n\r\n\tpublic options: Omit<IClientOptions, \"snowtransferInstance\"> & { token: string; endpoint?: string; };\r\n\r\n\tpublic shardManager: ShardManager;\r\n\r\n\tpublic version = version;\r\n\r\n\tprivate readonly _restClient: SnowTransfer;\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic constructor(token: string, options: 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\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\tif (options.ws) Object.assign(this.options.ws!, options.ws);\r\n\t\tdelete options.ws;\r\n\t\tObject.assign(this.options, options);\r\n\t\tthis.options.token = token;\r\n\t\tthis.shardManager = new ShardManager(this);\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic async connect(): Promise<void> {\r\n\t\tconst initial = await this.fetchConnectInfo();\r\n\t\tif (this.options.shards === \"auto\") this.options.totalShards = initial;\r\n\t\tthis.shardManager.spawn();\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\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\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\tthis.shardManager.identifyBucket.makeResetTimeout(this.shardManager.identifyBucket.reset);\r\n\t\tif (this.shardManager.identifyBucket.queue.blocked && this.shardManager.identifyBucket.remaining) this.shardManager.identifyBucket.queue.setBlocked(false);\r\n\t\tfor (const route of Object.keys(this.shardManager.concurrencyBuckets)) {\r\n\t\t\tdelete this.shardManager.concurrencyBuckets[route];\r\n\t\t}\r\n\t\tfor (let i = 0; i < gateway.session_start_limit.max_concurrency; i++) {\r\n\t\t\tthis.shardManager.concurrencyBuckets[i] = new LocalBucket(1, 5000);\r\n\t\t}\r\n\t\treturn gateway.shards;\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic async getGateway(): Promise<string> {\r\n\t\tconst gatewayData = await this._restClient.bot.getGateway();\r\n\t\treturn gatewayData.url;\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic async getGatewayBot(): Promise<APIGatewayBotInfo> {\r\n\t\treturn this._restClient.bot.getGatewayBot();\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic disconnect(): void {\r\n\t\treturn this.shardManager.disconnect();\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic async presenceUpdate(data: Parameters<Client[\"shardManager\"][\"presenceUpdate\"]>[\"0\"]): Promise<void> {\r\n\t\treturn this.shardManager.presenceUpdate(data);\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic shardPresenceUpdate(shardId: number, data: Parameters<Client[\"shardManager\"][\"shardPresenceUpdate\"]>[\"1\"]): Promise<void> {\r\n\t\treturn this.shardManager.shardPresenceUpdate(shardId, data);\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic voiceStateUpdate(shardId: number, data: Parameters<Client[\"shardManager\"][\"voiceStateUpdate\"]>[\"1\"]): Promise<void> {\r\n\t\treturn this.shardManager.voiceStateUpdate(shardId, data);\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic requestGuildMembers(shardId: number, data: Parameters<Client[\"shardManager\"][\"requestGuildMembers\"]>[\"1\"]): Promise<void> {\r\n\t\tif (!data.guild_id) throw new Error(\"You need to pass a guild_id\");\r\n\t\treturn this.shardManager.requestGuildMembers(shardId, data);\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\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\nimport DiscordConnector2 = require(\"./DiscordConnector\");\r\n\r\nexport { BetterWs2 as BetterWs, DiscordConnector2 as DiscordConnector, Client2 as Client, Constants, Intents, Shard2 as Shard, ShardManager2 as ShardManager };\r\nexport * from \"./Types\";\r\n"]}
1
+ {"version":3,"sources":["../src/Constants.ts","../src/StateMachine.ts","../src/StateMachineGraph.ts","../src/BetterWs.ts","../src/Intents.ts","../src/DiscordConnector.ts","../src/Shard.ts","../src/ShardManager.ts","../src/Client.ts","../src/index.ts"],"names":["Constants","EventEmitter","StateMachine","resolve","createHash","createInflate","constants","inflateSync","randomBytes","Intents","LocalBucket","OP","PresenceUpdateStatus","SnowTransfer"],"mappings":"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","file":"index.js","sourcesContent":["\"use strict\";\r\n\r\nconst Constants = {\r\n\tGATEWAY_OP_CODES: {\r\n\r\n\r\n\r\n\t\tDISPATCH: 0 as const,\r\n\r\n\r\n\r\n\t\tHEARTBEAT: 1 as const,\r\n\r\n\r\n\r\n\t\tIDENTIFY: 2 as const,\r\n\r\n\r\n\r\n\t\tPRESENCE_UPDATE: 3 as const,\r\n\r\n\r\n\r\n\t\tVOICE_STATE_UPDATE: 4 as const,\r\n\r\n\r\n\r\n\t\tRESUME: 6 as const,\r\n\r\n\r\n\r\n\t\tRECONNECT: 7 as const,\r\n\r\n\r\n\r\n\t\tREQUEST_GUILD_MEMBERS: 8 as const,\r\n\r\n\r\n\r\n\t\tINVALID_SESSION: 9 as const,\r\n\r\n\r\n\r\n\t\tHELLO: 10 as const,\r\n\r\n\r\n\r\n\t\tHEARTBEAT_ACK: 11 as const\r\n\t},\r\n\tGATEWAY_VERSION: 10 as const\r\n};\r\n\r\nexport = Constants;\r\n","import EventEmitter = require(\"events\");\r\n\r\nimport type { SMHistory, SMState, SMTransition } from \"./Types\";\r\n\r\ninterface StateMachineEvents {\r\n\tenter: [string];\r\n}\r\n\r\n\r\n\r\n\r\n\r\nclass StateMachine extends EventEmitter<StateMachineEvents> {\r\n\tpublic readonly states = new Map<string, SMState>();\r\n\tprivate editable = true;\r\n\tprivate readonly deferredTransitionCreators: Array<() => unknown> = [];\r\n\tprivate readonly history: Array<SMHistory> = [];\r\n\r\n\r\n\r\n\r\n\r\n\tpublic constructor(public currentStateName: string) {\r\n\t\tsuper();\r\n\t\tthis.deferredTransitionCreators.push(() => {\r\n\t\t\tif (!this.states.has(currentStateName)) {\r\n\t\t\t\tthis.defineState(currentStateName);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tpublic guardEditable() {\r\n\t\tif (!this.editable) throw new Error(\"tried to edit state machine after machine has been frozen\");\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tpublic guardNotEditable() {\r\n\t\tif (this.editable) throw new Error(\"tried to do transition before machine has been frozen\");\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic defineState(name: string, cbs: { onEnter: SMState[\"onEnter\"], onLeave: SMState[\"onLeave\"], transitions: Map<string, SMTransition> } = { onEnter: [], onLeave: [], transitions: new Map() }): this {\r\n\t\tthis.guardEditable();\r\n\t\tif (this.states.has(name)) throw new Error(`attempt to redefine state ${name}, please edit it instead`);\r\n\t\tthis.states.set(name, {\r\n\t\t\tonEnter: cbs.onEnter,\r\n\t\t\tonLeave: cbs.onLeave,\r\n\t\t\ttransitions: cbs.transitions\r\n\t\t});\r\n\t\treturn this;\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic defineTransition(from: string, event: string, to: string, cb?: (...args: any[]) => unknown): this {\r\n\t\tthis.guardEditable();\r\n\t\tconst state = this.states.get(from)!;\r\n\t\tif (state.transitions.has(event)) throw new Error(`attempt to redefine transition ${from} --${event}--> *, please only create transitions once`);\r\n\t\tconst onTransition: SMTransition[\"onTransition\"] = [];\r\n\t\tif (cb) onTransition.push(cb);\r\n\t\tstate.transitions.set(event, { destination: to, onTransition });\r\n\t\treturn this;\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic defineUniversalTransition(event: string, to: string): this {\r\n\t\tthis.guardEditable();\r\n\t\tthis.deferredTransitionCreators.push(() => {\r\n\t\t\tfor (const [stateName, state] of this.states.entries()) {\r\n\t\t\t\tif (!state.transitions.has(event)) {\r\n\t\t\t\t\tthis.defineTransition(stateName, event, to);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t\treturn this;\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tpublic freeze() {\r\n\t\tthis.guardEditable();\r\n\r\n\r\n\t\tfor (const cb of this.deferredTransitionCreators) {\r\n\t\t\tcb();\r\n\t\t}\r\n\r\n\r\n\t\tconst problems: Array<string> = [];\r\n\t\tfor (const [stateName, state] of this.states.entries()) {\r\n\t\t\tfor (const [transitionName, transition] of state.transitions.entries()) {\r\n\t\t\t\tif (!this.states.has(transition.destination)) {\r\n\t\t\t\t\tproblems.push(`transition ${stateName} --${transitionName}--> ${transition.destination} has an invalid destination`);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (problems.length) {\r\n\t\t\tthrow new Error(`Consistency problems in state machine: ${problems.join(\";\")}`);\r\n\t\t}\r\n\r\n\t\tthis.editable = false;\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic doTransition(event: string, ...args: any[]): void {\r\n\t\tthis.guardNotEditable();\r\n\t\tconst from = this.currentStateName;\r\n\t\tconst currentState = this.states.get(this.currentStateName)!;\r\n\t\tconst transition = currentState.transitions.get(event);\r\n\t\tif (!transition) throw new Error(`undefined transition: ${this.currentStateName} -> ${event} -> ?`);\r\n\r\n\t\tthis.history.push({ from, event, to: transition.destination, time: Date.now() });\r\n\t\tif (this.history.length > 20) this.history.shift();\r\n\r\n\r\n\t\tfor (const cb of this.states.get(this.currentStateName)!.onLeave) {\r\n\t\t\ttry {\r\n\t\t\t\tcb(event);\r\n\t\t\t} catch (e) {\r\n\t\t\t\tthis.debug();\r\n\t\t\t\tthrow new Error(`onLeave callback for state ${from} (during transition ${from} --${event}--> ${transition.destination})`, {cause: e});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\tthis.currentStateName = transition.destination;\r\n\t\tfor (const cb of transition.onTransition ?? []) {\r\n\t\t\ttry {\r\n\t\t\t\tcb(...args);\r\n\t\t\t} catch (e) {\r\n\t\t\t\tthis.debug();\r\n\t\t\t\tthrow new Error(`onTransition callback during ${from} --${event}--> ${transition.destination}`, {cause: e});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\tthis.emit(\"enter\", this.currentStateName);\r\n\t\tfor (const cb of this.states.get(this.currentStateName)!.onEnter) {\r\n\t\t\ttry {\r\n\t\t\t\tcb(event);\r\n\t\t\t} catch (e) {\r\n\t\t\t\tthis.debug();\r\n\t\t\t\tthrow new Error(`onEnter callback for state ${from} (during transition ${this.currentStateName} --${event}--> ${transition.destination})`, {cause: e});\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic doTransitionLater(event: string, delayMs: number, ...args: Array<any>): void {\r\n\t\tthis.guardNotEditable();\r\n\t\tconst timer = setTimeout(() => {\r\n\t\t\tthis.doTransition(event, ...args);\r\n\t\t}, delayMs);\r\n\t\tthis.once(\"enter\", () => {\r\n\t\t\tclearTimeout(timer);\r\n\t\t});\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tpublic debug(): void {\r\n\t\tconsole.table(this.history.map(h => ({\r\n\t\t\t\"At\": new Date(h.time),\r\n\t\t\t\"From -->\": h.from,\r\n\t\t\t\"-- Event -->\": h.event,\r\n\t\t\t\"--> To\": h.to\r\n\t\t})).concat({\r\n\t\t\t\"At\": new Date(),\r\n\t\t\t\"From -->\": this.currentStateName,\r\n\t\t\t\"-- Event -->\": \"(debug)\",\r\n\t\t\t\"--> To\": \"\"\r\n\t\t}));\r\n\t}\r\n}\r\n\r\n\r\nexport = StateMachine;\r\n","import StateMachine = require(\"./StateMachine\");\r\n\r\nfunction graph(stateMachine: StateMachine) {\r\n\tstateMachine.guardNotEditable();\r\n\tlet output = \"digraph {\\n\";\r\n\toutput += \"rankdir=LR\\n\";\r\n\toutput += `${stateMachine.currentStateName}\\n`;\r\n\tfor (const [stateName, state] of stateMachine.states.entries()) {\r\n\t\tif (state.onEnter.length) {\r\n\t\t\toutput += `${stateName} [fontcolor=blue]\\n`;\r\n\t\t}\r\n\r\n\t\tfor (const [transitionName, transition] of state.transitions.entries()) {\r\n\t\t\toutput += `${stateName} -> ${transition.destination}`;\r\n\t\t\tconst attrs = [`label=\"${transitionName}\"`];\r\n\t\t\tif (transition.onTransition?.length) {\r\n\t\t\t\tattrs.push(\"color=blue\");\r\n\t\t\t\tattrs.push(\"fontcolor=blue\");\r\n\t\t\t}\r\n\t\t\toutput += `[${attrs.join(\" \")}]\\n`;\r\n\t\t}\r\n\t}\r\n\toutput += \"}\";\r\n\treturn output;\r\n}\r\n\r\nexport { graph };\r\n","\"use strict\";\r\n\r\n\r\n\r\n\r\n\r\nimport { EventEmitter } from \"events\";\r\nimport { randomBytes, createHash } from \"crypto\";\r\nimport { createInflate, inflateSync, constants, type Inflate } from \"zlib\";\r\nimport https = require(\"https\");\r\nimport http = require(\"http\");\r\nimport util = require(\"util\");\r\n\r\nimport type { Socket } from \"net\";\r\n\r\nimport type {\r\n\tBWSEvents,\r\n\tIClientWSOptions\r\n} from \"./Types\";\r\n\r\nimport StateMachine = require(\"./StateMachine\");\r\nimport stateMachineGraph = require(\"./StateMachineGraph\");\r\n\r\n\r\n\r\n\r\n\r\n\r\nfunction eventSwitch(emitter: EventEmitter, cbs: { [eventName: string]: (...args: any[]) => any }): Promise<void> {\r\n\tconst realListeners = new Map<string, (...args: Array<any>) => void>();\r\n\treturn Promise.race(Object.entries(cbs).map(([event, cb]) => {\r\n\t\treturn new Promise<void>((resolve, reject) => {\r\n\t\t\tconst l = (...args: Array<any>) => (async () => cb(...args))().then(resolve, reject);\r\n\t\t\trealListeners.set(event, l);\r\n\t\t\temitter.once(event, l);\r\n\t\t});\r\n\t})).finally(() => {\r\n\t\tfor (const [event, l] of realListeners.entries()) {\r\n\t\t\temitter.removeListener(event, l);\r\n\t\t}\r\n\t});\r\n}\r\n\r\n\r\n\r\n\r\n\r\nclass BetterWs extends EventEmitter<BWSEvents> {\r\n\r\n\tpublic encoding: \"etf\" | \"json\" | \"other\";\r\n\r\n\tpublic compress: boolean;\r\n\r\n\tpublic connectThrottle: number;\r\n\r\n\tpublic sm = new StateMachine(\"disconnected\");\r\n\r\n\r\n\tprivate _socket: Socket | null = null;\r\n\r\n\r\n\tprivate _lastCloseCode: number | null = null;\r\n\r\n\tprivate _lastCloseReason: string | null = null;\r\n\r\n\tprivate _closePromise: Promise<void> | null = null;\r\n\tprivate _closeResolver: ((value: void | PromiseLike<void>) => void) | null = null;\r\n\r\n\tprivate _zlib: Inflate | null = null;\r\n\r\n\tprivate lastConnectAttempt = 0;\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic constructor(public address: string, public options: Omit<IClientWSOptions, \"encoding\"> & { encoding?: IClientWSOptions[\"encoding\"] | \"other\" }) {\r\n\t\tsuper();\r\n\r\n\t\tthis.encoding = options.encoding ?? \"other\";\r\n\t\tthis.compress = options.compress ?? false;\r\n\t\tthis.connectThrottle = options.connectThrottle ?? 10e3;\r\n\r\n\t\tthis.sm.defineState(\"connect_wait\", {\r\n\t\t\tonEnter: [\r\n\t\t\t\t() => {\r\n\t\t\t\t\tthis.sm.doTransitionLater(\"connect_allowed\", this.lastConnectAttempt - Date.now() + this.connectThrottle)\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\tonLeave: [\r\n\t\t\t\t() => {\r\n\t\t\t\t\tthis.lastConnectAttempt = Date.now()\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\ttransitions: new Map([\r\n\t\t\t\t[\"connect_allowed\", {\r\n\t\t\t\t\tdestination: \"connecting\"\r\n\t\t\t\t}]\r\n\t\t\t])\r\n\t\t})\r\n\r\n\t\tthis.sm.defineState(\"connecting\", {\r\n\t\t\tonEnter: [\r\n\t\t\t\t() => {\r\n\t\t\t\t\tconst { req, key } = createReq(this.address, this.options);\r\n\t\t\t\t\tthis.emit(\"debug\", \"Socket sending request to upgrade\");\r\n\t\t\t\t\treturn eventSwitch(req, {\r\n\t\t\t\t\t\tupgrade: (res: http.IncomingMessage, socket: Socket) => {\r\n\t\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t\tthis.sm.doTransition(\"upgrade\", key, res, socket);\r\n\t\t\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\t\t\treq.destroy();\r\n\t\t\t\t\t\t\t\tthrow e;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\terror: e => {\r\n\t\t\t\t\t\t\tthrow e;\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\tresponse: (res: http.ServerResponse) => {\r\n\t\t\t\t\t\t\treq.destroy();\r\n\t\t\t\t\t\t\tthrow new Error(`Expected HTTP 101 Upgrade, but got ${res.statusCode} ${res.statusMessage}`);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}).catch(error => {\r\n\t\t\t\t\t\tthis.sm.doTransition(\"error\", error);\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\tonLeave: [],\r\n\t\t\ttransitions: new Map([\r\n\t\t\t\t[\"upgrade\", {\r\n\t\t\t\t\tdestination: \"upgrading\",\r\n\t\t\t\t\tonTransition: [\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\t\t\t\t(key: string, res: http.IncomingMessage, socket: Socket) => {\r\n\t\t\t\t\t\t\tconst hash = createHash(\"sha1\").update(key + \"258EAFA5-E914-47DA-95CA-C5AB0DC85B11\").digest(\"base64\");\r\n\t\t\t\t\t\t\tconst accept = res.headers[\"sec-websocket-accept\"];\r\n\t\t\t\t\t\t\tif (hash !== accept) {\r\n\t\t\t\t\t\t\t\tsocket.end(() => {\r\n\t\t\t\t\t\t\t\t\tthis.emit(\"error\", `Failed websocket-key validation: expected: ${hash} | received: ${accept}`);\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\treturn this.sm.doTransition(\"error\");\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tsocket.on(\"error\", e => this.sm.doTransition(\"error\", e));\r\n\t\t\t\t\t\t\tsocket.on(\"close\", () => this.sm.doTransition(\"disconnect\"));\r\n\t\t\t\t\t\t\tsocket.on(\"readable\", this._onReadable.bind(this));\r\n\t\t\t\t\t\t\tthis._socket = socket;\r\n\t\t\t\t\t\t\tif (this.compress) {\r\n\t\t\t\t\t\t\t\tconst z = createInflate();\r\n\r\n\t\t\t\t\t\t\t\tz._c = z.close; z._h = z._handle; z._hc = z._handle.close; z._v = () => void 0;\r\n\t\t\t\t\t\t\t\tthis._zlib = z;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tthis.emit(\"ws_open\");\r\n\t\t\t\t\t\t\tthis.sm.doTransition(\"ws_open\");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t]\r\n\t\t\t\t}]\r\n\t\t\t])\r\n\t\t});\r\n\r\n\t\tthis.sm.defineState(\"upgrading\", {\r\n\t\t\tonEnter: [],\r\n\t\t\tonLeave: [],\r\n\t\t\ttransitions: new Map([\r\n\t\t\t\t[\"ws_open\", { destination: \"connected\" }]\r\n\t\t\t])\r\n\t\t});\r\n\r\n\t\tthis.sm.defineState(\"connected\", {\r\n\t\t\tonEnter: [],\r\n\t\t\tonLeave: [],\r\n\t\t\ttransitions: new Map([\r\n\t\t\t\t[\"disconnect\", { destination: \"disconnected\" }],\r\n\t\t\t\t[\"user_close\", {\r\n\t\t\t\t\tdestination: \"half_close\",\r\n\t\t\t\t\tonTransition: [\r\n\t\t\t\t\t\t(code: number, reason?: string) => {\r\n\t\t\t\t\t\t\tthis.emit(\"debug\", `User requested socket close`);\r\n\r\n\r\n\t\t\t\t\t\t\tconst from = Buffer.from([code >> 8, code & 255]);\r\n\t\t\t\t\t\t\tthis._write(reason ? Buffer.concat([from, Buffer.from(reason)]) : from, 8);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t]\r\n\t\t\t\t}],\r\n\t\t\t\t[\"error\", {\r\n\t\t\t\t\tdestination: \"half_close\",\r\n\t\t\t\t\tonTransition: [\r\n\t\t\t\t\t\t(error) => {\r\n\t\t\t\t\t\t\tthis.emit(\"error\", util.inspect(error, true, 1, false));\r\n\r\n\r\n\t\t\t\t\t\t\tthis._write(Buffer.allocUnsafe(0), 8);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t]\r\n\t\t\t\t}]\r\n\t\t\t])\r\n\t\t});\r\n\r\n\t\tthis.sm.defineState(\"half_close\", {\r\n\t\t\tonEnter: [\r\n\t\t\t\t() => {\r\n\t\t\t\t\tthis.sm.doTransitionLater(\"close_no_response\", 5000);\r\n\t\t\t\t\tconst { promise, resolve } = Promise.withResolvers<void>();\r\n\t\t\t\t\tthis._closePromise = promise;\r\n\t\t\t\t\tthis._closeResolver = resolve;\r\n\t\t\t\t\treturn this._closePromise;\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\tonLeave: [],\r\n\t\t\ttransitions: new Map([\r\n\t\t\t\t[\"user_close\", {\r\n\t\t\t\t\tdestination: \"half_close\",\r\n\t\t\t\t\tonTransition: [\r\n\t\t\t\t\t\t() => {\r\n\t\t\t\t\t\t\treturn this._closePromise;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t]\r\n\t\t\t\t}],\r\n\t\t\t\t[\"close_no_response\", {\r\n\t\t\t\t\tdestination: \"disconnected\",\r\n\t\t\t\t\tonTransition: [\r\n\t\t\t\t\t\t() => {\r\n\t\t\t\t\t\t\tthis.emit(\"debug\", \"Server didn't respond for a full close in time\");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t]\r\n\t\t\t\t}],\r\n\t\t\t\t[\"disconnect\", {\r\n\t\t\t\t\tdestination: \"disconnected\"\r\n\t\t\t\t}]\r\n\t\t\t])\r\n\t\t})\r\n\r\n\t\tthis.sm.defineState(\"disconnected\", {\r\n\t\t\tonEnter: [\r\n\t\t\t\t() => {\r\n\t\t\t\t\tif (this._closeResolver) this._closeResolver();\r\n\t\t\t\t\tif (this._zlib) {\r\n\t\t\t\t\t\tthis._zlib.close();\r\n\t\t\t\t\t\tthis._zlib = null;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthis.emit(\"ws_close\", this._lastCloseCode ?? 1006, this._lastCloseReason ?? \"Abnormal Closure\");\r\n\t\t\t\t\tthis._lastCloseCode = null;\r\n\t\t\t\t\tthis._lastCloseReason = null;\r\n\t\t\t\t\tthis._socket?.removeAllListeners()\r\n\t\t\t\t}\r\n\t\t\t],\r\n\t\t\tonLeave: [],\r\n\t\t\ttransitions: new Map([\r\n\t\t\t\t[\"user_connect\", { destination: \"connect_wait\" }]\r\n\t\t\t])\r\n\t\t})\r\n\r\n\t\tthis.sm.defineUniversalTransition(\"error\", \"disconnected\");\r\n\r\n\t\tthis.sm.freeze();\r\n\r\n\t\tif (process.argv.includes(`--state-machine-graph-betterws`)) {\r\n\t\t\tconsole.log(stateMachineGraph.graph(this.sm));\r\n\t\t}\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tpublic connect(): void {\r\n\t\tthis.sm.doTransition(\"user_connect\");\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic sendMessage(data: any): void {\r\n\t\tif (this.encoding === \"json\") this._write(Buffer.from(JSON.stringify(data)), 1);\r\n\t\telse if (this.encoding === \"etf\") this._write(writeETF(data), 2);\r\n\t\telse if (this.encoding === \"other\") this._write(Buffer.from(data), 2);\r\n\t\tthis.emit(\"ws_send\", data);\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic async close(code: number, reason?: string): Promise<void> {\r\n\t\tthis.sm.doTransition(\"user_close\", code, reason);\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tprivate _write(packet: Buffer, opcode: number): void {\r\n\t\tconst socket = this._socket;\r\n\t\tif (!socket?.writable) {\r\n\r\n\t\t\treturn this.sm.doTransition(\"disconnect\");\r\n\t\t}\r\n\t\tconst length = packet.length;\r\n\t\tlet frame: Buffer | undefined;\r\n\t\tif (length < 126) {\r\n\t\t\tframe = Buffer.allocUnsafe(6 + length);\r\n\t\t\tframe[1] = 128 + length;\r\n\t\t} else if (length < (1 << 16)) {\r\n\t\t\tframe = Buffer.allocUnsafe(8 + length);\r\n\t\t\tframe[1] = 254;\r\n\t\t\tframe[2] = length >> 8;\r\n\t\t\tframe[3] = length & 255;\r\n\t\t} else {\r\n\t\t\tframe = Buffer.allocUnsafe(14 + length);\r\n\t\t\tframe[1] = 255;\r\n\t\t\tframe.writeBigUInt64BE(BigInt(length), 2);\r\n\t\t}\r\n\t\tframe[0] = 128 + opcode;\r\n\t\tframe.writeUInt32BE(0, frame.length - length - 4);\r\n\t\tframe.set(packet, frame.length - length);\r\n\t\tsocket.write(frame);\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\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(\"error\", \"discord actually does send messages with fin=0. if you see this error let me know\");\r\n\t\t\tconst payload = frame.subarray(2 + bytes);\r\n\t\t\tthis._processFrame(opcode, payload);\r\n\t\t}\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tprivate _processFrame(opcode: number, message: Buffer): void {\r\n\t\tswitch (opcode) {\r\n\t\tcase 1: {\r\n\t\t\tlet packet: any;\r\n\t\t\tif (this.encoding === \"json\") packet = JSON.parse(message.toString());\r\n\t\t\telse if (this.encoding === \"other\") packet = message;\r\n\t\t\tthis.emit(\"ws_receive\", packet);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tcase 2: {\r\n\t\t\tlet packet;\r\n\t\t\tif (this.compress) {\r\n\t\t\t\tlet error = null;\r\n\t\t\t\tlet data = null;\r\n\t\t\t\tconst z = this._zlib!;\r\n\r\n\t\t\t\tz.close = z._handle.close = z._v;\r\n\t\t\t\ttry {\r\n\r\n\t\t\t\t\tdata = z._processChunk(message, constants.Z_SYNC_FLUSH);\r\n\t\t\t\t} catch(e) {\r\n\t\t\t\t\terror = e;\r\n\t\t\t\t}\r\n\t\t\t\tconst l = message.length;\r\n\t\t\t\tif (message[l - 4] !== 0 || message[l - 3] !== 0 || message[l - 2] !== 255 || message[l - 1] !== 255) this.emit(\"error\", \"discord actually does send fragmented zlib messages. If you see this error let me know\");\r\n\r\n\t\t\t\tz.close = z._c;\r\n\r\n\t\t\t\tz._handle = z._h;\r\n\r\n\t\t\t\tz._handle.close = z._hc;\r\n\r\n\t\t\t\tz._events.error = void 0;\r\n\r\n\t\t\t\tz._eventCount--;\r\n\t\t\t\tz.removeAllListeners(\"error\");\r\n\t\t\t\tif (error) {\r\n\t\t\t\t\tthis.emit(\"error\", \"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(\"error\", \"Data from zlib processing was null. If you see this error let me know\");\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tif (this.encoding === \"json\") packet = JSON.parse(String(data));\r\n\t\t\t\telse if (this.encoding === \"etf\") packet = readETF(data, 1);\r\n\t\t\t\telse if (this.encoding === \"other\") packet = data;\r\n\t\t\t} else if (this.encoding === \"json\") packet = JSON.parse(inflateSync(message).toString());\r\n\t\t\telse if (this.encoding === \"etf\") packet = readETF(message, 1);\r\n\t\t\telse if (this.encoding === \"other\") packet = message;\r\n\t\t\tthis.emit(\"ws_receive\", packet);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tcase 8: {\r\n\t\t\tthis._lastCloseCode = message.length > 1 ? (message[0] << 8) + message[1] : 0;\r\n\t\t\tthis._lastCloseReason = message.length > 2 ? message.subarray(2).toString() : \"\";\r\n\t\t\tthis._write(Buffer.from([this._lastCloseCode >> 8, this._lastCloseCode & 255]), 8);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tcase 9: {\r\n\t\t\tthis._write(message, 10);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nfunction createReq(address: string, options: BetterWs[\"options\"]): { req: http.ClientRequest, key: string } {\r\n\tconst key = randomBytes(16).toString(\"base64\");\r\n\tconst url = new URL(address);\r\n\tconst useHTTPS = (url.protocol === \"https:\" || url.protocol === \"wss:\") || url.port === \"443\";\r\n\tconst port = url.port || (useHTTPS ? \"443\" : \"80\");\r\n\tconst req = (useHTTPS ? https : http).request({\r\n\t\thostname: url.hostname,\r\n\t\tpath: `${url.pathname}${url.search}`,\r\n\t\tport: port,\r\n\t\theaders: {\r\n\t\t\t\"Connection\": \"Upgrade\",\r\n\t\t\t\"Upgrade\": \"websocket\",\r\n\t\t\t\"Sec-WebSocket-Key\": key,\r\n\t\t\t\"Sec-WebSocket-Version\": \"13\",\r\n\t\t\t...options.headers\r\n\t\t}\r\n\t});\r\n\treq.end();\r\n\treturn { req, key };\r\n}\r\n\r\nfunction readRange(socket: Socket, index: number, bytes: number): number {\r\n\tlet cursor = 0;\r\n\tlet read = 0;\r\n\tlet num = 0;\r\n\r\n\r\n\tconst readable = socket._readableState;\r\n\tlet currentBufferIndex = readable.bufferIndex;\r\n\tlet currentBuffer = readable.buffer.head ?? readable.buffer[currentBufferIndex];\r\n\r\n\tdo {\r\n\t\tconst data = currentBuffer.data ?? currentBuffer;\r\n\t\tfor (const element of data) {\r\n\t\t\tif (++cursor > index) {\r\n\t\t\t\tnum *= 256;\r\n\t\t\t\tnum += element;\r\n\t\t\t\tif (++read === bytes) return num;\r\n\t\t\t}\r\n\t\t}\r\n\t} while((currentBuffer = (currentBuffer.next ?? readable.buffer[++currentBufferIndex])));\r\n\tthrow new Error(\"readRange failed?\");\r\n}\r\n\r\nfunction readETF(data: Buffer, start: number): Record<any, any> | null | undefined {\r\n\tlet view: DataView | undefined;\r\n\tlet x = start;\r\n\tconst loop = () => {\r\n\t\tconst type = data[x++];\r\n\t\tswitch(type) {\r\n\t\tcase 70: {\r\n\t\t\tconst float = data.readDoubleBE(x);\r\n\t\t\tx += 8;\r\n\t\t\treturn float;\r\n\t\t}\r\n\t\tcase 97: {\r\n\t\t\treturn data[x++];\r\n\t\t}\r\n\t\tcase 98: {\r\n\t\t\tconst int = data.readInt32BE(x);\r\n\t\t\tx += 4;\r\n\t\t\treturn int;\r\n\t\t}\r\n\t\tcase 100: {\r\n\t\t\tconst length = data.readUInt16BE(x);\r\n\t\t\tlet atom = \"\";\r\n\t\t\tif (length > 30) {\r\n\r\n\t\t\t\tatom = data.latin1Slice(x += 2, x + length);\r\n\t\t\t} else {\r\n\t\t\t\tfor (let i = x += 2; i < x + length; i++) {\r\n\t\t\t\t\tatom += String.fromCharCode(data[i]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tx += length;\r\n\t\t\tif (!atom) return undefined;\r\n\t\t\tif (atom === \"nil\" || atom === \"null\") return null;\r\n\t\t\tif (atom === \"true\") return true;\r\n\t\t\tif (atom === \"false\") return false;\r\n\t\t\treturn atom;\r\n\t\t}\r\n\t\tcase 108: case 106: {\r\n\t\t\tconst array = [] as Array<any>;\r\n\t\t\tif (type === 108) {\r\n\t\t\t\tconst length = data.readUInt32BE(x);\r\n\t\t\t\tx += 4;\r\n\t\t\t\tfor (let i = 0; i < length; i++) {\r\n\t\t\t\t\tarray.push(loop());\r\n\t\t\t\t}\r\n\t\t\t\tx++;\r\n\t\t\t}\r\n\t\t\treturn array;\r\n\t\t}\r\n\t\tcase 107: {\r\n\t\t\tconst array = [] as Array<number>;\r\n\t\t\tconst length = data.readUInt16BE(x);\r\n\t\t\tx += 2;\r\n\t\t\tfor (let i = 0; i < length; i++) {\r\n\t\t\t\tarray.push(data[x++]);\r\n\t\t\t}\r\n\t\t\treturn array;\r\n\t\t}\r\n\t\tcase 109: {\r\n\t\t\tconst length = data.readUInt32BE(x);\r\n\t\t\tlet str = \"\";\r\n\t\t\tif (length > 30) {\r\n\r\n\t\t\t\tstr = data.utf8Slice(x += 4, x + length);\r\n\t\t\t} else {\r\n\t\t\t\tlet i = x += 4;\r\n\t\t\t\tconst l = x + length;\r\n\t\t\t\twhile(i < l) {\r\n\t\t\t\t\tconst byte = data[i++];\r\n\t\t\t\t\tif (byte < 128) str += String.fromCharCode(byte);\r\n\t\t\t\t\telse if (byte < 224) str += String.fromCharCode(((byte & 31) << 6) + (data[i++] & 63));\r\n\t\t\t\t\telse if (byte < 240) str += String.fromCharCode(((byte & 15) << 12) + ((data[i++] & 63) << 6) + (data[i++] & 63));\r\n\t\t\t\t\telse str += String.fromCodePoint(((byte & 7) << 18) + ((data[i++] & 63) << 12) + ((data[i++] & 63) << 6) + (data[i++] & 63));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tx += length;\r\n\t\t\treturn str;\r\n\t\t}\r\n\t\tcase 110: {\r\n\r\n\t\t\tview ??= new DataView(data.buffer, data.offset, data.byteLength);\r\n\t\t\tconst length = data[x++];\r\n\t\t\tconst sign = data[x++];\r\n\t\t\tlet left = length;\r\n\t\t\tlet num = BigInt(0);\r\n\t\t\twhile(left > 0) {\r\n\t\t\t\tif (left >= 8) {\r\n\t\t\t\t\tnum <<= BigInt(64);\r\n\t\t\t\t\tnum += view.getBigUint64(x + (left -= 8), true);\r\n\t\t\t\t} else if (left >= 4) {\r\n\t\t\t\t\tnum <<= BigInt(32);\r\n\r\n\t\t\t\t\tnum += BigInt(view.getUint32(x + (left -= 4)), true);\r\n\t\t\t\t} else if (left >= 2) {\r\n\t\t\t\t\tnum <<= BigInt(16);\r\n\r\n\t\t\t\t\tnum += BigInt(view.getUint16(x + (left -= 2)), true);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tnum <<= BigInt(8);\r\n\t\t\t\t\tnum += BigInt(data[x]);\r\n\t\t\t\t\tleft--;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tx += length;\r\n\t\t\treturn (sign ? -num : num).toString();\r\n\t\t}\r\n\t\tcase 116: {\r\n\t\t\tconst obj = {};\r\n\t\t\tconst length = data.readUInt32BE(x);\r\n\t\t\tx += 4;\r\n\t\t\tfor(let i = 0; i < length; i++) {\r\n\t\t\t\tconst key = loop();\r\n\r\n\t\t\t\tobj[key] = loop();\r\n\t\t\t}\r\n\t\t\treturn obj;\r\n\t\t}\r\n\t\t}\r\n\t\tthrow new Error(`Missing etf type: ${type}`);\r\n\t};\r\n\treturn loop();\r\n}\r\n\r\nfunction writeETF(data: any): Buffer {\r\n\tconst b = Buffer.allocUnsafe(1 << 12);\r\n\tb[0] = 131;\r\n\tlet i = 1;\r\n\tconst loop = (obj: any) => {\r\n\t\tconst type = typeof obj;\r\n\t\tswitch(type) {\r\n\t\tcase \"boolean\": {\r\n\t\t\tb[i++] = 100;\r\n\t\t\tif (obj) {\r\n\t\t\t\tb.writeUInt16BE(4, i);\r\n\r\n\t\t\t\tb.latin1Write(\"true\", i += 2);\r\n\t\t\t\ti += 4;\r\n\t\t\t} else {\r\n\t\t\t\tb.writeUInt16BE(5, i);\r\n\r\n\t\t\t\tb.latin1Write(\"false\", i += 2);\r\n\t\t\t\ti += 5;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tcase \"string\": {\r\n\t\t\tconst length = Buffer.byteLength(obj);\r\n\t\t\tb[i++] = 109;\r\n\t\t\tb.writeUInt32BE(length, i);\r\n\r\n\t\t\tb.utf8Write(obj, i += 4);\r\n\t\t\ti += length;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tcase \"number\": {\r\n\t\t\tif (Number.isInteger(obj)) {\r\n\t\t\t\tconst abs = Math.abs(obj);\r\n\t\t\t\tif (abs < 2147483648) {\r\n\t\t\t\t\tb[i++] = 98;\r\n\t\t\t\t\tb.writeInt32BE(obj, i);\r\n\t\t\t\t\ti += 4;\r\n\t\t\t\t} else if (abs < Number.MAX_SAFE_INTEGER) {\r\n\t\t\t\t\tb[i++] = 110;\r\n\t\t\t\t\tb[i++] = 8;\r\n\t\t\t\t\tb[i++] = Number(obj < 0);\r\n\t\t\t\t\tb.writeBigUInt64LE(BigInt(abs), i);\r\n\t\t\t\t\ti += 8;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tb[i++] = 70;\r\n\t\t\t\t\tb.writeDoubleBE(obj, i);\r\n\t\t\t\t\ti += 8;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tb[i++] = 70;\r\n\t\t\t\tb.writeDoubleBE(obj, i);\r\n\t\t\t\ti += 8;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tcase \"bigint\": {\r\n\t\t\tb[i++] = 110;\r\n\t\t\tb[i++] = 8;\r\n\t\t\tb[i++] = Number(obj < 0);\r\n\t\t\tb.writeBigUInt64LE(obj, i);\r\n\t\t\ti += 8;\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tcase \"object\": {\r\n\t\t\tif (obj === null) {\r\n\t\t\t\tb[i++] = 100;\r\n\t\t\t\tb.writeUInt16BE(3, i);\r\n\r\n\t\t\t\tb.latin1Write(\"nil\", i += 2);\r\n\t\t\t\ti += 3;\r\n\t\t\t} else if (Array.isArray(obj)) {\r\n\t\t\t\tif (obj.length) {\r\n\t\t\t\t\tb[i++] = 108;\r\n\t\t\t\t\tb.writeUInt32BE(obj.length, i);\r\n\t\t\t\t\ti += 4;\r\n\t\t\t\t\tfor (const item of obj) {\r\n\t\t\t\t\t\tloop(item);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tb[i++] = 106;\r\n\t\t\t} else {\r\n\t\t\t\tconst entries = Object.entries(obj).filter(x => typeof x[1] !== \"undefined\");\r\n\t\t\t\tb[i++] = 116;\r\n\t\t\t\tb.writeUInt32BE(entries.length, i);\r\n\t\t\t\ti += 4;\r\n\t\t\t\tfor(const [key, value] of entries) {\r\n\t\t\t\t\tloop(key);\r\n\t\t\t\t\tloop(value);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\t}\r\n\t};\r\n\tloop(data);\r\n\treturn Buffer.from(b.subarray(0, i));\r\n}\r\n\r\n\r\nexport = BetterWs;\r\n","\"use strict\";\r\n\r\nexport type IntentFlags = typeof flags;\r\nexport type IntentResolvable = number | Array<number> | keyof IntentFlags | Array<keyof IntentFlags>;\r\n\r\n\r\n\r\n\r\nexport const flags = {\r\n\tGUILDS: 1 << 0,\r\n\tGUILD_MEMBERS: 1 << 1,\r\n\tGUILD_MODERATION: 1 << 2,\r\n\tGUILD_EMOJIS_AND_STICKERS: 1 << 3,\r\n\tGUILD_INTEGRATIONS: 1 << 4,\r\n\tGUILD_WEBHOOKS: 1 << 5,\r\n\tGUILD_INVITES: 1 << 6,\r\n\tGUILD_VOICE_STATES: 1 << 7,\r\n\tGUILD_PRESENCES: 1 << 8,\r\n\tGUILD_MESSAGES: 1 << 9,\r\n\tGUILD_MESSAGE_REACTIONS: 1 << 10,\r\n\tGUILD_MESSAGE_TYPING: 1 << 11,\r\n\tDIRECT_MESSAGES: 1 << 12,\r\n\tDIRECT_MESSAGE_REACTIONS: 1 << 13,\r\n\tDIRECT_MESSAGE_TYPING: 1 << 14,\r\n\tMESSAGE_CONTENT: 1 << 15,\r\n\tGUILD_SCHEDULED_EVENTS: 1 << 16,\r\n\tAUTO_MODERATION_CONFIGURATION: 1 << 20,\r\n\tAUTO_MODERATION_EXECUTION: 1 << 21,\r\n\tGUILD_MESSAGE_POLLS: 1 << 24,\r\n\tDIRECT_MESSAGE_POLLS: 1 << 25\r\n};\r\n\r\n\r\nexport const privileged = flags.GUILD_MEMBERS | flags.GUILD_PRESENCES | flags.MESSAGE_CONTENT;\r\n\r\nexport const all = Object.values(flags).reduce((acc, p) => acc | p, 0);\r\n\r\nexport const non_privileged = all & ~privileged;\r\n\r\n\r\n\r\n\r\n\r\n\r\nexport function resolve(bit: IntentResolvable = 0): number {\r\n\tif (typeof bit === \"number\" && bit >= 0) return bit;\r\n\tif (typeof bit === \"string\" && flags[bit]) return flags[bit] | 0;\r\n\tif (Array.isArray(bit)) return bit.map((p: IntentResolvable) => resolve(p)).reduce((prev, p) => prev | p, 0);\r\n\tthrow new RangeError(\"BITFIELD_INVALID\");\r\n}\r\n\r\nexport default { flags, privileged, all, non_privileged, resolve };\r\n","\"use strict\";\r\n\r\nimport { EventEmitter } from \"events\";\r\nimport BetterWs = require(\"./BetterWs\");\r\nimport { GATEWAY_OP_CODES as OP, GATEWAY_VERSION } from \"./Constants\";\r\nimport Intents = require(\"./Intents\");\r\n\r\nimport { LocalBucket } from \"snowtransfer\";\r\n\r\nimport {\r\n\ttype GatewayReceivePayload,\r\n\ttype GatewayIdentify,\r\n\ttype GatewayPresenceUpdateData,\r\n\ttype GatewayVoiceStateUpdateData,\r\n\ttype GatewayRequestGuildMembersData,\r\n\ttype GatewayRequestGuildMembersDataWithQuery,\r\n\ttype GatewayRequestGuildMembersDataWithUserIds,\r\n\ttype GatewaySendPayload,\r\n\r\n\tPresenceUpdateStatus\r\n} from \"discord-api-types/v10\";\r\n\r\nimport type {\r\n\tConnectorEvents,\r\n\tClientEvents,\r\n\tIClientOptions,\r\n\tIGatewayMessage,\r\n\tIGatewayDispatch\r\n} from \"./Types\";\r\n\r\nconst resumableCodes = [4008, 4005, 4003, 4002, 4001, 4000, 1006, 1001];\r\nconst shouldntAttemptReconnectCodes = [4014, 4013, 4012, 4011, 4010, 4004];\r\nconst disconnectMessages = {\r\n\t4014: \"Disallowed Intents, check your client options and application page.\",\r\n\t4013: \"Invalid Intents data, check your client options.\",\r\n\t4012: \"Invalid API version.\",\r\n\t4011: \"Shard would be on over 2500 guilds. Add more shards.\",\r\n\t4010: \"Invalid sharding data, check your client options.\",\r\n\t4009: \"Session timed out.\",\r\n\t4008: \"You are being rate limited. Wait before sending more packets.\",\r\n\t4007: \"Invalid sequence. Reconnecting and starting a new session.\",\r\n\t4005: \"You sent more than one OP 2 IDENTIFY payload while the websocket was open.\",\r\n\t4004: \"Tried to connect with an invalid token.\",\r\n\t4003: \"You tried to send a packet before sending an OP 2 IDENTIFY or OP 6 RESUME.\",\r\n\t4002: \"You sent an invalid payload.\",\r\n\t4001: \"You sent an invalid opcode or invalid payload for an opcode.\"\r\n};\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nclass DiscordConnector extends EventEmitter<ConnectorEvents> {\r\n\r\n\tpublic options: DiscordConnector[\"client\"][\"options\"];\r\n\r\n\tpublic betterWs: BetterWs;\r\n\r\n\tpublic heartbeatTimeout: NodeJS.Timeout | null = null;\r\n\r\n\tpublic heartbeatInterval = 0;\r\n\r\n\tpublic _trace: string | null = null;\r\n\r\n\tpublic seq = 0;\r\n\r\n\tpublic status: \"connecting\" | \"identifying\" | \"resuming\" | \"ready\" | \"disconnected\" = \"disconnected\";\r\n\r\n\tpublic sessionId: string | null = null;\r\n\r\n\tpublic lastACKAt = 0;\r\n\r\n\tpublic lastHeartbeatSend = 0;\r\n\r\n\tpublic latency = 0;\r\n\r\n\tpublic identifyAddress: string;\r\n\r\n\tpublic resumeAddress: string | null = null;\r\n\r\n\tpublic reconnecting = false;\r\n\r\n\tpublic wsBucket = new LocalBucket(120, 60000);\r\n\r\n\tpublic presenceBucket = new LocalBucket(5, 60000);\r\n\r\n\tpublic membersBucket = new LocalBucket(1, 30000);\r\n\r\n\r\n\tprivate _closing = false;\r\n\r\n\tprivate _openToHeartbeatTimeout: NodeJS.Timeout | null = null;\r\n\r\n\tprivate _initialHeartbeatTimeout: NodeJS.Timeout | null = null;\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic constructor(public id: number, public client: EventEmitter<ClientEvents> & { options: Omit<IClientOptions, \"snowtransferInstance\"> & { token: string; endpoint?: string; } }) {\r\n\t\tsuper();\r\n\r\n\t\tthis.options = client.options;\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(\"debug\", `Shard ${this.id} ${event}`));\r\n\t\tthis.betterWs.on(\"error\", event => this.client.emit(\"error\", event));\r\n\t\tthis.betterWs.on(\"ws_send\", data => this.client.emit(\"rawSend\", data));\r\n\r\n\t\tthis.wsBucket.queue.setBlocked(true);\r\n\t\tthis.presenceBucket.queue.setBlocked(true);\r\n\t\tthis.membersBucket.queue.setBlocked(true);\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tpublic async connect(): Promise<void> {\r\n\t\tthis._closing = false;\r\n\t\tthis.client.emit(\"debug\", `Shard ${this.id} connecting to gateway`);\r\n\r\n\t\treturn this.betterWs.connect();\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tpublic async disconnect(): Promise<void> {\r\n\t\tthis._closing = true;\r\n\t\tthis.wsBucket.queue.setBlocked(true);\r\n\t\tthis.presenceBucket.queue.setBlocked(true);\r\n\t\tthis.membersBucket.queue.setBlocked(true);\r\n\t\treturn this.betterWs.close(1000, \"Disconnected by User\");\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tprivate async messageAction(message: GatewayReceivePayload): Promise<void> {\r\n\t\tthis.client.emit(\"rawReceive\", message);\r\n\t\tconst withShardID: 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\tthis._reconnect(true);\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\tif (this.sessionId) return void this.resume();\r\n\t\t\telse this.emit(\"queueIdentify\", this.id);\r\n\t\t\tbreak;\r\n\r\n\t\tcase OP.HEARTBEAT_ACK:\r\n\t\t\tthis.lastACKAt = Date.now();\r\n\t\t\tthis.latency = this.lastACKAt - this.lastHeartbeatSend;\r\n\t\t\tbreak;\r\n\r\n\t\tdefault:\r\n\t\t\tvoid 0;\r\n\t\t}\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tprivate async _reconnect(resume = false): Promise<void> {\r\n\t\tthis.reconnecting = resume;\r\n\t\tthis.wsBucket.queue.setBlocked(true);\r\n\t\tthis.presenceBucket.queue.setBlocked(true);\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}\r\n\r\n\r\n\r\n\r\n\r\n\tprivate reset(): void {\r\n\t\tthis.sessionId = null;\r\n\t\tthis.seq = 0;\r\n\t\tthis.lastACKAt = 0;\r\n\t\tthis._trace = null;\r\n\t\tthis.clearHeartBeat();\r\n\t}\r\n\r\n\r\n\r\n\r\n\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\tthis._reconnect(true);\r\n\t\t\t} else this.heartbeat();\r\n\t\t}, this.heartbeatInterval);\r\n\t}\r\n\r\n\r\n\r\n\r\n\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\r\n\r\n\r\n\r\n\tpublic async identify(): Promise<void> {\r\n\t\tif (this.betterWs.sm.currentStateName !== \"connected\") {\r\n\t\t\tthis.client.emit(\"error\", `Shard ${this.id} was attempting to identify when the ws was not open. Current state: ${this.betterWs.sm.currentStateName}`);\r\n\t\t\treturn this._reconnect(true);\r\n\t\t}\r\n\t\tthis.client.emit(\"debug\", `Shard ${this.id} is identifying`);\r\n\r\n\t\tthis.status = \"identifying\";\r\n\t\tthis.emit(\"stateChange\", \"identifying\");\r\n\r\n\t\tconst data = {\r\n\t\t\top: OP.IDENTIFY,\r\n\t\t\td: {\r\n\t\t\t\ttoken: this.options.token,\r\n\t\t\t\tproperties: {\r\n\t\t\t\t\tos: process.platform,\r\n\t\t\t\t\tbrowser: \"CloudStorm\",\r\n\t\t\t\t\tdevice: \"CloudStorm\"\r\n\t\t\t\t},\r\n\t\t\t\tlarge_threshold: this.options.largeGuildThreshold,\r\n\t\t\t\tshard: [this.id, this.options.totalShards ?? 1],\r\n\t\t\t\tintents: this.options.intents ? Intents.resolve(this.options.intents) : 0\r\n\t\t\t}\r\n\t\t} as GatewayIdentify;\r\n\r\n\t\tif (this.options.initialPresence) data.d.presence = this._checkPresenceData(this.options.initialPresence);\r\n\t\treturn this.betterWs.sendMessage(data);\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tpublic async resume(): Promise<void> {\r\n\t\tif (this.betterWs.sm.currentStateName !== \"connected\") {\r\n\t\t\tthis.client.emit(\"error\", `Shard ${this.id} was attempting to resume when the ws was not open. Current state: ${this.betterWs.sm.currentStateName}`);\r\n\t\t\treturn this._reconnect(true);\r\n\t\t}\r\n\t\tthis.client.emit(\"debug\", `Shard ${this.id} is resuming`);\r\n\r\n\t\tthis.status = \"resuming\";\r\n\t\tthis.emit(\"stateChange\", \"resuming\");\r\n\r\n\t\treturn this.betterWs.sendMessage({\r\n\t\t\top: OP.RESUME,\r\n\t\t\td: { seq: this.seq, token: this.options.token, session_id: this.sessionId! }\r\n\t\t});\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tprivate heartbeat(): void {\r\n\t\tif (this.betterWs.sm.currentStateName !== \"connected\") {\r\n\t\t\tthis.client.emit(\"error\", `Shard ${this.id} was attempting to heartbeat when the ws was not open. Current state: ${this.betterWs.sm.currentStateName}`);\r\n\t\t\treturn void this._reconnect(true);\r\n\t\t}\r\n\t\tthis.betterWs.sendMessage({ op: OP.HEARTBEAT, d: this.seq === 0 ? null : this.seq });\r\n\t\tthis.lastHeartbeatSend = Date.now();\r\n\t\tif (this._initialHeartbeatTimeout) {\r\n\t\t\tclearTimeout(this._initialHeartbeatTimeout);\r\n\t\t\tthis._initialHeartbeatTimeout = null;\r\n\t\t}\r\n\t\tif (!this.heartbeatTimeout) this.setHeartBeat();\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tprivate handleDispatch(message: IGatewayDispatch): void {\r\n\t\tthis.client.emit(\"dispatch\", message);\r\n\r\n\t\tif (message.s) {\r\n\t\t\tif (message.s > this.seq + 1) {\r\n\t\t\t\tthis.client.emit(\"debug\", `Shard ${this.id} invalid sequence: { current: ${this.seq} message: ${message.s} }`);\r\n\t\t\t\tthis.seq = message.s;\r\n\t\t\t\tthis.resume();\r\n\t\t\t}\r\n\t\t\tthis.seq = message.s;\r\n\t\t}\r\n\t\tswitch (message.t) {\r\n\t\tcase \"READY\":\r\n\t\tcase \"RESUMED\":\r\n\t\t\tif (message.t === \"READY\") {\r\n\t\t\t\tif (message.d.resume_gateway_url) this.resumeAddress = `${message.d.resume_gateway_url}?v=${GATEWAY_VERSION}&encoding=${this.options.ws?.encoding === \"etf\" ? \"etf\" : \"json\"}${this.options.ws?.compress ? \"&compress=zlib-stream\" : \"\"}`;\r\n\t\t\t\tthis.sessionId = message.d.session_id;\r\n\t\t\t}\r\n\t\t\tthis.status = \"ready\";\r\n\t\t\tthis.emit(\"stateChange\", \"ready\");\r\n\t\t\tthis._trace = (message.d as unknown as { _trace: string })._trace;\r\n\t\t\tthis.emit(\"ready\", message.t === \"RESUMED\");\r\n\t\t\tthis.wsBucket.queue.setBlocked(false);\r\n\t\t\tthis.presenceBucket.queue.setBlocked(false);\r\n\t\t\tthis.membersBucket.queue.setBlocked(false);\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\tvoid 0;\r\n\t\t}\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\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\t\tthis.wsBucket.queue.setBlocked(true);\r\n\t\tthis.presenceBucket.queue.setBlocked(true);\r\n\r\n\t\tconst isManualClose = code === 1000 && this._closing;\r\n\r\n\t\tconst message = disconnectMessages[code as keyof typeof disconnectMessages];\r\n\t\tconst isRecoverable = resumableCodes.includes(code);\r\n\t\tconst shouldntReconnect = shouldntAttemptReconnectCodes.includes(code) || isManualClose;\r\n\r\n\t\tif (isRecoverable && this.resumeAddress) this.betterWs.address = this.resumeAddress;\r\n\t\telse this.betterWs.address = this.identifyAddress;\r\n\r\n\t\tif (message) this.client.emit(\"error\", message);\r\n\r\n\t\tif (isManualClose || this.reconnecting) gracefulClose = true;\r\n\r\n\t\tthis._closing = false;\r\n\r\n\t\tthis.emit(\"disconnect\", code, reason, gracefulClose);\r\n\r\n\t\tif (!shouldntReconnect) this.connect();\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic async presenceUpdate(data: Partial<GatewayPresenceUpdateData>): Promise<void> {\r\n\t\treturn this.sendMessage({ op: OP.PRESENCE_UPDATE, d: this._checkPresenceData(data) });\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic async voiceStateUpdate(data: GatewayVoiceStateUpdateData & { self_deaf?: boolean; self_mute?: boolean; }): Promise<void> {\r\n\t\tif (!data) return Promise.resolve();\r\n\t\treturn this.sendMessage({ op: OP.VOICE_STATE_UPDATE, d: this._checkVoiceStateUpdateData(data) });\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic async requestGuildMembers(data: GatewayRequestGuildMembersData & { limit?: number; }): Promise<void> {\r\n\t\treturn this.sendMessage({ op: OP.REQUEST_GUILD_MEMBERS, d: this._checkRequestGuildMembersData(data) });\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic async sendMessage(data: GatewaySendPayload): Promise<void> {\r\n\t\tconst bypass = this.options.ws!.bypassBuckets;\r\n\t\treturn new Promise<void>(res => {\r\n\t\t\tconst sendMsg = () => {\r\n\t\t\t\tconst fn = () => {\r\n\t\t\t\t\tthis.betterWs.sendMessage(data);\r\n\t\t\t\t\tres(void 0);\r\n\t\t\t\t};\r\n\t\t\t\tif (bypass) fn();\r\n\t\t\t\telse this.wsBucket.enqueue(fn);\r\n\t\t\t};\r\n\t\t\tif (!bypass) {\r\n\t\t\t\tswitch (data.op) {\r\n\t\t\t\t\tcase OP.PRESENCE_UPDATE:\r\n\t\t\t\t\t\tthis.presenceBucket.enqueue(sendMsg);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase OP.REQUEST_GUILD_MEMBERS:\r\n\t\t\t\t\t\tif (\"query\" in data.d && data.d.query.length === 0 && data.d.limit === 0) this.membersBucket.enqueue(sendMsg);\r\n\t\t\t\t\t\telse sendMsg();\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tsendMsg();\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse sendMsg();\r\n\t\t});\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\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\tactivity.type ??= activity.url ? 1 : 0;\r\n\t\t\t\tif (!activity.name) {\r\n\t\t\t\t\tif (activity.state && activity.type === 4) activity.name = \"Custom Status\";\r\n\t\t\t\t\telse data.activities.splice(index, 1);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tdata.afk = data.afk ?? false;\r\n\t\tdata.since = data.since ?? Date.now();\r\n\t\treturn data as GatewayPresenceUpdateData;\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tprivate _checkVoiceStateUpdateData(data: Parameters<DiscordConnector[\"voiceStateUpdate\"]>[\"0\"]): GatewayVoiceStateUpdateData {\r\n\t\tdata.channel_id = data.channel_id ?? null;\r\n\t\tdata.self_mute = data.self_mute ?? false;\r\n\t\tdata.self_deaf = data.self_deaf ?? false;\r\n\t\treturn data;\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tprivate _checkRequestGuildMembersData(data: Parameters<DiscordConnector[\"requestGuildMembers\"]>[\"0\"]): GatewayRequestGuildMembersData {\r\n\t\tconst withQuery = data as GatewayRequestGuildMembersDataWithQuery;\r\n\t\tconst withUserIDs = data as GatewayRequestGuildMembersDataWithUserIds;\r\n\t\tif (!withQuery.query && !withUserIDs.user_ids) withQuery.query = \"\";\r\n\t\tif (withQuery.query && withUserIDs.user_ids) delete (data as { query?: string; }).query;\r\n\t\tdata.limit = data.limit ?? 10;\r\n\t\treturn data;\r\n\t}\r\n}\r\n\r\nexport = DiscordConnector;\r\n","\"use strict\";\r\n\r\nimport { EventEmitter } from \"events\";\r\nimport DC = require(\"./DiscordConnector\");\r\n\r\nimport type {\r\n\tShardEvents,\r\n\tClientEvents,\r\n\tIClientOptions\r\n} from \"./Types\"\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nclass Shard extends EventEmitter<ShardEvents> {\r\n\r\n\tpublic ready = false;\r\n\r\n\tpublic connector: DC;\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic constructor(public id: number, public client: EventEmitter<ClientEvents> & { options: Omit<IClientOptions, \"snowtransferInstance\"> & { token: string; endpoint?: string; } }) {\r\n\t\tsuper();\r\n\r\n\t\tthis.connector = new DC(id, client);\r\n\t\tthis.connector.on(\"disconnect\", (...args) => {\r\n\t\t\tthis.ready = false;\r\n\t\t\tthis.emit(\"disconnect\", ...args);\r\n\t\t});\r\n\t\tthis.connector.on(\"ready\", resume => this.emit(\"ready\", resume));\r\n\t\tthis.connector.on(\"queueIdentify\", () => this.emit(\"queueIdentify\", this.id));\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tpublic get latency(): number {\r\n\t\treturn this.connector.latency;\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tpublic connect(): void {\r\n\t\tthis.connector.connect();\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tpublic disconnect(): Promise<void> {\r\n\t\treturn this.connector.disconnect();\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic presenceUpdate(data: Parameters<Shard[\"connector\"][\"presenceUpdate\"]>[\"0\"]): Promise<void> {\r\n\t\treturn this.connector.presenceUpdate(data);\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic voiceStateUpdate(data: Parameters<Shard[\"connector\"][\"voiceStateUpdate\"]>[\"0\"]): Promise<void> {\r\n\t\treturn this.connector.voiceStateUpdate(data);\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\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 type { EventEmitter } from \"events\";\r\n\r\nimport Shard = require(\"./Shard\");\r\nimport { LocalBucket } from \"snowtransfer\";\r\n\r\nimport {\r\n\tIClientOptions,\r\n\tClientEvents\r\n} from \"./Types\";\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nclass ShardManager {\r\n\r\n\tpublic options: ShardManager[\"client\"][\"options\"];\r\n\r\n\tpublic shards: Record<string, Shard> = {};\r\n\r\n\tpublic identifyBucket = new LocalBucket(1000, 1000 * 60 * 60 * 24);\r\n\r\n\tpublic concurrencyBuckets: Record<string, LocalBucket> = {};\r\n\r\n\r\n\r\n\r\n\tpublic constructor(public client: EventEmitter<ClientEvents> & { options: Omit<IClientOptions, \"snowtransferInstance\"> & { token: string; endpoint?: string; } }) {\r\n\t\tthis.options = client.options;\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tpublic spawn(): void {\r\n\t\tif (!Object.keys(this.concurrencyBuckets).length) throw new Error(\"Trying to spawn shards without calling Client.fetchConnectInfo()\\nIf you intended to just let cloudstorm handle things for you, you should just use Client.connect() instead\");\r\n\t\tfor (const id of (this.options.shards === \"auto\" ? Array(this.options.totalShards).fill(0).map((_, index) => index) : this.options.shards ?? [0])) {\r\n\t\t\tthis.client.emit(\"debug\", `Spawned shard ${id}`);\r\n\t\t\tthis.shards[id] = new Shard(id, this.client);\r\n\t\t\tthis._addListener(this.shards[id]);\r\n\t\t\tthis.shards[id].connector.connect();\r\n\t\t}\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tpublic disconnect(): void {\r\n\t\tfor (const shardKey in this.shards) {\r\n\t\t\tthis.shards[shardKey].disconnect();\r\n\t\t}\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\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\tthis.client.emit(\"debug\", `Shard ${shardId} is ready to identify`);\r\n\t\t\tthis.identifyBucket.enqueue(() => {\r\n\t\t\t\tconst max_concurrency = Object.keys(this.concurrencyBuckets!).length;\r\n\t\t\t\tconst concurrencyRoute = shardId % max_concurrency;\r\n\t\t\t\tconst bkt = this.concurrencyBuckets[concurrencyRoute];\r\n\t\t\t\tif (!bkt) return this.client.emit(\"error\", `Received a queueIdentify event for shard ${shardId} and a concurrency route of ${concurrencyRoute} with a max_concurrency of ${max_concurrency}, but there was no bucket with that route internally.`);\r\n\t\t\t\tbkt.enqueue(() => {\r\n\t\t\t\t\tshard.connector.identify();\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t});\r\n\t\tshard.on(\"disconnect\", (code, reason, gracefulClose) => {\r\n\t\t\tthis.client.emit(\"debug\", `Websocket of shard ${shard.id} closed with code ${code} and reason: ${reason ?? \"None\"}`);\r\n\t\t\tif (code === 1000 && gracefulClose) return this._checkDisconnect();\r\n\t\t});\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tprivate _checkReady(): void {\r\n\t\tfor (const shardId in this.shards) {\r\n\t\t\tif (this.shards[shardId]) {\r\n\t\t\t\tif (!this.shards[shardId].ready) return;\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.client.emit(\"ready\");\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\tprivate _checkDisconnect(): void {\r\n\t\tfor (const shardId in this.shards) {\r\n\t\t\tif (this.shards[shardId]) {\r\n\t\t\t\tif (this.shards[shardId].connector.status !== \"disconnected\") return;\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.client.emit(\"disconnected\");\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic async presenceUpdate(data: Parameters<Shard[\"presenceUpdate\"]>[\"0\"]): Promise<void> {\r\n\t\tfor (const shardKey in this.shards) {\r\n\t\t\tif (this.shards[shardKey]) {\r\n\t\t\t\tconst shard = this.shards[shardKey];\r\n\t\t\t\tthis.shardPresenceUpdate(shard.id, data);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\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 as Error));\r\n\t\t});\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic voiceStateUpdate(shardId: number, data: Parameters<Shard[\"voiceStateUpdate\"]>[\"0\"]): Promise<void> {\r\n\t\treturn new Promise((res, rej) => {\r\n\t\t\tconst shard = this.shards[shardId];\r\n\t\t\tif (!shard) rej(new Error(`Shard ${shardId} does not exist`));\r\n\t\t\tif (!shard.ready) return;\r\n\t\t\tshard.voiceStateUpdate(data).then(result => res(result)).catch(e => rej(e as Error));\r\n\t\t});\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic requestGuildMembers(shardId: number, data: Parameters<Shard[\"requestGuildMembers\"]>[\"0\"]): Promise<void> {\r\n\t\treturn new Promise((res, rej) => {\r\n\t\t\tconst shard = this.shards[shardId];\r\n\t\t\tif (!shard) rej(new Error(`Shard ${shardId} does not exist`));\r\n\t\t\tif (!shard.ready) return;\r\n\t\t\tshard.requestGuildMembers(data).then(result => res(result)).catch(e => rej(e as Error));\r\n\t\t});\r\n\t}\r\n}\r\n\r\nexport = ShardManager;\r\n","\"use strict\";\r\n\r\nimport fs = require(\"fs\");\r\nimport path = require(\"path\");\r\n\r\nconst version = JSON.parse(fs.readFileSync(path.join(__dirname, \"../package.json\"), { encoding: \"utf8\" })).version as string;\r\nimport { EventEmitter } from \"events\";\r\nimport Constants = require(\"./Constants\");\r\nimport { SnowTransfer, LocalBucket } from \"snowtransfer\";\r\nimport ShardManager = require(\"./ShardManager\");\r\nimport type { APIGatewayBotInfo } from \"discord-api-types/v10\";\r\n\r\nimport type {\r\n\tClientEvents,\r\n\tIClientOptions\r\n} from \"./Types\";\r\n\r\n\r\n\r\n\r\n\r\nclass Client extends EventEmitter<ClientEvents> {\r\n\r\n\tpublic token: string;\r\n\r\n\tpublic options: Omit<IClientOptions, \"snowtransferInstance\"> & { token: string; endpoint?: string; };\r\n\r\n\tpublic shardManager: ShardManager;\r\n\r\n\tpublic version = version;\r\n\r\n\tprivate readonly _restClient: SnowTransfer;\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic constructor(token: string, options: 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\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 ?? new SnowTransfer(token);\r\n\t\tdelete options.snowtransferInstance;\r\n\t\tthis.token = token.startsWith(\"Bot \") ? token.substring(4) : token;\r\n\t\tif (options.ws) Object.assign(this.options.ws!, options.ws);\r\n\t\tdelete options.ws;\r\n\t\tObject.assign(this.options, options);\r\n\t\tthis.options.token = token;\r\n\t\tthis.shardManager = new ShardManager(this);\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic async connect(): Promise<void> {\r\n\t\tconst initial = await this.fetchConnectInfo();\r\n\t\tif (this.options.shards === \"auto\") this.options.totalShards = initial;\r\n\t\tthis.shardManager.spawn();\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\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\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\tthis.shardManager.identifyBucket.makeResetTimeout(this.shardManager.identifyBucket.reset);\r\n\t\tif (this.shardManager.identifyBucket.queue.blocked && this.shardManager.identifyBucket.remaining) this.shardManager.identifyBucket.queue.setBlocked(false);\r\n\t\tfor (const route of Object.keys(this.shardManager.concurrencyBuckets)) {\r\n\t\t\tdelete this.shardManager.concurrencyBuckets[route];\r\n\t\t}\r\n\t\tfor (let i = 0; i < gateway.session_start_limit.max_concurrency; i++) {\r\n\t\t\tthis.shardManager.concurrencyBuckets[i] = new LocalBucket(1, 5000);\r\n\t\t}\r\n\t\treturn gateway.shards;\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic async getGateway(): Promise<string> {\r\n\t\tconst gatewayData = await this._restClient.bot.getGateway();\r\n\t\treturn gatewayData.url;\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic async getGatewayBot(): Promise<APIGatewayBotInfo> {\r\n\t\treturn this._restClient.bot.getGatewayBot();\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic disconnect(): void {\r\n\t\treturn this.shardManager.disconnect();\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic async presenceUpdate(data: Parameters<Client[\"shardManager\"][\"presenceUpdate\"]>[\"0\"]): Promise<void> {\r\n\t\treturn this.shardManager.presenceUpdate(data);\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic shardPresenceUpdate(shardId: number, data: Parameters<Client[\"shardManager\"][\"shardPresenceUpdate\"]>[\"1\"]): Promise<void> {\r\n\t\treturn this.shardManager.shardPresenceUpdate(shardId, data);\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic voiceStateUpdate(shardId: number, data: Parameters<Client[\"shardManager\"][\"voiceStateUpdate\"]>[\"1\"]): Promise<void> {\r\n\t\treturn this.shardManager.voiceStateUpdate(shardId, data);\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\tpublic requestGuildMembers(shardId: number, data: Parameters<Client[\"shardManager\"][\"requestGuildMembers\"]>[\"1\"]): Promise<void> {\r\n\t\tif (!data.guild_id) throw new Error(\"You need to pass a guild_id\");\r\n\t\treturn this.shardManager.requestGuildMembers(shardId, data);\r\n\t}\r\n\r\n\r\n\r\n\r\n\r\n\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\nimport StateMachine2 = require(\"./StateMachine\");\r\nimport DiscordConnector2 = require(\"./DiscordConnector\");\r\n\r\nexport { BetterWs2 as BetterWs, StateMachine2 as StateMachine, DiscordConnector2 as DiscordConnector, Client2 as Client, Constants, Intents, Shard2 as Shard, ShardManager2 as ShardManager };\r\nexport * from \"./Types\";\r\n"]}
package/package.json CHANGED
@@ -1,31 +1,31 @@
1
1
  {
2
2
  "name": "cloudstorm",
3
- "version": "0.13.3",
3
+ "version": "0.14.1",
4
4
  "description": "Minimalistic Discord Gateway library",
5
5
  "main": "./dist/index.js",
6
6
  "engines": {
7
- "node": ">=16.15.0"
7
+ "node": ">=22.0.0"
8
8
  },
9
9
  "types": "./dist/index.d.ts",
10
10
  "scripts": {
11
- "build:src": "tsup src/index.ts --clean --dts --sourcemap --format cjs --target node16 --minify-whitespace --minify-syntax --treeshake && node ./sourceMapPostProcess.js",
11
+ "build:src": "tsup src/index.ts --clean --dts --sourcemap --format cjs --target node22 --minify-whitespace --minify-syntax --treeshake && node ./sourceMapPostProcess.js",
12
12
  "build:docs": "typedoc --name CloudStorm --excludeExternals --sort static-first --sort alphabetical"
13
13
  },
14
14
  "author": "wolke <wolke@weeb.sh>",
15
15
  "license": "MIT",
16
16
  "dependencies": {
17
- "discord-api-types": "^0.38.8",
18
- "snowtransfer": "^0.14.2"
17
+ "discord-api-types": "^0.38.21",
18
+ "snowtransfer": "^0.15.0"
19
19
  },
20
20
  "devDependencies": {
21
- "@types/node": "22.15.29",
22
- "@typescript-eslint/eslint-plugin": "^8.33.0",
23
- "@typescript-eslint/parser": "^8.33.0",
24
- "eslint": "^9.28.0",
21
+ "@types/node": "^24.3.0",
22
+ "@typescript-eslint/eslint-plugin": "^8.41.0",
23
+ "@typescript-eslint/parser": "^8.41.0",
24
+ "eslint": "^9.34.0",
25
25
  "tsup": "^8.5.0",
26
- "typedoc": "^0.28.5",
27
- "typedoc-plugin-mdn-links": "^5.0.2",
28
- "typescript": "^5.8.3"
26
+ "typedoc": "^0.28.11",
27
+ "typedoc-plugin-mdn-links": "^5.0.9",
28
+ "typescript": "^5.9.2"
29
29
  },
30
30
  "files": [
31
31
  "dist",