From 47df54d828b769ee920a98030beef321a7f0feb3 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Thu, 3 Nov 2022 14:11:59 -0400 Subject: [PATCH] Fix timeout Signed-off-by: Sebastian Malton --- .../runnables/setup-shell.injectable.ts | 3 +- .../compute-shell-environment.injectable.ts | 34 +++++-------------- ...mpute-unix-shell-environment.injectable.ts | 27 +++++++++++---- 3 files changed, 32 insertions(+), 32 deletions(-) diff --git a/src/main/start-main-application/runnables/setup-shell.injectable.ts b/src/main/start-main-application/runnables/setup-shell.injectable.ts index 9eb736b2db..6f80b225ac 100644 --- a/src/main/start-main-application/runnables/setup-shell.injectable.ts +++ b/src/main/start-main-application/runnables/setup-shell.injectable.ts @@ -55,7 +55,8 @@ const setupShellInjectable = getInjectable({ ...process.env, }; - logger.debug(`[SHELL-SYNC]: Synced shell env, and updating`, env, process.env); + logger.info(`[SHELL-SYNC]: Synced shell env`); + logger.debug(`[SHELL-SYNC]: updated env`, process.env); }, }; }, diff --git a/src/main/utils/shell-env/compute-shell-environment.injectable.ts b/src/main/utils/shell-env/compute-shell-environment.injectable.ts index 8307f1f319..63eaede181 100644 --- a/src/main/utils/shell-env/compute-shell-environment.injectable.ts +++ b/src/main/utils/shell-env/compute-shell-environment.injectable.ts @@ -6,7 +6,6 @@ import type { AsyncResult } from "../../../common/utils/async-result"; import { getInjectable } from "@ogre-tools/injectable"; import isWindowsInjectable from "../../../common/vars/is-windows.injectable"; -import { disposer, hasTypedProperty, isString } from "../../../common/utils"; import computeUnixShellEnvironmentInjectable from "./compute-unix-shell-environment.injectable"; export type EnvironmentVariables = Partial>; @@ -28,39 +27,24 @@ const computeShellEnvironmentInjectable = getInjectable({ return async (shell) => { const controller = new AbortController(); const shellEnv = computeUnixShellEnvironment(shell, { signal: controller.signal }); - const cleanup = disposer(); - const timeoutHandle = setTimeout(() => controller.abort(), 30_000); - cleanup.push(() => clearTimeout(timeoutHandle)); + const result = await shellEnv; - try { - return { - callWasSuccessful: true, - response: await shellEnv, - }; - } catch (error) { - if (controller.signal.aborted) { - return { - callWasSuccessful: false, - error: "Resolving shell environment is taking very long. Please review your shell configuration.", - }; - } + clearTimeout(timeoutHandle); - if (error && hasTypedProperty(error, "stderr", isString)) { - return { - callWasSuccessful: false, - error: `${error}:\n${error.stderr}`, - }; - } + if (result.callWasSuccessful) { + return result; + } + if (controller.signal.aborted) { return { callWasSuccessful: false, - error: String(error), + error: `Resolving shell environment is taking very long. Please review your shell configuration: ${result.error}`, }; - } finally { - cleanup(); } + + return result; }; }, }); diff --git a/src/main/utils/shell-env/compute-unix-shell-environment.injectable.ts b/src/main/utils/shell-env/compute-unix-shell-environment.injectable.ts index b2ef0564e9..c23f8bb651 100644 --- a/src/main/utils/shell-env/compute-unix-shell-environment.injectable.ts +++ b/src/main/utils/shell-env/compute-unix-shell-environment.injectable.ts @@ -11,12 +11,13 @@ import loggerInjectable from "../../../common/logger.injectable"; import processExecPathInjectable from "./execPath.injectable"; import processEnvInjectable from "./env.injectable"; import { object } from "../../../common/utils"; +import type { AsyncResult } from "../../../common/utils/async-result"; export interface UnixShellEnvOptions { signal: AbortSignal; } -export type ComputeUnixShellEnvironment = (shell: string, opts: UnixShellEnvOptions) => Promise; +export type ComputeUnixShellEnvironment = (shell: string, opts: UnixShellEnvOptions) => Promise>; const getResetProcessEnv = (src: Partial>, overrides: Partial>): { resetEnvPairs: (target: Partial>) => void; @@ -111,9 +112,17 @@ const computeUnixShellEnvironmentInjectable = getInjectable({ shellProcess.on("error", (err) => reject(err)); shellProcess.on("close", (code, signal) => { if (code || signal) { - return reject(Object.assign(new Error(`Unexpected return code from spawned shell (code: ${code}, signal: ${signal})`), { + const context = { + code, + signal, + stdout: Buffer.concat(stdout).toString("utf-8"), stderr: Buffer.concat(stderr).toString("utf-8"), - })); + }; + + return resolve({ + callWasSuccessful: false, + error: `Shell did not exit sucessfully: ${JSON.stringify(context, null, 4)}`, + }); } try { @@ -123,12 +132,18 @@ const computeUnixShellEnvironmentInjectable = getInjectable({ const match = regex.exec(rawOutput); const strippedRawOutput = match ? match[1] : "{}"; - const resolvedEnv = JSON.parse(strippedRawOutput); + const resolvedEnv = JSON.parse(strippedRawOutput) as Partial>; resetEnvPairs(resolvedEnv); - resolve(resolvedEnv); + resolve({ + callWasSuccessful: true, + response: resolvedEnv, + }); } catch (err) { - reject(err); + resolve({ + callWasSuccessful: false, + error: String(err), + }); } });