Add resource server autostart and Chromium config options

Introduces ResourceServerAutoStart and ChromiumFileName/ChromiumDevToolsPrefix settings to app.config and resources. Refactors resource server startup logic to support autostart and configurable browser launch. Cleans up related code in MainForm and Program for improved flexibility and maintainability.
This commit is contained in:
Namhyeon Go 2025-07-27 15:57:05 +09:00
parent 3583415ee2
commit 2b4814ecb5
6 changed files with 72 additions and 27 deletions

View File

@ -17,7 +17,6 @@ namespace WelsonJS.Launcher
public partial class MainForm : Form
{
private const string _entryFileName = "bootstrap.bat";
private readonly string _dateTimeFormat;
private string _workingDirectory;
@ -26,18 +25,28 @@ namespace WelsonJS.Launcher
public MainForm()
{
// set the datetime format
_dateTimeFormat = Program.GetAppConfig("DateTimeFormat");
// initialize UI
InitializeComponent();
// Check the user is an Administator
if (IsInAdministrator())
{
Text += " (Administrator)";
}
// tray icon
notifyIcon1.DoubleClick += OnShow;
openLauncherToolStripMenuItem.Click += OnShow;
exitToolStripMenuItem.Click += OnExit;
// Autostart the resource server
if (Program.GetAppConfig("ResourceServerAutoStart").ToLower() == "true")
{
RunResourceServer();
}
}
protected override void OnFormClosing(FormClosingEventArgs e)
@ -120,12 +129,12 @@ namespace WelsonJS.Launcher
string filePath = openFileDialog.FileName;
DisableUI();
Task.Run(() => ExtractAndRun(filePath));
Task.Run(() => RunAppPackageFile(filePath));
}
}
}
private void ExtractAndRun(string filePath)
private void RunAppPackageFile(string filePath)
{
_instanceId = Guid.NewGuid().ToString();
_workingDirectory = Program.GetWorkingDirectory(_instanceId);
@ -160,6 +169,19 @@ namespace WelsonJS.Launcher
SafeInvoke(() => EnableUI());
}
private bool RunResourceServer()
{
Program.InitResourceServer();
if (!Program._ResourceServer.IsRunning())
{
Program._ResourceServer.Start(false);
startCodeEditorToolStripMenuItem.Text = "Open the code editor...";
}
return Program._ResourceServer.IsRunning();
}
private void RecordFirstDeployTime(string directory, string instanceId)
{
// get current time
@ -263,14 +285,7 @@ namespace WelsonJS.Launcher
private void startCodeEditorToolStripMenuItem_Click(object sender, EventArgs e)
{
Program.StartResourceServer();
if (!Program._ResourceServer.IsRunning())
{
Program._ResourceServer.Start();
((ToolStripMenuItem)sender).Text = "Open the code editor...";
}
else
if (RunResourceServer())
{
Program.OpenWebBrowser(Program._ResourceServer.GetPrefix());
}

View File

@ -146,7 +146,7 @@ namespace WelsonJS.Launcher
return workingDirectory;
}
public static void StartResourceServer()
public static void InitResourceServer()
{
lock(typeof(Program))
{
@ -159,7 +159,7 @@ namespace WelsonJS.Launcher
public static void OpenWebBrowser(string url)
{
Uri resourceServerUri = new Uri(GetAppConfig("ResourceServerPrefix"));
Uri devToolsUri = new Uri(GetAppConfig("DevToolsPrefix"));
Uri devToolsUri = new Uri(GetAppConfig("ChromiumDevToolsPrefix"));
string userDataDir = Path.Combine(GetAppDataPath(), "EdgeUserProfile");
string remoteAllowOrigins = $"{resourceServerUri.Scheme}://{resourceServerUri.Host}:{resourceServerUri.Port}";
@ -173,7 +173,7 @@ namespace WelsonJS.Launcher
Process.Start(new ProcessStartInfo
{
FileName = "msedge.exe",
FileName = Program.GetAppConfig("ChromiumFileName"),
Arguments = string.Join(" ", arguments),
UseShellExecute = true
});

View File

@ -105,6 +105,24 @@ namespace WelsonJS.Launcher.Properties {
}
}
/// <summary>
/// http://localhost:9222/과(와) 유사한 지역화된 문자열을 찾습니다.
/// </summary>
internal static string ChromiumDevToolsPrefix {
get {
return ResourceManager.GetString("ChromiumDevToolsPrefix", resourceCulture);
}
}
/// <summary>
/// msedge.exe과(와) 유사한 지역화된 문자열을 찾습니다.
/// </summary>
internal static string ChromiumFileName {
get {
return ResourceManager.GetString("ChromiumFileName", resourceCulture);
}
}
/// <summary>
/// 과(와) 유사한 지역화된 문자열을 찾습니다.
/// </summary>
@ -141,15 +159,6 @@ namespace WelsonJS.Launcher.Properties {
}
}
/// <summary>
/// http://localhost:9222/과(와) 유사한 지역화된 문자열을 찾습니다.
/// </summary>
internal static string DevToolsPrefix {
get {
return ResourceManager.GetString("DevToolsPrefix", resourceCulture);
}
}
/// <summary>
/// 1.1.1.1과(와) 유사한 지역화된 문자열을 찾습니다.
/// </summary>
@ -277,6 +286,15 @@ namespace WelsonJS.Launcher.Properties {
}
}
/// <summary>
/// true과(와) 유사한 지역화된 문자열을 찾습니다.
/// </summary>
internal static string ResourceServerAutoStart {
get {
return ResourceManager.GetString("ResourceServerAutoStart", resourceCulture);
}
}
/// <summary>
/// http://localhost:3000/과(와) 유사한 지역화된 문자열을 찾습니다.
/// </summary>

View File

@ -157,7 +157,7 @@
<data name="ResourceServerPrefix" xml:space="preserve">
<value>http://localhost:3000/</value>
</data>
<data name="DevToolsPrefix" xml:space="preserve">
<data name="ChromiumDevToolsPrefix" xml:space="preserve">
<value>http://localhost:9222/</value>
</data>
<data name="AzureAiServiceApiKey" xml:space="preserve">
@ -199,4 +199,10 @@
<data name="DateTimeFormat" xml:space="preserve">
<value>yyyy-MM-dd HH:mm:ss</value>
</data>
<data name="ResourceServerAutoStart" xml:space="preserve">
<value>true</value>
</data>
<data name="ChromiumFileName" xml:space="preserve">
<value>msedge.exe</value>
</data>
</root>

View File

@ -30,6 +30,7 @@ namespace WelsonJS.Launcher
private string _prefix;
private string _resourceName;
private List<IResourceTool> _tools = new List<IResourceTool>();
private static readonly HttpClient _httpClient = new HttpClient();
private static readonly string _defaultMimeType = "application/octet-stream";
private static BlobConfig _blobConfig;
@ -66,7 +67,7 @@ namespace WelsonJS.Launcher
return _prefix;
}
public void Start()
public void Start(bool IsOpenWebBrowser = true)
{
if (_isRunning) return;
@ -75,7 +76,10 @@ namespace WelsonJS.Launcher
_listener.Start();
// Open the web browser
Program.OpenWebBrowser(_prefix);
if (IsOpenWebBrowser)
{
Program.OpenWebBrowser(_prefix);
}
// Run a task with cancellation token
_serverTask = Task.Run(() => ListenLoop(_cts.Token));

View File

@ -2,9 +2,11 @@
<configuration>
<appSettings>
<add key="ResourceServerPrefix" value="http://localhost:3000/"/>
<add key="ResourceServerAutoStart" value="true"/>
<add key="RepositoryUrl" value="https://github.com/gnh1201/welsonjs"/>
<add key="CopilotUrl" value="https://copilot.microsoft.com/"/>
<add key="DevToolsPrefix" value="http://localhost:9222/"/>
<add key="ChromiumDevToolsPrefix" value="http://localhost:9222/"/>
<add key="ChromiumFileName" value="msedge.exe"/>
<add key="AzureAiServicePrefix" value="https://ai-catswords656881030318.services.ai.azure.com/"/>
<add key="AzureAiServiceApiKey" value=""/>
<add key="AzureAiServiceApiVersion" value="2024-05-01-preview"/>