public void Append(ElasticAddress peer) { lock (_peers) { _peers[peer.Address] = peer; } }
private void OnTcpServerMessage(ITcpSession session, byte[] data) { Message message = Message.Parse(data); // Logger.trace($"OnTcpServerMessage(): message={message}"); // should route this message? if (message.ShouldRoute()) { OnElasticMessage(message); return; } // message sender Address sender = message.Sender; // authorized peer? ElasticAddress peer = Peers.Find(sender); if (ReferenceEquals(peer, null)) { Logger.warning($"Unauthorized peer!"); return; } // valid sign? if (!message.Verify(sender)) { Logger.warning($"Peer signature not verified!"); return; } // message handler invoke OnMessage?.Invoke(peer, message); }
public void SendToAsync(byte[] data, ElasticAddress peer) { Task.Factory.StartNew(() => { SendTo(data, peer); }); }
public static bool Contains(this ElasticAddress[] peers, ElasticAddress peer) { foreach (var p in peers) { if (peer.Address == p.Address) { return(true); } } return(false); }
public static ElasticAddress Pick(this ElasticAddress[] peers, ElasticAddress me) { if (peers.Length == 0) { return(default(ElasticAddress)); } if (peers.Contains(me)) { return(me); } return(peers[RndProvider.Next(peers.Length)]); }
public ElasticNode(IConfiguration configuration, ILoggable logger, IPeerList peers, PrivateKey nodeKey, ElasticAddress localEndPoint) { Configuration = configuration; Logger = logger; NodeKey = nodeKey; LocalEndPoint = localEndPoint; Peers = peers; TcpServer = new TcpServer() { OnStart = OnTcpServerStart, OnStop = OnTcpServerStop, OnAccept = OnTcpServerAccept, OnClose = OnTcpServerClose, OnMessage = OnTcpServerMessage }; }
public static string Ellipsis(this ElasticAddress peer, int head, int tail) { return($"{ElasticAddress.PREFIX}{peer.HexAddress.Ellipsis(head, tail)}@{peer.Host}:{peer.Port}"); }
public static string Ellipsis(this ElasticAddress peer, int head) { return(Ellipsis(peer, head, 0)); }
public static string Ellipsis(this ElasticAddress peer) { return(Ellipsis(peer, 6, 6)); }
public bool Exists(ElasticAddress peer) { return(Exists(peer.Address)); }
public void Remove(ElasticAddress peer) { Remove(peer.Address); }
public bool SendTo(Message message, ElasticAddress peer) { return(SendTo(message.ToBytes(), peer)); }
public bool SendTo(byte[] data, ElasticAddress peer) { return(SendTo(data, peer.Host, peer.Port)); }