public virtual IObservable<OperationResponse> OpCustomAsync(byte customOpCode, Dictionary<byte, object> customOpParameters, bool sendReliable, byte channelId = 0, bool encrypt = false)
{
ValidateDisposed();
var msgId = Interlocked.Increment(ref messageId);
var future = Listener.IssueOperationResponseFuture(msgId);
customOpParameters[ReservedMessageIdKey] = msgId;
opCustomPublisher.OnNext(customOpParameters);
var beforeStatusCode = Listener.LastStatusCode;
if (!base.OpCustom(customOpCode, customOpParameters, sendReliable, channelId, encrypt))
{
AsyncSubject<OperationResponse> _future;
Listener.TryGetAndRemoveFuture(msgId, out _future);
future.OnError(new Exception(string.Format("Can't send message. BeforeStatusCode:{0} AfterStatusCode:{1}", beforeStatusCode, Listener.LastStatusCode)));
return future.AsObservable();
}
return future.Timeout(Timeout).Do(_ => { }, ex =>
{
if (ex is TimeoutException)
{
AsyncSubject<OperationResponse> removeTarget;
Listener.TryGetAndRemoveFuture(msgId, out removeTarget);
}
});
}