From e19446995b728053ae2ddb53b00b5034a763f973 Mon Sep 17 00:00:00 2001 From: "A.Bond" Date: Tue, 28 Jan 2025 09:38:58 +0600 Subject: [PATCH] request wake lock on web interface page --- frontend/src/app.ts | 8 ++++- frontend/src/components/wakeLock.ts | 29 +++++++++++++++++++ .../plugin_web_face_frontend.py | 2 ++ 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 frontend/src/components/wakeLock.ts diff --git a/frontend/src/app.ts b/frontend/src/app.ts index 5412606..a842824 100644 --- a/frontend/src/app.ts +++ b/frontend/src/app.ts @@ -18,6 +18,7 @@ import { inputStreamingStateMachine } from './audio-input-streaming/sm'; import z from 'zod'; import { fetchConfig, FRONTEND_CONFIG_SCOPE } from './components/config/service'; import { streamingSupported } from './audio-input-streaming/streamingService'; +import { enableWakeLock } from './components/wakeLock'; const FrontendConfig = z.object({ @@ -26,6 +27,7 @@ const FrontendConfig = z.object({ audioOutputEnabled: z.boolean().default(true), microphoneSampleRate: z.number(), hideConfiguration: z.boolean().default(false), + requestWakeLock: z.boolean().default(true), }); const loadConfig: () => Promise> = () => new Promise(resolve => { @@ -96,7 +98,11 @@ const getProtocolRequirements = ({ export const initApplication = async () => { const config = await loadConfig(); - const { microphoneSampleRate, hideConfiguration } = config; + const { microphoneSampleRate, hideConfiguration, requestWakeLock } = config; + + if (requestWakeLock) { + enableWakeLock(); + } const app = createApp(App); diff --git a/frontend/src/components/wakeLock.ts b/frontend/src/components/wakeLock.ts new file mode 100644 index 0000000..e90bc53 --- /dev/null +++ b/frontend/src/components/wakeLock.ts @@ -0,0 +1,29 @@ +let wakeLock: /*WakeLockSentinel*/ any | null = null; + +async function requestWakeLock() { + try { + // TODO: Видимо, нужно обновить TS, чтобы типы, связанные с WakeLock определялись + const wl = await (window.navigator as any).wakeLock.request("screen"); + if (wakeLock) { + wakeLock.release(); + } + wakeLock = wl; + console.log("WakeLock получен"); + } catch (err) { + console.log("Ошибка при получении WakeLock", err); + } +} + +export function enableWakeLock() { + if (!(window.navigator as any).wakeLock) { + return; + } + + requestWakeLock(); + + document.addEventListener("visibilitychange", () => { + if (document.visibilityState === "visible") { + requestWakeLock(); + } + }); +} diff --git a/irene_plugin_web_face_frontend/plugin_web_face_frontend.py b/irene_plugin_web_face_frontend/plugin_web_face_frontend.py index af08cea..9ab26b1 100644 --- a/irene_plugin_web_face_frontend/plugin_web_face_frontend.py +++ b/irene_plugin_web_face_frontend/plugin_web_face_frontend.py @@ -24,6 +24,7 @@ 'hideConfiguration': False, 'customCssPaths': ['{irene_home}/frontend/*.css'], 'customCss': '\n\n', + 'requestWakeLock': True, } config_comment = """ @@ -43,6 +44,7 @@ только скрывает графический интерфейс на веб-странице. - `customCssPaths` - шаблоны путей к файлам, содержащим пользовательские CSS-стили. - `customCss` - пользовательские CSS-стили. +- `requestWakeLock` - включить запрос WakeLock (запретить браузеру блокировать экран пока открыта страница). """ _DIST_DIRS = [