Skip to content

Commit a675a95

Browse files
committed
feat: redis identify throttler
1 parent 1babadb commit a675a95

3 files changed

Lines changed: 117 additions & 0 deletions

File tree

package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@
5151
"lint:fix": "eslint src --fix",
5252
"prepack": "pnpm run build"
5353
},
54+
"dependencies": {
55+
"redlock-universal": "^0.8.4"
56+
},
5457
"devDependencies": {
5558
"@discordjs/ws": "^2.0.4",
5659
"@types/node": "^25.9.1",
@@ -59,6 +62,7 @@
5962
"eslint": "^10.4.1",
6063
"eslint-config-neon": "^0.4.0",
6164
"eslint-import-resolver-typescript": "^4.4.5",
65+
"ioredis": "^5.11.1",
6266
"lodash.merge": "^4.6.2",
6367
"oxfmt": "^0.53.0",
6468
"tsdown": "^0.22.1",

pnpm-lock.yaml

Lines changed: 78 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import type { IIdentifyThrottler } from "@discordjs/ws";
2+
import type Redis from "ioredis";
3+
import { createLock, IoredisAdapter } from "redlock-universal";
4+
5+
export interface RedisIdentifyThrottlerOptions {
6+
maxConcurrency: number;
7+
redis: Redis;
8+
retryDelay?: number;
9+
}
10+
11+
export class RedisIdentifyThrottler implements IIdentifyThrottler {
12+
private readonly adapter: IoredisAdapter;
13+
14+
private readonly maxConcurrency: number;
15+
16+
private readonly retryDelay: number;
17+
18+
public constructor(options: RedisIdentifyThrottlerOptions) {
19+
this.adapter = new IoredisAdapter(options.redis);
20+
this.maxConcurrency = options.maxConcurrency;
21+
this.retryDelay = options.retryDelay ?? 5_500;
22+
}
23+
24+
public async waitForIdentify(shardId: number): Promise<void> {
25+
const key = shardId % this.maxConcurrency;
26+
const lock = createLock({
27+
adapter: this.adapter,
28+
key: `indomitable:identify:shard:${key}`,
29+
retryDelay: this.retryDelay,
30+
ttl: 6_000,
31+
});
32+
33+
await lock.acquire();
34+
}
35+
}

0 commit comments

Comments
 (0)