Преглед на файлове

Renaming PipeRequest to IPCMessage

Kenric Nugteren преди 2 години
родител
ревизия
dc13506f64
променени са 4 файла, в които са добавени 202 реда и са изтрити 73 реда
  1. 158 29
      InABox.Server/IPC/IPCServer.cs
  2. 12 12
      inabox.client.ipc/IPCClient.cs
  3. 11 11
      inabox.client.ipc/IPCClientTransport.cs
  4. 21 21
      inabox.ipc.shared/IPCRequest.cs

+ 158 - 29
InABox.Server/IPC/IPCServer.cs

@@ -1,21 +1,125 @@
 using H.Pipes;
 using H.Pipes.AccessControl;
+using H.Pipes.Args;
 using InABox.API;
 using InABox.Clients;
 using InABox.Core;
+using InABox.Server.WebSocket;
+using Piping;
+using System.Collections.Concurrent;
 using System.IO.Pipes;
 using System.Reflection;
 using System.Security.Principal;
 
 namespace InABox.IPC
 {
+    delegate void IPCPollEvent(IPCNotifyState.Session session);
+
+    class IPCNotifyState
+    {
+        public class Session
+        {
+            public PipeConnection<IPCMessage?> Connection { get; }
+
+            public Guid SessionID { get; }
+
+            public Platform Platform { get; }
+
+            public Session(PipeConnection<IPCMessage?> connection, Guid sessionID, Platform platform)
+            {
+                Connection = connection;
+                SessionID = sessionID;
+                Platform = platform;
+            }
+        }
+
+        public ConcurrentDictionary<Guid, Session> SessionMap = new();
+
+        public event IPCPollEvent? OnPoll;
+
+        public void Poll(Session session)
+        {
+            OnPoll?.Invoke(session);
+        }
+    }
+
+    class IPCNotifier : Notifier
+    {
+        IPCNotifyState NotifyState { get; set; }
+
+        public IPCNotifier(IPCNotifyState notifyState)
+        {
+            NotifyState = notifyState;
+            NotifyState.OnPoll += NotifyState_OnPoll;
+        }
+
+        private void NotifyState_OnPoll(IPCNotifyState.Session session)
+        {
+            Notify.Poll(session.SessionID);
+        }
+
+        protected override IEnumerable<Guid> GetSessions(Platform platform)
+        {
+            return NotifyState.SessionMap.Where(x => x.Value.Platform == platform).Select(x => x.Key);
+        }
+
+        protected override IEnumerable<Guid> GetUserSessions(Guid userID)
+        {
+            return CredentialsCache.GetUserSessions(userID);
+        }
+
+        protected override void NotifyAll<TNotification>(TNotification notification)
+        {
+            foreach(var session in NotifyState.SessionMap.Values)
+            {
+                session.Connection.WriteAsync(IPCMessage.Notification(notification)).ContinueWith(task =>
+                {
+                    if(task.Exception != null)
+                    {
+                        Logger.Send(LogType.Error, "", $"Error in notification: {CoreUtils.FormatException(task.Exception)}");
+                    }
+                });
+            }
+        }
+
+        protected override void NotifySession<TNotification>(Guid sessionID, TNotification notification)
+        {
+            if(NotifyState.SessionMap.TryGetValue(sessionID, out var session))
+            {
+                session.Connection.WriteAsync(IPCMessage.Notification(notification)).ContinueWith(task =>
+                {
+                    if(task.Exception != null)
+                    {
+                        Logger.Send(LogType.Error, "", $"Error in notification: {CoreUtils.FormatException(task.Exception)}");
+                    }
+                });
+            }
+        }
+
+        protected override void NotifySession(Guid sessionID, Type TNotification, BaseObject notification)
+        {
+            if(NotifyState.SessionMap.TryGetValue(sessionID, out var session))
+            {
+                session.Connection.WriteAsync(IPCMessage.Notification(TNotification, notification)).ContinueWith(task =>
+                {
+                    if(task.Exception != null)
+                    {
+                        Logger.Send(LogType.Error, "", $"Error in notification: {CoreUtils.FormatException(task.Exception)}");
+                    }
+                });
+            }
+        }
+    }
+
     public class IPCServer : IDisposable
     {
-        PipeServer<IPCRequest> Server;
+        PipeServer<IPCMessage> Server;
+
+        IPCNotifyState NotifyState = new();
 
         public IPCServer(string name)
         {
-            Server = new PipeServer<IPCRequest>(name);
+            Server = new PipeServer<IPCMessage>(name);
 
             #if WINDOWS
             SetPipeSecurity();
@@ -93,77 +197,86 @@ namespace InABox.IPC
                 _ => null
             };
         }
+        private class RequestData
+        {
+            public ConnectionMessageEventArgs<IPCMessage?> e { get; }
+
+            public RequestData(ConnectionMessageEventArgs<IPCMessage?> e)
+            {
+                this.e = e;
+            }
+        }
 
-        private static IPCRequest QueryMultiple(IPCRequest request)
+        private IPCMessage QueryMultiple(IPCMessage request, RequestData data)
         {
             var response = RestService.QueryMultiple(request.GetRequest<MultiQueryRequest>(), true);
             return request.Respond(response);
         }
 
-        private static IPCRequest Validate(IPCRequest request)
+        private IPCMessage Validate(IPCMessage request, RequestData data)
         {
             var response = RestService.Validate(request.GetRequest<ValidateRequest>());
             return request.Respond(response);
         }
 
-        private static IPCRequest Ping(IPCRequest request) => request.Respond(new PingResponse().Status(StatusCode.OK));
+        private IPCMessage Ping(IPCMessage request, RequestData data) => request.Respond(new PingResponse().Status(StatusCode.OK));
 
-        private static IPCRequest Info(IPCRequest request)
+        private IPCMessage Info(IPCMessage request, RequestData data)
         {
             var response = RestService.Info(request.GetRequest<InfoRequest>());
             return request.Respond(response);
         }
         
-        private static IPCRequest Check2FA(IPCRequest request)
+        private IPCMessage Check2FA(IPCMessage request, RequestData data)
         {
             var response = RestService.Check2FA(request.GetRequest<Check2FARequest>());
             return request.Respond(response);
         }
 
-        private static IPCRequest Query<T>(IPCRequest request) where T : Entity, new()
+        private IPCMessage Query<T>(IPCMessage request, RequestData data) where T : Entity, new()
         {
             var response = RestService<T>.List(request.GetRequest<QueryRequest<T>>());
             return request.Respond(response);
         }
 
-        private static IPCRequest Save<T>(IPCRequest request) where T : Entity, new()
+        private IPCMessage Save<T>(IPCMessage request, RequestData data) where T : Entity, new()
         {
             var response = RestService<T>.Save(request.GetRequest<SaveRequest<T>>());
             return request.Respond(response);
         }
-        private static IPCRequest MultiSave<T>(IPCRequest request) where T : Entity, new()
+        private IPCMessage MultiSave<T>(IPCMessage request, RequestData data) where T : Entity, new()
         {
             var response = RestService<T>.MultiSave(request.GetRequest<MultiSaveRequest<T>>());
             return request.Respond(response);
         }
 
-        private static IPCRequest Delete<T>(IPCRequest request) where T : Entity, new()
+        private IPCMessage Delete<T>(IPCMessage request, RequestData data) where T : Entity, new()
         {
             var response = RestService<T>.Delete(request.GetRequest<DeleteRequest<T>>());
             return request.Respond(response);
         }
-        private static IPCRequest MultiDelete<T>(IPCRequest request) where T : Entity, new()
+        private IPCMessage MultiDelete<T>(IPCMessage request, RequestData data) where T : Entity, new()
         {
             var response = RestService<T>.MultiDelete(request.GetRequest<MultiDeleteRequest<T>>());
             return request.Respond(response);
         }
 
-        private static MethodInfo QueryMethod = GetMethod(nameof(Query));
-        private static MethodInfo SaveMethod = GetMethod(nameof(Save));
-        private static MethodInfo MultiSaveMethod = GetMethod(nameof(MultiSave));
-        private static MethodInfo DeleteMethod = GetMethod(nameof(Delete));
-        private static MethodInfo MultiDeleteMethod = GetMethod(nameof(MultiDelete));
-        private static MethodInfo QueryMultipleMethod = GetMethod(nameof(QueryMultiple));
-        private static MethodInfo ValidateMethod = GetMethod(nameof(Validate));
-        private static MethodInfo Check2FAMethod = GetMethod(nameof(Check2FA));
-        private static MethodInfo PingMethod = GetMethod(nameof(Ping));
-        private static MethodInfo InfoMethod = GetMethod(nameof(Info));
+        private static readonly MethodInfo QueryMethod = GetMethod(nameof(Query));
+        private static readonly MethodInfo SaveMethod = GetMethod(nameof(Save));
+        private static readonly MethodInfo MultiSaveMethod = GetMethod(nameof(MultiSave));
+        private static readonly MethodInfo DeleteMethod = GetMethod(nameof(Delete));
+        private static readonly MethodInfo MultiDeleteMethod = GetMethod(nameof(MultiDelete));
+        private static readonly MethodInfo QueryMultipleMethod = GetMethod(nameof(QueryMultiple));
+        private static readonly MethodInfo ValidateMethod = GetMethod(nameof(Validate));
+        private static readonly MethodInfo Check2FAMethod = GetMethod(nameof(Check2FA));
+        private static readonly MethodInfo PingMethod = GetMethod(nameof(Ping));
+        private static readonly MethodInfo InfoMethod = GetMethod(nameof(Info));
 
         private static MethodInfo GetMethod(string name) =>
-            typeof(IPCServer).GetMethod(name, BindingFlags.NonPublic | BindingFlags.Static)
+            typeof(IPCServer).GetMethod(name, BindingFlags.NonPublic | BindingFlags.Instance)
             ?? throw new Exception($"Invalid method '{name}'");
 
-        private void Server_MessageReceived(object? sender, H.Pipes.Args.ConnectionMessageEventArgs<IPCRequest?> e)
+        private void Server_MessageReceived(object? sender, H.Pipes.Args.ConnectionMessageEventArgs<IPCMessage?> e)
         {
             Task.Run(() =>
             {
@@ -193,8 +306,14 @@ namespace InABox.IPC
                         method = method.MakeGenericMethod(entityType);
                     }
 
-                    var response = method.Invoke(null, new object[] { e.Message }) as IPCRequest;
-                    e.Connection.WriteAsync(response);
+                    var response = method.Invoke(this, new object[] { e.Message, new RequestData(e) }) as IPCMessage;
+                    e.Connection.WriteAsync(response).ContinueWith(task =>
+                    {
+                        if (task.Exception != null)
+                        {
+                            Logger.Send(LogType.Error, "", $"Error in response: {CoreUtils.FormatException(task.Exception)}");
+                        }
+                    });
                 }
                 catch (Exception err)
                 {
@@ -207,20 +326,30 @@ namespace InABox.IPC
                             var response = (Activator.CreateInstance(responseType) as Response)!;
                             response.Status = StatusCode.Error;
                             response.Messages.Add(err.Message);
-                            e.Connection.WriteAsync(e.Message.Respond(response));
+                            e.Connection.WriteAsync(e.Message.Respond(response)).ContinueWith(task =>
+                            {
+                                if (task.Exception != null)
+                                {
+                                    Logger.Send(LogType.Error, "", $"Error in response: {CoreUtils.FormatException(task.Exception)}");
+                                }
+                            });
                         }
                     }
                 }
             });
         }
 
-        private void Server_ClientDisconnected(object? sender, H.Pipes.Args.ConnectionEventArgs<IPCRequest> e)
+        private void Server_ClientDisconnected(object? sender, H.Pipes.Args.ConnectionEventArgs<IPCMessage> e)
         {
             Logger.Send(LogType.Information, "", "Client Disconnected");
+
+            var sessionID = NotifyState.SessionMap.Where(x => x.Value.Connection == e.Connection).FirstOrDefault().Key;
+            NotifyState.SessionMap.TryRemove(sessionID, out var session);
+
             e.Connection.DisposeAsync();
         }
 
-        private void Server_ClientConnected(object? sender, H.Pipes.Args.ConnectionEventArgs<IPCRequest> e)
+        private void Server_ClientConnected(object? sender, H.Pipes.Args.ConnectionEventArgs<IPCMessage> e)
         {
             Logger.Send(LogType.Information, "", "Client Connected");
         }

+ 12 - 12
inabox.client.ipc/IPCClient.cs

@@ -36,7 +36,7 @@ namespace InABox.IPC
             {
                 var request = new InfoRequest();
                 PrepareRequest(request, false);
-                var response = Send(IPCRequest.Info(request)).GetResponse<InfoResponse>();
+                var response = Send(IPCMessage.Info(request)).GetResponse<InfoResponse>();
                 return response.Info;
             }
             catch (Exception)
@@ -62,7 +62,7 @@ namespace InABox.IPC
             Request.BeforeRequest?.Invoke(request);
         }
 
-        private IPCRequest Send(IPCRequest request, int? timeout = null)
+        private IPCMessage Send(IPCMessage request, int? timeout = null)
         {
             return _clientTransport.Send(request, timeout ?? Convert.ToInt32(Timeout.TotalMilliseconds));
         }
@@ -73,7 +73,7 @@ namespace InABox.IPC
 
             PrepareRequest(request);
 
-            var response = Send(IPCRequest.Check2FA(request)).GetResponse<Check2FAResponse>();
+            var response = Send(IPCMessage.Check2FA(request)).GetResponse<Check2FAResponse>();
             if (response != null)
             {
                 return response.Status switch
@@ -95,7 +95,7 @@ namespace InABox.IPC
 
                 PrepareRequest(request);
 
-                var response = Send(IPCRequest.Ping(request), 10_000).GetResponse<PingResponse>();
+                var response = Send(IPCMessage.Ping(request), 10_000).GetResponse<PingResponse>();
                 if (response != null)
                 {
                     return response.Status switch
@@ -115,7 +115,7 @@ namespace InABox.IPC
             var request = new DeleteRequest<TEntity>(entity, auditnote);
             PrepareRequest(request);
 
-            var response = Send(IPCRequest.Delete(request)).GetResponse<DeleteResponse<TEntity>>();
+            var response = Send(IPCMessage.Delete(request)).GetResponse<DeleteResponse<TEntity>>();
             switch (response.Status)
             {
                 case StatusCode.OK:
@@ -133,7 +133,7 @@ namespace InABox.IPC
             var request = new MultiDeleteRequest<TEntity>(items, auditnote);
             PrepareRequest(request);
 
-            var response = Send(IPCRequest.MultiDelete(request)).GetResponse<MultiDeleteResponse<TEntity>>();
+            var response = Send(IPCMessage.MultiDelete(request)).GetResponse<MultiDeleteResponse<TEntity>>();
             switch (response.Status)
             {
                 case StatusCode.OK:
@@ -151,7 +151,7 @@ namespace InABox.IPC
             PrepareRequest(request);
 
             var result = new List<TEntity>();
-            var response = Send(IPCRequest.Query(request)).GetResponse<QueryResponse<TEntity>>();
+            var response = Send(IPCMessage.Query(request)).GetResponse<QueryResponse<TEntity>>();
             if (response.Items != null)
                 foreach (var row in response.Items.Rows)
                     result.Add(row.ToObject<TEntity>());
@@ -163,7 +163,7 @@ namespace InABox.IPC
             var request = new QueryRequest<TEntity>(filter, columns, sort);
             PrepareRequest(request);
 
-            var response = Send(IPCRequest.Query(request)).GetResponse<QueryResponse<TEntity>>();
+            var response = Send(IPCMessage.Query(request)).GetResponse<QueryResponse<TEntity>>();
 
             if (response != null)
             {
@@ -187,7 +187,7 @@ namespace InABox.IPC
             }
             PrepareRequest(request);
 
-            var response = Send(IPCRequest.QueryMultiple(request)).GetResponse<MultiQueryResponse>();
+            var response = Send(IPCMessage.QueryMultiple(request)).GetResponse<MultiQueryResponse>();
             if (response != null)
             {
                 return response.Status switch
@@ -209,7 +209,7 @@ namespace InABox.IPC
             };
             PrepareRequest(request);
 
-            var response = Send(IPCRequest.Save(request)).GetResponse<SaveResponse<TEntity>>();
+            var response = Send(IPCMessage.Save(request)).GetResponse<SaveResponse<TEntity>>();
             switch (response.Status)
             {
                 case StatusCode.OK:
@@ -252,7 +252,7 @@ namespace InABox.IPC
             };
             PrepareRequest(request);
 
-            var response = Send(IPCRequest.MultiSave(request)).GetResponse<MultiSaveResponse<TEntity>>();
+            var response = Send(IPCMessage.MultiSave(request)).GetResponse<MultiSaveResponse<TEntity>>();
             switch (response.Status)
             {
                 case StatusCode.OK:
@@ -336,7 +336,7 @@ namespace InABox.IPC
                 request.Credentials.Session = session;
             }
 
-            var response = Send(IPCRequest.Validate(request), 10000).GetResponse<ValidateResponse>();
+            var response = Send(IPCMessage.Validate(request), 10000).GetResponse<ValidateResponse>();
             if (response != null)
                 if (response.Status.Equals(StatusCode.OK))
                 {

+ 11 - 11
inabox.client.ipc/IPCClientTransport.cs

@@ -8,10 +8,10 @@ namespace InABox.Client.IPC
 {
     public class IPCClientTransport : IDisposable
     {
-        private PipeClient<IPCRequest> Client;
+        private PipeClient<IPCMessage> Client;
 
         private ConcurrentDictionary<Guid, ManualResetEventSlim> Events = new();
-        private ConcurrentDictionary<Guid, IPCRequest> Responses = new();
+        private ConcurrentDictionary<Guid, IPCMessage> Responses = new();
 
         private const int DefaultRequestTimeout = 5 * 60 * 1000; // 5 minutes
 
@@ -31,7 +31,7 @@ namespace InABox.Client.IPC
 
         public IPCClientTransport(string pipeName)
         {
-            Client = new PipeClient<IPCRequest>(pipeName);
+            Client = new PipeClient<IPCMessage>(pipeName);
             Client.Connected += Client_Connected;
             Client.Disconnected += Client_Disconnected;
             Client.MessageReceived += Client_MessageReceived;
@@ -45,7 +45,7 @@ namespace InABox.Client.IPC
             Logger.Send(LogType.Error, "", $"Exception occured: {e.Exception.Message}");
         }
 
-        public IPCRequest Send(IPCRequest request, int timeout = DefaultRequestTimeout)
+        public IPCMessage Send(IPCMessage request, int timeout = DefaultRequestTimeout)
         {
             var start = DateTime.Now;
             var ev = Queue(request.RequestID);
@@ -61,7 +61,7 @@ namespace InABox.Client.IPC
             return ev;
         }
 
-        public IPCRequest GetResult(Guid id, ManualResetEventSlim ev, int timeout)
+        public IPCMessage GetResult(Guid id, ManualResetEventSlim ev, int timeout)
         {
             if (Responses.TryGetValue(id, out var result))
             {
@@ -74,7 +74,7 @@ namespace InABox.Client.IPC
             {
                 if (!ev.Wait(timeout))
                 {
-                    return IPCRequest.Error(RequestError.TIMEOUT);
+                    return IPCMessage.Error(RequestError.TIMEOUT);
                 }
             }
             catch (Exception e)
@@ -85,10 +85,10 @@ namespace InABox.Client.IPC
             
             Responses.Remove(id, out result);
             Events.Remove(id, out ev);
-            return result ?? IPCRequest.Error(RequestError.UNKNOWN);
+            return result ?? IPCMessage.Error(RequestError.UNKNOWN);
         }
 
-        private void Client_MessageReceived(object? sender, H.Pipes.Args.ConnectionMessageEventArgs<IPCRequest?> e)
+        private void Client_MessageReceived(object? sender, H.Pipes.Args.ConnectionMessageEventArgs<IPCMessage?> e)
         {
             if (Events.TryGetValue(e.Message.RequestID, out var ev))
             {
@@ -110,19 +110,19 @@ namespace InABox.Client.IPC
             }
         }
 
-        private void Client_Connected(object? sender, H.Pipes.Args.ConnectionEventArgs<IPCRequest> e)
+        private void Client_Connected(object? sender, H.Pipes.Args.ConnectionEventArgs<IPCMessage> e)
         {
             Logger.Send(LogType.Information, "", $"Connected to Pipe: {e.Connection.PipeName}");
             Disconnected = false;
             OnConnect?.Invoke();
         }
 
-        private void Client_Disconnected(object? sender, H.Pipes.Args.ConnectionEventArgs<IPCRequest> e)
+        private void Client_Disconnected(object? sender, H.Pipes.Args.ConnectionEventArgs<IPCMessage> e)
         {
             Logger.Send(LogType.Information, "", $"Disconnected from Pipe: {e.Connection.PipeName}");
             foreach (var ev in Events)
             {
-                Responses.TryAdd(ev.Key, IPCRequest.Error(RequestError.DISCONNECTED));
+                Responses.TryAdd(ev.Key, IPCMessage.Error(RequestError.DISCONNECTED));
                 ev.Value.Set();
             }
             Disconnected = true;

+ 21 - 21
inabox.ipc.shared/IPCRequest.cs

@@ -34,7 +34,7 @@ namespace InABox.IPC
     }
 
     [Serializable]
-    public class IPCRequest
+    public class IPCMessage
     {
         public Guid RequestID;
         public Method Method;
@@ -45,7 +45,7 @@ namespace InABox.IPC
         [NonSerialized]
         public RequestError ErrorCode;
 
-        private IPCRequest(Guid requestID, Method method, string? type, string data, RequestError error = RequestError.NONE)
+        private IPCMessage(Guid requestID, Method method, string? type, string data, RequestError error = RequestError.NONE)
         {
             RequestID = requestID;
             Method = method;
@@ -54,7 +54,7 @@ namespace InABox.IPC
             BinaryData = null;
             ErrorCode = error;
         }
-        private IPCRequest(Guid requestID, Method method, string? type, byte[] data, RequestError error = RequestError.NONE)
+        private IPCMessage(Guid requestID, Method method, string? type, byte[] data, RequestError error = RequestError.NONE)
         {
             RequestID = requestID;
             Method = method;
@@ -64,18 +64,18 @@ namespace InABox.IPC
             ErrorCode = error;
         }
 
-        public IPCRequest Respond<TResponse>(TResponse response) where TResponse : Response
+        public IPCMessage Respond<TResponse>(TResponse response) where TResponse : Response
         {
             return CreateRequest(RequestID, Method.None, Type, response);
         }
-        private static IPCRequest CreateRequest(Guid requestID, Method method, string? type, object? data)
+        private static IPCMessage CreateRequest(Guid requestID, Method method, string? type, object? data)
         {
             if (data is ISerializeBinary binary)
             {
-                return new IPCRequest(requestID, method, type, binary.WriteBinary(BinarySerializationSettings.Latest));
+                return new IPCMessage(requestID, method, type, binary.WriteBinary(BinarySerializationSettings.Latest));
             }
             {
-                return new IPCRequest(requestID, method, type, Serialization.Serialize(data));
+                return new IPCMessage(requestID, method, type, Serialization.Serialize(data));
             }
         }
 
@@ -131,63 +131,63 @@ namespace InABox.IPC
             return response;
         }
 
-        public static IPCRequest Query<T>(QueryRequest<T> request) where T : Entity, new()
+        public static IPCMessage Query<T>(QueryRequest<T> request) where T : Entity, new()
         {
             return CreateRequest(Guid.NewGuid(), Method.Query, typeof(T).Name, request);
         }
 
-        public static IPCRequest Save<T>(SaveRequest<T> request) where T : Entity, new()
+        public static IPCMessage Save<T>(SaveRequest<T> request) where T : Entity, new()
         {
             return CreateRequest(Guid.NewGuid(), Method.Save, typeof(T).Name, request);
         }
 
-        public static IPCRequest MultiSave<T>(MultiSaveRequest<T> request) where T : Entity, new()
+        public static IPCMessage MultiSave<T>(MultiSaveRequest<T> request) where T : Entity, new()
         {
             return CreateRequest(Guid.NewGuid(), Method.MultiSave, typeof(T).Name, request);
         }
 
-        public static IPCRequest Delete<T>(DeleteRequest<T> request) where T : Entity, new()
+        public static IPCMessage Delete<T>(DeleteRequest<T> request) where T : Entity, new()
         {
             return CreateRequest(Guid.NewGuid(), Method.Delete, typeof(T).Name, request);
         }
 
-        public static IPCRequest MultiDelete<T>(MultiDeleteRequest<T> request) where T : Entity, new()
+        public static IPCMessage MultiDelete<T>(MultiDeleteRequest<T> request) where T : Entity, new()
         {
             return CreateRequest(Guid.NewGuid(), Method.MultiDelete, typeof(T).Name, request);
         }
 
-        public static IPCRequest QueryMultiple(MultiQueryRequest request)
+        public static IPCMessage QueryMultiple(MultiQueryRequest request)
         {
             return CreateRequest(Guid.NewGuid(), Method.QueryMultiple, null, request);
         }
 
-        public static IPCRequest Validate(ValidateRequest request)
+        public static IPCMessage Validate(ValidateRequest request)
         {
             return CreateRequest(Guid.NewGuid(), Method.Validate, null, request);
         }
 
-        public static IPCRequest Check2FA(Check2FARequest request)
+        public static IPCMessage Check2FA(Check2FARequest request)
         {
             return CreateRequest(Guid.NewGuid(), Method.Check2FA, null, request);
         }
 
-        public static IPCRequest Error(RequestError error)
+        public static IPCMessage Error(RequestError error)
         {
-            return new IPCRequest(Guid.NewGuid(), Method.None, null, "", error);
+            return new IPCMessage(Guid.NewGuid(), Method.None, null, "", error);
         }
 
-        public static IPCRequest Ping(PingRequest request)
+        public static IPCMessage Ping(PingRequest request)
         {
             return CreateRequest(Guid.NewGuid(), Method.Ping, null, request);
         }
         
-        public static IPCRequest Info(InfoRequest request)
+        public static IPCMessage Info(InfoRequest request)
         {
             return CreateRequest(Guid.NewGuid(), Method.Info, null, request);
         }
-        public static IPCRequest Notification<TNotification>(TNotification notification) where TNotification : BaseObject
+        public static IPCMessage Notification<TNotification>(TNotification notification) where TNotification : BaseObject
             => Notification(typeof(TNotification), notification);
-        public static IPCRequest Notification(Type TNotification, BaseObject notification)
+        public static IPCMessage Notification(Type TNotification, BaseObject notification)
         {
             return CreateRequest(Guid.NewGuid(), Method.Notification, TNotification.EntityName(), notification);
         }