Support multiple packet handlers
This commit is contained in:
parent
1124521cb8
commit
a8d787d811
|
@ -96,8 +96,8 @@ public abstract class BaseClientNode : Node
|
||||||
await packet.DeserializeAsync(bufferReader);
|
await packet.DeserializeAsync(bufferReader);
|
||||||
await targetStream.DisposeAsync();
|
await targetStream.DisposeAsync();
|
||||||
|
|
||||||
if (RegisteredPacketHandlers.TryGetValue(packetType, out PacketHandler? packetHandler))
|
if (RegisteredPacketHandlers.TryGetValue(packetType, out IReadOnlyCollection<PacketHandler>? handlers))
|
||||||
await packetHandler.HandleAsync(this, packet);
|
await Task.WhenAll(handlers.Select(h => h.HandleAsync(this, packet)));
|
||||||
|
|
||||||
return packet;
|
return packet;
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@ namespace TcpDotNet;
|
||||||
public abstract class Node : IDisposable
|
public abstract class Node : IDisposable
|
||||||
{
|
{
|
||||||
private readonly ConcurrentDictionary<int, Type> _registeredPackets = new();
|
private readonly ConcurrentDictionary<int, Type> _registeredPackets = new();
|
||||||
private readonly ConcurrentDictionary<Type, PacketHandler> _registeredPacketHandlers = new();
|
private readonly ConcurrentDictionary<Type, List<PacketHandler>> _registeredPacketHandlers = new();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the underlying socket for this node.
|
/// Gets the underlying socket for this node.
|
||||||
|
@ -31,8 +31,9 @@ public abstract class Node : IDisposable
|
||||||
/// Gets the registered packets for this node.
|
/// Gets the registered packets for this node.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value>The registered packets.</value>
|
/// <value>The registered packets.</value>
|
||||||
public IReadOnlyDictionary<Type, PacketHandler> RegisteredPacketHandlers =>
|
public IReadOnlyDictionary<Type, IReadOnlyCollection<PacketHandler>> RegisteredPacketHandlers =>
|
||||||
new ReadOnlyDictionary<Type, PacketHandler>(_registeredPacketHandlers);
|
new ReadOnlyDictionary<Type, IReadOnlyCollection<PacketHandler>>(
|
||||||
|
_registeredPacketHandlers.ToDictionary(p => p.Key, p => (IReadOnlyCollection<PacketHandler>) p.Value.AsReadOnly()));
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
|
@ -54,7 +55,14 @@ public abstract class Node : IDisposable
|
||||||
if (packetType is null) throw new ArgumentNullException(nameof(packetType));
|
if (packetType is null) throw new ArgumentNullException(nameof(packetType));
|
||||||
if (handler is null) throw new ArgumentNullException(nameof(handler));
|
if (handler is null) throw new ArgumentNullException(nameof(handler));
|
||||||
RegisterPacket(packetType);
|
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>
|
/// <summary>
|
||||||
|
@ -69,7 +77,14 @@ public abstract class Node : IDisposable
|
||||||
{
|
{
|
||||||
if (handler is null) throw new ArgumentNullException(nameof(handler));
|
if (handler is null) throw new ArgumentNullException(nameof(handler));
|
||||||
RegisterPacket<TPacket>();
|
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>
|
/// <summary>
|
||||||
|
|
|
@ -32,7 +32,8 @@ public sealed partial class ProtocolListener
|
||||||
foreach (Type packetType in ParentListener.RegisteredPackets.Values)
|
foreach (Type packetType in ParentListener.RegisteredPackets.Values)
|
||||||
RegisterPacket(packetType);
|
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);
|
RegisterPacketHandler(packetType, handler);
|
||||||
|
|
||||||
Task.Run(ReadLoopAsync);
|
Task.Run(ReadLoopAsync);
|
||||||
|
|
Loading…
Reference in New Issue