increment = {
let queue = [];
let socket;
let timeout;
let delay = 250;
const gateway = "i3c3e2tpt9";
const region = "us-east-1";
const stage = "prod";
(function open() {
socket = new WebSocket(`wss://${gateway}.execute-api.${region}.amazonaws.com/${stage}?id=${encodeURIComponent(counter)}`);
socket.onopen = () => {
delay = 250;
queue.forEach(message => socket.send(message));
queue = null;
};
socket.onclose = () => {
delay *= 2;
timeout = setTimeout(open, delay + Math.random() * delay);
queue = [];
};
socket.onmessage = event => {
const data = JSON.parse(event.data);
if (isNaN(mutable count) || data.count > mutable count) {
mutable count = data.count;
}
};
})();
invalidation.then(() => {
socket.onclose = null;
socket.close();
clearTimeout(timeout);
});
return () => {
const message = JSON.stringify({type: "increment"});
if (queue) queue.push(message);
else socket.send(message);
++mutable count;
};
}