1import { setupMessageHandler, setRestoreReady } from "./messages";2import { setupAutoLock } from "./alarms";3import { setupSyncAlarm } from "./sync-alarm";4import { setupPasskeyProxy } from "./passkey";5import { setupCommands } from "./commands";6import { setupClipboardClearAlarm } from "./clipboard";7import { applyStorageHardening, restoreFromSession, isUnlocked, lock } from "./vault";8import { ensureSettingsLoaded } from "./vault";9import { isRecoveryConfirmPending } from "./recovery-pending";10import { denyAllPendingPasskeyRequests } from "./passkey";11import {12 hydratePersistedSyncState,13 setSyncDialTargetSelector,14 setSyncRunner,15 triggerSyncIfReachable,16} from "./sync-trigger";17import { productionSyncRunner, abortSyncRunnerSessions } from "./sync-runner";18import {19 drainAndRefreshLockedSyncSpool,20 refreshLockedSyncSpool,21} from "./sync-vault-adapter";22import { setLockedSyncHooks } from "./vault";23import { repairPairedRevocationOverlaps } from "./paired-devices";24import {25 requestMeshRelayReconcile,26 setupMeshRelayListener,27 abortMeshRelaySessions,28 selectProductionDialTargets,29} from "./mesh-relay-listener";30import { hardenExtensionStorage } from "./storage-access";31import { recordInstalledVersion } from "../shared/release-notes";3233chrome.runtime.onInstalled.addListener((details) => { void recordInstalledVersion(details); });343536373839404142434445464748const POPUP_PORT_PREFIX = "popup-";4950chrome.runtime.onConnect.addListener((port) => {51 if (!port.name.startsWith(POPUP_PORT_PREFIX)) return;52 const senderUrl = port.sender?.url;53 const extensionOrigin = new URL(chrome.runtime.getURL("")).origin;54 if (port.sender?.tab || !senderUrl || new URL(senderUrl).origin !== extensionOrigin) return;55 port.onDisconnect.addListener(async () => {56 await denyAllPendingPasskeyRequests();57 const s = await ensureSettingsLoaded();58 if (!isUnlocked() || s.lockOnClose !== true) return;59 if (await isRecoveryConfirmPending()) return;60 await lock();61 });62});6364export function start(): void {65 66 67 68 69 const hardening = hardenExtensionStorage();70 setLockedSyncHooks({71 refresh: refreshLockedSyncSpool,72 afterUnlock: drainAndRefreshLockedSyncSpool,73 onDecoy: () => {74 abortMeshRelaySessions();75 abortSyncRunnerSessions();76 },77 });78 79 80 81 82 83 84 85 86 87 88 const restored = hardening89 .then((h) => applyStorageHardening(h.sessionEscrowAvailable))90 .then(() => restoreFromSession());91 setRestoreReady(restored);92 setupMessageHandler();93 void setupAutoLock();94 setupCommands();95 96 97 98 setupClipboardClearAlarm();99 void setupPasskeyProxy();100 101 102 103 setSyncRunner(productionSyncRunner);104 setSyncDialTargetSelector(selectProductionDialTargets);105 setupMeshRelayListener();106 107 108 109 110 setupSyncAlarm();111 112 113 114 115 void restored116 .then(() => requestMeshRelayReconcile())117 .then(() => repairPairedRevocationOverlaps())118 .then(() => hydratePersistedSyncState())119 .then(() => triggerSyncIfReachable({ reason: "startup" }))120 .catch(() => undefined);121}122123start();