public Push Leave(TimeSpan?timeout = null) { _rejoinTimer?.Reset(); _joinPush.CancelTimeout(); State = ChannelState.Leaving; void TriggerClose() { if (Socket.HasLogger()) { Socket.Log(LogLevel.Debug, "channel", $"leave {Topic}"); } Trigger(Message.InBoundEvent.Close); } var leaveEvent = Message.OutBoundEvent.Leave.Serialized(); var leavePush = new Push(this, leaveEvent, null, timeout ?? _timeout); leavePush .Receive(ReplyStatus.Ok, _ => TriggerClose()) .Receive(ReplyStatus.Timeout, _ => TriggerClose()); leavePush.Send(); if (!CanPush()) { leavePush.Trigger(ReplyStatus.Ok); } return(leavePush); }