From 6f96d3bfde72daa6b08b410ac2794f7b3e4d0d89 Mon Sep 17 00:00:00 2001 From: Mat Brown Date: Wed, 13 Mar 2019 21:09:12 -0400 Subject: [PATCH] Retry calls to load gapi components This does not actually work: retrying `gapi.load()` does not retry the network request. --- src/services/gapi.js | 77 ++++++++++++++++++++++++-------------------- 1 file changed, 42 insertions(+), 35 deletions(-) diff --git a/src/services/gapi.js b/src/services/gapi.js index 6a4877b5e6..bd7e78f70d 100644 --- a/src/services/gapi.js +++ b/src/services/gapi.js @@ -13,49 +13,56 @@ export const SCOPES = [ const DISCOVERY_DOCS = ['https://classroom.googleapis.com/$discovery/rest?version=v1']; +const RETRY_OPTIONS = { + retries: 16, + factor: 2, + minTimeout: 200, + maxTimeout: 4000, +}; + class LoadError extends ExtendableError {} let isGapiLoadedAndConfigured = false; -const loadGapi = once(() => promiseRetry( - async(retry) => { - try { - return await new Promise((resolve, reject) => { - loadjs('https://apis.google.com/js/client.js', { - success() { - resolve(window.gapi); - }, - error(failedPaths) { - reject(new LoadError(`Failed to load ${failedPaths.join(', ')}`)); - }, +async function loadGapi() { + return promiseRetry( + async(retry) => { + try { + const gapi = await new Promise((resolve, reject) => { + loadjs('https://apis.google.com/js/client.js', { + success() { + resolve(window.gapi); + }, + error(failedPaths) { + reject(new LoadError(`Failed to load ${failedPaths.join(', ')}`)); + }, + }); + }); + + return await new Promise((resolve, reject) => { + gapi.load('client:auth2', { + callback: () => { + resolve(gapi); + }, + onerror: reject, + timeout: 1000, + ontimeout: () => { + reject(new Error('Timed out')); + }, + }); }); - }); - } catch (e) { - return retry(e); - } - }, - { - retries: 16, - factor: 2, - minTimeout: 200, - maxTimeout: 4000, - }, -)); + } catch (e) { + Reflect.deleteProperty(window, 'gapi'); + return retry(e); + } + }, + RETRY_OPTIONS, + ); +} export const loadAndConfigureGapi = once(async() => { const gapi = await loadGapi(); - await new Promise((resolve, reject) => { - gapi.load('client:auth2', { - callback: () => { - resolve(gapi); - }, - onerror: reject, - timeout: 5000, - ontimeout: () => { - reject(new Error('Timed out')); - }, - }); - }); + await gapi.client.init({ apiKey: config.firebaseApiKey, clientId: config.firebaseClientId,