Example #1
0
 public override void OnCreated()
 {
     Log = LogManager.GetLogger(string.Format("ChatClient<NetId:{0}>", Channel.Id));
     SetHandler <IChatLogin>(this);
     DisconnectedEvent.Subscribe(OnDisconnectAsync);
     Log.Info("connected");
 }
Example #2
0
        /// <summary>
        /// Create a rx mqtt client based on a <see cref="IManagedMqttClient"/>.
        /// </summary>
        /// <param name="managedMqttClient">The manged mqtt client.</param>
        /// <param name="logger">The mqtt net logger.</param>
        /// <remarks>
        /// Use the <see cref="MqttFactoryExtensions.CreateRxMqttClient(IMqttFactory)"/> or
        /// <see cref="MqttFactoryExtensions.CreateRxMqttClient(IMqttFactory, IMqttNetLogger)"/>
        /// factory methods to crate the client.
        /// </remarks>
        /// <exception cref="ArgumentNullException"></exception>
        public RxMqttClient(IManagedMqttClient managedMqttClient, IMqttNetLogger logger)
        {
            InternalClient = managedMqttClient ?? throw new ArgumentNullException(nameof(managedMqttClient));
            if (logger == null)
            {
                throw new ArgumentNullException(nameof(logger));
            }

            this.logger            = logger.WithSource(nameof(RxMqttClient));
            topicSubscriptionCache = new Dictionary <string, IObservable <MqttApplicationMessageReceivedEventArgs> >();

            var cancelationSubject = new Subject <Unit>();

            ConnectedEvent = CrateFromHandler <MqttClientConnectedEventArgs>(observer =>
            {
                managedMqttClient.UseConnectedHandler(args => observer.OnNext(args));
                return(Disposable.Create(() => managedMqttClient.ConnectedHandler = null));
            });

            DisconnectedEvent = CrateFromHandler <MqttClientDisconnectedEventArgs>(observer =>
            {
                managedMqttClient.UseDisconnectedHandler(args => observer.OnNext(args));
                return(Disposable.Create(() => managedMqttClient.DisconnectedHandler = null));
            });

            ConnectingFailedEvent = CrateFromHandler <ManagedProcessFailedEventArgs>(observer =>
            {
                managedMqttClient.ConnectingFailedHandler = new ConnectingFailedHandlerDelegate(args => observer.OnNext(args));
                return(Disposable.Create(() => managedMqttClient.ConnectingFailedHandler = null));
            });

            SynchronizingSubscriptionsFailedEvent = CrateFromHandler <ManagedProcessFailedEventArgs>(observer =>
            {
                managedMqttClient.SynchronizingSubscriptionsFailedHandler = new SynchronizingSubscriptionsFailedHandlerDelegate(args => observer.OnNext(args));
                return(Disposable.Create(() => managedMqttClient.SynchronizingSubscriptionsFailedHandler = null));
            });

            ApplicationMessageProcessedEvent = CrateFromHandler <ApplicationMessageProcessedEventArgs>(observer =>
            {
                managedMqttClient.ApplicationMessageProcessedHandler = new ApplicationMessageProcessedHandlerDelegate(args => observer.OnNext(args));
                return(Disposable.Create(() => managedMqttClient.ApplicationMessageReceivedHandler = null));
            });

            ApplicationMessageSkippedEvent = CrateFromHandler <ApplicationMessageSkippedEventArgs>(observer =>
            {
                managedMqttClient.ApplicationMessageSkippedHandler = new ApplicationMessageSkippedHandlerDelegate(args => observer.OnNext(args));
                return(Disposable.Create(() => managedMqttClient.ApplicationMessageReceivedHandler = null));
            });

            Connected = Observable
                        .Create <bool>(observer =>
            {
                var connected    = ConnectedEvent.Subscribe(_ => observer.OnNext(true));
                var disconnected = DisconnectedEvent.Subscribe(_ => observer.OnNext(false));
                return(new CompositeDisposable(connected, disconnected));
            })
                        .TakeUntil(cancelationSubject) // complete on dispose
                        .Prepend(IsConnected)          // start with current state
                        .Append(false)                 // finish with false
                        .Replay(1)                     // replay last state on subscribe
                        .RefCount();                   // count subscriptions and dispose source observable when no subscription

            applicationMessageReceived = CrateFromHandler <MqttApplicationMessageReceivedEventArgs>(observer =>
            {
                managedMqttClient.UseApplicationMessageReceivedHandler(args => observer.OnNext(args));
                return(Disposable.Create(() => managedMqttClient.ApplicationMessageReceivedHandler = null));
            });

            IObservable <T> CrateFromHandler <T>(Func <IObserver <T>, IDisposable> func)
            {
                return(Observable.Create(func)
                       .TakeUntil(cancelationSubject) // complete on dispose
                       .Publish()                     // publish from on source observable
                       .RefCount());                  // count subscriptions and dispose source observable when no subscription
            }

            cleanUp = Disposable.Create(() =>
            {
                cancelationSubject.OnNext(Unit.Default);    // complete all observers
                cancelationSubject.Dispose();
                try { managedMqttClient.Dispose(); }
                catch { }
            });
        }