DUNGEONS-34: keep host screen awake while streaming
Co-authored-by: multica-agent <github@multica.ai>
This commit is contained in:
38
frontend/composables/useKeepHostAwake.ts
Normal file
38
frontend/composables/useKeepHostAwake.ts
Normal file
@@ -0,0 +1,38 @@
|
||||
import { createScreenWakeLock, type WakeStatus } from "../utils/screenWakeLock";
|
||||
import type { Ref } from "vue";
|
||||
|
||||
export function useKeepHostAwakePreference() {
|
||||
return useCookie<boolean>("webka_keep_host_awake", {
|
||||
default: () => false,
|
||||
maxAge: 60 * 60 * 24 * 365,
|
||||
sameSite: "lax",
|
||||
path: "/",
|
||||
});
|
||||
}
|
||||
|
||||
export function useHostWakeLock(hosting: Ref<boolean>) {
|
||||
const enabled = useKeepHostAwakePreference();
|
||||
const status = ref<WakeStatus>("off");
|
||||
let controller: ReturnType<typeof createScreenWakeLock> | undefined;
|
||||
let unwatch: (() => void) | undefined;
|
||||
const refresh = () => controller?.refresh();
|
||||
onMounted(() => {
|
||||
controller = createScreenWakeLock({
|
||||
request: window.isSecureContext && navigator.wakeLock?.request
|
||||
? () => navigator.wakeLock.request("screen")
|
||||
: undefined,
|
||||
visible: () => document.visibilityState === "visible",
|
||||
status: (value) => { status.value = value; },
|
||||
});
|
||||
unwatch = watch([enabled, hosting], () => {
|
||||
controller?.update(enabled.value === true && hosting.value);
|
||||
}, { immediate: true, flush: "sync" });
|
||||
document.addEventListener("visibilitychange", refresh);
|
||||
});
|
||||
onBeforeUnmount(() => {
|
||||
unwatch?.();
|
||||
document.removeEventListener("visibilitychange", refresh);
|
||||
controller?.dispose();
|
||||
});
|
||||
return { status, retry: refresh };
|
||||
}
|
||||
Reference in New Issue
Block a user