From a82e53ce2bb2062f6cc32671e55bd7b8729c9b2b Mon Sep 17 00:00:00 2001 From: Neil Dorin Date: Tue, 7 Nov 2023 12:08:50 -0700 Subject: [PATCH] feat: Adds WebSocketBehaviour --- .../Logging/DebugWebsocketSink.cs | 125 ++++++++++++++++-- src/Pepperdash Core/PepperDash_Core.csproj | 1 + 2 files changed, 114 insertions(+), 12 deletions(-) diff --git a/src/Pepperdash Core/Logging/DebugWebsocketSink.cs b/src/Pepperdash Core/Logging/DebugWebsocketSink.cs index 912863e..3ff5cd8 100644 --- a/src/Pepperdash Core/Logging/DebugWebsocketSink.cs +++ b/src/Pepperdash Core/Logging/DebugWebsocketSink.cs @@ -8,27 +8,33 @@ using Serilog.Core; using Serilog.Events; using Serilog.Configuration; using WebSocketSharp.Server; +using Crestron.SimplSharp; +using System.Net.Http; +using System.Text.RegularExpressions; +using WebSocketSharp; namespace PepperDash.Core { public class DebugWebsocketSink : ILogEventSink { - private WebSocketServer _wssv; + private HttpServer _server; + + private string _path = "/join"; public int Port { get { - if(_wssv == null) return 0; - return _wssv.Port; + if(_server == null) return 0; + return _server.Port; } } public bool IsListening { get { - if (_wssv == null) return false; - return _wssv.IsListening; + if (_server == null) return false; + return _server.IsListening; } } @@ -36,29 +42,35 @@ namespace PepperDash.Core public DebugWebsocketSink() { - _wssv = new WebSocketServer(); - + CrestronEnvironment.ProgramStatusEventHandler += type => + { + if (type == eProgramStatusEventType.Stopping) + { + StopServer(); + } + }; } public void Emit(LogEvent logEvent) { - if (_wssv == null || !_wssv.IsListening) return; + if (_server == null || !_server.IsListening) return; var message = logEvent.RenderMessage(_formatProvider); - _wssv.WebSocketServices.Broadcast(message); + _server.WebSocketServices.Broadcast(message); } public void StartServerAndSetPort(int port) { Debug.Console(0, "Starting Websocket Server on port: {0}", port); - _wssv = new WebSocketServer(port); - _wssv.Start(); + _server = new HttpServer(port); + _server.AddWebSocketService(_path); + _server.Start(); } public void StopServer() { Debug.Console(0, "Stopping Websocket Server"); - _wssv.Stop(); + _server.Stop(); } } @@ -71,4 +83,93 @@ namespace PepperDash.Core return loggerConfiguration.Sink(new DebugWebsocketSink()); } } + + public class DebugClient : WebSocketBehavior + { + private DateTime _connectionTime; + + public TimeSpan ConnectedDuration + { + get + { + if (Context.WebSocket.IsAlive) + { + return DateTime.Now - _connectionTime; + } + else + { + return new TimeSpan(0); + } + } + } + + public DebugClient() + { + + } + + protected override void OnOpen() + { + base.OnOpen(); + + var url = Context.WebSocket.Url; + Debug.Console(2, Debug.ErrorLogLevel.Notice, "New WebSocket Connection from: {0}", url); + + //var match = Regex.Match(url.AbsoluteUri, "(?:ws|wss):\\/\\/.*(?:\\/mc\\/api\\/ui\\/join\\/)(.*)"); + + //if (match.Success) + //{ + // var clientId = match.Groups[1].Value; + + // // Inform controller of client joining + // if (Controller != null) + // { + // var clientJoined = new MobileControlResponseMessage + // { + // Type = "/system/roomKey", + // ClientId = clientId, + // Content = RoomKey, + // }; + + // Controller.SendMessageObjectToDirectClient(clientJoined); + + // var bridge = Controller.GetRoomBridge(RoomKey); + + // SendUserCodeToClient(bridge, clientId); + + // bridge.UserCodeChanged += (sender, args) => SendUserCodeToClient((MobileControlEssentialsRoomBridge)sender, clientId); + // } + // else + // { + // Debug.Console(2, "WebSocket UiClient Controller is null"); + // } + //} + + _connectionTime = DateTime.Now; + + // TODO: Future: Check token to see if there's already an open session using that token and reject/close the session + } + + protected override void OnMessage(MessageEventArgs e) + { + base.OnMessage(e); + + Debug.Console(0, "WebSocket UiClient Message: {0}", e.Data); + } + + protected override void OnClose(CloseEventArgs e) + { + base.OnClose(e); + + Debug.Console(2, Debug.ErrorLogLevel.Notice, "WebSocket UiClient Closing: {0} reason: {1}", e.Code, e.Reason); + + } + + protected override void OnError(ErrorEventArgs e) + { + base.OnError(e); + + Debug.Console(2, Debug.ErrorLogLevel.Notice, "WebSocket UiClient Error: {0} message: {1}", e.Exception, e.Message); + } + } } diff --git a/src/Pepperdash Core/PepperDash_Core.csproj b/src/Pepperdash Core/PepperDash_Core.csproj index 3100767..2cdf3af 100644 --- a/src/Pepperdash Core/PepperDash_Core.csproj +++ b/src/Pepperdash Core/PepperDash_Core.csproj @@ -14,6 +14,7 @@ https://github.com/PepperDash/PepperDashCore crestron;4series; $(Version) + $(Version) ../../package