Skip to content

Commit 55f9787

Browse files
committed
add NewPongMessage method and integrate retry policy in EngineIO4Adapter
1 parent a750e90 commit 55f9787

File tree

7 files changed

+74
-7
lines changed

7 files changed

+74
-7
lines changed

src/SocketIOClient.Serializer/BaseJsonSerializer.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,14 @@ public ProtocolMessage NewPingMessage()
7070
};
7171
}
7272

73+
public ProtocolMessage NewPongMessage()
74+
{
75+
return new ProtocolMessage
76+
{
77+
Text = "3",
78+
};
79+
}
80+
7381
protected abstract IMessage NewMessage(MessageType type, string text);
7482

7583
private static List<ProtocolMessage> GetSerializeResult(string text, IEnumerable<byte[]> bytes)

src/SocketIOClient.Serializer/ISerializer.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@ public interface ISerializer
1010
List<ProtocolMessage> Serialize(object[] data);
1111
IMessage Deserialize(string text);
1212
ProtocolMessage NewPingMessage();
13+
ProtocolMessage NewPongMessage();
1314
}
1415
}

src/SocketIOClient/V2/DefaultSessionFactory.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public ISession New(EngineIO eio, SessionOptions options)
2626
var randomDelayRetryPolicy = new RandomDelayRetryPolicy(random);
2727
IEngineIOAdapter engineIOAdapter = eio == EngineIO.V3
2828
? new EngineIO3Adapter(stopwatch, serializer, httpAdapter, options.Timeout, randomDelayRetryPolicy)
29-
: new EngineIO4Adapter(stopwatch, httpAdapter, options.Timeout);
29+
: new EngineIO4Adapter(stopwatch, serializer, httpAdapter, options.Timeout, randomDelayRetryPolicy);
3030
return new HttpSession(
3131
options,
3232
engineIOAdapter,

src/SocketIOClient/V2/Session/EngineIOHttpAdapter/EngineIO4Adapter.cs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Threading.Tasks;
66
using SocketIOClient.Core;
77
using SocketIOClient.Core.Messages;
8+
using SocketIOClient.Serializer;
89
using SocketIOClient.V2.Infrastructure;
910
using SocketIOClient.V2.Observers;
1011
using SocketIOClient.V2.Protocol;
@@ -16,19 +17,25 @@ public class EngineIO4Adapter : IEngineIOAdapter
1617
{
1718
public EngineIO4Adapter(
1819
IStopwatch stopwatch,
20+
ISerializer serializer,
1921
IProtocolAdapter protocolAdapter,
20-
TimeSpan timeout)
22+
TimeSpan timeout,
23+
IRetriable retryPolicy)
2124
{
2225
_stopwatch = stopwatch;
26+
_serializer = serializer;
2327
_protocolAdapter = protocolAdapter;
2428
_timeout = timeout;
29+
_retryPolicy = retryPolicy;
2530
}
2631

2732
private const string Delimiter = "\u001E";
2833
private readonly IStopwatch _stopwatch;
34+
private readonly ISerializer _serializer;
2935
private readonly IProtocolAdapter _protocolAdapter;
3036
private readonly List<IMyObserver<IMessage>> _observers = [];
3137
private readonly TimeSpan _timeout;
38+
private readonly IRetriable _retryPolicy;
3239

3340
public IHttpRequest ToHttpRequest(ICollection<byte[]> bytes)
3441
{
@@ -96,12 +103,13 @@ public async Task ProcessMessageAsync(IMessage message)
96103

97104
private async Task HandlePingMessageAsync()
98105
{
106+
var pongProtocolMessage = _serializer.NewPongMessage();
99107
_stopwatch.Restart();
100-
using var cts = new CancellationTokenSource(_timeout);
101-
await _protocolAdapter.SendAsync(new ProtocolMessage
108+
await _retryPolicy.RetryAsync(3, async () =>
102109
{
103-
Text = "3",
104-
}, cts.Token);
110+
using var cts = new CancellationTokenSource(_timeout);
111+
await _protocolAdapter.SendAsync(pongProtocolMessage, cts.Token);
112+
});
105113
_stopwatch.Stop();
106114
var pong = new PongMessage
107115
{

tests/SocketIOClient.Serializer.NewtonsoftJson.Tests/NewtonJsonSerializerTests.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -505,4 +505,16 @@ public void NewPingMessage_WhenCalled_ReturnPingMessage()
505505
Text = "2",
506506
});
507507
}
508+
509+
[Fact]
510+
public void NewPongMessage_WhenCalled_ReturnPingMessage()
511+
{
512+
var pong = _serializer.NewPongMessage();
513+
pong.Should()
514+
.BeEquivalentTo(new ProtocolMessage
515+
{
516+
Type = ProtocolMessageType.Text,
517+
Text = "3",
518+
});
519+
}
508520
}

tests/SocketIOClient.UnitTests/V2/Serializer/SystemTextJson/SystemJsonSerializerTests.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -516,4 +516,16 @@ public void NewPingMessage_WhenCalled_ReturnPingMessage()
516516
Text = "2",
517517
});
518518
}
519+
520+
[Fact]
521+
public void NewPongMessage_WhenCalled_ReturnPingMessage()
522+
{
523+
var pong = _serializer.NewPongMessage();
524+
pong.Should()
525+
.BeEquivalentTo(new ProtocolMessage
526+
{
527+
Type = ProtocolMessageType.Text,
528+
Text = "3",
529+
});
530+
}
519531
}

tests/SocketIOClient.UnitTests/V2/Session/EngineIOHttpAdapter/EngineIO4AdapterTests.cs

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@
22
using JetBrains.Annotations;
33
using NSubstitute;
44
using SocketIOClient.Core;
5+
using SocketIOClient.Core.Messages;
6+
using SocketIOClient.Serializer;
57
using SocketIOClient.V2;
68
using SocketIOClient.V2.Infrastructure;
9+
using SocketIOClient.V2.Observers;
710
using SocketIOClient.V2.Protocol;
811
using SocketIOClient.V2.Protocol.Http;
912
using SocketIOClient.V2.Session.EngineIOHttpAdapter;
@@ -15,13 +18,22 @@ public class EngineIO4AdapterTests
1518
public EngineIO4AdapterTests()
1619
{
1720
_stopwatch = Substitute.For<IStopwatch>();
21+
_serializer = Substitute.For<ISerializer>();
1822
_protocolAdapter = Substitute.For<IProtocolAdapter>();
19-
_adapter = new EngineIO4Adapter(_stopwatch, _protocolAdapter, TimeSpan.FromSeconds(1));
23+
_retryPolicy = Substitute.For<IRetriable>();
24+
_adapter = new EngineIO4Adapter(
25+
_stopwatch,
26+
_serializer,
27+
_protocolAdapter,
28+
TimeSpan.FromSeconds(1),
29+
_retryPolicy);
2030
}
2131

2232
private readonly IStopwatch _stopwatch;
33+
private readonly ISerializer _serializer;
2334
private readonly IProtocolAdapter _protocolAdapter;
2435
private readonly EngineIO4Adapter _adapter;
36+
private readonly IRetriable _retryPolicy;
2537

2638
[Fact]
2739
public void ToHttpRequest_GivenAnEmptyArray_ThrowException()
@@ -162,4 +174,18 @@ public void ToHttpRequest_GivenValidContent_ReturnSameBodyText(string content, s
162174
var req = _adapter.ToHttpRequest(content);
163175
req.BodyText.Should().Be(expected);
164176
}
177+
178+
[Fact]
179+
public async Task ProcessMessageAsync_PingMessage_NotifyObserverWithDuration()
180+
{
181+
var observer = Substitute.For<IMyObserver<IMessage>>();
182+
_adapter.Subscribe(observer);
183+
_stopwatch.Elapsed.Returns(TimeSpan.FromSeconds(1));
184+
185+
await _adapter.ProcessMessageAsync(new PingMessage());
186+
187+
await observer
188+
.Received(1)
189+
.OnNextAsync(Arg.Is<IMessage>(m => ((PongMessage)m).Duration == TimeSpan.FromSeconds(1)));
190+
}
165191
}

0 commit comments

Comments
 (0)