diff --git a/CryptoExchange.Net/Objects/ExchangeOptions.cs b/CryptoExchange.Net/Objects/ExchangeOptions.cs
index a5450e1..3324bfb 100644
--- a/CryptoExchange.Net/Objects/ExchangeOptions.cs
+++ b/CryptoExchange.Net/Objects/ExchangeOptions.cs
@@ -36,7 +36,7 @@ namespace CryptoExchange.Net.Objects
///
/// The log writers
///
- public List LogWriters { get; set; } = new List() {new DebugTextWriter()};
+ public List LogWriters { get; set; } = new List() { new DebugTextWriter() };
}
public class ClientOptions: ExchangeOptions
@@ -55,6 +55,25 @@ namespace CryptoExchange.Net.Objects
/// The time the server has to respond to a request before timing out
///
public TimeSpan RequestTimeout { get; set; } = TimeSpan.FromSeconds(30);
+
+ public T Copy() where T:ClientOptions, new()
+ {
+ var copy = new T
+ {
+ BaseAddress = BaseAddress,
+ LogVerbosity = LogVerbosity,
+ Proxy = Proxy,
+ LogWriters = LogWriters,
+ RateLimiters = RateLimiters,
+ RateLimitingBehaviour = RateLimitingBehaviour,
+ RequestTimeout = RequestTimeout
+ };
+
+ if (ApiCredentials != null)
+ copy.ApiCredentials = new ApiCredentials(ApiCredentials.Key.GetString(), ApiCredentials.Secret.GetString());
+
+ return copy;
+ }
}
public class SocketClientOptions: ExchangeOptions
@@ -63,5 +82,22 @@ namespace CryptoExchange.Net.Objects
/// Time to wait between reconnect attempts
///
public TimeSpan ReconnectInterval { get; set; } = TimeSpan.FromSeconds(5);
+
+ public T Copy() where T : SocketClientOptions, new()
+ {
+ var copy = new T
+ {
+ BaseAddress = BaseAddress,
+ LogVerbosity = LogVerbosity,
+ Proxy = Proxy,
+ LogWriters = LogWriters,
+ ReconnectInterval = ReconnectInterval
+ };
+
+ if (ApiCredentials != null)
+ copy.ApiCredentials = new ApiCredentials(ApiCredentials.Key.GetString(), ApiCredentials.Secret.GetString());
+
+ return copy;
+ }
}
}
diff --git a/CryptoExchange.Net/SocketClient.cs b/CryptoExchange.Net/SocketClient.cs
index ab57ffd..6dca89c 100644
--- a/CryptoExchange.Net/SocketClient.cs
+++ b/CryptoExchange.Net/SocketClient.cs
@@ -121,8 +121,9 @@ namespace CryptoExchange.Net
protected virtual void ProcessMessage(SocketSubscription subscription, string data)
{
log.Write(LogVerbosity.Debug, $"Socket {subscription.Socket.Id} received data: " + data);
- foreach (var handler in subscription.DataHandlers)
- handler(subscription, JToken.Parse(data));
+ foreach (var handler in subscription.MessageHandlers)
+ if (handler(subscription, JToken.Parse(data)))
+ return;
}
///
@@ -163,6 +164,7 @@ namespace CryptoExchange.Net
}
else
{
+ log.Write(LogVerbosity.Info, $"Socket {socket.Id} closed");
socket.Dispose();
lock (sockets)
{
diff --git a/CryptoExchange.Net/Sockets/SocketSubscription.cs b/CryptoExchange.Net/Sockets/SocketSubscription.cs
index 490db1b..b687acf 100644
--- a/CryptoExchange.Net/Sockets/SocketSubscription.cs
+++ b/CryptoExchange.Net/Sockets/SocketSubscription.cs
@@ -13,7 +13,10 @@ namespace CryptoExchange.Net.Sockets
public event Action ConnectionLost;
public event Action ConnectionRestored;
- public List> DataHandlers { get; set; }
+ ///
+ /// Message handlers for this subscription. Should return true if the message is handled and should not be distributed to the other handlers
+ ///
+ public List> MessageHandlers { get; set; }
public List Events { get; set; }
public IWebsocket Socket { get; set; }
@@ -29,7 +32,7 @@ namespace CryptoExchange.Net.Sockets
Events = new List();
waitingForEvents = new List();
- DataHandlers = new List>();
+ MessageHandlers = new List>();
Socket.OnClose += () =>
{