ExtraChat/client/ExtraChat/Ext.cs

36 lines
1.2 KiB
C#
Raw Normal View History

2022-07-08 02:58:32 +00:00
using System.Net.WebSockets;
using ExtraChat.Protocol;
using MessagePack;
namespace ExtraChat;
public static class Ext {
public static string ToHexString(this IEnumerable<byte> bytes) {
return string.Join("", bytes.Select(b => b.ToString("x2")));
}
public static async Task SendMessage(this ClientWebSocket client, RequestContainer request) {
var bytes = MessagePackSerializer.Serialize(request);
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
await client.SendAsync(bytes, WebSocketMessageType.Binary, true, cts.Token);
}
public static async Task<ResponseContainer> ReceiveMessage(this ClientWebSocket client) {
2022-07-30 04:37:06 +00:00
var bytes = new List<byte>(2048);
var buffer = new ArraySegment<byte>(new byte[2048]);
2022-07-08 02:58:32 +00:00
WebSocketReceiveResult result;
do {
2022-07-30 04:37:06 +00:00
result = await client.ReceiveAsync(buffer, CancellationToken.None);
bytes.AddRange(buffer[..result.Count]);
2022-07-08 02:58:32 +00:00
2022-07-30 04:37:06 +00:00
// 1 MiB
if (bytes.Count > 1_048_576) {
2022-07-08 02:58:32 +00:00
throw new Exception();
}
} while (!result.EndOfMessage);
2022-07-30 04:37:06 +00:00
return MessagePackSerializer.Deserialize<ResponseContainer>(bytes.ToArray());
2022-07-08 02:58:32 +00:00
}
}