diff --git a/packages/insomnia/src/hidden-window-preload.ts b/packages/insomnia/src/hidden-window-preload.ts index 8b5b819a56..ad88bdc711 100644 --- a/packages/insomnia/src/hidden-window-preload.ts +++ b/packages/insomnia/src/hidden-window-preload.ts @@ -9,6 +9,7 @@ export interface HiddenBrowserWindowToMainBridgeAPI { onmessage: (listener: (data: any, callback: (result: any) => void) => void) => void; curlRequest: (options: any) => Promise; 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) { diff --git a/packages/insomnia/src/hidden-window.ts b/packages/insomnia/src/hidden-window.ts index bf8f3b5fba..c2d47fbd8e 100644 --- a/packages/insomnia/src/hidden-window.ts +++ b/packages/insomnia/src/hidden-window.ts @@ -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); } }); diff --git a/packages/insomnia/src/main/window-utils.ts b/packages/insomnia/src/main/window-utils.ts index ee989eddad..6ae8715bd9 100644 --- a/packages/insomnia/src/main/window-utils.ts +++ b/packages/insomnia/src/main/window-utils.ts @@ -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(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; }