Skip to content

Commit 1cc1aa2

Browse files
committed
ConnectAsync should wait ConnectedMessage
1 parent a20f828 commit 1cc1aa2

File tree

2 files changed

+43
-14
lines changed

2 files changed

+43
-14
lines changed

src/SocketIOClient/V2/SocketIO.cs

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,17 +58,29 @@ private Uri ServerUri
5858

5959
private readonly Dictionary<int, Action<IAckMessage>> _ackHandlers = new();
6060
private readonly Dictionary<int, Func<IAckMessage, Task>> _funcHandlers = new();
61+
private TaskCompletionSource<Exception> _connCompletionSource = new();
6162
public SocketIOOptions Options { get; }
6263
public event EventHandler<Exception> OnReconnectError;
6364
public event EventHandler OnPing;
6465
public event EventHandler<TimeSpan> OnPong;
6566

6667
public async Task ConnectAsync()
6768
{
68-
await ConnectAsync(CancellationToken.None);
69+
await ConnectAsync(CancellationToken.None).ConfigureAwait(false);
6970
}
7071

7172
public async Task ConnectAsync(CancellationToken cancellationToken)
73+
{
74+
_ = ConnectCoreAsync(cancellationToken).ConfigureAwait(false);
75+
var task = Task.Run(async () => await _connCompletionSource.Task.ConfigureAwait(false), cancellationToken);
76+
var ex = await task.ConfigureAwait(false);
77+
if (ex != null)
78+
{
79+
throw ex;
80+
}
81+
}
82+
83+
private async Task ConnectCoreAsync(CancellationToken cancellationToken)
7284
{
7385
var attempts = Options.Reconnection ? Options.ReconnectionAttempts : 1;
7486
for (int i = 0; i < attempts; i++)
@@ -81,9 +93,10 @@ public async Task ConnectAsync(CancellationToken cancellationToken)
8193
using var cts = new CancellationTokenSource(Options.ConnectionTimeout);
8294
try
8395
{
84-
await session.ConnectAsync(cts.Token);
96+
await session.ConnectAsync(cts.Token).ConfigureAwait(false);
8597
_session = session;
8698
_session.Subscribe(this);
99+
// _sessionCompletionSource.SetResult(true);
87100
}
88101
catch (Exception e)
89102
{
@@ -92,10 +105,11 @@ public async Task ConnectAsync(CancellationToken cancellationToken)
92105
OnReconnectError?.Invoke(this, ex);
93106
if (i == attempts - 1)
94107
{
108+
_connCompletionSource.SetResult(ex);
95109
throw ex;
96110
}
97111
var delay = Random.Next(Options.ReconnectionDelayMax);
98-
await Task.Delay(delay, CancellationToken.None);
112+
await Task.Delay(delay, CancellationToken.None).ConfigureAwait(false);
99113
}
100114
}
101115
}
@@ -163,12 +177,12 @@ private async Task HandleAckMessage(IMessage message)
163177
}
164178
}
165179

166-
private Task HandleConnectedMessage(IMessage message)
180+
private async Task HandleConnectedMessage(IMessage message)
167181
{
168182
var connectedMessage = (ConnectedMessage)message;
169183
Id = connectedMessage.Sid;
170184
Connected = true;
171-
return Task.CompletedTask;
185+
_connCompletionSource.SetResult(null);
172186
}
173187

174188
private void HandlePongMessage(IMessage message)

tests/SocketIOClient.UnitTests/V2/SocketIOTests.cs

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.Diagnostics;
12
using FluentAssertions;
23
using NSubstitute;
34
using NSubstitute.ExceptionExtensions;
@@ -106,24 +107,26 @@ await _io
106107
[Fact]
107108
public async Task ConnectAsync_SessionSuccessfullyConnected_SessionSubscribeIO()
108109
{
109-
await _io.ConnectAsync();
110+
await ConnectAsync();
110111
_session.Received(1).Subscribe(_io);
111112
}
112113

113-
[Fact]
114-
public async Task ConnectAsync_SessionSuccessfullyConnectedButNoConnectedMessage_ConnectedIsFalse()
114+
private async Task ConnectAsync()
115115
{
116-
await _io.ConnectAsync();
117-
_io.Connected.Should().BeFalse();
116+
await ConnectAsync(0);
118117
}
119118

120-
private async Task ConnectAsync()
119+
private async Task ConnectAsync(int ms)
121120
{
122-
await _io.ConnectAsync();
123-
await _io.OnNextAsync(new ConnectedMessage
121+
_ = Task.Run(async () =>
124122
{
125-
Sid = "123",
123+
await Task.Delay(ms);
124+
await _io.OnNextAsync(new ConnectedMessage
125+
{
126+
Sid = "123",
127+
});
126128
});
129+
await _io.ConnectAsync();
127130
}
128131

129132
[Fact]
@@ -134,6 +137,18 @@ public async Task ConnectAsync_ConnectedMessageReceived_ConnectedIsTrueIdHasValu
134137
_io.Id.Should().Be("123");
135138
}
136139

140+
[Fact]
141+
public async Task ConnectAsync_ConnectedMessageDelay_ConnectAsyncIsSync()
142+
{
143+
var stopwatch = Stopwatch.StartNew();
144+
await ConnectAsync(200);
145+
stopwatch.Stop();
146+
147+
stopwatch.ElapsedMilliseconds.Should()
148+
.BeGreaterThanOrEqualTo(200)
149+
.And.BeLessThan(280);
150+
}
151+
137152
[Fact]
138153
public async Task ConnectAsyncCancellationToken_GivenACanceledToken_ThrowConnectionException()
139154
{

0 commit comments

Comments
 (0)