Support multiple packet handlers

This commit is contained in:
Oliver Booth 2022-05-18 16:45:07 +01:00
parent 1124521cb8
commit a8d787d811
No known key found for this signature in database
GPG Key ID: 32A00B35503AF634
3 changed files with 24 additions and 8 deletions

View File

@ -96,8 +96,8 @@ public abstract class BaseClientNode : Node
await packet.DeserializeAsync(bufferReader);
await targetStream.DisposeAsync();
if (RegisteredPacketHandlers.TryGetValue(packetType, out PacketHandler? packetHandler))
await packetHandler.HandleAsync(this, packet);
if (RegisteredPacketHandlers.TryGetValue(packetType, out IReadOnlyCollection<PacketHandler>? handlers))
await Task.WhenAll(handlers.Select(h => h.HandleAsync(this, packet)));
return packet;
}

View File

@ -12,7 +12,7 @@ namespace TcpDotNet;
public abstract class Node : IDisposable
{
private readonly ConcurrentDictionary<int, Type> _registeredPackets = new();
private readonly ConcurrentDictionary<Type, PacketHandler> _registeredPacketHandlers = new();
private readonly ConcurrentDictionary<Type, List<PacketHandler>> _registeredPacketHandlers = new();
/// <summary>
/// Gets the underlying socket for this node.
@ -31,8 +31,9 @@ public abstract class Node : IDisposable
/// Gets the registered packets for this node.
/// </summary>
/// <value>The registered packets.</value>
public IReadOnlyDictionary<Type, PacketHandler> RegisteredPacketHandlers =>
new ReadOnlyDictionary<Type, PacketHandler>(_registeredPacketHandlers);
public IReadOnlyDictionary<Type, IReadOnlyCollection<PacketHandler>> RegisteredPacketHandlers =>
new ReadOnlyDictionary<Type, IReadOnlyCollection<PacketHandler>>(
_registeredPacketHandlers.ToDictionary(p => p.Key, p => (IReadOnlyCollection<PacketHandler>) p.Value.AsReadOnly()));
/// <inheritdoc />
public void Dispose()
@ -54,7 +55,14 @@ public abstract class Node : IDisposable
if (packetType is null) throw new ArgumentNullException(nameof(packetType));
if (handler is null) throw new ArgumentNullException(nameof(handler));
RegisterPacket(packetType);
_registeredPacketHandlers.TryAdd(packetType, handler);
if (!_registeredPacketHandlers.TryGetValue(packetType, out List<PacketHandler>? handlers))
{
handlers = new List<PacketHandler>();
_registeredPacketHandlers.TryAdd(packetType, handlers);
}
handlers.Add(handler);
}
/// <summary>
@ -69,7 +77,14 @@ public abstract class Node : IDisposable
{
if (handler is null) throw new ArgumentNullException(nameof(handler));
RegisterPacket<TPacket>();
_registeredPacketHandlers.TryAdd(typeof(TPacket), handler);
if (!_registeredPacketHandlers.TryGetValue(typeof(TPacket), out List<PacketHandler>? handlers))
{
handlers = new List<PacketHandler>();
_registeredPacketHandlers.TryAdd(typeof(TPacket), handlers);
}
handlers.Add(handler);
}
/// <summary>

View File

@ -32,7 +32,8 @@ public sealed partial class ProtocolListener
foreach (Type packetType in ParentListener.RegisteredPackets.Values)
RegisterPacket(packetType);
foreach ((Type packetType, PacketHandler handler) in ParentListener.RegisteredPacketHandlers)
foreach ((Type packetType, IReadOnlyCollection<PacketHandler>? handlers) in ParentListener.RegisteredPacketHandlers)
foreach (PacketHandler handler in handlers)
RegisterPacketHandler(packetType, handler);
Task.Run(ReadLoopAsync);