WIP TOFU BOOTLOADER

This commit is contained in:
ansuz 2021-01-29 15:09:44 +05:30
parent 01cb64d07d
commit 65dd8f1d6a
6 changed files with 82 additions and 22 deletions

View file

@ -69,24 +69,76 @@ define([
require([document.querySelector('script[data-bootload]').getAttribute('data-bootload')]); require([document.querySelector('script[data-bootload]').getAttribute('data-bootload')]);
}; };
var urlArgs = RequireConfig().urlArgs;
var sw = window.navigator.serviceWorker; var sw = window.navigator.serviceWorker;
// If the browser doesn't support service workers, just start loading normally
if (!sw) { return void load(); } if (!sw) { return void load(); }
try {
sw
.register('/sw.js?'
+ RequireConfig().urlArgs
, { scope: '/' })
.then(function (reg) {
console.log("service-worker registered", reg);
load();
})
.catch(function (err) {
console.error(err);
load();
});
} catch (e) {
console.error(e);
load();
}
// TOFU
// calling back 'true' means it's safe to proceed
// otherwise load the old version
var TOFU_KEY = 'TOFU_URL_ARGS';
var checkVersion = function (msg, cb) {
var newUrlArgs = urlArgs;
var k = TOFU_KEY;
try {
var oldUrlArgs = localStorage.getItem(k);
if (!oldUrlArgs) {
//localStorage.setItem(k, newUrlArgs);
return void cb(true);
}
if (oldUrlArgs === newUrlArgs) {
return void cb(true);
}
// we don't have our fancy loading screen or other UI, so use window.confirm
return void setTimeout(function () {
var answer = window.confirm(msg);
//localStorage.setItem(k, newUrlArgs);
return void cb(answer);
});
} catch (err) {
localStorage.removeItem(k);
return void cb(false);
}
};
var loadServiceWorker = function (args, offline) {
var path = '/sw.js?' + args; // + (offline ? '&offline=1': ''); // XXX wrong way to do offline...
try {
sw
.register(path, { scope: '/' })
.then(function (reg) {
// XXX tell the service worker if it should stay offline...
localStorage.setItem(TOFU_KEY, args);
console.log("service-worker registered", reg);
load();
})
.catch(function (err) {
console.error(err);
load();
});
} catch (e) {
console.error(e);
load();
}
};
var msg = "ok to load a new version of cryptpad (" + urlArgs + ")?";
checkVersion(msg, function (consent) {
var consentfulWorker = urlArgs;
var offline = false;
//console.log(urlArgs);
if (!consent) {
consentfulWorker = localStorage.getItem(TOFU_KEY);
offline = true;
//return void loadServiceWorker(localStorage.getItem(TOFU_KEY), true);
} else {
console.error("THE USER CONSENTED TO THE UPDATE");
}
window.consentfulWorker = consentfulWorker;
loadServiceWorker(consentfulWorker, offline);
});
}); });

View file

@ -1932,7 +1932,7 @@ define([
var CRYPTPAD_VERSION = 'cryptpad-version'; var CRYPTPAD_VERSION = 'cryptpad-version';
var currentVersion = localStorage[CRYPTPAD_VERSION]; var currentVersion = localStorage[CRYPTPAD_VERSION];
var updateLocalVersion = function (newUrlArgs) { var updateLocalVersion = function (newUrlArgs) { // XXX
// Check for CryptPad updates // Check for CryptPad updates
var urlArgs = newUrlArgs || (Config.requireConf ? Config.requireConf.urlArgs : null); var urlArgs = newUrlArgs || (Config.requireConf ? Config.requireConf.urlArgs : null);
if (!urlArgs) { return; } if (!urlArgs) { return; }
@ -2089,7 +2089,7 @@ define([
STORE_READY: onStoreReady, STORE_READY: onStoreReady,
// Network // Network
NETWORK_DISCONNECT: common.onNetworkDisconnect.fire, NETWORK_DISCONNECT: common.onNetworkDisconnect.fire,
NETWORK_RECONNECT: function (data) { NETWORK_RECONNECT: function (data) { // XXX reconnect
require(['/api/config?' + (+new Date())], function (NewConfig) { require(['/api/config?' + (+new Date())], function (NewConfig) {
var update = updateLocalVersion(NewConfig.requireConf && NewConfig.requireConf.urlArgs); var update = updateLocalVersion(NewConfig.requireConf && NewConfig.requireConf.urlArgs);
if (update) { if (update) {

View file

@ -2659,7 +2659,7 @@ define([
if (typeof(cb) === 'function') { cb(returned); } if (typeof(cb) === 'function') { cb(returned); }
store.offline = false; store.offline = false;
sendDriveEvent('NETWORK_RECONNECT'); // Tell inner that we're now online sendDriveEvent('NETWORK_RECONNECT'); // Tell inner that we're now online // XXX
broadcast([], "UPDATE_METADATA"); broadcast([], "UPDATE_METADATA");
broadcast([], "STORE_READY", returned); broadcast([], "STORE_READY", returned);
@ -2826,7 +2826,7 @@ define([
}); });
rt.proxy.on('reconnect', function () { rt.proxy.on('reconnect', function () {
store.offline = false; store.offline = false;
sendDriveEvent('NETWORK_RECONNECT'); sendDriveEvent('NETWORK_RECONNECT'); // XXX reconnect
broadcast([], "UPDATE_METADATA"); broadcast([], "UPDATE_METADATA");
}); });

View file

@ -60,7 +60,7 @@ define([
try { try {
sw sw
.register('/sw.js?' .register('/sw.js?'
+ RequireConfig().urlArgs + RequireConfig().urlArgs // XXX should match the query string provided by outer
, { scope: '/' }) , { scope: '/' })
.then(function (reg) { .then(function (reg) {
console.log("service-worker registered", reg); console.log("service-worker registered", reg);

View file

@ -12,6 +12,7 @@ define([
var requireConfig = RequireConfig(); var requireConfig = RequireConfig();
var lang = Messages._languageUsed; var lang = Messages._languageUsed;
var req = { var req = {
worker: window.consentfulWorker,
cfg: requireConfig, cfg: requireConfig,
req: [ '/common/loading.js' ], req: [ '/common/loading.js' ],
pfx: window.location.origin, pfx: window.location.origin,
@ -30,6 +31,7 @@ define([
} }
} }
// XXX load with cached URL args via window.consentfulWorker
document.getElementById('sbox-iframe').setAttribute('src', document.getElementById('sbox-iframe').setAttribute('src',
ApiConfig.httpSafeOrigin + (pathname || window.location.pathname) + 'inner.html?' + ApiConfig.httpSafeOrigin + (pathname || window.location.pathname) + 'inner.html?' +
requireConfig.urlArgs + '#' + encodeURIComponent(JSON.stringify(req))); requireConfig.urlArgs + '#' + encodeURIComponent(JSON.stringify(req)));

View file

@ -1,6 +1,12 @@
/* jshint esversion: 6 */ /* jshint esversion: 6 */
var version = self.location.search || "DEFAULT"; var version = self.location.search || "DEFAULT";
//console.log('worker location:', self.location); //console.log('worker location:', self.location);
console.info('SW VERSION', version);
var params = new URLSearchParams(version);
var OFFLINE = params.has('offline');
console.info("SW OFFLINE?", OFFLINE);
var filesToCache = [ var filesToCache = [
'/common/sframe-app-outer.js', '/common/sframe-app-outer.js',