feat: add resilient reconnect and catch-up replay

This commit is contained in:
Joseph Doherty
2026-03-17 11:04:19 -04:00
parent c278f98496
commit 2f04ec9d1d
29 changed files with 3746 additions and 95 deletions

View File

@@ -114,6 +114,38 @@ public sealed class SuiteLinkTcpTransportTests
async () => await listener.AcceptTcpClientAsync(secondAcceptCts.Token));
}
[Fact]
public async Task ResetConnectionAsync_AfterConnect_AllowsReconnect()
{
using var listener = new TcpListener(IPAddress.Loopback, 0);
listener.Start();
var endpoint = (IPEndPoint)listener.LocalEndpoint;
await using var transport = new SuiteLinkTcpTransport();
await transport.ConnectAsync(endpoint.Address.ToString(), endpoint.Port);
using var accepted1 = await listener.AcceptTcpClientAsync();
await transport.ResetConnectionAsync();
Assert.False(transport.IsConnected);
await transport.ConnectAsync(endpoint.Address.ToString(), endpoint.Port);
using var accepted2 = await listener.AcceptTcpClientAsync();
Assert.True(transport.IsConnected);
}
[Fact]
public async Task ResetConnectionAsync_LeaveOpenTrue_DoesNotDisposeInjectedStream()
{
var stream = new TrackingStream();
await using var transport = new SuiteLinkTcpTransport(stream, leaveOpen: true);
await transport.ResetConnectionAsync();
Assert.False(stream.WasDisposed);
}
private sealed class PartialReadStream : Stream
{
private readonly MemoryStream _inner;