Files
Stationeers-RemoteControl/Vendor/EmbedIO-3.5.2/WebSockets/Internal/SystemWebSocket.cs

66 lines
2.5 KiB
C#

using System;
using System.Net.WebSockets;
using System.Threading;
using System.Threading.Tasks;
namespace EmbedIO.WebSockets.Internal
{
internal sealed class SystemWebSocket : IWebSocket
{
public SystemWebSocket(System.Net.WebSockets.WebSocket webSocket)
{
UnderlyingWebSocket = webSocket;
}
~SystemWebSocket()
{
Dispose(false);
}
public System.Net.WebSockets.WebSocket UnderlyingWebSocket { get; }
public WebSocketState State => UnderlyingWebSocket.State;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
/// <inheritdoc />
public Task SendAsync(byte[] buffer, bool isText, CancellationToken cancellationToken = default)
=> UnderlyingWebSocket.SendAsync(
new ArraySegment<byte>(buffer),
isText ? WebSocketMessageType.Text : WebSocketMessageType.Binary,
true,
cancellationToken);
/// <inheritdoc />
public Task CloseAsync(CancellationToken cancellationToken = default) =>
UnderlyingWebSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, cancellationToken);
/// <inheritdoc />
public Task CloseAsync(CloseStatusCode code, string? comment = null, CancellationToken cancellationToken = default)=>
UnderlyingWebSocket.CloseAsync(MapCloseStatus(code), comment ?? string.Empty, cancellationToken);
private void Dispose(bool disposing)
{
if (!disposing)
return;
UnderlyingWebSocket.Dispose();
}
private WebSocketCloseStatus MapCloseStatus(CloseStatusCode code) => code switch {
CloseStatusCode.Normal => WebSocketCloseStatus.NormalClosure,
CloseStatusCode.ProtocolError => WebSocketCloseStatus.ProtocolError,
CloseStatusCode.InvalidData => WebSocketCloseStatus.InvalidPayloadData,
CloseStatusCode.UnsupportedData => WebSocketCloseStatus.InvalidPayloadData,
CloseStatusCode.PolicyViolation => WebSocketCloseStatus.PolicyViolation,
CloseStatusCode.TooBig => WebSocketCloseStatus.MessageTooBig,
CloseStatusCode.MandatoryExtension => WebSocketCloseStatus.MandatoryExtension,
CloseStatusCode.ServerError => WebSocketCloseStatus.InternalServerError,
_ => throw new ArgumentOutOfRangeException(nameof(code), code, null)
};
}
}