/ GUNRPG.Application / Distributed / LockstepMessages.cs
LockstepMessages.cs
 1  namespace GUNRPG.Application.Distributed;
 2  
 3  /// <summary>
 4  /// Protocol: /gunrpg/lockstep/1.0.0
 5  /// All messages are serialized with System.Text.Json.
 6  /// </summary>
 7  public static class LockstepProtocol
 8  {
 9      public const string Id = "/gunrpg/lockstep/1.0.0";
10  }
11  
12  /// <summary>Broadcast a new action to all peers for consensus.</summary>
13  public sealed class ActionBroadcastMessage
14  {
15      public required Guid SenderId { get; init; }
16      public required long ProposedSequenceNumber { get; init; }
17      public required PlayerActionDto Action { get; init; }
18  }
19  
20  /// <summary>Acknowledge receipt of a broadcast action.</summary>
21  public sealed class ActionAckMessage
22  {
23      public required Guid SenderId { get; init; }
24      public required Guid AckedActionId { get; init; }
25      public required long SequenceNumber { get; init; }
26  }
27  
28  /// <summary>Broadcast the rolling state hash after applying an action.</summary>
29  public sealed class HashBroadcastMessage
30  {
31      public required Guid SenderId { get; init; }
32      public required long SequenceNumber { get; init; }
33      public required string StateHash { get; init; }
34  }
35  
36  /// <summary>Request missing log entries from a peer (reconnect sync).</summary>
37  public sealed class LogSyncRequestMessage
38  {
39      public required Guid SenderId { get; init; }
40      public required long FromSequenceNumber { get; init; }
41      public required string LatestHash { get; init; }
42  }
43  
44  /// <summary>Response with missing log entries for peer sync.</summary>
45  public sealed class LogSyncResponseMessage
46  {
47      public required Guid SenderId { get; init; }
48      public required List<DistributedActionEntry> Entries { get; init; }
49      public required bool FullReplay { get; init; }
50  }
51  
52  /// <summary>Broadcast a single operator event to all peers for replication.</summary>
53  public sealed class OperatorEventBroadcastMessage
54  {
55      public required Guid SenderId { get; init; }
56      public required Guid OperatorId { get; init; }
57      public required long SequenceNumber { get; init; }
58      public required string EventType { get; init; }
59      public required string Payload { get; init; }
60      public required string PreviousHash { get; init; }
61      public required string Hash { get; init; }
62      public required DateTimeOffset Timestamp { get; init; }
63  }
64  
65  /// <summary>Request all known operator events from a peer (initial sync).</summary>
66  public sealed class OperatorEventSyncRequestMessage
67  {
68      public required Guid SenderId { get; init; }
69  }
70  
71  /// <summary>Response with all known operator events for initial sync.</summary>
72  public sealed class OperatorEventSyncResponseMessage
73  {
74      public required Guid SenderId { get; init; }
75      public required List<OperatorEventBroadcastMessage> Events { get; init; }
76  }