Fixed several socket issues. Added backoff for reconnection.
This commit is contained in:
@@ -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}.");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user