public async Task FastForwardOnOutOfSyncWhenSimpleMode() { var channel = GenerateRandomChannelName(); var client = new RtmClientBuilder(Config.Endpoint, Config.AppKey) .SetConnector(ConnectAndFastForwardOnData) .Build(); var queue = client.CreateStateQueue(); var obs = new TestSubscriptionObserverQueue(queue); obs.ObserveSubscriptionState(); obs.ObserveSubscriptionPdu(); client.OnError += ex => { queue.Enqueue($"error:{ex.Message}"); }; RtmSubscriptionInfo subInfo = null; obs.OnSubscriptionInfo += (_, info) => subInfo = info; client.CreateSubscription(channel, SubscriptionModes.Simple, obs); client.Start(); await queue.AssertDequeue( "rtm:created", "rtm:enter-unsubscribed", "leave-stopped", "enter-connecting", "leave-connecting", "rtm:leave-unsubscribed", "rtm:enter-subscribing", "enter-connected", "rtm:leave-subscribing", "rtm:enter-subscribed"); // trigger subscription/info await client.Publish(channel, "msg", Ack.Yes); // on connected info Assert.That(await queue.Dequeue(), Is.EqualTo($"rtm:subscription-info:{RtmSubscriptionInfo.FastForward}")); var sub = await client.GetSubscription(channel); Assert.That(sub.Position, Is.EqualTo(null)); Assert.That(subInfo.Position, Is.Not.EqualTo(null)); await queue.AssertEmpty(client, millis : 200); await client.Dispose(); }
public bool ProcessSubscriptionInfo(RtmSubscriptionInfo info) { Log.V("Processing subscription info, subscription: {0}, info: {1}", this, info); if (_state.ProcessSubscriptionInfo(info) != null) { this.NotifySubscriptionInfo(info); return(true); } return(false); }
public State ProcessSubscriptionInfo(RtmSubscriptionInfo info) { Log.V("Processing subscription info, state: {0}, info: {1}", this, info); if (IsSubscribed) { if (_awaiter.IsCompleted) { Log.V("Subscription info ignored because state is completed, state: {0}, info: {1}", this, info); return(null); } if (_fsm.IsTrackPosition && !string.IsNullOrEmpty(info.Position)) { _fsm.Position = info.Position; } return(this); } Log.V("Subscription info ignored because state is not subscribed state, state: {0}, info: {1}", this, info); return(null); }
public void OnSubscriptionInfo(ISubscription subscription, RtmSubscriptionInfo info) { _observers.NotifySubscriptionInfo(subscription, info); }
void ISubscriptionObserver.OnSubscriptionInfo(ISubscription subscription, RtmSubscriptionInfo info) { OnSubscriptionInfo.InvokeSafe(subscription, info); }
public static void NotifySubscriptionInfo(this SubscriptionFuture future, RtmSubscriptionInfo info) { future?.Observer.NotifySubscriptionInfo(future, info); }
public static void NotifySubscriptionInfo(this IEnumerable <ISubscriptionObserver> observers, ISubscription subscription, RtmSubscriptionInfo info) { if (observers == null) { return; } foreach (var observer in observers) { try { observer.OnSubscriptionInfo(subscription, info); } catch (Exception ex) { UnhandledExceptionWatcher.Swallow(ex); } } }
public static void NotifySubscriptionInfo(this ISubscriptionObserver observer, ISubscription subscription, RtmSubscriptionInfo info) { if (observer != null) { observer.OnSubscriptionInfo(subscription, info); } }