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); } }