From 550afd41c34bcaf785992746dbbfddf5aebd62e7 Mon Sep 17 00:00:00 2001 From: Jkorf Date: Fri, 2 Oct 2026 15:42:35 +0200 Subject: [PATCH] Added DelayAfterConnect to SocketApiOptions, fixed DelayAfterConnect not being respected on reconnection --- CryptoExchange.Net/Clients/SocketApiClient.cs | 5 +---- .../Objects/Options/SocketApiOptions.cs | 6 ++++++ .../Sockets/Default/SocketConnection.cs | 15 ++++++++++++++- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/CryptoExchange.Net/Clients/SocketApiClient.cs b/CryptoExchange.Net/Clients/SocketApiClient.cs index 70f862b8..dfed6d87 100644 --- a/CryptoExchange.Net/Clients/SocketApiClient.cs +++ b/CryptoExchange.Net/Clients/SocketApiClient.cs @@ -533,9 +533,6 @@ namespace CryptoExchange.Net.Clients if (!connectResult.Success) return connectResult; - if (ClientOptions.DelayAfterConnect != TimeSpan.Zero) - await Task.Delay(ClientOptions.DelayAfterConnect).ConfigureAwait(false); - if (!authenticated || socket.Authenticated) return CallResult.Ok(); @@ -862,7 +859,7 @@ namespace CryptoExchange.Net.Clients RateLimitAdmissionCallbackRequest = () => AdmissionOverride.Value, Proxy = ClientOptions.Proxy, Timeout = ApiOptions.SocketNoDataTimeout ?? ClientOptions.SocketNoDataTimeout, - ReceiveBufferSize = ClientOptions.ReceiveBufferSize, + ReceiveBufferSize = ClientOptions.ReceiveBufferSize }; /// diff --git a/CryptoExchange.Net/Objects/Options/SocketApiOptions.cs b/CryptoExchange.Net/Objects/Options/SocketApiOptions.cs index 88af5edf..64188e31 100644 --- a/CryptoExchange.Net/Objects/Options/SocketApiOptions.cs +++ b/CryptoExchange.Net/Objects/Options/SocketApiOptions.cs @@ -19,6 +19,11 @@ namespace CryptoExchange.Net.Objects.Options /// public int? MaxSocketConnections { get; set; } + /// + /// The time to wait after connecting a socket before sending messages. Can be used for API's which will rate limit if you subscribe directly after connecting. + /// + public TimeSpan? DelayAfterConnect { get; set; } + /// /// Set the values of this options on the target options /// @@ -28,6 +33,7 @@ namespace CryptoExchange.Net.Objects.Options item.SocketNoDataTimeout = SocketNoDataTimeout; item.AutoTimestamp = AutoTimestamp; item.MaxSocketConnections = MaxSocketConnections; + item.DelayAfterConnect = DelayAfterConnect; return item; } } diff --git a/CryptoExchange.Net/Sockets/Default/SocketConnection.cs b/CryptoExchange.Net/Sockets/Default/SocketConnection.cs index 5a593fe9..99b73736 100644 --- a/CryptoExchange.Net/Sockets/Default/SocketConnection.cs +++ b/CryptoExchange.Net/Sockets/Default/SocketConnection.cs @@ -424,6 +424,9 @@ namespace CryptoExchange.Net.Sockets.Default { try { + if ((ApiClient.ApiOptions.DelayAfterConnect ?? ApiClient.ClientOptions.DelayAfterConnect) != TimeSpan.Zero) + await Task.Delay(ApiClient.ApiOptions.DelayAfterConnect ?? ApiClient.ClientOptions.DelayAfterConnect).ConfigureAwait(false); + var reconnectSuccessful = await ProcessReconnectAsync().ConfigureAwait(false); if (!reconnectSuccessful.Success) { @@ -616,7 +619,17 @@ namespace CryptoExchange.Net.Sockets.Default /// Connect the websocket /// /// - public async Task ConnectAsync(CancellationToken ct) => await _socket.ConnectAsync(ct).ConfigureAwait(false); + public async Task ConnectAsync(CancellationToken ct) + { + var result = await _socket.ConnectAsync(ct).ConfigureAwait(false); + if (!result.Success) + return result; + + if ((ApiClient.ApiOptions.DelayAfterConnect ?? ApiClient.ClientOptions.DelayAfterConnect) != TimeSpan.Zero) + await Task.Delay(ApiClient.ApiOptions.DelayAfterConnect ?? ApiClient.ClientOptions.DelayAfterConnect).ConfigureAwait(false); + + return result; + } /// /// Retrieve the underlying socket