public async Task <BitmexApiResult <TResult> > Execute <TParams, TResult>(ApiActionAttributes <TParams, TResult> apiAction, TParams @params) { switch (apiAction.Method) { case HttpMethods.GET: { var getQueryParams = @params as IQueryStringParams; var serializedResult = await _bitmexApiProxy.Get(apiAction.Action, getQueryParams); var deserializedResult = BitmexJsonSerializer.Deserialize <TResult>(serializedResult.Result); return(serializedResult.ToResultType <TResult>(deserializedResult)); } case HttpMethods.POST: { var postQueryParams = @params as IJsonQueryParams; var serializedResult = await _bitmexApiProxy.Post(apiAction.Action, postQueryParams); var deserializedResult = BitmexJsonSerializer.Deserialize <TResult>(serializedResult.Result); return(serializedResult.ToResultType <TResult>(deserializedResult)); } case HttpMethods.PUT: { var putQueryParams = @params as IJsonQueryParams; var serializedResult = await _bitmexApiProxy.Put(apiAction.Action, putQueryParams); var deserializedResult = BitmexJsonSerializer.Deserialize <TResult>(serializedResult.Result); return(serializedResult.ToResultType <TResult>(deserializedResult)); } case HttpMethods.DELETE: { var deleteQueryParams = @params as IQueryStringParams; var serializedResult = await _bitmexApiProxy.Delete(apiAction.Action, deleteQueryParams); var deserializedResult = BitmexJsonSerializer.Deserialize <TResult>(serializedResult.Result); return(serializedResult.ToResultType <TResult>(deserializedResult)); } default: throw new ArgumentOutOfRangeException(); } }
public bool Connect() { CloseConnectionIfItsNotNull(); _socketConnection = new WebSocket($"wss://{Environments.Values[_bitmexEnvironment]}/realtime") { EnableAutoSendPing = true, AutoSendPingInterval = 2 }; BitmexWelcomeMessage welcomeData = null; EventHandler <MessageReceivedEventArgs> welcomeMessageReceived = (sender, e) => { _logger.LogDebug($"Welcome Data Received {e.Message}"); welcomeData = BitmexJsonSerializer.Deserialize <BitmexWelcomeMessage>(e.Message); _welcomeReceived.Set(); }; _socketConnection.MessageReceived += welcomeMessageReceived; _socketConnection.Open(); var waitResult = _welcomeReceived.WaitOne(SocketMessageResponseTimeout); _socketConnection.MessageReceived -= welcomeMessageReceived; if (waitResult && (welcomeData?.Limit?.Remaining ?? 0) == 0) { _logger.LogError("Bitmex connection limit reached"); throw new BitmexWebSocketLimitReachedException(); } if (!waitResult) { _logger.LogError("Open connection timeout. Welcome message is not received"); return(false); } if (IsAlive) { _logger.LogInformation("Bitmex web socket connection opened"); _socketConnection.MessageReceived += SocketConnectionOnMessageReceived; _socketConnection.Closed += SocketConnectionOnClosed; _socketConnection.Error += SocketConnectionOnError; } return(IsAlive); }