private async Task Login(IRxSocket rxsocket, int timeout, CancellationToken ct) { var ts = timeout >= 0 ? TimeSpan.FromMilliseconds(timeout) : TimeSpan.MaxValue; // Send the first message without a length prefix. "API".ToByteArray().SendTo(rxsocket); // Start sending and receiving messages with an int32 message length prefix (UseV100Plus). // Report a range of supported API versions to TWS. new[] { $"v{Config.ServerVersionMin}..{Config.ServerVersionMax}" }.ToByteArrayWithLengthPrefix().SendTo(rxsocket); new[] { ((int)RequestCode.StartApi).ToString(), "2", Config.ClientId.ToString(), Config.OptionalCapabilities }.ToByteArrayWithLengthPrefix().SendTo(rxsocket); var messages = await rxsocket .ReceiveObservable .ToByteArrayOfLengthPrefix() .ToStringArray() .Take(3) .Timeout(ts, Observable.Throw <string[]>(new TimeoutException("No response received from server."))) .ToList() .ToTask(ct); // ServerVersion is the highest supported API version in the range specified. if (!Enum.TryParse(messages[0][0], out ServerVersion version)) { throw new InvalidDataException($"Could not parse server version '{messages[0][0]}'."); } Config.ServerVersionCurrent = version; Config.Date = messages[0][1]; Config.ManagedAccounts = messages[1][2]; Config.NextIdValue = int.Parse(messages[2][2]) - 1; }
internal InterReactClient(IRxSocket rxsocket, Config config, Request request, IObservable <object> response, Services services) { rxSocket = rxsocket; Config = config; Request = request; Response = response; Services = services; }
internal RequestMessage(IRxSocket rxSocket, Limiter limiter) : this(rxSocket.Send, limiter) { }