fix: restart the hidden window when it is stuck

This commit is contained in:
George He
2024-03-18 17:20:15 +08:00
parent a299dffdb2
commit 8010fcfdcf
3 changed files with 28 additions and 0 deletions

View File

@@ -9,6 +9,7 @@ export interface HiddenBrowserWindowToMainBridgeAPI {
onmessage: (listener: (data: any, callback: (result: any) => void) => void) => void;
curlRequest: (options: any) => Promise<any>;
readCurlResponse: (options: { bodyPath: string; bodyCompression: Compression }) => Promise<{ body: string; error: string }>;
setBusy: (busy: boolean) => void;
}
const bridge: HiddenBrowserWindowToMainBridgeAPI = {
onmessage: listener => {
@@ -37,6 +38,7 @@ const bridge: HiddenBrowserWindowToMainBridgeAPI = {
curlRequest: options => ipcRenderer.invoke('curlRequest', options),
readCurlResponse: options => ipcRenderer.invoke('readCurlResponse', options),
setBusy: busy => ipcRenderer.send('set-hidden-window-busy-status', busy),
};
if (process.contextIsolated) {

View File

@@ -7,6 +7,7 @@ export interface HiddenBrowserWindowBridgeAPI {
};
window.bridge.onmessage(async (data, callback) => {
window.bridge.setBusy(true);
console.log('[hidden-browser-window] recieved message', data);
try {
const timeout = data.context.timeout || 5000;
@@ -20,6 +21,8 @@ window.bridge.onmessage(async (data, callback) => {
} catch (err) {
console.error('error', err);
callback({ error: err.message });
} finally {
window.bridge.setBusy(false);
}
});

View File

@@ -38,6 +38,7 @@ const MINIMUM_HEIGHT = 400;
const browserWindows = new Map<'Insomnia' | 'HiddenBrowserWindow', ElectronBrowserWindow>();
let localStorage: LocalStorage | null = null;
let hiddenWindowIsBusy = false;
interface Bounds {
height?: number;
@@ -55,9 +56,31 @@ export async function createHiddenBrowserWindow() {
invariant(mainWindow, 'MainWindow is not defined, please restart the app.');
console.log('[main] Registering the hidden window restarting handler');
ipcMain.on('set-hidden-window-busy-status', (_, busyStatus) => {
hiddenWindowIsBusy = busyStatus;
});
// when the main window runs a script
// if the hidden window is down, start it
ipcMain.handle('open-channel-to-hidden-browser-window', async event => {
if (hiddenWindowIsBusy) {
const runningHiddenWindow = browserWindows.get('HiddenBrowserWindow');
if (runningHiddenWindow == null) {
hiddenWindowIsBusy = false;
} else {
await new Promise<void>(resolve => {
invariant(runningHiddenWindow, 'hiddenBrowserWindow is running');
// overwrite the closed handler
runningHiddenWindow.on('closed', () => {
if (runningHiddenWindow) {
console.log('[main] restarting hidden browser window:', runningHiddenWindow.id);
browserWindows.delete('HiddenBrowserWindow');
}
resolve();
});
stopHiddenBrowserWindow();
});
}
}
if (browserWindows.get('HiddenBrowserWindow')) {
return;
}