Home > Mobile >  service-worker.js catch updatefound before running other custom functions
service-worker.js catch updatefound before running other custom functions

Time:12-29

Is there a way to check if the service worker found an update before loading custom functions?

i have this function which is working, but it runs the custom functions twice, and seems very untidy..

I'm looking for a way to only run the custom functions once, and not when an update was found and installed. When an update is found, the user || the page will reload automatically and then the custom functions can run normally..

I added the reg.events in this function to determine where to place my custom functions. I hope this question is understandable..

function installApp(path, scope) {
if ('serviceWorker' in navigator) {
        navigator.serviceWorker.register(path, {
            scope: scope
        }).then((reg) => {  
       // event listener to catch the prompt if any and store in
      // an instance for later use with add to homescreen() function.
       getPrompt(); 

       // this is a custom alert type notification      
       makeProgress('System','is ok'); 
                    
      /* THIS IS THE UPDATE FOUND FUNCTION */

        reg.onupdatefound = function() {
    var installingWorker = reg.installing;
    installingWorker.onstatechange = function() {
      switch (installingWorker.state) {
        case 'installed':
          if (navigator.serviceWorker.controller) {
     // the _clear() function removes items from the locaforage db to 
    // force the app to not auto login, but let the user
    // login again to refresh any data when the page reloads
                _clear('uuid');
                _clear('user');
                _clear('token');
                makeProgress('new version','reload app');
          } else {
           // removes any custom notifications
                    clearProgress(); 
            //just go into the app because everything is loaded.
            //We dont need to reinstall the 
            //homescreen or listen for the homescreen because this
           //is an update and the homescreen should already be installed?
               enterApp(); 
          }
          break;
        case 'redundant':
          // removes any custom notifications cause
          //the install is complete
            clearProgress();
               enterApp(); 
          console.log('The installing service worker became redundant.');
          break;
      }
    };
            return;
  };
                         


                  /** Here is the events that fire during the install
                 //  process and where i am currently stuck **/
  
    if (reg.installing) {
       makeProgress('updating','files');
    /* THE SERVICE WORKER IS DOWNLOADING THE CACHE FROM THE SERVER */
    } else if (reg.waiting) {

    /* what message here ?*/
    /* as far as i can tell, THE SERVICE WORKER IS WAITING FOR 
    *//*PREVIOUS SERVICE WORKER TO BEREFRESHED SO A RELOAD */
    /*UI SHOULD COME HERE??*/

    } else if (reg.active) {
    /* what message here ?*/
    /* IS THIS THE BEST PLACE TO RUN THE BELOW CUSTOM
    *//*FUNCTIONS?? WILL //THEY ALWAYS FIRE */
    }
                    


/** AT WHICH OF THE EVENTS ABOVE WILL I ADD THE FUNCTIONS FROM HERE **/

                requestWakeLock();  
       const browserFeatures = detectFeatures(reg);
               setCompatibilityArray(browserFeatures);
         
localforage.ready().then(function() {
                localforage.getItem('homescreen').then(function (value) {
               if(value != 1){           
    if (platform == 'iPhone' || platform == 'iPad') {
installHome();                                      
                                    } else {
     makeProgress('waiting', 'prompt');  
                         waitPrompt();
                         }
                         return;
               } else {
               enterApp();
                         return;        
               }
                         
    }).catch(function (err) {
    alertIt('something went wrong. Please refresh the page to try again.  If the problem persists, try another browser.</br>', 'warning', 0);
                    return;
    });
                
}).catch(function (err) {
  alertIt('Something went wrong.<br>Please refresh the page to restart the installation process.<br>' err, 'danger', 0);
                return;
});
    
    
    /** TO HERE, WITHOUT RUNNING THESE FUNCTION DURING*/
   /*THE ONUPDATEFOUND EVENT AS THEN THEY WILL    RUN TWICE**/
    
    
    
        }, (err) => {
            alertIt('Something went wrong.<br>Please refresh the page to restart the   installation process.<br>', 'danger', 0);
        })
} else {
           alertIt('This browser is not compatible with this app.<br>Please try to use a   different browser to install this application.<br>', 'danger', 0);
   return;
}
}

I initialize this script like so:

  window.addEventListener("load", () => {
 makeProgress('Checking','system');     
  installApp(appsPath, appScope);
  })

CodePudding user response:

basically they must not be invoked if a new update is found..

I discovered that the onupdate function runs when old service worker is active..

If the onupdste function fires it changes a variable to a true value

I then used a time out function in the active event to see if a variable had changed... if it did change then i return false, and let the onupdate functions continue their course.. otherwise i continue to load my custom functions...Its working, but it doesn't seem like the best way.

Do you have a better method?

CodePudding user response:

basically they must not be invoked if a new update is found..

I discovered that the onupdate function runs when old service worker is active..

If the onupdate function fires it changes a variable to a true value

I then used a time out function in the active event to see if a variable had changed... if it did change then i return false, and let the onupdate functions continue their course.. otherwise i continue to load my custom functions...Its working, but it doesn't seem like the best way.

Do you have a better method?

so like this:

    function installApp(path, scope) {
    if ('serviceWorker' in navigator) {
        navigator.serviceWorker.register(path, {
            scope: scope
        }).then((reg) => { 
       getPrompt(); 
       makeProgress('refreshing','files'); 
                    
    var entApp = true;
        reg.onupdatefound = function() {
    entApp = false;
    var installingWorker = reg.installing;
    installingWorker.onstatechange = function() {
      switch (installingWorker.state) {
        case 'installed':
          if (navigator.serviceWorker.controller) {
                _clear('uuid');
                _clear('user');
                _clear('token');
                makeProgress('new version','reloading app');
    setTimeout(function(){
    location.reload();
    }, 2500);
    return;
          } else {
      /*NOT SURE WHAT IS SUPPOSED TO GO HERE, SO I JUST RELOADED THE PAGE*/
                makeProgress('new version','reloading app');
    setTimeout(function(){
    location.reload();
    }, 2500);
    return;
          }
          break;
        case 'redundant':
      /*NOT SURE WHAT IS SUPPOSED TO GO HERE, SO I JUST RELOADED THE PAGE*/
                makeProgress('new version','reloading app');
    setTimeout(function(){
    location.reload();
    }, 2500);
    return;
          break;
      }
    };
            return;
     };
                         


    if (reg.active) {

    /** RIGHT HERE IS WHERE THE ONUPDATE FIRES. I GAVE IT A 
     2.5 SECONDS TO DO ITS THING, THEN CHECKED TO SEE IF THERE WAS
    AN UPDATE, IF NO UPDATE THEN I RUN MY CUSTOM FUNCTIONS, OTHERWISE
    THE ONUPDATE FUNCTION RELOADS THE PAGE AND THE UPDATED SW.JS FILE
    WILL THEN RUN THESE FUNCTIONS WHEN ITS ACTIVE.. IS THERE A BETTER
    IN-BUILT METHOD TO DO THIS?**/

    setTimeout(function(){
    if(entApp === true){
                requestWakeLock();  
       const browserFeatures = detectFeatures(reg);
               setCompatibilityArray(browserFeatures);
         
    localforage.ready().then(function() {
                localforage.getItem('homescreen').then(function (value) {
               if(value != 1){           
    if (platform == 'iPhone' || platform == 'iPad') {
    installHome();                                      
                                    } else {
     makeProgress('waiting', 'prompt');  
                         waitPrompt();
                         }
                         return;
               } else {
               enterApp();
                         return;        
               }
                         
    }).catch(function (err) {
    alertIt('something went wrong. Please refresh the page to try again.  If     the problem persists, try another browser.</br>', 'warning', 0);
                    return;
    });
                
    }).catch(function (err) {
    alertIt('Something went wrong.<br>Please refresh the page to restart the   installation process.<br>' err, 'danger', 0);
                return;
    });

    }
    }, 2500);
    }
  • Related