Improved protocol types

This commit is contained in:
2025-12-23 13:00:34 +01:00
parent 2a4579cf89
commit 3890e36078
2 changed files with 45 additions and 13 deletions
+16 -7
View File
@@ -4,6 +4,7 @@ import { Dispatch, RefObject, SetStateAction } from "react";
import { get } from "./request"; import { get } from "./request";
import { toast } from "sonner"; import { toast } from "sonner";
import { MessageStore } from "@/hooks/use-messages"; import { MessageStore } from "@/hooks/use-messages";
import { IndicatorContext, ServerMessage } from "@/types/protocol";
type AuthParams = { type AuthParams = {
id: string; id: string;
@@ -11,6 +12,7 @@ type AuthParams = {
setServer?: Dispatch<SetStateAction<Server | undefined>>; setServer?: Dispatch<SetStateAction<Server | undefined>>;
onNewMessage?: (m: Message) => void; onNewMessage?: (m: Message) => void;
messageStore: MessageStore; messageStore: MessageStore;
onIndicator?: (i: IndicatorContext) => void;
}; };
export default async function auth({ export default async function auth({
@@ -19,6 +21,7 @@ export default async function auth({
setServer, setServer,
onNewMessage, onNewMessage,
messageStore, messageStore,
onIndicator,
}: AuthParams) { }: AuthParams) {
console.log("Authenticating with server id:", id); console.log("Authenticating with server id:", id);
@@ -42,7 +45,7 @@ export default async function auth({
}; };
ws.onmessage = (m) => { ws.onmessage = (m) => {
const data = JSON.parse(m.data); var data = JSON.parse(m.data);
console.log("Message received:", data); console.log("Message received:", data);
if (data.error) { if (data.error) {
@@ -64,7 +67,9 @@ export default async function auth({
return; return;
} }
switch (data.type) { const msg = data as ServerMessage;
switch (msg.type) {
case "authenticated": case "authenticated":
// ws.send( // ws.send(
// JSON.stringify({ // JSON.stringify({
@@ -78,19 +83,23 @@ export default async function auth({
break; break;
case "message_create": case "message_create":
if (onNewMessage) onNewMessage(data.params as Message); if (onNewMessage) onNewMessage(msg.params as Message);
messageStore.addMessage(data.params as Message); messageStore.addMessage(msg.params as Message);
break; break;
case "message_delete": case "message_delete":
messageStore.deleteMessage(data.params.message_id); messageStore.deleteMessage(msg.params.message_id);
break; break;
case "message_update": case "message_update":
messageStore.editMessage(data.params.message_id, data.params.contents); messageStore.editMessage(msg.params.message_id, msg.params.contents);
break; break;
case "chunk": case "chunk":
messageStore.insertMessages(data.params); messageStore.insertMessages(msg.params);
break;
case "indicator":
if (!onIndicator) break;
onIndicator(msg.params);
break; break;
} }
}; };
+29 -6
View File
@@ -1,11 +1,34 @@
export interface MessageType<T = string, P = object> { import { Message } from "./types";
export interface EnumType<T = string, P = object> {
type: T; type: T;
params: P; params: P;
} }
export type Indicator = EnumType<
"typing",
{ user_id: string; channel_id: string }
>;
export interface IndicatorContext {
indicator: Indicator;
expires: number;
}
export type ClientMessage = export type ClientMessage =
| MessageType<"send_message", { channel_id: string; contents: string }> | EnumType<"send_message", { channel_id: string; contents: string }>
| MessageType<"delete_message", { message_id: number }> | EnumType<"delete_message", { message_id: number }>
| MessageType<"edit_message", { message_id: number; new_contents: string }> | EnumType<"edit_message", { message_id: number; new_contents: string }>
| MessageType<"load_chunk", { channel_id: string; chunk_id: number }> | EnumType<"load_chunk", { channel_id: string; chunk_id: number }>
| MessageType<"typing", { channel_id: string }>; | EnumType<"typing", { channel_id: string }>;
export type ServerMessage =
| EnumType<"authenticated", { uuid: string; indicators: IndicatorContext[] }>
| EnumType<"temp_message", { message: string }>
| EnumType<"message_create", Message>
| EnumType<"message_update", { message_id: number; contents: string }>
| EnumType<"message_delete", { message_id: number }>
| EnumType<"presence_update", { user_id: String; status: String }>
| EnumType<"indicator", IndicatorContext>
| EnumType<"shutdown", { message: string }>
| EnumType<"chunk", Message[]>;