import type { CrawlTaskState } from '@/types'; // chrome.storage.local 中保存当前爬取任务状态的键名。 const CRAWL_TASK_STORAGE_KEY = 'crawlTaskState'; /** * 从 chrome.storage.local 读取当前爬取任务状态。 */ export async function getCrawlTaskState(): Promise { const result = await chrome.storage.local.get(CRAWL_TASK_STORAGE_KEY); const state = result[CRAWL_TASK_STORAGE_KEY]; return isCrawlTaskState(state) ? state : null; } /** * 将最新爬取任务状态写入 chrome.storage.local,供 popup 和 content script 同步读取。 */ export async function setCrawlTaskState(state: CrawlTaskState): Promise { await chrome.storage.local.set({ [CRAWL_TASK_STORAGE_KEY]: state }); } /** * 读取任务状态后执行不可变更新,避免覆盖已取消或已替换的任务。 */ export async function updateCrawlTaskState( taskId: string, updater: (state: CrawlTaskState) => CrawlTaskState, ): Promise { const state = await getCrawlTaskState(); if (!state || state.id !== taskId || state.status === 'canceled') { return; } await setCrawlTaskState(updater(state)); } /** * 粗略判断 storage 中读取到的值是否像一个爬取任务状态对象。 */ function isCrawlTaskState(value: unknown): value is CrawlTaskState { return typeof value === 'object' && value !== null && 'id' in value && 'steps' in value; }