2026-06-01 16:42:36 +07:00
|
|
|
// ─── Typed event map for WebSocket events ────────────────────────────────────
|
|
|
|
|
|
|
|
|
|
export interface WsEventMap {
|
|
|
|
|
message_created: { data: unknown };
|
|
|
|
|
message_updated: { data: unknown };
|
|
|
|
|
message_deleted: { data: { id: string } };
|
|
|
|
|
message_analyzed: { data: unknown };
|
|
|
|
|
attachment_uploaded: Record<string, never>;
|
|
|
|
|
user_state: { users: unknown[] };
|
|
|
|
|
ui_state: { state: unknown };
|
|
|
|
|
media_state: { state: unknown };
|
|
|
|
|
voice_recording_uploaded: { data: unknown };
|
2026-06-02 10:44:27 +07:00
|
|
|
voice_recording_started: { data: unknown };
|
|
|
|
|
voice_recording_stopped: { data: unknown };
|
|
|
|
|
attachment_created: { data: unknown };
|
|
|
|
|
analysis_queue_status: { data: unknown };
|
2026-06-01 16:42:36 +07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export type WsEventType = keyof WsEventMap;
|
|
|
|
|
|
2026-06-01 21:44:29 +07:00
|
|
|
export function parseWsMessage(
|
|
|
|
|
raw: string,
|
|
|
|
|
): { type: WsEventType; payload: Record<string, unknown> } | null {
|
2026-06-01 16:42:36 +07:00
|
|
|
try {
|
|
|
|
|
const parsed = JSON.parse(raw);
|
|
|
|
|
if (!parsed.type) return null;
|
|
|
|
|
const { type, ...rest } = parsed;
|
|
|
|
|
return { type: type as WsEventType, payload: rest };
|
|
|
|
|
} catch {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|