fix: process sync items after fetch completes

This commit is contained in:
thecodrr
2022-03-30 23:16:38 +05:00
parent 2cbe8dffd8
commit 32a2d79409

View File

@@ -151,30 +151,33 @@ class Sync {
const serverResponse = await new Promise((resolve, reject) => { const serverResponse = await new Promise((resolve, reject) => {
let serverLastSynced = 0; let serverLastSynced = 0;
let _synced = false; let _synced = false;
let items = [];
this.connection.stream("FetchItems", lastSynced).subscribe({ this.connection.stream("FetchItems", lastSynced).subscribe({
next: async (/** @type {SyncTransferItem} */ syncStatus) => { next: (/** @type {SyncTransferItem} */ syncStatus) => {
const { item, synced, lastSynced } = syncStatus; const { item, synced, lastSynced } = syncStatus;
serverLastSynced = lastSynced; serverLastSynced = lastSynced;
_synced = synced; _synced = synced;
if (synced || !item) return; if (synced || !item) return;
items.push(syncStatus);
await this.onSyncItem(syncStatus);
}, },
complete: () => { complete: () => {
resolve({ synced: _synced, lastSynced: serverLastSynced }); resolve({ synced: _synced, lastSynced: serverLastSynced, items });
}, },
error: reject, error: reject,
}); });
}); });
for (let item of serverResponse.items) {
await this.onSyncItem(item);
}
if (await this.conflicts.check()) { if (await this.conflicts.check()) {
throw new Error( throw new Error(
"Merge conflicts detected. Please resolve all conflicts to continue syncing." "Merge conflicts detected. Please resolve all conflicts to continue syncing."
); );
} }
return serverResponse; return { lastSynced: serverResponse.lastSynced };
} }
async collect(lastSynced) { async collect(lastSynced) {
@@ -316,10 +319,12 @@ class Sync {
*/ */
async onSyncItem(syncStatus) { async onSyncItem(syncStatus) {
const { current, item: itemJSON, itemType, total } = syncStatus; const { current, item: itemJSON, itemType, total } = syncStatus;
sendSyncProgressEvent(this.db.eventManager, "download", total, current);
const item = JSON.parse(itemJSON); const item = JSON.parse(itemJSON);
await this.merger.mergeItem(itemType, item); await this.merger.mergeItem(itemType, item).then(() => {
sendSyncProgressEvent(this.db.eventManager, "download", total, current); console.log("Merge complete", item.id);
});
} }
/** /**