diff options
Diffstat (limited to 'src/gateway/events/Close.ts')
-rw-r--r-- | src/gateway/events/Close.ts | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/gateway/events/Close.ts b/src/gateway/events/Close.ts new file mode 100644 index 00000000..40d9a6f7 --- /dev/null +++ b/src/gateway/events/Close.ts @@ -0,0 +1,47 @@ +import { WebSocket } from "@fosscord/gateway"; +import { + emitEvent, + PresenceUpdateEvent, + PrivateSessionProjection, + Session, + SessionsReplace, + User, +} from "@fosscord/util"; + +export async function Close(this: WebSocket, code: number, reason: string) { + console.log("[WebSocket] closed", code, reason); + if (this.heartbeatTimeout) clearTimeout(this.heartbeatTimeout); + if (this.readyTimeout) clearTimeout(this.readyTimeout); + this.deflate?.close(); + this.inflate?.close(); + this.removeAllListeners(); + + if (this.session_id) { + await Session.delete({ session_id: this.session_id }); + const sessions = await Session.find({ + where: { user_id: this.user_id }, + select: PrivateSessionProjection, + }); + await emitEvent({ + event: "SESSIONS_REPLACE", + user_id: this.user_id, + data: sessions, + } as SessionsReplace); + const session = sessions.first() || { + activities: [], + client_info: {}, + status: "offline", + }; + + await emitEvent({ + event: "PRESENCE_UPDATE", + user_id: this.user_id, + data: { + user: await User.getPublicUser(this.user_id), + activities: session.activities, + client_status: session?.client_info, + status: session.status, + }, + } as PresenceUpdateEvent); + } +} |