Common networking stuffs

This commit is contained in:
Tom
2024-06-24 22:28:40 +00:00
commit aa9e3dbcd7
10 changed files with 402 additions and 0 deletions

View File

@@ -0,0 +1,10 @@
using CommonSocketLibrary.Abstract;
namespace CommonSocketLibrary.Common
{
public interface IWebSocketHandler
{
int OperationCode { get; }
Task Execute<Data>(SocketClient<WebSocketMessage> sender, Data data);
}
}

56
Common/WebSocketClient.cs Normal file
View File

@@ -0,0 +1,56 @@
using System.Text.Json;
using CommonSocketLibrary.Abstract;
using Serilog;
namespace CommonSocketLibrary.Common
{
public class WebSocketClient : SocketClient<WebSocketMessage>
{
private readonly HandlerManager<WebSocketClient, IWebSocketHandler> _handlerManager;
private readonly HandlerTypeManager<WebSocketClient, IWebSocketHandler> _handlerTypeManager;
public WebSocketClient(
ILogger logger,
HandlerManager<WebSocketClient, IWebSocketHandler> handlerManager,
HandlerTypeManager<WebSocketClient, IWebSocketHandler> typeManager,
JsonSerializerOptions serializerOptions
) : base(logger, serializerOptions)
{
_handlerManager = handlerManager;
_handlerTypeManager = typeManager;
}
protected override WebSocketMessage GenerateMessage<T>(int opcode, T data)
{
return new WebSocketMessage()
{
OpCode = opcode,
Data = data
};
}
protected override async Task OnResponseReceived(WebSocketMessage? data)
{
if (data == null)
return;
string content = data.Data?.ToString() ?? string.Empty;
_logger.Verbose("RX #" + data.OpCode + ": " + content);
if (!_handlerTypeManager.HandlerTypes.TryGetValue(data.OpCode, out Type? type) || type == null)
return;
var obj = JsonSerializer.Deserialize(content, type, _options);
await _handlerManager.Execute(this, data.OpCode, obj);
}
protected override async Task OnMessageSend(int opcode, string? content)
{
_logger.Verbose("TX #" + opcode + ": " + content);
}
protected override async Task OnConnection()
{
}
}
}

View File

@@ -0,0 +1,23 @@
using CommonSocketLibrary.Abstract;
using CommonSocketLibrary.Common;
using Serilog;
namespace CommonSocketLibrary.Socket.Manager
{
public class WebSocketHandlerManager : HandlerManager<WebSocketClient, IWebSocketHandler>
{
public WebSocketHandlerManager(ILogger logger) : base(logger)
{
}
protected void Add(IWebSocketHandler handler)
{
Add(handler.OperationCode, handler);
}
protected override async Task Execute<T>(WebSocketClient sender, IWebSocketHandler handler, T value)
{
await handler.Execute(sender, value);
}
}
}

View File

@@ -0,0 +1,26 @@
using CommonSocketLibrary.Abstract;
using CommonSocketLibrary.Common;
using Serilog;
namespace CommonSocketLibrary.Socket.Manager
{
public abstract class WebSocketHandlerTypeManager : HandlerTypeManager<WebSocketClient, IWebSocketHandler>
{
public WebSocketHandlerTypeManager(ILogger logger, HandlerManager<WebSocketClient, IWebSocketHandler> handlers) : base(logger, handlers)
{
}
protected override Type? FetchMessageType(Type handlerType)
{
if (handlerType == null)
return null;
var name = handlerType.Namespace + "." + handlerType.Name;
name = name.Replace(".Handlers.", ".Data.")
.Replace("Handler", "Message")
.Replace("MessageMessage", "Message");
return handlerType.Assembly.GetType(name);
}
}
}

View File

@@ -0,0 +1,13 @@
using System.Text.Json.Serialization;
namespace CommonSocketLibrary.Common
{
public class WebSocketMessage
{
[JsonPropertyName("op")]
public int OpCode { get; set; }
[JsonPropertyName("d")]
public object? Data { get; set; }
}
}