From d8dd63170a775c24298efe71b75670fbc1c3febc Mon Sep 17 00:00:00 2001 From: MARCROCK22 <57925328+MARCROCK22@users.noreply.github.com> Date: Fri, 15 Mar 2024 17:39:24 -0400 Subject: [PATCH] fix shardStart & shardEnd --- src/client/base.ts | 6 ++--- src/client/client.ts | 2 ++ src/websocket/constants/index.ts | 1 + src/websocket/discord/sharder.ts | 25 ++++++++++-------- src/websocket/discord/workermanager.ts | 35 +++++++++++++++----------- 5 files changed, 41 insertions(+), 28 deletions(-) diff --git a/src/client/base.ts b/src/client/base.ts index fdb3c28..6e61fea 100644 --- a/src/client/base.ts +++ b/src/client/base.ts @@ -96,8 +96,8 @@ export class BaseClient { if (cache) { this.cache = new Cache( this.cache?.intents ?? 0, - cache.adapter, - cache.disabledCache ?? this.cache?.disabledCache, + cache?.adapter ?? this.cache?.adapter ?? new MemoryAdapter(), + cache.disabledCache ?? this.cache?.disabledCache ?? [], this, ); } @@ -289,7 +289,7 @@ export type RuntimeConfig = OmitInsert; diff --git a/src/client/client.ts b/src/client/client.ts index 730a8d9..331157d 100644 --- a/src/client/client.ts +++ b/src/client/client.ts @@ -98,6 +98,7 @@ export class Client extends BaseClient { debug: debugRC, shardStart: this.options?.shards?.start, shardEnd: this.options?.shards?.end, + totalShards: this.options?.shards?.total ?? this.options?.shards?.end, }); } @@ -180,6 +181,7 @@ export interface ClientOptions extends BaseClientOptions { shards?: { start: number; end: number; + total?: number; }; commands?: { prefix: (message: Message) => Promise | string[]; diff --git a/src/websocket/constants/index.ts b/src/websocket/constants/index.ts index 749efc6..b44935a 100644 --- a/src/websocket/constants/index.ts +++ b/src/websocket/constants/index.ts @@ -16,6 +16,7 @@ const ShardManagerDefaults: Partial = { intents: 0, properties, version: 10, + shardStart: 0, handlePayload: (shardId: number, packet: GatewayDispatchPayload): void => { console.info(`Packet ${packet.t} on shard ${shardId}`); }, diff --git a/src/websocket/discord/sharder.ts b/src/websocket/discord/sharder.ts index e13b072..0c8736c 100644 --- a/src/websocket/discord/sharder.ts +++ b/src/websocket/discord/sharder.ts @@ -36,6 +36,18 @@ export class ShardManager extends Map { } } + get totalShards() { + return this.options.totalShards ?? this.options.info.shards; + } + + get shardStart() { + return this.options.shardStart ?? 0; + } + + get shardEnd() { + return this.options.shardEnd ?? this.totalShards; + } + get remaining() { return this.options.info.session_start_limit.remaining; } @@ -63,7 +75,7 @@ export class ShardManager extends Map { shard ??= new Shard(shardId, { token: this.options.token, intents: this.options.intents, - info: { ...this.options.info, shards: (this.options.shardEnd ?? this.options.totalShards)! }, + info: { ...this.options.info, shards: this.totalShards }, handlePayload: this.options.handlePayload, properties: this.options.properties, debugger: this.debugger, @@ -97,17 +109,10 @@ export class ShardManager extends Map { */ spawnBuckets(): Shard[][] { this.debugger?.info('#0 Preparing buckets'); - const chunks = SequentialBucket.chunk( - new Array( - this.options.shardStart !== undefined && this.options.shardEnd !== undefined - ? this.options.shardEnd - this.options.shardStart - : this.options.totalShards, - ), - this.concurrency, - ); + const chunks = SequentialBucket.chunk(new Array(this.shardEnd - this.shardStart), this.concurrency); chunks.forEach((arr: any[], index: number) => { for (let i = 0; i < arr.length; i++) { - const id = i + (index > 0 ? index * this.concurrency : 0) + (this.options.shardStart ?? 0); + const id = i + (index > 0 ? index * this.concurrency : 0) + this.shardStart; chunks[index][i] = this.spawn(id); } }); diff --git a/src/websocket/discord/workermanager.ts b/src/websocket/discord/workermanager.ts index 71139de..a5d0501 100644 --- a/src/websocket/discord/workermanager.ts +++ b/src/websocket/discord/workermanager.ts @@ -29,7 +29,7 @@ export class WorkerManager extends Map { rest!: ApiHandler; constructor(options: MakePartial) { super(); - this.options = MergeOptions(WorkerManagerDefaults, options); + this.options = options as WorkerManager['options']; this.cacheAdapter = new MemoryAdapter(); } @@ -54,7 +54,15 @@ export class WorkerManager extends Map { } get totalShards() { - return this.options.totalShards; + return this.options.totalShards ?? this.options.info.shards; + } + + get shardStart() { + return this.options.shardStart ?? 0; + } + + get shardEnd() { + return this.options.shardEnd ?? this.totalShards; } get shardsPerWorker() { @@ -82,11 +90,11 @@ export class WorkerManager extends Map { } calculateShardId(guildId: string) { - return Number((BigInt(guildId) >> 22n) % BigInt(this.options.info.shards ?? 1)); + return Number((BigInt(guildId) >> 22n) % BigInt(this.totalShards ?? 1)); } calculateWorkerId(shardId: number) { - const workerId = Math.floor((shardId - this.options.shardStart) / this.shardsPerWorker); + const workerId = Math.floor((shardId - this.shardStart) / this.shardsPerWorker); if (workerId >= this.workers) { throw new Error('Invalid shardId'); } @@ -97,17 +105,13 @@ export class WorkerManager extends Map { this.debugger?.info('Preparing buckets'); const chunks = SequentialBucket.chunk( - new Array( - this.options.shardStart !== undefined && this.options.shardEnd !== undefined - ? this.options.shardEnd - this.options.shardStart - : this.options.totalShards, - ), + new Array(this.shardEnd - this.shardStart), this.options.shardsPerWorker, ); chunks.forEach((shards, index) => { for (let i = 0; i < shards.length; i++) { - const id = i + (index > 0 ? index * this.options.shardsPerWorker : 0) + (this.options.shardStart ?? 0); + const id = i + (index > 0 ? index * this.options.shardsPerWorker : 0) + this.shardStart; chunks[index][i] = id; } }); @@ -134,7 +138,10 @@ export class WorkerManager extends Map { worker.postMessage({ type: 'SPAWN_SHARDS', compress: this.options.compress ?? false, - info: this.options.info, + info: { + ...this.options.info, + shards: this.totalShards, + }, properties: this.options.properties, } satisfies ManagerSpawnShards); } @@ -379,12 +386,10 @@ export class WorkerManager extends Map { debug: this.options.debug, }); this.options.info ??= await new Router(this.rest).createProxy().gateway.bot.get(); - this.options.totalShards ??= this.options.info.shards; + this.options.shardEnd ??= this.options.info.shards; + this.options.totalShards ??= this.options.shardEnd; this.options = MergeOptions>(WorkerManagerDefaults, this.options); this.options.workers ??= Math.ceil(this.options.totalShards / this.options.shardsPerWorker); - this.options.info.shards = this.options.totalShards; - this.options.shardEnd ??= this.options.totalShards; - this.options.shardStart ??= 0; this.connectQueue = new ConnectQueue(5.5e3, this.concurrency); if (this.options.debug) {