From cf941fe5c92352ccf6666ddcaee5f185b12ac15f Mon Sep 17 00:00:00 2001 From: JKorf Date: Mon, 30 Oct 2023 21:40:50 +0100 Subject: [PATCH] wip --- .../Converters/SocketConverter.cs | 35 +++++++++++++++---- .../Sockets/CryptoExchangeWebSocketClient.cs | 1 + .../Sockets/SocketConnection.cs | 7 +++- 3 files changed, 35 insertions(+), 8 deletions(-) diff --git a/CryptoExchange.Net/Converters/SocketConverter.cs b/CryptoExchange.Net/Converters/SocketConverter.cs index da99e64..176da59 100644 --- a/CryptoExchange.Net/Converters/SocketConverter.cs +++ b/CryptoExchange.Net/Converters/SocketConverter.cs @@ -16,13 +16,21 @@ namespace CryptoExchange.Net.Converters public abstract Type? GetDeserializationType(Dictionary idValues, List listeners); /// - public object? ReadJson(Stream stream, List listeners) + public ParsedMessage? ReadJson(Stream stream, List listeners, bool outputOriginalData) { // Start reading the data // Once we reach the properties that identify the message we save those in a dict // Once all id properties have been read callback to see what the deserialization type should be // Deserialize to the correct type + var result = new ParsedMessage(); + using var sr = new StreamReader(stream, Encoding.UTF8, false, (int)stream.Length, true); + if (outputOriginalData) + { + result.OriginalData = sr.ReadToEnd(); + stream.Position = 0; + } + using var jsonTextReader = new JsonTextReader(sr); JToken token; try @@ -34,6 +42,12 @@ namespace CryptoExchange.Net.Converters return null; } + if (token.Type == JTokenType.Array) + { + // Received array, take first item as reference + token = token.First!; + } + var typeIdDict = new Dictionary(); foreach(var idField in TypeIdFields) { @@ -42,9 +56,17 @@ namespace CryptoExchange.Net.Converters foreach (var splitToken in splitTokens) { accessToken = accessToken[splitToken]; + if (accessToken == null) break; + + if (accessToken.Type == JTokenType.Array) + { + // Received array, take first item as reference + accessToken = accessToken.First!; + } } + typeIdDict[idField] = accessToken?.ToString(); } @@ -70,19 +92,18 @@ namespace CryptoExchange.Net.Converters idString += item.Value; } + result.Identifier = idString; var resultType = GetDeserializationType(typeIdDict, listeners); - return new ParsedMessage - { - Identifier = idString, - Data = resultType == null ? null : token.ToObject(resultType) - }; + result.Data = resultType == null ? null : token.ToObject(resultType); + + return result; } } public class ParsedMessage { public string Identifier { get; set; } = null!; - + public string? OriginalData { get; set; } public object? Data { get; set; } } } diff --git a/CryptoExchange.Net/Sockets/CryptoExchangeWebSocketClient.cs b/CryptoExchange.Net/Sockets/CryptoExchangeWebSocketClient.cs index edbdbce..52892e6 100644 --- a/CryptoExchange.Net/Sockets/CryptoExchangeWebSocketClient.cs +++ b/CryptoExchange.Net/Sockets/CryptoExchangeWebSocketClient.cs @@ -582,6 +582,7 @@ namespace CryptoExchange.Net.Sockets private async Task ProcessData(Stream stream, WebSocketMessageType messageType) { + stream.Position = 0; if (Parameters.Interceptor != null) stream = Parameters.Interceptor.Invoke(stream); if (OnStreamMessage != null) diff --git a/CryptoExchange.Net/Sockets/SocketConnection.cs b/CryptoExchange.Net/Sockets/SocketConnection.cs index ac0de2d..99ac127 100644 --- a/CryptoExchange.Net/Sockets/SocketConnection.cs +++ b/CryptoExchange.Net/Sockets/SocketConnection.cs @@ -329,7 +329,7 @@ namespace CryptoExchange.Net.Sockets lock (_listenerLock) listeners = _messageListeners.OrderByDescending(x => x.Priority).ToList(); - var result = (ParsedMessage)ApiClient.StreamConverter.ReadJson(stream, listeners.OfType().ToList()); // TODO + var result = ApiClient.StreamConverter.ReadJson(stream, listeners.OfType().ToList(), ApiClient.ApiOptions.OutputOriginalData ?? ApiClient.ClientOptions.OutputOriginalData); // TODO if(result == null) { stream.Position = 0; @@ -339,6 +339,9 @@ namespace CryptoExchange.Net.Sockets return; } + if (result.OriginalData != null) + _logger.LogDebug($"Socket {SocketId} Data received: {result.OriginalData}"); + if (result.Data == null) { _logger.LogWarning("Message not matched to type"); @@ -752,6 +755,8 @@ namespace CryptoExchange.Net.Sockets // TODO check result? return matches; }).ConfigureAwait(false); + + _logger.Log(LogLevel.Information, $"Socket {SocketId} subscription {listener.Id} unsubscribed"); } }