This commit is contained in:
@@ -140,6 +140,37 @@
|
||||
return normaliseLibrary(merged);
|
||||
}
|
||||
|
||||
function newestByTimestamp(remote, local) {
|
||||
const remoteStamp = String(remote.updatedAt || remote.createdAt || "");
|
||||
const localStamp = String(local.updatedAt || local.createdAt || "");
|
||||
return clone(localStamp >= remoteStamp ? local : remote);
|
||||
}
|
||||
|
||||
function mergeSyncItems(remoteItems, localItems, mergeMatch) {
|
||||
const items = new Map(remoteItems.map((item) => [item.id, clone(item)]));
|
||||
localItems.forEach((local) => {
|
||||
const remote = items.get(local.id);
|
||||
items.set(local.id, remote ? mergeMatch(remote, local) : clone(local));
|
||||
});
|
||||
return Array.from(items.values());
|
||||
}
|
||||
|
||||
function mergeForSync(remoteLibrary, localLibrary) {
|
||||
const remote = normaliseLibrary(remoteLibrary);
|
||||
const local = normaliseLibrary(localLibrary);
|
||||
const vaults = mergeSyncItems(remote.vaults, local.vaults, (remoteVault, localVault) => {
|
||||
const vault = newestByTimestamp(remoteVault, localVault);
|
||||
vault.folders = mergeSyncItems(remoteVault.folders, localVault.folders, newestByTimestamp);
|
||||
vault.resources = mergeSyncItems(remoteVault.resources, localVault.resources, (remoteResource, localResource) => {
|
||||
const resource = newestByTimestamp(remoteResource, localResource);
|
||||
resource.sessions = mergeSyncItems(remoteResource.sessions || [], localResource.sessions || [], newestByTimestamp);
|
||||
return resource;
|
||||
});
|
||||
return vault;
|
||||
});
|
||||
return normaliseLibrary({ schemaVersion: SCHEMA_VERSION, vaults });
|
||||
}
|
||||
|
||||
function progressFor(resource) {
|
||||
const sessions = Array.isArray(resource.sessions) ? resource.sessions : [];
|
||||
const furthest = sessions.reduce((maximum, session) => {
|
||||
@@ -218,6 +249,7 @@
|
||||
validateLibrary,
|
||||
normaliseLibrary,
|
||||
mergeLibraries,
|
||||
mergeForSync,
|
||||
progressFor,
|
||||
addVault,
|
||||
renameVault,
|
||||
|
||||
Reference in New Issue
Block a user