Files
dashcaddy/dashcaddy-installer/src/preload/index.js
T
Krystie 8ac1937784 fix: recursive data nesting guard + VM destroy in uninstall wizard
- Cleaned 242MB of recursive data/data/data/ nesting
- Added nesting-guard.js: auto-detects and removes recursive duplicates at startup
- Wired VM sandbox cleanup into uninstall wizard (calls vmDestroy before regular uninstall)
- Container stats, health data, and VM disk all cleaned on uninstall
2026-08-13 02:49:25 -07:00

131 lines
5.2 KiB
JavaScript

const { contextBridge, ipcRenderer } = require('electron');
// Expose protected methods that allow the renderer process to use
// the ipcRenderer without exposing the entire object
contextBridge.exposeInMainWorld('electronAPI', {
// Platform detection
checkPlatform: () => ipcRenderer.invoke('check-platform'),
// Dependency checking
checkDependencies: (options) => ipcRenderer.invoke('check-dependencies', options),
checkDocker: () => ipcRenderer.invoke('check-docker'),
checkCaddy: (options) => ipcRenderer.invoke('check-caddy', options),
installDocker: () => ipcRenderer.invoke('install-docker'),
installCaddy: (options) => ipcRenderer.invoke('install-caddy', options),
// Configuration
validatePath: (path) => ipcRenderer.invoke('validate-path', path),
selectFolder: () => ipcRenderer.invoke('select-folder'),
saveConfig: (config) => ipcRenderer.invoke('save-config', config),
loadConfig: (path) => ipcRenderer.invoke('load-config', path),
// File deployment
validateSources: () => ipcRenderer.invoke('validate-sources'),
deployDashboard: (installPath) => ipcRenderer.invoke('deploy-dashboard', installPath),
deployAPI: (installPath) => ipcRenderer.invoke('deploy-api', installPath),
deployComplete: (installPath) => ipcRenderer.invoke('deploy-complete', installPath),
// Caddyfile generation
createCaddyfile: (installPath, options) => ipcRenderer.invoke('create-caddyfile', installPath, options),
createDockerCompose: (installPath) => ipcRenderer.invoke('create-docker-compose', installPath),
// Browser launcher
openDashboard: (port, hostname) => ipcRenderer.invoke('open-dashboard', port, hostname),
// Installation
runInstallation: (config) => ipcRenderer.invoke('run-installation', config),
// DNS
testDNSConnection: (credentials) => ipcRenderer.invoke('test-dns-connection', credentials),
// Network detection
detectNetwork: () => ipcRenderer.invoke('detect-network'),
// Health check
healthCheck: (config) => ipcRenderer.invoke('health-check', config),
// Uninstallation
detectInstallation: () => ipcRenderer.invoke('detect-installation'),
checkPreservedSettings: (installPath) => ipcRenderer.invoke('check-preserved-settings', installPath),
restorePreservedSettings: (installPath) => ipcRenderer.invoke('restore-preserved-settings', installPath),
runUninstallation: (options) => ipcRenderer.invoke('run-uninstallation', options),
// Service management
startServices: (config) => ipcRenderer.invoke('start-services', config),
stopServices: (config) => ipcRenderer.invoke('stop-services', config),
checkServiceStatus: (config) => ipcRenderer.invoke('check-service-status', config),
// DNS credentials
saveDNSCredentials: (credentials, installPath) =>
ipcRenderer.invoke('save-dns-credentials', credentials, installPath),
// Branding
saveBranding: (branding, installPath) =>
ipcRenderer.invoke('save-branding', branding, installPath),
// File selection (for logo, etc.)
selectFile: (options) => ipcRenderer.invoke('select-file', options),
// Event listeners
onStepProgress: (callback) => {
ipcRenderer.on('step-progress', (event, data) => callback(data));
},
onStepComplete: (callback) => {
ipcRenderer.on('step-complete', (event, data) => callback(data));
},
onStepError: (callback) => {
ipcRenderer.on('step-error', (event, data) => callback(data));
},
onInstallationComplete: (callback) => {
ipcRenderer.on('installation-complete', (event, data) => callback(data));
},
onDeploymentProgress: (callback) => {
ipcRenderer.on('deployment-progress', (event, data) => callback(data));
},
onUninstallProgress: (callback) => {
ipcRenderer.on('uninstall-progress', (event, data) => callback(data));
},
onUninstallStepComplete: (callback) => {
ipcRenderer.on('uninstall-step-complete', (event, data) => callback(data));
},
onUninstallComplete: (callback) => {
ipcRenderer.on('uninstall-complete', (event, data) => callback(data));
},
onUninstallError: (callback) => {
ipcRenderer.on('uninstall-error', (event, data) => callback(data));
},
// --- VM Disk Sandbox ---
vmGetPresets: () => ipcRenderer.invoke('vm:get-presets'),
vmGetStatus: () => ipcRenderer.invoke('vm:get-status'),
vmProvision: (opts) => ipcRenderer.invoke('vm:provision', opts),
vmDestroy: (opts) => ipcRenderer.invoke('vm:destroy', opts),
vmExportData: (opts) => ipcRenderer.invoke('vm:export-data', opts),
getDiskSpace: (path) => ipcRenderer.invoke('get-disk-space', path),
onVMProgress: (callback) => {
ipcRenderer.on('vm:progress', (event, data) => callback(data));
},
onVMComplete: (callback) => {
ipcRenderer.on('vm:complete', (event, data) => callback(data));
},
onVMError: (callback) => {
ipcRenderer.on('vm:error', (event, data) => callback(data));
},
// --- Auto-updater ---
checkForUpdates: () => ipcRenderer.invoke('check-for-updates'),
quitAndInstall: () => ipcRenderer.invoke('quit-and-install'),
onUpdateAvailable: (callback) => {
ipcRenderer.on('update-available', (event, data) => callback(data));
},
onUpdateDownloaded: (callback) => {
ipcRenderer.on('update-downloaded', (event, data) => callback(data));
},
// Remove listeners
removeListener: (channel) => {
ipcRenderer.removeAllListeners(channel);
}
});