fix(search-history): reliable cross-session sync with auth server and safe logout session clearing

This commit is contained in:
Enes Yakıştır
2026-09-04 07:32:05 +03:00
parent f1720448c7
commit 0bf905f81f
2 changed files with 82 additions and 51 deletions
+81 -50
View File
@@ -172,10 +172,7 @@ try {
var hasToken = localStorage.getItem('access_token') || localStorage.getItem('username'); var hasToken = localStorage.getItem('access_token') || localStorage.getItem('username');
if (hasToken) { if (hasToken) {
console.log('[YakTube] YakNet session ended elsewhere. Clearing YakTube...'); console.log('[YakTube] YakNet session ended elsewhere. Clearing YakTube...');
try { clearYakTubeAuthSession();
localStorage.clear();
sessionStorage.clear();
} catch (e) {}
window.location.reload(); window.location.reload();
} }
} }
@@ -198,20 +195,32 @@ try {
} else if (e.detail && e.detail.authenticated === false) { } else if (e.detail && e.detail.authenticated === false) {
var hasToken = localStorage.getItem('access_token') || localStorage.getItem('username'); var hasToken = localStorage.getItem('access_token') || localStorage.getItem('username');
if (hasToken) { if (hasToken) {
try { clearYakTubeAuthSession();
localStorage.clear();
sessionStorage.clear();
} catch (err) {}
window.location.reload(); window.location.reload();
} }
} }
}); });
// Clear YakTube auth session and cloud search cache safely
function clearYakTubeAuthSession() {
try {
localStorage.removeItem('access_token');
localStorage.removeItem('refresh_token');
localStorage.removeItem('token_type');
localStorage.removeItem('id');
localStorage.removeItem('username');
localStorage.removeItem('displayName');
localStorage.removeItem('email');
localStorage.removeItem('role');
localStorage.removeItem('yaktube_recent_searches');
sessionStorage.clear();
} catch (e) {}
}
// Unified single sign-out for YakTube and YakNet // Unified single sign-out for YakTube and YakNet
function performUnifiedLogout() { function performUnifiedLogout() {
clearYakTubeAuthSession();
try { try {
localStorage.clear();
sessionStorage.clear();
sessionStorage.setItem('yaknet_manual_logout', 'true'); sessionStorage.setItem('yaknet_manual_logout', 'true');
} catch (err) {} } catch (err) {}
window.location.replace( window.location.replace(
@@ -2005,37 +2014,69 @@ try {
} catch (e) {} } catch (e) {}
// Default initial recent searches for first-time visitors // Default initial recent searches for first-time visitors
var defaults = ['Tarkan', 'Barış Manço', 'Yapay Zeka', 'Canlı Haber']; var defaults = ['Tarkan', 'Barış Manço', 'Yapay Zeka', 'Canlı Haber'];
try { if (!isUserLoggedIn()) {
localStorage.setItem('yaktube_recent_searches', JSON.stringify(defaults)); try {
} catch (e) {} localStorage.setItem('yaktube_recent_searches', JSON.stringify(defaults));
} catch (e) {}
}
return defaults; return defaults;
} }
function callCloudSearchHistory(method, queryParams, body, onSuccess, onError) {
var token = localStorage.getItem('access_token');
var email = localStorage.getItem('email');
var headers = {};
if (body) headers['Content-Type'] = 'application/json';
if (token) headers['Authorization'] = 'Bearer ' + token;
if (email) headers['X-User-Email'] = email;
var authUrl = 'https://auth.yakhub.com.tr/api/yaktube/search-history' + (queryParams || '');
var bridgeUrl = '/api-custom/search-history' + (queryParams || '');
var options = {
method: method,
headers: headers,
credentials: 'include'
};
if (body) options.body = JSON.stringify(body);
fetch(authUrl, options)
.then(function (res) {
if (!res.ok) throw new Error('Auth server status ' + res.status);
return res.json();
})
.then(function (data) {
if (typeof onSuccess === 'function') onSuccess(data);
})
.catch(function () {
// Fallback to local PeerTube bridge proxy
fetch(bridgeUrl, options)
.then(function (res) { return res.json(); })
.then(function (data) {
if (typeof onSuccess === 'function') onSuccess(data);
})
.catch(function (e) {
if (typeof onError === 'function') onError(e);
});
});
}
var isSyncingHistory = false; var isSyncingHistory = false;
function syncCloudSearchHistory(callback) { function syncCloudSearchHistory(callback) {
if (!isAccountSyncEnabled() || isSyncingHistory) return; if (!isAccountSyncEnabled() || isSyncingHistory) return;
isSyncingHistory = true; isSyncingHistory = true;
var token = localStorage.getItem('access_token'); callCloudSearchHistory('GET', '', null, function (data) {
var headers = {}; isSyncingHistory = false;
if (token) headers['Authorization'] = 'Bearer ' + token; if (data && data.status === 'success' && Array.isArray(data.history)) {
if (data.history.length > 0) {
fetch('/api-custom/search-history', {
method: 'GET',
headers: headers,
credentials: 'include'
})
.then(function (res) { return res.json(); })
.then(function (data) {
isSyncingHistory = false;
if (data && data.status === 'success' && Array.isArray(data.history) && data.history.length > 0) {
localStorage.setItem('yaktube_recent_searches', JSON.stringify(data.history)); localStorage.setItem('yaktube_recent_searches', JSON.stringify(data.history));
if (typeof callback === 'function') callback();
} }
}) if (typeof callback === 'function') callback();
.catch(function () { }
isSyncingHistory = false; }, function () {
}); isSyncingHistory = false;
});
} }
function saveRecentSearch(query) { function saveRecentSearch(query) {
@@ -2053,16 +2094,7 @@ try {
// If user is logged in and sync is active, sync with YakNet account // If user is logged in and sync is active, sync with YakNet account
if (isAccountSyncEnabled()) { if (isAccountSyncEnabled()) {
var token = localStorage.getItem('access_token'); callCloudSearchHistory('POST', '', { query: q, device_name: 'YakTube Web' });
var headers = { 'Content-Type': 'application/json' };
if (token) headers['Authorization'] = 'Bearer ' + token;
fetch('/api-custom/search-history', {
method: 'POST',
headers: headers,
credentials: 'include',
body: JSON.stringify({ query: q })
}).catch(function () {});
} }
} }
@@ -2072,15 +2104,7 @@ try {
} catch (e) {} } catch (e) {}
if (isAccountSyncEnabled()) { if (isAccountSyncEnabled()) {
var token = localStorage.getItem('access_token'); callCloudSearchHistory('DELETE', '', null);
var headers = { 'Content-Type': 'application/json' };
if (token) headers['Authorization'] = 'Bearer ' + token;
fetch('/api-custom/search-history', {
method: 'DELETE',
headers: headers,
credentials: 'include'
}).catch(function () {});
} }
renderDynamicSearchChips(); renderDynamicSearchChips();
@@ -2611,6 +2635,13 @@ try {
} }
}); });
// Automatically trigger cloud search history pull on startup if logged in
try {
if (isAccountSyncEnabled()) {
syncCloudSearchHistory();
}
} catch (e) {}
// 7.5. Reactive Hybrid Related Videos Engine (Watch Page) // 7.5. Reactive Hybrid Related Videos Engine (Watch Page)
var currentActiveVideoKey = null; var currentActiveVideoKey = null;
var isFetchingRelated = false; var isFetchingRelated = false;
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "peertube-plugin-yaktube-ondemand", "name": "peertube-plugin-yaktube-ondemand",
"version": "1.4.25", "version": "1.4.26",
"description": "Accessible On-Demand YouTube Import, Live Streams, Smart Recommendations and A11y Engine for PeerTube", "description": "Accessible On-Demand YouTube Import, Live Streams, Smart Recommendations and A11y Engine for PeerTube",
"main": "main.js", "main": "main.js",
"library": "./main.js", "library": "./main.js",