public async Task <IActorResult> GetInternalRoutes(IMessage _) { var routes = internalRoutingTable.GetAllRoutes(); var response = new InternalRoutesMessage { MessageHubs = routes.MessageHubs .Select(mh => new ReceiverRegistration { Identity = mh.MessageHub.Identity, LocalRegistration = mh.LocalRegistration }) .ToList(), MessageRoutes = routes.Actors .Select(mr => new MessageRegistration { Message = new MessageContract { Identity = mr.Message.Identity, Partition = mr.Message.Partition, Version = mr.Message.Version }, Actors = mr.Actors .Select(a => a.Identity) .ToList() }) .ToList() }; return(new ActorResult(Message.Create(response))); }
public void RegisterOwnGlobalRoutes(string domain) { var routes = internalRoutingTable.GetAllRoutes(); var contracts = GetActorRoutes(domain, routes).Concat(GetMessageHubRoutes(routes)) .ToList(); if (contracts.Any()) { clusterServices.GetClusterMonitor().RegisterSelf(contracts, domain); } }
public void Handle(IMessage message, ISocket _) { if (securityProvider.DomainIsAllowed(message.Domain)) { message.As <Message>().VerifySignature(securityProvider); var payload = message.GetPayload <DiscoverMessageRouteMessage>(); var internalRoutes = internalRoutingTable.GetAllRoutes(); var messageRoutes = new List <Cluster.MessageRoute>(); if (payload.ReceiverIdentity.IsMessageHub()) { messageRoutes.AddRange(internalRoutes.MessageHubs .Where(mh => !mh.LocalRegistration && mh.MessageHub.Equals(new ReceiverIdentifier(payload.ReceiverIdentity))) .Select(mh => new Cluster.MessageRoute { Receiver = mh.MessageHub })); } else { var messageContract = new MessageIdentifier(payload.MessageContract.Identity, payload.MessageContract.Version, payload.MessageContract.Partition); messageRoutes.AddRange(internalRoutes.Actors .Where(r => r.Message.Equals(messageContract)) .SelectMany(r => r.Actors .Where(a => !a.LocalRegistration) .Select(a => new Cluster.MessageRoute { Receiver = a, Message = messageContract }))); } foreach (var messageRoute in messageRoutes) { var domains = messageRoute.Receiver.IsMessageHub() ? securityProvider.GetAllowedDomains() : new[] { securityProvider.GetDomain(messageRoute.Message.Identity) }; if (domains.Contains(message.Domain)) { clusterMonitor.RegisterSelf(messageRoute.ToEnumerable(), message.Domain); } else { logger.Warn($"MessageIdentity {messageRoute.Message} doesn't belong to requested Domain {message.Domain}!"); } } } }