From 78457d95e38001f2d2471975a9cd9cc6c5a86d82 Mon Sep 17 00:00:00 2001 From: Jorge Zapata Date: Fri, 15 Apr 2022 10:44:39 -0500 Subject: [PATCH 1/3] Added support subprotocols derived from websocket --- src/Websocket.Client/IWebsocketClient.cs | 5 ++++ src/Websocket.Client/WebsocketClient.cs | 31 ++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/src/Websocket.Client/IWebsocketClient.cs b/src/Websocket.Client/IWebsocketClient.cs index 36f5ec1..1cecc6e 100644 --- a/src/Websocket.Client/IWebsocketClient.cs +++ b/src/Websocket.Client/IWebsocketClient.cs @@ -16,6 +16,11 @@ public interface IWebsocketClient : IDisposable /// Uri Url { get; set; } + /// + /// Validate if an incoming message is from sub-protocol + /// + Predicate< string> IsSubprotocolMessage { get; set; } + /// /// Stream with received message (raw format) /// diff --git a/src/Websocket.Client/WebsocketClient.cs b/src/Websocket.Client/WebsocketClient.cs index f186d5c..a329065 100644 --- a/src/Websocket.Client/WebsocketClient.cs +++ b/src/Websocket.Client/WebsocketClient.cs @@ -41,6 +41,34 @@ public partial class WebsocketClient : IWebsocketClient private readonly Subject _reconnectionSubject = new Subject(); private readonly Subject _disconnectedSubject = new Subject(); + + /// + /// + /// + /// + + public WebsocketClient(Func clientFactory = null) + : this(GetClientFactory(clientFactory)) + { + } + + /// + /// + /// + public WebsocketClient(Func> connectionFactory = null) + { + _connectionFactory = connectionFactory ?? (async (uri, token) => + { + //var client = new ClientWebSocket + //{ + // Options = { KeepAliveInterval = new TimeSpan(0, 0, 5, 0) } + //}; + var client = new ClientWebSocket(); + await client.ConnectAsync(uri, token).ConfigureAwait(false); + return client; + }); + } + /// /// A simple websocket client with built-in reconnection and error handling /// @@ -165,6 +193,9 @@ public bool IsReconnectionEnabled /// public ClientWebSocket NativeClient => GetSpecificOrThrow(_client); + /// + public Predicate IsSubprotocolMessage { get; set; } = null; + /// /// Terminate the websocket connection and cleanup everything /// From db2271e1a3b97beb30cc86ee2e66068fae8a08b0 Mon Sep 17 00:00:00 2001 From: jorge zapata Date: Sun, 22 Jan 2023 22:43:30 -0500 Subject: [PATCH 2/3] Added namespace Websocket.Client.Models --- src/Websocket.Client/Models/DisconnectionInfo.cs | 8 ++++---- src/Websocket.Client/Models/DisconnectionType.cs | 5 +++-- src/Websocket.Client/Models/ReconnectionType.cs | 5 +++-- src/Websocket.Client/WebsocketClient.Reconnecting.cs | 1 + 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/Websocket.Client/Models/DisconnectionInfo.cs b/src/Websocket.Client/Models/DisconnectionInfo.cs index 8b43dbf..08b44fa 100644 --- a/src/Websocket.Client/Models/DisconnectionInfo.cs +++ b/src/Websocket.Client/Models/DisconnectionInfo.cs @@ -2,7 +2,7 @@ using System.Net.WebSockets; // ReSharper disable once CheckNamespace -namespace Websocket.Client +namespace Websocket.Client.Models { /// /// Info about happened disconnection @@ -10,7 +10,7 @@ namespace Websocket.Client public class DisconnectionInfo { /// - public DisconnectionInfo(DisconnectionType type, WebSocketCloseStatus? closeStatus, + public DisconnectionInfo(DisconnectionType type, WebSocketCloseStatus closeStatus, string closeStatusDescription, string subProtocol, Exception exception) { Type = type; @@ -28,7 +28,7 @@ public class DisconnectionInfo /// /// Indicates the reason why the remote endpoint initiated the close handshake /// - public WebSocketCloseStatus? CloseStatus { get; } + public WebSocketCloseStatus CloseStatus { get; } /// /// Allows the remote endpoint to describe the reason why the connection was closed @@ -62,7 +62,7 @@ public class DisconnectionInfo /// public static DisconnectionInfo Create(DisconnectionType type, WebSocket client, Exception exception) { - return new DisconnectionInfo(type, client?.CloseStatus, client?.CloseStatusDescription, + return new DisconnectionInfo(type, (WebSocketCloseStatus) client?.CloseStatus, client?.CloseStatusDescription, client?.SubProtocol, exception); } } diff --git a/src/Websocket.Client/Models/DisconnectionType.cs b/src/Websocket.Client/Models/DisconnectionType.cs index a87ccf0..509bf9b 100644 --- a/src/Websocket.Client/Models/DisconnectionType.cs +++ b/src/Websocket.Client/Models/DisconnectionType.cs @@ -1,5 +1,6 @@ // ReSharper disable once CheckNamespace -namespace Websocket.Client + +namespace Websocket.Client.Models { /// /// Type that specify happened disconnection @@ -19,7 +20,7 @@ public enum DisconnectionType /// /// Type used when connection to websocket was lost by not receiving any message in given time-range /// - NoMessageReceived = 2, + NoMessageReceived = 2, /// /// Type used when connection or reconnection returned error diff --git a/src/Websocket.Client/Models/ReconnectionType.cs b/src/Websocket.Client/Models/ReconnectionType.cs index 356743c..31a46f8 100644 --- a/src/Websocket.Client/Models/ReconnectionType.cs +++ b/src/Websocket.Client/Models/ReconnectionType.cs @@ -1,5 +1,6 @@ // ReSharper disable once CheckNamespace -namespace Websocket.Client + +namespace Websocket.Client.Models { /// /// Type that specify happened reconnection @@ -19,7 +20,7 @@ public enum ReconnectionType /// /// Type used when connection to websocket was lost by not receiving any message in given time-range /// - NoMessageReceived = 2, + NoMessageReceived = 2, /// /// Type used after unsuccessful previous reconnection diff --git a/src/Websocket.Client/WebsocketClient.Reconnecting.cs b/src/Websocket.Client/WebsocketClient.Reconnecting.cs index 5a9d729..5ed60d5 100644 --- a/src/Websocket.Client/WebsocketClient.Reconnecting.cs +++ b/src/Websocket.Client/WebsocketClient.Reconnecting.cs @@ -2,6 +2,7 @@ using System.Threading; using System.Threading.Tasks; using Websocket.Client.Logging; +using Websocket.Client.Models; namespace Websocket.Client { From 57e9e408c5a44647c4787f18831122b9d0f1ef40 Mon Sep 17 00:00:00 2001 From: jorge zapata Date: Wed, 25 Jan 2023 13:14:28 -0500 Subject: [PATCH 3/3] Removed namespace Websocket.Client.Models --- src/Websocket.Client/IWebsocketClient.cs | 1 - src/Websocket.Client/Models/DisconnectionInfo.cs | 2 +- src/Websocket.Client/Models/DisconnectionType.cs | 2 +- src/Websocket.Client/Models/ReconnectionInfo.cs | 2 +- src/Websocket.Client/Models/ReconnectionType.cs | 2 +- src/Websocket.Client/WebsocketClient.Reconnecting.cs | 1 - src/Websocket.Client/WebsocketClient.cs | 1 - 7 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/Websocket.Client/IWebsocketClient.cs b/src/Websocket.Client/IWebsocketClient.cs index 1cecc6e..7a6e75f 100644 --- a/src/Websocket.Client/IWebsocketClient.cs +++ b/src/Websocket.Client/IWebsocketClient.cs @@ -2,7 +2,6 @@ using System.Net.WebSockets; using System.Text; using System.Threading.Tasks; -using Websocket.Client.Models; namespace Websocket.Client { diff --git a/src/Websocket.Client/Models/DisconnectionInfo.cs b/src/Websocket.Client/Models/DisconnectionInfo.cs index 08b44fa..98350fe 100644 --- a/src/Websocket.Client/Models/DisconnectionInfo.cs +++ b/src/Websocket.Client/Models/DisconnectionInfo.cs @@ -2,7 +2,7 @@ using System.Net.WebSockets; // ReSharper disable once CheckNamespace -namespace Websocket.Client.Models +namespace Websocket.Client { /// /// Info about happened disconnection diff --git a/src/Websocket.Client/Models/DisconnectionType.cs b/src/Websocket.Client/Models/DisconnectionType.cs index 509bf9b..f23e460 100644 --- a/src/Websocket.Client/Models/DisconnectionType.cs +++ b/src/Websocket.Client/Models/DisconnectionType.cs @@ -1,6 +1,6 @@ // ReSharper disable once CheckNamespace -namespace Websocket.Client.Models +namespace Websocket.Client { /// /// Type that specify happened disconnection diff --git a/src/Websocket.Client/Models/ReconnectionInfo.cs b/src/Websocket.Client/Models/ReconnectionInfo.cs index 2884412..ddf1e0b 100644 --- a/src/Websocket.Client/Models/ReconnectionInfo.cs +++ b/src/Websocket.Client/Models/ReconnectionInfo.cs @@ -1,7 +1,7 @@ using System; // ReSharper disable once CheckNamespace -namespace Websocket.Client.Models +namespace Websocket.Client { /// /// Info about happened reconnection diff --git a/src/Websocket.Client/Models/ReconnectionType.cs b/src/Websocket.Client/Models/ReconnectionType.cs index 31a46f8..6194998 100644 --- a/src/Websocket.Client/Models/ReconnectionType.cs +++ b/src/Websocket.Client/Models/ReconnectionType.cs @@ -1,6 +1,6 @@ // ReSharper disable once CheckNamespace -namespace Websocket.Client.Models +namespace Websocket.Client { /// /// Type that specify happened reconnection diff --git a/src/Websocket.Client/WebsocketClient.Reconnecting.cs b/src/Websocket.Client/WebsocketClient.Reconnecting.cs index 5ed60d5..5a9d729 100644 --- a/src/Websocket.Client/WebsocketClient.Reconnecting.cs +++ b/src/Websocket.Client/WebsocketClient.Reconnecting.cs @@ -2,7 +2,6 @@ using System.Threading; using System.Threading.Tasks; using Websocket.Client.Logging; -using Websocket.Client.Models; namespace Websocket.Client { diff --git a/src/Websocket.Client/WebsocketClient.cs b/src/Websocket.Client/WebsocketClient.cs index fa32b84..ff3c007 100644 --- a/src/Websocket.Client/WebsocketClient.cs +++ b/src/Websocket.Client/WebsocketClient.cs @@ -10,7 +10,6 @@ using System.Threading.Tasks; using Websocket.Client.Exceptions; using Websocket.Client.Logging; -using Websocket.Client.Models; using Websocket.Client.Threading; namespace Websocket.Client