mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-11-13 15:51:00 +00:00
034cfb539a
A browser that ran TREK before 5.1.1 keeps that version's app in its service worker. When the app opened /native-handoff, the worker answered it from its cache with an app that has no such page, which sent the user to /, and the sign-in ended on the dashboard in the browser instead of in the app. The app now opens /api/auth/native/start, which every TREK service worker passes to the server. That page takes the workers off the browser and forwards to the handoff page. Until the sign-in is handed back, the web app registers no service worker and does not reload for a new version: a tab still open on the older TREK keeps its worker alive, and a registration or a reload in the middle of the sign-in brought it back to answer the next page.
44 lines
1.6 KiB
JavaScript
44 lines
1.6 KiB
JavaScript
// The page /api/auth/native/start answers with runs this (see NativeAuthController.start).
|
|
// A browser that ran an older TREK keeps that version's app in its service worker, and
|
|
// the worker would answer the handoff page with an app that has no such page. So the
|
|
// worker goes first, and the handoff page loads from the server.
|
|
(function () {
|
|
var script = document.currentScript;
|
|
var target = script && script.getAttribute('data-target');
|
|
if (!target || target.indexOf('/native-handoff?') !== 0) return;
|
|
var gone = false;
|
|
var go = function () {
|
|
if (gone) return;
|
|
gone = true;
|
|
location.replace(target);
|
|
};
|
|
// Until the sign-in is handed back to the app, no worker is registered and no
|
|
// new version reloads the page (src/native/browserSignInFlag.ts): a tab still
|
|
// open on the older TREK keeps its worker alive, and either would bring it back.
|
|
try {
|
|
localStorage.setItem('trek_native_signin', String(Date.now()));
|
|
} catch (e) {
|
|
/* site data blocked: the worker is still taken off below */
|
|
}
|
|
if (!('serviceWorker' in navigator) || !navigator.serviceWorker.getRegistrations) {
|
|
go();
|
|
return;
|
|
}
|
|
// Never stuck here: whatever the browser does with the workers, the page moves on.
|
|
var timer = setTimeout(go, 3000);
|
|
navigator.serviceWorker
|
|
.getRegistrations()
|
|
.then(function (registrations) {
|
|
return Promise.all(
|
|
registrations.map(function (registration) {
|
|
return registration.unregister();
|
|
})
|
|
);
|
|
})
|
|
.catch(function () {})
|
|
.then(function () {
|
|
clearTimeout(timer);
|
|
go();
|
|
});
|
|
})();
|