mirror of
https://github.com/JKorf/CryptoExchange.Net
synced 2025-06-09 17:06:19 +00:00
wip
This commit is contained in:
parent
ad3959a8e9
commit
cf941fe5c9
@ -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; }
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user