From dfd6260a7a209ce025049e0851750bdeda903e73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Magnus=20=C3=85hall?= Date: Sun, 12 Jan 2025 16:54:21 +0100 Subject: [PATCH] Clean queue after sending --- main.go | 7 +++---- static/js/node_store.mjs | 17 +++++++++++++++++ static/js/sync.mjs | 41 ++++++++++++++++++++++++++++------------ 3 files changed, 49 insertions(+), 16 deletions(-) diff --git a/main.go b/main.go index 2102415..7e63d9e 100644 --- a/main.go +++ b/main.go @@ -299,19 +299,18 @@ func actionNodeRetrieve(w http.ResponseWriter, r *http.Request) { // {{{ func actionSyncToServer(w http.ResponseWriter, r *http.Request) { // {{{ user := getUser(r) - body, _ := r.GetBody() - data, _ := io.ReadAll(body) + body, _ := io.ReadAll(r.Body) var request struct { ClientUUID string NodeData string } - err := json.Unmarshal(data, &request) + err := json.Unmarshal(body, &request) if err != nil { httpError(w, err) return } - db.Exec(`CALL add_nodes(%d, %s::jsonb)`, user.ID, request.ClientUUID, request.NodeData) + db.Exec(`CALL add_nodes($1, $2, $3::jsonb)`, user.ID, request.ClientUUID, request.NodeData) responseData(w, map[string]interface{}{ "OK": true, diff --git a/static/js/node_store.mjs b/static/js/node_store.mjs index 39345cc..c640cc6 100644 --- a/static/js/node_store.mjs +++ b/static/js/node_store.mjs @@ -396,6 +396,23 @@ class SimpleNodeStore { } }) }//}}} + async delete(keys) {//{{{ + const store = this.db + .transaction(['nodes', this.storeName], 'readwrite') + .objectStore(this.storeName) + + const promises = [] + for (const key of keys) { + const p = new Promise((resolve, reject)=>{ + // TODO - implement a way to add an error to a page-global error log. + const request = store.delete(key) + request.onsuccess = (event)=>resolve(event) + request.onerror = (event)=>reject(event) + }) + promises.push(p) + } + return Promise.all(promises) + }//}}} } // vim: foldmethod=marker diff --git a/static/js/sync.mjs b/static/js/sync.mjs index 6e3af49..95d554d 100644 --- a/static/js/sync.mjs +++ b/static/js/sync.mjs @@ -88,19 +88,36 @@ export class Sync { }//}}} static async nodesToServer() {//{{{ - try { - const nodesToSend = await nodeStore.sendQueue.retrieve(100) - const clientUUID = await nodeStore.getAppState('client_uuid') - const request = { - NodeData: JSON.stringify(nodesToSend), - ClientUUID: clientUUID.value, - } - res = await API.query('POST', `/sync/to_server/${oldMax}/${offset}`, request) - console.log(res) + while(true) { + try { + // Send nodes in batches until everything is sent, or an error has occured. + const nodesToSend = await nodeStore.sendQueue.retrieve(2) + if (nodesToSend.length === 0) + break + console.debug(`Sending ${nodesToSend.length} node(s) to server`) - } catch (e) { - console.log(e) - alert(e) + const clientUUID = await nodeStore.getAppState('client_uuid') + const request = { + NodeData: JSON.stringify(nodesToSend), + ClientUUID: clientUUID.value, + } + const res = await API.query('POST', '/sync/to_server', request) + if (!res.OK) { + // TODO - implement better error management here. + console.log(res) + alert(res) + return + } + + // Nodes are archived on server and can now be deleted from the send queue. + const keys = nodesToSend.map(node => node.ClientSequence) + console.log(await nodeStore.sendQueue.delete(keys)) + + } catch (e) { + console.trace(e) + alert(e) + return + } } }//}}} }