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 { clearLockedSyncPrivateKey } from "./locked-sync-spool";23import { setLockedSyncHooks } from "./vault";24import { repairPairedRevocationOverlaps } from "./paired-devices";25import {26 requestMeshRelayReconcile,27 setupMeshRelayListener,28 abortMeshRelaySessions,29 selectProductionDialTargets,30} from "./mesh-relay-listener";31import { hardenExtensionStorage } from "./storage-access";32import { recordInstalledVersion } from "../shared/release-notes";3334chrome.runtime.onInstalled.addListener((details) => { void recordInstalledVersion(details); });353637383940414243444546474849const POPUP_PORT_PREFIX = "popup-";5051chrome.runtime.onConnect.addListener((port) => {52 if (!port.name.startsWith(POPUP_PORT_PREFIX)) return;53 const senderUrl = port.sender?.url;54 const extensionOrigin = new URL(chrome.runtime.getURL("")).origin;55 if (port.sender?.tab || !senderUrl || new URL(senderUrl).origin !== extensionOrigin) return;56 port.onDisconnect.addListener(async () => {57 await denyAllPendingPasskeyRequests();58 const s = await ensureSettingsLoaded();59 if (!isUnlocked() || s.lockOnClose !== true) return;60 if (await isRecoveryConfirmPending()) return;61 await lock();62 });63});6465export function start(): void {66 67 68 69 70 const hardening = hardenExtensionStorage();71 setLockedSyncHooks({72 refresh: refreshLockedSyncSpool,73 afterUnlock: drainAndRefreshLockedSyncSpool,74 onDecoy: () => {75 void clearLockedSyncPrivateKey();76 abortMeshRelaySessions();77 abortSyncRunnerSessions();78 },79 });80 81 82 83 84 85 86 87 88 89 90 const restored = hardening91 .then((h) => applyStorageHardening(h.sessionEscrowAvailable))92 .then(() => restoreFromSession());93 setRestoreReady(restored);94 setupMessageHandler();95 void setupAutoLock();96 setupCommands();97 98 99 100 setupClipboardClearAlarm();101 void setupPasskeyProxy();102 103 104 105 setSyncRunner(productionSyncRunner);106 setSyncDialTargetSelector(selectProductionDialTargets);107 setupMeshRelayListener();108 109 110 111 112 setupSyncAlarm();113 114 115 116 117 void restored118 .then(() => requestMeshRelayReconcile())119 .then(() => repairPairedRevocationOverlaps())120 .then(() => hydratePersistedSyncState())121 .then(() => triggerSyncIfReachable({ reason: "startup" }))122 .catch(() => undefined);123}124125start();