/// <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)) ); }
public void DataStream() { var msg = new PublishedMessage { DataBytes = new byte[] { 1 } }; Assert.AreEqual(1, msg.DataStream.ReadByte()); }
/// <inheritdoc /> public Task PublishAsync(PublishedMessage message, CancellationToken cancel) { cancel.ThrowIfCancellationRequested(); if (!tracker.RecentlySeen(message.MessageId)) { MessageReceived?.Invoke(this, message); } return(Task.CompletedTask); }
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); }
/// <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); }
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); }
public void CidNotSupported() { var _ = new PublishedMessage().Id; }