fuzzyworld

north-star / mobile / files / src / platform / wakelock.ts

Branch mobile · default branch · all branches

wakelock.ts

Blame: the commit that last changed each line · file · history

36d64b37 2026-03-15 Pavel Safronov1export const createWakeLockManager = () => {
f495a654 2026-03-16 Pavel Safronov2 type WakeLockSentinelLike = {
3 release: () => Promise<void>;
4 addEventListener: (type: 'release', listener: () => void) => void;
5 };
6
7 let wakeLockSentinel: WakeLockSentinelLike | null = null;
36d64b37 2026-03-15 Pavel Safronov8 const hasWakeLockSupport = typeof navigator !== 'undefined' && 'wakeLock' in navigator;
f495a654 2026-03-16 Pavel Safronov9 let wakeLockRequested = false;
10
11 const getWakeLockApi = () => (navigator as Navigator & {
12 wakeLock?: { request: (type: 'screen') => Promise<WakeLockSentinelLike> }
13 }).wakeLock;
14
15 const releaseWakeLock = async () => {
16 if (!wakeLockSentinel) return;
17
18 try {
19 await wakeLockSentinel.release();
20 } catch (err) {
21 console.debug('Wake lock release failed', err);
22 } finally {
23 wakeLockSentinel = null;
24 }
25 };
36d64b37 2026-03-15 Pavel Safronov26
27 const requestWakeLock = async () => {
28 if (!hasWakeLockSupport) return;
f495a654 2026-03-16 Pavel Safronov29 if (!wakeLockRequested) return;
36d64b37 2026-03-15 Pavel Safronov30 if (document.visibilityState !== 'visible') return;
31 if (wakeLockSentinel) return;
32
33 try {
f495a654 2026-03-16 Pavel Safronov34 const nextSentinel = await getWakeLockApi()?.request('screen');
35 if (!nextSentinel) return;
36
37 if (!wakeLockRequested || document.visibilityState !== 'visible') {
38 await nextSentinel.release();
39 return;
40 }
41
42 wakeLockSentinel = nextSentinel;
36d64b37 2026-03-15 Pavel Safronov43 wakeLockSentinel.addEventListener('release', () => {
44 wakeLockSentinel = null;
f495a654 2026-03-16 Pavel Safronov45 if (wakeLockRequested && document.visibilityState === 'visible') {
36d64b37 2026-03-15 Pavel Safronov46 void requestWakeLock();
47 }
48 });
49 } catch (err) {
50 console.debug('Wake lock request failed', err);
51 }
52 };
53
f495a654 2026-03-16 Pavel Safronov54 const setWakeLockEnabled = async (enabled: boolean) => {
55 wakeLockRequested = enabled;
56 if (!enabled) {
57 await releaseWakeLock();
58 return;
59 }
60
61 await requestWakeLock();
62 };
63
64 return {
65 requestWakeLock,
66 setWakeLockEnabled,
67 hasWakeLockSupport: () => hasWakeLockSupport,
68 isWakeLockEnabled: () => wakeLockRequested
69 };
36d64b37 2026-03-15 Pavel Safronov70};