48 lines
1.4 KiB
TypeScript
48 lines
1.4 KiB
TypeScript
import type { CrawlTaskState } from '@/types';
|
|
|
|
const CRAWL_TASK_STORAGE_KEY = 'crawlTaskState';
|
|
|
|
export async function getCrawlTaskState(): Promise<CrawlTaskState | null> {
|
|
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<void> {
|
|
await chrome.storage.local.set({ [CRAWL_TASK_STORAGE_KEY]: state });
|
|
broadcastToCrawlTab(state);
|
|
}
|
|
|
|
export async function clearCrawlTaskState(): Promise<void> {
|
|
await chrome.storage.local.remove(CRAWL_TASK_STORAGE_KEY);
|
|
}
|
|
|
|
export async function updateCrawlTaskState(
|
|
taskId: string,
|
|
updater: (state: CrawlTaskState) => CrawlTaskState,
|
|
): Promise<void> {
|
|
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;
|
|
}
|