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 } 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 selectProductionDialTargets,27 setupMeshRelayListener,28} from "./mesh-relay-listener";29import { hardenExtensionStorage } from "./storage-access";30import { recordInstalledVersion } from "../shared/release-notes";3132chrome.runtime.onInstalled.addListener((details) => { void recordInstalledVersion(details); });333435363738394041424344454647const POPUP_PORT_PREFIX = "popup-";4849chrome.runtime.onConnect.addListener((port) => {50 if (!port.name.startsWith(POPUP_PORT_PREFIX)) return;51 const senderUrl = port.sender?.url;52 const extensionOrigin = new URL(chrome.runtime.getURL("")).origin;53 if (port.sender?.tab || !senderUrl || new URL(senderUrl).origin !== extensionOrigin) return;54 port.onDisconnect.addListener(async () => {55 await denyAllPendingPasskeyRequests();56 const s = await ensureSettingsLoaded();57 if (!isUnlocked() || s.lockOnClose !== true) return;58 if (await isRecoveryConfirmPending()) return;59 await lock();60 });61});6263export function start(): void {64 65 66 67 68 const hardening = hardenExtensionStorage();69 setLockedSyncHooks({70 refresh: refreshLockedSyncSpool,71 afterUnlock: drainAndRefreshLockedSyncSpool,72 });73 74 75 76 77 78 79 80 81 82 83 const restored = hardening84 .then((h) => applyStorageHardening(h.sessionEscrowAvailable))85 .then(() => restoreFromSession());86 setRestoreReady(restored);87 setupMessageHandler();88 void setupAutoLock();89 setupCommands();90 91 92 93 setupClipboardClearAlarm();94 void setupPasskeyProxy();95 96 97 98 setSyncRunner(productionSyncRunner);99 setSyncDialTargetSelector(selectProductionDialTargets);100 setupMeshRelayListener();101 102 103 104 105 setupSyncAlarm();106 107 108 109 110 void restored111 .then(() => requestMeshRelayReconcile())112 .then(() => repairPairedRevocationOverlaps())113 .then(() => hydratePersistedSyncState())114 .then(() => triggerSyncIfReachable({ reason: "startup" }))115 .catch(() => undefined);116}117118start();