1
This commit is contained in:
43
src/background/service/taskState.ts
Normal file
43
src/background/service/taskState.ts
Normal file
@@ -0,0 +1,43 @@
|
||||
import type { CrawlTaskState } from '@/types';
|
||||
|
||||
// chrome.storage.local 中保存当前爬取任务状态的键名。
|
||||
const CRAWL_TASK_STORAGE_KEY = 'crawlTaskState';
|
||||
|
||||
/**
|
||||
* 从 chrome.storage.local 读取当前爬取任务状态。
|
||||
*/
|
||||
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;
|
||||
}
|
||||
|
||||
/**
|
||||
* 将最新爬取任务状态写入 chrome.storage.local,供 popup 和 content script 同步读取。
|
||||
*/
|
||||
export async function setCrawlTaskState(state: CrawlTaskState): Promise<void> {
|
||||
await chrome.storage.local.set({ [CRAWL_TASK_STORAGE_KEY]: state });
|
||||
}
|
||||
|
||||
/**
|
||||
* 读取任务状态后执行不可变更新,避免覆盖已取消或已替换的任务。
|
||||
*/
|
||||
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));
|
||||
}
|
||||
|
||||
/**
|
||||
* 粗略判断 storage 中读取到的值是否像一个爬取任务状态对象。
|
||||
*/
|
||||
function isCrawlTaskState(value: unknown): value is CrawlTaskState {
|
||||
return typeof value === 'object' && value !== null && 'id' in value && 'steps' in value;
|
||||
}
|
||||
Reference in New Issue
Block a user