fitbit-asap
Version:
Send peer messages reliably on Fitbit OS.
100 lines • 2.84 kB
JavaScript
import { __read, __spread } from "tslib";
import { decode, encode } from "cbor";
import { localStorage } from "local-storage";
import { peerSocket } from "messaging";
var debug = false;
var queue = [];
try {
queue = JSON.parse(localStorage.getItem("_asap_queue"));
if (!Array.isArray(queue)) {
queue = [];
}
}
catch (error) {
queue = [];
}
function enqueue(message, options) {
var id = queue.length > 0 ? Math.max.apply(Math, __spread(queue)) + 1 : 1;
var timeout = Date.now() + (options && options.timeout ? options.timeout : 86400000);
var data = ["asap_message", id, timeout, message];
localStorage.setItem("_asap_" + id, JSON.stringify(Array.from(new Uint8Array(encode(data)))));
queue.push(id);
localStorage.setItem("_asap_queue", JSON.stringify(queue));
if (queue.length === 1) {
process();
}
debug && console.log("Enqueued message #" + id);
}
function dequeue(id) {
if (id) {
for (var i in queue) {
if (queue[i] === id) {
localStorage.removeItem("_asap_" + id);
queue.splice(i, 1);
break;
}
}
debug && console.log("Dequeued message #" + id);
}
else {
for (var i in queue) {
localStorage.removeItem("_asap_" + queue[i]);
}
queue = [];
debug && console.log("Dequeued all messages");
}
localStorage.setItem("_asap_queue", JSON.stringify(queue));
process();
}
function process() {
if (queue.length > 0) {
var id = queue[0];
try {
var message = decode((new Uint8Array(JSON.parse(localStorage.getItem("_asap_" + id)))).buffer);
var timeout = message[2];
if (timeout < Date.now()) {
dequeue(id);
}
else {
try {
peerSocket.send(message);
}
catch (error) {
debug && console.log(error);
}
}
}
catch (_a) {
dequeue(id);
}
}
}
peerSocket.addEventListener("open", function () {
debug && console.log("Peer socket opened");
process();
});
peerSocket.addEventListener("message", function (event) {
var type = event.data[0];
var id = event.data[1];
var timeout = event.data[2];
var message = event.data[3];
if (type == "asap_message") {
asap.onmessage(message);
try {
peerSocket.send(["asap_receipt", id]);
}
catch (error) {
debug && console.log(error);
}
}
else if (type == "asap_receipt") {
dequeue(id);
}
});
var asap = {
send: enqueue,
cancel: dequeue,
onmessage: function () { }
};
export default asap;
//# sourceMappingURL=companion.js.map