From d343ac5fb8258853b015487ae4c0a32630692046 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Sun, 27 Apr 2025 23:56:57 +0800 Subject: [PATCH] :bricks: Setup for the websocket --- .../Connection/WebSocketController.cs | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 DysonNetwork.Sphere/Connection/WebSocketController.cs diff --git a/DysonNetwork.Sphere/Connection/WebSocketController.cs b/DysonNetwork.Sphere/Connection/WebSocketController.cs new file mode 100644 index 0000000..d44eb99 --- /dev/null +++ b/DysonNetwork.Sphere/Connection/WebSocketController.cs @@ -0,0 +1,50 @@ +using System.Net.WebSockets; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace DysonNetwork.Sphere.Connection; + +[ApiController] +[Route("/ws")] +public class WebSocketController : ControllerBase +{ + [Route("/ws")] + [Authorize] + public async Task TheGateway() + { + if (HttpContext.WebSockets.IsWebSocketRequest) + { + using var webSocket = await HttpContext.WebSockets.AcceptWebSocketAsync(); + await _ConnectionEventLoop(webSocket); + } + else + { + HttpContext.Response.StatusCode = StatusCodes.Status400BadRequest; + } + } + + private static async Task _ConnectionEventLoop(WebSocket webSocket) + { + // For now, it's echo + var buffer = new byte[1024 * 4]; + var receiveResult = await webSocket.ReceiveAsync( + new ArraySegment(buffer), CancellationToken.None); + + while (!receiveResult.CloseStatus.HasValue) + { + await webSocket.SendAsync( + new ArraySegment(buffer, 0, receiveResult.Count), + receiveResult.MessageType, + receiveResult.EndOfMessage, + CancellationToken.None); + + receiveResult = await webSocket.ReceiveAsync( + new ArraySegment(buffer), CancellationToken.None); + } + + await webSocket.CloseAsync( + receiveResult.CloseStatus.Value, + receiveResult.CloseStatusDescription, + CancellationToken.None); + } +} \ No newline at end of file