This repository was archived by the owner on Dec 3, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 101
/
Copy pathIMessageHandler.cs
64 lines (57 loc) · 2.27 KB
/
IMessageHandler.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
using System;
using Microsoft.AspNetCore.Http;
using NLog;
using XOutput.Threading;
using XOutput.Websocket.Common;
namespace XOutput.Websocket
{
public interface IMessageHandler
{
void Handle(MessageBase message);
void Close();
}
public abstract class MessageHandler : IMessageHandler {
private static readonly ILogger logger = LogManager.GetCurrentClassLogger();
private readonly ThreadContext pingThreadContext;
protected readonly CloseFunction closeFunction;
protected readonly SenderFunction senderFunction;
protected MessageHandler(CloseFunction closeFunction, SenderFunction senderFunction) {
this.closeFunction = closeFunction;
this.senderFunction = senderFunction;
pingThreadContext = ThreadCreator.CreateLoop("Ping loop", () => {
try
{
var r = new PingRequest {
Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
};
senderFunction(new PingRequest {
Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
});
}
catch (Exception ex)
{
logger.Warn(ex, "Ping failed, closing connection");
closeFunction();
}
}, 5000).Start();
}
public void Handle(MessageBase message) {
if (message is PingRequest) {
senderFunction(new PongResponse { Timestamp = (message as PingRequest).Timestamp });
} else if (message is PongResponse) {
logger.Debug(() => $"Delay is {DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() - (message as PongResponse).Timestamp} ms");
} else if (message is DebugRequest) {
var debugMessage = message as DebugRequest;
logger.Info("Message from client: " + debugMessage.Data);
} else {
HandleMessage(message);
}
}
protected virtual void HandleMessage(MessageBase message) {
throw new NotImplementedException();
}
public virtual void Close() {
pingThreadContext.Cancel();
}
}
}