Auto commit
All checks were successful
Build Org Website / build (push) Successful in 40s

This commit is contained in:
gitea-actions
2026-08-20 14:03:52 +01:00
parent 0b4a68b81b
commit 7a60d33610
11 changed files with 504 additions and 72 deletions

View File

@@ -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,