import type { CrawlTaskState } from '@/types'; const CRAWL_TASK_STORAGE_KEY = 'crawlTaskState'; 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; } export async function setCrawlTaskState(state: CrawlTaskState): Promise { await chrome.storage.local.set({ [CRAWL_TASK_STORAGE_KEY]: state }); broadcastToCrawlTab(state); } export async function clearCrawlTaskState(): Promise { await chrome.storage.local.remove(CRAWL_TASK_STORAGE_KEY); } 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)); } function broadcastToCrawlTab(state: CrawlTaskState): void { if (!state.tabId) { return; } try { void chrome.tabs.sendMessage(state.tabId, { type: 'crawl_state_update', state }).catch(() => undefined); } catch { // ignore } } function isCrawlTaskState(value: unknown): value is CrawlTaskState { return typeof value === 'object' && value !== null && 'id' in value && 'steps' in value; }