1import { ensureSettingsLoaded, getSettings, lock } from "./vault";23const AUTO_LOCK_ALARM = "autolock";4const DEFAULT_AUTO_LOCK_MINUTES = 5;5const MIN_IDLE_SECONDS = 15;67function resolveAutoLockMinutes(): number {8 const setting = getSettings().autoLockMinutes;9 if (typeof setting !== "number") return DEFAULT_AUTO_LOCK_MINUTES;10 return setting; 11}1213export function touchAutoLock(): void {14 if (!chrome.alarms?.clear || !chrome.alarms?.create) return;15 chrome.alarms.clear(AUTO_LOCK_ALARM);16 const minutes = resolveAutoLockMinutes();17 if (minutes <= 0) return; 18 chrome.alarms.create(AUTO_LOCK_ALARM, { delayInMinutes: minutes });19}2021export function clearAutoLock(): void {22 if (!chrome.alarms?.clear) return;23 chrome.alarms.clear(AUTO_LOCK_ALARM);24}2526export async function setupAutoLock(): Promise<void> {27 await ensureSettingsLoaded();28 if (!chrome.idle?.setDetectionInterval) return;29 const minutes = resolveAutoLockMinutes();30 const seconds = minutes > 0 ? Math.max(MIN_IDLE_SECONDS, minutes * 60) : MIN_IDLE_SECONDS;31 chrome.idle.setDetectionInterval(seconds);32}3334function broadcastLocked(): void {35 36 37 void import("./sync-lifecycle")38 .then((m) => m.onVaultLocked())39 .catch(() => {});40 41 chrome.runtime?.sendMessage?.({ type: "VAULT_LOCKED" })?.catch?.(() => {});42 43 44 try {45 chrome.tabs.query({}, (tabs) => {46 for (const tab of tabs) {47 if (tab.id === undefined) continue;48 chrome.tabs.sendMessage(tab.id, { type: "VAULT_LOCKED" }).catch(() => {});49 }50 });51 } catch {52 53 }54}5556if (chrome.alarms?.onAlarm?.addListener) {57 chrome.alarms.onAlarm.addListener((alarm) => {58 if (alarm.name === AUTO_LOCK_ALARM) {59 lock();60 broadcastLocked();61 }62 });63}6465if (chrome.idle?.onStateChanged) {66 chrome.idle.onStateChanged.addListener((state) => {67 if (resolveAutoLockMinutes() <= 0) return;68 if (state === "idle" || state === "locked") {69 lock();70 broadcastLocked();71 }72 });73}