public Task <object> Request(object requestMessage)
        {
            Hub.ProtoExtensions.Request r;
            lock (reqRnd)
            {
                r = new Request
                {
                    Payload   = requestMessage,
                    RequestId = $"{mode}_{reqRnd.Next(25000)}_{DateTime.Now.Ticks}",
                    Identity  = (userProvider?.CurrentIdentity != null) ? JsonHelper.ToJsonStrongTyped(userProvider.CurrentIdentity) : null
                };
            }

            return(AsyncExtensions.CancelAfterAsync((c) =>
            {
                OperationWaitHandle wh = new OperationWaitHandle();
                waitingOperations.TryAdd(r.RequestId, wh);
                try
                {
                    Write(r);
                }
                catch (Exception ex)
                {
                    waitingOperations.TryRemove(r.RequestId, out _);
                    if (!wh.ServerResponse.Task.IsCompleted)
                    {
                        wh.ServerResponse.SetException(ex);
                    }
                }

                return wh.ServerResponse.Task;
            }, TimeSpan.FromSeconds(10), t =>
            {
                waitingOperations.TryRemove(r.RequestId, out _);
            }));
        }