扫描修改为后台扫描,openlist登录增加账号密码
This commit is contained in:
@@ -0,0 +1,131 @@
|
||||
/* eslint-disable @typescript-eslint/no-explicit-any, no-console */
|
||||
|
||||
/**
|
||||
* 后台扫描任务管理
|
||||
*/
|
||||
|
||||
export interface ScanTask {
|
||||
id: string;
|
||||
status: 'running' | 'completed' | 'failed';
|
||||
progress: {
|
||||
current: number;
|
||||
total: number;
|
||||
currentFolder?: string;
|
||||
};
|
||||
result?: {
|
||||
total: number;
|
||||
new: number;
|
||||
existing: number;
|
||||
errors: number;
|
||||
};
|
||||
error?: string;
|
||||
startTime: number;
|
||||
endTime?: number;
|
||||
}
|
||||
|
||||
const tasks = new Map<string, ScanTask>();
|
||||
|
||||
export function createScanTask(): string {
|
||||
const id = `scan_${Date.now()}_${Math.random().toString(36).substring(7)}`;
|
||||
const task: ScanTask = {
|
||||
id,
|
||||
status: 'running',
|
||||
progress: {
|
||||
current: 0,
|
||||
total: 0,
|
||||
},
|
||||
startTime: Date.now(),
|
||||
};
|
||||
tasks.set(id, task);
|
||||
return id;
|
||||
}
|
||||
|
||||
export function getScanTask(id: string): ScanTask | null {
|
||||
return tasks.get(id) || null;
|
||||
}
|
||||
|
||||
export function updateScanTaskProgress(
|
||||
id: string,
|
||||
current: number,
|
||||
total: number,
|
||||
currentFolder?: string
|
||||
): void {
|
||||
let task = tasks.get(id);
|
||||
if (!task) {
|
||||
// 如果任务不存在(可能因为模块重新加载),重新创建任务
|
||||
console.warn(`[ScanTask] 任务 ${id} 不存在,重新创建`);
|
||||
task = {
|
||||
id,
|
||||
status: 'running',
|
||||
progress: {
|
||||
current: 0,
|
||||
total: 0,
|
||||
},
|
||||
startTime: Date.now(),
|
||||
};
|
||||
tasks.set(id, task);
|
||||
}
|
||||
task.progress = { current, total, currentFolder };
|
||||
}
|
||||
|
||||
export function completeScanTask(
|
||||
id: string,
|
||||
result: ScanTask['result']
|
||||
): void {
|
||||
let task = tasks.get(id);
|
||||
if (!task) {
|
||||
// 如果任务不存在(可能因为模块重新加载),重新创建任务
|
||||
console.warn(`[ScanTask] 任务 ${id} 不存在,重新创建并标记为完成`);
|
||||
task = {
|
||||
id,
|
||||
status: 'completed',
|
||||
progress: {
|
||||
current: result?.total || 0,
|
||||
total: result?.total || 0,
|
||||
},
|
||||
startTime: Date.now() - 60000, // 假设任务运行了1分钟
|
||||
endTime: Date.now(),
|
||||
result,
|
||||
};
|
||||
tasks.set(id, task);
|
||||
return;
|
||||
}
|
||||
task.status = 'completed';
|
||||
task.result = result;
|
||||
task.endTime = Date.now();
|
||||
}
|
||||
|
||||
export function failScanTask(id: string, error: string): void {
|
||||
let task = tasks.get(id);
|
||||
if (!task) {
|
||||
// 如果任务不存在(可能因为模块重新加载),重新创建任务
|
||||
console.warn(`[ScanTask] 任务 ${id} 不存在,重新创建并标记为失败`);
|
||||
task = {
|
||||
id,
|
||||
status: 'failed',
|
||||
progress: {
|
||||
current: 0,
|
||||
total: 0,
|
||||
},
|
||||
startTime: Date.now() - 60000, // 假设任务运行了1分钟
|
||||
endTime: Date.now(),
|
||||
error,
|
||||
};
|
||||
tasks.set(id, task);
|
||||
return;
|
||||
}
|
||||
task.status = 'failed';
|
||||
task.error = error;
|
||||
task.endTime = Date.now();
|
||||
}
|
||||
|
||||
export function cleanupOldTasks(): void {
|
||||
const now = Date.now();
|
||||
const maxAge = 60 * 60 * 1000; // 1小时
|
||||
|
||||
for (const [id, task] of Array.from(tasks.entries())) {
|
||||
if (task.endTime && now - task.endTime > maxAge) {
|
||||
tasks.delete(id);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user