diff --git a/src/Directory.Build.props b/src/Directory.Build.props
index 235fee48..ab9f2732 100644
--- a/src/Directory.Build.props
+++ b/src/Directory.Build.props
@@ -1,6 +1,6 @@
- 2.42.1-local
+ 2.36.6-local
$(Version)
PepperDash Technology
PepperDash Technology
diff --git a/src/PepperDash.Core/Comm/GenericSshClient.cs b/src/PepperDash.Core/Comm/GenericSshClient.cs
index 546a2a67..df44ab51 100644
--- a/src/PepperDash.Core/Comm/GenericSshClient.cs
+++ b/src/PepperDash.Core/Comm/GenericSshClient.cs
@@ -151,8 +151,6 @@ namespace PepperDash.Core
// Thread-safety lock for state changes
private readonly object _stateLock = new object();
- private volatile bool _isProgramStopping;
-
private bool disconnectLogged = false;
///
@@ -209,9 +207,11 @@ namespace PepperDash.Core
{
if (programEventType == eProgramStatusEventType.Stopping)
{
- _isProgramStopping = true;
- this.LogDebug("Program stopping. Closing connection");
- Disconnect();
+ if (client != null)
+ {
+ this.LogDebug("Program stopping. Closing connection");
+ Disconnect();
+ }
}
}
@@ -228,12 +228,6 @@ namespace PepperDash.Core
return;
}
- if (_isProgramStopping)
- {
- this.LogDebug("Skipping connect because program is stopping");
- return;
- }
-
ConnectEnabled = true;
try
@@ -293,7 +287,13 @@ namespace PepperDash.Core
}
catch (SshConnectionException e)
{
- var ie = e.InnerException; // The details are inside, when present - remote can close the connection with no inner exception at all
+ var ie = e.InnerException; // The details are inside!!
+
+ if (ie is SocketException)
+ {
+ this.LogError("CONNECTION failure: Cannot reach host");
+ this.LogVerbose(ie, "Exception details: ");
+ }
if (ie is System.Net.Sockets.SocketException socketException)
{
@@ -301,20 +301,20 @@ namespace PepperDash.Core
Hostname, Port);
this.LogVerbose(socketException, "SocketException details: ");
}
- else if (ie is SshAuthenticationException)
+ if (ie is SshAuthenticationException)
{
this.LogError("Authentication failure for username {userName}", Username);
this.LogVerbose(ie, "AuthenticationException details: ");
}
else
{
- this.LogError("Error on connect: {error}", ie?.Message ?? e.Message);
- this.LogVerbose(ie ?? e, "Exception details: ");
+ this.LogError("Error on connect: {error}", ie.Message);
+ this.LogVerbose(ie, "Exception details: ");
}
disconnectLogged = true;
KillClient(SocketStatus.SOCKET_STATUS_CONNECT_FAILED);
- if (AutoReconnect && ConnectEnabled && !_isProgramStopping)
+ if (AutoReconnect)
{
this.LogDebug("Checking autoreconnect: {autoReconnect}, {autoReconnectInterval}ms", AutoReconnect, AutoReconnectIntervalMs);
StartReconnectTimer();
@@ -326,7 +326,7 @@ namespace PepperDash.Core
disconnectLogged = true;
KillClient(SocketStatus.SOCKET_STATUS_CONNECT_FAILED);
- if (AutoReconnect && ConnectEnabled && !_isProgramStopping)
+ if (AutoReconnect)
{
this.LogDebug("Checking autoreconnect: {0}, {1}ms", AutoReconnect, AutoReconnectIntervalMs);
StartReconnectTimer();
@@ -338,7 +338,7 @@ namespace PepperDash.Core
this.LogVerbose(e, "Exception details: ");
disconnectLogged = true;
KillClient(SocketStatus.SOCKET_STATUS_CONNECT_FAILED);
- if (AutoReconnect && ConnectEnabled && !_isProgramStopping)
+ if (AutoReconnect)
{
this.LogDebug("Checking autoreconnect: {0}, {1}ms", AutoReconnect, AutoReconnectIntervalMs);
StartReconnectTimer();
@@ -473,7 +473,7 @@ namespace PepperDash.Core
{
connectLock.Release();
}
- if (AutoReconnect && ConnectEnabled && !_isProgramStopping)
+ if (AutoReconnect && ConnectEnabled)
{
this.LogDebug("Checking autoreconnect: {0}, {1}ms", AutoReconnect, AutoReconnectIntervalMs);
StartReconnectTimer();
@@ -516,10 +516,7 @@ namespace PepperDash.Core
this.LogError("ObjectDisposedException sending '{message}'. Restarting connection...", text.Trim());
KillClient(SocketStatus.SOCKET_STATUS_CONNECT_FAILED);
- if (AutoReconnect && ConnectEnabled && !_isProgramStopping)
- {
- StartReconnectTimer();
- }
+ StartReconnectTimer();
}
catch (Exception ex)
{
@@ -552,10 +549,7 @@ namespace PepperDash.Core
this.LogException(ex, "ObjectDisposedException sending {message}", ComTextHelper.GetEscapedText(bytes));
KillClient(SocketStatus.SOCKET_STATUS_CONNECT_FAILED);
- if (AutoReconnect && ConnectEnabled && !_isProgramStopping)
- {
- StartReconnectTimer();
- }
+ StartReconnectTimer();
}
catch (Exception ex)
{
diff --git a/src/PepperDash.Core/Logging/Debug.cs b/src/PepperDash.Core/Logging/Debug.cs
index 97ac5890..ad505d71 100644
--- a/src/PepperDash.Core/Logging/Debug.cs
+++ b/src/PepperDash.Core/Logging/Debug.cs
@@ -26,6 +26,27 @@ namespace PepperDash.Core
private static readonly string WebSocketLevelStoreKey = "WebsocketDebugLevel";
private static readonly string ErrorLogLevelStoreKey = "ErrorLogDebugLevel";
private static readonly string FileLevelStoreKey = "FileDebugLevel";
+ private static readonly string FileSizeLimitStoreKey = "FileLogSizeLimitBytes";
+ private static readonly string FileRetainedCountStoreKey = "FileLogRetainedCount";
+
+ // Conservative defaults so the daily rolling log set cannot exhaust
+ // constrained storage (e.g. RMC4 with \user on a small removable drive).
+ private const long DefaultApplianceFileSizeLimitBytes = 4L * 1024 * 1024;
+ private const long DefaultServerFileSizeLimitBytes = 16L * 1024 * 1024;
+ private const int DefaultApplianceRetainedFileCount = 7;
+ private const int DefaultServerRetainedFileCount = 14;
+
+ ///
+ /// Per-file size (bytes) that triggers a roll of the debug log file. Read at
+ /// startup from CrestronDataStore; override with the applogfilecap console command.
+ ///
+ public static long LogFileSizeLimitBytes { get; private set; }
+
+ ///
+ /// Number of rolled debug log files retained on disk. Combined with
+ /// LogFileSizeLimitBytes this bounds total debug-log disk usage.
+ ///
+ public static int LogRetainedFileCountLimit { get; private set; }
private static readonly Dictionary _logLevels = new Dictionary()
{
@@ -157,6 +178,12 @@ namespace PepperDash.Core
? "{@t:fff}ms [{@l:u4}]{#if Key is not null}[{Key}]{#end} {@m}{#if @x is not null}\r\n{@x}{#end}"
: "[{@t:yyyy-MM-dd HH:mm:ss.fff}][{@l:u4}][{App}]{#if Key is not null}[{Key}]{#end} {@m}{#if @x is not null}\r\n{@x}{#end}";
+ var isAppliance = CrestronEnvironment.DevicePlatform == eDevicePlatform.Appliance;
+ LogFileSizeLimitBytes = GetStoredIntValue(FileSizeLimitStoreKey,
+ (int)(isAppliance ? DefaultApplianceFileSizeLimitBytes : DefaultServerFileSizeLimitBytes));
+ LogRetainedFileCountLimit = GetStoredIntValue(FileRetainedCountStoreKey,
+ isAppliance ? DefaultApplianceRetainedFileCount : DefaultServerRetainedFileCount);
+
_defaultLoggerConfiguration = new LoggerConfiguration()
.MinimumLevel.Verbose()
.Enrich.FromLogContext()
@@ -166,8 +193,10 @@ namespace PepperDash.Core
.WriteTo.Sink(new DebugErrorLogSink(new ExpressionTemplate(errorLogTemplate)), levelSwitch: _errorLogLevelSwitch)
.WriteTo.File(new RenderedCompactJsonFormatter(), logFilePath,
rollingInterval: RollingInterval.Day,
+ fileSizeLimitBytes: LogFileSizeLimitBytes,
+ rollOnFileSizeLimit: true,
restrictedToMinimumLevel: LogEventLevel.Debug,
- retainedFileCountLimit: CrestronEnvironment.DevicePlatform == eDevicePlatform.Appliance ? 7 : 14,
+ retainedFileCountLimit: LogRetainedFileCountLimit,
levelSwitch: _fileLogLevelSwitch
);
@@ -223,6 +252,9 @@ namespace PepperDash.Core
ConsoleAccessLevelEnum.AccessOperator);
CrestronConsole.AddNewConsoleCommand(SetDebugFilterFromConsole, "appdebugfilter",
"appdebugfilter [params]", ConsoleAccessLevelEnum.AccessOperator);
+ CrestronConsole.AddNewConsoleCommand(SetLogFileCapFromConsole, "applogfilecap",
+ "applogfilecap:P [sizeBytes] [retainedCount]: Caps rolling debug log size/count (next restart)",
+ ConsoleAccessLevelEnum.AccessOperator);
}
CrestronEnvironment.ProgramStatusEventHandler += CrestronEnvironment_ProgramStatusEventHandler;
@@ -297,6 +329,75 @@ namespace PepperDash.Core
}
}
+ private static int GetStoredIntValue(string storeKey, int defaultValue)
+ {
+ try
+ {
+ var result = CrestronDataStoreStatic.GetLocalIntValue(storeKey, out int value);
+
+ if (result != CrestronDataStore.CDS_ERROR.CDS_SUCCESS)
+ {
+ CrestronDataStoreStatic.SetLocalIntValue(storeKey, defaultValue);
+ return defaultValue;
+ }
+
+ return value <= 0 ? defaultValue : value;
+ }
+ catch (Exception ex)
+ {
+ CrestronConsole.PrintLine($"Exception retrieving stored value for {storeKey}: {ex.Message}");
+ return defaultValue;
+ }
+ }
+
+ ///
+ /// Console handler to cap the rolling debug log file size and retained count.
+ /// Values persist in CrestronDataStore and take effect on the next program restart.
+ ///
+ public static void SetLogFileCapFromConsole(string command)
+ {
+ var trimmed = command?.Trim() ?? string.Empty;
+
+ if (trimmed == "?" || string.IsNullOrEmpty(trimmed))
+ {
+ CrestronConsole.ConsoleCommandResponse(
+ "Caps the rolling debug log file (takes effect on next program restart):\r\n" +
+ "Usage: applogfilecap:P [sizeBytes] [retainedCount]\r\n" +
+ " sizeBytes: per-file size that triggers a roll (min 65536)\r\n" +
+ " retainedCount: number of rolled files to keep (min 1)\r\n" +
+ $"Current: sizeBytes = {LogFileSizeLimitBytes}, retainedCount = {LogRetainedFileCountLimit}\r\n" +
+ $"Approx on-disk ceiling = {LogFileSizeLimitBytes * LogRetainedFileCountLimit} bytes\r\n");
+ return;
+ }
+
+ var tokens = trimmed.Split(new char[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);
+
+ if (!long.TryParse(tokens[0], out var sizeBytes) || sizeBytes < 65536)
+ {
+ CrestronConsole.ConsoleCommandResponse("Invalid sizeBytes. Must be an integer >= 65536.\r\n");
+ return;
+ }
+
+ sizeBytes = Math.Min(sizeBytes, int.MaxValue);
+
+ var retained = LogRetainedFileCountLimit;
+ if (tokens.Length > 1 && (!int.TryParse(tokens[1], out retained) || retained < 1))
+ {
+ CrestronConsole.ConsoleCommandResponse("Invalid retainedCount. Must be an integer >= 1.\r\n");
+ return;
+ }
+
+ var sizeErr = CrestronDataStoreStatic.SetLocalIntValue(FileSizeLimitStoreKey, (int)sizeBytes);
+ var countErr = CrestronDataStoreStatic.SetLocalIntValue(FileRetainedCountStoreKey, retained);
+
+ LogFileSizeLimitBytes = sizeBytes;
+ LogRetainedFileCountLimit = retained;
+
+ CrestronConsole.ConsoleCommandResponse(
+ $"File log cap stored: sizeBytes = {sizeBytes}, retainedCount = {retained} (store result: {sizeErr}/{countErr}).\r\n" +
+ "Takes effect on next program restart.\r\n");
+ }
+
private static void GetVersion()
{
var assembly = Assembly.GetExecutingAssembly();
diff --git a/src/PepperDash.Core/PepperDash.Core.csproj b/src/PepperDash.Core/PepperDash.Core.csproj
index 747aefb6..daa5c6da 100644
--- a/src/PepperDash.Core/PepperDash.Core.csproj
+++ b/src/PepperDash.Core/PepperDash.Core.csproj
@@ -43,7 +43,7 @@
-
+
diff --git a/src/PepperDash.Essentials.Core/PepperDash.Essentials.Core.csproj b/src/PepperDash.Essentials.Core/PepperDash.Essentials.Core.csproj
index b7f333bd..251ba316 100644
--- a/src/PepperDash.Essentials.Core/PepperDash.Essentials.Core.csproj
+++ b/src/PepperDash.Essentials.Core/PepperDash.Essentials.Core.csproj
@@ -25,7 +25,7 @@
bin\$(Configuration)\PepperDash_Essentials_Core.xml
-
+
diff --git a/src/PepperDash.Essentials.Devices.Common/PepperDash.Essentials.Devices.Common.csproj b/src/PepperDash.Essentials.Devices.Common/PepperDash.Essentials.Devices.Common.csproj
index 317fa2d3..7be4372d 100644
--- a/src/PepperDash.Essentials.Devices.Common/PepperDash.Essentials.Devices.Common.csproj
+++ b/src/PepperDash.Essentials.Devices.Common/PepperDash.Essentials.Devices.Common.csproj
@@ -29,6 +29,6 @@
-
+
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.MobileControl.Messengers/PepperDash.Essentials.MobileControl.Messengers.csproj b/src/PepperDash.Essentials.MobileControl.Messengers/PepperDash.Essentials.MobileControl.Messengers.csproj
index a9223061..d13d1a09 100644
--- a/src/PepperDash.Essentials.MobileControl.Messengers/PepperDash.Essentials.MobileControl.Messengers.csproj
+++ b/src/PepperDash.Essentials.MobileControl.Messengers/PepperDash.Essentials.MobileControl.Messengers.csproj
@@ -33,7 +33,7 @@
-
+
diff --git a/src/PepperDash.Essentials.MobileControl/PepperDash.Essentials.MobileControl.csproj b/src/PepperDash.Essentials.MobileControl/PepperDash.Essentials.MobileControl.csproj
index b0e2dd9f..235e0899 100644
--- a/src/PepperDash.Essentials.MobileControl/PepperDash.Essentials.MobileControl.csproj
+++ b/src/PepperDash.Essentials.MobileControl/PepperDash.Essentials.MobileControl.csproj
@@ -38,7 +38,7 @@
-
+
diff --git a/src/PepperDash.Essentials.MobileControl/Touchpanel/MobileControlTouchpanelController.cs b/src/PepperDash.Essentials.MobileControl/Touchpanel/MobileControlTouchpanelController.cs
index 262cb34e..5830782d 100644
--- a/src/PepperDash.Essentials.MobileControl/Touchpanel/MobileControlTouchpanelController.cs
+++ b/src/PepperDash.Essentials.MobileControl/Touchpanel/MobileControlTouchpanelController.cs
@@ -25,28 +25,11 @@ namespace PepperDash.Essentials.Touchpanel
/// Mobile Control touchpanel controller that provides app control, Zoom integration,
/// and mobile control functionality for Crestron touchpanels.
///
- public class MobileControlTouchpanelController : TouchpanelBase, IHasFeedback, ITswAppControl, ITswZoomControl, IDeviceInfoProvider, IMobileControlCrestronTouchpanelController, ITheme, ICommunicationMonitor
+ public class MobileControlTouchpanelController : TouchpanelBase, IHasFeedback, ITswAppControl, ITswZoomControl, IDeviceInfoProvider, IMobileControlCrestronTouchpanelController, ITheme
{
private readonly MobileControlTouchpanelProperties localConfig;
private IMobileControlRoomMessenger _bridge;
- ///
- /// Gets the CommunicationMonitor tracking the panel's online/offline state
- ///
- public StatusMonitorBase CommunicationMonitor { get; private set; }
-
- private sealed class NullCommunicationMonitor : StatusMonitorBase
- {
- public NullCommunicationMonitor(IKeyed parent) : base(parent, 120000, 300000)
- {
- Status = MonitorStatus.InError;
- Message = "Panel is not initialized";
- }
-
- public override void Start() { }
- public override void Stop() { }
- }
-
private string _appUrl;
///
@@ -145,11 +128,6 @@ namespace PepperDash.Essentials.Touchpanel
{
localConfig = config;
- if (panel != null)
- {
- CommunicationMonitor = new CrestronGenericBaseCommunicationMonitor(this, panel, 120000, 300000);
- }
-
AddPostActivationAction(SubscribeForMobileControlUpdates);
ThemeFeedback = new StringFeedback($"{Key}-theme", () => Theme);
@@ -388,8 +366,6 @@ namespace PepperDash.Essentials.Touchpanel
///
public override bool CustomActivate()
{
- CommunicationMonitor?.Start();
-
var appMessenger = new ITswAppControlMessenger($"appControlMessenger-{Key}", $"/device/{Key}", this);
var zoomMessenger = new ITswZoomControlMessenger($"zoomControlMessenger-{Key}", $"/device/{Key}", this);
@@ -417,17 +393,6 @@ namespace PepperDash.Essentials.Touchpanel
return base.CustomActivate();
}
- ///
- /// Stops the CommunicationMonitor on deactivation.
- ///
- /// True if deactivation was successful; otherwise, false.
- public override bool Deactivate()
- {
- CommunicationMonitor?.Stop();
-
- return base.Deactivate();
- }
-
///
/// Handles device extender signal changes for system reserved signals.
///
@@ -554,8 +519,15 @@ namespace PepperDash.Essentials.Touchpanel
return false;
}) ? csIpAddress.ToString() : processorIp;
- // replace the host but preserve whatever scheme (http/https) is already present in the URL
- var updatedUrl = Regex.Replace(url, @"^(https?)://[^:/]+", $"$1://{ip}");
+ var match = Regex.Match(url, @"^http://([^:/]+):\d+/mc/app\?token=.+$");
+ if (match.Success)
+ {
+ string ipa = match.Groups[1].Value;
+ // ip will be "192.168.1.100"
+ }
+
+ // replace ipa with ip but leave the rest of the string intact
+ var updatedUrl = Regex.Replace(url, @"^http://[^:/]+", $"http://{ip}");
this.LogVerbose("Updated URL: {updatedUrl}", updatedUrl);
@@ -768,7 +740,7 @@ namespace PepperDash.Essentials.Touchpanel
///
public MobileControlTouchpanelControllerFactory()
{
- TypeNames = new List() { "mccrestronapp", "mctsw550", "mctsw750", "mctsw1050", "mctsw560", "mctsw760", "mctsw1060", "mctsw570", "mctsw770", "mcts770", "mctsw1070", "mcts1070", "mctsw1080", "mcts1080", "mcxpanel", "mcdge1000" };
+ TypeNames = new List() { "mccrestronapp", "mctsw550", "mctsw750", "mctsw1050", "mctsw560", "mctsw760", "mctsw1060", "mctsw570", "mctsw770", "mcts770", "mctsw1070", "mcts1070", "mcxpanel", "mcdge1000" };
MinimumEssentialsFrameworkVersion = "2.0.0";
factories = new Dictionary>
@@ -793,8 +765,6 @@ namespace PepperDash.Essentials.Touchpanel
{"ts770", (id, controlSystem, projectName) => new Ts770(id, controlSystem)},
{"tsw1070", (id, controlSystem, projectName) => new Tsw1070(id, controlSystem)},
{"ts1070", (id, controlSystem, projectName) => new Ts1070(id, controlSystem)},
- {"tsw1080", (id, controlSystem, projectName) => new Tsw1080(id, controlSystem)},
- {"ts1080", (id, controlSystem, projectName) => new Ts1080(id, controlSystem)},
{"dge1000", (id, controlSystem, projectName) => new Dge1000(id, controlSystem)}
};
}
diff --git a/src/PepperDash.Essentials.MobileControl/WebSocketServer/MobileControlWebsocketServer.cs b/src/PepperDash.Essentials.MobileControl/WebSocketServer/MobileControlWebsocketServer.cs
index c96dc116..1c9ed37a 100644
--- a/src/PepperDash.Essentials.MobileControl/WebSocketServer/MobileControlWebsocketServer.cs
+++ b/src/PepperDash.Essentials.MobileControl/WebSocketServer/MobileControlWebsocketServer.cs
@@ -127,16 +127,6 @@ namespace PepperDash.Essentials.WebSocketServer
///
public int Port { get; private set; }
- ///
- /// Gets the HTTP scheme to use for generated URLs, based on whether the direct server is configured as secure
- ///
- private string HttpScheme => _parent.Config.DirectServer.Secure ? "https" : "http";
-
- ///
- /// Gets the WebSocket scheme to use for generated URLs, based on whether the direct server is configured as secure
- ///
- private string WsScheme => _parent.Config.DirectServer.Secure ? "wss" : "ws";
-
///
/// Gets the user app URL prefix
///
@@ -144,8 +134,7 @@ namespace PepperDash.Essentials.WebSocketServer
{
get
{
- return string.Format("{0}://{1}:{2}{3}?token=",
- HttpScheme,
+ return string.Format("http://{0}:{1}{2}?token=",
CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_IP_ADDRESS, 0),
Port,
_userAppBaseHref);
@@ -284,7 +273,7 @@ namespace PepperDash.Essentials.WebSocketServer
{
base.Initialize();
- _server = new HttpServer(Port, _parent.Config.DirectServer.Secure);
+ _server = new HttpServer(Port, false);
_server.OnGet += Server_OnGet;
@@ -302,7 +291,7 @@ namespace PepperDash.Essentials.WebSocketServer
{
ClientCertificateRequired = false,
CheckCertificateRevocation = false,
- EnabledSslProtocols = SslProtocols.Tls12
+ EnabledSslProtocols = SslProtocols.Tls12 | SslProtocols.Tls11
};
}
@@ -414,11 +403,11 @@ namespace PepperDash.Essentials.WebSocketServer
ip = csIpAddress.ToString();
}
- var appUrl = $"{HttpScheme}://{ip}:{Port}/mc/app?token={touchpanel.Key}";
+ var appUrl = $"http://{ip}:{_parent.Config.DirectServer.Port}/mc/app?token={touchpanel.Key}";
this.LogVerbose("Sending URL {appUrl} to touchpanel {touchpanelKey}", appUrl, touchpanel.Touchpanel.Key);
- touchpanel.Touchpanel.SetAppUrl(appUrl);
+ touchpanel.Touchpanel.SetAppUrl($"http://{ip}:{_parent.Config.DirectServer.Port}/mc/app?token={touchpanel.Key}");
}
}
@@ -498,7 +487,7 @@ namespace PepperDash.Essentials.WebSocketServer
{
var config = new MobileControlApplicationConfig
{
- ApiPath = string.Format("{0}://{1}:{2}/mc/api", HttpScheme, processorIp, Port),
+ ApiPath = string.Format("http://{0}:{1}/mc/api", processorIp, _parent.Config.DirectServer.Port),
GatewayAppPath = "",
LogoPath = _parent.Config.ApplicationConfig?.LogoPath ?? "logo/logo.png",
EnableDev = _parent.Config.ApplicationConfig?.EnableDev ?? false,
@@ -1109,7 +1098,6 @@ namespace PepperDash.Essentials.WebSocketServer
res.StatusCode = 200;
res.Close();
- // remote log collector has no dedicated secure flag; keep it on http regardless of DirectServer.Secure
var logRequest = new HttpRequestMessage(HttpMethod.Post, $"http://{_parent.Config.DirectServer.Logging.Host}:{_parent.Config.DirectServer.Logging.Port}/logs")
{
Content = new StringContent(body, Encoding.UTF8, "application/json"),
@@ -1162,11 +1150,6 @@ namespace PepperDash.Essentials.WebSocketServer
var qp = req.QueryString;
var token = qp["token"];
- // Each join mints a single-use clientId; the panel webview must never replay a cached
- // response, or it reconnects forever with an already-consumed id (1008 loop).
- res.Headers.Add("Cache-Control", "no-store");
- res.Headers.Add("Pragma", "no-cache");
-
this.LogVerbose("Join Room Request with token: {token}", token);
byte[] body;
@@ -1230,7 +1213,8 @@ namespace PepperDash.Essentials.WebSocketServer
this.LogVerbose("Assigning ClientId: {clientId} for token: {token} at {timestamp}", clientId, token, now);
// Construct WebSocket URL with clientId query parameter
- var wsUrl = $"{WsScheme}://{CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_IP_ADDRESS, 0)}:{Port}{_wsPath}{token}?clientId={clientId}";
+ var wsProtocol = "ws";
+ var wsUrl = $"{wsProtocol}://{CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_IP_ADDRESS, 0)}:{Port}{_wsPath}{token}?clientId={clientId}";
// Construct the response object
JoinResponse jRes = new JoinResponse
@@ -1242,8 +1226,7 @@ namespace PepperDash.Essentials.WebSocketServer
Config = _parent.GetConfigWithPluginVersion(),
CodeExpires = new DateTime().AddYears(1),
UserCode = bridge.UserCode,
- UserAppUrl = string.Format("{0}://{1}:{2}/mc/app",
- HttpScheme,
+ UserAppUrl = string.Format("http://{0}:{1}/mc/app",
CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_IP_ADDRESS, 0),
Port),
WebSocketUrl = wsUrl,
@@ -1268,8 +1251,6 @@ namespace PepperDash.Essentials.WebSocketServer
{
res.StatusCode = 200;
res.ContentType = "application/json";
- res.Headers.Add("Cache-Control", "no-store");
- res.Headers.Add("Pragma", "no-cache");
var version = new Version() { ServerVersion = _parent.GetConfigWithPluginVersion().RuntimeInfo.PluginVersion };
var message = JsonConvert.SerializeObject(version);
this.LogVerbose("{message}", message);
diff --git a/src/PepperDash.Essentials/PepperDash.Essentials.csproj b/src/PepperDash.Essentials/PepperDash.Essentials.csproj
index cb83bf84..20a42ffd 100644
--- a/src/PepperDash.Essentials/PepperDash.Essentials.csproj
+++ b/src/PepperDash.Essentials/PepperDash.Essentials.csproj
@@ -48,7 +48,7 @@
-
+