From c4430d63fabb20ab5a2a773258ec2ebb5a07979f Mon Sep 17 00:00:00 2001
From: Jan Korf <jankorf91@gmail.com>
Date: Mon, 23 May 2022 22:05:04 +0200
Subject: [PATCH] Added KeepAliveInterval setting for socket connections

---
 CryptoExchange.Net/Clients/BaseSocketClient.cs              | 5 +++++
 CryptoExchange.Net/Interfaces/IWebsocket.cs                 | 4 ++++
 CryptoExchange.Net/Sockets/CryptoExchangeWebSocketClient.cs | 5 ++++-
 3 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/CryptoExchange.Net/Clients/BaseSocketClient.cs b/CryptoExchange.Net/Clients/BaseSocketClient.cs
index eeda53a..7979935 100644
--- a/CryptoExchange.Net/Clients/BaseSocketClient.cs
+++ b/CryptoExchange.Net/Clients/BaseSocketClient.cs
@@ -40,6 +40,10 @@ namespace CryptoExchange.Net
         /// </summary>
         protected int MaxSocketConnections { get; set; } = 9999;        
         /// <summary>
+        /// Keep alive interval for websocket connection
+        /// </summary>
+        protected TimeSpan KeepAliveInterval { get; set; } = TimeSpan.FromSeconds(10);
+        /// <summary>
         /// Delegate used for processing byte data received from socket connections before it is processed by handlers
         /// </summary>
         protected Func<byte[], string>? dataInterpreterBytes;
@@ -574,6 +578,7 @@ namespace CryptoExchange.Net
             if (ClientOptions.Proxy != null)
                 socket.SetProxy(ClientOptions.Proxy);
 
+            socket.KeepAliveInterval = KeepAliveInterval;
             socket.Timeout = ClientOptions.SocketNoDataTimeout;
             socket.DataInterpreterBytes = dataInterpreterBytes;
             socket.DataInterpreterString = dataInterpreterString;
diff --git a/CryptoExchange.Net/Interfaces/IWebsocket.cs b/CryptoExchange.Net/Interfaces/IWebsocket.cs
index 153d476..9d40d86 100644
--- a/CryptoExchange.Net/Interfaces/IWebsocket.cs
+++ b/CryptoExchange.Net/Interfaces/IWebsocket.cs
@@ -77,6 +77,10 @@ namespace CryptoExchange.Net.Interfaces
         /// </summary>
         TimeSpan Timeout { get; set; }
         /// <summary>
+        /// The interval at which to send a ping frame to the server
+        /// </summary>
+        TimeSpan KeepAliveInterval { get; set; }
+        /// <summary>
         /// Set a proxy to use when connecting
         /// </summary>
         /// <param name="proxy"></param>
diff --git a/CryptoExchange.Net/Sockets/CryptoExchangeWebSocketClient.cs b/CryptoExchange.Net/Sockets/CryptoExchangeWebSocketClient.cs
index 6d5fc97..ad9b85e 100644
--- a/CryptoExchange.Net/Sockets/CryptoExchangeWebSocketClient.cs
+++ b/CryptoExchange.Net/Sockets/CryptoExchangeWebSocketClient.cs
@@ -122,6 +122,9 @@ namespace CryptoExchange.Net.Sockets
         /// <inheritdoc />
         public TimeSpan Timeout { get; set; }
 
+        /// <inheritdoc />
+        public TimeSpan KeepAliveInterval { get; set; }
+
         /// <inheritdoc />
         public double IncomingKbps
         {
@@ -332,7 +335,7 @@ namespace CryptoExchange.Net.Sockets
             socket.Options.Cookies = cookieContainer;
             foreach (var header in headers)
                 socket.Options.SetRequestHeader(header.Key, header.Value);
-            socket.Options.KeepAliveInterval = TimeSpan.FromSeconds(10);
+            socket.Options.KeepAliveInterval = KeepAliveInterval;
             socket.Options.SetBuffer(65536, 65536); // Setting it to anything bigger than 65536 throws an exception in .net framework
             return socket;
         }