fix: Pull-Wasserzeichen sprang über fremde Ereignisse + schärfere Push-Kollisionskontrolle
EventStore.Pull gab bisher den globalen ServerSeq-Höchststand als neuen Cursor zurück statt den höchsten unter den tatsächlich gelieferten Ereignissen - hatte ein Gerät selbst kurz zuvor etwas gepusht, sprang sein Pull-Cursor über noch nicht abgeholte Ereignisse anderer Geräte hinweg und verpasste sie dauerhaft, ohne jeden Fehler. Ersetzt außerdem die bisherige 30-Sekunden-Heuristik zur Konflikterkennung beim Push durch exakte BasedOnServerSeq-Prüfung: jedes SyncEvent trägt die ServerSeq, auf der es aufbaut: der Server lehnt ab, wenn der aktuelle Stand nicht mehr passt. Bei Ablehnung lädt der Client sofort den neuen Server-Stand nach, löst den Konflikt nach der bestehenden Desktop-vs-Companion/ Timestamp-Politik auf und macht ihn immer in der Konflikt-Review-UI sichtbar, statt die verworfene Änderung stillschweigend zu verlieren. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -21,6 +21,14 @@ public class SyncEvent
|
||||
public string Operation { get; init; } = "";
|
||||
/// <summary>Verschlüsselt (Desktop) oder Klartext (Companion/WebApp).</summary>
|
||||
public string Payload { get; init; } = "";
|
||||
/// <summary>
|
||||
/// ServerSeq, auf der die lokale Änderung aufbaut (null = Entität wurde hier noch nie
|
||||
/// synchronisiert, z.B. Neuanlage). Wird von SyncEngine.PushAsync erst unmittelbar vor dem
|
||||
/// Senden aus der lokalen Versionsverfolgung (EventQueue) gesetzt, nicht beim Einreihen —
|
||||
/// so verwendet ein zweiter Push desselben Ereignisses (falls der erste abgelehnt wurde)
|
||||
/// automatisch den inzwischen aktualisierten Stand.
|
||||
/// </summary>
|
||||
public long? BasedOnServerSeq { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>WebApp/Companion-Event: Payload ist Klartext-JSON.</summary>
|
||||
@@ -43,6 +51,10 @@ public class PushResponse
|
||||
public bool Success { get; init; }
|
||||
public long ServerSequenceNr { get; init; }
|
||||
public List<Guid> ConflictingEventIds { get; init; } = [];
|
||||
/// <summary>Je akzeptiertem Ereignis die tatsächlich vergebene ServerSeq — der Client braucht
|
||||
/// das, um seine lokale Versionsverfolgung je Entität (EventQueue) auf den neuen Stand zu
|
||||
/// bringen.</summary>
|
||||
public Dictionary<Guid, long> AssignedServerSeqs { get; init; } = [];
|
||||
}
|
||||
public class PullResponse
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user