From a4dcf5f8dfda5367476fded05402a2c2e65244cd Mon Sep 17 00:00:00 2001 From: paweldomas Date: Mon, 12 Dec 2016 15:52:01 -0600 Subject: [PATCH] feat(index.html): reload when resource fails to load The page will be reloaded if any of the mandatory scripts/resources fails to load. The reload will be delayed with exponential backoff starting from 2 seconds. The retry attempt counter is passed as 'rCounter' query attribute. --- index.html | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/index.html b/index.html index f088a91ac..7fe77016f 100644 --- a/index.html +++ b/index.html @@ -30,7 +30,41 @@ window.onload = function() { document.body.innerHTML = "The application failed to load, missing file: " - + fileRef; + + fileRef; + + // The whole complex part below implements page reloads with + // "exponential backoff". The retry attempt is passes as + // "rCounter" query parameter + var href = window.location.href; + + var retryMatch = href.match(/.+(\?|&)rCounter=(\d+)/); + var retryCountStr = retryMatch ? retryMatch[2] : "0"; + var retryCount = Number.parseInt(retryCountStr); + + if (retryMatch == null) { + var separator = href.indexOf("?") === -1 ? "?" : "&"; + var hashIdx = href.indexOf("#"); + + if (hashIdx === -1) { + href += separator + "rCounter=1"; + } else { + var hashPart = href.substr(hashIdx); + + href = href.substr(0, hashIdx) + + separator + "rCounter=1" + hashPart; + } + } else { + var separator = retryMatch[1]; + + href = href.replace( + /(\?|&)rCounter=(\d+)/, + separator + "rCounter=" + (retryCount + 1)); + } + + var delay = Math.pow(2, retryCount) * 2000; + + window.setTimeout( + function () { window.location.replace(href); }, delay); }; window.removeEventListener( 'error', loadErrHandler, true /* capture phase */);