mirror of
https://github.com/JKorf/CryptoExchange.Net
synced 2026-04-07 10:11:10 +00:00
wip
This commit is contained in:
parent
406ae08c17
commit
08d361b259
@ -24,7 +24,7 @@ namespace CryptoExchange.Net.Converters.SystemTextJson
|
|||||||
if (string.IsNullOrEmpty(value))
|
if (string.IsNullOrEmpty(value))
|
||||||
return default;
|
return default;
|
||||||
|
|
||||||
return (T?)JsonDocument.Parse(value!).Deserialize(typeof(T), options);
|
return JsonDocument.Parse(value!).Deserialize<T>(options);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
|||||||
@ -522,19 +522,13 @@ namespace CryptoExchange.Net.Sockets.Default
|
|||||||
}
|
}
|
||||||
|
|
||||||
Type? deserializationType = null;
|
Type? deserializationType = null;
|
||||||
foreach (var subscription in _listeners)
|
foreach (var listener in _listeners)
|
||||||
{
|
{
|
||||||
foreach (var route in subscription.MessageRouter.Routes)
|
var routes = listener.MessageRouter[typeIdentifier];
|
||||||
{
|
if (routes.Count > 0) {
|
||||||
if (!route.TypeIdentifier.Equals(typeIdentifier, StringComparison.Ordinal))
|
deserializationType = routes[0].DeserializationType;
|
||||||
continue;
|
|
||||||
|
|
||||||
deserializationType = route.DeserializationType;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (deserializationType != null)
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (deserializationType == null)
|
if (deserializationType == null)
|
||||||
@ -581,11 +575,13 @@ namespace CryptoExchange.Net.Sockets.Default
|
|||||||
var topicFilter = messageConverter.GetTopicFilter(result);
|
var topicFilter = messageConverter.GetTopicFilter(result);
|
||||||
|
|
||||||
bool processed = false;
|
bool processed = false;
|
||||||
foreach (var processor in _listeners)
|
foreach (var listener in _listeners)
|
||||||
{
|
{
|
||||||
|
var routes = listener.MessageRouter[typeIdentifier];
|
||||||
|
|
||||||
bool isQuery = false;
|
bool isQuery = false;
|
||||||
Query? query = null;
|
Query? query = null;
|
||||||
if (processor is Query cquery)
|
if (listener is Query cquery)
|
||||||
{
|
{
|
||||||
isQuery = true;
|
isQuery = true;
|
||||||
query = cquery;
|
query = cquery;
|
||||||
@ -593,11 +589,8 @@ namespace CryptoExchange.Net.Sockets.Default
|
|||||||
|
|
||||||
var complete = false;
|
var complete = false;
|
||||||
|
|
||||||
foreach (var route in processor.MessageRouter.Routes)
|
foreach (var route in routes)
|
||||||
{
|
{
|
||||||
if (route.TypeIdentifier != typeIdentifier)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// Forward message rules:
|
// Forward message rules:
|
||||||
// | Message Topic | Route Topic Filter | Topics Match | Forward | Description
|
// | Message Topic | Route Topic Filter | Topics Match | Forward | Description
|
||||||
// | N | N | - | Y | No topic filter applied
|
// | N | N | - | Y | No topic filter applied
|
||||||
@ -623,7 +616,7 @@ namespace CryptoExchange.Net.Sockets.Default
|
|||||||
if (isQuery && query!.Completed)
|
if (isQuery && query!.Completed)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
processor.Handle(this, receiveTime, originalData, result, route);
|
listener.Handle(this, receiveTime, originalData, result, route);
|
||||||
if (isQuery && !route.MultipleReaders)
|
if (isQuery && !route.MultipleReaders)
|
||||||
{
|
{
|
||||||
complete = true;
|
complete = true;
|
||||||
|
|||||||
@ -70,10 +70,20 @@ namespace CryptoExchange.Net.Sockets.Default
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public bool Authenticated { get; }
|
public bool Authenticated { get; }
|
||||||
|
|
||||||
|
|
||||||
|
private MessageRouter _router;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Router for this subscription
|
/// Router for this subscription
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public MessageRouter MessageRouter { get; set; }
|
public MessageRouter MessageRouter
|
||||||
|
{
|
||||||
|
get => _router;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_router = value;
|
||||||
|
_router.BuildRouteMap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Cancellation token registration
|
/// Cancellation token registration
|
||||||
|
|||||||
@ -1,6 +1,9 @@
|
|||||||
using CryptoExchange.Net.Objects;
|
using CryptoExchange.Net.Objects;
|
||||||
using CryptoExchange.Net.Sockets.Default;
|
using CryptoExchange.Net.Sockets.Default;
|
||||||
using System;
|
using System;
|
||||||
|
#if NET8_0_OR_GREATER
|
||||||
|
using System.Collections.Frozen;
|
||||||
|
#endif
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
||||||
@ -16,6 +19,12 @@ namespace CryptoExchange.Net.Sockets
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public MessageRoute[] Routes { get; }
|
public MessageRoute[] Routes { get; }
|
||||||
|
|
||||||
|
#if NET8_0_OR_GREATER
|
||||||
|
private FrozenDictionary<string, List<MessageRoute>>? _routeMap;
|
||||||
|
#else
|
||||||
|
private Dictionary<string, List<MessageRoute>>? _routeMap;
|
||||||
|
#endif
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// ctor
|
/// ctor
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -24,6 +33,34 @@ namespace CryptoExchange.Net.Sockets
|
|||||||
Routes = routes;
|
Routes = routes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Build the route mapping
|
||||||
|
/// </summary>
|
||||||
|
public void BuildRouteMap()
|
||||||
|
{
|
||||||
|
var newMap = new Dictionary<string, List<MessageRoute>>();
|
||||||
|
foreach (var route in Routes)
|
||||||
|
{
|
||||||
|
if (!newMap.ContainsKey(route.TypeIdentifier))
|
||||||
|
newMap.Add(route.TypeIdentifier, new List<MessageRoute>());
|
||||||
|
newMap[route.TypeIdentifier].Add(route);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if NET8_0_OR_GREATER
|
||||||
|
_routeMap = newMap.ToFrozenDictionary();
|
||||||
|
#else
|
||||||
|
_routeMap = newMap;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get routes matching the type identifier
|
||||||
|
/// </summary>
|
||||||
|
public List<MessageRoute> this[string identifier]
|
||||||
|
{
|
||||||
|
get => (_routeMap ?? throw new InvalidOperationException("Route map not initialized before use")).TryGetValue(identifier, out var routes) ? routes: [];
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Create message router without specific message handler
|
/// Create message router without specific message handler
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@ -59,10 +59,19 @@ namespace CryptoExchange.Net.Sockets
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public object? Response { get; set; }
|
public object? Response { get; set; }
|
||||||
|
|
||||||
|
private MessageRouter _router;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Router for this query
|
/// Router for this subscription
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public MessageRouter MessageRouter { get; set; }
|
public MessageRouter MessageRouter
|
||||||
|
{
|
||||||
|
get => _router;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_router = value;
|
||||||
|
_router.BuildRouteMap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The query request object
|
/// The query request object
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user