/// <summary>
        /// Transport a <see cref="QueuedMessage"/>.
        /// </summary>
        /// <param name="message">The <see cref="IMessage"/> to transport.</param>
        /// <returns>An awaitable object representing the send operation.</returns>
        public async Task SendMessageAsync(QueuedMessage message)
        {
            try
            {
                var recipient = message.Envelope.Recipient as FtpPeer;

                if (recipient == null)
                {
                    throw new InvalidOperationException("The FTP Transporter cannot send a message to a non FtpPeer.");
                }

                var clientConnectTask = this._clientFactory.ConnectAsync(recipient);

                var messageContent = this.Serialiser.Serialise(message.Envelope);

                var client = await clientConnectTask;

                await client.SendMessageAsync(messageContent);

                this.MessageSent(message, messageContent);
            }
            catch (Exception exception)
            {
                if (this.MessageFailedToSend != null)
                {
                    this.MessageFailedToSend(exception, message);
                }
            }
        }
 public void BroadcastMessageSent(QueuedMessage sentMessage)
 {
     this.Clients.All.messageSent(sentMessage);
 }
 public void BroadcastMessageQueued(QueuedMessage queuedMessage)
 {
     this.Clients.All.messageQueued(queuedMessage);
 }