From f3ad71e33fcb704327e3c1d702e1308cbb784992 Mon Sep 17 00:00:00 2001 From: Marcel Baumgartner Date: Tue, 16 Apr 2024 22:56:42 +0200 Subject: [PATCH] Switched to improved mooncore advanced websocket stream version --- .../.idea/material_theme_project_new.xml | 13 ++ .../Core/Helpers/AdvancedWebsocketStream.cs | 169 ------------------ .../Features/Servers/Helpers/ServerConsole.cs | 1 - .../Http/Controllers/ServersControllers.cs | 1 - .../Servers/UI/UserViews/Console.razor | 3 - Moonlight/Moonlight.csproj | 2 +- 6 files changed, 14 insertions(+), 175 deletions(-) create mode 100644 .idea/.idea.Moonlight/.idea/material_theme_project_new.xml delete mode 100644 Moonlight/Core/Helpers/AdvancedWebsocketStream.cs diff --git a/.idea/.idea.Moonlight/.idea/material_theme_project_new.xml b/.idea/.idea.Moonlight/.idea/material_theme_project_new.xml new file mode 100644 index 0000000..1a83bdf --- /dev/null +++ b/.idea/.idea.Moonlight/.idea/material_theme_project_new.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/Moonlight/Core/Helpers/AdvancedWebsocketStream.cs b/Moonlight/Core/Helpers/AdvancedWebsocketStream.cs deleted file mode 100644 index 5d43791..0000000 --- a/Moonlight/Core/Helpers/AdvancedWebsocketStream.cs +++ /dev/null @@ -1,169 +0,0 @@ -using System.Net.WebSockets; -using System.Text; -using MoonCore.Helpers; -using Newtonsoft.Json; - -namespace Moonlight.Core.Helpers; - -public class AdvancedWebsocketStream -{ - private readonly WebSocket Socket; - private readonly Dictionary Packets = new(); - - public AdvancedWebsocketStream(WebSocket socket) - { - Socket = socket; - } - - public void RegisterPacket(int id) => RegisterPacket(id, typeof(T)); - - public void RegisterPacket(int id, Type type) - { - Packets.Add(id, type); - } - - public async Task ReceivePacket() - { - if (Socket.State != WebSocketState.Open) - throw new ArgumentException("The websocket connection needs to be open in order to receive packets"); - - // Length - var lengthBuffer = new byte[4]; - await Socket.ReceiveAsync(lengthBuffer, CancellationToken.None); - var length = BitConverter.ToInt32(lengthBuffer); - - Logger.Debug($"Received length: {length}"); - - if (length <= 0) - throw new ArgumentException("The packet length cannot be less or equal than zero"); - - var packetBuffer = new byte[length]; - var received = await Socket.ReceiveAsync(packetBuffer, CancellationToken.None); - - Logger.Debug($"Lenght expected: {length}. Lenght got: {received.Count}"); - - return DecodePacket(packetBuffer); - } - - public async Task ReceivePacket() - { - var packet = await ReceivePacket(); - - if (packet == null) - return default; - - if (packet is not T) - throw new ArgumentException($"Received packet {packet.GetType().Name} matches not the type {typeof(T).Name}"); - - return (T)packet; - } - - public async Task SendPacket(object packet) - { - if (Socket.State != WebSocketState.Open) - throw new ArgumentException("The websocket connection needs to be open in order to send packets"); - - var buffer = EncodePacket(packet); - - // Send length - var length = buffer.Length; - var lengthBuffer = BitConverter.GetBytes(length); - - await Socket.SendAsync(lengthBuffer, WebSocketMessageType.Binary, WebSocketMessageFlags.None, - CancellationToken.None); - - // Send packet - await Socket.SendAsync(buffer, WebSocketMessageType.Binary, WebSocketMessageFlags.None, CancellationToken.None); - } - - public async Task WaitForClose() - { - var source = new TaskCompletionSource(); - - Task.Run(async () => - { - while (Socket.State == WebSocketState.Open) - await Task.Delay(10); - - source.SetResult(); - }); - - await source.Task; - } - - public async Task Close() - { - if(Socket.State == WebSocketState.Open) - await Socket.CloseOutputAsync(WebSocketCloseStatus.Empty, null, CancellationToken.None); - } - - private byte[] EncodePacket(object packet) - { - var type = packet.GetType(); - - var packetId = Packets.Values.Contains(type) ? Packets.First(x => x.Value == type).Key : -1; - - if (packetId == -1) - throw new ArgumentException($"Sending packet type which has not been registered: {packet.GetType().Name}"); - - // Header - var headerBuffer = BitConverter.GetBytes(packetId); - - // Body - var jsonText = JsonConvert.SerializeObject(packet); - var bodyBuffer = Encoding.UTF8.GetBytes(jsonText); - - return headerBuffer.Concat(bodyBuffer).ToArray(); - } - - private object? DecodePacket(byte[] buffer) - { - if (buffer.Length < 5) // 4 (header) + minimum 1 as body - { - Logger.Warn($"Received buffer is too small ({buffer.Length} bytes)"); - return default; - } - - var headerBuffer = new byte[4]; - Array.Copy(buffer, 0, headerBuffer, 0, 4); - var packetId = BitConverter.ToInt32(headerBuffer); - - Logger.Info($"Packet Id: {packetId}"); - - var packetType = Packets.TryGetValue(packetId, out var packet) ? packet : default; - - if (packetType == null) - { - Logger.Warn($"Received packet id which has not been registered: {packetId}"); - - Logger.Info("Packet dumped: " + Encoding.UTF8.GetString(buffer)); - - return default; - } - - var bodyBuffer = new byte[buffer.Length - 4]; - Array.Copy(buffer, 4, bodyBuffer, 0, buffer.Length - 4); - - var jsonText = Encoding.UTF8.GetString(bodyBuffer); - - if (string.IsNullOrEmpty(jsonText)) - { - Logger.Warn("Received empty json text"); - return default; - } - - object? result = default; - - try - { - result = JsonConvert.DeserializeObject(jsonText, packetType); - } - catch (JsonReaderException e) - { - Logger.Warn($"An error occured while deserializating the json text of the packet {packetType.Name}"); - Logger.Warn(e); - } - - return result; - } -} \ No newline at end of file diff --git a/Moonlight/Features/Servers/Helpers/ServerConsole.cs b/Moonlight/Features/Servers/Helpers/ServerConsole.cs index 9c13b34..87d92f8 100644 --- a/Moonlight/Features/Servers/Helpers/ServerConsole.cs +++ b/Moonlight/Features/Servers/Helpers/ServerConsole.cs @@ -3,7 +3,6 @@ using MoonCore.Helpers; using Moonlight.Features.Servers.Api.Packets; using Moonlight.Features.Servers.Entities; using Moonlight.Features.Servers.Models.Enums; -using AdvancedWebsocketStream = Moonlight.Core.Helpers.AdvancedWebsocketStream; namespace Moonlight.Features.Servers.Helpers; diff --git a/Moonlight/Features/Servers/Http/Controllers/ServersControllers.cs b/Moonlight/Features/Servers/Http/Controllers/ServersControllers.cs index ba3c5a9..67ff35e 100644 --- a/Moonlight/Features/Servers/Http/Controllers/ServersControllers.cs +++ b/Moonlight/Features/Servers/Http/Controllers/ServersControllers.cs @@ -8,7 +8,6 @@ using Moonlight.Features.Servers.Events; using Moonlight.Features.Servers.Extensions; using Moonlight.Features.Servers.Http.Requests; using Moonlight.Features.Servers.Models.Abstractions; -using AdvancedWebsocketStream = Moonlight.Core.Helpers.AdvancedWebsocketStream; namespace Moonlight.Features.Servers.Http.Controllers; diff --git a/Moonlight/Features/Servers/UI/UserViews/Console.razor b/Moonlight/Features/Servers/UI/UserViews/Console.razor index 79544e3..f8205ff 100644 --- a/Moonlight/Features/Servers/UI/UserViews/Console.razor +++ b/Moonlight/Features/Servers/UI/UserViews/Console.razor @@ -1,4 +1,3 @@ -@using Moonlight.Features.Servers.Models.Abstractions @using Moonlight.Features.Servers.Services @using Moonlight.Features.Servers.UI.Components @using Moonlight.Features.Servers.Entities @@ -6,7 +5,6 @@ @using Moonlight.Features.Servers.Api.Packets @using Moonlight.Features.Servers.Models.Enums @using MoonCore.Helpers -@using ApexCharts @inject ServerService ServerService @@ -85,7 +83,6 @@ ServerConsole.OnNewMessage += OnMessage; - ServerConsole.OnStatsChange += HandleStats; ServerConsole.OnStateChange += HandleState; } diff --git a/Moonlight/Moonlight.csproj b/Moonlight/Moonlight.csproj index 7ac8423..e37cfbe 100644 --- a/Moonlight/Moonlight.csproj +++ b/Moonlight/Moonlight.csproj @@ -90,7 +90,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - +