-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathChat.cs
40 lines (34 loc) · 1.21 KB
/
Chat.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
using System.Collections.Concurrent;
using System.Net;
namespace Hydra.Example
{
public static partial class Handlers
{
public static Task<HttpResponse> Chat(HttpRequest request) => Task.FromResult(WebSocket.Response(request, Example.Chat.Handler));
}
internal static class Chat
{
internal static readonly ConcurrentDictionary<EndPoint, WebSocket> clients = new();
internal static async Task Handler(WebSocket socket)
{
var remote = socket.Remote;
if (remote is null)
{
await socket.Close();
return;
}
clients[remote] = socket;
while (true)
{
var message = await socket.Receive();
if (message is null) break;
if (message is not WebSocketTextMessage chatMessage) continue;
string chatMessageContents = await chatMessage.Body.ReadToEndAsync();
await Task.WhenAll(clients.Values.Select(
(c) => c.Send(new WebSocketTextMessage(chatMessageContents))));
}
clients.TryRemove(remote, out _);
await socket.Close();
}
}
}