mirror of
https://github.com/JKorf/CryptoExchange.Net.git
synced 2026-08-13 09:23:04 +00:00
4e2dc564dd
Updated WebSocket message routing improving performance for scenarios with multiple different subscriptions and topics Added AddCommaSeparated helper for Enum value arrays to ParameterCollection Improved EnumConverter performance and removed string allocation for happy path Fixed CreateParamString extension method for ArrayParametersSerialization.Json Fixed Shared GetOrderBookOptions and GetRecentTradeOptions base validations not being called
105 lines
3.6 KiB
C#
105 lines
3.6 KiB
C#
using CryptoExchange.Net.Objects;
|
|
using System;
|
|
|
|
namespace CryptoExchange.Net.Sockets.Default.Routing
|
|
{
|
|
/// <summary>
|
|
/// Message route
|
|
/// </summary>
|
|
public abstract class MessageRoute
|
|
{
|
|
/// <summary>
|
|
/// Type identifier
|
|
/// </summary>
|
|
public string TypeIdentifier { get; set; }
|
|
/// <summary>
|
|
/// Optional topic filter
|
|
/// </summary>
|
|
public string? TopicFilter { get; set; }
|
|
|
|
/// <summary>
|
|
/// Whether responses to this route might be read by multiple listeners
|
|
/// </summary>
|
|
public bool MultipleReaders { get; set; } = false;
|
|
|
|
/// <summary>
|
|
/// Deserialization type
|
|
/// </summary>
|
|
public abstract Type DeserializationType { get; }
|
|
|
|
/// <summary>
|
|
/// ctor
|
|
/// </summary>
|
|
public MessageRoute(string typeIdentifier, string? topicFilter)
|
|
{
|
|
TypeIdentifier = typeIdentifier;
|
|
TopicFilter = topicFilter;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Message handler
|
|
/// </summary>
|
|
public abstract CallResult? Handle(SocketConnection connection, DateTime receiveTime, string? originalData, object data);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Message route
|
|
/// </summary>
|
|
public class MessageRoute<TMessage> : MessageRoute
|
|
{
|
|
private Func<SocketConnection, DateTime, string?, TMessage, CallResult?> _handler;
|
|
|
|
/// <inheritdoc />
|
|
public override Type DeserializationType { get; } = typeof(TMessage);
|
|
|
|
/// <summary>
|
|
/// ctor
|
|
/// </summary>
|
|
internal MessageRoute(string typeIdentifier, string? topicFilter, Func<SocketConnection, DateTime, string?, TMessage, CallResult?> handler, bool multipleReaders = false)
|
|
: base(typeIdentifier, topicFilter)
|
|
{
|
|
_handler = handler;
|
|
MultipleReaders = multipleReaders;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Create route without topic filter
|
|
/// </summary>
|
|
public static MessageRoute<TMessage> CreateWithoutTopicFilter(string typeIdentifier, Func<SocketConnection, DateTime, string?, TMessage, CallResult?> handler, bool multipleReaders = false)
|
|
{
|
|
return new MessageRoute<TMessage>(typeIdentifier, null, handler)
|
|
{
|
|
MultipleReaders = multipleReaders
|
|
};
|
|
}
|
|
|
|
/// <summary>
|
|
/// Create route with optional topic filter
|
|
/// </summary>
|
|
public static MessageRoute<TMessage> CreateWithOptionalTopicFilter(string typeIdentifier, string? topicFilter, Func<SocketConnection, DateTime, string?, TMessage, CallResult?> handler, bool multipleReaders = false)
|
|
{
|
|
return new MessageRoute<TMessage>(typeIdentifier, topicFilter, handler)
|
|
{
|
|
MultipleReaders = multipleReaders
|
|
};
|
|
}
|
|
|
|
/// <summary>
|
|
/// Create route with topic filter
|
|
/// </summary>
|
|
public static MessageRoute<TMessage> CreateWithTopicFilter(string typeIdentifier, string topicFilter, Func<SocketConnection, DateTime, string?, TMessage, CallResult?> handler, bool multipleReaders = false)
|
|
{
|
|
return new MessageRoute<TMessage>(typeIdentifier, topicFilter, handler)
|
|
{
|
|
MultipleReaders = multipleReaders
|
|
};
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public override CallResult? Handle(SocketConnection connection, DateTime receiveTime, string? originalData, object data)
|
|
{
|
|
return _handler(connection, receiveTime, originalData, (TMessage)data);
|
|
}
|
|
}
|
|
}
|