mirror of
https://github.com/lone-cloud/gerbil
synced 2026-06-04 04:04:44 -07:00
100 lines
2.4 KiB
TypeScript
100 lines
2.4 KiB
TypeScript
import { app } from 'electron';
|
|
import { platform } from 'process';
|
|
|
|
import {
|
|
createMainWindow,
|
|
cleanup as cleanupWindow,
|
|
getMainWindow,
|
|
} from '@/main/modules/window';
|
|
import {
|
|
initialize as initializeConfig,
|
|
getInstallDir,
|
|
getEnableSystemTray,
|
|
getStartMinimizedToTray,
|
|
} from '@/main/modules/config';
|
|
import { createTray } from '@/main/modules/tray';
|
|
import { safeExecute } from '@/utils/node/logging';
|
|
import { stopKoboldCpp } from '@/main/modules/koboldcpp/launcher';
|
|
import { stopFrontend as stopSillyTavern } from '@/main/modules/sillytavern';
|
|
import { stopFrontend as stopOpenWebUI } from '@/main/modules/openwebui';
|
|
import { stopStaticServer } from '@/main/modules/static-server';
|
|
import { setupIPCHandlers } from '@/main/ipc';
|
|
import { ensureDir } from '@/utils/node/fs';
|
|
import { PRODUCT_NAME } from '@/constants';
|
|
|
|
export async function initializeApp(options?: { startMinimized?: boolean }) {
|
|
const gotTheLock = app.requestSingleInstanceLock();
|
|
|
|
if (!gotTheLock) {
|
|
app.quit();
|
|
return;
|
|
}
|
|
|
|
app.on('second-instance', () => {
|
|
const mainWindow = getMainWindow();
|
|
|
|
if (!mainWindow.isVisible()) {
|
|
mainWindow.show();
|
|
}
|
|
|
|
if (mainWindow.isMinimized()) {
|
|
mainWindow.restore();
|
|
}
|
|
|
|
mainWindow.focus();
|
|
});
|
|
|
|
const installDir = getInstallDir();
|
|
|
|
await app.whenReady();
|
|
app.setName(PRODUCT_NAME);
|
|
await initializeConfig();
|
|
await ensureDir(installDir);
|
|
|
|
const startMinimized = options?.startMinimized ?? getStartMinimizedToTray();
|
|
const trayEnabled = getEnableSystemTray();
|
|
|
|
await createMainWindow({ startHidden: startMinimized && trayEnabled });
|
|
createTray();
|
|
|
|
setupIPCHandlers();
|
|
|
|
app.on('window-all-closed', () => {
|
|
if (platform === 'darwin') {
|
|
return;
|
|
}
|
|
|
|
app.quit();
|
|
});
|
|
|
|
app.on('before-quit', (event) => {
|
|
event.preventDefault();
|
|
|
|
void safeExecute(async () => {
|
|
const cleanupPromises = [
|
|
Promise.resolve(cleanupWindow()),
|
|
stopKoboldCpp(),
|
|
stopSillyTavern(),
|
|
stopOpenWebUI(),
|
|
stopStaticServer(),
|
|
];
|
|
|
|
const timeoutPromise = new Promise<void>((resolve) => {
|
|
setTimeout(() => {
|
|
resolve();
|
|
}, 10000);
|
|
});
|
|
|
|
await Promise.race([Promise.all(cleanupPromises), timeoutPromise]);
|
|
}, 'Error during cleanup');
|
|
|
|
cleanupWindow();
|
|
|
|
app.exit(0);
|
|
});
|
|
|
|
app.on('will-quit', (event) => {
|
|
event.preventDefault();
|
|
app.exit(0);
|
|
});
|
|
}
|