export enum MessageType { ACK = 0, TEXT = 1, } export type ServerMessage = { type: MessageType; date: number; }; export function isServerMessage(obj: unknown): obj is ServerMessage { if (typeof obj !== "object") return false; if (obj === null) return false; if ( !Object.hasOwnProperty.call(obj, "type") || typeof (obj as { type: unknown }).type !== "number" || !Object.hasOwnProperty.call(MessageType, (obj as { type: number }).type) ) { return false; } if ( !Object.hasOwnProperty.call(obj, "date") || typeof (obj as { date: unknown }).date !== "number" ) { return false; } return true; } export type TextMessage = ServerMessage & { type: MessageType.TEXT; author: string; content: string; }; export function isTextMessage(obj: unknown): obj is TextMessage { if (!isServerMessage(obj)) return false; if (obj.type !== MessageType.TEXT) return false; if ( !Object.hasOwnProperty.call(obj, "author") || typeof (obj as ServerMessage & { author: unknown }).author !== "string" ) { return false; } if ( !Object.hasOwnProperty.call(obj, "author") || typeof (obj as ServerMessage & { content: unknown }).content !== "string" ) { return false; } return true; } export type AckMessage = ServerMessage & { type: MessageType.ACK; }; export function isAckMessage(obj: unknown): obj is AckMessage { if (!isServerMessage(obj)) return false; if (obj.type !== MessageType.ACK) return false; return true; }