From 3962e7a04bf71147622338a5f41e09f680822a0e Mon Sep 17 00:00:00 2001 From: "Namhyeon, Go" Date: Thu, 14 Aug 2025 03:35:12 +0900 Subject: [PATCH] Revert "Update WebSocketManager.cs (Urgent)" --- .../WelsonJS.Launcher/WebSocketManager.cs | 58 +++++++++++-------- 1 file changed, 33 insertions(+), 25 deletions(-) diff --git a/WelsonJS.Toolkit/WelsonJS.Launcher/WebSocketManager.cs b/WelsonJS.Toolkit/WelsonJS.Launcher/WebSocketManager.cs index 694a459..1e7ef34 100644 --- a/WelsonJS.Toolkit/WelsonJS.Launcher/WebSocketManager.cs +++ b/WelsonJS.Toolkit/WelsonJS.Launcher/WebSocketManager.cs @@ -1,9 +1,10 @@ -// WebSocketManager.cs +// WebSocketManager.cs // SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2025 Catswords OSS and WelsonJS Contributors // https://github.com/gnh1201/welsonjs // using System; +using System.Buffers; using System.Collections.Concurrent; using System.IO; using System.Net.WebSockets; @@ -145,38 +146,45 @@ namespace WelsonJS.Launcher await entry.IoLock.WaitAsync(token); try { - // Send message + // Send message (single-frame; can be split if needed) await sock.SendAsync(new ArraySegment(sendBuf), WebSocketMessageType.Text, true, token); - // Receive message until EndOfMessage - byte[] buffer = new byte[8192]; - using (var ms = new MemoryStream()) + // Receive message until EndOfMessage is reached + var buffer = ArrayPool.Shared.Rent(8192); + try { - while (true) + using (var ms = new MemoryStream()) { - var res = await sock.ReceiveAsync(new ArraySegment(buffer), token); - - if (res.MessageType == WebSocketMessageType.Close) + while (true) { - // Server requested closure - try { await sock.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing as requested by server", token); } catch { } - throw new WebSocketException($"WebSocket closed by server: {sock.CloseStatus} {sock.CloseStatusDescription}"); + var res = await sock.ReceiveAsync(new ArraySegment(buffer), token); + + if (res.MessageType == WebSocketMessageType.Close) + { + // Server requested closure + try { await sock.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing as requested by server", token); } catch { } + throw new WebSocketException($"WebSocket closed by server: {sock.CloseStatus} {sock.CloseStatusDescription}"); + } + + if (res.Count > 0) + { + ms.Write(buffer, 0, res.Count); + + if (ms.Length > maxMessageBytes) + throw new InvalidOperationException($"Received message exceeds limit ({maxMessageBytes} bytes)."); + } + + if (res.EndOfMessage) + break; } - if (res.Count > 0) - { - ms.Write(buffer, 0, res.Count); - - if (ms.Length > maxMessageBytes) - throw new InvalidOperationException($"Received message exceeds limit ({maxMessageBytes} bytes)."); - } - - if (res.EndOfMessage) - break; + // Convert UTF-8 encoded text message to string + return Encoding.UTF8.GetString(ms.ToArray()); } - - // Convert UTF-8 encoded text message to string - return Encoding.UTF8.GetString(ms.ToArray()); + } + finally + { + ArrayPool.Shared.Return(buffer); } } finally