initial commit
This commit is contained in:
62
YatzyGame/Components/WebsocketMiddleware.cs
Normal file
62
YatzyGame/Components/WebsocketMiddleware.cs
Normal file
@@ -0,0 +1,62 @@
|
||||
using System.Net.WebSockets;
|
||||
using MyApp.WebSockets;
|
||||
|
||||
namespace MyApp.WebSockets;
|
||||
|
||||
public class WebSocketMiddleware
|
||||
{
|
||||
private readonly RequestDelegate _next;
|
||||
private readonly WebSocketManager _manager;
|
||||
|
||||
public WebSocketMiddleware(RequestDelegate next, WebSocketManager manager)
|
||||
{
|
||||
_next = next;
|
||||
_manager = manager;
|
||||
}
|
||||
|
||||
public async Task InvokeAsync(HttpContext context)
|
||||
{
|
||||
if (context.Request.Path == "/ws")
|
||||
{
|
||||
if (!context.WebSockets.IsWebSocketRequest)
|
||||
{
|
||||
context.Response.StatusCode = StatusCodes.Status400BadRequest;
|
||||
return;
|
||||
}
|
||||
|
||||
// Let the client pass a stable id: ws://host/ws?clientId=abc123
|
||||
var clientId = context.Request.Query["clientId"].ToString();
|
||||
if (string.IsNullOrWhiteSpace(clientId))
|
||||
{
|
||||
clientId = Guid.NewGuid().ToString("N");
|
||||
}
|
||||
|
||||
using var socket = await context.WebSockets.AcceptWebSocketAsync();
|
||||
_manager.AddSocket(clientId, socket);
|
||||
|
||||
await ReceiveLoop(clientId, socket);
|
||||
_manager.RemoveSocket(clientId);
|
||||
return;
|
||||
}
|
||||
|
||||
await _next(context);
|
||||
}
|
||||
|
||||
private static async Task ReceiveLoop(string id, WebSocket socket)
|
||||
{
|
||||
var buffer = new byte[4 * 1024];
|
||||
|
||||
while (socket.State == WebSocketState.Open)
|
||||
{
|
||||
var result = await socket.ReceiveAsync(buffer, CancellationToken.None);
|
||||
|
||||
if (result.MessageType == WebSocketMessageType.Close)
|
||||
{
|
||||
await socket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing", CancellationToken.None);
|
||||
break;
|
||||
}
|
||||
|
||||
// (Optional) handle incoming messages here if you need two-way comms.
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user