AES-256-GCM + PBKDF2 encrypted config backup (.mhu files). Export/import all accounts, settings, and history. Pre-import safety backup of current config. Password modal with confirmation for export. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
85 lines
3.5 KiB
JavaScript
85 lines
3.5 KiB
JavaScript
const { contextBridge, ipcRenderer, webUtils } = require('electron');
|
|
|
|
contextBridge.exposeInMainWorld('api', {
|
|
// Config
|
|
getConfig: () => ipcRenderer.invoke('get-config'),
|
|
saveConfig: (config) => ipcRenderer.invoke('save-config', config),
|
|
getHistory: () => ipcRenderer.invoke('get-history'),
|
|
clearHistory: () => ipcRenderer.invoke('clear-history'),
|
|
|
|
// Hoster settings
|
|
getHosterSettings: () => ipcRenderer.invoke('get-hoster-settings'),
|
|
saveHosterSettings: (settings) => ipcRenderer.invoke('save-hoster-settings', settings),
|
|
|
|
// Global settings
|
|
getGlobalSettings: () => ipcRenderer.invoke('get-global-settings'),
|
|
saveGlobalSettings: (settings) => ipcRenderer.invoke('save-global-settings', settings),
|
|
|
|
// Always on top
|
|
setAlwaysOnTop: (value) => ipcRenderer.invoke('set-always-on-top', value),
|
|
getAlwaysOnTop: () => ipcRenderer.invoke('get-always-on-top'),
|
|
|
|
// Shutdown after finish
|
|
setShutdownAfterFinish: (mode) => ipcRenderer.invoke('set-shutdown-after-finish', mode),
|
|
getShutdownAfterFinish: () => ipcRenderer.invoke('get-shutdown-after-finish'),
|
|
cancelShutdown: () => ipcRenderer.invoke('cancel-shutdown'),
|
|
|
|
// File selection
|
|
selectFiles: () => ipcRenderer.invoke('select-files'),
|
|
selectFolder: () => ipcRenderer.invoke('select-folder'),
|
|
|
|
// Upload control
|
|
startUpload: (payload) => ipcRenderer.invoke('start-upload', payload),
|
|
cancelUpload: () => ipcRenderer.invoke('cancel-upload'),
|
|
cancelSelectedJobs: (jobIds) => ipcRenderer.invoke('cancel-selected-jobs', jobIds),
|
|
finishAfterActive: () => ipcRenderer.invoke('finish-after-active'),
|
|
runHealthCheck: (payload) => ipcRenderer.invoke('run-health-check', payload),
|
|
|
|
// Clipboard
|
|
copyToClipboard: (text) => ipcRenderer.invoke('copy-to-clipboard', text),
|
|
|
|
// Updates
|
|
checkForUpdate: () => ipcRenderer.invoke('app:check-updates'),
|
|
installUpdate: () => ipcRenderer.invoke('app:install-update'),
|
|
abortUpdate: () => ipcRenderer.invoke('app:abort-update'),
|
|
getVersion: () => ipcRenderer.invoke('app:get-version'),
|
|
onUpdateAvailable: (callback) => {
|
|
ipcRenderer.on('app:update-available', (_event, data) => callback(data));
|
|
},
|
|
onUpdateProgress: (callback) => {
|
|
ipcRenderer.on('app:update-progress', (_event, data) => callback(data));
|
|
},
|
|
|
|
// Backup
|
|
exportBackup: (password) => ipcRenderer.invoke('export-backup', password),
|
|
importBackup: (password) => ipcRenderer.invoke('import-backup', password),
|
|
|
|
// Debug
|
|
debugTestUpload: () => ipcRenderer.invoke('debug-test-upload'),
|
|
debugLog: (msg) => ipcRenderer.invoke('debug-log', msg),
|
|
|
|
// Events (main -> renderer)
|
|
onUploadProgress: (callback) => {
|
|
ipcRenderer.on('upload-progress', (_event, data) => callback(data));
|
|
},
|
|
onUploadBatchDone: (callback) => {
|
|
ipcRenderer.on('upload-batch-done', (_event, data) => callback(data));
|
|
},
|
|
onUploadStats: (callback) => {
|
|
ipcRenderer.on('upload-stats', (_event, data) => callback(data));
|
|
},
|
|
onShutdownCountdown: (callback) => {
|
|
ipcRenderer.on('shutdown-countdown', (_event, data) => callback(data));
|
|
},
|
|
// File path from drag & drop (Electron 33+ compatible)
|
|
getPathForFile: (file) => webUtils.getPathForFile(file),
|
|
removeAllListeners: () => {
|
|
ipcRenderer.removeAllListeners('upload-progress');
|
|
ipcRenderer.removeAllListeners('upload-batch-done');
|
|
ipcRenderer.removeAllListeners('upload-stats');
|
|
ipcRenderer.removeAllListeners('app:update-available');
|
|
ipcRenderer.removeAllListeners('app:update-progress');
|
|
ipcRenderer.removeAllListeners('shutdown-countdown');
|
|
}
|
|
});
|