Skip to content

Commit a750e90

Browse files
committed
add ping/pong message handling and retry policy to EngineIO adapters
1 parent 32cabd8 commit a750e90

File tree

29 files changed

+579
-117
lines changed

29 files changed

+579
-117
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
namespace SocketIOClient.Core.Messages;
2+
3+
public class PingMessage : IMessage
4+
{
5+
public MessageType Type => MessageType.Ping;
6+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using System;
2+
3+
namespace SocketIOClient.Core.Messages;
4+
5+
public class PongMessage : IMessage
6+
{
7+
public MessageType Type => MessageType.Pong;
8+
public TimeSpan Duration { get; set; }
9+
}

src/SocketIOClient.Core/Messages/TypeOnlyMessage.cs

Lines changed: 0 additions & 6 deletions
This file was deleted.

src/SocketIOClient.Serializer.NewtonsoftJson/NewtonJsonSerializer.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ protected override IMessage NewMessage(MessageType type, string text)
4242
return type switch
4343
{
4444
MessageType.Opened => NewOpenedMessage(text),
45-
MessageType.Ping => new TypeOnlyMessage(MessageType.Ping),
46-
MessageType.Pong => new TypeOnlyMessage(MessageType.Pong),
45+
MessageType.Ping => new PingMessage(),
46+
MessageType.Pong => new PongMessage(),
4747
MessageType.Connected => EngineIOMessageAdapter.DeserializeConnectedMessage(text),
4848
MessageType.Disconnected => NewDisconnectedMessage(text),
4949
MessageType.Event => NewEventMessage(text),

src/SocketIOClient.Serializer/BaseJsonSerializer.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,14 @@ public IMessage Deserialize(string text)
6262
return NewMessage(result.Type!.Value, result.Data);
6363
}
6464

65+
public ProtocolMessage NewPingMessage()
66+
{
67+
return new ProtocolMessage
68+
{
69+
Text = "2",
70+
};
71+
}
72+
6573
protected abstract IMessage NewMessage(MessageType type, string text);
6674

6775
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
@@ -9,5 +9,6 @@ public interface ISerializer
99
string Namespace { get; set; }
1010
List<ProtocolMessage> Serialize(object[] data);
1111
IMessage Deserialize(string text);
12+
ProtocolMessage NewPingMessage();
1213
}
1314
}
Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.Net.Http;
22
using SocketIOClient.Serializer.Decapsulation;
3+
using SocketIOClient.V2.Infrastructure;
34
using SocketIOClient.V2.Protocol.Http;
45
using SocketIOClient.V2.Serializer.SystemTextJson;
56
using SocketIOClient.V2.Session;
@@ -10,28 +11,27 @@ namespace SocketIOClient.V2;
1011

1112
public interface ISessionFactory
1213
{
13-
ISession New(EngineIO eio);
14+
ISession New(EngineIO eio, SessionOptions options);
1415
}
1516

1617
public class DefaultSessionFactory : ISessionFactory
1718
{
18-
public ISession New(EngineIO eio)
19+
public ISession New(EngineIO eio, SessionOptions options)
1920
{
20-
var engineIOAdapter = NewEnginIOAdapter(eio);
2121
var httpClient = new SystemHttpClient(new HttpClient());
22+
var httpAdapter = new HttpAdapter(httpClient);
23+
var serializer = new SystemJsonSerializer(new Decapsulator());
24+
var stopwatch = new SystemStopwatch();
25+
var random = new SystemRandom();
26+
var randomDelayRetryPolicy = new RandomDelayRetryPolicy(random);
27+
IEngineIOAdapter engineIOAdapter = eio == EngineIO.V3
28+
? new EngineIO3Adapter(stopwatch, serializer, httpAdapter, options.Timeout, randomDelayRetryPolicy)
29+
: new EngineIO4Adapter(stopwatch, httpAdapter, options.Timeout);
2230
return new HttpSession(
31+
options,
2332
engineIOAdapter,
2433
new HttpAdapter(httpClient),
25-
new SystemJsonSerializer(new Decapsulator()),
34+
serializer,
2635
new DefaultUriConverter((int)eio));
2736
}
28-
29-
private static IEngineIOAdapter NewEnginIOAdapter(EngineIO eio)
30-
{
31-
if (eio == EngineIO.V3)
32-
{
33-
return new EngineIO3Adapter();
34-
}
35-
return new EngineIO4Adapter();
36-
}
3737
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
using System;
2+
3+
namespace SocketIOClient.V2.Infrastructure;
4+
5+
public interface IRandom
6+
{
7+
int Next(int max);
8+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using System;
2+
using System.Threading.Tasks;
3+
4+
namespace SocketIOClient.V2.Infrastructure;
5+
6+
public interface IRetriable
7+
{
8+
Task RetryAsync(int times, Func<Task> func);
9+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using System;
2+
3+
namespace SocketIOClient.V2.Infrastructure;
4+
5+
public interface IStopwatch
6+
{
7+
TimeSpan Elapsed { get; }
8+
void Restart();
9+
void Stop();
10+
}

0 commit comments

Comments
 (0)