/// <summary> /// Begins a Real Time Messaging API session and connects via a websocket. /// Will reconnect automatically. /// </summary> /// <param name="manualPresenceSubscription">Only deliver presence events when requested by subscription.</param> /// <param name="batchPresenceAware">Group presence change notices in <see cref="PresenceChange"/> events when possible.</param> /// <param name="cancellationToken"></param> public async Task <ConnectResponse> Connect(bool batchPresenceAware = false, bool manualPresenceSubscription = false, CancellationToken?cancellationToken = null) { if (Connected) { throw new InvalidOperationException("Already connecting or connected"); } var connectResponse = await _client.Rtm.Connect(manualPresenceSubscription, batchPresenceAware, cancellationToken).ConfigureAwait(false); _webSocket?.Dispose(); _webSocket = _webSocketFactory.Create(connectResponse.Url); var openedTask = _webSocket.Opened .Merge(_webSocket.Errors.SelectMany(Observable.Throw <Unit>)) .FirstAsync() .ToTask(cancellationToken); _webSocket.Open(); await openedTask.ConfigureAwait(false); _eventSubscription?.Dispose(); _eventSubscription = _webSocket.Messages .Select(m => JsonConvert.DeserializeObject <Event>(m, _jsonSettings.SerializerSettings)) .Subscribe(_rawEvents); _reconnection?.Dispose(); _reconnection = _webSocket.Closed .SelectMany(_ => Observable.FromAsync(() => Connect(batchPresenceAware, manualPresenceSubscription, cancellationToken), _scheduler) .RetryWithDelay(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(5), TimeSpan.FromMinutes(5), _scheduler)) .Subscribe(); return(connectResponse); }
public void Connect_OpensRtmWebSocket(bool manualPresenceSubscription, bool batchPresenceAware) { var cancellationToken = new CancellationToken(false); var rtmUrl = "rtm url"; _slackApiClient.Rtm.Connect(manualPresenceSubscription, batchPresenceAware, cancellationToken) .Returns(new ConnectResponse { Url = rtmUrl }); _webSocketFactory.Create(rtmUrl).Returns(_webSocket); var result = _sut.Connect(batchPresenceAware, manualPresenceSubscription, cancellationToken); result.IsCompleted.ShouldBe(false); _webSocket.Received().Open(); _opened.OnNext(Unit.Default); result.ShouldComplete(); }
public static IWebSocket Create() { return(_factory != null?_factory.Create() : new DefaultWebSocket()); }