mirror of
https://github.com/JKorf/CryptoExchange.Net
synced 2025-06-10 17:36:19 +00:00
Small refactoring
This commit is contained in:
parent
5645e8e7f3
commit
60f3696db1
@ -21,6 +21,7 @@ namespace CryptoExchange.Net
|
|||||||
|
|
||||||
protected static int lastId;
|
protected static int lastId;
|
||||||
protected static object idLock = new object();
|
protected static object idLock = new object();
|
||||||
|
public static int LastId { get => lastId; }
|
||||||
|
|
||||||
private static readonly JsonSerializer defaultSerializer = JsonSerializer.Create(new JsonSerializerSettings()
|
private static readonly JsonSerializer defaultSerializer = JsonSerializer.Create(new JsonSerializerSettings()
|
||||||
{
|
{
|
||||||
@ -59,13 +60,13 @@ namespace CryptoExchange.Net
|
|||||||
authProvider = authentictationProvider;
|
authProvider = authentictationProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected CallResult<T> Deserialize<T>(string data, bool checkObject = true, JsonSerializer serializer = null) where T : class
|
protected CallResult<T> Deserialize<T>(string data, bool checkObject = true, JsonSerializer serializer = null)
|
||||||
{
|
{
|
||||||
var obj = JToken.Parse(data);
|
var obj = JToken.Parse(data);
|
||||||
return Deserialize<T>(obj, checkObject, serializer);
|
return Deserialize<T>(obj, checkObject, serializer);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected CallResult<T> Deserialize<T>(JToken obj, bool checkObject = true, JsonSerializer serializer = null) where T : class
|
protected CallResult<T> Deserialize<T>(JToken obj, bool checkObject = true, JsonSerializer serializer = null)
|
||||||
{
|
{
|
||||||
if (serializer == null)
|
if (serializer == null)
|
||||||
serializer = defaultSerializer;
|
serializer = defaultSerializer;
|
||||||
@ -99,19 +100,19 @@ namespace CryptoExchange.Net
|
|||||||
{
|
{
|
||||||
var info = $"Deserialize JsonReaderException: {jre.Message}, Path: {jre.Path}, LineNumber: {jre.LineNumber}, LinePosition: {jre.LinePosition}. Received data: {obj.ToString()}";
|
var info = $"Deserialize JsonReaderException: {jre.Message}, Path: {jre.Path}, LineNumber: {jre.LineNumber}, LinePosition: {jre.LinePosition}. Received data: {obj.ToString()}";
|
||||||
log.Write(LogVerbosity.Error, info);
|
log.Write(LogVerbosity.Error, info);
|
||||||
return new CallResult<T>(null, new DeserializeError(info));
|
return new CallResult<T>(default(T), new DeserializeError(info));
|
||||||
}
|
}
|
||||||
catch (JsonSerializationException jse)
|
catch (JsonSerializationException jse)
|
||||||
{
|
{
|
||||||
var info = $"Deserialize JsonSerializationException: {jse.Message}. Received data: {obj.ToString()}";
|
var info = $"Deserialize JsonSerializationException: {jse.Message}. Received data: {obj.ToString()}";
|
||||||
log.Write(LogVerbosity.Error, info);
|
log.Write(LogVerbosity.Error, info);
|
||||||
return new CallResult<T>(null, new DeserializeError(info));
|
return new CallResult<T>(default(T), new DeserializeError(info));
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
var info = $"Deserialize Unknown Exception: {ex.Message}. Received data: {obj.ToString()}";
|
var info = $"Deserialize Unknown Exception: {ex.Message}. Received data: {obj.ToString()}";
|
||||||
log.Write(LogVerbosity.Error, info);
|
log.Write(LogVerbosity.Error, info);
|
||||||
return new CallResult<T>(null, new DeserializeError(info));
|
return new CallResult<T>(default(T), new DeserializeError(info));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -63,8 +63,6 @@ namespace CryptoExchange.Net
|
|||||||
socket.DataInterpreter = dataInterpreter;
|
socket.DataInterpreter = dataInterpreter;
|
||||||
socket.OnClose += () =>
|
socket.OnClose += () =>
|
||||||
{
|
{
|
||||||
if(socket.DisconnectTime == null)
|
|
||||||
socket.DisconnectTime = DateTime.UtcNow;
|
|
||||||
SocketOnClose(socket);
|
SocketOnClose(socket);
|
||||||
};
|
};
|
||||||
socket.OnError += (e) =>
|
socket.OnError += (e) =>
|
||||||
@ -110,7 +108,7 @@ namespace CryptoExchange.Net
|
|||||||
{
|
{
|
||||||
if (socket.ShouldReconnect)
|
if (socket.ShouldReconnect)
|
||||||
{
|
{
|
||||||
log.Write(LogVerbosity.Info, $"Socket {socket.Id} Connection lost, going to try to reconnect");
|
log.Write(LogVerbosity.Info, $"Socket {socket.Id} Connection lost, will try to reconnect");
|
||||||
Task.Run(() =>
|
Task.Run(() =>
|
||||||
{
|
{
|
||||||
Thread.Sleep(reconnectInterval);
|
Thread.Sleep(reconnectInterval);
|
||||||
@ -119,16 +117,22 @@ namespace CryptoExchange.Net
|
|||||||
log.Write(LogVerbosity.Debug, $"Socket {socket.Id} failed to reconnect");
|
log.Write(LogVerbosity.Debug, $"Socket {socket.Id} failed to reconnect");
|
||||||
return; // Connect() should result in a SocketClosed event so we end up here again
|
return; // Connect() should result in a SocketClosed event so we end up here again
|
||||||
}
|
}
|
||||||
|
var time = socket.DisconnectTime;
|
||||||
|
socket.DisconnectTime = null;
|
||||||
|
if (time == null)
|
||||||
|
return;
|
||||||
|
|
||||||
log.Write(LogVerbosity.Info, $"Socket {socket.Id} reconnected after {DateTime.UtcNow - socket.DisconnectTime.Value}");
|
log.Write(LogVerbosity.Info, $"Socket {socket.Id} reconnected after {DateTime.UtcNow - time}");
|
||||||
|
|
||||||
SocketSubscription subscription;
|
SocketSubscription subscription;
|
||||||
lock(sockets)
|
lock (sockets)
|
||||||
subscription = sockets.Single(s => s.Socket == socket);
|
subscription = sockets.Single(s => s.Socket == socket);
|
||||||
|
|
||||||
if (!SocketReconnect(subscription, DateTime.UtcNow - socket.DisconnectTime.Value))
|
if (!SocketReconnect(subscription, DateTime.UtcNow - time.Value))
|
||||||
socket.Close().Wait(); // Close so we end up reconnecting again
|
socket.Close().Wait(); // Close so we end up reconnecting again
|
||||||
socket.DisconnectTime = null;
|
|
||||||
|
|
||||||
|
log.Write(LogVerbosity.Info, $"Socket {socket.Id} successfully resubscribed");
|
||||||
return;
|
return;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,6 @@ namespace CryptoExchange.Net.Sockets
|
|||||||
public class SocketEvent
|
public class SocketEvent
|
||||||
{
|
{
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
public int Id { get; set; }
|
|
||||||
|
|
||||||
private CallResult<bool> result;
|
private CallResult<bool> result;
|
||||||
private ManualResetEvent setEvnt;
|
private ManualResetEvent setEvnt;
|
||||||
|
@ -20,11 +20,14 @@ namespace CryptoExchange.Net.Sockets
|
|||||||
public object Request { get; set; }
|
public object Request { get; set; }
|
||||||
|
|
||||||
private bool lostTriggered;
|
private bool lostTriggered;
|
||||||
|
private Dictionary<int, SocketEvent> waitingForIds;
|
||||||
|
|
||||||
|
|
||||||
public SocketSubscription(IWebsocket socket)
|
public SocketSubscription(IWebsocket socket)
|
||||||
{
|
{
|
||||||
Socket = socket;
|
Socket = socket;
|
||||||
Events = new List<SocketEvent>();
|
Events = new List<SocketEvent>();
|
||||||
|
waitingForIds = new Dictionary<int, SocketEvent>();
|
||||||
|
|
||||||
DataHandlers = new List<Action<SocketSubscription, JToken>>();
|
DataHandlers = new List<Action<SocketSubscription, JToken>>();
|
||||||
|
|
||||||
@ -33,6 +36,7 @@ namespace CryptoExchange.Net.Sockets
|
|||||||
if (lostTriggered)
|
if (lostTriggered)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
Socket.DisconnectTime = DateTime.UtcNow;
|
||||||
lostTriggered = true;
|
lostTriggered = true;
|
||||||
|
|
||||||
foreach (var events in Events)
|
foreach (var events in Events)
|
||||||
@ -43,9 +47,11 @@ namespace CryptoExchange.Net.Sockets
|
|||||||
};
|
};
|
||||||
Socket.OnOpen += () =>
|
Socket.OnOpen += () =>
|
||||||
{
|
{
|
||||||
lostTriggered = false;
|
if (lostTriggered)
|
||||||
if (Socket.DisconnectTime != null)
|
{
|
||||||
|
lostTriggered = false;
|
||||||
ConnectionRestored?.Invoke(DateTime.UtcNow - Socket.DisconnectTime.Value);
|
ConnectionRestored?.Invoke(DateTime.UtcNow - Socket.DisconnectTime.Value);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -59,16 +65,37 @@ namespace CryptoExchange.Net.Sockets
|
|||||||
Events.SingleOrDefault(e => e.Name == name)?.Set(success, error);
|
Events.SingleOrDefault(e => e.Name == name)?.Set(success, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
public CallResult<bool> WaitForEvent(string name)
|
public void SetEvent(int id, bool success, Error error)
|
||||||
{
|
{
|
||||||
return Events.Single(e => e.Name == name).Wait();
|
if (waitingForIds.ContainsKey(id))
|
||||||
|
{
|
||||||
|
waitingForIds[id].Set(success, error);
|
||||||
|
waitingForIds.Remove(id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public CallResult<bool> WaitForEvent(string name, int id)
|
public (int, SocketEvent) GetWaitingEvent(string name)
|
||||||
{
|
{
|
||||||
var evnt = Events.Single(e => e.Name == name);
|
var result = waitingForIds.SingleOrDefault(w => w.Value.Name == name);
|
||||||
evnt.Id = id;
|
if (result.Equals(default(KeyValuePair<int, SocketEvent>)))
|
||||||
return evnt.Wait();
|
return (0, null);
|
||||||
|
|
||||||
|
return (result.Key, result.Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public CallResult<bool> WaitForEvent(string name, int timeout)
|
||||||
|
{
|
||||||
|
return Events.Single(e => e.Name == name).Wait(timeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task<CallResult<bool>> WaitForEvent(string name, int id, int timeout)
|
||||||
|
{
|
||||||
|
return Task.Run(() =>
|
||||||
|
{
|
||||||
|
var evnt = Events.Single(e => e.Name == name);
|
||||||
|
waitingForIds.Add(id, evnt);
|
||||||
|
return evnt.Wait(timeout);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task Close()
|
public async Task Close()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user