From 2e49217e203fac9c0bfde45487f793d1dd4c1232 Mon Sep 17 00:00:00 2001 From: Jan Korf Date: Fri, 10 Aug 2018 15:43:03 +0200 Subject: [PATCH] Made socket more robust, added basic serialization to arrayconverter --- .../Converters/ArrayConverter.cs | 15 +++++++++- .../Implementation/BaseSocket.cs | 28 +++++++++++++------ 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/CryptoExchange.Net/Converters/ArrayConverter.cs b/CryptoExchange.Net/Converters/ArrayConverter.cs index 24e310c..39d745b 100644 --- a/CryptoExchange.Net/Converters/ArrayConverter.cs +++ b/CryptoExchange.Net/Converters/ArrayConverter.cs @@ -1,5 +1,6 @@ using System; using System.Globalization; +using System.Linq; using System.Reflection; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -60,7 +61,19 @@ namespace CryptoExchange.Net.Converters public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { - throw new NotImplementedException(); + writer.WriteStartArray(); + var props = value.GetType().GetProperties(); + var ordered = props.OrderBy(p => p.GetCustomAttribute()?.Index); + + foreach (var prop in ordered) + { + var converterAttribute = (JsonConverterAttribute)prop.GetCustomAttribute(typeof(JsonConverterAttribute)); + if(converterAttribute != null) + writer.WriteValue(JsonConvert.SerializeObject(prop.GetValue(value), (JsonConverter)Activator.CreateInstance(converterAttribute.ConverterType))); + else + writer.WriteValue(JsonConvert.SerializeObject(prop.GetValue(value))); + } + writer.WriteEndArray(); } } diff --git a/CryptoExchange.Net/Implementation/BaseSocket.cs b/CryptoExchange.Net/Implementation/BaseSocket.cs index 0b0a9ee..7b9c5c7 100644 --- a/CryptoExchange.Net/Implementation/BaseSocket.cs +++ b/CryptoExchange.Net/Implementation/BaseSocket.cs @@ -8,6 +8,7 @@ using System.Threading; using System.Threading.Tasks; using CryptoExchange.Net.Interfaces; using CryptoExchange.Net.Logging; +using SuperSocket.ClientEngine; using SuperSocket.ClientEngine.Proxy; using WebSocket4Net; @@ -97,7 +98,10 @@ namespace CryptoExchange.Net.Implementation lock (socketLock) { if (socket == null || IsClosed) + { + log.Write(LogVerbosity.Debug, "Socket was already closed/disposed"); return; + } log.Write(LogVerbosity.Debug, "Closing websocket"); ManualResetEvent evnt = new ManualResetEvent(false); @@ -106,11 +110,7 @@ namespace CryptoExchange.Net.Implementation socket.Close(); bool triggered = evnt.WaitOne(3000); socket.Closed -= handler; - - if (!triggered) - log.Write(LogVerbosity.Debug, "Websocket closed event did not trigger"); - else - log.Write(LogVerbosity.Debug, "Websocket closed"); + log.Write(LogVerbosity.Debug, "Websocket closed"); } }).ConfigureAwait(false); } @@ -124,24 +124,34 @@ namespace CryptoExchange.Net.Implementation { return await Task.Run(() => { + bool connected; lock (socketLock) { log.Write(LogVerbosity.Debug, "Connecting websocket"); ManualResetEvent evnt = new ManualResetEvent(false); - var handler = new EventHandler((o, a) => evnt.Set()); + var handler = new EventHandler((o, a) => evnt?.Set()); + var errorHandler = new EventHandler((o, a) => evnt?.Set()); socket.Opened += handler; socket.Closed += handler; + socket.Error += errorHandler; socket.Open(); - evnt.WaitOne(); + evnt.WaitOne(TimeSpan.FromSeconds(15)); socket.Opened -= handler; socket.Closed -= handler; - var connected = socket.State == WebSocketState.Open; + socket.Error -= errorHandler; + connected = socket.State == WebSocketState.Open; if (connected) log.Write(LogVerbosity.Debug, "Websocket connected"); else log.Write(LogVerbosity.Debug, "Websocket connection failed, state: " + socket.State); - return connected; + evnt.Dispose(); + evnt = null; } + + if (socket.State == WebSocketState.Connecting) + Close().Wait(); + + return connected; }).ConfigureAwait(false); }