Example #1
0
        public void ReplySuccess()
        {
            RPCPacket response = new RPCPacket();

            response.Status = (short)StatusCode.SUCCESS;
            ReplyPacket(response);
        }
Example #2
0
        public void Reply(params object[] data)
        {
            RPCPacket response = new RPCPacket();

            response.Data = data;
            ReplyPacket(response);
        }
Example #3
0
        private void OnSubscribe(RPCPacket packet)
        {
            var path = packet.Url.SubRightWith('/', out string action);
            var item = GetPublisher(action);

            item.Add(packet.Session);
            packet.ReplySuccess();
        }
Example #4
0
        public void Reply(params object[] data)
        {
            RPCPacket response = new RPCPacket();

            response.Status = (short)StatusCode.SUCCESS;
            response.Data   = data;
            ReplyPacket(response);
        }
Example #5
0
        public void ReplyError(short status, string message)
        {
            RPCPacket response = new RPCPacket();

            response.Status = status;
            response.Data   = new string[] { message };
            ReplyPacket(response);
        }
Example #6
0
        public void ReplyError(string message)
        {
            RPCPacket response = new RPCPacket();

            response.Status = (short)StatusCode.INNER_ERROR;
            response.Data   = new string[] { message };
            ReplyPacket(response);
        }
Example #7
0
        internal Task <RPCPacket> SendWait(RPCPacket request, ISession session, Type[] resultTypes)
        {
            var result = AwaiterFactory.Create(request, resultTypes, ClientTimeout);

            request.ID = result.Item1;
            session.Send(request);
            System.Threading.Interlocked.Increment(ref mRequests);
            return(result.Item2.Task);
        }
Example #8
0
        protected override Task OnVoidExecute(params object[] data)
        {
            RPCPacket packet = new RPCPacket();

            packet.NeedReply = false;
            packet.Url       = Clients.XRPCClient.DELEGATE_TAG + Name;
            packet.Data      = data;
            Server.Send(packet, new ISession[] { Session });
            return(Task.CompletedTask);
        }
Example #9
0
 public void Send(RPCPacket response, ISession[] sessions)
 {
     if (sessions != null)
     {
         foreach (var item in sessions)
         {
             System.Threading.Interlocked.Add(ref mResponses, sessions.Length);
             mServer.Send(response, sessions);
         }
     }
 }
Example #10
0
 public void ReplyPacket(RPCPacket response)
 {
     response.ID = this.ID;
     if (Sesion != null)
     {
         Sesion.Send(response);
     }
     if (Client != null)
     {
         Client.Send(response);
     }
 }
Example #11
0
        protected override void OnReceiveMessage(IServer server, ISession session, object message)
        {
            base.OnReceiveMessage(server, session, message);
            RPCPacket request = (RPCPacket)message;

            if (EnableLog(LogType.Debug))
            {
                Log(LogType.Debug, $"[{request.ID}]{session.RemoteEndPoint} receive message {request.Url}@{request.ID}");
            }
            System.Threading.Interlocked.Increment(ref mRequests);
            Server.UpdateSession(session);
            mRequestDispatchCenter.Enqueue(request);
        }
Example #12
0
            public void Completed(EventNext.IEventOutput data)
            {
                RPCPacket response = new RPCPacket();

                response.Status = (short)data.EventError;
                response.Header = data.Properties;
                response.Data   = data.Data;
                data.Token      = null;
                if (Server.EnableLog(LogType.Debug))
                {
                    string info = Newtonsoft.Json.JsonConvert.SerializeObject(data);
                    Server.Log(LogType.Debug, $"[{data.ID}]{Request.Session.RemoteEndPoint} send event data:{info}");
                }
                Server.OnResponse(Request, response);
            }
Example #13
0
        private async void InvokeDelegate(RPCPacket packet)
        {
            var path = packet.Url.SubRightWith('/', out string action);

            if (mDelegateHandlers.TryGetValue(action, out DelegateHandler handler))
            {
                try
                {
                    packet.LoadParameters(handler.Parameters);
                    object result = handler.Delegate.DynamicInvoke(packet.Data);
                    if (!handler.IsVoid)
                    {
                        await(Task) result;
                        if (handler.TargetReturnType != null)
                        {
                            var data = handler.GetValue(result);
                            packet.Reply(data);
                        }
                        else
                        {
                            packet.ReplySuccess();
                        }
                    }
                }
                catch (Exception e_)
                {
                    if (!handler.IsVoid)
                    {
                        packet.ReplyError((short)StatusCode.INNER_ERROR, $"{action} delegate invoke error {e_.Message}!");
                    }
                    if (EnableLog(LogType.Error))
                    {
                        Log(LogType.Error, $"{action} delegate invoke error {e_.Message}@{e_.StackTrace}");
                    }
                }
            }
            else
            {
                if (packet.NeedReply)
                {
                    packet.ReplyError((short)StatusCode.ACTION_NOT_FOUND, $"{action} delegate not found!");
                }
            }
        }
Example #14
0
 private void OnEventNext(RPCPacket e)
 {
     EventNext.EventInput input = new EventNext.EventInput();
     input.ID         = e.ID;
     input.EventPath  = e.Url;
     input.Properties = e.Header;
     input.Data       = e.Data;
     if (EnableLog(LogType.Debug))
     {
         string info = Newtonsoft.Json.JsonConvert.SerializeObject(input);
         Log(LogType.Debug, $"[{input.ID}]{e.Session.RemoteEndPoint} receive event data:{info}");
     }
     input.Token = new XRPCEventToken {
         Request = e, Server = this, Session = e.Session
     };
     EventCenter.Execute(input, new EventCompleted {
         Server = this, Request = e
     });
 }
Example #15
0
 protected EventPacketProcessingArgs OnProcessing(RPCPacket packet)
 {
     if (Processing != null)
     {
         try
         {
             EventPacketProcessingArgs e = new EventPacketProcessingArgs(this, packet);
             Processing(this, e);
             return(e);
         }
         catch (Exception e_)
         {
             if (EnableLog(LogType.Error))
             {
                 Log(LogType.Error, $"[{packet.ID}]{packet.Session.RemoteEndPoint} processing {packet.Url} event error {e_.Message}@{e_.StackTrace}!");
             }
         }
     }
     return(null);
 }
Example #16
0
        protected override async Task <T> OnTaskExecute <T>(params object[] data)
        {
            bool      istask = typeof(T) == typeof(RESULT_NULL);
            RPCPacket packet = new RPCPacket();

            packet.NeedReply = true;
            packet.Url       = Clients.XRPCClient.DELEGATE_TAG + Name;
            packet.Data      = data;
            var returltype = GetReturnTypes();
            var result     = await Server.SendWait(packet, Session, returltype);

            if (result.Status != (short)StatusCode.SUCCESS)
            {
                throw new XRPCException((string)result.Data[0]);
            }
            if (istask)
            {
                return((T)(object)new RESULT_NULL());
            }
            return((T)result.Data[0]);
        }
Example #17
0
        protected virtual void OnVoidExecute(params object[] data)
        {
            RPCPacket packet = new RPCPacket();

            packet.NeedReply = false;
            packet.Url       = Clients.XRPCClient.DELEGATE_TAG + Name;
            packet.Data      = data;
            var sessions = Sessions;

            foreach (var item in sessions)
            {
                if (item.IsDisposed)
                {
                    Remove(item);
                }
                else
                {
                    item.Send(packet);
                }
            }
        }
Example #18
0
        private void OnRequestProcess(RPCPacket e)
        {
            RPCPacket response = e;

            try
            {
                var evt = OnProcessing(e);
                if (evt != null && evt.Cancel)
                {
                    return;
                }
                if (this.Security)
                {
                    if (e.Session.Authentication < AuthenticationType.User && e.Url != Clients.XRPCClient.LOGIN_TAG)
                    {
                        e.ReplyError((short)StatusCode.INNER_ERROR, "No permission operation in secure mode!");
                        return;
                    }
                }
                EventNext.EventActionHandler handler = EventCenter.GetActionHandler(e.Url);
                if (handler != null)
                {
                    BindRequestParameter(e, handler);
                    OnEventNext(e);
                }
                else
                {
                    if (e.Url == "/__System/Ping")
                    {
                        response = new RPCPacket();
                        if (EnableLog(LogType.Debug))
                        {
                            Log(LogType.Debug, $"[{e.ID}]{e.Session.RemoteEndPoint} request {e.Url}");
                        }
                        response.Status = (short)StatusCode.SUCCESS;
                        OnResponse(e, response);
                    }
                    else if (e.Url == Clients.XRPCClient.LOGIN_TAG)
                    {
                        EventLoginArgs login = new EventLoginArgs(this, e.Session);
                        e.LoadParameters <string, string>();
                        login.UserName = (string)e.Data[0];
                        login.Password = (string)e.Data[1];
                        Login?.Invoke(this, login);
                        if (login.Success)
                        {
                            e.Session[NAME_PROPERTY_TAG] = login.UserName;
                            e.ReplySuccess();
                        }
                        else
                        {
                            string error = login.Message;
                            if (string.IsNullOrEmpty(error))
                            {
                                error = "Invalid username or password!";
                            }
                            e.ReplyError(error);
                        }
                    }
                    else
                    {
                        var awaitItem = AwaiterFactory.GetItem(response.ID);
                        if (awaitItem != null)
                        {
                            response.ResultType = awaitItem.ResultType;
                            try
                            {
                                if (response.ResultType != null)
                                {
                                    response.LoadParameters(response.ResultType);
                                }
                            }
                            catch (Exception e_)
                            {
                                response.Status = (short)StatusCode.INNER_ERROR;
                                response.Data   = new object[] { $"{e_.Message}@{e_.StackTrace}" };
                            }
                            AwaiterFactory.Completed(awaitItem, response);
                        }
                        else
                        {
                            if (response.Url.IndexOf(XRPCClient.DELEGATE_TAG, StringComparison.OrdinalIgnoreCase) == 0)
                            {
                                InvokeDelegate(response);
                                return;
                            }
                            if (response.Url.IndexOf(XRPCClient.SUBSCRIBE_TAG, StringComparison.OrdinalIgnoreCase) == 0)
                            {
                                OnSubscribe(response);
                                return;
                            }
                            if (NotFound == null)
                            {
                                if (EnableLog(LogType.Debug))
                                {
                                    Log(LogType.Debug, $"[{e.ID}]{e.Session.RemoteEndPoint} request {e.Url} not found!");
                                }
                                response        = new RPCPacket();
                                response.Status = (short)StatusCode.ACTION_NOT_FOUND;
                                response.Data   = new object[] { $"request {e.Url} not found!" };
                                OnResponse(e, response);
                            }
                            else
                            {
                                NotFound.Invoke(this, new Events.EventPacketArgs(this, e));
                            }
                        }
                    }
                }
            }
            catch (Exception e_)
            {
                if (EnableLog(LogType.Error))
                {
                    Log(LogType.Error, $"[{e.ID}]{e.Session.RemoteEndPoint} process {e.Url} error {e_.Message}@{e_.StackTrace}!");
                }
            }
        }
Example #19
0
 public void Reply(RPCPacket response, RPCPacket request)
 {
     OnResponse(request, response);
 }
Example #20
0
        private void OnRequestProcess(RPCPacket e)
        {
            RPCPacket response = e;

            try
            {
                EventNext.EventActionHandler handler = EventCenter.GetActionHandler(e.Url);
                if (handler != null)
                {
                    BindRequestParameter(e, handler);
                    OnEventNext(e);
                }
                else
                {
                    if (e.Url == "/__System/Ping")
                    {
                        response = new RPCPacket();
                        if (EnableLog(LogType.Debug))
                        {
                            Log(LogType.Debug, $"[{e.ID}]{e.Sesion.RemoteEndPoint} request {e.Url}");
                        }
                        response.Status = (short)StatusCode.SUCCESS;
                        OnResponse(e, response);
                    }
                    else
                    {
                        var awaitItem = AwaiterFactory.GetItem(response.ID);
                        if (awaitItem != null)
                        {
                            response.ResultType = awaitItem.ResultType;
                            try
                            {
                                if (response.ResultType != null)
                                {
                                    response.LoadParameters(response.ResultType);
                                }
                            }
                            catch (Exception e_)
                            {
                                response.Status = (short)StatusCode.INNER_ERROR;
                                response.Data   = new object[] { $"{e_.Message}@{e_.StackTrace}" };
                            }
                            AwaiterFactory.Completed(awaitItem, response);
                        }
                        else
                        {
                            if (Receive == null)
                            {
                                if (EnableLog(LogType.Debug))
                                {
                                    Log(LogType.Debug, $"[{e.ID}]{e.Sesion.RemoteEndPoint} request {e.Url} not found!");
                                }
                                response        = new RPCPacket();
                                response.Status = (short)StatusCode.ACTION_NOT_FOUND;
                                response.Data   = new object[] { $"request {e.Url} not found!" };
                                OnResponse(e, response);
                            }
                            else
                            {
                                Receive.Invoke(this, new Events.EventActionNotFoundArgs(this, e));
                            }
                        }
                    }
                }
            }
            catch (Exception e_)
            {
                if (EnableLog(LogType.Error))
                {
                    Log(LogType.Debug, $"[{e.ID}]{e.Sesion.RemoteEndPoint} request {e.Url} error {e_.Message}@{e_.StackTrace}!");
                }
            }
        }
Example #21
0
 public Task <RPCPacket> SendWait(RPCPacket request, ISession session)
 {
     return(SendWait(request, session, null));
 }
Example #22
0
 private void BindRequestParameter(RPCPacket request, EventNext.EventActionHandler handler)
 {
     request.LoadParameters(handler != null ? handler.ParametersType : null);
 }
Example #23
0
 internal void OnResponse(RPCPacket request, RPCPacket response)
 {
     System.Threading.Interlocked.Increment(ref mResponses);
     response.ID = request.ID;
     request.Session.Send(response);
 }
Example #24
0
 public Task <RPCPacket> SendWait(RPCPacket request, ISession session, int timeout = 10000)
 {
     return(SendWait(request, session, null, timeout));
 }