entry.ts

2.3 KB · raw

1import { setupMessageHandler } from "./messages";2import { setupAutoLock } from "./alarms";3import { setupPasskeyProxy } from "./passkey";4import { setupCommands } from "./commands";5import { restoreFromSession, isUnlocked, lock } from "./vault";6import { ensureSettingsLoaded } from "./vault";7import { isRecoveryConfirmPending } from "./recovery-pending";8import { denyAllPendingPasskeyRequests } from "./passkey";9import { hydratePersistedSyncState, setSyncRunner } from "./sync-trigger";10import { productionSyncRunner } from "./chirp-sync-runner";1112// Keep alive for MV3 service worker13chrome.runtime.onInstalled.addListener(() => {});1415// The chrome.idle.onStateChanged listener lives in ./alarms (the architectural16// home for auto-lock timing). Keeping it in only one place avoids drift.1718// Lock-on-close via port disconnect. The popup opens a "popup" named port;19// when that port disconnects (popup closed), lock if lockOnClose is enabled.20// Previously declared in index.ts which was never bundled — moved here.21chrome.runtime.onConnect.addListener((port) => {22  if (port.name !== "popup") return;23  port.onDisconnect.addListener(async () => {24    await denyAllPendingPasskeyRequests();25    const s = await ensureSettingsLoaded();26    if (!isUnlocked() || s.lockOnClose === false) return;27    if (await isRecoveryConfirmPending()) return;28    lock();29  });30});3132export async function start(): Promise<void> {33  // Restore vault unlock state from chrome.storage.session if the MV3 service34  // worker was restarted mid-session. This MUST complete before the message35  // handler is registered: a popup/content message that arrives in the gap36  // between handler registration and restore completing would see a locked37  // vault and bounce the user to the lock screen even though the session is38  // still unlocked (SEV-3-B). The cost is one session-storage read (<1ms).39  await restoreFromSession();40  setupMessageHandler();41  void setupAutoLock();42  setupCommands();43  void setupPasskeyProxy();44  // Wire the chirp-sync production runner into the dispatcher. Without this45  // `triggerSyncIfReachable` is a no-op (the runner slot starts null) — the46  // pairing/transport/coordinator stack ships dormant until this assignment.47  setSyncRunner(productionSyncRunner);48  void hydratePersistedSyncState();49}5051void start();