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);
}