private async Task <CallResult <UpdateSubscription> > Subscribe <T>(HuobiRequest request, Action <T> onData) where T : class { var connectResult = await CreateAndConnectSocket(request.Signed, true, onData).ConfigureAwait(false); if (!connectResult.Success) { return(new CallResult <UpdateSubscription>(null, connectResult.Error)); } var subscription = connectResult.Data; Send(subscription.Socket, request); var subResult = await subscription.WaitForEvent(SubscriptionEvent, socketResponseTimeout).ConfigureAwait(false); if (!subResult.Success) { await subscription.Close().ConfigureAwait(false); return(new CallResult <UpdateSubscription>(null, subResult.Error)); } subscription.Request = request; subscription.Socket.ShouldReconnect = true; return(new CallResult <UpdateSubscription>(new UpdateSubscription(subscription), null)); }
private async Task <CallResult <T> > Query <T>(HuobiRequest request) where T : HuobiResponse { CallResult <T> result = null; var subscription = GetBackgroundSocket(request.Signed); if (subscription == null) { // We don't have a background socket to query, create a new one var connectResult = await CreateAndConnectSocket <T>(request.Signed, false, data => result = new CallResult <T>(data, null)).ConfigureAwait(false); if (!connectResult.Success) { return(new CallResult <T>(null, connectResult.Error)); } subscription = connectResult.Data; subscription.Type = request.Signed ? SocketType.BackgroundAuthenticated : SocketType.Background; } else { // Use earlier created background socket to query without having to connect again subscription.Events.Single(s => s.Name == DataEvent).Reset(); if (request.Signed) { subscription.MessageHandlers[DataHandlerName] = (subs, data) => DataHandlerV2 <T>(subs, data, rdata => result = new CallResult <T>(rdata, null)); } else { subscription.MessageHandlers[DataHandlerName] = (subs, data) => DataHandlerV1 <T>(subs, data, rdata => result = new CallResult <T>(rdata, null)); } } Send(subscription.Socket, request); var dataResult = await subscription.WaitForEvent(DataEvent, socketResponseTimeout).ConfigureAwait(false); if (!dataResult.Success) { return(new CallResult <T>(null, dataResult.Error)); } return(!result.Data.IsSuccessful ? new CallResult <T>(null, new ServerError($"{result.Data.ErrorCode}: {result.Data.ErrorMessage}")) : result); }