Esempio n. 1
0
        internal void SetChannelState(ChannelState state, ErrorInfo error = null, ProtocolMessage protocolMessage = null)
        {
            if (Logger.IsDebug)
            {
                var errorMessage = error != null ? "Error: " + error : "";
                Logger.Debug($"#{Name}: Changing state to: '{state}'. {errorMessage}");
            }

            OnError(error);
            var previousState = State;

            HandleStateChange(state, error, protocolMessage);

            //Notify internal clients on the Managed thread
            InternalStateChanged.Invoke(this, new ChannelStateChange(state, previousState, error));

            //Notify external client using the thread they subscribe on
            RealtimeClient.NotifyExternalClients(() =>
            {
                var args = new ChannelStateChange(state, previousState, error);
                try
                {
                    StateChanged.Invoke(this, args);
                }
                catch (Exception ex)
                {
                    Logger.Error($"Error notifying event handlers for state change: {state}", ex);
                }

                Emit(state, args);
            });
        }
Esempio n. 2
0
        internal void OnMessage(Message message)
        {
            foreach (var handler in _handlers.GetHandlers())
            {
                var loopHandler = handler;
                RealtimeClient.NotifyExternalClients(() => loopHandler.SafeHandle(message));
            }

            if (message.Name.IsNotEmpty())
            {
                foreach (var specificHandler in _handlers.GetHandlers(message.Name))
                {
                    var loopHandler = specificHandler;
                    RealtimeClient.NotifyExternalClients(() => loopHandler.SafeHandle(message));
                }
            }
        }
Esempio n. 3
0
        internal void UpdateState(ConnectionStateBase state)
        {
            if (state.State == State)
            {
                return;
            }

            if (Logger.IsDebug)
            {
                Logger.Debug($"Connection notifying subscribers for state change `{state.State}`");
            }

            var oldState = ConnectionState.State;
            var newState = state.State;

            ConnectionState = state;
            ErrorReason     = state.Error;
            var stateChange = new ConnectionStateChange(oldState, newState, state.RetryIn, ErrorReason);

            var internalHandlers = Volatile.Read(ref InternalStateChanged);   //Make sure we get all the subscribers on all threads
            var externalHandlers = Volatile.Read(ref ConnectionStateChanged); //Make sure we get all the subscribers on all threads

            internalHandlers(this, stateChange);

            RealtimeClient.NotifyExternalClients(() =>
            {
                try
                {
                    externalHandlers(this, stateChange);
                }
                catch (Exception ex)
                {
                    Logger.Error("Error notifying Connection state changed handlers", ex);
                }

                Emit(newState, stateChange);
            });
        }
Esempio n. 4
0
        internal void NotifyUpdate(ConnectionStateChange stateChange)
        {
            var externalHandlers =
                Volatile.Read(ref ConnectionStateChanged); // Make sure we get all the subscribers on all threads

            var internalHandlers = Volatile.Read(ref InternalStateChanged);

            internalHandlers(this, stateChange);

            RealtimeClient.NotifyExternalClients(
                () =>
            {
                Emit(stateChange.Event, stateChange);
                try
                {
                    externalHandlers?.Invoke(this, stateChange);
                }
                catch (Exception ex)
                {
                    Logger.Error("Error notifying Connection state changed handlers", ex);
                }
            });
        }
Esempio n. 5
0
        public void OnError(ErrorInfo error)
        {
            ErrorReason = error; //Set or clear the error

            RealtimeClient.NotifyExternalClients(() => Error.Invoke(this, new ChannelErrorEventArgs(error)));
        }