Skip to content

Commit 2077f6b

Browse files
committed
chore: 增加 AddDataPackageAdapter 方法
1 parent 9f25885 commit 2077f6b

1 file changed

Lines changed: 50 additions & 0 deletions

File tree

src/extensions/BootstrapBlazor.TcpSocket/Extensions/ITcpSocketClientExtensions.cs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,56 @@ public static ValueTask<bool> ConnectAsync(this ITcpSocketClient client, string
5151
return client.ConnectAsync(endPoint, token);
5252
}
5353

54+
private readonly static Dictionary<(ITcpSocketClient Client, IDataPackageAdapter Adapter), List<Func<ReadOnlyMemory<byte>, ValueTask>>> _callbackCache = [];
55+
56+
/// <summary>
57+
/// 增加 <see cref="ITcpSocketClient"/> 数据适配器及其对应的回调方法
58+
/// </summary>
59+
/// <param name="client"></param>
60+
/// <param name="adapter"></param>
61+
/// <param name="callback"></param>
62+
public static void AddDataPackageAdapter(this ITcpSocketClient client, IDataPackageAdapter adapter, Func<ReadOnlyMemory<byte>, ValueTask> callback)
63+
{
64+
if (_callbackCache.TryGetValue((client, adapter), out var list))
65+
{
66+
list.Add(cb);
67+
}
68+
else
69+
{
70+
_callbackCache.Add((client, adapter), [cb]);
71+
}
72+
73+
client.ReceivedCallBack += cb;
74+
75+
// 设置 DataPackageAdapter 的回调函数
76+
adapter.ReceivedCallBack = buffer => callback(buffer);
77+
78+
async ValueTask cb(ReadOnlyMemory<byte> buffer)
79+
{
80+
// 将接收到的数据传递给 DataPackageAdapter 进行数据处理合规数据触发 ReceivedCallBack 回调
81+
await adapter.HandlerAsync(buffer);
82+
}
83+
}
84+
85+
/// <summary>
86+
/// 移除 <see cref="ITcpSocketClient"/> 数据适配器及其对应的回调方法
87+
/// </summary>
88+
/// <param name="client"></param>
89+
/// <param name="adapter"></param>
90+
/// <param name="callback"></param>
91+
public static void RemoveDataPackageAdapter(this ITcpSocketClient client, IDataPackageAdapter adapter, Func<ReadOnlyMemory<byte>, ValueTask> callback)
92+
{
93+
if (_callbackCache.TryGetValue((client, adapter), out var list))
94+
{
95+
var cbs = list.Where(i => i == callback).ToList();
96+
foreach (var cb in cbs)
97+
{
98+
client.ReceivedCallBack -= cb;
99+
list.Remove(cb);
100+
}
101+
}
102+
}
103+
54104
/// <summary>
55105
/// Configures the specified <see cref="ITcpSocketClient"/> to use the provided <see cref="IDataPackageAdapter"/>
56106
/// for processing received data and sets a callback to handle processed data.

0 commit comments

Comments
 (0)