Fixed several socket issues. Added backoff for reconnection.

This commit is contained in:
Tom
2024-08-10 19:31:08 +00:00
parent aa9e3dbcd7
commit ab90d47b89
8 changed files with 207 additions and 106 deletions

View File

@@ -2,41 +2,55 @@
namespace CommonSocketLibrary.Abstract
{
public abstract class HandlerTypeManager<Client, Handler>
public interface ICodedOperation
{
int OperationCode { get; }
}
public interface IMessageTypeManager
{
Type? GetMessageTypeByCode(int code);
}
public abstract class MessageTypeManager<Handler> : IMessageTypeManager where Handler : ICodedOperation
{
private readonly IDictionary<int, Type> _types;
public IDictionary<int, Type> HandlerTypes { get => _types; }
protected readonly ILogger _logger;
public HandlerTypeManager(ILogger logger, HandlerManager<Client, Handler> handlers)
public MessageTypeManager(IEnumerable<Handler> handlers, ILogger logger)
{
_types = new Dictionary<int, Type>();
_logger = logger;
GenerateHandlerTypes(handlers.Handlers);
GenerateHandlerTypes(handlers);
}
private void GenerateHandlerTypes(IDictionary<int, Handler> handlers)
public Type? GetMessageTypeByCode(int code)
{
foreach (var entry in handlers)
_types.TryGetValue(code, out Type? type);
return type;
}
private void GenerateHandlerTypes(IEnumerable<Handler> handlers)
{
foreach (var handler in handlers)
{
if (entry.Value == null)
if (handler == null)
{
_logger.Error($"Failed to link websocket handler #{entry.Key} due to null value.");
_logger.Error($"Failed to link websocket handler due to null value.");
continue;
}
var type = entry.Value.GetType();
var type = handler.GetType();
var target = FetchMessageType(type);
if (target == null)
{
_logger.Error($"Failed to link websocket handler #{entry.Key} due to no match for {target}.");
_logger.Error($"Failed to link websocket handler #{handler.OperationCode} due to no match for {target}.");
continue;
}
_types.Add(entry.Key, target);
_logger.Debug($"Linked websocket handler #{entry.Key} to type {target.AssemblyQualifiedName}.");
_types.Add(handler.OperationCode, target);
_logger.Debug($"Linked websocket handler #{handler.OperationCode} to type {target.AssemblyQualifiedName}.");
}
}