public async Task Send(BitmexWebsocketChannel toChannel, MultiplexingMessageBase multiplexingMessage)
        {
            var message = new List <object>
            {
                (int)multiplexingMessage.MessageType,
                toChannel.ChannelId,
                toChannel.ChannelName
            };

            if (multiplexingMessage.Payload != null)
            {
                message.Add(multiplexingMessage.Payload);
            }

            var serialized = BitmexJsonSerializer.Serialize(message);

            try
            {
                await _communicator.Send(serialized).ConfigureAwait(false);
            }
            catch (Exception e)
            {
                Log.Error(e, L($"Exception while sending message '{serialized}'. Error: {e.Message}"));
                throw;
            }
        }
        /// <summary>
        /// Creates a channel.
        /// </summary>
        /// <param name="channelName">Name of the channel.</param>
        /// <returns></returns>
        /// <exception cref="BitmexException">Couldn't add the channel with Id = {channel.ChannelId}.</exception>
        public async Task <BitmexWebsocketChannel> CreateChannel(string channelName)
        {
            var channel = new BitmexWebsocketChannel(GetNonExistentChannelId(), channelName);

            if (!_channels.TryAdd(channel.ChannelId, channel))
            {
                Log.Error($"Exception while creating a channel with Id = {channel.ChannelId}");
                throw new BitmexException($"Couldn't add the channel with Id = {channel.ChannelId}.");
            }

            await Send(channel, new MultiplexingMessageBase
            {
                MessageType = MultiplexingMessageType.Subscribe
            });

            channelSubject.OnNext(channel);
            return(channel);
        }