Services/Models/WebSocketConnection.cs
using System;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;

namespace SandboxModelContextProtocol.Server.Services.Models;

public class WebSocketConnection( WebSocket webSocket, ILogger logger )
{
	private readonly WebSocket _webSocket = webSocket;
	private readonly ILogger _logger = logger;

	public bool IsConnected => _webSocket.State == WebSocketState.Open;

	/// <summary>
	/// Send a message to the WebSocket connection
	/// </summary>
	/// <param name="message">The message to send</param>
	/// <returns>A task</returns>
	public async Task SendAsync( string message )
	{
		if ( !IsConnected )
		{
			_logger.LogWarning( "Attempted to send message to disconnected WebSocket" );
			return;
		}

		try
		{
			var bytes = Encoding.UTF8.GetBytes( message );
			await _webSocket.SendAsync( new ArraySegment<byte>( bytes ), WebSocketMessageType.Text, true, CancellationToken.None );
			_logger.LogDebug( "Message sent to WebSocket: {Message}", message );
		}
		catch ( WebSocketException ex )
		{
			_logger.LogError( ex, "Failed to send WebSocket message: {Message}", message );
			throw;
		}
		catch ( Exception ex )
		{
			_logger.LogError( ex, "Unexpected error sending WebSocket message: {Message}", message );
			throw;
		}
	}
}