Get basic client side event acknowledging working.

This commit is contained in:
Elliot Glaysher 2019-01-11 15:18:53 -08:00
parent 3dd4dde8ec
commit 8c72d2594e

View File

@ -298,20 +298,17 @@
^+ q ^+ q
:: if the queue is now empty, that's fine :: if the queue is now empty, that's fine
:: ::
?~ q ?: =(~ q)
~ ~
:: todo: for some reason ~(nap to q) does not return +:split; silent corruption
:: ::
=+ split=~(get to q) =^ head=[id=@ud lines=wall] q ~(get to q)
=/ head=[id=@ud lines=wall] -:split
:: if the head of the queue is newer than the acknowledged id, we're done :: if the head of the queue is newer than the acknowledged id, we're done
:: ::
?: (gte id.head id) ?: (gte id.head id)
+:split q
:: otherwise, throw away the head now that it has been acknowledged :: otherwise, check next item
:: ::
$(q +:split) $
:: +parse-channel-request: parses a list of channel-requests :: +parse-channel-request: parses a list of channel-requests
:: ::
:: Parses a json array into a list of +channel-request. If any of the items :: Parses a json array into a list of +channel-request. If any of the items
@ -466,6 +463,10 @@
// //
this.lastEventId = 0; this.lastEventId = 0;
// this last event id acknowledgment sent to the server
//
this.lastAcknowledgedEventId = 0;
// a registry of requestId to successFunc/failureFunc // a registry of requestId to successFunc/failureFunc
// //
// These functions are registered during a +poke and are executed // These functions are registered during a +poke and are executed
@ -521,17 +522,27 @@
// sends a JSON command command to the server. // sends a JSON command command to the server.
// //
// TODO: This should also bundle an acknowledgment of the last received
// request id.
//
sendJSONToChannel(j) { sendJSONToChannel(j) {
var req = new XMLHttpRequest(); var req = new XMLHttpRequest();
req.open("PUT", this.channelURL()); req.open("PUT", this.channelURL());
req.setRequestHeader("Content-Type", "application/json"); req.setRequestHeader("Content-Type", "application/json");
// TODO: Need to stuff an "ack" in here, too. if (this.lastEventId == this.lastAcknowledgedEventId) {
var x = JSON.stringify([j]); var x = JSON.stringify([j]);
req.send(x); req.send(x);
} else {
// we add an acknowledgment to clear the server side queue
//
// The server side puts messages it sends us in a queue until we
// acknowledge that we received it.
//
var x = JSON.stringify(
[{"action": "ack", "event-id": parseInt(this.lastEventId)}, j])
console.log(x, this.lastEventId);
req.send(x);
this.lastEventId = this.lastAcknowledgedEventId;
}
this.connectIfDisconnected(); this.connectIfDisconnected();
} }
@ -545,7 +556,7 @@
this.eventSource = new EventSource(this.channelURL(), {withCredentials:true}); this.eventSource = new EventSource(this.channelURL(), {withCredentials:true});
this.eventSource.onmessage = e => { this.eventSource.onmessage = e => {
this.lastEventId = e.id; this.lastEventId = e.lastEventId;
var obj = JSON.parse(e.data); var obj = JSON.parse(e.data);
if (obj.response == "poke") { if (obj.response == "poke") {
@ -1181,7 +1192,7 @@
:: parse the json into an array of +channel-request items :: parse the json into an array of +channel-request items
:: ::
?~ maybe-requests=(parse-channel-request u.maybe-json) ?~ maybe-requests=(parse-channel-request u.maybe-json)
~& %no-parse ~& [%no-parse u.maybe-json]
%^ return-static-data-on-duct 400 'text/html' %^ return-static-data-on-duct 400 'text/html'
(internal-server-error %.y url.http-request ~) (internal-server-error %.y url.http-request ~)
:: while weird, the request list could be empty :: while weird, the request list could be empty