This commit is contained in:
Timothy Jaeryang Baek 2026-10-12 17:57:07 +04:00
parent b4bb9e7aca
commit a9227421d8
3 changed files with 43 additions and 30 deletions

View file

@ -70,6 +70,7 @@
} from '$lib/utils';
import { AudioQueue } from '$lib/utils/audio';
import { RealtimeCall, getBridgeTurnState, type BridgeSubmission } from '$lib/utils/realtime';
import { acquireWakeLock } from '$lib/utils/wakeLock';
import { routeAvatarAnimation } from '$lib/utils/voice-avatar';
import { createTemporaryChatId, isTemporaryChatId } from '$lib/utils/chatId';
import {
@ -2210,6 +2211,16 @@
let callMode = 'current';
let bridge: RealtimeCall;
let releaseCallWakeLock = () => {};
const updateCallWakeLock = (active: boolean) => {
releaseCallWakeLock();
releaseCallWakeLock = active ? acquireWakeLock() : () => {};
};
$: callInProgress =
($showCallOverlay && callMode === 'current') || !!(bridge?.connected || bridge?.connecting);
$: updateCallWakeLock(callInProgress);
onDestroy(() => releaseCallWakeLock());
const bridgeCancellations = new Map<string, () => void>();
const visibleMessageText = (message: any) =>
getOutputText(message?.output) || removeAllDetails(message?.content ?? '');

View file

@ -29,8 +29,6 @@
export let modelId;
export let bridge: RealtimeCall | undefined = undefined;
let wakeLock = null;
let model = null;
let loading = false;
@ -830,34 +828,6 @@
document.addEventListener('keydown', handleKeydown);
return;
}
const setWakeLock = async () => {
try {
wakeLock = await navigator.wakeLock.request('screen');
} catch (err) {
// The Wake Lock request has failed - usually system related, such as battery.
console.log(err);
}
if (wakeLock) {
// Add a listener to release the wake lock when the page is unloaded
wakeLock.addEventListener('release', () => {
// the wake lock has been released
console.log('Wake Lock released');
});
}
};
if ('wakeLock' in navigator) {
await setWakeLock();
document.addEventListener('visibilitychange', async () => {
// Re-request the wake lock if the document becomes visible
if (wakeLock !== null && document.visibilityState === 'visible') {
await setWakeLock();
}
});
}
model = $models.find((m) => m.id === modelId);
if ($settings.audio?.tts?.engine === 'browser-kokoro' && !$TTSWorker) {

32
src/lib/utils/wakeLock.ts Normal file
View file

@ -0,0 +1,32 @@
export const acquireWakeLock = () => {
if (typeof navigator === 'undefined' || !('wakeLock' in navigator)) return () => {};
let lock: WakeLockSentinel | null = null;
let stopped = false;
let pending = false;
const request = async () => {
if (stopped || pending || (lock && !lock.released) || document.visibilityState !== 'visible')
return;
pending = true;
try {
const acquired = await navigator.wakeLock.request('screen');
// Cleanup can run while the browser is still granting the lock.
if (stopped) await acquired.release();
else lock = acquired;
} catch (error) {
console.log('Wake Lock request failed:', error);
} finally {
pending = false;
}
};
document.addEventListener('visibilitychange', request);
void request();
return () => {
stopped = true;
document.removeEventListener('visibilitychange', request);
void lock?.release().catch((error) => console.log('Wake Lock release failed:', error));
lock = null;
};
};