| export interface ObservableCloudPrefsFlushSuccessOptions { | |
| syncVersion: unknown; | |
| myGeneration: number; | |
| getAuthGeneration: () => number; | |
| getSyncVersion: () => number; | |
| setSyncVersion: (syncVersion: number) => void; | |
| clearSettledDirtyKeys: () => void; | |
| setLastSyncAt: (timestampMs: number) => void; | |
| isIdle: () => boolean; | |
| setSynced: () => void; | |
| now?: () => number; | |
| } | |
| /** | |
| * Apply an observable keepalive flush response after a tab is hidden. | |
| * Real unloads usually do not run this path; tab switches do, and the echoed | |
| * syncVersion must be adopted so the next alive-tab save does not hit 409. | |
| */ | |
| export function applyObservableCloudPrefsFlushSuccess( | |
| opts: ObservableCloudPrefsFlushSuccessOptions, | |
| ): boolean { | |
| if (typeof opts.syncVersion !== 'number') return false; | |
| if (opts.getAuthGeneration() !== opts.myGeneration) return false; | |
| if (opts.syncVersion <= opts.getSyncVersion()) return false; | |
| opts.setSyncVersion(opts.syncVersion); | |
| opts.clearSettledDirtyKeys(); | |
| opts.setLastSyncAt((opts.now ?? Date.now)()); | |
| if (opts.isIdle()) opts.setSynced(); | |
| return true; | |
| } | |