예제 #1
0
        /// <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);
        }
예제 #2
0
        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();
        }
예제 #3
0
 public static IWebSocket Create()
 {
     return(_factory != null?_factory.Create() : new DefaultWebSocket());
 }