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); }); }
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)); } } }
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); }); }
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); } }); }
public void OnError(ErrorInfo error) { ErrorReason = error; //Set or clear the error RealtimeClient.NotifyExternalClients(() => Error.Invoke(this, new ChannelErrorEventArgs(error))); }