feat: support resume urls (#8784)

Co-authored-by: Almeida <almeidx@pm.me>
This commit is contained in:
Saya
2022-11-01 02:03:51 +08:00
committed by GitHub
parent 5a70057826
commit 88cd9d9060
2 changed files with 15 additions and 3 deletions

View File

@@ -64,6 +64,13 @@ class WebSocketShard extends EventEmitter {
*/ */
this.sessionId = null; this.sessionId = null;
/**
* The resume url for this shard
* @type {?string}
* @private
*/
this.resumeURL = null;
/** /**
* The previous heartbeat ping of the shard * The previous heartbeat ping of the shard
* @type {number} * @type {number}
@@ -193,12 +200,14 @@ class WebSocketShard extends EventEmitter {
* or reject if we couldn't connect * or reject if we couldn't connect
*/ */
connect() { connect() {
const { gateway, client } = this.manager; const { client } = this.manager;
if (this.connection?.readyState === WebSocket.OPEN && this.status === Status.Ready) { if (this.connection?.readyState === WebSocket.OPEN && this.status === Status.Ready) {
return Promise.resolve(); return Promise.resolve();
} }
const gateway = this.resumeURL ?? this.manager.gateway;
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const cleanup = () => { const cleanup = () => {
this.removeListener(WebSocketShardEvents.Close, onClose); this.removeListener(WebSocketShardEvents.Close, onClose);
@@ -416,9 +425,10 @@ class WebSocketShard extends EventEmitter {
this.emit(WebSocketShardEvents.Ready); this.emit(WebSocketShardEvents.Ready);
this.sessionId = packet.d.session_id; this.sessionId = packet.d.session_id;
this.resumeURL = packet.d.resume_gateway_url;
this.expectedGuilds = new Set(packet.d.guilds.map(d => d.id)); this.expectedGuilds = new Set(packet.d.guilds.map(d => d.id));
this.status = Status.WaitingForGuilds; this.status = Status.WaitingForGuilds;
this.debug(`[READY] Session ${this.sessionId}.`); this.debug(`[READY] Session ${this.sessionId} | Resume url ${this.resumeURL}.`);
this.lastHeartbeatAcked = true; this.lastHeartbeatAcked = true;
this.sendHeartbeat('ReadyHeartbeat'); this.sendHeartbeat('ReadyHeartbeat');
break; break;
@@ -847,10 +857,11 @@ class WebSocketShard extends EventEmitter {
// Step 4: Cache the old sequence (use to attempt a resume) // Step 4: Cache the old sequence (use to attempt a resume)
if (this.sequence !== -1) this.closeSequence = this.sequence; if (this.sequence !== -1) this.closeSequence = this.sequence;
// Step 5: Reset the sequence and session id if requested // Step 5: Reset the sequence, resume url and session id if requested
if (reset) { if (reset) {
this.sequence = -1; this.sequence = -1;
this.sessionId = null; this.sessionId = null;
this.resumeURL = null;
} }
// Step 6: reset the rate limit data // Step 6: reset the rate limit data

View File

@@ -2995,6 +2995,7 @@ export class WebSocketShard extends EventEmitter {
private sequence: number; private sequence: number;
private closeSequence: number; private closeSequence: number;
private sessionId: string | null; private sessionId: string | null;
private resumeURL: string | null;
private lastPingTimestamp: number; private lastPingTimestamp: number;
private lastHeartbeatAcked: boolean; private lastHeartbeatAcked: boolean;
private readonly ratelimit: { private readonly ratelimit: {