diff --git a/src/SEQTA.ts b/src/SEQTA.ts index 92bae369..60a6b6a7 100644 --- a/src/SEQTA.ts +++ b/src/SEQTA.ts @@ -59,6 +59,10 @@ async function init() { IsSEQTAPage = true; console.info("[BetterSEQTA+] Verified SEQTA Page"); + if (typeof window !== "undefined" && window === window.top) { + void browser.runtime.sendMessage({ type: "cloudSettingsPoll" }).catch(() => {}); + } + registerFetchSeqtaAppLinkListener(); const documentLoadStyle = document.createElement("style"); diff --git a/src/background/cloudSettingsAutoSync.ts b/src/background/cloudSettingsAutoSync.ts index 8aa23112..a75de192 100644 --- a/src/background/cloudSettingsAutoSync.ts +++ b/src/background/cloudSettingsAutoSync.ts @@ -13,9 +13,9 @@ export const CLOUD_SUMMARY_URL = `${ACCOUNTS_BASE}/api/user/cloud-summary`; const CLOUD_SETTINGS_SYNC_URL = `${ACCOUNTS_BASE}/api/bsplus/settings/sync`; const REFRESH_URL = `${ACCOUNTS_BASE}/api/bsplus/refresh`; -const ALARM_NAME = "bsplus_cloud_settings_auto_sync"; -const PERIOD_MINUTES = 60; const UPLOAD_DEBOUNCE_MS = 2000; +const POLL_THROTTLE_MS = 24 * 60 * 60 * 1000; +const POLL_THROTTLE_KEY = "bsplus_lastCloudPoll"; type CloudSummaryResponse = { desqta?: unknown; @@ -323,6 +323,9 @@ export function runCloudSettingsPoll(): Promise { if (pollInFlight) return pollInFlight; pollInFlight = (async () => { try { + const { [POLL_THROTTLE_KEY]: last } = await browser.storage.local.get(POLL_THROTTLE_KEY); + if (Date.now() - (Number(last) || 0) < POLL_THROTTLE_MS) return; + await browser.storage.local.set({ [POLL_THROTTLE_KEY]: Date.now() }); await runCloudSettingsPollInner(); } catch (e) { console.error("[BS+ cloud sync] Poll error:", e); @@ -360,14 +363,11 @@ async function runDebouncedUploadJob(): Promise { } } -async function syncAlarmWithStorage(): Promise { +async function syncAutoUploadWithStorage(): Promise { const all = (await browser.storage.local.get()) as Record; if (!isAutoCloudSyncEnabled(all)) { - await browser.alarms.clear(ALARM_NAME); clearUploadDebounce(); - return; } - await browser.alarms.create(ALARM_NAME, { periodInMinutes: PERIOD_MINUTES }); } function onStorageChanged( @@ -377,7 +377,7 @@ function onStorageChanged( if (area !== "local") return; if (Object.prototype.hasOwnProperty.call(changes, "autoCloudSettingsSync")) { - void syncAlarmWithStorage(); + void syncAutoUploadWithStorage(); } const keys = Object.keys(changes); @@ -392,15 +392,8 @@ function onStorageChanged( })(); } -function onAlarm(alarm: browser.Alarms.Alarm): void { - if (alarm.name !== ALARM_NAME) return; - void runCloudSettingsPoll(); -} - export function initCloudSettingsAutoSync(deps: { reloadSeqtaPages: () => void }): void { reloadSeqtaPagesFn = deps.reloadSeqtaPages; - browser.alarms.onAlarm.addListener(onAlarm); browser.storage.onChanged.addListener(onStorageChanged); - void syncAlarmWithStorage(); } diff --git a/src/manifests/manifest.json b/src/manifests/manifest.json index f768851e..b4bfe4e4 100644 --- a/src/manifests/manifest.json +++ b/src/manifests/manifest.json @@ -15,7 +15,7 @@ "64": "resources/icons/icon-64.png" } }, - "permissions": ["tabs", "notifications", "storage", "alarms"], + "permissions": ["tabs", "notifications", "storage"], "host_permissions": ["https://newsapi.org/", "https://betterseqta.org/", "https://accounts.betterseqta.org/", "*://*/*"], "background": { "service_worker": "background.ts" diff --git a/src/seqta/utils/cloudSettingsSync.ts b/src/seqta/utils/cloudSettingsSync.ts index 9472a5ac..8918cd80 100644 --- a/src/seqta/utils/cloudSettingsSync.ts +++ b/src/seqta/utils/cloudSettingsSync.ts @@ -36,7 +36,10 @@ export const SENSITIVE_DEVICE_STORAGE_KEYS_EXACT = [ /** e.g. any future `plugin.global-search.storage.*` keys in chrome.storage */ export const SENSITIVE_DEVICE_STORAGE_KEY_PREFIXES = ["plugin.global-search.storage."] as const; -const CLIENT_ONLY_CLOUD_KEYS_EXACT = [BSPLUS_CLOUD_KNOWN_REMOTE_UPDATED_AT_KEY] as const; +const CLIENT_ONLY_CLOUD_KEYS_EXACT = [ + BSPLUS_CLOUD_KNOWN_REMOTE_UPDATED_AT_KEY, + "bsplus_lastCloudPoll", +] as const; /** After restoring from cloud, keep local session so the user stays signed in. */ const AUTH_KEYS_TO_PRESERVE = [