@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,165 @@
1
+ import { once } from 'node:events';
2
+ import { join } from 'node:path';
3
+ import { Worker } from 'node:worker_threads';
4
+ import { Collection } from '@discordjs/collection';
5
+ import { IdentifyThrottler } from '../../utils/IdentifyThrottler.mjs';
6
+ import { managerToFetchingStrategyOptions } from '../context/IContextFetchingStrategy.mjs';
7
+
8
+
9
+
10
+ // -- Unbuild CommonJS Shims --
11
+ import __cjs_url__ from 'url';
12
+ import __cjs_path__ from 'path';
13
+ import __cjs_mod__ from 'module';
14
+ const __filename = __cjs_url__.fileURLToPath(import.meta.url);
15
+ const __dirname = __cjs_path__.dirname(__filename);
16
+ const require = __cjs_mod__.createRequire(import.meta.url);
17
+ var __accessCheck = (obj, member, msg) => {
18
+ if (!member.has(obj))
19
+ throw TypeError("Cannot " + msg);
20
+ };
21
+ var __privateGet = (obj, member, getter) => {
22
+ __accessCheck(obj, member, "read from private field");
23
+ return getter ? getter.call(obj) : member.get(obj);
24
+ };
25
+ var __privateAdd = (obj, member, value) => {
26
+ if (member.has(obj))
27
+ throw TypeError("Cannot add the same private member more than once");
28
+ member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
29
+ };
30
+ var __privateSet = (obj, member, value, setter) => {
31
+ __accessCheck(obj, member, "write to private field");
32
+ setter ? setter.call(obj, value) : member.set(obj, value);
33
+ return value;
34
+ };
35
+ var _workers, _workerByShardId;
36
+ var WorkerSendPayloadOp = /* @__PURE__ */ ((WorkerSendPayloadOp2) => {
37
+ WorkerSendPayloadOp2[WorkerSendPayloadOp2["Connect"] = 0] = "Connect";
38
+ WorkerSendPayloadOp2[WorkerSendPayloadOp2["Destroy"] = 1] = "Destroy";
39
+ WorkerSendPayloadOp2[WorkerSendPayloadOp2["Send"] = 2] = "Send";
40
+ WorkerSendPayloadOp2[WorkerSendPayloadOp2["SessionInfoResponse"] = 3] = "SessionInfoResponse";
41
+ return WorkerSendPayloadOp2;
42
+ })(WorkerSendPayloadOp || {});
43
+ var WorkerRecievePayloadOp = /* @__PURE__ */ ((WorkerRecievePayloadOp2) => {
44
+ WorkerRecievePayloadOp2[WorkerRecievePayloadOp2["Connected"] = 0] = "Connected";
45
+ WorkerRecievePayloadOp2[WorkerRecievePayloadOp2["Destroyed"] = 1] = "Destroyed";
46
+ WorkerRecievePayloadOp2[WorkerRecievePayloadOp2["Event"] = 2] = "Event";
47
+ WorkerRecievePayloadOp2[WorkerRecievePayloadOp2["RetrieveSessionInfo"] = 3] = "RetrieveSessionInfo";
48
+ WorkerRecievePayloadOp2[WorkerRecievePayloadOp2["UpdateSessionInfo"] = 4] = "UpdateSessionInfo";
49
+ return WorkerRecievePayloadOp2;
50
+ })(WorkerRecievePayloadOp || {});
51
+ class WorkerShardingStrategy {
52
+ constructor(manager, options) {
53
+ __privateAdd(this, _workers, []);
54
+ __privateAdd(this, _workerByShardId, new Collection());
55
+ this.connectPromises = new Collection();
56
+ this.destroyPromises = new Collection();
57
+ this.manager = manager;
58
+ this.throttler = new IdentifyThrottler(manager);
59
+ this.options = options;
60
+ }
61
+ async spawn(shardIds) {
62
+ const shardsPerWorker = this.options.shardsPerWorker === "all" ? shardIds.length : this.options.shardsPerWorker;
63
+ const strategyOptions = await managerToFetchingStrategyOptions(this.manager);
64
+ let shards = 0;
65
+ while (shards !== shardIds.length) {
66
+ const slice = shardIds.slice(shards, shardsPerWorker + shards);
67
+ const workerData = {
68
+ ...strategyOptions,
69
+ shardIds: slice
70
+ };
71
+ const worker = new Worker(join(__dirname, "worker.cjs"), { workerData });
72
+ await once(worker, "online");
73
+ worker.on("error", (err) => {
74
+ throw err;
75
+ }).on("messageerror", (err) => {
76
+ throw err;
77
+ }).on("message", (payload) => this.onMessage(worker, payload));
78
+ __privateGet(this, _workers).push(worker);
79
+ for (const shardId of slice) {
80
+ __privateGet(this, _workerByShardId).set(shardId, worker);
81
+ }
82
+ shards += slice.length;
83
+ }
84
+ }
85
+ async connect() {
86
+ const promises = [];
87
+ for (const [shardId, worker] of __privateGet(this, _workerByShardId).entries()) {
88
+ await this.throttler.waitForIdentify();
89
+ const payload = {
90
+ op: 0 /* Connect */,
91
+ shardId
92
+ };
93
+ const promise = new Promise((resolve) => this.connectPromises.set(shardId, resolve));
94
+ worker.postMessage(payload);
95
+ promises.push(promise);
96
+ }
97
+ await Promise.all(promises);
98
+ }
99
+ async destroy(options = {}) {
100
+ const promises = [];
101
+ for (const [shardId, worker] of __privateGet(this, _workerByShardId).entries()) {
102
+ const payload = {
103
+ op: 1 /* Destroy */,
104
+ shardId,
105
+ options
106
+ };
107
+ promises.push(new Promise((resolve) => this.destroyPromises.set(shardId, resolve)).then(() => worker.terminate()));
108
+ worker.postMessage(payload);
109
+ }
110
+ __privateSet(this, _workers, []);
111
+ __privateGet(this, _workerByShardId).clear();
112
+ await Promise.all(promises);
113
+ }
114
+ send(shardId, data) {
115
+ const worker = __privateGet(this, _workerByShardId).get(shardId);
116
+ if (!worker) {
117
+ throw new Error(`No worker found for shard ${shardId}`);
118
+ }
119
+ const payload = {
120
+ op: 2 /* Send */,
121
+ shardId,
122
+ payload: data
123
+ };
124
+ worker.postMessage(payload);
125
+ }
126
+ async onMessage(worker, payload) {
127
+ switch (payload.op) {
128
+ case 0 /* Connected */: {
129
+ const resolve = this.connectPromises.get(payload.shardId);
130
+ resolve();
131
+ this.connectPromises.delete(payload.shardId);
132
+ break;
133
+ }
134
+ case 1 /* Destroyed */: {
135
+ const resolve = this.destroyPromises.get(payload.shardId);
136
+ resolve();
137
+ this.destroyPromises.delete(payload.shardId);
138
+ break;
139
+ }
140
+ case 2 /* Event */: {
141
+ this.manager.emit(payload.event, { ...payload.data, shardId: payload.shardId });
142
+ break;
143
+ }
144
+ case 3 /* RetrieveSessionInfo */: {
145
+ const session = await this.manager.options.retrieveSessionInfo(payload.shardId);
146
+ const response = {
147
+ op: 3 /* SessionInfoResponse */,
148
+ nonce: payload.nonce,
149
+ session
150
+ };
151
+ worker.postMessage(response);
152
+ break;
153
+ }
154
+ case 4 /* UpdateSessionInfo */: {
155
+ await this.manager.options.updateSessionInfo(payload.shardId, payload.session);
156
+ break;
157
+ }
158
+ }
159
+ }
160
+ }
161
+ _workers = new WeakMap();
162
+ _workerByShardId = new WeakMap();
163
+
164
+ export { WorkerRecievePayloadOp, WorkerSendPayloadOp, WorkerShardingStrategy };
165
+ //# sourceMappingURL=WorkerShardingStrategy.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkerShardingStrategy.mjs","sources":["../../../src/strategies/sharding/WorkerShardingStrategy.ts"],"sourcesContent":["import { once } from 'node:events';\nimport { join } from 'node:path';\nimport { Worker } from 'node:worker_threads';\nimport { Collection } from '@discordjs/collection';\nimport type { GatewaySendPayload } from 'discord-api-types/v10';\nimport type { IShardingStrategy } from './IShardingStrategy';\nimport { IdentifyThrottler } from '../../utils/IdentifyThrottler';\nimport type { SessionInfo, WebSocketManager } from '../../ws/WebSocketManager';\nimport type { WebSocketShardDestroyOptions, WebSocketShardEvents } from '../../ws/WebSocketShard';\nimport { FetchingStrategyOptions, managerToFetchingStrategyOptions } from '../context/IContextFetchingStrategy';\n\nexport interface WorkerData extends FetchingStrategyOptions {\n\tshardIds: number[];\n}\n\nexport enum WorkerSendPayloadOp {\n\tConnect,\n\tDestroy,\n\tSend,\n\tSessionInfoResponse,\n}\n\nexport type WorkerSendPayload =\n\t| { op: WorkerSendPayloadOp.Connect; shardId: number }\n\t| { op: WorkerSendPayloadOp.Destroy; shardId: number; options?: WebSocketShardDestroyOptions }\n\t| { op: WorkerSendPayloadOp.Send; shardId: number; payload: GatewaySendPayload }\n\t| { op: WorkerSendPayloadOp.SessionInfoResponse; nonce: number; session: SessionInfo | null };\n\nexport enum WorkerRecievePayloadOp {\n\tConnected,\n\tDestroyed,\n\tEvent,\n\tRetrieveSessionInfo,\n\tUpdateSessionInfo,\n}\n\nexport type WorkerRecievePayload =\n\t| { op: WorkerRecievePayloadOp.Connected; shardId: number }\n\t| { op: WorkerRecievePayloadOp.Destroyed; shardId: number }\n\t// Can't seem to get a type-safe union based off of the event, so I'm sadly leaving data as any for now\n\t| { op: WorkerRecievePayloadOp.Event; shardId: number; event: WebSocketShardEvents; data: any }\n\t| { op: WorkerRecievePayloadOp.RetrieveSessionInfo; shardId: number; nonce: number }\n\t| { op: WorkerRecievePayloadOp.UpdateSessionInfo; shardId: number; session: SessionInfo | null };\n\n/**\n * Options for a {@link WorkerShardingStrategy}\n */\nexport interface WorkerShardingStrategyOptions {\n\t/**\n\t * Dictates how many shards should be spawned per worker thread.\n\t */\n\tshardsPerWorker: number | 'all';\n}\n\n/**\n * Strategy used to spawn threads in worker_threads\n */\nexport class WorkerShardingStrategy implements IShardingStrategy {\n\tprivate readonly manager: WebSocketManager;\n\tprivate readonly options: WorkerShardingStrategyOptions;\n\n\t#workers: Worker[] = [];\n\treadonly #workerByShardId = new Collection<number, Worker>();\n\n\tprivate readonly connectPromises = new Collection<number, () => void>();\n\tprivate readonly destroyPromises = new Collection<number, () => void>();\n\n\tprivate readonly throttler: IdentifyThrottler;\n\n\tpublic constructor(manager: WebSocketManager, options: WorkerShardingStrategyOptions) {\n\t\tthis.manager = manager;\n\t\tthis.throttler = new IdentifyThrottler(manager);\n\t\tthis.options = options;\n\t}\n\n\tpublic async spawn(shardIds: number[]) {\n\t\tconst shardsPerWorker = this.options.shardsPerWorker === 'all' ? shardIds.length : this.options.shardsPerWorker;\n\t\tconst strategyOptions = await managerToFetchingStrategyOptions(this.manager);\n\n\t\tlet shards = 0;\n\t\twhile (shards !== shardIds.length) {\n\t\t\tconst slice = shardIds.slice(shards, shardsPerWorker + shards);\n\t\t\tconst workerData: WorkerData = {\n\t\t\t\t...strategyOptions,\n\t\t\t\tshardIds: slice,\n\t\t\t};\n\n\t\t\tconst worker = new Worker(join(__dirname, 'worker.cjs'), { workerData });\n\t\t\tawait once(worker, 'online');\n\t\t\tworker\n\t\t\t\t.on('error', (err) => {\n\t\t\t\t\tthrow err;\n\t\t\t\t})\n\t\t\t\t.on('messageerror', (err) => {\n\t\t\t\t\tthrow err;\n\t\t\t\t})\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-misused-promises\n\t\t\t\t.on('message', (payload: WorkerRecievePayload) => this.onMessage(worker, payload));\n\n\t\t\tthis.#workers.push(worker);\n\t\t\tfor (const shardId of slice) {\n\t\t\t\tthis.#workerByShardId.set(shardId, worker);\n\t\t\t}\n\n\t\t\tshards += slice.length;\n\t\t}\n\t}\n\n\tpublic async connect() {\n\t\tconst promises = [];\n\n\t\tfor (const [shardId, worker] of this.#workerByShardId.entries()) {\n\t\t\tawait this.throttler.waitForIdentify();\n\n\t\t\tconst payload: WorkerSendPayload = {\n\t\t\t\top: WorkerSendPayloadOp.Connect,\n\t\t\t\tshardId,\n\t\t\t};\n\n\t\t\tconst promise = new Promise<void>((resolve) => this.connectPromises.set(shardId, resolve));\n\t\t\tworker.postMessage(payload);\n\t\t\tpromises.push(promise);\n\t\t}\n\n\t\tawait Promise.all(promises);\n\t}\n\n\tpublic async destroy(options: Omit<WebSocketShardDestroyOptions, 'recover'> = {}) {\n\t\tconst promises = [];\n\n\t\tfor (const [shardId, worker] of this.#workerByShardId.entries()) {\n\t\t\tconst payload: WorkerSendPayload = {\n\t\t\t\top: WorkerSendPayloadOp.Destroy,\n\t\t\t\tshardId,\n\t\t\t\toptions,\n\t\t\t};\n\n\t\t\tpromises.push(\n\t\t\t\tnew Promise<void>((resolve) => this.destroyPromises.set(shardId, resolve)).then(() => worker.terminate()),\n\t\t\t);\n\t\t\tworker.postMessage(payload);\n\t\t}\n\n\t\tthis.#workers = [];\n\t\tthis.#workerByShardId.clear();\n\n\t\tawait Promise.all(promises);\n\t}\n\n\tpublic send(shardId: number, data: GatewaySendPayload) {\n\t\tconst worker = this.#workerByShardId.get(shardId);\n\t\tif (!worker) {\n\t\t\tthrow new Error(`No worker found for shard ${shardId}`);\n\t\t}\n\n\t\tconst payload: WorkerSendPayload = {\n\t\t\top: WorkerSendPayloadOp.Send,\n\t\t\tshardId,\n\t\t\tpayload: data,\n\t\t};\n\t\tworker.postMessage(payload);\n\t}\n\n\tprivate async onMessage(worker: Worker, payload: WorkerRecievePayload) {\n\t\tswitch (payload.op) {\n\t\t\tcase WorkerRecievePayloadOp.Connected: {\n\t\t\t\tconst resolve = this.connectPromises.get(payload.shardId)!;\n\t\t\t\tresolve();\n\t\t\t\tthis.connectPromises.delete(payload.shardId);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase WorkerRecievePayloadOp.Destroyed: {\n\t\t\t\tconst resolve = this.destroyPromises.get(payload.shardId)!;\n\t\t\t\tresolve();\n\t\t\t\tthis.destroyPromises.delete(payload.shardId);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase WorkerRecievePayloadOp.Event: {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n\t\t\t\tthis.manager.emit(payload.event, { ...payload.data, shardId: payload.shardId });\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase WorkerRecievePayloadOp.RetrieveSessionInfo: {\n\t\t\t\tconst session = await this.manager.options.retrieveSessionInfo(payload.shardId);\n\t\t\t\tconst response: WorkerSendPayload = {\n\t\t\t\t\top: WorkerSendPayloadOp.SessionInfoResponse,\n\t\t\t\t\tnonce: payload.nonce,\n\t\t\t\t\tsession,\n\t\t\t\t};\n\t\t\t\tworker.postMessage(response);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase WorkerRecievePayloadOp.UpdateSessionInfo: {\n\t\t\t\tawait this.manager.options.updateSessionInfo(payload.shardId, payload.session);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAOU;AACV;AACA;AACA;AACA;AACA;AACA;AACU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;"}
@@ -0,0 +1,78 @@
1
+ 'use strict';
2
+
3
+ const node_worker_threads = require('node:worker_threads');
4
+ const collection = require('@discordjs/collection');
5
+ const WorkerShardingStrategy = require('./WorkerShardingStrategy.cjs');
6
+ const WebSocketShard = require('../../ws/WebSocketShard.cjs');
7
+ const WorkerContextFetchingStrategy = require('../context/WorkerContextFetchingStrategy.cjs');
8
+
9
+ if (node_worker_threads.isMainThread) {
10
+ throw new Error("Expected worker script to not be ran within the main thread");
11
+ }
12
+ const data = node_worker_threads.workerData;
13
+ const shards = new collection.Collection();
14
+ async function connect(shardId) {
15
+ const shard = shards.get(shardId);
16
+ if (!shard) {
17
+ throw new Error(`Shard ${shardId} does not exist`);
18
+ }
19
+ await shard.connect();
20
+ }
21
+ async function destroy(shardId, options) {
22
+ const shard = shards.get(shardId);
23
+ if (!shard) {
24
+ throw new Error(`Shard ${shardId} does not exist`);
25
+ }
26
+ await shard.destroy(options);
27
+ }
28
+ for (const shardId of data.shardIds) {
29
+ const shard = new WebSocketShard.WebSocketShard(new WorkerContextFetchingStrategy.WorkerContextFetchingStrategy(data), shardId);
30
+ for (const event of Object.values(WebSocketShard.WebSocketShardEvents)) {
31
+ shard.on(event, (data2) => {
32
+ const payload = {
33
+ op: WorkerShardingStrategy.WorkerRecievePayloadOp.Event,
34
+ event,
35
+ data: data2,
36
+ shardId
37
+ };
38
+ node_worker_threads.parentPort.postMessage(payload);
39
+ });
40
+ }
41
+ shards.set(shardId, shard);
42
+ }
43
+ node_worker_threads.parentPort.on("messageerror", (err) => {
44
+ throw err;
45
+ }).on("message", async (payload) => {
46
+ switch (payload.op) {
47
+ case WorkerShardingStrategy.WorkerSendPayloadOp.Connect: {
48
+ await connect(payload.shardId);
49
+ const response = {
50
+ op: WorkerShardingStrategy.WorkerRecievePayloadOp.Connected,
51
+ shardId: payload.shardId
52
+ };
53
+ node_worker_threads.parentPort.postMessage(response);
54
+ break;
55
+ }
56
+ case WorkerShardingStrategy.WorkerSendPayloadOp.Destroy: {
57
+ await destroy(payload.shardId, payload.options);
58
+ const response = {
59
+ op: WorkerShardingStrategy.WorkerRecievePayloadOp.Destroyed,
60
+ shardId: payload.shardId
61
+ };
62
+ node_worker_threads.parentPort.postMessage(response);
63
+ break;
64
+ }
65
+ case WorkerShardingStrategy.WorkerSendPayloadOp.Send: {
66
+ const shard = shards.get(payload.shardId);
67
+ if (!shard) {
68
+ throw new Error(`Shard ${payload.shardId} does not exist`);
69
+ }
70
+ await shard.send(payload.payload);
71
+ break;
72
+ }
73
+ case WorkerShardingStrategy.WorkerSendPayloadOp.SessionInfoResponse: {
74
+ break;
75
+ }
76
+ }
77
+ });
78
+ //# sourceMappingURL=worker.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.cjs","sources":["../../../src/strategies/sharding/worker.ts"],"sourcesContent":["import { isMainThread, workerData, parentPort } from 'node:worker_threads';\nimport { Collection } from '@discordjs/collection';\nimport {\n\tWorkerData,\n\tWorkerRecievePayload,\n\tWorkerRecievePayloadOp,\n\tWorkerSendPayload,\n\tWorkerSendPayloadOp,\n} from './WorkerShardingStrategy';\nimport { WebSocketShard, WebSocketShardDestroyOptions, WebSocketShardEvents } from '../../ws/WebSocketShard';\nimport { WorkerContextFetchingStrategy } from '../context/WorkerContextFetchingStrategy';\n\nif (isMainThread) {\n\tthrow new Error('Expected worker script to not be ran within the main thread');\n}\n\nconst data = workerData as WorkerData;\nconst shards = new Collection<number, WebSocketShard>();\n\nasync function connect(shardId: number) {\n\tconst shard = shards.get(shardId);\n\tif (!shard) {\n\t\tthrow new Error(`Shard ${shardId} does not exist`);\n\t}\n\tawait shard.connect();\n}\n\nasync function destroy(shardId: number, options?: WebSocketShardDestroyOptions) {\n\tconst shard = shards.get(shardId);\n\tif (!shard) {\n\t\tthrow new Error(`Shard ${shardId} does not exist`);\n\t}\n\tawait shard.destroy(options);\n}\n\nfor (const shardId of data.shardIds) {\n\tconst shard = new WebSocketShard(new WorkerContextFetchingStrategy(data), shardId);\n\tfor (const event of Object.values(WebSocketShardEvents)) {\n\t\t// @ts-expect-error\n\t\tshard.on(event, (data) => {\n\t\t\tconst payload: WorkerRecievePayload = {\n\t\t\t\top: WorkerRecievePayloadOp.Event,\n\t\t\t\tevent,\n\t\t\t\tdata,\n\t\t\t\tshardId,\n\t\t\t};\n\t\t\tparentPort!.postMessage(payload);\n\t\t});\n\t}\n\tshards.set(shardId, shard);\n}\n\nparentPort!\n\t.on('messageerror', (err) => {\n\t\tthrow err;\n\t})\n\t// eslint-disable-next-line @typescript-eslint/no-misused-promises\n\t.on('message', async (payload: WorkerSendPayload) => {\n\t\tswitch (payload.op) {\n\t\t\tcase WorkerSendPayloadOp.Connect: {\n\t\t\t\tawait connect(payload.shardId);\n\t\t\t\tconst response: WorkerRecievePayload = {\n\t\t\t\t\top: WorkerRecievePayloadOp.Connected,\n\t\t\t\t\tshardId: payload.shardId,\n\t\t\t\t};\n\t\t\t\tparentPort!.postMessage(response);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase WorkerSendPayloadOp.Destroy: {\n\t\t\t\tawait destroy(payload.shardId, payload.options);\n\t\t\t\tconst response: WorkerRecievePayload = {\n\t\t\t\t\top: WorkerRecievePayloadOp.Destroyed,\n\t\t\t\t\tshardId: payload.shardId,\n\t\t\t\t};\n\t\t\t\tparentPort!.postMessage(response);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase WorkerSendPayloadOp.Send: {\n\t\t\t\tconst shard = shards.get(payload.shardId);\n\t\t\t\tif (!shard) {\n\t\t\t\t\tthrow new Error(`Shard ${payload.shardId} does not exist`);\n\t\t\t\t}\n\t\t\t\tawait shard.send(payload.payload);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase WorkerSendPayloadOp.SessionInfoResponse: {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t});\n"],"names":["isMainThread","workerData","Collection","WebSocketShard","WorkerContextFetchingStrategy","WebSocketShardEvents","WorkerRecievePayloadOp","parentPort","WorkerSendPayloadOp"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../../src/strategies/sharding/worker.ts"],"names":[],"mappings":""}
@@ -0,0 +1,76 @@
1
+ import { isMainThread, parentPort, workerData } from 'node:worker_threads';
2
+ import { Collection } from '@discordjs/collection';
3
+ import { WorkerRecievePayloadOp, WorkerSendPayloadOp } from './WorkerShardingStrategy.mjs';
4
+ import { WebSocketShard, WebSocketShardEvents } from '../../ws/WebSocketShard.mjs';
5
+ import { WorkerContextFetchingStrategy } from '../context/WorkerContextFetchingStrategy.mjs';
6
+
7
+ if (isMainThread) {
8
+ throw new Error("Expected worker script to not be ran within the main thread");
9
+ }
10
+ const data = workerData;
11
+ const shards = new Collection();
12
+ async function connect(shardId) {
13
+ const shard = shards.get(shardId);
14
+ if (!shard) {
15
+ throw new Error(`Shard ${shardId} does not exist`);
16
+ }
17
+ await shard.connect();
18
+ }
19
+ async function destroy(shardId, options) {
20
+ const shard = shards.get(shardId);
21
+ if (!shard) {
22
+ throw new Error(`Shard ${shardId} does not exist`);
23
+ }
24
+ await shard.destroy(options);
25
+ }
26
+ for (const shardId of data.shardIds) {
27
+ const shard = new WebSocketShard(new WorkerContextFetchingStrategy(data), shardId);
28
+ for (const event of Object.values(WebSocketShardEvents)) {
29
+ shard.on(event, (data2) => {
30
+ const payload = {
31
+ op: WorkerRecievePayloadOp.Event,
32
+ event,
33
+ data: data2,
34
+ shardId
35
+ };
36
+ parentPort.postMessage(payload);
37
+ });
38
+ }
39
+ shards.set(shardId, shard);
40
+ }
41
+ parentPort.on("messageerror", (err) => {
42
+ throw err;
43
+ }).on("message", async (payload) => {
44
+ switch (payload.op) {
45
+ case WorkerSendPayloadOp.Connect: {
46
+ await connect(payload.shardId);
47
+ const response = {
48
+ op: WorkerRecievePayloadOp.Connected,
49
+ shardId: payload.shardId
50
+ };
51
+ parentPort.postMessage(response);
52
+ break;
53
+ }
54
+ case WorkerSendPayloadOp.Destroy: {
55
+ await destroy(payload.shardId, payload.options);
56
+ const response = {
57
+ op: WorkerRecievePayloadOp.Destroyed,
58
+ shardId: payload.shardId
59
+ };
60
+ parentPort.postMessage(response);
61
+ break;
62
+ }
63
+ case WorkerSendPayloadOp.Send: {
64
+ const shard = shards.get(payload.shardId);
65
+ if (!shard) {
66
+ throw new Error(`Shard ${payload.shardId} does not exist`);
67
+ }
68
+ await shard.send(payload.payload);
69
+ break;
70
+ }
71
+ case WorkerSendPayloadOp.SessionInfoResponse: {
72
+ break;
73
+ }
74
+ }
75
+ });
76
+ //# sourceMappingURL=worker.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.mjs","sources":["../../../src/strategies/sharding/worker.ts"],"sourcesContent":["import { isMainThread, workerData, parentPort } from 'node:worker_threads';\nimport { Collection } from '@discordjs/collection';\nimport {\n\tWorkerData,\n\tWorkerRecievePayload,\n\tWorkerRecievePayloadOp,\n\tWorkerSendPayload,\n\tWorkerSendPayloadOp,\n} from './WorkerShardingStrategy';\nimport { WebSocketShard, WebSocketShardDestroyOptions, WebSocketShardEvents } from '../../ws/WebSocketShard';\nimport { WorkerContextFetchingStrategy } from '../context/WorkerContextFetchingStrategy';\n\nif (isMainThread) {\n\tthrow new Error('Expected worker script to not be ran within the main thread');\n}\n\nconst data = workerData as WorkerData;\nconst shards = new Collection<number, WebSocketShard>();\n\nasync function connect(shardId: number) {\n\tconst shard = shards.get(shardId);\n\tif (!shard) {\n\t\tthrow new Error(`Shard ${shardId} does not exist`);\n\t}\n\tawait shard.connect();\n}\n\nasync function destroy(shardId: number, options?: WebSocketShardDestroyOptions) {\n\tconst shard = shards.get(shardId);\n\tif (!shard) {\n\t\tthrow new Error(`Shard ${shardId} does not exist`);\n\t}\n\tawait shard.destroy(options);\n}\n\nfor (const shardId of data.shardIds) {\n\tconst shard = new WebSocketShard(new WorkerContextFetchingStrategy(data), shardId);\n\tfor (const event of Object.values(WebSocketShardEvents)) {\n\t\t// @ts-expect-error\n\t\tshard.on(event, (data) => {\n\t\t\tconst payload: WorkerRecievePayload = {\n\t\t\t\top: WorkerRecievePayloadOp.Event,\n\t\t\t\tevent,\n\t\t\t\tdata,\n\t\t\t\tshardId,\n\t\t\t};\n\t\t\tparentPort!.postMessage(payload);\n\t\t});\n\t}\n\tshards.set(shardId, shard);\n}\n\nparentPort!\n\t.on('messageerror', (err) => {\n\t\tthrow err;\n\t})\n\t// eslint-disable-next-line @typescript-eslint/no-misused-promises\n\t.on('message', async (payload: WorkerSendPayload) => {\n\t\tswitch (payload.op) {\n\t\t\tcase WorkerSendPayloadOp.Connect: {\n\t\t\t\tawait connect(payload.shardId);\n\t\t\t\tconst response: WorkerRecievePayload = {\n\t\t\t\t\top: WorkerRecievePayloadOp.Connected,\n\t\t\t\t\tshardId: payload.shardId,\n\t\t\t\t};\n\t\t\t\tparentPort!.postMessage(response);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase WorkerSendPayloadOp.Destroy: {\n\t\t\t\tawait destroy(payload.shardId, payload.options);\n\t\t\t\tconst response: WorkerRecievePayload = {\n\t\t\t\t\top: WorkerRecievePayloadOp.Destroyed,\n\t\t\t\t\tshardId: payload.shardId,\n\t\t\t\t};\n\t\t\t\tparentPort!.postMessage(response);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase WorkerSendPayloadOp.Send: {\n\t\t\t\tconst shard = shards.get(payload.shardId);\n\t\t\t\tif (!shard) {\n\t\t\t\t\tthrow new Error(`Shard ${payload.shardId} does not exist`);\n\t\t\t\t}\n\t\t\t\tawait shard.send(payload.payload);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase WorkerSendPayloadOp.SessionInfoResponse: {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t});\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ const promises = require('node:timers/promises');
6
+
7
+ class IdentifyThrottler {
8
+ constructor(manager) {
9
+ this.manager = manager;
10
+ this.identifyState = {
11
+ remaining: 0,
12
+ resetsAt: Infinity
13
+ };
14
+ }
15
+ async waitForIdentify() {
16
+ if (this.identifyState.remaining <= 0) {
17
+ const diff = this.identifyState.resetsAt - Date.now();
18
+ if (diff <= 5e3) {
19
+ const time = diff + Math.random() * 1500;
20
+ await promises.setTimeout(time);
21
+ }
22
+ const info = await this.manager.fetchGatewayInformation();
23
+ this.identifyState = {
24
+ remaining: info.session_start_limit.max_concurrency,
25
+ resetsAt: Date.now() + 5e3
26
+ };
27
+ }
28
+ this.identifyState.remaining--;
29
+ }
30
+ }
31
+
32
+ exports.IdentifyThrottler = IdentifyThrottler;
33
+ //# sourceMappingURL=IdentifyThrottler.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IdentifyThrottler.cjs","sources":["../../src/utils/IdentifyThrottler.ts"],"sourcesContent":["import { setTimeout as sleep } from 'node:timers/promises';\nimport type { WebSocketManager } from '../ws/WebSocketManager';\n\nexport class IdentifyThrottler {\n\tprivate identifyState = {\n\t\tremaining: 0,\n\t\tresetsAt: Infinity,\n\t};\n\n\tpublic constructor(private readonly manager: WebSocketManager) {}\n\n\tpublic async waitForIdentify(): Promise<void> {\n\t\tif (this.identifyState.remaining <= 0) {\n\t\t\tconst diff = this.identifyState.resetsAt - Date.now();\n\t\t\tif (diff <= 5_000) {\n\t\t\t\tconst time = diff + Math.random() * 1_500;\n\t\t\t\tawait sleep(time);\n\t\t\t}\n\n\t\t\tconst info = await this.manager.fetchGatewayInformation();\n\t\t\tthis.identifyState = {\n\t\t\t\tremaining: info.session_start_limit.max_concurrency,\n\t\t\t\tresetsAt: Date.now() + 5_000,\n\t\t\t};\n\t\t}\n\n\t\tthis.identifyState.remaining--;\n\t}\n}\n"],"names":["sleep"],"mappings":";;;;;;AACO,MAAM,iBAAiB,CAAC;AAC/B,EAAE,WAAW,CAAC,OAAO,EAAE;AACvB,IAAI,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;AAC3B,IAAI,IAAI,CAAC,aAAa,GAAG;AACzB,MAAM,SAAS,EAAE,CAAC;AAClB,MAAM,QAAQ,EAAE,QAAQ;AACxB,KAAK,CAAC;AACN,GAAG;AACH,EAAE,MAAM,eAAe,GAAG;AAC1B,IAAI,IAAI,IAAI,CAAC,aAAa,CAAC,SAAS,IAAI,CAAC,EAAE;AAC3C,MAAM,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAC5D,MAAM,IAAI,IAAI,IAAI,GAAG,EAAE;AACvB,QAAQ,MAAM,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;AACjD,QAAQ,MAAMA,mBAAK,CAAC,IAAI,CAAC,CAAC;AAC1B,OAAO;AACP,MAAM,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,CAAC;AAChE,MAAM,IAAI,CAAC,aAAa,GAAG;AAC3B,QAAQ,SAAS,EAAE,IAAI,CAAC,mBAAmB,CAAC,eAAe;AAC3D,QAAQ,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG;AAClC,OAAO,CAAC;AACR,KAAK;AACL,IAAI,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;AACnC,GAAG;AACH;;;;"}
@@ -0,0 +1,8 @@
1
+ import type { WebSocketManager } from '../ws/WebSocketManager';
2
+ export declare class IdentifyThrottler {
3
+ private readonly manager;
4
+ private identifyState;
5
+ constructor(manager: WebSocketManager);
6
+ waitForIdentify(): Promise<void>;
7
+ }
8
+ //# sourceMappingURL=IdentifyThrottler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IdentifyThrottler.d.ts","sourceRoot":"","sources":["../../src/utils/IdentifyThrottler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,qBAAa,iBAAiB;IAMV,OAAO,CAAC,QAAQ,CAAC,OAAO;IAL3C,OAAO,CAAC,aAAa,CAGnB;gBAEkC,OAAO,EAAE,gBAAgB;IAEhD,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;CAiB7C"}
@@ -0,0 +1,29 @@
1
+ import { setTimeout } from 'node:timers/promises';
2
+
3
+ class IdentifyThrottler {
4
+ constructor(manager) {
5
+ this.manager = manager;
6
+ this.identifyState = {
7
+ remaining: 0,
8
+ resetsAt: Infinity
9
+ };
10
+ }
11
+ async waitForIdentify() {
12
+ if (this.identifyState.remaining <= 0) {
13
+ const diff = this.identifyState.resetsAt - Date.now();
14
+ if (diff <= 5e3) {
15
+ const time = diff + Math.random() * 1500;
16
+ await setTimeout(time);
17
+ }
18
+ const info = await this.manager.fetchGatewayInformation();
19
+ this.identifyState = {
20
+ remaining: info.session_start_limit.max_concurrency,
21
+ resetsAt: Date.now() + 5e3
22
+ };
23
+ }
24
+ this.identifyState.remaining--;
25
+ }
26
+ }
27
+
28
+ export { IdentifyThrottler };
29
+ //# sourceMappingURL=IdentifyThrottler.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IdentifyThrottler.mjs","sources":["../../src/utils/IdentifyThrottler.ts"],"sourcesContent":["import { setTimeout as sleep } from 'node:timers/promises';\nimport type { WebSocketManager } from '../ws/WebSocketManager';\n\nexport class IdentifyThrottler {\n\tprivate identifyState = {\n\t\tremaining: 0,\n\t\tresetsAt: Infinity,\n\t};\n\n\tpublic constructor(private readonly manager: WebSocketManager) {}\n\n\tpublic async waitForIdentify(): Promise<void> {\n\t\tif (this.identifyState.remaining <= 0) {\n\t\t\tconst diff = this.identifyState.resetsAt - Date.now();\n\t\t\tif (diff <= 5_000) {\n\t\t\t\tconst time = diff + Math.random() * 1_500;\n\t\t\t\tawait sleep(time);\n\t\t\t}\n\n\t\t\tconst info = await this.manager.fetchGatewayInformation();\n\t\t\tthis.identifyState = {\n\t\t\t\tremaining: info.session_start_limit.max_concurrency,\n\t\t\t\tresetsAt: Date.now() + 5_000,\n\t\t\t};\n\t\t}\n\n\t\tthis.identifyState.remaining--;\n\t}\n}\n"],"names":["sleep"],"mappings":";;AACO,MAAM,iBAAiB,CAAC;AAC/B,EAAE,WAAW,CAAC,OAAO,EAAE;AACvB,IAAI,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;AAC3B,IAAI,IAAI,CAAC,aAAa,GAAG;AACzB,MAAM,SAAS,EAAE,CAAC;AAClB,MAAM,QAAQ,EAAE,QAAQ;AACxB,KAAK,CAAC;AACN,GAAG;AACH,EAAE,MAAM,eAAe,GAAG;AAC1B,IAAI,IAAI,IAAI,CAAC,aAAa,CAAC,SAAS,IAAI,CAAC,EAAE;AAC3C,MAAM,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAC5D,MAAM,IAAI,IAAI,IAAI,GAAG,EAAE;AACvB,QAAQ,MAAM,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;AACjD,QAAQ,MAAMA,UAAK,CAAC,IAAI,CAAC,CAAC;AAC1B,OAAO;AACP,MAAM,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,CAAC;AAChE,MAAM,IAAI,CAAC,aAAa,GAAG;AAC3B,QAAQ,SAAS,EAAE,IAAI,CAAC,mBAAmB,CAAC,eAAe;AAC3D,QAAQ,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG;AAClC,OAAO,CAAC;AACR,KAAK;AACL,IAAI,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;AACnC,GAAG;AACH;;;;"}
@@ -0,0 +1,63 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ const node_fs = require('node:fs');
6
+ const node_path = require('node:path');
7
+ const collection = require('@discordjs/collection');
8
+ const v10 = require('discord-api-types/v10');
9
+ const utils = require('./utils.cjs');
10
+
11
+ var Encoding = /* @__PURE__ */ ((Encoding2) => {
12
+ Encoding2["JSON"] = "json";
13
+ return Encoding2;
14
+ })(Encoding || {});
15
+ var CompressionMethod = /* @__PURE__ */ ((CompressionMethod2) => {
16
+ CompressionMethod2["ZlibStream"] = "zlib-stream";
17
+ return CompressionMethod2;
18
+ })(CompressionMethod || {});
19
+ const packageJson = node_fs.readFileSync(node_path.join(__dirname, "..", "..", "package.json"), "utf8");
20
+ const Package = JSON.parse(packageJson);
21
+ const DefaultDeviceProperty = `@discordjs/ws ${Package.version}`;
22
+ const getDefaultSessionStore = utils.lazy(() => new collection.Collection());
23
+ const DefaultWebSocketManagerOptions = {
24
+ shardCount: null,
25
+ shardIds: null,
26
+ largeThreshold: null,
27
+ initialPresence: null,
28
+ identifyProperties: {
29
+ browser: DefaultDeviceProperty,
30
+ device: DefaultDeviceProperty,
31
+ os: process.platform
32
+ },
33
+ version: v10.APIVersion,
34
+ encoding: "json" /* JSON */,
35
+ compression: null,
36
+ retrieveSessionInfo(shardId) {
37
+ const store = getDefaultSessionStore();
38
+ return store.get(shardId) ?? null;
39
+ },
40
+ updateSessionInfo(shardId, info) {
41
+ const store = getDefaultSessionStore();
42
+ if (info) {
43
+ store.set(shardId, info);
44
+ } else {
45
+ store.delete(shardId);
46
+ }
47
+ },
48
+ handshakeTimeout: 3e4,
49
+ helloTimeout: 6e4,
50
+ readyTimeout: 15e3
51
+ };
52
+ const ImportantGatewayOpcodes = /* @__PURE__ */ new Set([
53
+ v10.GatewayOpcodes.Heartbeat,
54
+ v10.GatewayOpcodes.Identify,
55
+ v10.GatewayOpcodes.Resume
56
+ ]);
57
+
58
+ exports.CompressionMethod = CompressionMethod;
59
+ exports.DefaultDeviceProperty = DefaultDeviceProperty;
60
+ exports.DefaultWebSocketManagerOptions = DefaultWebSocketManagerOptions;
61
+ exports.Encoding = Encoding;
62
+ exports.ImportantGatewayOpcodes = ImportantGatewayOpcodes;
63
+ //# sourceMappingURL=constants.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.cjs","sources":["../../src/utils/constants.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { Collection } from '@discordjs/collection';\nimport { APIVersion, GatewayOpcodes } from 'discord-api-types/v10';\nimport { lazy } from './utils';\nimport type { OptionalWebSocketManagerOptions, SessionInfo } from '../ws/WebSocketManager';\n\n/**\n * Valid encoding types\n */\nexport enum Encoding {\n\tJSON = 'json',\n}\n\n/**\n * Valid compression methods\n */\nexport enum CompressionMethod {\n\tZlibStream = 'zlib-stream',\n}\n\nconst packageJson = readFileSync(join(__dirname, '..', '..', 'package.json'), 'utf8');\n// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\nconst Package = JSON.parse(packageJson);\n\n// eslint-disable-next-line @typescript-eslint/restrict-template-expressions, @typescript-eslint/no-unsafe-member-access\nexport const DefaultDeviceProperty = `@discordjs/ws ${Package.version}`;\n\nconst getDefaultSessionStore = lazy(() => new Collection<number, SessionInfo | null>());\n\n/**\n * Default options used by the manager\n */\nexport const DefaultWebSocketManagerOptions: OptionalWebSocketManagerOptions = {\n\tshardCount: null,\n\tshardIds: null,\n\tlargeThreshold: null,\n\tinitialPresence: null,\n\tidentifyProperties: {\n\t\tbrowser: DefaultDeviceProperty,\n\t\tdevice: DefaultDeviceProperty,\n\t\tos: process.platform,\n\t},\n\tversion: APIVersion,\n\tencoding: Encoding.JSON,\n\tcompression: null,\n\tretrieveSessionInfo(shardId) {\n\t\tconst store = getDefaultSessionStore();\n\t\treturn store.get(shardId) ?? null;\n\t},\n\tupdateSessionInfo(shardId: number, info: SessionInfo | null) {\n\t\tconst store = getDefaultSessionStore();\n\t\tif (info) {\n\t\t\tstore.set(shardId, info);\n\t\t} else {\n\t\t\tstore.delete(shardId);\n\t\t}\n\t},\n\thandshakeTimeout: 30_000,\n\thelloTimeout: 60_000,\n\treadyTimeout: 15_000,\n};\n\nexport const ImportantGatewayOpcodes = new Set([\n\tGatewayOpcodes.Heartbeat,\n\tGatewayOpcodes.Identify,\n\tGatewayOpcodes.Resume,\n]);\n"],"names":["readFileSync","join","lazy","Collection","APIVersion","GatewayOpcodes"],"mappings":";;;;;;;;;;AAKU,IAAC,QAAQ,mBAAmB,CAAC,CAAC,SAAS,KAAK;AACtD,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;AAC7B,EAAE,OAAO,SAAS,CAAC;AACnB,CAAC,EAAE,QAAQ,IAAI,EAAE,EAAE;AACT,IAAC,iBAAiB,mBAAmB,CAAC,CAAC,kBAAkB,KAAK;AACxE,EAAE,kBAAkB,CAAC,YAAY,CAAC,GAAG,aAAa,CAAC;AACnD,EAAE,OAAO,kBAAkB,CAAC;AAC5B,CAAC,EAAE,iBAAiB,IAAI,EAAE,EAAE;AAC5B,MAAM,WAAW,GAAGA,oBAAY,CAACC,cAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC;AACtF,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AAC5B,MAAC,qBAAqB,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE;AACxE,MAAM,sBAAsB,GAAGC,UAAI,CAAC,MAAM,IAAIC,qBAAU,EAAE,CAAC,CAAC;AAChD,MAAC,8BAA8B,GAAG;AAC9C,EAAE,UAAU,EAAE,IAAI;AAClB,EAAE,QAAQ,EAAE,IAAI;AAChB,EAAE,cAAc,EAAE,IAAI;AACtB,EAAE,eAAe,EAAE,IAAI;AACvB,EAAE,kBAAkB,EAAE;AACtB,IAAI,OAAO,EAAE,qBAAqB;AAClC,IAAI,MAAM,EAAE,qBAAqB;AACjC,IAAI,EAAE,EAAE,OAAO,CAAC,QAAQ;AACxB,GAAG;AACH,EAAE,OAAO,EAAEC,cAAU;AACrB,EAAE,QAAQ,EAAE,MAAM;AAClB,EAAE,WAAW,EAAE,IAAI;AACnB,EAAE,mBAAmB,CAAC,OAAO,EAAE;AAC/B,IAAI,MAAM,KAAK,GAAG,sBAAsB,EAAE,CAAC;AAC3C,IAAI,OAAO,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;AACtC,GAAG;AACH,EAAE,iBAAiB,CAAC,OAAO,EAAE,IAAI,EAAE;AACnC,IAAI,MAAM,KAAK,GAAG,sBAAsB,EAAE,CAAC;AAC3C,IAAI,IAAI,IAAI,EAAE;AACd,MAAM,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAC/B,KAAK,MAAM;AACX,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC5B,KAAK;AACL,GAAG;AACH,EAAE,gBAAgB,EAAE,GAAG;AACvB,EAAE,YAAY,EAAE,GAAG;AACnB,EAAE,YAAY,EAAE,IAAI;AACpB,EAAE;AACU,MAAC,uBAAuB,mBAAmB,IAAI,GAAG,CAAC;AAC/D,EAAEC,kBAAc,CAAC,SAAS;AAC1B,EAAEA,kBAAc,CAAC,QAAQ;AACzB,EAAEA,kBAAc,CAAC,MAAM;AACvB,CAAC;;;;;;;;"}
@@ -0,0 +1,21 @@
1
+ import { GatewayOpcodes } from 'discord-api-types/v10';
2
+ import type { OptionalWebSocketManagerOptions } from '../ws/WebSocketManager';
3
+ /**
4
+ * Valid encoding types
5
+ */
6
+ export declare enum Encoding {
7
+ JSON = "json"
8
+ }
9
+ /**
10
+ * Valid compression methods
11
+ */
12
+ export declare enum CompressionMethod {
13
+ ZlibStream = "zlib-stream"
14
+ }
15
+ export declare const DefaultDeviceProperty: string;
16
+ /**
17
+ * Default options used by the manager
18
+ */
19
+ export declare const DefaultWebSocketManagerOptions: OptionalWebSocketManagerOptions;
20
+ export declare const ImportantGatewayOpcodes: Set<GatewayOpcodes>;
21
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEnE,OAAO,KAAK,EAAE,+BAA+B,EAAe,MAAM,wBAAwB,CAAC;AAE3F;;GAEG;AACH,oBAAY,QAAQ;IACnB,IAAI,SAAS;CACb;AAED;;GAEG;AACH,oBAAY,iBAAiB;IAC5B,UAAU,gBAAgB;CAC1B;AAOD,eAAO,MAAM,qBAAqB,QAAqC,CAAC;AAIxE;;GAEG;AACH,eAAO,MAAM,8BAA8B,EAAE,+BA4B5C,CAAC;AAEF,eAAO,MAAM,uBAAuB,qBAIlC,CAAC"}
@@ -0,0 +1,64 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { Collection } from '@discordjs/collection';
4
+ import { APIVersion, GatewayOpcodes } from 'discord-api-types/v10';
5
+ import { lazy } from './utils.mjs';
6
+
7
+
8
+
9
+ // -- Unbuild CommonJS Shims --
10
+ import __cjs_url__ from 'url';
11
+ import __cjs_path__ from 'path';
12
+ import __cjs_mod__ from 'module';
13
+ const __filename = __cjs_url__.fileURLToPath(import.meta.url);
14
+ const __dirname = __cjs_path__.dirname(__filename);
15
+ const require = __cjs_mod__.createRequire(import.meta.url);
16
+ var Encoding = /* @__PURE__ */ ((Encoding2) => {
17
+ Encoding2["JSON"] = "json";
18
+ return Encoding2;
19
+ })(Encoding || {});
20
+ var CompressionMethod = /* @__PURE__ */ ((CompressionMethod2) => {
21
+ CompressionMethod2["ZlibStream"] = "zlib-stream";
22
+ return CompressionMethod2;
23
+ })(CompressionMethod || {});
24
+ const packageJson = readFileSync(join(__dirname, "..", "..", "package.json"), "utf8");
25
+ const Package = JSON.parse(packageJson);
26
+ const DefaultDeviceProperty = `@discordjs/ws ${Package.version}`;
27
+ const getDefaultSessionStore = lazy(() => new Collection());
28
+ const DefaultWebSocketManagerOptions = {
29
+ shardCount: null,
30
+ shardIds: null,
31
+ largeThreshold: null,
32
+ initialPresence: null,
33
+ identifyProperties: {
34
+ browser: DefaultDeviceProperty,
35
+ device: DefaultDeviceProperty,
36
+ os: process.platform
37
+ },
38
+ version: APIVersion,
39
+ encoding: "json" /* JSON */,
40
+ compression: null,
41
+ retrieveSessionInfo(shardId) {
42
+ const store = getDefaultSessionStore();
43
+ return store.get(shardId) ?? null;
44
+ },
45
+ updateSessionInfo(shardId, info) {
46
+ const store = getDefaultSessionStore();
47
+ if (info) {
48
+ store.set(shardId, info);
49
+ } else {
50
+ store.delete(shardId);
51
+ }
52
+ },
53
+ handshakeTimeout: 3e4,
54
+ helloTimeout: 6e4,
55
+ readyTimeout: 15e3
56
+ };
57
+ const ImportantGatewayOpcodes = /* @__PURE__ */ new Set([
58
+ GatewayOpcodes.Heartbeat,
59
+ GatewayOpcodes.Identify,
60
+ GatewayOpcodes.Resume
61
+ ]);
62
+
63
+ export { CompressionMethod, DefaultDeviceProperty, DefaultWebSocketManagerOptions, Encoding, ImportantGatewayOpcodes };
64
+ //# sourceMappingURL=constants.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.mjs","sources":["../../src/utils/constants.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { Collection } from '@discordjs/collection';\nimport { APIVersion, GatewayOpcodes } from 'discord-api-types/v10';\nimport { lazy } from './utils';\nimport type { OptionalWebSocketManagerOptions, SessionInfo } from '../ws/WebSocketManager';\n\n/**\n * Valid encoding types\n */\nexport enum Encoding {\n\tJSON = 'json',\n}\n\n/**\n * Valid compression methods\n */\nexport enum CompressionMethod {\n\tZlibStream = 'zlib-stream',\n}\n\nconst packageJson = readFileSync(join(__dirname, '..', '..', 'package.json'), 'utf8');\n// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\nconst Package = JSON.parse(packageJson);\n\n// eslint-disable-next-line @typescript-eslint/restrict-template-expressions, @typescript-eslint/no-unsafe-member-access\nexport const DefaultDeviceProperty = `@discordjs/ws ${Package.version}`;\n\nconst getDefaultSessionStore = lazy(() => new Collection<number, SessionInfo | null>());\n\n/**\n * Default options used by the manager\n */\nexport const DefaultWebSocketManagerOptions: OptionalWebSocketManagerOptions = {\n\tshardCount: null,\n\tshardIds: null,\n\tlargeThreshold: null,\n\tinitialPresence: null,\n\tidentifyProperties: {\n\t\tbrowser: DefaultDeviceProperty,\n\t\tdevice: DefaultDeviceProperty,\n\t\tos: process.platform,\n\t},\n\tversion: APIVersion,\n\tencoding: Encoding.JSON,\n\tcompression: null,\n\tretrieveSessionInfo(shardId) {\n\t\tconst store = getDefaultSessionStore();\n\t\treturn store.get(shardId) ?? null;\n\t},\n\tupdateSessionInfo(shardId: number, info: SessionInfo | null) {\n\t\tconst store = getDefaultSessionStore();\n\t\tif (info) {\n\t\t\tstore.set(shardId, info);\n\t\t} else {\n\t\t\tstore.delete(shardId);\n\t\t}\n\t},\n\thandshakeTimeout: 30_000,\n\thelloTimeout: 60_000,\n\treadyTimeout: 15_000,\n};\n\nexport const ImportantGatewayOpcodes = new Set([\n\tGatewayOpcodes.Heartbeat,\n\tGatewayOpcodes.Identify,\n\tGatewayOpcodes.Resume,\n]);\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AAKU;AACV;AACA;AACA;AACU;AACV;AACA;AACA;AACA;AACA;AACY;AACZ;AACY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACY;AACZ;AACA;AACA;AACA;;"}
@@ -0,0 +1,15 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ function range({ start, end }) {
6
+ return Array.from({ length: end - start + 1 }, (_, i) => i + start);
7
+ }
8
+ function lazy(cb) {
9
+ let defaultValue;
10
+ return () => defaultValue ?? (defaultValue = cb());
11
+ }
12
+
13
+ exports.lazy = lazy;
14
+ exports.range = range;
15
+ //# sourceMappingURL=utils.cjs.map