diff --git a/plugins/tiddlypwa/config.tid b/plugins/tiddlypwa/config.tid
index 08868ef..391d49e 100644
--- a/plugins/tiddlypwa/config.tid
+++ b/plugins/tiddlypwa/config.tid
@@ -53,7 +53,7 @@ This device syncs wiki contents with the following servers:
| Server |
- Last successful sync |
+ Last synced change |
|
diff --git a/plugins/tiddlypwa/main.js b/plugins/tiddlypwa/main.js
index e0cabf6..e8087c4 100644
--- a/plugins/tiddlypwa/main.js
+++ b/plugins/tiddlypwa/main.js
@@ -538,10 +538,9 @@ Formatted with `deno fmt`.
return;
}
this._saveTiddler(tiddler).then((_) => {
- const now = new Date();
cb(null, '', 1);
this.changesChannel.postMessage({ title: tiddler.fields.title });
- this.backgroundSync(now);
+ this.backgroundSync();
}).catch((e) => cb(e));
}
@@ -581,10 +580,9 @@ Formatted with `deno fmt`.
deleteTiddler(title, cb, _options) {
this._deleteTiddler(title).then((_) => {
- const now = new Date();
cb(null);
this.changesChannel.postMessage({ title, del: true });
- this.backgroundSync(now);
+ this.backgroundSync();
}).catch((e) => cb(e));
}
@@ -660,8 +658,8 @@ Formatted with `deno fmt`.
}
}
- async _syncOneUnlocked({ url, token, lastSync = new Date(0) }, all = false, now = new Date()) {
- this.logger.log('sync started', url, lastSync, all, now);
+ async _syncOneUnlocked({ url, token, lastSync = new Date(0) }, all = false) {
+ this.logger.log('sync started', url, lastSync, all);
this.wiki.addTiddler({ title: '$:/status/TiddlyPWASyncingWith', text: url });
const changes = [];
await new Promise((resolve) =>
@@ -678,8 +676,12 @@ Formatted with `deno fmt`.
);
const clientChanges = [];
const changedKeys = new Set();
+ let newestChg = new Date(0);
for (const { thash, title, tiv, data, iv, mtime, deleted } of changes) {
if (arrayEq(thash, this.storyListHash)) continue;
+ if (mtime > newestChg) {
+ newestChg = mtime;
+ }
const tidjson = {
thash: await b64enc(thash),
title: await b64enc(title),
@@ -706,7 +708,7 @@ Formatted with `deno fmt`.
token,
browserToken: this.browserToken,
authcode: await b64enc(await this.titlehash(token)),
- now,
+ now: new Date(), // only for a desync check
lastSync,
clientChanges,
}),
@@ -748,6 +750,9 @@ Formatted with `deno fmt`.
} else {
titlesToRead.push({ title: tid.title, iv: tid.tiv });
}
+ if (tid.mtime > newestChg) {
+ newestChg = tid.mtime;
+ }
}
for (const title of $tw.wiki.allTitles()) {
if (titleHashesToDelete.has(await b64enc(await this.titlehash(title)))) {
@@ -772,11 +777,14 @@ Formatted with `deno fmt`.
navigator.serviceWorker.controller.postMessage({ op: 'update', url: req.url });
}
}
- this.logger.log('sync done', url, now);
- return now;
+ this.logger.log('sync done', url);
+ if (lastSync > newestChg) {
+ newestChg = lastSync;
+ }
+ return newestChg;
}
- async _syncManyUnlocked(all, now) {
+ async _syncManyUnlocked(all) {
const servers = [];
await new Promise((resolve) =>
this.db.transaction('syncservers').objectStore('syncservers').openCursor().onsuccess = (evt) => {
@@ -790,7 +798,7 @@ Formatted with `deno fmt`.
);
for (const [key, server] of servers) {
try {
- server.lastSync = await this._syncOneUnlocked(server, all, now);
+ server.lastSync = await this._syncOneUnlocked(server, all);
await adb(this.db.transaction('syncservers', 'readwrite').objectStore('syncservers').put(server, key));
} catch (e) {
if (e.name !== 'AbortError') {
@@ -805,7 +813,7 @@ Formatted with `deno fmt`.
this.isSyncing = false;
}
- sync(all, now) {
+ sync(all) {
if (this.isSyncing) {
return;
}
@@ -813,16 +821,16 @@ Formatted with `deno fmt`.
this.wiki.addTiddler({ title: '$:/status/TiddlyPWASyncing', text: 'yes' });
if (!navigator.locks) {
// welp, using multiple tabs without Web Locks is dangerous, but we can only YOLO it in this case
- return this._syncManyUnlocked(all, now);
+ return this._syncManyUnlocked(all);
}
- return navigator.locks.request(`tiddlypwa:${location.pathname}`, (_lck) => this._syncManyUnlocked(all, now));
+ return navigator.locks.request(`tiddlypwa:${location.pathname}`, (_lck) => this._syncManyUnlocked(all));
}
- backgroundSync(now) {
+ backgroundSync() {
if (!navigator.onLine) return;
// debounced to handle multiple saves in quick succession
clearTimeout(this.syncTimer);
- this.syncTimer = setTimeout(() => this.sync(false, now), 1000);
+ this.syncTimer = setTimeout(() => this.sync(false), 1000);
}
}
diff --git a/plugins/tiddlypwa/save-dialog.tid b/plugins/tiddlypwa/save-dialog.tid
index ebd1a9a..bfcaaa4 100644
--- a/plugins/tiddlypwa/save-dialog.tid
+++ b/plugins/tiddlypwa/save-dialog.tid
@@ -6,7 +6,7 @@ title: $:/plugins/valpackett/tiddlypwa/save-dialog
| Server |
- Last successful sync |
+ Last synced change |
<$list filter="[tag[$:/temp/TiddlyPWAServer]]">