diff --git a/src/Zirconium/Core/ConnectionHandler.cs b/src/Zirconium/Core/ConnectionHandler.cs index 45beae8..5755ea6 100644 --- a/src/Zirconium/Core/ConnectionHandler.cs +++ b/src/Zirconium/Core/ConnectionHandler.cs @@ -23,6 +23,7 @@ namespace Zirconium.Core _app.SessionManager.DeleteSession(ID); Logging.Log.Info($"Connection {ID} was closed (reason: {e.Reason})"); // TODO implement closing connection + } protected override void OnError(ErrorEventArgs e) @@ -37,7 +38,7 @@ namespace Zirconium.Core if (e.IsText) { var msg = JsonConvert.DeserializeObject(e.Data); - _app.Router.RouteMessage(_app.SessionManager.GetConnectionInfo(ID), msg); + _app.Router.RouteMessage(_app.SessionManager.GetSession(ID), msg); } else { @@ -69,17 +70,21 @@ namespace Zirconium.Core protected override void OnOpen() { var ip = Context.UserEndPoint.Address; - var connInfo = new ConnectionInfo(); - connInfo.ClientAddress = ip; - connInfo.ConnectionHandler = this; - _app.SessionManager.AddSession(ID, connInfo); - Logging.Log.Info($"Connection {ID} was created"); + var session = new Session(); + session.ClientAddress = ip; + session.ConnectionHandler = this; + _app.SessionManager.AddSession(this.ID, session); + Logging.Log.Info($"Connection {this.ID} was created"); } public void SendMessage(string message) { this.Send(message); } + + public void CloseConnection() { + this.Sessions.CloseSession(this.ID); // TODO need to clarify if CloseSession also calls OnClose callback + } } } diff --git a/src/Zirconium/Core/Models/ConnectionInfo.cs b/src/Zirconium/Core/Models/Session.cs similarity index 90% rename from src/Zirconium/Core/Models/ConnectionInfo.cs rename to src/Zirconium/Core/Models/Session.cs index 6aa03e5..4dea6ee 100644 --- a/src/Zirconium/Core/Models/ConnectionInfo.cs +++ b/src/Zirconium/Core/Models/Session.cs @@ -2,7 +2,7 @@ using System.Net; namespace Zirconium.Core.Models { - public class ConnectionInfo + public class Session { public string LastTokenHash { get; set; } public JWTPayload LastTokenPayload { get; set; } diff --git a/src/Zirconium/Core/Plugins/Interfaces/IC2SMessageHandler.cs b/src/Zirconium/Core/Plugins/Interfaces/IC2SMessageHandler.cs index b4a99d3..55632c5 100644 --- a/src/Zirconium/Core/Plugins/Interfaces/IC2SMessageHandler.cs +++ b/src/Zirconium/Core/Plugins/Interfaces/IC2SMessageHandler.cs @@ -4,7 +4,7 @@ namespace Zirconium.Core.Plugins.Interfaces { public interface IC2SMessageHandler { string GetHandlingMessageType(); - void HandleMessage(ConnectionInfo connInfo, BaseMessage message); + void HandleMessage(Session session, BaseMessage message); bool IsAuthorizationRequired(); string GetHandlerUniqueID(); } diff --git a/src/Zirconium/Core/Plugins/Interfaces/IExposedSessionManager.cs b/src/Zirconium/Core/Plugins/Interfaces/IExposedSessionManager.cs new file mode 100644 index 0000000..3b1eea8 --- /dev/null +++ b/src/Zirconium/Core/Plugins/Interfaces/IExposedSessionManager.cs @@ -0,0 +1,12 @@ +using Zirconium.Core.Models; +using System.Collections.Immutable; + +namespace Zirconium.Core.Plugins.Interfaces +{ + public interface IExposedSessionManager + { + Session GetSession(string sessionID); + IImmutableDictionary GetSessions(); + void CloseSession(string connID); + } +} \ No newline at end of file diff --git a/src/Zirconium/Core/Plugins/Interfaces/IPluginHostAPI.cs b/src/Zirconium/Core/Plugins/Interfaces/IPluginHostAPI.cs index dbe684e..6a4b763 100644 --- a/src/Zirconium/Core/Plugins/Interfaces/IPluginHostAPI.cs +++ b/src/Zirconium/Core/Plugins/Interfaces/IPluginHostAPI.cs @@ -12,9 +12,10 @@ namespace Zirconium.Core.Plugins.Interfaces string GenerateAuthToken(string entityID, string deviceID, int tokenExpirationMillis); string[] GetServerDomains(); string GetServerID(); - void SendMessage(ConnectionInfo connInfo, BaseMessage message); + void SendMessage(Session session, BaseMessage message); dynamic GetSettings(IPluginAPI plugin); dynamic GetSettings(string pluginName); void ProvideAuth(IAuthProvider provider); + IExposedSessionManager GetSessionManager(); } } \ No newline at end of file diff --git a/src/Zirconium/Core/Plugins/PluginHostAPI.cs b/src/Zirconium/Core/Plugins/PluginHostAPI.cs index c66b428..be5f157 100644 --- a/src/Zirconium/Core/Plugins/PluginHostAPI.cs +++ b/src/Zirconium/Core/Plugins/PluginHostAPI.cs @@ -16,6 +16,10 @@ namespace Zirconium.Core.Plugins _app = app; } + public IExposedSessionManager GetSessionManager() { + return _app.SessionManager; + } + public void ProvideAuth(IAuthProvider provider) { _app.AuthManager.AddAuthProvider(provider); } @@ -60,9 +64,9 @@ namespace Zirconium.Core.Plugins _router.AddCoreEventHandler(handler.GetHandlingEventType(), handler); } - public void SendMessage(ConnectionInfo connInfo, BaseMessage message) + public void SendMessage(Session session, BaseMessage message) { - connInfo.ConnectionHandler.SendMessage(JsonConvert.SerializeObject(message)); + session.ConnectionHandler.SendMessage(JsonConvert.SerializeObject(message)); } public void Unhook(IC2SMessageHandler handler) diff --git a/src/Zirconium/Core/Plugins/PluginManager.cs b/src/Zirconium/Core/Plugins/PluginManager.cs index 903a85c..f162971 100644 --- a/src/Zirconium/Core/Plugins/PluginManager.cs +++ b/src/Zirconium/Core/Plugins/PluginManager.cs @@ -66,6 +66,7 @@ namespace Zirconium.Core.Plugins typeof(IPluginHostAPI), typeof(IPluginManager), typeof(IAuthProvider), + typeof(IExposedSessionManager), typeof(IC2SMessageHandler), typeof(ICoreEventHandler), typeof(BaseMessage), diff --git a/src/Zirconium/Core/Router.cs b/src/Zirconium/Core/Router.cs index c5958fb..e5f2f4b 100644 --- a/src/Zirconium/Core/Router.cs +++ b/src/Zirconium/Core/Router.cs @@ -23,7 +23,7 @@ namespace Zirconium.Core _coreEventsHandlers = new Dictionary>(); } - public void RouteMessage(ConnectionInfo connInfo, BaseMessage message) + public void RouteMessage(Session session, BaseMessage message) { var handlers = _c2sMessageHandlers.GetValueOrDefault(message.MessageType, null); if (handlers == null) @@ -37,7 +37,7 @@ namespace Zirconium.Core ); msg.From = _app.Config.ServerID; var serializedMsg = JsonConvert.SerializeObject(msg); - connInfo.ConnectionHandler.SendMessage(serializedMsg); + session.ConnectionHandler.SendMessage(serializedMsg); return; } foreach (var h in handlers) @@ -49,7 +49,7 @@ namespace Zirconium.Core { hash = shaM.ComputeHash(message.AuthToken.ToByteArray()).ConvertToString(); } - if (connInfo.LastTokenHash != hash) + if (session.LastTokenHash != hash) { JWTPayload tokenPayload; try @@ -68,19 +68,19 @@ namespace Zirconium.Core new Dictionary() ) ); - connInfo.ConnectionHandler.SendMessage(serializedMsg); + session.ConnectionHandler.SendMessage(serializedMsg); return; } - connInfo.LastTokenHash = hash; - connInfo.LastTokenPayload = tokenPayload; + session.LastTokenHash = hash; + session.LastTokenPayload = tokenPayload; } } Task.Run(() => { // probably need to wrap whole foreach body, not only HandleMessage call - need to investigate - h.HandleMessage(connInfo, message); + h.HandleMessage(session, message); }); } } diff --git a/src/Zirconium/Core/SessionManager.cs b/src/Zirconium/Core/SessionManager.cs index 2d600b9..8a46e19 100644 --- a/src/Zirconium/Core/SessionManager.cs +++ b/src/Zirconium/Core/SessionManager.cs @@ -1,29 +1,39 @@ +using System.Collections.Immutable; using System.Collections.Generic; using Zirconium.Core.Models; +using Zirconium.Core.Plugins.Interfaces; namespace Zirconium.Core { - public class SessionManager + public class SessionManager: IExposedSessionManager { - private IDictionary _sessions; + private IDictionary _sessions; public SessionManager() { - _sessions = new Dictionary(); + _sessions = new Dictionary(); } - public void AddSession(string connID, ConnectionInfo connInfo) { - _sessions[connID] = connInfo; + public void AddSession(string connID, Session session) { + _sessions[connID] = session; } - // Get connection info about specified connection ID + // Get session using specified ID // Throws this exception when connection is not found - public ConnectionInfo GetConnectionInfo(string connID) { - return _sessions[connID]; + public Session GetSession(string sessionID) { + return _sessions[sessionID]; } public void DeleteSession(string connID) { _sessions.Remove(connID); } + + public IImmutableDictionary GetSessions() { + return _sessions.ToImmutableDictionary(); + } + + public void CloseSession(string connID) { + _sessions[connID].ConnectionHandler.CloseConnection(); + } } } \ No newline at end of file diff --git a/src/ZirconiumPluginExamples/HelloWorldPlugin/HelloWorldPlugin.cs b/src/ZirconiumPluginExamples/HelloWorldPlugin/HelloWorldPlugin.cs index 1076657..1c67ff6 100644 --- a/src/ZirconiumPluginExamples/HelloWorldPlugin/HelloWorldPlugin.cs +++ b/src/ZirconiumPluginExamples/HelloWorldPlugin/HelloWorldPlugin.cs @@ -34,14 +34,14 @@ namespace HelloWorldPlugin public string GetHandlingMessageType() => "test"; - public void HandleMessage(ConnectionInfo connInfo, BaseMessage message) + public void HandleMessage(Session session, BaseMessage message) { BaseMessage msg = new BaseMessage(message, true); msg.Payload["testProp"] = "hello world"; msg.Ok = true; msg.From = hostModuleAPI.GetServerID(); string strMsg = JsonConvert.SerializeObject(msg); - connInfo.ConnectionHandler.SendMessage(strMsg); + session.ConnectionHandler.SendMessage(strMsg); } public bool IsAuthorizationRequired() => false;