* Result types:
* (Web)CallResult types are replaced by HttpResult, WebSocketResult and QueryResult with the same logic
* Updated result types to record type
* Result creation can be done with (Http/WebSocket/Query)Result.Ok(..) and .Fail(..)
* Removed implicit result type conversion to bool, `if (result)` no longer works, instead use `if (result.Success)`
* Replaced CallResult.SuccessResult with CallResult.Ok()
* Fixed result object nullability hinting, for example Data might be null if Success isn't checked for true
* Parameters & serialization:
* Added support for `enabled` and `disabled` strings to bool converter
* Removed ParameterCollection type, has been replaced by Parameters type
* Removed ArraySerialization, OrderParameters and ParameterOrderComparer properties from RestApiClient, moved to ParameterSerializationsSettings
* Updated RestRequestConfiguration in AuthenticationProvider.ProcessRequest to contain the full RequestDefinition instead of copied fields
* Clients:
* Updated Api client constructor logging parameter from ILogger to ILoggerFactory?
* Added Api client constructor exchange name parameter
* Added ToString overrides on base API types
* Added Exchange property on BaseApiClient
* Added ApiCredentials property on IRestApiClient and ISocketApiClient interfaces
* Updated ILogger source from client name to topic specific client name
* Removed logging from client creation
* Fixed BaseRestClient SetApiCredentials not marked as virtual
* Rest:
* Added BaseAddress to RequestDefinition object
* Updated RestApiClient AuthenticationProvider logic from private to protected and virtual
* Removed RestApiClient.SendAsync baseAddress parameter removed
* Removed RestApiClient.SendAsync without type parameter
* WebSocket:
* Updated MessageRouting definition into CreateForEvent for subscriptions and CreateForQuery for queries
* Improved Query type safety with CeateForQuery which allows second parameter for specifying the result type
* Renamed MessageRouter.CreateWithoutHandler to CreateVoid
* Updated SocketApiClient.GetSocketConnection to check connection uri instead of Tag for finding compatible connections
* Removed unused UnhandledMessageExpected property SocketApiClient
* Fixed issue in SocketApiClient.GetSocketConnection causing requests to always wait the full max 10 seconds when there was a reconnecting socket
* Shared APIs:
* Updated Option definitions to always require the exchange name as first parameter
* Added missing dedicated option types
* Added Discover method on ISharedClient interface, returning info on supported capabilities and operations
* Added SharedRequest GetParamValue helper method accepting multiple parameter names
* Added ResetStaticExchangeParameters method on ExchangeParameters
* Added Status property to SharedWithdrawal model
* Added TradingModes property to SharedBalance model
* Updated ExchangeSymbolCache to support multiple environments and additional key separation
* Updated Shared ExchangeParameters parameter names to be case insensitive
* Updated code comments
* Replaced ExchangeResult with ExchangeCallResult type
* Removed AsExchangeResult/ExchangeWebResult
* Removed TradingMode from the response model, only maintained on models where it makes sense
* Removed IListenKey support, listen keys now rely on internal management with TokenManager
* Rate limiting:
* Fixed websocket connection attempts counting towards rate limit even when server could not be reached
* Removed host from rate limit methods, now part of the already provided RequestDefinition
* Added amount parameter to RateLimit Reset method to allow partially resetting the limit
* Added TokenManager implementation for automatic listenkey/token management
* Added UserClientProvider base class
* Added async streaming on UserDataTracker items with StreamUpdatesAsync
* Added cancellation token support to UserDataTracker starting
* Added Unit type for non-result types
* Added ServerError constructor taking ErrorType and message to make it easier to create
* Added SupportedEnvironments property to PlatformInfo
* Updated SymbolOrderBook DoResyncAsync to return CallResult instead of CallResult<bool> which was redundant
* Various small performance improvements
Performance update:
Authentication
Added Ed25519 signing support for NET8.0 and newer
Added static methods on ApiCredentials to create credentials of a specific type
Added static ApiCredentials.ReadFromFile method to read a key from file
Added required abstract SupportedCredentialTypes property on AuthenticationProvider base class
General Performance
Added checks before logging statements to prevent overhead of building the log string if logging is not needed
Added ExchangeHelpers.ProcessQueuedAsync method to process updates async
Replaced locking object types from object to Lock in NET9.0 and newer
Replaced some Task response types with ValueTask to prevent allocation overhead on hot paths
Updated Json ArrayConverter to reduce some allocation overhead
Updated Json BoolConverter to prevent boxing
Updated Json DateTimeConverter to prevent boxing
Updated Json EnumConverter caching to reduce lookup overhead
Updated ExtensionMethods.CreateParamString to reduce allocations
Updated ExtensionMethods.AppendPath to reduce overhead
REST
Refactored REST message processing to separate IRestMessageHandler instance
Split RestApiClient.PrepareAsync into CheckTimeSync and RateLimitAsync
Updated IRequest.Accept type from string to MediaTypeWithQualityHeaderValue to prevent creation on each request
Updated IRequest.GetHeaders response type from KeyValuePair<string, string[]>[] to HttpRequestHeaders to prevent additional mapping
Updated IResponse.ResponseHeaders type from KeyValuePair<string, string[]>[] to HttpResponseHeaders to prevent additional mapping
Updated WebCallResult RequestHeaders and ResponseHeaders types to HttpRequestHeaders and HttpResponseHeaders
Removed unnecessary empty dictionary initializations for each request
Removed CallResult creation in internal methods to prevent having to create multiple versions for different result types
Socket
Added HighPerformance websocket client implementation which significantly reduces memory overhead and improves speed but with certain limitations
Added MaxIndividualSubscriptionsPerConnection setting in SocketApiClient to limit the number of individual stream subscriptions on a connection
Added SocketIndividualSubscriptionCombineTarget option to set the target number of individual stream subscriptions per connection
Added new websocket message handling logic which is faster and reduces memory allocation
Added UseUpdatedDeserialization option to toggle between updated deserialization and old deserialization
Added Exchange property to DataEvent to prevent additional mapping overhead for Shared apis
Refactored message callback to be sync instead of async to prevent async overhead
Refactored CryptoExchangeWebSocketClient.IncomingKbps calculation to significantly reduce overhead
Moved websocket client creation from SocketApiClient to SocketConnection
Removed DataEvent.As and DataEvent.ToCallResult methods in favor of single ToType method
Removed DataEvent creation on lower levels to prevent having to create multiple versions for different result types
Removed Subscription<TSubResponse, TUnsubResponse> as its no longer used
Other
Added null check to ParameterCollection for required parameters
Added Net10.0 target framework
Updated dependency versions
Updated Shared asset aliases check to be culture invariant
Updated Error string representation
Updated some namespaces
Updated SymbolOrderBook processing of buffered updates to prevent additional allocation
Removed ExchangeEvent type which is no longer needed
Removed unused usings