1
0
mirror of https://github.com/JKorf/CryptoExchange.Net synced 2025-06-09 17:06:19 +00:00
This commit is contained in:
JKorf 2023-10-30 21:40:50 +01:00
parent ad3959a8e9
commit cf941fe5c9
3 changed files with 35 additions and 8 deletions

View File

@ -16,13 +16,21 @@ namespace CryptoExchange.Net.Converters
public abstract Type? GetDeserializationType(Dictionary<string, string> idValues, List<MessageListener> listeners);
/// <inheritdoc />
public object? ReadJson(Stream stream, List<MessageListener> listeners)
public ParsedMessage? ReadJson(Stream stream, List<MessageListener> 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<string, string>();
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; }
}
}

View File

@ -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)

View File

@ -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<MessageListener>().ToList()); // TODO
var result = ApiClient.StreamConverter.ReadJson(stream, listeners.OfType<MessageListener>().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");
}
}