From 596bbfbce1a62de66c26f2ce8ab4ee8650b64332 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nacho=20Codo=C3=B1er?= Date: Mon, 16 Dec 2024 16:53:07 +0100 Subject: [PATCH] implement a retry mechanism over a second --- packages/accounts-oauth/oauth_client.js | 46 +++++++++++----------- packages/facebook-oauth/facebook_server.js | 1 - 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/packages/accounts-oauth/oauth_client.js b/packages/accounts-oauth/oauth_client.js index a5fb19177c..2cb04a8fd2 100644 --- a/packages/accounts-oauth/oauth_client.js +++ b/packages/accounts-oauth/oauth_client.js @@ -74,32 +74,34 @@ Meteor.startup(() => { Accounts.oauth.tryLoginAfterPopupClosed = ( credentialToken, callback, - shouldRetry = true + timeout = 1000 ) => { - const credentialSecret = - OAuth._retrieveCredentialSecret(credentialToken); + let startTime = Date.now(); + let intervalId; + const checkForCredentialSecret = (clearInterval = false) => { + const credentialSecret = OAuth._retrieveCredentialSecret(credentialToken); + if (clearInterval || credentialSecret) { + Meteor.clearInterval(intervalId); + Accounts.callLoginMethod({ + methodArguments: [{ oauth: { credentialToken, credentialSecret } }], + userCallback: callback ? err => callback(convertError(err)) : () => {}, + }); + } + }; + // Check immediately + checkForCredentialSecret(); + + // Then check on an interval // In some case the function OAuth._retrieveCredentialSecret() can return null, because the local storage might not // be ready. So we retry after a timeout. - - if (!credentialSecret && shouldRetry) { - Meteor.setTimeout( - () => - Accounts.oauth.tryLoginAfterPopupClosed( - credentialToken, - callback, - false - ), - 500 - ); - return; - } - - // continue with the rest of the function - Accounts.callLoginMethod({ - methodArguments: [{ oauth: { credentialToken, credentialSecret } }], - userCallback: callback ? err => callback(convertError(err)) : () => {}, - }); + intervalId = Meteor.setInterval(() => { + if (Date.now() - startTime > timeout) { + checkForCredentialSecret(true); + } else { + checkForCredentialSecret(); + } + }, 250); }; Accounts.oauth.credentialRequestCompleteHandler = callback => diff --git a/packages/facebook-oauth/facebook_server.js b/packages/facebook-oauth/facebook_server.js index c60a7ce200..c9f9610871 100644 --- a/packages/facebook-oauth/facebook_server.js +++ b/packages/facebook-oauth/facebook_server.js @@ -97,7 +97,6 @@ const getTokenResponse = async (query) => { .then((res) => res.json()) .then(data => { const fbAccessToken = data.access_token; - console.log("-> fbAccessToken", fbAccessToken); const fbExpires = data.expires_in; if (!fbAccessToken) { throw new Error("Failed to complete OAuth handshake with facebook " +