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 }