15
16
export function merge(localStorage: IStringDictionary<IStorageValue>, remoteStorage: IStringDictionary<IStorageValue> | null, baseStorage: IStringDictionary<IStorageValue> | null, storageKeys: { machine: ReadonlyArray<string>; unregistered: ReadonlyArray<string> }, logService: ILogService): IMergeResult {
18
return { remote: { added: Object.keys(localStorage), removed: [], updated: [], all: Object.keys(localStorage).length > 0 ? localStorage : null }, local: { added: {}, removed: [], updated: {} } };
19
}
20
21
const localToRemote = compare(localStorage, remoteStorage);
22
>
if (localToRemote.added.size === 0 && localToRemote.removed.size === 0 && localToRemote.updated.size === 0) {
globalStateMerge.ts
23
// No changes found between local and remote.
24
return { remote: { added: [], removed: [], updated: [], all: null }, local: { added: {}, removed: [], updated: {} } };
25
}
26
27
>
const baseToRemote = baseStorage ? compare(baseStorage, remoteStorage) : { added: Object.keys(remoteStorage).reduce((r, k) => { r.add(k); return r; }, new Set<string>()), removed: new Set<string>(), updated: new Set<string>() };
globalStateMerge.ts
28
>
const baseToLocal = baseStorage ? compare(baseStorage, localStorage) : { added: Object.keys(localStorage).reduce((r, k) => { r.add(k); return r; }, new Set<string>()), removed: new Set<string>(), updated: new Set<string>() };
29
>
30
>
const local: { added: IStringDictionary<IStorageValue>; removed: string[]; updated: IStringDictionary<IStorageValue> } = { added: {}, removed: [], updated: {} };
31
>
const remote: IStringDictionary<IStorageValue> = objects.deepClone(remoteStorage);
32
>
33
>
const isFirstTimeSync = !baseStorage;
34
>
35
>
// Added in local
36
>
for (const key of baseToLocal.added.values()) {
37
// If syncing for first time remote value gets precedence always,
38
// except for sync service type key - local value takes precedence for this key