@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.
- package/CHANGELOG.md +13 -0
- package/LICENSE +191 -0
- package/README.md +124 -0
- package/dist/index.cjs +39 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.mjs +11 -0
- package/dist/index.mjs.map +1 -0
- package/dist/strategies/context/IContextFetchingStrategy.cjs +15 -0
- package/dist/strategies/context/IContextFetchingStrategy.cjs.map +1 -0
- package/dist/strategies/context/IContextFetchingStrategy.d.ts +17 -0
- package/dist/strategies/context/IContextFetchingStrategy.d.ts.map +1 -0
- package/dist/strategies/context/IContextFetchingStrategy.mjs +11 -0
- package/dist/strategies/context/IContextFetchingStrategy.mjs.map +1 -0
- package/dist/strategies/context/SimpleContextFetchingStrategy.cjs +19 -0
- package/dist/strategies/context/SimpleContextFetchingStrategy.cjs.map +1 -0
- package/dist/strategies/context/SimpleContextFetchingStrategy.d.ts +10 -0
- package/dist/strategies/context/SimpleContextFetchingStrategy.d.ts.map +1 -0
- package/dist/strategies/context/SimpleContextFetchingStrategy.mjs +15 -0
- package/dist/strategies/context/SimpleContextFetchingStrategy.mjs.map +1 -0
- package/dist/strategies/context/WorkerContextFetchingStrategy.cjs +46 -0
- package/dist/strategies/context/WorkerContextFetchingStrategy.cjs.map +1 -0
- package/dist/strategies/context/WorkerContextFetchingStrategy.d.ts +10 -0
- package/dist/strategies/context/WorkerContextFetchingStrategy.d.ts.map +1 -0
- package/dist/strategies/context/WorkerContextFetchingStrategy.mjs +42 -0
- package/dist/strategies/context/WorkerContextFetchingStrategy.mjs.map +1 -0
- package/dist/strategies/sharding/IShardingStrategy.d.ts +25 -0
- package/dist/strategies/sharding/IShardingStrategy.d.ts.map +1 -0
- package/dist/strategies/sharding/SimpleShardingStrategy.cjs +53 -0
- package/dist/strategies/sharding/SimpleShardingStrategy.cjs.map +1 -0
- package/dist/strategies/sharding/SimpleShardingStrategy.d.ts +18 -0
- package/dist/strategies/sharding/SimpleShardingStrategy.d.ts.map +1 -0
- package/dist/strategies/sharding/SimpleShardingStrategy.mjs +49 -0
- package/dist/strategies/sharding/SimpleShardingStrategy.mjs.map +1 -0
- package/dist/strategies/sharding/WorkerShardingStrategy.cjs +162 -0
- package/dist/strategies/sharding/WorkerShardingStrategy.cjs.map +1 -0
- package/dist/strategies/sharding/WorkerShardingStrategy.d.ts +84 -0
- package/dist/strategies/sharding/WorkerShardingStrategy.d.ts.map +1 -0
- package/dist/strategies/sharding/WorkerShardingStrategy.mjs +165 -0
- package/dist/strategies/sharding/WorkerShardingStrategy.mjs.map +1 -0
- package/dist/strategies/sharding/worker.cjs +78 -0
- package/dist/strategies/sharding/worker.cjs.map +1 -0
- package/dist/strategies/sharding/worker.d.ts +2 -0
- package/dist/strategies/sharding/worker.d.ts.map +1 -0
- package/dist/strategies/sharding/worker.mjs +76 -0
- package/dist/strategies/sharding/worker.mjs.map +1 -0
- package/dist/utils/IdentifyThrottler.cjs +33 -0
- package/dist/utils/IdentifyThrottler.cjs.map +1 -0
- package/dist/utils/IdentifyThrottler.d.ts +8 -0
- package/dist/utils/IdentifyThrottler.d.ts.map +1 -0
- package/dist/utils/IdentifyThrottler.mjs +29 -0
- package/dist/utils/IdentifyThrottler.mjs.map +1 -0
- package/dist/utils/constants.cjs +63 -0
- package/dist/utils/constants.cjs.map +1 -0
- package/dist/utils/constants.d.ts +21 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.mjs +64 -0
- package/dist/utils/constants.mjs.map +1 -0
- package/dist/utils/utils.cjs +15 -0
- package/dist/utils/utils.cjs.map +1 -0
- package/dist/utils/utils.d.ts +13 -0
- package/dist/utils/utils.d.ts.map +1 -0
- package/dist/utils/utils.mjs +10 -0
- package/dist/utils/utils.mjs.map +1 -0
- package/dist/ws/WebSocketManager.cjs +81 -0
- package/dist/ws/WebSocketManager.cjs.map +1 -0
- package/dist/ws/WebSocketManager.d.ts +186 -0
- package/dist/ws/WebSocketManager.d.ts.map +1 -0
- package/dist/ws/WebSocketManager.mjs +77 -0
- package/dist/ws/WebSocketManager.mjs.map +1 -0
- package/dist/ws/WebSocketShard.cjs +414 -0
- package/dist/ws/WebSocketShard.cjs.map +1 -0
- package/dist/ws/WebSocketShard.d.ts +71 -0
- package/dist/ws/WebSocketShard.d.ts.map +1 -0
- package/dist/ws/WebSocketShard.mjs +406 -0
- package/dist/ws/WebSocketShard.mjs.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { isMainThread, parentPort } from 'node:worker_threads';
|
|
2
|
+
import { Collection } from '@discordjs/collection';
|
|
3
|
+
import { WorkerSendPayloadOp, WorkerRecievePayloadOp } from '../sharding/WorkerShardingStrategy.mjs';
|
|
4
|
+
|
|
5
|
+
class WorkerContextFetchingStrategy {
|
|
6
|
+
constructor(options) {
|
|
7
|
+
this.options = options;
|
|
8
|
+
this.sessionPromises = new Collection();
|
|
9
|
+
if (isMainThread) {
|
|
10
|
+
throw new Error("Cannot instantiate WorkerContextFetchingStrategy on the main thread");
|
|
11
|
+
}
|
|
12
|
+
parentPort.on("message", (payload) => {
|
|
13
|
+
if (payload.op === WorkerSendPayloadOp.SessionInfoResponse) {
|
|
14
|
+
const resolve = this.sessionPromises.get(payload.nonce);
|
|
15
|
+
resolve?.(payload.session);
|
|
16
|
+
this.sessionPromises.delete(payload.nonce);
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
async retrieveSessionInfo(shardId) {
|
|
21
|
+
const nonce = Math.random();
|
|
22
|
+
const payload = {
|
|
23
|
+
op: WorkerRecievePayloadOp.RetrieveSessionInfo,
|
|
24
|
+
shardId,
|
|
25
|
+
nonce
|
|
26
|
+
};
|
|
27
|
+
const promise = new Promise((resolve) => this.sessionPromises.set(nonce, resolve));
|
|
28
|
+
parentPort.postMessage(payload);
|
|
29
|
+
return promise;
|
|
30
|
+
}
|
|
31
|
+
updateSessionInfo(shardId, sessionInfo) {
|
|
32
|
+
const payload = {
|
|
33
|
+
op: WorkerRecievePayloadOp.UpdateSessionInfo,
|
|
34
|
+
shardId,
|
|
35
|
+
session: sessionInfo
|
|
36
|
+
};
|
|
37
|
+
parentPort.postMessage(payload);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export { WorkerContextFetchingStrategy };
|
|
42
|
+
//# sourceMappingURL=WorkerContextFetchingStrategy.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkerContextFetchingStrategy.mjs","sources":["../../../src/strategies/context/WorkerContextFetchingStrategy.ts"],"sourcesContent":["import { isMainThread, parentPort } from 'node:worker_threads';\nimport { Collection } from '@discordjs/collection';\nimport type { FetchingStrategyOptions, IContextFetchingStrategy } from './IContextFetchingStrategy';\nimport type { SessionInfo } from '../../ws/WebSocketManager';\nimport {\n\tWorkerRecievePayload,\n\tWorkerRecievePayloadOp,\n\tWorkerSendPayload,\n\tWorkerSendPayloadOp,\n} from '../sharding/WorkerShardingStrategy';\n\nexport class WorkerContextFetchingStrategy implements IContextFetchingStrategy {\n\tprivate readonly sessionPromises = new Collection<number, (session: SessionInfo | null) => void>();\n\n\tpublic constructor(public readonly options: FetchingStrategyOptions) {\n\t\tif (isMainThread) {\n\t\t\tthrow new Error('Cannot instantiate WorkerContextFetchingStrategy on the main thread');\n\t\t}\n\n\t\tparentPort!.on('message', (payload: WorkerSendPayload) => {\n\t\t\tif (payload.op === WorkerSendPayloadOp.SessionInfoResponse) {\n\t\t\t\tconst resolve = this.sessionPromises.get(payload.nonce);\n\t\t\t\tresolve?.(payload.session);\n\t\t\t\tthis.sessionPromises.delete(payload.nonce);\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic async retrieveSessionInfo(shardId: number): Promise<SessionInfo | null> {\n\t\tconst nonce = Math.random();\n\t\tconst payload: WorkerRecievePayload = {\n\t\t\top: WorkerRecievePayloadOp.RetrieveSessionInfo,\n\t\t\tshardId,\n\t\t\tnonce,\n\t\t};\n\t\tconst promise = new Promise<SessionInfo | null>((resolve) => this.sessionPromises.set(nonce, resolve));\n\t\tparentPort!.postMessage(payload);\n\t\treturn promise;\n\t}\n\n\tpublic updateSessionInfo(shardId: number, sessionInfo: SessionInfo | null) {\n\t\tconst payload: WorkerRecievePayload = {\n\t\t\top: WorkerRecievePayloadOp.UpdateSessionInfo,\n\t\t\tshardId,\n\t\t\tsession: sessionInfo,\n\t\t};\n\t\tparentPort!.postMessage(payload);\n\t}\n}\n"],"names":[],"mappings":";;;;AAMO,MAAM,6BAA6B,CAAC;AAC3C,EAAE,WAAW,CAAC,OAAO,EAAE;AACvB,IAAI,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;AAC3B,IAAI,IAAI,CAAC,eAAe,GAAG,IAAI,UAAU,EAAE,CAAC;AAC5C,IAAI,IAAI,YAAY,EAAE;AACtB,MAAM,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;AAC7F,KAAK;AACL,IAAI,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,KAAK;AAC1C,MAAM,IAAI,OAAO,CAAC,EAAE,KAAK,mBAAmB,CAAC,mBAAmB,EAAE;AAClE,QAAQ,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAChE,QAAQ,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AACnC,QAAQ,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACnD,OAAO;AACP,KAAK,CAAC,CAAC;AACP,GAAG;AACH,EAAE,MAAM,mBAAmB,CAAC,OAAO,EAAE;AACrC,IAAI,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;AAChC,IAAI,MAAM,OAAO,GAAG;AACpB,MAAM,EAAE,EAAE,sBAAsB,CAAC,mBAAmB;AACpD,MAAM,OAAO;AACb,MAAM,KAAK;AACX,KAAK,CAAC;AACN,IAAI,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;AACvF,IAAI,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AACpC,IAAI,OAAO,OAAO,CAAC;AACnB,GAAG;AACH,EAAE,iBAAiB,CAAC,OAAO,EAAE,WAAW,EAAE;AAC1C,IAAI,MAAM,OAAO,GAAG;AACpB,MAAM,EAAE,EAAE,sBAAsB,CAAC,iBAAiB;AAClD,MAAM,OAAO;AACb,MAAM,OAAO,EAAE,WAAW;AAC1B,KAAK,CAAC;AACN,IAAI,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AACpC,GAAG;AACH;;;;"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { GatewaySendPayload } from 'discord-api-types/v10';
|
|
2
|
+
import type { Awaitable } from '../../utils/utils';
|
|
3
|
+
import type { WebSocketShardDestroyOptions } from '../../ws/WebSocketShard';
|
|
4
|
+
/**
|
|
5
|
+
* Strategies responsible for spawning, initializing connections, destroying shards, and relaying events
|
|
6
|
+
*/
|
|
7
|
+
export interface IShardingStrategy {
|
|
8
|
+
/**
|
|
9
|
+
* Spawns all the shards
|
|
10
|
+
*/
|
|
11
|
+
spawn: (shardIds: number[]) => Awaitable<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Initializes all the shards
|
|
14
|
+
*/
|
|
15
|
+
connect: () => Awaitable<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Destroys all the shards
|
|
18
|
+
*/
|
|
19
|
+
destroy: (options?: Omit<WebSocketShardDestroyOptions, 'recover'>) => Awaitable<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Sends a payload to a shard
|
|
22
|
+
*/
|
|
23
|
+
send: (shardId: number, payload: GatewaySendPayload) => Awaitable<void>;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=IShardingStrategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IShardingStrategy.d.ts","sourceRoot":"","sources":["../../../src/strategies/sharding/IShardingStrategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AAE5E;;GAEG;AACH,MAAM,WAAW,iBAAiB;IACjC;;OAEG;IACH,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC;IAC/C;;OAEG;IACH,OAAO,EAAE,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;IAC/B;;OAEG;IACH,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,4BAA4B,EAAE,SAAS,CAAC,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC;IACtF;;OAEG;IACH,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC;CACxE"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
const collection = require('@discordjs/collection');
|
|
6
|
+
const IdentifyThrottler = require('../../utils/IdentifyThrottler.cjs');
|
|
7
|
+
const WebSocketShard = require('../../ws/WebSocketShard.cjs');
|
|
8
|
+
const IContextFetchingStrategy = require('../context/IContextFetchingStrategy.cjs');
|
|
9
|
+
const SimpleContextFetchingStrategy = require('../context/SimpleContextFetchingStrategy.cjs');
|
|
10
|
+
|
|
11
|
+
class SimpleShardingStrategy {
|
|
12
|
+
constructor(manager) {
|
|
13
|
+
this.shards = new collection.Collection();
|
|
14
|
+
this.manager = manager;
|
|
15
|
+
this.throttler = new IdentifyThrottler.IdentifyThrottler(manager);
|
|
16
|
+
}
|
|
17
|
+
async spawn(shardIds) {
|
|
18
|
+
const strategyOptions = await IContextFetchingStrategy.managerToFetchingStrategyOptions(this.manager);
|
|
19
|
+
for (const shardId of shardIds) {
|
|
20
|
+
const strategy = new SimpleContextFetchingStrategy.SimpleContextFetchingStrategy(this.manager, strategyOptions);
|
|
21
|
+
const shard = new WebSocketShard.WebSocketShard(strategy, shardId);
|
|
22
|
+
for (const event of Object.values(WebSocketShard.WebSocketShardEvents)) {
|
|
23
|
+
shard.on(event, (payload) => this.manager.emit(event, { ...payload, shardId }));
|
|
24
|
+
}
|
|
25
|
+
this.shards.set(shardId, shard);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async connect() {
|
|
29
|
+
const promises = [];
|
|
30
|
+
for (const shard of this.shards.values()) {
|
|
31
|
+
await this.throttler.waitForIdentify();
|
|
32
|
+
promises.push(shard.connect());
|
|
33
|
+
}
|
|
34
|
+
await Promise.all(promises);
|
|
35
|
+
}
|
|
36
|
+
async destroy(options) {
|
|
37
|
+
const promises = [];
|
|
38
|
+
for (const shard of this.shards.values()) {
|
|
39
|
+
promises.push(shard.destroy(options));
|
|
40
|
+
}
|
|
41
|
+
await Promise.all(promises);
|
|
42
|
+
this.shards.clear();
|
|
43
|
+
}
|
|
44
|
+
send(shardId, payload) {
|
|
45
|
+
const shard = this.shards.get(shardId);
|
|
46
|
+
if (!shard)
|
|
47
|
+
throw new Error(`Shard ${shardId} not found`);
|
|
48
|
+
return shard.send(payload);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
exports.SimpleShardingStrategy = SimpleShardingStrategy;
|
|
53
|
+
//# sourceMappingURL=SimpleShardingStrategy.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SimpleShardingStrategy.cjs","sources":["../../../src/strategies/sharding/SimpleShardingStrategy.ts"],"sourcesContent":["import { Collection } from '@discordjs/collection';\nimport type { GatewaySendPayload } from 'discord-api-types/v10';\nimport type { IShardingStrategy } from './IShardingStrategy';\nimport { IdentifyThrottler } from '../../utils/IdentifyThrottler';\nimport type { WebSocketManager } from '../../ws/WebSocketManager';\nimport { WebSocketShard, WebSocketShardDestroyOptions, WebSocketShardEvents } from '../../ws/WebSocketShard';\nimport { managerToFetchingStrategyOptions } from '../context/IContextFetchingStrategy';\nimport { SimpleContextFetchingStrategy } from '../context/SimpleContextFetchingStrategy';\n\n/**\n * Simple strategy that just spawns shards in the current process\n */\nexport class SimpleShardingStrategy implements IShardingStrategy {\n\tprivate readonly manager: WebSocketManager;\n\tprivate readonly shards = new Collection<number, WebSocketShard>();\n\n\tprivate readonly throttler: IdentifyThrottler;\n\n\tpublic constructor(manager: WebSocketManager) {\n\t\tthis.manager = manager;\n\t\tthis.throttler = new IdentifyThrottler(manager);\n\t}\n\n\tpublic async spawn(shardIds: number[]) {\n\t\tconst strategyOptions = await managerToFetchingStrategyOptions(this.manager);\n\t\tfor (const shardId of shardIds) {\n\t\t\tconst strategy = new SimpleContextFetchingStrategy(this.manager, strategyOptions);\n\t\t\tconst shard = new WebSocketShard(strategy, shardId);\n\t\t\tfor (const event of Object.values(WebSocketShardEvents)) {\n\t\t\t\t// @ts-expect-error\n\t\t\t\tshard.on(event, (payload) => this.manager.emit(event, { ...payload, shardId }));\n\t\t\t}\n\t\t\tthis.shards.set(shardId, shard);\n\t\t}\n\t}\n\n\tpublic async connect() {\n\t\tconst promises = [];\n\n\t\tfor (const shard of this.shards.values()) {\n\t\t\tawait this.throttler.waitForIdentify();\n\t\t\tpromises.push(shard.connect());\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 shard of this.shards.values()) {\n\t\t\tpromises.push(shard.destroy(options));\n\t\t}\n\n\t\tawait Promise.all(promises);\n\t\tthis.shards.clear();\n\t}\n\n\tpublic send(shardId: number, payload: GatewaySendPayload) {\n\t\tconst shard = this.shards.get(shardId);\n\t\tif (!shard) throw new Error(`Shard ${shardId} not found`);\n\t\treturn shard.send(payload);\n\t}\n}\n"],"names":["Collection","IdentifyThrottler","managerToFetchingStrategyOptions","SimpleContextFetchingStrategy","WebSocketShard","WebSocketShardEvents"],"mappings":";;;;;;;;;;AAKO,MAAM,sBAAsB,CAAC;AACpC,EAAE,WAAW,CAAC,OAAO,EAAE;AACvB,IAAI,IAAI,CAAC,MAAM,GAAG,IAAIA,qBAAU,EAAE,CAAC;AACnC,IAAI,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;AAC3B,IAAI,IAAI,CAAC,SAAS,GAAG,IAAIC,mCAAiB,CAAC,OAAO,CAAC,CAAC;AACpD,GAAG;AACH,EAAE,MAAM,KAAK,CAAC,QAAQ,EAAE;AACxB,IAAI,MAAM,eAAe,GAAG,MAAMC,yDAAgC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACjF,IAAI,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;AACpC,MAAM,MAAM,QAAQ,GAAG,IAAIC,2DAA6B,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;AACxF,MAAM,MAAM,KAAK,GAAG,IAAIC,6BAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC1D,MAAM,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAACC,mCAAoB,CAAC,EAAE;AAC/D,QAAQ,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;AACxF,OAAO;AACP,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AACtC,KAAK;AACL,GAAG;AACH,EAAE,MAAM,OAAO,GAAG;AAClB,IAAI,MAAM,QAAQ,GAAG,EAAE,CAAC;AACxB,IAAI,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE;AAC9C,MAAM,MAAM,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC;AAC7C,MAAM,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;AACrC,KAAK;AACL,IAAI,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAChC,GAAG;AACH,EAAE,MAAM,OAAO,CAAC,OAAO,EAAE;AACzB,IAAI,MAAM,QAAQ,GAAG,EAAE,CAAC;AACxB,IAAI,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE;AAC9C,MAAM,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;AAC5C,KAAK;AACL,IAAI,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAChC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;AACxB,GAAG;AACH,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE;AACzB,IAAI,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAC3C,IAAI,IAAI,CAAC,KAAK;AACd,MAAM,MAAM,IAAI,KAAK,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;AACpD,IAAI,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC/B,GAAG;AACH;;;;"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { GatewaySendPayload } from 'discord-api-types/v10';
|
|
2
|
+
import type { IShardingStrategy } from './IShardingStrategy';
|
|
3
|
+
import type { WebSocketManager } from '../../ws/WebSocketManager';
|
|
4
|
+
import { WebSocketShardDestroyOptions } from '../../ws/WebSocketShard';
|
|
5
|
+
/**
|
|
6
|
+
* Simple strategy that just spawns shards in the current process
|
|
7
|
+
*/
|
|
8
|
+
export declare class SimpleShardingStrategy implements IShardingStrategy {
|
|
9
|
+
private readonly manager;
|
|
10
|
+
private readonly shards;
|
|
11
|
+
private readonly throttler;
|
|
12
|
+
constructor(manager: WebSocketManager);
|
|
13
|
+
spawn(shardIds: number[]): Promise<void>;
|
|
14
|
+
connect(): Promise<void>;
|
|
15
|
+
destroy(options?: Omit<WebSocketShardDestroyOptions, 'recover'>): Promise<void>;
|
|
16
|
+
send(shardId: number, payload: GatewaySendPayload): Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=SimpleShardingStrategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SimpleShardingStrategy.d.ts","sourceRoot":"","sources":["../../../src/strategies/sharding/SimpleShardingStrategy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAkB,4BAA4B,EAAwB,MAAM,yBAAyB,CAAC;AAI7G;;GAEG;AACH,qBAAa,sBAAuB,YAAW,iBAAiB;IAC/D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4C;IAEnE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoB;gBAE3B,OAAO,EAAE,gBAAgB;IAK/B,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE;IAaxB,OAAO;IAWP,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,4BAA4B,EAAE,SAAS,CAAC;IAWrE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB;CAKxD"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { Collection } from '@discordjs/collection';
|
|
2
|
+
import { IdentifyThrottler } from '../../utils/IdentifyThrottler.mjs';
|
|
3
|
+
import { WebSocketShard, WebSocketShardEvents } from '../../ws/WebSocketShard.mjs';
|
|
4
|
+
import { managerToFetchingStrategyOptions } from '../context/IContextFetchingStrategy.mjs';
|
|
5
|
+
import { SimpleContextFetchingStrategy } from '../context/SimpleContextFetchingStrategy.mjs';
|
|
6
|
+
|
|
7
|
+
class SimpleShardingStrategy {
|
|
8
|
+
constructor(manager) {
|
|
9
|
+
this.shards = new Collection();
|
|
10
|
+
this.manager = manager;
|
|
11
|
+
this.throttler = new IdentifyThrottler(manager);
|
|
12
|
+
}
|
|
13
|
+
async spawn(shardIds) {
|
|
14
|
+
const strategyOptions = await managerToFetchingStrategyOptions(this.manager);
|
|
15
|
+
for (const shardId of shardIds) {
|
|
16
|
+
const strategy = new SimpleContextFetchingStrategy(this.manager, strategyOptions);
|
|
17
|
+
const shard = new WebSocketShard(strategy, shardId);
|
|
18
|
+
for (const event of Object.values(WebSocketShardEvents)) {
|
|
19
|
+
shard.on(event, (payload) => this.manager.emit(event, { ...payload, shardId }));
|
|
20
|
+
}
|
|
21
|
+
this.shards.set(shardId, shard);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
async connect() {
|
|
25
|
+
const promises = [];
|
|
26
|
+
for (const shard of this.shards.values()) {
|
|
27
|
+
await this.throttler.waitForIdentify();
|
|
28
|
+
promises.push(shard.connect());
|
|
29
|
+
}
|
|
30
|
+
await Promise.all(promises);
|
|
31
|
+
}
|
|
32
|
+
async destroy(options) {
|
|
33
|
+
const promises = [];
|
|
34
|
+
for (const shard of this.shards.values()) {
|
|
35
|
+
promises.push(shard.destroy(options));
|
|
36
|
+
}
|
|
37
|
+
await Promise.all(promises);
|
|
38
|
+
this.shards.clear();
|
|
39
|
+
}
|
|
40
|
+
send(shardId, payload) {
|
|
41
|
+
const shard = this.shards.get(shardId);
|
|
42
|
+
if (!shard)
|
|
43
|
+
throw new Error(`Shard ${shardId} not found`);
|
|
44
|
+
return shard.send(payload);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export { SimpleShardingStrategy };
|
|
49
|
+
//# sourceMappingURL=SimpleShardingStrategy.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SimpleShardingStrategy.mjs","sources":["../../../src/strategies/sharding/SimpleShardingStrategy.ts"],"sourcesContent":["import { Collection } from '@discordjs/collection';\nimport type { GatewaySendPayload } from 'discord-api-types/v10';\nimport type { IShardingStrategy } from './IShardingStrategy';\nimport { IdentifyThrottler } from '../../utils/IdentifyThrottler';\nimport type { WebSocketManager } from '../../ws/WebSocketManager';\nimport { WebSocketShard, WebSocketShardDestroyOptions, WebSocketShardEvents } from '../../ws/WebSocketShard';\nimport { managerToFetchingStrategyOptions } from '../context/IContextFetchingStrategy';\nimport { SimpleContextFetchingStrategy } from '../context/SimpleContextFetchingStrategy';\n\n/**\n * Simple strategy that just spawns shards in the current process\n */\nexport class SimpleShardingStrategy implements IShardingStrategy {\n\tprivate readonly manager: WebSocketManager;\n\tprivate readonly shards = new Collection<number, WebSocketShard>();\n\n\tprivate readonly throttler: IdentifyThrottler;\n\n\tpublic constructor(manager: WebSocketManager) {\n\t\tthis.manager = manager;\n\t\tthis.throttler = new IdentifyThrottler(manager);\n\t}\n\n\tpublic async spawn(shardIds: number[]) {\n\t\tconst strategyOptions = await managerToFetchingStrategyOptions(this.manager);\n\t\tfor (const shardId of shardIds) {\n\t\t\tconst strategy = new SimpleContextFetchingStrategy(this.manager, strategyOptions);\n\t\t\tconst shard = new WebSocketShard(strategy, shardId);\n\t\t\tfor (const event of Object.values(WebSocketShardEvents)) {\n\t\t\t\t// @ts-expect-error\n\t\t\t\tshard.on(event, (payload) => this.manager.emit(event, { ...payload, shardId }));\n\t\t\t}\n\t\t\tthis.shards.set(shardId, shard);\n\t\t}\n\t}\n\n\tpublic async connect() {\n\t\tconst promises = [];\n\n\t\tfor (const shard of this.shards.values()) {\n\t\t\tawait this.throttler.waitForIdentify();\n\t\t\tpromises.push(shard.connect());\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 shard of this.shards.values()) {\n\t\t\tpromises.push(shard.destroy(options));\n\t\t}\n\n\t\tawait Promise.all(promises);\n\t\tthis.shards.clear();\n\t}\n\n\tpublic send(shardId: number, payload: GatewaySendPayload) {\n\t\tconst shard = this.shards.get(shardId);\n\t\tif (!shard) throw new Error(`Shard ${shardId} not found`);\n\t\treturn shard.send(payload);\n\t}\n}\n"],"names":[],"mappings":";;;;;;AAKO,MAAM,sBAAsB,CAAC;AACpC,EAAE,WAAW,CAAC,OAAO,EAAE;AACvB,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;AACnC,IAAI,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;AAC3B,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC;AACpD,GAAG;AACH,EAAE,MAAM,KAAK,CAAC,QAAQ,EAAE;AACxB,IAAI,MAAM,eAAe,GAAG,MAAM,gCAAgC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACjF,IAAI,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;AACpC,MAAM,MAAM,QAAQ,GAAG,IAAI,6BAA6B,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;AACxF,MAAM,MAAM,KAAK,GAAG,IAAI,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC1D,MAAM,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,EAAE;AAC/D,QAAQ,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;AACxF,OAAO;AACP,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AACtC,KAAK;AACL,GAAG;AACH,EAAE,MAAM,OAAO,GAAG;AAClB,IAAI,MAAM,QAAQ,GAAG,EAAE,CAAC;AACxB,IAAI,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE;AAC9C,MAAM,MAAM,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC;AAC7C,MAAM,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;AACrC,KAAK;AACL,IAAI,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAChC,GAAG;AACH,EAAE,MAAM,OAAO,CAAC,OAAO,EAAE;AACzB,IAAI,MAAM,QAAQ,GAAG,EAAE,CAAC;AACxB,IAAI,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE;AAC9C,MAAM,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;AAC5C,KAAK;AACL,IAAI,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAChC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;AACxB,GAAG;AACH,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE;AACzB,IAAI,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAC3C,IAAI,IAAI,CAAC,KAAK;AACd,MAAM,MAAM,IAAI,KAAK,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;AACpD,IAAI,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC/B,GAAG;AACH;;;;"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
const node_events = require('node:events');
|
|
6
|
+
const node_path = require('node:path');
|
|
7
|
+
const node_worker_threads = require('node:worker_threads');
|
|
8
|
+
const collection = require('@discordjs/collection');
|
|
9
|
+
const IdentifyThrottler = require('../../utils/IdentifyThrottler.cjs');
|
|
10
|
+
const IContextFetchingStrategy = require('../context/IContextFetchingStrategy.cjs');
|
|
11
|
+
|
|
12
|
+
var __accessCheck = (obj, member, msg) => {
|
|
13
|
+
if (!member.has(obj))
|
|
14
|
+
throw TypeError("Cannot " + msg);
|
|
15
|
+
};
|
|
16
|
+
var __privateGet = (obj, member, getter) => {
|
|
17
|
+
__accessCheck(obj, member, "read from private field");
|
|
18
|
+
return getter ? getter.call(obj) : member.get(obj);
|
|
19
|
+
};
|
|
20
|
+
var __privateAdd = (obj, member, value) => {
|
|
21
|
+
if (member.has(obj))
|
|
22
|
+
throw TypeError("Cannot add the same private member more than once");
|
|
23
|
+
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
24
|
+
};
|
|
25
|
+
var __privateSet = (obj, member, value, setter) => {
|
|
26
|
+
__accessCheck(obj, member, "write to private field");
|
|
27
|
+
setter ? setter.call(obj, value) : member.set(obj, value);
|
|
28
|
+
return value;
|
|
29
|
+
};
|
|
30
|
+
var _workers, _workerByShardId;
|
|
31
|
+
var WorkerSendPayloadOp = /* @__PURE__ */ ((WorkerSendPayloadOp2) => {
|
|
32
|
+
WorkerSendPayloadOp2[WorkerSendPayloadOp2["Connect"] = 0] = "Connect";
|
|
33
|
+
WorkerSendPayloadOp2[WorkerSendPayloadOp2["Destroy"] = 1] = "Destroy";
|
|
34
|
+
WorkerSendPayloadOp2[WorkerSendPayloadOp2["Send"] = 2] = "Send";
|
|
35
|
+
WorkerSendPayloadOp2[WorkerSendPayloadOp2["SessionInfoResponse"] = 3] = "SessionInfoResponse";
|
|
36
|
+
return WorkerSendPayloadOp2;
|
|
37
|
+
})(WorkerSendPayloadOp || {});
|
|
38
|
+
var WorkerRecievePayloadOp = /* @__PURE__ */ ((WorkerRecievePayloadOp2) => {
|
|
39
|
+
WorkerRecievePayloadOp2[WorkerRecievePayloadOp2["Connected"] = 0] = "Connected";
|
|
40
|
+
WorkerRecievePayloadOp2[WorkerRecievePayloadOp2["Destroyed"] = 1] = "Destroyed";
|
|
41
|
+
WorkerRecievePayloadOp2[WorkerRecievePayloadOp2["Event"] = 2] = "Event";
|
|
42
|
+
WorkerRecievePayloadOp2[WorkerRecievePayloadOp2["RetrieveSessionInfo"] = 3] = "RetrieveSessionInfo";
|
|
43
|
+
WorkerRecievePayloadOp2[WorkerRecievePayloadOp2["UpdateSessionInfo"] = 4] = "UpdateSessionInfo";
|
|
44
|
+
return WorkerRecievePayloadOp2;
|
|
45
|
+
})(WorkerRecievePayloadOp || {});
|
|
46
|
+
class WorkerShardingStrategy {
|
|
47
|
+
constructor(manager, options) {
|
|
48
|
+
__privateAdd(this, _workers, []);
|
|
49
|
+
__privateAdd(this, _workerByShardId, new collection.Collection());
|
|
50
|
+
this.connectPromises = new collection.Collection();
|
|
51
|
+
this.destroyPromises = new collection.Collection();
|
|
52
|
+
this.manager = manager;
|
|
53
|
+
this.throttler = new IdentifyThrottler.IdentifyThrottler(manager);
|
|
54
|
+
this.options = options;
|
|
55
|
+
}
|
|
56
|
+
async spawn(shardIds) {
|
|
57
|
+
const shardsPerWorker = this.options.shardsPerWorker === "all" ? shardIds.length : this.options.shardsPerWorker;
|
|
58
|
+
const strategyOptions = await IContextFetchingStrategy.managerToFetchingStrategyOptions(this.manager);
|
|
59
|
+
let shards = 0;
|
|
60
|
+
while (shards !== shardIds.length) {
|
|
61
|
+
const slice = shardIds.slice(shards, shardsPerWorker + shards);
|
|
62
|
+
const workerData = {
|
|
63
|
+
...strategyOptions,
|
|
64
|
+
shardIds: slice
|
|
65
|
+
};
|
|
66
|
+
const worker = new node_worker_threads.Worker(node_path.join(__dirname, "worker.cjs"), { workerData });
|
|
67
|
+
await node_events.once(worker, "online");
|
|
68
|
+
worker.on("error", (err) => {
|
|
69
|
+
throw err;
|
|
70
|
+
}).on("messageerror", (err) => {
|
|
71
|
+
throw err;
|
|
72
|
+
}).on("message", (payload) => this.onMessage(worker, payload));
|
|
73
|
+
__privateGet(this, _workers).push(worker);
|
|
74
|
+
for (const shardId of slice) {
|
|
75
|
+
__privateGet(this, _workerByShardId).set(shardId, worker);
|
|
76
|
+
}
|
|
77
|
+
shards += slice.length;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
async connect() {
|
|
81
|
+
const promises = [];
|
|
82
|
+
for (const [shardId, worker] of __privateGet(this, _workerByShardId).entries()) {
|
|
83
|
+
await this.throttler.waitForIdentify();
|
|
84
|
+
const payload = {
|
|
85
|
+
op: 0 /* Connect */,
|
|
86
|
+
shardId
|
|
87
|
+
};
|
|
88
|
+
const promise = new Promise((resolve) => this.connectPromises.set(shardId, resolve));
|
|
89
|
+
worker.postMessage(payload);
|
|
90
|
+
promises.push(promise);
|
|
91
|
+
}
|
|
92
|
+
await Promise.all(promises);
|
|
93
|
+
}
|
|
94
|
+
async destroy(options = {}) {
|
|
95
|
+
const promises = [];
|
|
96
|
+
for (const [shardId, worker] of __privateGet(this, _workerByShardId).entries()) {
|
|
97
|
+
const payload = {
|
|
98
|
+
op: 1 /* Destroy */,
|
|
99
|
+
shardId,
|
|
100
|
+
options
|
|
101
|
+
};
|
|
102
|
+
promises.push(new Promise((resolve) => this.destroyPromises.set(shardId, resolve)).then(() => worker.terminate()));
|
|
103
|
+
worker.postMessage(payload);
|
|
104
|
+
}
|
|
105
|
+
__privateSet(this, _workers, []);
|
|
106
|
+
__privateGet(this, _workerByShardId).clear();
|
|
107
|
+
await Promise.all(promises);
|
|
108
|
+
}
|
|
109
|
+
send(shardId, data) {
|
|
110
|
+
const worker = __privateGet(this, _workerByShardId).get(shardId);
|
|
111
|
+
if (!worker) {
|
|
112
|
+
throw new Error(`No worker found for shard ${shardId}`);
|
|
113
|
+
}
|
|
114
|
+
const payload = {
|
|
115
|
+
op: 2 /* Send */,
|
|
116
|
+
shardId,
|
|
117
|
+
payload: data
|
|
118
|
+
};
|
|
119
|
+
worker.postMessage(payload);
|
|
120
|
+
}
|
|
121
|
+
async onMessage(worker, payload) {
|
|
122
|
+
switch (payload.op) {
|
|
123
|
+
case 0 /* Connected */: {
|
|
124
|
+
const resolve = this.connectPromises.get(payload.shardId);
|
|
125
|
+
resolve();
|
|
126
|
+
this.connectPromises.delete(payload.shardId);
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
case 1 /* Destroyed */: {
|
|
130
|
+
const resolve = this.destroyPromises.get(payload.shardId);
|
|
131
|
+
resolve();
|
|
132
|
+
this.destroyPromises.delete(payload.shardId);
|
|
133
|
+
break;
|
|
134
|
+
}
|
|
135
|
+
case 2 /* Event */: {
|
|
136
|
+
this.manager.emit(payload.event, { ...payload.data, shardId: payload.shardId });
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
case 3 /* RetrieveSessionInfo */: {
|
|
140
|
+
const session = await this.manager.options.retrieveSessionInfo(payload.shardId);
|
|
141
|
+
const response = {
|
|
142
|
+
op: 3 /* SessionInfoResponse */,
|
|
143
|
+
nonce: payload.nonce,
|
|
144
|
+
session
|
|
145
|
+
};
|
|
146
|
+
worker.postMessage(response);
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
case 4 /* UpdateSessionInfo */: {
|
|
150
|
+
await this.manager.options.updateSessionInfo(payload.shardId, payload.session);
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
_workers = new WeakMap();
|
|
157
|
+
_workerByShardId = new WeakMap();
|
|
158
|
+
|
|
159
|
+
exports.WorkerRecievePayloadOp = WorkerRecievePayloadOp;
|
|
160
|
+
exports.WorkerSendPayloadOp = WorkerSendPayloadOp;
|
|
161
|
+
exports.WorkerShardingStrategy = WorkerShardingStrategy;
|
|
162
|
+
//# sourceMappingURL=WorkerShardingStrategy.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkerShardingStrategy.cjs","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":["Collection","IdentifyThrottler","managerToFetchingStrategyOptions","Worker","join","once"],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import type { GatewaySendPayload } from 'discord-api-types/v10';
|
|
2
|
+
import type { IShardingStrategy } from './IShardingStrategy';
|
|
3
|
+
import type { SessionInfo, WebSocketManager } from '../../ws/WebSocketManager';
|
|
4
|
+
import type { WebSocketShardDestroyOptions, WebSocketShardEvents } from '../../ws/WebSocketShard';
|
|
5
|
+
import { FetchingStrategyOptions } from '../context/IContextFetchingStrategy';
|
|
6
|
+
export interface WorkerData extends FetchingStrategyOptions {
|
|
7
|
+
shardIds: number[];
|
|
8
|
+
}
|
|
9
|
+
export declare enum WorkerSendPayloadOp {
|
|
10
|
+
Connect = 0,
|
|
11
|
+
Destroy = 1,
|
|
12
|
+
Send = 2,
|
|
13
|
+
SessionInfoResponse = 3
|
|
14
|
+
}
|
|
15
|
+
export declare type WorkerSendPayload = {
|
|
16
|
+
op: WorkerSendPayloadOp.Connect;
|
|
17
|
+
shardId: number;
|
|
18
|
+
} | {
|
|
19
|
+
op: WorkerSendPayloadOp.Destroy;
|
|
20
|
+
shardId: number;
|
|
21
|
+
options?: WebSocketShardDestroyOptions;
|
|
22
|
+
} | {
|
|
23
|
+
op: WorkerSendPayloadOp.Send;
|
|
24
|
+
shardId: number;
|
|
25
|
+
payload: GatewaySendPayload;
|
|
26
|
+
} | {
|
|
27
|
+
op: WorkerSendPayloadOp.SessionInfoResponse;
|
|
28
|
+
nonce: number;
|
|
29
|
+
session: SessionInfo | null;
|
|
30
|
+
};
|
|
31
|
+
export declare enum WorkerRecievePayloadOp {
|
|
32
|
+
Connected = 0,
|
|
33
|
+
Destroyed = 1,
|
|
34
|
+
Event = 2,
|
|
35
|
+
RetrieveSessionInfo = 3,
|
|
36
|
+
UpdateSessionInfo = 4
|
|
37
|
+
}
|
|
38
|
+
export declare type WorkerRecievePayload = {
|
|
39
|
+
op: WorkerRecievePayloadOp.Connected;
|
|
40
|
+
shardId: number;
|
|
41
|
+
} | {
|
|
42
|
+
op: WorkerRecievePayloadOp.Destroyed;
|
|
43
|
+
shardId: number;
|
|
44
|
+
} | {
|
|
45
|
+
op: WorkerRecievePayloadOp.Event;
|
|
46
|
+
shardId: number;
|
|
47
|
+
event: WebSocketShardEvents;
|
|
48
|
+
data: any;
|
|
49
|
+
} | {
|
|
50
|
+
op: WorkerRecievePayloadOp.RetrieveSessionInfo;
|
|
51
|
+
shardId: number;
|
|
52
|
+
nonce: number;
|
|
53
|
+
} | {
|
|
54
|
+
op: WorkerRecievePayloadOp.UpdateSessionInfo;
|
|
55
|
+
shardId: number;
|
|
56
|
+
session: SessionInfo | null;
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Options for a {@link WorkerShardingStrategy}
|
|
60
|
+
*/
|
|
61
|
+
export interface WorkerShardingStrategyOptions {
|
|
62
|
+
/**
|
|
63
|
+
* Dictates how many shards should be spawned per worker thread.
|
|
64
|
+
*/
|
|
65
|
+
shardsPerWorker: number | 'all';
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Strategy used to spawn threads in worker_threads
|
|
69
|
+
*/
|
|
70
|
+
export declare class WorkerShardingStrategy implements IShardingStrategy {
|
|
71
|
+
#private;
|
|
72
|
+
private readonly manager;
|
|
73
|
+
private readonly options;
|
|
74
|
+
private readonly connectPromises;
|
|
75
|
+
private readonly destroyPromises;
|
|
76
|
+
private readonly throttler;
|
|
77
|
+
constructor(manager: WebSocketManager, options: WorkerShardingStrategyOptions);
|
|
78
|
+
spawn(shardIds: number[]): Promise<void>;
|
|
79
|
+
connect(): Promise<void>;
|
|
80
|
+
destroy(options?: Omit<WebSocketShardDestroyOptions, 'recover'>): Promise<void>;
|
|
81
|
+
send(shardId: number, data: GatewaySendPayload): void;
|
|
82
|
+
private onMessage;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=WorkerShardingStrategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkerShardingStrategy.d.ts","sourceRoot":"","sources":["../../../src/strategies/sharding/WorkerShardingStrategy.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,KAAK,EAAE,4BAA4B,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAClG,OAAO,EAAE,uBAAuB,EAAoC,MAAM,qCAAqC,CAAC;AAEhH,MAAM,WAAW,UAAW,SAAQ,uBAAuB;IAC1D,QAAQ,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,oBAAY,mBAAmB;IAC9B,OAAO,IAAA;IACP,OAAO,IAAA;IACP,IAAI,IAAA;IACJ,mBAAmB,IAAA;CACnB;AAED,oBAAY,iBAAiB,GAC1B;IAAE,EAAE,EAAE,mBAAmB,CAAC,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,EAAE,EAAE,mBAAmB,CAAC,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,4BAA4B,CAAA;CAAE,GAC5F;IAAE,EAAE,EAAE,mBAAmB,CAAC,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,kBAAkB,CAAA;CAAE,GAC9E;IAAE,EAAE,EAAE,mBAAmB,CAAC,mBAAmB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAAA;CAAE,CAAC;AAE/F,oBAAY,sBAAsB;IACjC,SAAS,IAAA;IACT,SAAS,IAAA;IACT,KAAK,IAAA;IACL,mBAAmB,IAAA;IACnB,iBAAiB,IAAA;CACjB;AAED,oBAAY,oBAAoB,GAC7B;IAAE,EAAE,EAAE,sBAAsB,CAAC,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,EAAE,EAAE,sBAAsB,CAAC,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAEzD;IAAE,EAAE,EAAE,sBAAsB,CAAC,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,oBAAoB,CAAC;IAAC,IAAI,EAAE,GAAG,CAAA;CAAE,GAC7F;IAAE,EAAE,EAAE,sBAAsB,CAAC,mBAAmB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAClF;IAAE,EAAE,EAAE,sBAAsB,CAAC,iBAAiB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAAA;CAAE,CAAC;AAElG;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC7C;;OAEG;IACH,eAAe,EAAE,MAAM,GAAG,KAAK,CAAC;CAChC;AAED;;GAEG;AACH,qBAAa,sBAAuB,YAAW,iBAAiB;;IAC/D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgC;IAKxD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAwC;IACxE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAwC;IAExE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoB;gBAE3B,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,6BAA6B;IAMvE,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE;IAiCxB,OAAO;IAmBP,OAAO,CAAC,OAAO,GAAE,IAAI,CAAC,4BAA4B,EAAE,SAAS,CAAM;IAsBzE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB;YAcvC,SAAS;CAuCvB"}
|