From 12d686d78c04ce2010e593f4eb407e5afadfcbaf Mon Sep 17 00:00:00 2001 From: Johannes Millan Date: Fri, 6 Mar 2026 10:30:08 +0100 Subject: [PATCH] fix(sync): add defensive undefined guard and clarify revert comment - Add undefined guard for newClock[clientId] in SyncHydrationService clock reset, matching the pattern in OperationLogStoreService - Clarify enableEncryption revert comment explaining why explicit overrides exist despite existingCfg already having correct values --- src/app/imex/sync/supersync-encryption-toggle.service.ts | 5 ++++- src/app/op-log/persistence/sync-hydration.service.ts | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/app/imex/sync/supersync-encryption-toggle.service.ts b/src/app/imex/sync/supersync-encryption-toggle.service.ts index 5d3cc178ad..dc5cfa4b13 100644 --- a/src/app/imex/sync/supersync-encryption-toggle.service.ts +++ b/src/app/imex/sync/supersync-encryption-toggle.service.ts @@ -59,7 +59,10 @@ export class SuperSyncEncryptionToggleService { // Revert config on failure (server data is already deleted at this point) SyncLog.err(`${LOG_PREFIX}: Failed after deleting server data!`, error); - // Best-effort revert: restore original config (preserves auth credentials and original encryption state) + // Best-effort revert: restore pre-enable config. + // existingCfg was captured before enabling, so it already has isEncryptionEnabled: false + // and no encryptKey. The explicit overrides ensure correctness even if the guard above + // was bypassed (e.g., existingCfg was partially set). await this._providerManager.setProviderConfig(SyncProviderId.SuperSync, { ...existingCfg, encryptKey: undefined, diff --git a/src/app/op-log/persistence/sync-hydration.service.ts b/src/app/op-log/persistence/sync-hydration.service.ts index 38613d3e53..f2ed3be4e3 100644 --- a/src/app/op-log/persistence/sync-hydration.service.ts +++ b/src/app/op-log/persistence/sync-hydration.service.ts @@ -252,7 +252,10 @@ export class SyncHydrationService { let clockForStorage: Record; if (createSyncImportOp) { clockForStorage = {}; - clockForStorage[clientId] = newClock[clientId]; + // Guard against undefined — consistent with mergeRemoteOpClocks() in OperationLogStoreService + if (newClock[clientId] !== undefined) { + clockForStorage[clientId] = newClock[clientId]; + } OpLog.normal('SyncHydrationService: Reset working clock to minimal after sync', { fullClockSize: Object.keys(newClock).length, minimalClockSize: Object.keys(clockForStorage).length,