public RemoteDeliver(Proto.MessageHeader header, object message, PID target, PID sender, int serializerId) { Header = header; Message = message; Target = target; Sender = sender; SerializerId = serializerId; }
public override async Task Receive(IAsyncStreamReader <MessageBatch> requestStream, IServerStreamWriter <Unit> responseStream, ServerCallContext context) { var targets = new PID[100]; await requestStream.ForEachAsync(batch => { if (_suspended) { return(Actor.Done); } //only grow pid lookup if needed if (batch.TargetNames.Count > targets.Length) { targets = new PID[batch.TargetNames.Count]; } for (int i = 0; i < batch.TargetNames.Count; i++) { targets[i] = new PID(ProcessRegistry.Instance.Address, batch.TargetNames[i]); } var typeNames = batch.TypeNames.ToArray(); foreach (var envelope in batch.Envelopes) { var target = targets[envelope.Target]; var typeName = typeNames[envelope.TypeId]; var message = Serialization.Deserialize(typeName, envelope.MessageData, envelope.SerializerId); if (message is Terminated msg) { var rt = new RemoteTerminate(target, msg.Who); EndpointManager.RemoteTerminate(rt); } else if (message is SystemMessage sys) { target.SendSystemMessage(sys); } else { Proto.MessageHeader header = null; if (envelope.MessageHeader != null) { header = new Proto.MessageHeader(); foreach (var(k, v) in envelope.MessageHeader.HeaderData) { header.Add(k, v); } } var localEnvelope = new Proto.MessageEnvelope(message, envelope.Sender, header); target.Tell(localEnvelope); } } return(Actor.Done); }); }
private void ReceiveMessages(MessageEnvelope envelope, object message, PID target) { Proto.MessageHeader?header = null; if (envelope.MessageHeader is not null) { header = new Proto.MessageHeader(envelope.MessageHeader.HeaderData); } // Logger.LogDebug("[EndpointReader] Forwarding remote user message {@Message}", message); var localEnvelope = new Proto.MessageEnvelope(message, envelope.Sender, header); _system.Root.Send(target, localEnvelope); }
public override async Task ConnectClient(IAsyncStreamReader <ClientMessageBatch> requestStream, IServerStreamWriter <MessageBatch> responseStream, ServerCallContext context) { _logger.LogDebug($"Spawning Client EndpointWriter"); _logger.LogDebug($"Request headers count is {context.RequestHeaders.Count} - {context.RequestHeaders.Select(entry => entry.Key + ":" + entry.Value).Aggregate((acc, value) => acc + "," + value)}"); var clientIdHeader = context.RequestHeaders.FirstOrDefault(entry => entry.Key == "clientid"); var clientId = clientIdHeader?.Value; if (clientId == null) { clientId = Guid.NewGuid().ToString(); _logger.LogWarning($"clientId header is not set - generating random client id {clientId}"); } var clientHostEndpointWriter = await SpawnClientHostEndpointWriter(responseStream, clientId); try { while (await requestStream.MoveNext()) { var clientMessageBatch = requestStream.Current; var targetAddress = clientMessageBatch.Address; _logger.LogDebug($"Received Batch for {targetAddress}"); foreach (var envelope in clientMessageBatch.Batch.Envelopes) { var message = Serialization.Deserialize(clientMessageBatch.Batch.TypeNames[envelope.TypeId], envelope.MessageData, envelope.SerializerId); _logger.LogDebug($"Batch Message {message.GetType()}"); var target = new PID(targetAddress, clientMessageBatch.Batch.TargetNames[envelope.Target]); _logger.LogDebug($"Target is {target}"); //Forward the message to the correct endpoint Proto.MessageHeader header = null; if (envelope.MessageHeader != null) { header = new Proto.MessageHeader(envelope.MessageHeader.HeaderData); } var forwardingEnvelope = new Proto.MessageEnvelope(message, envelope.Sender, header); _logger.LogDebug($"Sending message {message.GetType()} to target {target} from {envelope.Sender}"); RootContext.Empty.Send(target, forwardingEnvelope); } } _logger.LogDebug("Finished Request Stream - stopping connection manager"); await clientHostEndpointWriter.PoisonAsync(); _logger.LogDebug("Client Endpoint manager shut down"); } catch (Exception ex) { _logger.LogCritical(ex, "Exception on Client Host"); throw ex; } }