From a05af6530e81495f4bc12172ec0459354aded2c8 Mon Sep 17 00:00:00 2001 From: Skillz Date: Wed, 26 Feb 2020 14:36:25 -0500 Subject: [PATCH] working finally --- module/client.ts | 23 +++++++++++------------ module/gateway.ts | 23 +++++++++++++++++------ 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/module/client.ts b/module/client.ts index 8ad65d9f0..0ff4f1429 100644 --- a/module/client.ts +++ b/module/client.ts @@ -1,6 +1,6 @@ import { endpoints } from "../constants/discord.ts" import DiscordRequestManager from "./discord-request-manager.ts" -import { DiscordBotGatewayData, DiscordPayload, DiscordHeartbeatPayload, GatewayOpcode, StatusType } from "../types/discord.ts" +import { DiscordBotGatewayData, DiscordPayload, DiscordHeartbeatPayload, GatewayOpcode } from "../types/discord.ts" import { spawnShards } from "./sharding-manager.ts" import { connectWebSocket, @@ -11,7 +11,7 @@ import { } from "https://deno.land/std/ws/mod.ts" import { ClientOptions, FulfilledClientOptions } from "../types/options.ts" import { CollectedMessageType } from "../types/message-type.ts" -import { sendConstantHeartbeats } from "./gateway.ts" +import { send_constant_heartbeats, update_previous_sequence_number } from "./gateway.ts" const defaultOptions = { properties: { @@ -50,7 +50,7 @@ class Client { } async bootstrap() { - const data = await this.discordRequestManager.get(endpoints.GATEWAY_BOT) as DiscordBotGatewayData + const data = (await this.discordRequestManager.get(endpoints.GATEWAY_BOT)) as DiscordBotGatewayData const socket = await connectWebSocket(data.url) this.collectMessages(socket) // Intial identify with the gateway @@ -68,13 +68,11 @@ class Client { ) for await (const message of this.connect(socket, data)) { - console.log("mymessage", message) - if (message.data?.op === GatewayOpcode.Hello) { - await message.action - } + if (message.data?.op === GatewayOpcode.Hello) await message.action + // if (message.data?.op === GatewayOpcode.HeartbeatACK) return this.options.eventHandlers.heartbeat() - if (message.data?.t === 'READY') { - console.log('ready event was received') + if (message.data?.t === "READY") { + console.log("ready event was received") // this.options.eventHandlers.ready() } } @@ -130,14 +128,15 @@ class Client { } handleDiscordPayload(data: DiscordPayload, socket: WebSocket) { + // Update the sequence number if it is present so that heartbeating can be accurate + if (data.s) update_previous_sequence_number(data.s) + switch (data.op) { case GatewayOpcode.Hello: - sendConstantHeartbeats(socket, (data.d as DiscordHeartbeatPayload).heartbeat_interval, data.s) + send_constant_heartbeats(socket, (data.d as DiscordHeartbeatPayload).heartbeat_interval) return } } - - } export default Client diff --git a/module/gateway.ts b/module/gateway.ts index 75047c48f..95d61aaeb 100644 --- a/module/gateway.ts +++ b/module/gateway.ts @@ -2,12 +2,23 @@ import { WebSocket } from "https://deno.land/std/ws/mod.ts" import { GatewayOpcode } from "../types/discord.ts" import { delay } from "https://deno.land/std/util/async.ts" -export const sendConstantHeartbeats = async (socket: WebSocket, interval: number, previousSequenceNumber: number | null = null) => { +// Discord requests null if no number has yet been sent by discord +let previous_sequence_number: number | null = null + +// TODO: If a client does not receive a heartbeat ack between its attempts at sending heartbeats, it should immediately terminate the connection with a non-1000 close code, reconnect, and attempt to resume. +export const send_constant_heartbeats = async ( + socket: WebSocket, + interval: number +) => { + console.log(interval) await delay(interval) - - if (previousSequenceNumber) previousSequenceNumber += 1 - + console.log('past interval') // TODO: If the initial seq num is null, this will make it forever null until a restart. Is this good? - socket.send(JSON.stringify({ op: GatewayOpcode.Heartbeat, d: previousSequenceNumber })) - sendConstantHeartbeats(socket, interval, previousSequenceNumber) + socket.send(JSON.stringify({ op: GatewayOpcode.Heartbeat, d: previous_sequence_number })) + console.log(previous_sequence_number, 'previous') + send_constant_heartbeats(socket, interval) +} + +export const update_previous_sequence_number = (sequence: number) => { + previous_sequence_number = sequence }