Full codebase including API server (32 modules + routes), dashboard frontend, DashCA certificate distribution, installer script, and deployment skills.
112 lines
2.7 KiB
JavaScript
112 lines
2.7 KiB
JavaScript
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;
|