diff --git a/src/Client.ts b/src/Client.ts index d229f26c..7e90e61b 100644 --- a/src/Client.ts +++ b/src/Client.ts @@ -1,7 +1,7 @@ import { Accessor, Setter, batch, createSignal } from "solid-js"; import EventEmitter from "eventemitter3"; -import type { DataLogin, RevoltConfig } from "revolt-api"; +import type { DataLogin, Error, RevoltConfig } from "revolt-api"; import { API, Role } from "revolt-api"; import { @@ -47,7 +47,8 @@ export type Session = { _id: string; token: string; user_id: string } | string; * Events provided by the client */ export type Events = { - error(error: Error): void; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + error(error: any): void; connected(): void; connecting(): void; diff --git a/src/events/EventClient.ts b/src/events/EventClient.ts index c151ac4b..f3cbb887 100644 --- a/src/events/EventClient.ts +++ b/src/events/EventClient.ts @@ -2,6 +2,7 @@ import { Accessor, Setter, createSignal } from "solid-js"; import EventEmitter from "eventemitter3"; import WebSocket from "isomorphic-ws"; +import { Error } from "revolt-api"; import type { AvailableProtocols, EventProtocol } from "./index.js"; @@ -75,7 +76,8 @@ export class EventClient extends EventEmitter< #pongTimeoutReference: number | undefined; #connectTimeoutReference: number | undefined; - #lastError: any; + #lastError: // eslint-disable-next-line @typescript-eslint/no-explicit-any + { type: "socket"; data: any } | { type: "revolt"; data: Error } | undefined; /** * Create a new event client. @@ -153,7 +155,7 @@ export class EventClient extends EventEmitter< }; this.#socket.onerror = (error) => { - this.#lastError = error; + this.#lastError = { type: "socket", data: error }; this.emit("error", error as never); }; @@ -171,6 +173,7 @@ export class EventClient extends EventEmitter< this.#socket.onclose = () => { if (closed) return; closed = true; + this.#socket = undefined; this.setState(ConnectionState.Disconnected); this.disconnect(); }; @@ -218,6 +221,10 @@ export class EventClient extends EventEmitter< this.options.debug && console.debug(`[ping] ${this.ping()}ms`); return; case "Error": + this.#lastError = { + type: "revolt", + data: event.data, + }; this.emit("error", event as never); this.disconnect(); return; @@ -248,6 +255,9 @@ export class EventClient extends EventEmitter< } } + /** + * Last error encountered by events client + */ get lastError() { return this.#lastError; } diff --git a/src/events/v1.ts b/src/events/v1.ts index 028f3068..e8b3e88c 100644 --- a/src/events/v1.ts +++ b/src/events/v1.ts @@ -5,6 +5,7 @@ import type { Channel, Embed, Emoji, + Error, FieldsChannel, FieldsMember, FieldsServer, @@ -55,7 +56,7 @@ type ClientMessage = * Messages sent from the server */ type ServerMessage = - | ({ type: "Error" } & WebSocketError) + | { type: "Error"; data: Error } | { type: "Bulk"; v: ServerMessage[] } | { type: "Authenticated" } | ({ type: "Ready" } & ReadyData)