diff --git a/CryptoExchange.Net/Objects/Results/CallResult.cs b/CryptoExchange.Net/Objects/Results/CallResult.cs index b281a7cb..812db18f 100644 --- a/CryptoExchange.Net/Objects/Results/CallResult.cs +++ b/CryptoExchange.Net/Objects/Results/CallResult.cs @@ -97,7 +97,7 @@ public record CallResult : CallResult, ICallResult /// Call result for an exchange /// /// Data type -public record ExchangeCallResult : CallResult +public record ExchangeCallResult : CallResult, IExchangeCallResult { /// /// Exchange name diff --git a/CryptoExchange.Net/Objects/Results/IHttpResult.cs b/CryptoExchange.Net/Objects/Results/IHttpResult.cs index d1e98bb2..cdb83451 100644 --- a/CryptoExchange.Net/Objects/Results/IHttpResult.cs +++ b/CryptoExchange.Net/Objects/Results/IHttpResult.cs @@ -10,12 +10,8 @@ namespace CryptoExchange.Net.Objects /// /// HTTP call result /// - public interface IHttpResult : ICallResult + public interface IHttpResult : ICallResult, IExchangeCallResult { - /// - /// Exchange name - /// - string Exchange { get; init; } /// /// The original data returned by the call, only available when `OutputOriginalData` is set to `true` in the client options /// diff --git a/CryptoExchange.Net/Objects/Results/IWebSocketResult.cs b/CryptoExchange.Net/Objects/Results/IWebSocketResult.cs index cfc8e456..b72cce34 100644 --- a/CryptoExchange.Net/Objects/Results/IWebSocketResult.cs +++ b/CryptoExchange.Net/Objects/Results/IWebSocketResult.cs @@ -10,13 +10,8 @@ namespace CryptoExchange.Net.Objects /// /// WebSocket call result /// - public interface IWebSocketResult : ICallResult + public interface IWebSocketResult : ICallResult, IExchangeCallResult { - /// - /// Exchange name - /// - string Exchange { get; init; } - /// /// The request id /// diff --git a/CryptoExchange.Net/RateLimiting/Guards/RateLimitGuard.cs b/CryptoExchange.Net/RateLimiting/Guards/RateLimitGuard.cs index 4cf050c1..b515f008 100644 --- a/CryptoExchange.Net/RateLimiting/Guards/RateLimitGuard.cs +++ b/CryptoExchange.Net/RateLimiting/Guards/RateLimitGuard.cs @@ -77,8 +77,8 @@ namespace CryptoExchange.Net.RateLimiting.Guards /// The decay per timespan if windowType is DecayWindowTracker /// The weight of a new connection /// Whether this guard is shared between multiple gates - public RateLimitGuard(Func keySelector, IGuardFilter filter, int limit, TimeSpan timeSpan, RateLimitWindowType windowType, TimeSpan? safetyMargin = null, double? decayPerTimeSpan = null, int? connectionWeight = null, bool shared = false) - : this(keySelector, new[] { filter }, limit, timeSpan, windowType, safetyMargin, decayPerTimeSpan, connectionWeight, shared) + public RateLimitGuard(Func keySelector, IGuardFilter filter, int limit, TimeSpan timeSpan, RateLimitWindowType windowType, double? decayPerTimeSpan = null, int? connectionWeight = null, bool shared = false, TimeSpan? safetyMargin = null) + : this(keySelector, new[] { filter }, limit, timeSpan, windowType, decayPerTimeSpan, connectionWeight, shared, safetyMargin) { } @@ -94,7 +94,7 @@ namespace CryptoExchange.Net.RateLimiting.Guards /// The decay per timespan if windowType is DecayWindowTracker /// The weight of a new connection /// Whether this guard is shared between multiple gates - public RateLimitGuard(Func keySelector, IEnumerable filters, int limit, TimeSpan timeSpan, RateLimitWindowType windowType, TimeSpan? safetyMargin = null, double? decayPerTimeSpan = null, int? connectionWeight = null, bool shared = false) + public RateLimitGuard(Func keySelector, IEnumerable filters, int limit, TimeSpan timeSpan, RateLimitWindowType windowType, double? decayPerTimeSpan = null, int? connectionWeight = null, bool shared = false, TimeSpan? safetyMargin = null) { _filters = filters; _trackers = new Dictionary(); diff --git a/CryptoExchange.Net/RateLimiting/Guards/SingleLimitGuard.cs b/CryptoExchange.Net/RateLimiting/Guards/SingleLimitGuard.cs index e455c5f1..44ab4d96 100644 --- a/CryptoExchange.Net/RateLimiting/Guards/SingleLimitGuard.cs +++ b/CryptoExchange.Net/RateLimiting/Guards/SingleLimitGuard.cs @@ -48,8 +48,8 @@ namespace CryptoExchange.Net.RateLimiting.Guards TimeSpan period, RateLimitWindowType windowType, TimeSpan? safetyMargin = null, - double? decayRate = null, - Func? keySelector = null) + Func? keySelector = null, + double? decayRate = null) { _limit = limit; _period = period; diff --git a/CryptoExchange.Net/SharedApis/SharedUtils.cs b/CryptoExchange.Net/SharedApis/SharedUtils.cs index f3a86806..a4f9d757 100644 --- a/CryptoExchange.Net/SharedApis/SharedUtils.cs +++ b/CryptoExchange.Net/SharedApis/SharedUtils.cs @@ -78,6 +78,474 @@ namespace CryptoExchange.Net.SharedApis return services; } + /// + /// Execute GetAssetAsync for all capabilities in parallel and return results as they arrive + /// + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetAssetRequest request, + CancellationToken ct = default) + { + return capabilities + .Select(x => x.Capability.GetAssetAsync(request, ct)) + .ParallelEnumerateAsync(); + } + + /// + /// Execute GetAssetAsync for all capabilities in parallel and return results as they arrive + /// + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetAssetRequest request, + CancellationToken ct = default) + { + return capabilities + .Select(x => x.Capability.GetAssetAsync(request, ct)) + .ParallelEnumerateAsync(); + } + + /// + /// Execute GetAllAssetsAsync for all capabilities in parallel and return results as they arrive + /// + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetAssetsRequest request, + CancellationToken ct = default) + { + return capabilities + .Select(x => x.Capability.GetAllAssetsAsync(request, ct)) + .ParallelEnumerateAsync(); + } + + /// + /// Execute GetAllAssetsAsync for all capabilities in parallel and return results as they arrive + /// + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetAssetsRequest request, + CancellationToken ct = default) + { + return capabilities + .Select(x => x.Capability.GetAllAssetsAsync(request, ct)) + .ParallelEnumerateAsync(); + } + + /// + /// Execute GetBalancesAsync for all capabilities in parallel and return results as they arrive + /// + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetBalancesRequest request, + CancellationToken ct = default) + { + return capabilities + .Select(x => x.Capability.GetBalancesAsync(request, ct)) + .ParallelEnumerateAsync(); + } + + /// + /// Execute GetBalancesAsync for all capabilities in parallel and return results as they arrive + /// + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetBalancesRequest request, + CancellationToken ct = default) + { + return capabilities + .Select(x => x.Capability.GetBalancesAsync(request, ct)) + .ParallelEnumerateAsync(); + } + + /// + /// Execute GetFeesAsync for all capabilities in parallel and return results as they arrive + /// + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetFeeRequest request, + CancellationToken ct = default) + { + return capabilities + .Select(x => x.Capability.GetFeesAsync(request, ct)) + .ParallelEnumerateAsync(); + } + + /// + /// Execute GetFeesAsync for all capabilities in parallel and return results as they arrive + /// + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetFeeRequest request, + CancellationToken ct = default) + { + return capabilities + .Select(x => x.Capability.GetFeesAsync(request, ct)) + .ParallelEnumerateAsync(); + } + + /// + /// Execute GetFundingInfoAsync for all capabilities in parallel and return results as they arrive + /// + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetFundingInfoRequest request, + CancellationToken ct = default) + { + return capabilities + .Select(x => x.Capability.GetFundingInfoAsync(request, ct)) + .ParallelEnumerateAsync(); + } + + /// + /// Execute GetFundingInfoAsync for all capabilities in parallel and return results as they arrive + /// + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetFundingInfoRequest request, + CancellationToken ct = default) + { + return capabilities + .Select(x => x.Capability.GetFundingInfoAsync(request, ct)) + .ParallelEnumerateAsync(); + } + + /// + /// Execute GetIndexPriceAsync for all capabilities in parallel and return results as they arrive + /// + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetIndexPriceRequest request, + CancellationToken ct = default) + { + return capabilities + .Select(x => x.Capability.GetIndexPriceAsync(request, ct)) + .ParallelEnumerateAsync(); + } + + /// + /// Execute GetIndexPriceAsync for all capabilities in parallel and return results as they arrive + /// + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetIndexPriceRequest request, + CancellationToken ct = default) + { + return capabilities + .Select(x => x.Capability.GetIndexPriceAsync(request, ct)) + .ParallelEnumerateAsync(); + } + + /// + /// Execute GetMarkPriceAsync for all capabilities in parallel and return results as they arrive + /// + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetMarkPriceRequest request, + CancellationToken ct = default) + { + return capabilities + .Select(x => x.Capability.GetMarkPriceAsync(request, ct)) + .ParallelEnumerateAsync(); + } + + /// + /// Execute GetMarkPriceAsync for all capabilities in parallel and return results as they arrive + /// + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetMarkPriceRequest request, + CancellationToken ct = default) + { + return capabilities + .Select(x => x.Capability.GetMarkPriceAsync(request, ct)) + .ParallelEnumerateAsync(); + } + + /// + /// Execute GetAllMarkPricesAsync for all capabilities in parallel and return results as they arrive + /// + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetAllMarkPricesRequest request, + CancellationToken ct = default) + { + return capabilities + .Select(x => x.Capability.GetAllMarkPricesAsync(request, ct)) + .ParallelEnumerateAsync(); + } + + /// + /// Execute GetAllMarkPricesAsync for all capabilities in parallel and return results as they arrive + /// + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetAllMarkPricesRequest request, + CancellationToken ct = default) + { + return capabilities + .Select(x => x.Capability.GetAllMarkPricesAsync(request, ct)) + .ParallelEnumerateAsync(); + } + + /// + /// Execute GetAllIndexPricesAsync for all capabilities in parallel and return results as they arrive + /// + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetAllIndexPricesRequest request, + CancellationToken ct = default) + { + return capabilities + .Select(x => x.Capability.GetAllIndexPricesAsync(request, ct)) + .ParallelEnumerateAsync(); + } + + /// + /// Execute GetAllIndexPricesAsync for all capabilities in parallel and return results as they arrive + /// + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetAllIndexPricesRequest request, + CancellationToken ct = default) + { + return capabilities + .Select(x => x.Capability.GetAllIndexPricesAsync(request, ct)) + .ParallelEnumerateAsync(); + } + + /// + /// Execute GetLeverageAsync for all capabilities in parallel and return results as they arrive + /// + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetLeverageRequest request, + CancellationToken ct = default) + { + return capabilities + .Select(x => x.Capability.GetLeverageAsync(request, ct)) + .ParallelEnumerateAsync(); + } + + /// + /// Execute GetLeverageAsync for all capabilities in parallel and return results as they arrive + /// + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetLeverageRequest request, + CancellationToken ct = default) + { + return capabilities + .Select(x => x.Capability.GetLeverageAsync(request, ct)) + .ParallelEnumerateAsync(); + } + + /// + /// Execute GetLeverageTiersAsync for all capabilities in parallel and return results as they arrive + /// + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetLeverageTiersRequest request, + CancellationToken ct = default) + { + return capabilities + .Select(x => x.Capability.GetLeverageTiersAsync(request, ct)) + .ParallelEnumerateAsync(); + } + + /// + /// Execute GetLeverageTiersAsync for all capabilities in parallel and return results as they arrive + /// + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetLeverageTiersRequest request, + CancellationToken ct = default) + { + return capabilities + .Select(x => x.Capability.GetLeverageTiersAsync(request, ct)) + .ParallelEnumerateAsync(); + } + + /// + /// Execute GetOpenInterestAsync for all capabilities in parallel and return results as they arrive + /// + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetOpenInterestRequest request, + CancellationToken ct = default) + { + return capabilities + .Select(x => x.Capability.GetOpenInterestAsync(request, ct)) + .ParallelEnumerateAsync(); + } + + /// + /// Execute GetOpenInterestAsync for all capabilities in parallel and return results as they arrive + /// + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetOpenInterestRequest request, + CancellationToken ct = default) + { + return capabilities + .Select(x => x.Capability.GetOpenInterestAsync(request, ct)) + .ParallelEnumerateAsync(); + } + + /// + /// Execute GetBookTickerAsync for all capabilities in parallel and return results as they arrive + /// + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetBookTickerRequest request, + CancellationToken ct = default) + { + return capabilities + .Select(x => x.Capability.GetBookTickerAsync(request, ct)) + .ParallelEnumerateAsync(); + } + + /// + /// Execute GetBookTickerAsync for all capabilities in parallel and return results as they arrive + /// + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetBookTickerRequest request, + CancellationToken ct = default) + { + return capabilities + .Select(x => x.Capability.GetBookTickerAsync(request, ct)) + .ParallelEnumerateAsync(); + } + + /// + /// Execute GetOrderBookAsync for all capabilities in parallel and return results as they arrive + /// + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetOrderBookRequest request, + CancellationToken ct = default) + { + return capabilities + .Select(x => x.Capability.GetOrderBookAsync(request, ct)) + .ParallelEnumerateAsync(); + } + + /// + /// Execute GetOrderBookAsync for all capabilities in parallel and return results as they arrive + /// + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetOrderBookRequest request, + CancellationToken ct = default) + { + return capabilities + .Select(x => x.Capability.GetOrderBookAsync(request, ct)) + .ParallelEnumerateAsync(); + } + + /// + /// Execute GetPositionModeAsync for all capabilities in parallel and return results as they arrive + /// + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetPositionModeRequest request, + CancellationToken ct = default) + { + return capabilities + .Select(x => x.Capability.GetPositionModeAsync(request, ct)) + .ParallelEnumerateAsync(); + } + + /// + /// Execute GetPositionModeAsync for all capabilities in parallel and return results as they arrive + /// + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetPositionModeRequest request, + CancellationToken ct = default) + { + return capabilities + .Select(x => x.Capability.GetPositionModeAsync(request, ct)) + .ParallelEnumerateAsync(); + } + + /// + /// Execute GetPositionsAsync for all capabilities in parallel and return results as they arrive + /// + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetPositionsRequest request, + CancellationToken ct = default) + { + return capabilities + .Select(x => x.Capability.GetPositionsAsync(request, ct)) + .ParallelEnumerateAsync(); + } + + /// + /// Execute GetPositionsAsync for all capabilities in parallel and return results as they arrive + /// + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetPositionsRequest request, + CancellationToken ct = default) + { + return capabilities + .Select(x => x.Capability.GetPositionsAsync(request, ct)) + .ParallelEnumerateAsync(); + } + + /// + /// Execute GetSpotSymbolsAsync for all capabilities in parallel and return results as they arrive + /// + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetSymbolsRequest request, + CancellationToken ct = default) + { + return capabilities + .Select(x => x.Capability.GetSpotSymbolsAsync(request, ct)) + .ParallelEnumerateAsync(); + } + + /// + /// Execute GetSpotSymbolsAsync for all capabilities in parallel and return results as they arrive + /// + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetSymbolsRequest request, + CancellationToken ct = default) + { + return capabilities + .Select(x => x.Capability.GetSpotSymbolsAsync(request, ct)) + .ParallelEnumerateAsync(); + } + + /// + /// Execute GetFuturesSymbolsAsync for all capabilities in parallel and return results as they arrive + /// + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetSymbolsRequest request, + CancellationToken ct = default) + { + return capabilities + .Select(x => x.Capability.GetFuturesSymbolsAsync(request, ct)) + .ParallelEnumerateAsync(); + } + + /// + /// Execute GetFuturesSymbolsAsync for all capabilities in parallel and return results as they arrive + /// + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetSymbolsRequest request, + CancellationToken ct = default) + { + return capabilities + .Select(x => x.Capability.GetFuturesSymbolsAsync(request, ct)) + .ParallelEnumerateAsync(); + } + /// /// Execute GetTickerAsync for all capabilities in parallel and return results as they arrive /// @@ -91,6 +559,19 @@ namespace CryptoExchange.Net.SharedApis .ParallelEnumerateAsync(); } + /// + /// Execute GetTickerAsync for all capabilities in parallel and return results as they arrive + /// + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetTickerRequest request, + CancellationToken ct = default) + { + return capabilities + .Select(x => x.Capability.GetTickerAsync(request, ct)) + .ParallelEnumerateAsync(); + } + /// /// Execute GetAllTickersAsync for all capabilities in parallel and return results as they arrive /// @@ -105,55 +586,43 @@ namespace CryptoExchange.Net.SharedApis } /// - /// Execute GetAssetAsync for all capabilities in parallel and return results as they arrive + /// Execute GetAllTickersAsync for all capabilities in parallel and return results as they arrive /// - public static IAsyncEnumerable> ExecuteAllAsync( - this IEnumerable> capabilities, - GetAssetRequest request, + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetTickersRequest request, CancellationToken ct = default) { return capabilities - .Select(x => x.Capability.GetAssetAsync(request, ct)) + .Select(x => x.Capability.GetAllTickersAsync(request, ct)) .ParallelEnumerateAsync(); } /// - /// Execute GetAllAssetsAsync for all capabilities in parallel and return results as they arrive + /// Execute GetRecentTradesAsync for all capabilities in parallel and return results as they arrive /// - public static IAsyncEnumerable> ExecuteAllAsync( - this IEnumerable> capabilities, - GetAssetsRequest request, + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetRecentTradesRequest request, CancellationToken ct = default) { return capabilities - .Select(x => x.Capability.GetAllAssetsAsync(request, ct)) + .Select(x => x.Capability.GetRecentTradesAsync(request, ct)) .ParallelEnumerateAsync(); } /// - /// Execute GetAllBalancesAsync for all capabilities in parallel and return results as they arrive + /// Execute GetRecentTradesAsync for all capabilities in parallel and return results as they arrive /// - public static IAsyncEnumerable> ExecuteAllAsync( - this IEnumerable> capabilities, - GetBalancesRequest request, + public static IAsyncEnumerable> ExecuteAllAsync( + this IEnumerable> capabilities, + GetRecentTradesRequest request, CancellationToken ct = default) { return capabilities - .Select(x => x.Capability.GetBalancesAsync(request, ct)) + .Select(x => x.Capability.GetRecentTradesAsync(request, ct)) .ParallelEnumerateAsync(); } - /// - /// Execute GetAllBalancesAsync for all capabilities in parallel and return results as they arrive - /// - public static IAsyncEnumerable> ExecuteAllAsync( - this IEnumerable> capabilities, - GetBalancesRequest request, - CancellationToken ct = default) - { - return capabilities - .Select(x => x.Capability.GetBalancesAsync(request, ct)) - .ParallelEnumerateAsync(); - } } } diff --git a/CryptoExchange.Net/SharedApis/V2/Symbols/GetFuturesSymbols/IGetFuturesSymbols.cs b/CryptoExchange.Net/SharedApis/V2/Symbols/GetFuturesSymbols/IGetFuturesSymbols.cs index 4ff2acb5..9c698fa3 100644 --- a/CryptoExchange.Net/SharedApis/V2/Symbols/GetFuturesSymbols/IGetFuturesSymbols.cs +++ b/CryptoExchange.Net/SharedApis/V2/Symbols/GetFuturesSymbols/IGetFuturesSymbols.cs @@ -47,7 +47,7 @@ namespace CryptoExchange.Net.SharedApis /// /// Request info /// Cancellation token - Task> GetFuturesSymbolsAsync(GetSymbolsRequest request, CancellationToken ct = default); + Task> GetFuturesSymbolsAsync(GetSymbolsRequest request, CancellationToken ct = default); } /// diff --git a/CryptoExchange.Net/SharedApis/V2/Symbols/GetSpotSymbols/IGetSpotSymbols.cs b/CryptoExchange.Net/SharedApis/V2/Symbols/GetSpotSymbols/IGetSpotSymbols.cs index 6fa70296..28f59927 100644 --- a/CryptoExchange.Net/SharedApis/V2/Symbols/GetSpotSymbols/IGetSpotSymbols.cs +++ b/CryptoExchange.Net/SharedApis/V2/Symbols/GetSpotSymbols/IGetSpotSymbols.cs @@ -47,7 +47,7 @@ namespace CryptoExchange.Net.SharedApis /// /// Request info /// Cancellation token - Task> GetSpotSymbolsAsync(GetSymbolsRequest request, CancellationToken ct = default); + Task> GetSpotSymbolsAsync(GetSymbolsRequest request, CancellationToken ct = default); } ///