alarms.ts

2.3 KB · raw

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; // 0 = never11}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; // "never"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  // Notify the sync lifecycle so advertising stops while locked. Lazy-import36  // to avoid pulling sync.ts into every consumer of alarms.37  void import("./sync-lifecycle")38    .then((m) => m.onVaultLocked())39    .catch(() => {});40  // Reach the popup (and any other extension UI context) via runtime.41  chrome.runtime?.sendMessage?.({ type: "VAULT_LOCKED" })?.catch?.(() => {});42  // Reach content scripts via tabs. Tabs without Peach content scripts43  // loaded will reject the sendMessage; ignore those.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    // tabs permission may not be available in all contexts53  }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}