Goal: улучшить ретеншен игроков, в случае если наши зеркала забанены.
Problem: люди сохранят в закладках забаненые зеркала, потом пробуют на них прийти - а там страница блока.
Solution: мы можем сделать service worker, который бы проверял возможность загрузить favicon, и если он не загружается - кидал нас на редиректор.
То есть, при первой успешной загрузке сайта мы добавляем в браузер пользователя ServiceWorker. Отличительной особенностью этой технологии является то, что он сохраняется в браузере пользователя и может работать даже оффлайн. То есть, когда человек через неделю зайдет на страницу с установленным сервис воркером, даже если страница недоступна, воркер будет запущен. Именно этим свойством мы и хотим воспользоваться. Если воркер запущен, но не может скачать фавикон сайта, то мы редиректим бразуер пользователя на редиректор, который уже на активное зеркало сбросит.
Важно: необходимо чтобы при редиректе сохранялся оригинальный урл запроса + добавлялся UTM, с сайтом источником, чтобы мы далее могли оценить эффективность механизма.
Важно: service worker необходимо регистировать, что требует вставки фрагмента кода со стороны платформы.
Пример кода:
//----------EXAMPLE OF ANTI-BLOCK REDIRECT FUNCTIONALITY FRONTEND-2992 ----------
self.addEventListener('install', (event) => {
// console.log('self.skipWaiting();');
self.skipWaiting();
});
self.addEventListener('fetch', (event) => {
const clientDomainRegexp = /^https:\/\/(www\.)?gslot\.com((\/[a-zA-Z]{2}-[a-zA-Z]{2})|(\/[a-zA-Z]{2}))?\/?$/;
const imageUrl = `https://www.gslot.com/resources/images/favicon.png?nocache=${new Date().getTime()}`;
const redirectUrl = 'https://gslot3.com?utm_source=https://gslot.com';
if (event.request.method === 'GET' && clientDomainRegexp.test(event.request.url)) {
event.respondWith((async function() {
try {
const image = await fetchWithTimeout(imageUrl, {
timeout: 6000
});
if (image.status !== 200) {
// console.log('image.status !== 200');
return Response.redirect(redirectUrl);
}
} catch (err) {
// console.log('CATCH redirectUrl');
return Response.redirect(redirectUrl);
}
return fetch(event.request);
})());
}
});
async function fetchWithTimeout(resource, options = {}) {
const {timeout = 8000} = options;
const controller = new AbortController();
const id = setTimeout(() => controller.abort(), timeout);
const response = await fetch(resource, {
...options,
signal: controller.signal
});
clearTimeout(id);
return response;
}
*/