53 lines
1.3 KiB
TypeScript
53 lines
1.3 KiB
TypeScript
import { Database } from "./database/database";
|
|
import { SyncServer } from "./services/sync_service";
|
|
import { syncRemotelyUpdatedFile } from "./sync-operations/sync-remotely-updated-file";
|
|
import { Logger } from "./logger";
|
|
import { FileOperations } from "./file-operations/file-operations";
|
|
|
|
let isRunning = false;
|
|
|
|
export async function applyRemoteChangesLocally(
|
|
database: Database,
|
|
syncServer: SyncServer,
|
|
operations: FileOperations
|
|
) {
|
|
if (isRunning) {
|
|
Logger.getInstance().info("Sync already in progress, skipping");
|
|
return;
|
|
}
|
|
|
|
isRunning = true;
|
|
try {
|
|
if (!database.getSettings().isSyncEnabled) {
|
|
return;
|
|
}
|
|
|
|
const remote = await syncServer.getAll(database.getLastSeenUpdateId());
|
|
|
|
if (remote.latestDocuments.length === 0) {
|
|
Logger.getInstance().debug("No remote changes to apply");
|
|
return;
|
|
}
|
|
|
|
Logger.getInstance().info("Applying remote changes locally");
|
|
|
|
await Promise.all(
|
|
remote.latestDocuments.map((remoteDocument) =>
|
|
syncRemotelyUpdatedFile({
|
|
database,
|
|
syncServer,
|
|
operations: operations,
|
|
remoteVersion: remoteDocument,
|
|
})
|
|
)
|
|
);
|
|
|
|
await database.setLastSeenUpdateId(remote.lastUpdateId);
|
|
} catch (e) {
|
|
Logger.getInstance().error(
|
|
`Failed to apply remote changes locally: ${e}`
|
|
);
|
|
} finally {
|
|
isRunning = false;
|
|
}
|
|
}
|