예제 #1
0
 public RemoteMessage(IMessage message, Aid to, WireMessageId messageId)
 {
     _to        = to ?? Aid.Unknown;
     _message   = message ?? Actors.Message.Empty;
     _messageId = messageId ?? WireMessageId.Next();
     _isFuture  = _message is IFutureMessage;
 }
예제 #2
0
        public static WireMessage ToWireMessage(this Exception exception, Aid from, Aid to, WireMessageId id = null)
        {
            var faulted = (exception != null);

            var state = WireMessageState.Empty;

            state |= faulted ? WireMessageState.Faulted : WireMessageState.Canceled;

            return(new WireMessage
            {
                From = from,
                To = to,
                Exception = exception,
                MessageType = faulted ? MessageType.FutureError : MessageType.FutureResponse,
                Id = id ?? WireMessageId.Next(),
                State = state
            });
        }
예제 #3
0
        public static WireMessage ToWireMessage(this IMessage message, Aid to, WireMessageId id = null, Exception exception = null)
        {
            var result = new WireMessage {
                To = to, Id = id ?? WireMessageId.Next()
            };

            if (message != null)
            {
                result.MessageType = message.MessageType;
                result.From        = message.From;
                result.Data        = message.Data;
                result.TimeoutMSec = message.TimeoutMSec;

                var msgHeader   = message.Header;
                var headerCount = msgHeader?.Count ?? 0;

                if (headerCount > 0)
                {
                    var header = new Dictionary <string, string>(headerCount);
                    foreach (var kv in msgHeader)
                    {
                        header.Add(kv.Key, kv.Value);
                    }
                    result.Header = header;
                }

                var state = WireMessageState.Default;
                if (message.IsEmpty)
                {
                    state |= WireMessageState.Empty;
                }

                if (message is IFutureMessage future)
                {
                    if (future.IsCanceled)
                    {
                        state |= WireMessageState.Canceled;
                    }

                    if (future.IsCompleted)
                    {
                        state |= WireMessageState.Completed;
                    }

                    if (future.IsFaulted)
                    {
                        state |= WireMessageState.Faulted;
                    }
                }

                if (exception != null)
                {
                    result.Exception = exception;
                    state           |= WireMessageState.Faulted;
                }
                else if (message is IFutureError error)
                {
                    result.Exception = error.Exception;
                    state           |= WireMessageState.Faulted;
                }

                result.State = state;
            }
            return(result);
        }
예제 #4
0
 internal RemoteRequest(IFutureMessage message, Aid to,
                        Action <object, TaskCompletionStatus> onTimeout)
     : base(message, to, WireMessageId.Next())
 {
     _onTimeout += onTimeout;
 }