diff --git a/ts/updater/common.ts b/ts/updater/common.ts index 056daae4b3..2ee00299d3 100644 --- a/ts/updater/common.ts +++ b/ts/updater/common.ts @@ -39,6 +39,9 @@ const rimrafPromise = pify(rimraf); const { platform } = process; export const ACK_RENDER_TIMEOUT = 10000; +export const GOT_CONNECT_TIMEOUT = 2 * 60 * 1000; +export const GOT_LOOKUP_TIMEOUT = 2 * 60 * 1000; +export const GOT_SOCKET_TIMEOUT = 2 * 60 * 1000; export type UpdaterInterface = { force(): Promise; @@ -337,6 +340,13 @@ function getGotOptions(): GotOptions { 'User-Agent': getUserAgent(packageJson.version), }, useElectronNet: false, + timeout: { + connect: GOT_CONNECT_TIMEOUT, + lookup: GOT_LOOKUP_TIMEOUT, + + // This timeout is reset whenever we get new data on the socket + socket: GOT_SOCKET_TIMEOUT, + }, }; } diff --git a/ts/updater/macos.ts b/ts/updater/macos.ts index e26edb6d3e..3e912f4c1e 100644 --- a/ts/updater/macos.ts +++ b/ts/updater/macos.ts @@ -82,10 +82,20 @@ async function checkDownloadAndInstall( const { fileName: newFileName, version: newVersion } = result; if (fileName !== newFileName || !version || gt(newVersion, version)) { + const oldFileName = fileName; + const oldVersion = version; + deleteCache(updateFilePath, logger); fileName = newFileName; version = newVersion; - updateFilePath = await downloadUpdate(fileName, logger); + try { + updateFilePath = await downloadUpdate(fileName, logger); + } catch (error) { + // Restore state in case of download error + fileName = oldFileName; + version = oldVersion; + throw error; + } } if (!updateFilePath) { diff --git a/ts/updater/windows.ts b/ts/updater/windows.ts index 2e5136d237..ba4496f7ba 100644 --- a/ts/updater/windows.ts +++ b/ts/updater/windows.ts @@ -83,10 +83,21 @@ async function checkDownloadAndInstall( const { fileName: newFileName, version: newVersion } = result; if (fileName !== newFileName || !version || gt(newVersion, version)) { + const oldFileName = fileName; + const oldVersion = version; + deleteCache(updateFilePath, logger); fileName = newFileName; version = newVersion; - updateFilePath = await downloadUpdate(fileName, logger); + + try { + updateFilePath = await downloadUpdate(fileName, logger); + } catch (error) { + // Restore state in case of download error + fileName = oldFileName; + version = oldVersion; + throw error; + } } const publicKey = hexToBinary(getFromConfig('updatesPublicKey'));