File size: 1,200 Bytes
a281968
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// 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 };
}