using SVSim.BattleNode.Protocol; namespace SVSim.BattleNode.Reliability; /// /// Per-session outbound ledger. Assigns monotonic playSeq to ordered pushes and archives /// them for future Resume retransmit (v2). No-stock control pushes (BattleFinish/JudgeResult/Resume) /// are wrapped with no playSeq and skip the archive. /// public sealed class OutboundSequencer { private long _next = 1; private readonly Dictionary _archive = new(); public IReadOnlyDictionary Archive => _archive; public MsgEnvelope AssignAndArchive(MsgEnvelope envelope) { var seq = _next++; var stamped = envelope with { PlaySeq = seq }; _archive[seq] = stamped; return stamped; } public MsgEnvelope WrapNoStock(MsgEnvelope envelope) => envelope with { PlaySeq = null }; }