// Backwards-compatible protocol version. const VERSION = 1; // From the frontend to the relay. struct CommandMessage { u32 command_seq; union CommandData switch (enum Command { HELLO, PING, ACTIVE, BUFFER_COMPLETE, BUFFER_INPUT, BUFFER_ACTIVATE, BUFFER_LOG, } command) { case HELLO: u32 version; case PING: void; case ACTIVE: void; case BUFFER_COMPLETE: string buffer_name; string text; u32 position; case BUFFER_INPUT: string buffer_name; string text; case BUFFER_ACTIVATE: string buffer_name; case BUFFER_LOG: string buffer_name; } data; }; // From the relay to the frontend. struct EventMessage { u32 event_seq; union EventData switch (enum Event { PING, BUFFER_UPDATE, BUFFER_RENAME, BUFFER_REMOVE, BUFFER_ACTIVATE, BUFFER_LINE, BUFFER_CLEAR, ERROR, RESPONSE, } event) { case PING: void; case BUFFER_UPDATE: string buffer_name; case BUFFER_RENAME: string buffer_name; string new; case BUFFER_REMOVE: string buffer_name; case BUFFER_ACTIVATE: string buffer_name; case BUFFER_LINE: string buffer_name; bool is_unimportant; bool is_highlight; enum Rendition { BARE, INDENT, STATUS, ERROR, JOIN, PART, ACTION, } rendition; // Unix timestamp in milliseconds. u64 when; // Broken-up text, with in-band formatting. union ItemData switch (enum Item { TEXT, RESET, FG_COLOR, BG_COLOR, FLIP_BOLD, FLIP_ITALIC, FLIP_UNDERLINE, FLIP_INVERSE, FLIP_CROSSED_OUT, FLIP_MONOSPACE, } kind) { case TEXT: string text; case RESET: void; case FG_COLOR: i16 color; case BG_COLOR: i16 color; case FLIP_BOLD: case FLIP_ITALIC: case FLIP_UNDERLINE: case FLIP_INVERSE: case FLIP_CROSSED_OUT: case FLIP_MONOSPACE: void; } items<>; case BUFFER_CLEAR: string buffer_name; case ERROR: u32 command_seq; string error; case RESPONSE: u32 command_seq; union ResponseData switch (Command command) { case BUFFER_COMPLETE: u32 start; string completions<>; case BUFFER_LOG: // UTF-8, but not guaranteed. u8 log<>; } data; } data; };