45 lines
1.8 KiB
JavaScript
45 lines
1.8 KiB
JavaScript
let identity = '', sources = '', onlineOnly = 'false';
|
|
let changed = false;
|
|
const changeKey = 'juku.account.change';
|
|
|
|
export function announceViewerChange() {
|
|
try { localStorage.setItem(changeKey, Date.now() + '-' + Math.random()); } catch (_) {}
|
|
}
|
|
|
|
window.addEventListener('storage', event => {
|
|
if (event.key === changeKey && identity && !changed) {
|
|
changed = true;
|
|
window.dispatchEvent(new Event('jukuviewerchange'));
|
|
}
|
|
});
|
|
|
|
export function viewerHeaders() {
|
|
return identity ? {'X-Juku-Viewer': identity, 'X-Juku-Sources': sources, 'X-Juku-Online-Only': onlineOnly} : {};
|
|
}
|
|
|
|
export function checkViewerResponse(result) {
|
|
if (!identity || changed || !['viewer_required', 'viewer_changed', 'login_required', 'password_change_required', 'sources_changed', 'permissions_changed'].includes(result?.code)) return;
|
|
changed = true;
|
|
window.dispatchEvent(new Event('jukuviewerchange'));
|
|
}
|
|
|
|
export async function initializeViewer() {
|
|
async function read(path) {
|
|
const response = await fetch(path, {credentials: 'same-origin', cache: 'no-store', headers: {'Accept': 'application/json'}});
|
|
let result;
|
|
try {result = await response.json();} catch (_) {throw new Error('无法建立独立观看记录,请确认已启动新版程序');}
|
|
if (!response.ok) throw new Error(result.error || '无法建立独立观看记录');
|
|
return result;
|
|
}
|
|
let result = await read('/api/ui/viewer');
|
|
if (!result.ready) result = await read('/api/ui/viewer?confirm=1');
|
|
if (!result.ready || !/^[a-f0-9]{64}$/.test(result.id)) throw new Error('无法确认浏览器身份,请刷新页面重试');
|
|
identity = result.id;
|
|
sources = (result.sources || []).join(',');
|
|
onlineOnly = String(result.onlineOnly === true);
|
|
changed = false;
|
|
return result;
|
|
}
|
|
|
|
window.JukuViewer = {headers: viewerHeaders, checkResponse: checkViewerResponse};
|