| // Phase 7: Sync Resolver | |
| // Resolves conflicts between local and server versions of documents | |
| const SyncResolver = { | |
| /** | |
| * Resolves a conflict between a local document draft and the server document. | |
| * Rule: Latest timestamp wins. Fallback: Server wins. | |
| * | |
| * @param {object} localDoc - The local pending change or draft object (needs timestamp) | |
| * @param {object} serverDoc - The document fetched from Supabase (needs updated_at) | |
| * @returns {'local' | 'server'} - Which version won | |
| */ | |
| resolveConflict(localDoc, serverDoc) { | |
| if (!localDoc || !localDoc.content) return 'server'; | |
| if (!serverDoc || !serverDoc.content) return 'local'; | |
| const localTime = localDoc.timestamp ? new Date(localDoc.timestamp).getTime() : 0; | |
| const serverTime = serverDoc.updated_at ? new Date(serverDoc.updated_at).getTime() : 0; | |
| // If both times are valid, latest wins | |
| if (localTime > 0 && serverTime > 0) { | |
| if (localTime >= serverTime) { | |
| return 'local'; | |
| } else { | |
| return 'server'; | |
| } | |
| } | |
| // Fallback: Server wins | |
| return 'server'; | |
| } | |
| }; | |
| if (typeof module !== 'undefined' && module.exports) { | |
| module.exports = { SyncResolver }; | |
| } | |