Example #1
0
        public async Task HandleMessage(Guid clientId, NanoPublishMessage nanoPublishMessage)
        {
            var         tasks          = new List <Task>();
            NanoMessage publishMessage = null;

            List <NanoHandler> nanoSubscribers;


            if (nanoPublishMessage.NanoDocumentId != NanoDocumentId.Empty)
            {
                if (_handlersByDocumentId.TryGetValue(nanoPublishMessage.NanoDocumentId, out nanoSubscribers))
                {
                    publishMessage = nanoPublishMessage.ToNewPublishMessage();
                    //TODO: find a solution elliminating where condition...
                    tasks.AddRange(nanoSubscribers.AsSnapshot().Where(a => a.ClientId != clientId).Select(subscriber => subscriber.HandleMessageAsync(publishMessage)));
                }
            }
            if (_handlersByDocumentId.TryGetValue(NanoDocumentId.Empty, out nanoSubscribers))
            {
                publishMessage = publishMessage ?? nanoPublishMessage.ToNewPublishMessage();
                //TODO: find a solution elliminating where condition...
                tasks.AddRange(nanoSubscribers.AsSnapshot().Where(a => a.ClientId != clientId).Select(subscriber => subscriber.HandleMessageAsync(publishMessage)));
            }

            await TaskHelpers.Iterate(tasks);
        }
Example #2
0
        public async Task PublishAsync <TMessage>(TMessage message) where TMessage : IDomainMessage <TDocument>
        {
            var nanoMessage = NanoMessage.CreatePublishMessage <TDocument, TMessage>(NanoBusClient.ClientId, message, false);

            EnqueueMessage(nanoMessage);

            //distribute local callbacks without server roundtrip
            await Task.Run(() => NanoBusClient.DistributePublishMessageAsync(nanoMessage.PublishMessage).ConfigureAwait(false));
        }
Example #3
0
        private async Task OnReceivedNanoMessageAsync(NanoMessage nanoMessage)
        {
            Interlocked.Increment(ref _rxCount);

            if (nanoMessage.PublishMessage != null)
            {
                await OnReceivedPublishMessageAsync(nanoMessage.PublishMessage);
            }

            if (nanoMessage.IsAckRequested)
            {
                EnqueueMessage(nanoMessage.CreateAckMessage(0));
            }
        }
Example #4
0
        private INanoSubscription CreateSubscription <TMessage>(NanoSubsciptionKey subscriptionKey) where TMessage : IDomainMessage <TDocument>
        {
            if (_messageTypeMap.TryAdd(typeof(TMessage).FullName, typeof(TMessage)))
            {
                var subscription = new NanoSubscription <TDocument, TMessage>();
                var nanoMessage  = NanoMessage.CreateSubscribeMessage <TDocument, TMessage>(NanoBusClient.ClientId, subscriptionKey.NanoDocumentId);
                EnqueueMessage(nanoMessage);

                return(subscription);
            }
            ;

            throw new InvalidOperationException();
        }
Example #5
0
        private async Task OnNanoMessageAsync(NanoMessage nanoMessage)
        {
            Interlocked.Increment(ref _rxCount);

            if (nanoMessage.PublishMessage != null)
            {
                await PublishAsync(nanoMessage.ClientId, nanoMessage.PublishMessage).ConfigureAwait(false);
            }
            if (nanoMessage.SubscribeMessage != null)
            {
                Subscribe(nanoMessage.ClientId, nanoMessage.SubscribeMessage);
            }

            if (nanoMessage.IsAckRequested)
            {
                EnqueueMessage(nanoMessage.CreateAckMessage(0));
            }
        }
Example #6
0
 public Task HandleMessageAsync(NanoMessage nanoMessage)
 {
     return(_onMessage(nanoMessage));
 }
Example #7
0
 public void EnqueueMessage(NanoMessage nanoMessage)
 {
     _txQueue.Enqueue(nanoMessage);
     _txEvent.Set();
 }
Example #8
0
 private Task EnqueueMessageAsync(NanoMessage message)
 {
     EnqueueMessage(message);
     return(TaskHelpers.Completed());
 }
Example #9
0
 private void EnqueueMessage(NanoMessage nanoMessage)
 {
     _nanoBusClient.NanoConnections.Next().EnqueueMessage(nanoMessage);
 }