Compare commits

...

2 Commits

3 changed files with 36 additions and 19 deletions

View File

@ -8,11 +8,12 @@ struct CommandMessage {
u32 command_seq; u32 command_seq;
union CommandData switch (enum Command { union CommandData switch (enum Command {
HELLO, HELLO,
PING,
ACTIVE, ACTIVE,
BUFFER_COMPLETE,
BUFFER_INPUT, BUFFER_INPUT,
BUFFER_ACTIVATE, BUFFER_ACTIVATE,
PING_RESPONSE,
PING,
BUFFER_COMPLETE,
BUFFER_LOG, BUFFER_LOG,
} command) { } command) {
case HELLO: case HELLO:
@ -20,19 +21,24 @@ struct CommandMessage {
// If the version check succeeds, the client will receive // If the version check succeeds, the client will receive
// an initial stream of BUFFER_UPDATE, BUFFER_LINE, // an initial stream of BUFFER_UPDATE, BUFFER_LINE,
// and finally a BUFFER_ACTIVATE message. // and finally a BUFFER_ACTIVATE message.
case PING:
void;
case ACTIVE: case ACTIVE:
void; void;
case BUFFER_COMPLETE:
string buffer_name;
string text;
u32 position;
case BUFFER_INPUT: case BUFFER_INPUT:
string buffer_name; string buffer_name;
string text; string text;
case BUFFER_ACTIVATE: case BUFFER_ACTIVATE:
string buffer_name; string buffer_name;
case PING_RESPONSE:
u32 event_seq;
// Only these commands may produce Event.RESPONSE, as below,
// but any command may produce an error.
case PING:
void;
case BUFFER_COMPLETE:
string buffer_name;
string text;
u32 position;
case BUFFER_LOG: case BUFFER_LOG:
string buffer_name; string buffer_name;
} data; } data;
@ -129,6 +135,8 @@ struct EventMessage {
case RESPONSE: case RESPONSE:
u32 command_seq; u32 command_seq;
union ResponseData switch (Command command) { union ResponseData switch (Command command) {
case PING:
void;
case BUFFER_COMPLETE: case BUFFER_COMPLETE:
u32 start; u32 start;
string completions<>; string completions<>;

24
xC.c
View File

@ -3189,6 +3189,16 @@ relay_prepare_error (struct app_context *ctx, uint32_t seq, const char *message)
e->error = str_from_cstr (message); e->error = str_from_cstr (message);
} }
static struct relay_event_data_response *
relay_prepare_response (struct app_context *ctx, uint32_t seq)
{
struct relay_event_message *m = relay_prepare (ctx);
struct relay_event_data_response *e = &m->data.response;
e->event = RELAY_EVENT_RESPONSE;
e->command_seq = seq;
return e;
}
// --- Terminal output --------------------------------------------------------- // --- Terminal output ---------------------------------------------------------
/// Default colour pair /// Default colour pair
@ -15267,12 +15277,8 @@ client_process_buffer_complete (struct client *c, uint32_t seq,
goto out_internal; goto out_internal;
} }
struct relay_event_data_response *e = struct relay_event_data_response *e = relay_prepare_response (c->ctx, seq);
&relay_prepare (c->ctx)->data.response;
e->event = RELAY_EVENT_RESPONSE;
e->command_seq = seq;
e->data.command = RELAY_COMMAND_BUFFER_COMPLETE; e->data.command = RELAY_COMMAND_BUFFER_COMPLETE;
struct relay_response_data_buffer_complete *resp = struct relay_response_data_buffer_complete *resp =
&e->data.buffer_complete; &e->data.buffer_complete;
resp->start = start; resp->start = start;
@ -15291,10 +15297,7 @@ static void
client_process_buffer_log client_process_buffer_log
(struct client *c, uint32_t seq, struct buffer *buffer) (struct client *c, uint32_t seq, struct buffer *buffer)
{ {
struct relay_event_data_response *e = struct relay_event_data_response *e = relay_prepare_response (c->ctx, seq);
&relay_prepare (c->ctx)->data.response;
e->event = RELAY_EVENT_RESPONSE;
e->command_seq = seq;
e->data.command = RELAY_COMMAND_BUFFER_LOG; e->data.command = RELAY_COMMAND_BUFFER_LOG;
char *path = buffer_get_log_path (buffer); char *path = buffer_get_log_path (buffer);
@ -15357,7 +15360,8 @@ client_process_message (struct client *c,
client_resync (c); client_resync (c);
break; break;
case RELAY_COMMAND_PING: case RELAY_COMMAND_PING:
relay_prepare_ping (c->ctx); relay_prepare_response (c->ctx, m->command_seq)
->data.command = RELAY_COMMAND_PING;
relay_send (c); relay_send (c);
break; break;
case RELAY_COMMAND_ACTIVE: case RELAY_COMMAND_ACTIVE:

View File

@ -85,7 +85,8 @@ class RelayRpc extends EventTarget {
if (typeof e.event !== 'string') if (typeof e.event !== 'string')
throw "Invalid event tag" throw "Invalid event tag"
this.dispatchEvent(new CustomEvent(e.event, {detail: e})) this.dispatchEvent(new CustomEvent(
e.event, {detail: {eventSeq: message.eventSeq, ...e}}))
// Minor abstraction layering violation. // Minor abstraction layering violation.
m.redraw() m.redraw()
@ -153,6 +154,10 @@ rpc.addEventListener('close', event => {
m.redraw() m.redraw()
}) })
rpc.addEventListener('Ping', event => {
rpc.send({command: 'PingResponse', eventSeq: event.detail.eventSeq})
})
rpc.addEventListener('BufferUpdate', event => { rpc.addEventListener('BufferUpdate', event => {
let e = event.detail, b = buffers.get(e.bufferName) let e = event.detail, b = buffers.get(e.bufferName)
if (b === undefined) { if (b === undefined) {