mirror of
https://github.com/jkingsman/Remote-Terminal-for-MeshCore.git
synced 2026-03-28 17:43:05 +01:00
87 lines
2.1 KiB
TypeScript
87 lines
2.1 KiB
TypeScript
import type { Channel, Contact, HealthStatus, Message, MessagePath, RawPacket } from './types';
|
|
|
|
export interface MessageAckedPayload {
|
|
message_id: number;
|
|
ack_count: number;
|
|
paths?: MessagePath[];
|
|
packet_id?: number | null;
|
|
}
|
|
|
|
export interface ContactDeletedPayload {
|
|
public_key: string;
|
|
}
|
|
|
|
export interface ContactResolvedPayload {
|
|
previous_public_key: string;
|
|
contact: Contact;
|
|
}
|
|
|
|
export interface ChannelDeletedPayload {
|
|
key: string;
|
|
}
|
|
|
|
export interface ToastPayload {
|
|
message: string;
|
|
details?: string;
|
|
}
|
|
|
|
export type KnownWsEvent =
|
|
| { type: 'health'; data: HealthStatus }
|
|
| { type: 'message'; data: Message }
|
|
| { type: 'contact'; data: Contact }
|
|
| { type: 'contact_resolved'; data: ContactResolvedPayload }
|
|
| { type: 'channel'; data: Channel }
|
|
| { type: 'contact_deleted'; data: ContactDeletedPayload }
|
|
| { type: 'channel_deleted'; data: ChannelDeletedPayload }
|
|
| { type: 'raw_packet'; data: RawPacket }
|
|
| { type: 'message_acked'; data: MessageAckedPayload }
|
|
| { type: 'error'; data: ToastPayload }
|
|
| { type: 'success'; data: ToastPayload }
|
|
| { type: 'pong'; data?: null };
|
|
|
|
export interface UnknownWsEvent {
|
|
type: 'unknown';
|
|
rawType: string;
|
|
data: unknown;
|
|
}
|
|
|
|
export type ParsedWsEvent = KnownWsEvent | UnknownWsEvent;
|
|
|
|
interface RawWsEnvelope {
|
|
type?: unknown;
|
|
data?: unknown;
|
|
}
|
|
|
|
export function parseWsEvent(raw: string): ParsedWsEvent {
|
|
const parsed: RawWsEnvelope = JSON.parse(raw);
|
|
if (!parsed || typeof parsed !== 'object' || typeof parsed.type !== 'string') {
|
|
throw new Error('Invalid WebSocket event envelope');
|
|
}
|
|
|
|
switch (parsed.type) {
|
|
case 'health':
|
|
case 'message':
|
|
case 'contact':
|
|
case 'contact_resolved':
|
|
case 'channel':
|
|
case 'contact_deleted':
|
|
case 'channel_deleted':
|
|
case 'raw_packet':
|
|
case 'message_acked':
|
|
case 'error':
|
|
case 'success':
|
|
return {
|
|
type: parsed.type,
|
|
data: parsed.data,
|
|
} as KnownWsEvent;
|
|
case 'pong':
|
|
return { type: 'pong', data: parsed.data as null | undefined };
|
|
default:
|
|
return {
|
|
type: 'unknown',
|
|
rawType: parsed.type,
|
|
data: parsed.data,
|
|
};
|
|
}
|
|
}
|