@discordjs/ws 0.1.0

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.
Files changed (78) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/LICENSE +191 -0
  3. package/README.md +124 -0
  4. package/dist/index.cjs +39 -0
  5. package/dist/index.cjs.map +1 -0
  6. package/dist/index.d.ts +12 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.mjs +11 -0
  9. package/dist/index.mjs.map +1 -0
  10. package/dist/strategies/context/IContextFetchingStrategy.cjs +15 -0
  11. package/dist/strategies/context/IContextFetchingStrategy.cjs.map +1 -0
  12. package/dist/strategies/context/IContextFetchingStrategy.d.ts +17 -0
  13. package/dist/strategies/context/IContextFetchingStrategy.d.ts.map +1 -0
  14. package/dist/strategies/context/IContextFetchingStrategy.mjs +11 -0
  15. package/dist/strategies/context/IContextFetchingStrategy.mjs.map +1 -0
  16. package/dist/strategies/context/SimpleContextFetchingStrategy.cjs +19 -0
  17. package/dist/strategies/context/SimpleContextFetchingStrategy.cjs.map +1 -0
  18. package/dist/strategies/context/SimpleContextFetchingStrategy.d.ts +10 -0
  19. package/dist/strategies/context/SimpleContextFetchingStrategy.d.ts.map +1 -0
  20. package/dist/strategies/context/SimpleContextFetchingStrategy.mjs +15 -0
  21. package/dist/strategies/context/SimpleContextFetchingStrategy.mjs.map +1 -0
  22. package/dist/strategies/context/WorkerContextFetchingStrategy.cjs +46 -0
  23. package/dist/strategies/context/WorkerContextFetchingStrategy.cjs.map +1 -0
  24. package/dist/strategies/context/WorkerContextFetchingStrategy.d.ts +10 -0
  25. package/dist/strategies/context/WorkerContextFetchingStrategy.d.ts.map +1 -0
  26. package/dist/strategies/context/WorkerContextFetchingStrategy.mjs +42 -0
  27. package/dist/strategies/context/WorkerContextFetchingStrategy.mjs.map +1 -0
  28. package/dist/strategies/sharding/IShardingStrategy.d.ts +25 -0
  29. package/dist/strategies/sharding/IShardingStrategy.d.ts.map +1 -0
  30. package/dist/strategies/sharding/SimpleShardingStrategy.cjs +53 -0
  31. package/dist/strategies/sharding/SimpleShardingStrategy.cjs.map +1 -0
  32. package/dist/strategies/sharding/SimpleShardingStrategy.d.ts +18 -0
  33. package/dist/strategies/sharding/SimpleShardingStrategy.d.ts.map +1 -0
  34. package/dist/strategies/sharding/SimpleShardingStrategy.mjs +49 -0
  35. package/dist/strategies/sharding/SimpleShardingStrategy.mjs.map +1 -0
  36. package/dist/strategies/sharding/WorkerShardingStrategy.cjs +162 -0
  37. package/dist/strategies/sharding/WorkerShardingStrategy.cjs.map +1 -0
  38. package/dist/strategies/sharding/WorkerShardingStrategy.d.ts +84 -0
  39. package/dist/strategies/sharding/WorkerShardingStrategy.d.ts.map +1 -0
  40. package/dist/strategies/sharding/WorkerShardingStrategy.mjs +165 -0
  41. package/dist/strategies/sharding/WorkerShardingStrategy.mjs.map +1 -0
  42. package/dist/strategies/sharding/worker.cjs +78 -0
  43. package/dist/strategies/sharding/worker.cjs.map +1 -0
  44. package/dist/strategies/sharding/worker.d.ts +2 -0
  45. package/dist/strategies/sharding/worker.d.ts.map +1 -0
  46. package/dist/strategies/sharding/worker.mjs +76 -0
  47. package/dist/strategies/sharding/worker.mjs.map +1 -0
  48. package/dist/utils/IdentifyThrottler.cjs +33 -0
  49. package/dist/utils/IdentifyThrottler.cjs.map +1 -0
  50. package/dist/utils/IdentifyThrottler.d.ts +8 -0
  51. package/dist/utils/IdentifyThrottler.d.ts.map +1 -0
  52. package/dist/utils/IdentifyThrottler.mjs +29 -0
  53. package/dist/utils/IdentifyThrottler.mjs.map +1 -0
  54. package/dist/utils/constants.cjs +63 -0
  55. package/dist/utils/constants.cjs.map +1 -0
  56. package/dist/utils/constants.d.ts +21 -0
  57. package/dist/utils/constants.d.ts.map +1 -0
  58. package/dist/utils/constants.mjs +64 -0
  59. package/dist/utils/constants.mjs.map +1 -0
  60. package/dist/utils/utils.cjs +15 -0
  61. package/dist/utils/utils.cjs.map +1 -0
  62. package/dist/utils/utils.d.ts +13 -0
  63. package/dist/utils/utils.d.ts.map +1 -0
  64. package/dist/utils/utils.mjs +10 -0
  65. package/dist/utils/utils.mjs.map +1 -0
  66. package/dist/ws/WebSocketManager.cjs +81 -0
  67. package/dist/ws/WebSocketManager.cjs.map +1 -0
  68. package/dist/ws/WebSocketManager.d.ts +186 -0
  69. package/dist/ws/WebSocketManager.d.ts.map +1 -0
  70. package/dist/ws/WebSocketManager.mjs +77 -0
  71. package/dist/ws/WebSocketManager.mjs.map +1 -0
  72. package/dist/ws/WebSocketShard.cjs +414 -0
  73. package/dist/ws/WebSocketShard.cjs.map +1 -0
  74. package/dist/ws/WebSocketShard.d.ts +71 -0
  75. package/dist/ws/WebSocketShard.d.ts.map +1 -0
  76. package/dist/ws/WebSocketShard.mjs +406 -0
  77. package/dist/ws/WebSocketShard.mjs.map +1 -0
  78. package/package.json +87 -0
@@ -0,0 +1,406 @@
1
+ import { once } from 'node:events';
2
+ import { setTimeout } from 'node:timers';
3
+ import { setTimeout as setTimeout$1 } from 'node:timers/promises';
4
+ import { TextDecoder } from 'node:util';
5
+ import { inflate } from 'node:zlib';
6
+ import { Collection } from '@discordjs/collection';
7
+ import { AsyncQueue } from '@sapphire/async-queue';
8
+ import { AsyncEventEmitter } from '@vladfrangu/async_event_emitter';
9
+ import { GatewayOpcodes, GatewayDispatchEvents, GatewayCloseCodes } from 'discord-api-types/v10';
10
+ import { WebSocket } from 'ws';
11
+ import { ImportantGatewayOpcodes } from '../utils/constants.mjs';
12
+ import { lazy } from '../utils/utils.mjs';
13
+
14
+ const getZlibSync = lazy(() => import('zlib-sync').then((mod) => mod.default).catch(() => null));
15
+ var WebSocketShardEvents = /* @__PURE__ */ ((WebSocketShardEvents2) => {
16
+ WebSocketShardEvents2["Debug"] = "debug";
17
+ WebSocketShardEvents2["Hello"] = "hello";
18
+ WebSocketShardEvents2["Ready"] = "ready";
19
+ WebSocketShardEvents2["Resumed"] = "resumed";
20
+ WebSocketShardEvents2["Dispatch"] = "dispatch";
21
+ return WebSocketShardEvents2;
22
+ })(WebSocketShardEvents || {});
23
+ var WebSocketShardStatus = /* @__PURE__ */ ((WebSocketShardStatus2) => {
24
+ WebSocketShardStatus2[WebSocketShardStatus2["Idle"] = 0] = "Idle";
25
+ WebSocketShardStatus2[WebSocketShardStatus2["Connecting"] = 1] = "Connecting";
26
+ WebSocketShardStatus2[WebSocketShardStatus2["Resuming"] = 2] = "Resuming";
27
+ WebSocketShardStatus2[WebSocketShardStatus2["Ready"] = 3] = "Ready";
28
+ return WebSocketShardStatus2;
29
+ })(WebSocketShardStatus || {});
30
+ var WebSocketShardDestroyRecovery = /* @__PURE__ */ ((WebSocketShardDestroyRecovery2) => {
31
+ WebSocketShardDestroyRecovery2[WebSocketShardDestroyRecovery2["Reconnect"] = 0] = "Reconnect";
32
+ WebSocketShardDestroyRecovery2[WebSocketShardDestroyRecovery2["Resume"] = 1] = "Resume";
33
+ return WebSocketShardDestroyRecovery2;
34
+ })(WebSocketShardDestroyRecovery || {});
35
+ var CloseCodes = /* @__PURE__ */ ((CloseCodes2) => {
36
+ CloseCodes2[CloseCodes2["Normal"] = 1e3] = "Normal";
37
+ CloseCodes2[CloseCodes2["Resuming"] = 4200] = "Resuming";
38
+ return CloseCodes2;
39
+ })(CloseCodes || {});
40
+ class WebSocketShard extends AsyncEventEmitter {
41
+ constructor(strategy, id) {
42
+ super();
43
+ this.connection = null;
44
+ this.useIdentifyCompress = false;
45
+ this.inflate = null;
46
+ this.textDecoder = new TextDecoder();
47
+ this.status = 0 /* Idle */;
48
+ this.replayedEvents = 0;
49
+ this.isAck = true;
50
+ this.sendRateLimitState = {
51
+ remaining: 120,
52
+ resetAt: Date.now()
53
+ };
54
+ this.heartbeatInterval = null;
55
+ this.lastHeartbeatAt = -1;
56
+ this.session = null;
57
+ this.sendQueue = new AsyncQueue();
58
+ this.timeouts = new Collection();
59
+ this.strategy = strategy;
60
+ this.id = id;
61
+ }
62
+ async connect() {
63
+ if (this.status !== 0 /* Idle */) {
64
+ throw new Error("Tried to connect a shard that wasn't idle");
65
+ }
66
+ const data = this.strategy.options.gatewayInformation;
67
+ const { version, encoding, compression } = this.strategy.options;
68
+ const params = new URLSearchParams({ v: version, encoding });
69
+ if (compression) {
70
+ const zlib = await getZlibSync();
71
+ if (zlib) {
72
+ params.append("compress", compression);
73
+ this.inflate = new zlib.Inflate({
74
+ chunkSize: 65535,
75
+ to: "string"
76
+ });
77
+ } else if (!this.useIdentifyCompress) {
78
+ this.useIdentifyCompress = true;
79
+ console.warn("WebSocketShard: Compression is enabled but zlib-sync is not installed, falling back to identify compress");
80
+ }
81
+ }
82
+ const url = `${data.url}?${params.toString()}`;
83
+ this.debug([`Connecting to ${url}`]);
84
+ const connection = new WebSocket(url, { handshakeTimeout: this.strategy.options.handshakeTimeout ?? void 0 }).on("message", this.onMessage.bind(this)).on("error", this.onError.bind(this)).on("close", this.onClose.bind(this));
85
+ connection.binaryType = "arraybuffer";
86
+ this.connection = connection;
87
+ this.status = 1 /* Connecting */;
88
+ await this.waitForEvent("hello" /* Hello */, this.strategy.options.helloTimeout);
89
+ const session = this.session ?? await this.strategy.retrieveSessionInfo(this.id);
90
+ if (session?.shardCount === this.strategy.options.shardCount) {
91
+ this.session = session;
92
+ await this.resume(session);
93
+ } else {
94
+ await this.identify();
95
+ }
96
+ }
97
+ async destroy(options = {}) {
98
+ if (this.status === 0 /* Idle */) {
99
+ this.debug(["Tried to destroy a shard that was idle"]);
100
+ return;
101
+ }
102
+ if (!options.code) {
103
+ options.code = options.recover === 1 /* Resume */ ? 4200 /* Resuming */ : 1e3 /* Normal */;
104
+ }
105
+ this.debug([
106
+ "Destroying shard",
107
+ `Reason: ${options.reason ?? "none"}`,
108
+ `Code: ${options.code}`,
109
+ `Recover: ${options.recover === void 0 ? "none" : WebSocketShardDestroyRecovery[options.recover]}`
110
+ ]);
111
+ this.isAck = true;
112
+ if (this.heartbeatInterval) {
113
+ clearInterval(this.heartbeatInterval);
114
+ }
115
+ this.lastHeartbeatAt = -1;
116
+ if (options.recover !== 1 /* Resume */ && this.session) {
117
+ this.session = null;
118
+ await this.strategy.updateSessionInfo(this.id, null);
119
+ }
120
+ if (this.connection && (this.connection.readyState === WebSocket.OPEN || this.connection.readyState === WebSocket.CONNECTING)) {
121
+ this.connection.close(options.code, options.reason);
122
+ }
123
+ this.status = 0 /* Idle */;
124
+ if (options.recover !== void 0) {
125
+ return this.connect();
126
+ }
127
+ }
128
+ async waitForEvent(event, timeoutDuration) {
129
+ this.debug([`Waiting for event ${event} for ${timeoutDuration ? `${timeoutDuration}ms` : "indefinitely"}`]);
130
+ const controller = new AbortController();
131
+ const timeout = timeoutDuration ? setTimeout(() => controller.abort(), timeoutDuration).unref() : null;
132
+ if (timeout) {
133
+ this.timeouts.set(event, timeout);
134
+ }
135
+ await once(this, event, { signal: controller.signal });
136
+ if (timeout) {
137
+ clearTimeout(timeout);
138
+ this.timeouts.delete(event);
139
+ }
140
+ }
141
+ async send(payload) {
142
+ if (!this.connection) {
143
+ throw new Error("WebSocketShard wasn't connected");
144
+ }
145
+ if (this.status !== 3 /* Ready */ && !ImportantGatewayOpcodes.has(payload.op)) {
146
+ await once(this, "ready" /* Ready */);
147
+ }
148
+ await this.sendQueue.wait();
149
+ if (--this.sendRateLimitState.remaining <= 0) {
150
+ if (this.sendRateLimitState.resetAt < Date.now()) {
151
+ await setTimeout$1(Date.now() - this.sendRateLimitState.resetAt);
152
+ }
153
+ this.sendRateLimitState = {
154
+ remaining: 119,
155
+ resetAt: Date.now() + 6e4
156
+ };
157
+ }
158
+ this.sendQueue.shift();
159
+ this.connection.send(JSON.stringify(payload));
160
+ }
161
+ async identify() {
162
+ this.debug([
163
+ "Identifying",
164
+ `shard id: ${this.id.toString()}`,
165
+ `shard count: ${this.strategy.options.shardCount}`,
166
+ `intents: ${this.strategy.options.intents}`,
167
+ `compression: ${this.inflate ? "zlib-stream" : this.useIdentifyCompress ? "identify" : "none"}`
168
+ ]);
169
+ const d = {
170
+ token: this.strategy.options.token,
171
+ properties: this.strategy.options.identifyProperties,
172
+ intents: this.strategy.options.intents,
173
+ compress: this.useIdentifyCompress,
174
+ shard: [this.id, this.strategy.options.shardCount]
175
+ };
176
+ if (this.strategy.options.largeThreshold) {
177
+ d.large_threshold = this.strategy.options.largeThreshold;
178
+ }
179
+ if (this.strategy.options.initialPresence) {
180
+ d.presence = this.strategy.options.initialPresence;
181
+ }
182
+ await this.send({
183
+ op: GatewayOpcodes.Identify,
184
+ d
185
+ });
186
+ await this.waitForEvent("ready" /* Ready */, this.strategy.options.readyTimeout);
187
+ this.status = 3 /* Ready */;
188
+ }
189
+ resume(session) {
190
+ this.debug(["Resuming session"]);
191
+ this.status = 2 /* Resuming */;
192
+ this.replayedEvents = 0;
193
+ return this.send({
194
+ op: GatewayOpcodes.Resume,
195
+ d: {
196
+ token: this.strategy.options.token,
197
+ seq: session.sequence,
198
+ session_id: session.sessionId
199
+ }
200
+ });
201
+ }
202
+ async heartbeat(requested = false) {
203
+ if (!this.isAck && !requested) {
204
+ return this.destroy({ reason: "Zombie connection", recover: 1 /* Resume */ });
205
+ }
206
+ await this.send({
207
+ op: GatewayOpcodes.Heartbeat,
208
+ d: this.session?.sequence ?? null
209
+ });
210
+ this.lastHeartbeatAt = Date.now();
211
+ this.isAck = false;
212
+ }
213
+ async unpackMessage(data, isBinary) {
214
+ const decompressable = new Uint8Array(data);
215
+ if (!isBinary) {
216
+ return JSON.parse(this.textDecoder.decode(decompressable));
217
+ }
218
+ if (this.useIdentifyCompress) {
219
+ return new Promise((resolve, reject) => {
220
+ inflate(decompressable, { chunkSize: 65535 }, (err, result) => {
221
+ if (err) {
222
+ return reject(err);
223
+ }
224
+ resolve(JSON.parse(this.textDecoder.decode(result)));
225
+ });
226
+ });
227
+ }
228
+ if (this.inflate) {
229
+ const l = decompressable.length;
230
+ const flush = l >= 4 && decompressable[l - 4] === 0 && decompressable[l - 3] === 0 && decompressable[l - 2] === 255 && decompressable[l - 1] === 255;
231
+ const zlib = await getZlibSync();
232
+ this.inflate.push(Buffer.from(decompressable), flush ? zlib.Z_SYNC_FLUSH : zlib.Z_NO_FLUSH);
233
+ if (this.inflate.err) {
234
+ this.emit("error", `${this.inflate.err}${this.inflate.msg ? `: ${this.inflate.msg}` : ""}`);
235
+ }
236
+ if (!flush) {
237
+ return null;
238
+ }
239
+ const { result } = this.inflate;
240
+ if (!result) {
241
+ return null;
242
+ }
243
+ return JSON.parse(typeof result === "string" ? result : this.textDecoder.decode(result));
244
+ }
245
+ this.debug([
246
+ "Received a message we were unable to decompress",
247
+ `isBinary: ${isBinary.toString()}`,
248
+ `useIdentifyCompress: ${this.useIdentifyCompress.toString()}`,
249
+ `inflate: ${Boolean(this.inflate).toString()}`
250
+ ]);
251
+ return null;
252
+ }
253
+ async onMessage(data, isBinary) {
254
+ const payload = await this.unpackMessage(data, isBinary);
255
+ if (!payload) {
256
+ return;
257
+ }
258
+ switch (payload.op) {
259
+ case GatewayOpcodes.Dispatch: {
260
+ if (this.status === 3 /* Ready */ || this.status === 2 /* Resuming */) {
261
+ this.emit("dispatch" /* Dispatch */, { data: payload });
262
+ }
263
+ if (this.status === 2 /* Resuming */) {
264
+ this.replayedEvents++;
265
+ }
266
+ switch (payload.t) {
267
+ case GatewayDispatchEvents.Ready: {
268
+ this.emit("ready" /* Ready */);
269
+ this.session ?? (this.session = {
270
+ sequence: payload.s,
271
+ sessionId: payload.d.session_id,
272
+ shardId: this.id,
273
+ shardCount: this.strategy.options.shardCount
274
+ });
275
+ await this.strategy.updateSessionInfo(this.id, this.session);
276
+ break;
277
+ }
278
+ case GatewayDispatchEvents.Resumed: {
279
+ this.status = 3 /* Ready */;
280
+ this.debug([`Resumed and replayed ${this.replayedEvents} events`]);
281
+ this.emit("resumed" /* Resumed */);
282
+ break;
283
+ }
284
+ }
285
+ if (this.session) {
286
+ if (payload.s > this.session.sequence) {
287
+ this.session.sequence = payload.s;
288
+ await this.strategy.updateSessionInfo(this.id, this.session);
289
+ }
290
+ }
291
+ break;
292
+ }
293
+ case GatewayOpcodes.Heartbeat: {
294
+ await this.heartbeat(true);
295
+ break;
296
+ }
297
+ case GatewayOpcodes.Reconnect: {
298
+ await this.destroy({
299
+ reason: "Told to reconnect by Discord",
300
+ recover: 1 /* Resume */
301
+ });
302
+ break;
303
+ }
304
+ case GatewayOpcodes.InvalidSession: {
305
+ const readyTimeout = this.timeouts.get("ready" /* Ready */);
306
+ readyTimeout?.refresh();
307
+ this.debug([`Invalid session; will attempt to resume: ${payload.d.toString()}`]);
308
+ const session = this.session ?? await this.strategy.retrieveSessionInfo(this.id);
309
+ if (payload.d && session) {
310
+ await this.resume(session);
311
+ } else {
312
+ await this.destroy({
313
+ reason: "Invalid session",
314
+ recover: 0 /* Reconnect */
315
+ });
316
+ }
317
+ break;
318
+ }
319
+ case GatewayOpcodes.Hello: {
320
+ this.emit("hello" /* Hello */);
321
+ this.debug([`Starting to heartbeat every ${payload.d.heartbeat_interval}ms`]);
322
+ this.heartbeatInterval = setInterval(() => void this.heartbeat(), payload.d.heartbeat_interval);
323
+ break;
324
+ }
325
+ case GatewayOpcodes.HeartbeatAck: {
326
+ this.isAck = true;
327
+ this.debug([`Got heartbeat ack after ${Date.now() - this.lastHeartbeatAt}ms`]);
328
+ break;
329
+ }
330
+ }
331
+ }
332
+ onError(err) {
333
+ this.emit("error", { err });
334
+ }
335
+ async onClose(code) {
336
+ switch (code) {
337
+ case 1e3:
338
+ case 4200: {
339
+ this.debug([`Disconnected normally from code ${code}`]);
340
+ break;
341
+ }
342
+ case GatewayCloseCodes.UnknownError: {
343
+ this.debug([`An unknown error occured: ${code}`]);
344
+ return this.destroy({ code, recover: 1 /* Resume */ });
345
+ }
346
+ case GatewayCloseCodes.UnknownOpcode: {
347
+ this.debug(["An invalid opcode was sent to Discord."]);
348
+ return this.destroy({ code, recover: 1 /* Resume */ });
349
+ }
350
+ case GatewayCloseCodes.DecodeError: {
351
+ this.debug(["An invalid payload was sent to Discord."]);
352
+ return this.destroy({ code, recover: 1 /* Resume */ });
353
+ }
354
+ case GatewayCloseCodes.NotAuthenticated: {
355
+ this.debug(["A request was somehow sent before the identify/resume payload."]);
356
+ return this.destroy({ code, recover: 0 /* Reconnect */ });
357
+ }
358
+ case GatewayCloseCodes.AuthenticationFailed: {
359
+ throw new Error("Authentication failed");
360
+ }
361
+ case GatewayCloseCodes.AlreadyAuthenticated: {
362
+ this.debug(["More than one auth payload was sent."]);
363
+ return this.destroy({ code, recover: 0 /* Reconnect */ });
364
+ }
365
+ case GatewayCloseCodes.InvalidSeq: {
366
+ this.debug(["An invalid sequence was sent."]);
367
+ return this.destroy({ code, recover: 0 /* Reconnect */ });
368
+ }
369
+ case GatewayCloseCodes.RateLimited: {
370
+ this.debug(["The WebSocket rate limit has been hit, this should never happen"]);
371
+ return this.destroy({ code, recover: 0 /* Reconnect */ });
372
+ }
373
+ case GatewayCloseCodes.SessionTimedOut: {
374
+ this.debug(["Session timed out."]);
375
+ return this.destroy({ code, recover: 1 /* Resume */ });
376
+ }
377
+ case GatewayCloseCodes.InvalidShard: {
378
+ throw new Error("Invalid shard");
379
+ }
380
+ case GatewayCloseCodes.ShardingRequired: {
381
+ throw new Error("Sharding is required");
382
+ }
383
+ case GatewayCloseCodes.InvalidAPIVersion: {
384
+ throw new Error("Used an invalid API version");
385
+ }
386
+ case GatewayCloseCodes.InvalidIntents: {
387
+ throw new Error("Used invalid intents");
388
+ }
389
+ case GatewayCloseCodes.DisallowedIntents: {
390
+ throw new Error("Used disallowed intents");
391
+ }
392
+ default: {
393
+ this.debug([`The gateway closed with an unexpected code ${code}, attempting to resume.`]);
394
+ return this.destroy({ code, recover: 1 /* Resume */ });
395
+ }
396
+ }
397
+ }
398
+ debug(messages) {
399
+ const message = `${messages[0]}${messages.length > 1 ? `
400
+ ${messages.slice(1).map((m) => ` ${m}`).join("\n")}` : ""}`;
401
+ this.emit("debug" /* Debug */, { message });
402
+ }
403
+ }
404
+
405
+ export { CloseCodes, WebSocketShard, WebSocketShardDestroyRecovery, WebSocketShardEvents, WebSocketShardStatus };
406
+ //# sourceMappingURL=WebSocketShard.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebSocketShard.mjs","sources":["../../src/ws/WebSocketShard.ts"],"sourcesContent":["import { once } from 'node:events';\nimport { setTimeout } from 'node:timers';\nimport { setTimeout as sleep } from 'node:timers/promises';\nimport { TextDecoder } from 'node:util';\nimport { inflate } from 'node:zlib';\nimport { Collection } from '@discordjs/collection';\nimport { AsyncQueue } from '@sapphire/async-queue';\nimport { AsyncEventEmitter } from '@vladfrangu/async_event_emitter';\nimport {\n\tGatewayCloseCodes,\n\tGatewayDispatchEvents,\n\tGatewayDispatchPayload,\n\tGatewayIdentifyData,\n\tGatewayOpcodes,\n\tGatewayReceivePayload,\n\tGatewaySendPayload,\n} from 'discord-api-types/v10';\nimport { RawData, WebSocket } from 'ws';\nimport type { Inflate } from 'zlib-sync';\nimport type { SessionInfo } from './WebSocketManager';\nimport type { IContextFetchingStrategy } from '../strategies/context/IContextFetchingStrategy';\nimport { ImportantGatewayOpcodes } from '../utils/constants';\nimport { lazy } from '../utils/utils';\n\nconst getZlibSync = lazy(() => import('zlib-sync').then((mod) => mod.default).catch(() => null));\n\nexport enum WebSocketShardEvents {\n\tDebug = 'debug',\n\tHello = 'hello',\n\tReady = 'ready',\n\tResumed = 'resumed',\n\tDispatch = 'dispatch',\n}\n\nexport enum WebSocketShardStatus {\n\tIdle,\n\tConnecting,\n\tResuming,\n\tReady,\n}\n\nexport enum WebSocketShardDestroyRecovery {\n\tReconnect,\n\tResume,\n}\n\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport type WebSocketShardEventsMap = {\n\t[WebSocketShardEvents.Debug]: [payload: { message: string }];\n\t[WebSocketShardEvents.Hello]: [];\n\t[WebSocketShardEvents.Ready]: [];\n\t[WebSocketShardEvents.Resumed]: [];\n\t[WebSocketShardEvents.Dispatch]: [payload: { data: GatewayDispatchPayload }];\n};\n\nexport interface WebSocketShardDestroyOptions {\n\treason?: string;\n\tcode?: number;\n\trecover?: WebSocketShardDestroyRecovery;\n}\n\nexport enum CloseCodes {\n\tNormal = 1000,\n\tResuming = 4200,\n}\n\nexport class WebSocketShard extends AsyncEventEmitter<WebSocketShardEventsMap> {\n\tprivate connection: WebSocket | null = null;\n\n\tprivate readonly id: number;\n\n\tprivate useIdentifyCompress = false;\n\n\tprivate inflate: Inflate | null = null;\n\tprivate readonly textDecoder = new TextDecoder();\n\n\tprivate status: WebSocketShardStatus = WebSocketShardStatus.Idle;\n\n\tprivate replayedEvents = 0;\n\n\tprivate isAck = true;\n\n\tprivate sendRateLimitState = {\n\t\tremaining: 120,\n\t\tresetAt: Date.now(),\n\t};\n\n\tprivate heartbeatInterval: NodeJS.Timer | null = null;\n\tprivate lastHeartbeatAt = -1;\n\n\tprivate session: SessionInfo | null = null;\n\n\tprivate readonly sendQueue = new AsyncQueue();\n\n\tprivate readonly timeouts = new Collection<WebSocketShardEvents, NodeJS.Timeout>();\n\n\tpublic readonly strategy: IContextFetchingStrategy;\n\n\tpublic constructor(strategy: IContextFetchingStrategy, id: number) {\n\t\tsuper();\n\t\tthis.strategy = strategy;\n\t\tthis.id = id;\n\t}\n\n\tpublic async connect() {\n\t\tif (this.status !== WebSocketShardStatus.Idle) {\n\t\t\tthrow new Error(\"Tried to connect a shard that wasn't idle\");\n\t\t}\n\n\t\tconst data = this.strategy.options.gatewayInformation;\n\n\t\tconst { version, encoding, compression } = this.strategy.options;\n\t\tconst params = new URLSearchParams({ v: version, encoding });\n\t\tif (compression) {\n\t\t\tconst zlib = await getZlibSync();\n\t\t\tif (zlib) {\n\t\t\t\tparams.append('compress', compression);\n\t\t\t\tthis.inflate = new zlib.Inflate({\n\t\t\t\t\tchunkSize: 65535,\n\t\t\t\t\tto: 'string',\n\t\t\t\t});\n\t\t\t} else if (!this.useIdentifyCompress) {\n\t\t\t\tthis.useIdentifyCompress = true;\n\t\t\t\tconsole.warn(\n\t\t\t\t\t'WebSocketShard: Compression is enabled but zlib-sync is not installed, falling back to identify compress',\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst url = `${data.url}?${params.toString()}`;\n\t\tthis.debug([`Connecting to ${url}`]);\n\t\tconst connection = new WebSocket(url, { handshakeTimeout: this.strategy.options.handshakeTimeout ?? undefined })\n\t\t\t/* eslint-disable @typescript-eslint/no-misused-promises */\n\t\t\t.on('message', this.onMessage.bind(this))\n\t\t\t.on('error', this.onError.bind(this))\n\t\t\t.on('close', this.onClose.bind(this));\n\t\t/* eslint-enable @typescript-eslint/no-misused-promises */\n\n\t\tconnection.binaryType = 'arraybuffer';\n\t\tthis.connection = connection;\n\n\t\tthis.status = WebSocketShardStatus.Connecting;\n\n\t\tawait this.waitForEvent(WebSocketShardEvents.Hello, this.strategy.options.helloTimeout);\n\n\t\tconst session = this.session ?? (await this.strategy.retrieveSessionInfo(this.id));\n\t\tif (session?.shardCount === this.strategy.options.shardCount) {\n\t\t\tthis.session = session;\n\t\t\tawait this.resume(session);\n\t\t} else {\n\t\t\tawait this.identify();\n\t\t}\n\t}\n\n\tpublic async destroy(options: WebSocketShardDestroyOptions = {}) {\n\t\tif (this.status === WebSocketShardStatus.Idle) {\n\t\t\tthis.debug(['Tried to destroy a shard that was idle']);\n\t\t\treturn;\n\t\t}\n\n\t\tif (!options.code) {\n\t\t\toptions.code = options.recover === WebSocketShardDestroyRecovery.Resume ? CloseCodes.Resuming : CloseCodes.Normal;\n\t\t}\n\n\t\tthis.debug([\n\t\t\t'Destroying shard',\n\t\t\t`Reason: ${options.reason ?? 'none'}`,\n\t\t\t`Code: ${options.code}`,\n\t\t\t`Recover: ${options.recover === undefined ? 'none' : WebSocketShardDestroyRecovery[options.recover]!}`,\n\t\t]);\n\n\t\t// Reset state\n\t\tthis.isAck = true;\n\t\tif (this.heartbeatInterval) {\n\t\t\tclearInterval(this.heartbeatInterval);\n\t\t}\n\t\tthis.lastHeartbeatAt = -1;\n\n\t\t// Clear session state if applicable\n\t\tif (options.recover !== WebSocketShardDestroyRecovery.Resume && this.session) {\n\t\t\tthis.session = null;\n\t\t\tawait this.strategy.updateSessionInfo(this.id, null);\n\t\t}\n\n\t\tif (\n\t\t\tthis.connection &&\n\t\t\t(this.connection.readyState === WebSocket.OPEN || this.connection.readyState === WebSocket.CONNECTING)\n\t\t) {\n\t\t\tthis.connection.close(options.code, options.reason);\n\t\t}\n\n\t\tthis.status = WebSocketShardStatus.Idle;\n\n\t\tif (options.recover !== undefined) {\n\t\t\treturn this.connect();\n\t\t}\n\t}\n\n\tprivate async waitForEvent(event: WebSocketShardEvents, timeoutDuration?: number | null) {\n\t\tthis.debug([`Waiting for event ${event} for ${timeoutDuration ? `${timeoutDuration}ms` : 'indefinitely'}`]);\n\t\tconst controller = new AbortController();\n\t\tconst timeout = timeoutDuration ? setTimeout(() => controller.abort(), timeoutDuration).unref() : null;\n\t\tif (timeout) {\n\t\t\tthis.timeouts.set(event, timeout);\n\t\t}\n\t\tawait once(this, event, { signal: controller.signal });\n\t\tif (timeout) {\n\t\t\tclearTimeout(timeout);\n\t\t\tthis.timeouts.delete(event);\n\t\t}\n\t}\n\n\tpublic async send(payload: GatewaySendPayload) {\n\t\tif (!this.connection) {\n\t\t\tthrow new Error(\"WebSocketShard wasn't connected\");\n\t\t}\n\n\t\tif (this.status !== WebSocketShardStatus.Ready && !ImportantGatewayOpcodes.has(payload.op)) {\n\t\t\tawait once(this, WebSocketShardEvents.Ready);\n\t\t}\n\n\t\tawait this.sendQueue.wait();\n\n\t\tif (--this.sendRateLimitState.remaining <= 0) {\n\t\t\tif (this.sendRateLimitState.resetAt < Date.now()) {\n\t\t\t\tawait sleep(Date.now() - this.sendRateLimitState.resetAt);\n\t\t\t}\n\n\t\t\tthis.sendRateLimitState = {\n\t\t\t\tremaining: 119,\n\t\t\t\tresetAt: Date.now() + 60_000,\n\t\t\t};\n\t\t}\n\n\t\tthis.sendQueue.shift();\n\t\tthis.connection.send(JSON.stringify(payload));\n\t}\n\n\tprivate async identify() {\n\t\tthis.debug([\n\t\t\t'Identifying',\n\t\t\t`shard id: ${this.id.toString()}`,\n\t\t\t`shard count: ${this.strategy.options.shardCount}`,\n\t\t\t`intents: ${this.strategy.options.intents}`,\n\t\t\t`compression: ${this.inflate ? 'zlib-stream' : this.useIdentifyCompress ? 'identify' : 'none'}`,\n\t\t]);\n\t\tconst d: GatewayIdentifyData = {\n\t\t\ttoken: this.strategy.options.token,\n\t\t\tproperties: this.strategy.options.identifyProperties,\n\t\t\tintents: this.strategy.options.intents,\n\t\t\tcompress: this.useIdentifyCompress,\n\t\t\tshard: [this.id, this.strategy.options.shardCount],\n\t\t};\n\n\t\tif (this.strategy.options.largeThreshold) {\n\t\t\td.large_threshold = this.strategy.options.largeThreshold;\n\t\t}\n\n\t\tif (this.strategy.options.initialPresence) {\n\t\t\td.presence = this.strategy.options.initialPresence;\n\t\t}\n\n\t\tawait this.send({\n\t\t\top: GatewayOpcodes.Identify,\n\t\t\td,\n\t\t});\n\n\t\tawait this.waitForEvent(WebSocketShardEvents.Ready, this.strategy.options.readyTimeout);\n\t\tthis.status = WebSocketShardStatus.Ready;\n\t}\n\n\tprivate resume(session: SessionInfo) {\n\t\tthis.debug(['Resuming session']);\n\t\tthis.status = WebSocketShardStatus.Resuming;\n\t\tthis.replayedEvents = 0;\n\t\treturn this.send({\n\t\t\top: GatewayOpcodes.Resume,\n\t\t\td: {\n\t\t\t\ttoken: this.strategy.options.token,\n\t\t\t\tseq: session.sequence,\n\t\t\t\tsession_id: session.sessionId,\n\t\t\t},\n\t\t});\n\t}\n\n\tprivate async heartbeat(requested = false) {\n\t\tif (!this.isAck && !requested) {\n\t\t\treturn this.destroy({ reason: 'Zombie connection', recover: WebSocketShardDestroyRecovery.Resume });\n\t\t}\n\n\t\tawait this.send({\n\t\t\top: GatewayOpcodes.Heartbeat,\n\t\t\td: this.session?.sequence ?? null,\n\t\t});\n\n\t\tthis.lastHeartbeatAt = Date.now();\n\t\tthis.isAck = false;\n\t}\n\n\tprivate async unpackMessage(data: Buffer | ArrayBuffer, isBinary: boolean): Promise<GatewayReceivePayload | null> {\n\t\tconst decompressable = new Uint8Array(data);\n\n\t\t// Deal with no compression\n\t\tif (!isBinary) {\n\t\t\treturn JSON.parse(this.textDecoder.decode(decompressable)) as GatewayReceivePayload;\n\t\t}\n\n\t\t// Deal with identify compress\n\t\tif (this.useIdentifyCompress) {\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tinflate(decompressable, { chunkSize: 65535 }, (err, result) => {\n\t\t\t\t\tif (err) {\n\t\t\t\t\t\treturn reject(err);\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve(JSON.parse(this.textDecoder.decode(result)) as GatewayReceivePayload);\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\t// Deal with gw wide zlib-stream compression\n\t\tif (this.inflate) {\n\t\t\tconst l = decompressable.length;\n\t\t\tconst flush =\n\t\t\t\tl >= 4 &&\n\t\t\t\tdecompressable[l - 4] === 0x00 &&\n\t\t\t\tdecompressable[l - 3] === 0x00 &&\n\t\t\t\tdecompressable[l - 2] === 0xff &&\n\t\t\t\tdecompressable[l - 1] === 0xff;\n\n\t\t\tconst zlib = (await getZlibSync())!;\n\t\t\tthis.inflate.push(Buffer.from(decompressable), flush ? zlib.Z_SYNC_FLUSH : zlib.Z_NO_FLUSH);\n\n\t\t\tif (this.inflate.err) {\n\t\t\t\tthis.emit('error', `${this.inflate.err}${this.inflate.msg ? `: ${this.inflate.msg}` : ''}`);\n\t\t\t}\n\n\t\t\tif (!flush) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst { result } = this.inflate;\n\t\t\tif (!result) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn JSON.parse(typeof result === 'string' ? result : this.textDecoder.decode(result)) as GatewayReceivePayload;\n\t\t}\n\n\t\tthis.debug([\n\t\t\t'Received a message we were unable to decompress',\n\t\t\t`isBinary: ${isBinary.toString()}`,\n\t\t\t`useIdentifyCompress: ${this.useIdentifyCompress.toString()}`,\n\t\t\t`inflate: ${Boolean(this.inflate).toString()}`,\n\t\t]);\n\n\t\treturn null;\n\t}\n\n\tprivate async onMessage(data: RawData, isBinary: boolean) {\n\t\tconst payload = await this.unpackMessage(data as Buffer | ArrayBuffer, isBinary);\n\t\tif (!payload) {\n\t\t\treturn;\n\t\t}\n\n\t\tswitch (payload.op) {\n\t\t\tcase GatewayOpcodes.Dispatch: {\n\t\t\t\tif (this.status === WebSocketShardStatus.Ready || this.status === WebSocketShardStatus.Resuming) {\n\t\t\t\t\tthis.emit(WebSocketShardEvents.Dispatch, { data: payload });\n\t\t\t\t}\n\n\t\t\t\tif (this.status === WebSocketShardStatus.Resuming) {\n\t\t\t\t\tthis.replayedEvents++;\n\t\t\t\t}\n\n\t\t\t\tswitch (payload.t) {\n\t\t\t\t\tcase GatewayDispatchEvents.Ready: {\n\t\t\t\t\t\tthis.emit(WebSocketShardEvents.Ready);\n\n\t\t\t\t\t\tthis.session ??= {\n\t\t\t\t\t\t\tsequence: payload.s,\n\t\t\t\t\t\t\tsessionId: payload.d.session_id,\n\t\t\t\t\t\t\tshardId: this.id,\n\t\t\t\t\t\t\tshardCount: this.strategy.options.shardCount,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tawait this.strategy.updateSessionInfo(this.id, this.session);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcase GatewayDispatchEvents.Resumed: {\n\t\t\t\t\t\tthis.status = WebSocketShardStatus.Ready;\n\t\t\t\t\t\tthis.debug([`Resumed and replayed ${this.replayedEvents} events`]);\n\t\t\t\t\t\tthis.emit(WebSocketShardEvents.Resumed);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tdefault: {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this.session) {\n\t\t\t\t\tif (payload.s > this.session.sequence) {\n\t\t\t\t\t\tthis.session.sequence = payload.s;\n\t\t\t\t\t\tawait this.strategy.updateSessionInfo(this.id, this.session);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase GatewayOpcodes.Heartbeat: {\n\t\t\t\tawait this.heartbeat(true);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase GatewayOpcodes.Reconnect: {\n\t\t\t\tawait this.destroy({\n\t\t\t\t\treason: 'Told to reconnect by Discord',\n\t\t\t\t\trecover: WebSocketShardDestroyRecovery.Resume,\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase GatewayOpcodes.InvalidSession: {\n\t\t\t\tconst readyTimeout = this.timeouts.get(WebSocketShardEvents.Ready);\n\t\t\t\treadyTimeout?.refresh();\n\t\t\t\tthis.debug([`Invalid session; will attempt to resume: ${payload.d.toString()}`]);\n\t\t\t\tconst session = this.session ?? (await this.strategy.retrieveSessionInfo(this.id));\n\t\t\t\tif (payload.d && session) {\n\t\t\t\t\tawait this.resume(session);\n\t\t\t\t} else {\n\t\t\t\t\tawait this.destroy({\n\t\t\t\t\t\treason: 'Invalid session',\n\t\t\t\t\t\trecover: WebSocketShardDestroyRecovery.Reconnect,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase GatewayOpcodes.Hello: {\n\t\t\t\tthis.emit(WebSocketShardEvents.Hello);\n\t\t\t\tthis.debug([`Starting to heartbeat every ${payload.d.heartbeat_interval}ms`]);\n\t\t\t\tthis.heartbeatInterval = setInterval(() => void this.heartbeat(), payload.d.heartbeat_interval);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase GatewayOpcodes.HeartbeatAck: {\n\t\t\t\tthis.isAck = true;\n\t\t\t\tthis.debug([`Got heartbeat ack after ${Date.now() - this.lastHeartbeatAt}ms`]);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate onError(err: Error) {\n\t\tthis.emit('error', { err });\n\t}\n\n\tprivate async onClose(code: number) {\n\t\tswitch (code) {\n\t\t\tcase 1000:\n\t\t\tcase 4200: {\n\t\t\t\tthis.debug([`Disconnected normally from code ${code}`]);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase GatewayCloseCodes.UnknownError: {\n\t\t\t\tthis.debug([`An unknown error occured: ${code}`]);\n\t\t\t\treturn this.destroy({ code, recover: WebSocketShardDestroyRecovery.Resume });\n\t\t\t}\n\n\t\t\tcase GatewayCloseCodes.UnknownOpcode: {\n\t\t\t\tthis.debug(['An invalid opcode was sent to Discord.']);\n\t\t\t\treturn this.destroy({ code, recover: WebSocketShardDestroyRecovery.Resume });\n\t\t\t}\n\n\t\t\tcase GatewayCloseCodes.DecodeError: {\n\t\t\t\tthis.debug(['An invalid payload was sent to Discord.']);\n\t\t\t\treturn this.destroy({ code, recover: WebSocketShardDestroyRecovery.Resume });\n\t\t\t}\n\n\t\t\tcase GatewayCloseCodes.NotAuthenticated: {\n\t\t\t\tthis.debug(['A request was somehow sent before the identify/resume payload.']);\n\t\t\t\treturn this.destroy({ code, recover: WebSocketShardDestroyRecovery.Reconnect });\n\t\t\t}\n\n\t\t\tcase GatewayCloseCodes.AuthenticationFailed: {\n\t\t\t\tthrow new Error('Authentication failed');\n\t\t\t}\n\n\t\t\tcase GatewayCloseCodes.AlreadyAuthenticated: {\n\t\t\t\tthis.debug(['More than one auth payload was sent.']);\n\t\t\t\treturn this.destroy({ code, recover: WebSocketShardDestroyRecovery.Reconnect });\n\t\t\t}\n\n\t\t\tcase GatewayCloseCodes.InvalidSeq: {\n\t\t\t\tthis.debug(['An invalid sequence was sent.']);\n\t\t\t\treturn this.destroy({ code, recover: WebSocketShardDestroyRecovery.Reconnect });\n\t\t\t}\n\n\t\t\tcase GatewayCloseCodes.RateLimited: {\n\t\t\t\tthis.debug(['The WebSocket rate limit has been hit, this should never happen']);\n\t\t\t\treturn this.destroy({ code, recover: WebSocketShardDestroyRecovery.Reconnect });\n\t\t\t}\n\n\t\t\tcase GatewayCloseCodes.SessionTimedOut: {\n\t\t\t\tthis.debug(['Session timed out.']);\n\t\t\t\treturn this.destroy({ code, recover: WebSocketShardDestroyRecovery.Resume });\n\t\t\t}\n\n\t\t\tcase GatewayCloseCodes.InvalidShard: {\n\t\t\t\tthrow new Error('Invalid shard');\n\t\t\t}\n\n\t\t\tcase GatewayCloseCodes.ShardingRequired: {\n\t\t\t\tthrow new Error('Sharding is required');\n\t\t\t}\n\n\t\t\tcase GatewayCloseCodes.InvalidAPIVersion: {\n\t\t\t\tthrow new Error('Used an invalid API version');\n\t\t\t}\n\n\t\t\tcase GatewayCloseCodes.InvalidIntents: {\n\t\t\t\tthrow new Error('Used invalid intents');\n\t\t\t}\n\n\t\t\tcase GatewayCloseCodes.DisallowedIntents: {\n\t\t\t\tthrow new Error('Used disallowed intents');\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tthis.debug([`The gateway closed with an unexpected code ${code}, attempting to resume.`]);\n\t\t\t\treturn this.destroy({ code, recover: WebSocketShardDestroyRecovery.Resume });\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate debug(messages: [string, ...string[]]) {\n\t\tconst message = `${messages[0]}${\n\t\t\tmessages.length > 1\n\t\t\t\t? `\\n${messages\n\t\t\t\t\t\t.slice(1)\n\t\t\t\t\t\t.map((m) => `\t${m}`)\n\t\t\t\t\t\t.join('\\n')}`\n\t\t\t\t: ''\n\t\t}`;\n\n\t\tthis.emit(WebSocketShardEvents.Debug, { message });\n\t}\n}\n"],"names":["sleep"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,87 @@
1
+ {
2
+ "name": "@discordjs/ws",
3
+ "version": "0.1.0",
4
+ "description": "Wrapper around Discord's gateway",
5
+ "scripts": {
6
+ "test": "vitest run",
7
+ "build": "unbuild",
8
+ "lint": "prettier --check . && eslint src __tests__ --ext mjs,js,ts",
9
+ "format": "prettier --write . && eslint src __tests__ --ext mjs,js,ts --fix",
10
+ "docs": "docgen -i src/index.ts -c docs/index.json -o docs/docs.json --typescript && api-extractor run --local",
11
+ "prepack": "yarn build && yarn lint",
12
+ "changelog": "git cliff --prepend ./CHANGELOG.md -u -c ./cliff.toml -r ../../ --include-path 'packages/ws/*'",
13
+ "release": "cliff-jumper"
14
+ },
15
+ "main": "./dist/index.cjs",
16
+ "module": "./dist/index.mjs",
17
+ "typings": "./dist/index.d.ts",
18
+ "exports": {
19
+ "import": "./dist/index.mjs",
20
+ "require": "./dist/index.cjs",
21
+ "types": "./dist/index.d.ts"
22
+ },
23
+ "directories": {
24
+ "lib": "src",
25
+ "test": "__tests__"
26
+ },
27
+ "files": [
28
+ "dist"
29
+ ],
30
+ "contributors": [
31
+ "Crawl <icrawltogo@gmail.com>",
32
+ "Amish Shah <amishshah.2k@gmail.com>",
33
+ "SpaceEEC <spaceeec@yahoo.com>",
34
+ "Vlad Frangu <kingdgrizzle@gmail.com>",
35
+ "Antonio Roman <kyradiscord@gmail.com>",
36
+ "DD <didinele.dev@gmail.com>"
37
+ ],
38
+ "license": "Apache-2.0",
39
+ "keywords": [
40
+ "discord",
41
+ "api",
42
+ "gateway",
43
+ "discordapp",
44
+ "discordjs"
45
+ ],
46
+ "repository": {
47
+ "type": "git",
48
+ "url": "git+https://github.com/discordjs/discord.js.git"
49
+ },
50
+ "bugs": {
51
+ "url": "https://github.com/discordjs/discord.js/issues"
52
+ },
53
+ "homepage": "https://discord.js.org",
54
+ "dependencies": {
55
+ "@discordjs/collection": "^1.0.1",
56
+ "@discordjs/rest": "^1.0.1",
57
+ "@sapphire/async-queue": "^1.3.2",
58
+ "@types/ws": "^8.5.3",
59
+ "@vladfrangu/async_event_emitter": "^2.0.1",
60
+ "discord-api-types": "^0.36.3",
61
+ "tslib": "^2.4.0",
62
+ "ws": "^8.8.1"
63
+ },
64
+ "devDependencies": {
65
+ "@discordjs/docgen": "^0.12.0",
66
+ "@favware/cliff-jumper": "^1.8.5",
67
+ "@microsoft/api-extractor": "^7.28.6",
68
+ "@types/node": "^16.11.45",
69
+ "c8": "^7.12.0",
70
+ "eslint": "^8.20.0",
71
+ "mock-socket": "^9.1.5",
72
+ "prettier": "^2.7.1",
73
+ "rollup-plugin-typescript2": "0.32.1",
74
+ "tsup": "^6.2.0",
75
+ "typescript": "^4.7.4",
76
+ "unbuild": "^0.7.6",
77
+ "undici": "^5.8.0",
78
+ "vitest": "^0.19.1",
79
+ "zlib-sync": "^0.1.7"
80
+ },
81
+ "engines": {
82
+ "node": ">=16.9.0"
83
+ },
84
+ "publishConfig": {
85
+ "access": "public"
86
+ }
87
+ }