Пример #1
0
        /// <summary>
        ///   Invoked when a router gets a message.
        /// </summary>
        /// <param name="sender">
        ///   The <see cref="IMessageRouter"/>.
        /// </param>
        /// <param name="msg">
        ///   The message.
        /// </param>
        /// <remarks>
        ///   Invokes any topic handlers and publishes the messages on the other routers.
        /// </remarks>
        void Router_MessageReceived(object sender, PublishedMessage msg)
        {
            ++MesssagesReceived;

            // Check for duplicate message.
            if (tracker.RecentlySeen(msg.MessageId))
            {
                ++DuplicateMesssagesReceived;
                return;
            }

            // Call local topic handlers.
            var handlers = topicHandlers.Values
                           .Where(th => msg.Topics.Contains(th.Topic));

            foreach (var handler in handlers)
            {
                try
                {
                    handler.Handler(msg);
                }
                catch (Exception e)
                {
                    log.Error($"Topic handler for '{handler.Topic}' failed.", e);
                }
            }

            // Tell other message routers.
            _ = Task.WhenAll(Routers
                             .Where(r => r != sender)
                             .Select(r => r.PublishAsync(msg, CancellationToken.None))
                             );
        }
Пример #2
0
        public void DataStream()
        {
            var msg = new PublishedMessage {
                DataBytes = new byte[] { 1 }
            };

            Assert.AreEqual(1, msg.DataStream.ReadByte());
        }
Пример #3
0
        /// <inheritdoc />
        public Task PublishAsync(PublishedMessage message, CancellationToken cancel)
        {
            cancel.ThrowIfCancellationRequested();

            if (!tracker.RecentlySeen(message.MessageId))
            {
                MessageReceived?.Invoke(this, message);
            }

            return(Task.CompletedTask);
        }
Пример #4
0
        public void MessageID_Is_Unique()
        {
            var a = new PublishedMessage
            {
                Topics         = new string[] { "topic" },
                Sender         = self,
                SequenceNumber = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 },
                DataBytes      = new byte[] { 0, 1, 0xfe, 0xff }
            };
            var b = new PublishedMessage
            {
                Topics         = new string[] { "topic" },
                Sender         = other,
                SequenceNumber = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 },
                DataBytes      = new byte[] { 0, 1, 0xfe, 0xff }
            };

            Assert.AreNotEqual(a.MessageId, b.MessageId);
        }
Пример #5
0
        /// <inheritdoc />
        public Task PublishAsync(PublishedMessage message, CancellationToken cancel)
        {
            if (tracker.RecentlySeen(message.MessageId))
                return Task.CompletedTask;

            // Find a set of peers that are interested in the topic(s).
            // Exclude author and sender
            var peers = message.Topics
                .SelectMany(topic => RemoteTopics.GetPeers(topic))
                .Where(peer => peer != message.Sender)
                .Where(peer => peer != message.Forwarder);

            // Forward the message.
            var forward = new PubSubMessage
            {
                PublishedMessages = new PublishedMessage[] { message }
            };

            return SendAsync(forward, peers, cancel);
        }
Пример #6
0
        public void RoundTrip()
        {
            var a = new PublishedMessage
            {
                Topics         = new string[] { "topic" },
                Sender         = self,
                SequenceNumber = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 },
                DataBytes      = new byte[] { 0, 1, 0xfe, 0xff }
            };
            var ms = new MemoryStream();

            Serializer.Serialize(ms, a);
            ms.Position = 0;
            var b = Serializer.Deserialize <PublishedMessage>(ms);;

            CollectionAssert.AreEqual(a.Topics.ToArray(), b.Topics.ToArray());
            Assert.AreEqual(a.Sender, b.Sender);
            CollectionAssert.AreEqual(a.SequenceNumber, b.SequenceNumber);
            CollectionAssert.AreEqual(a.DataBytes, b.DataBytes);
            Assert.AreEqual(a.DataBytes.Length, a.Size);
            Assert.AreEqual(b.DataBytes.Length, b.Size);
        }
Пример #7
0
 public void CidNotSupported()
 {
     var _ = new PublishedMessage().Id;
 }