Initial commit: DashCaddy v1.0
Full codebase including API server (32 modules + routes), dashboard frontend, DashCA certificate distribution, installer script, and deployment skills.
This commit is contained in:
111
dashcaddy-installer/src/main/browser-launcher.js
Normal file
111
dashcaddy-installer/src/main/browser-launcher.js
Normal file
@@ -0,0 +1,111 @@
|
||||
const { exec } = require('child_process');
|
||||
const { promisify } = require('util');
|
||||
const { getPlatformInfo } = require('../shared/platform-utils');
|
||||
|
||||
const execAsync = promisify(exec);
|
||||
|
||||
/**
|
||||
* BrowserLauncher - Opens URLs in the default browser
|
||||
*/
|
||||
class BrowserLauncher {
|
||||
/**
|
||||
* Open URL in default browser
|
||||
* @param {string} url - URL to open
|
||||
*/
|
||||
async openURL(url) {
|
||||
try {
|
||||
const platform = getPlatformInfo();
|
||||
let command;
|
||||
|
||||
switch (platform.os) {
|
||||
case 'windows':
|
||||
command = `start ${url}`;
|
||||
break;
|
||||
case 'macos':
|
||||
command = `open ${url}`;
|
||||
break;
|
||||
case 'linux':
|
||||
command = `xdg-open ${url}`;
|
||||
break;
|
||||
default:
|
||||
throw new Error(`Unsupported platform: ${platform.os}`);
|
||||
}
|
||||
|
||||
await execAsync(command);
|
||||
|
||||
return {
|
||||
success: true,
|
||||
url,
|
||||
platform: platform.os
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
success: false,
|
||||
error: error.message,
|
||||
url
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Open dashboard in browser
|
||||
* @param {number} port - Port dashboard is running on
|
||||
* @param {string} hostname - Hostname (default: localhost)
|
||||
*/
|
||||
async openDashboard(port = 8080, hostname = 'localhost') {
|
||||
const url = `http://${hostname}:${port}`;
|
||||
return this.openURL(url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Wait for service to be ready before opening
|
||||
* @param {string} url - URL to check
|
||||
* @param {number} maxAttempts - Maximum number of attempts
|
||||
* @param {number} delayMs - Delay between attempts in milliseconds
|
||||
*/
|
||||
async waitForService(url, maxAttempts = 30, delayMs = 1000) {
|
||||
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
||||
try {
|
||||
const response = await fetch(url);
|
||||
if (response.ok) {
|
||||
return { success: true, attempts: attempt };
|
||||
}
|
||||
} catch (error) {
|
||||
// Service not ready yet, continue waiting
|
||||
}
|
||||
|
||||
if (attempt < maxAttempts) {
|
||||
await new Promise(resolve => setTimeout(resolve, delayMs));
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
success: false,
|
||||
error: `Service did not become ready after ${maxAttempts} attempts`
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Open dashboard after waiting for it to be ready
|
||||
* @param {number} port - Port dashboard is running on
|
||||
* @param {string} hostname - Hostname (default: localhost)
|
||||
*/
|
||||
async openDashboardWhenReady(port = 8080, hostname = 'localhost') {
|
||||
const url = `http://${hostname}:${port}`;
|
||||
|
||||
// Wait for service to be ready
|
||||
const waitResult = await this.waitForService(url);
|
||||
|
||||
if (!waitResult.success) {
|
||||
return {
|
||||
success: false,
|
||||
error: waitResult.error
|
||||
};
|
||||
}
|
||||
|
||||
// Open in browser
|
||||
return this.openURL(url);
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = BrowserLauncher;
|
||||
Reference in New Issue
Block a user