diff --git a/src/client.js b/src/client.js index 9a0705b5e..50834af63 100644 --- a/src/client.js +++ b/src/client.js @@ -35,7 +35,12 @@ import {StubStore} from "./store/stub"; import {createNewMatrixCall} from "./webrtc/call"; import * as utils from './utils'; import {sleep} from './utils'; -import {MatrixError, PREFIX_MEDIA_R0, PREFIX_UNSTABLE} from "./http-api"; +import { + MatrixError, + PREFIX_MEDIA_R0, + PREFIX_UNSTABLE, + retryNetworkOperation, +} from "./http-api"; import {getHttpUriForMxc} from "./content-repo"; import * as ContentHelpers from "./content-helpers"; import * as olmlib from "./crypto/olmlib"; @@ -49,7 +54,6 @@ import {randomString} from './randomstring'; import {PushProcessor} from "./pushprocessor"; import {encodeBase64, decodeBase64} from "./crypto/olmlib"; import { User } from "./models/user"; -import {retryNetworkOperation} from "./utils"; const SCROLLBACK_DELAY_MS = 3000; export const CRYPTO_ENABLED = isCryptoAvailable(); diff --git a/src/http-api.js b/src/http-api.js index bce0534ed..e7134bb59 100644 --- a/src/http-api.js +++ b/src/http-api.js @@ -948,3 +948,34 @@ export class AbortError extends Error { return "AbortError"; } } + +/** + * Retries a network operation run in a callback. + * @param {number} maxAttempts maximum attempts to try + * @param {Function} callback callback that returns a promise of the network operation. If rejected with ConnectionError, it will be retried by calling the callback again. + * @return {any} the result of the network operation + * @throws {ConnectionError} If after maxAttempts the callback still throws ConnectionError + */ +export async function retryNetworkOperation(maxAttempts, callback) { + let attempts = 0; + let lastConnectionError = null; + while (attempts < maxAttempts) { + try { + if (attempts > 0) { + const timeout = 1000 * Math.pow(2, attempts); + console.log(`network operation failed ${attempts} times,` + + ` retrying in ${timeout}ms...`); + await new Promise(r => setTimeout(r, timeout)); + } + return await callback(); + } catch (err) { + if (err instanceof ConnectionError) { + attempts += 1; + lastConnectionError = err; + } else { + throw err; + } + } + } + throw lastConnectionError; +} diff --git a/src/utils.ts b/src/utils.ts index bf8e80664..350c48ae5 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -749,26 +749,3 @@ export function setCrypto(c: Object) { export function getCrypto(): Object { return crypto; } - -export async function retryNetworkOperation(maxAttempts, callback) { - let attempts = 0; - let lastConnectionError = null; - while (attempts < maxAttempts) { - try { - if (attempts > 0) { - const timeout = 1000 * Math.pow(2, attempts); - console.log(`network operation failed ${attempts} times, retrying in ${timeout}ms...`); - await new Promise(r => setTimeout(r, timeout)); - } - return await callback(); - } catch (err) { - if (err instanceof ConnectionError) { - attempts += 1; - lastConnectionError = err; - } else { - throw err; - } - } - } - throw lastConnectionError; -}