export default defineEventHandler(async event => { event.context.query = getQuery(event) // 获取任务列表的状态进度(普通用户只能看到自己的) if (event.node.req.method === 'GET') { let tasks = await useStorage().getItem(`task:${event.context.query.tid}`) return { 'tasks': tasks } } // 保存任务列表的状态进度(只允许BOT写入) if (event.node.req.method === 'PUT') { await useStorage().setItem(`task:${event.context.query.tid}`, event.context.query.tid) return { 'message': 'ok' } } // 抽取一组任务(优先队列里最多的模型) if (event.node.req.method === 'PATCH') { // 筛选出所有的任务(并打印) let tasks = await useStorage().getKeys().then((keys: any[]) => keys.filter(key => key.startsWith('task:'))) console.log(tasks) // 按照任务的model字段分组 let groups = tasks.reduce((groups: any, task: any) => { let model = task.model if (!groups[model]) { groups[model] = [] } groups[model].push(task) return groups }) // 按照任务数量排序 let sorted = Object.keys(groups).sort((a, b) => groups[b].length - groups[a].length) console.log(sorted) // 将抽取到的任务从队列中改变状态 for (let task of groups[sorted[0]]) { task.status = 'processing' await useStorage().setItem(`task:${task.tid}`, task) } // 返回数量最多的任务 return { 'task': groups[sorted[0]][0] } } // 添加任务到队列(生成一个32位随机字符串作为任务ID) if (event.node.req.method === 'POST') { event.context.body = await readBody(event) // 读取body数据到 event.context.body.tid = Math.random().toString(36).substring(2, 34) event.context.body.status = 'waiting' // 默认当前状态 event.context.body.createdAt = new Date().getTime() // 设定创建时间 await useStorage().setItem(`task:${event.context.body.tid}`, event.context.body) // 筛选出所有的任务(并打印) let tasks = await useStorage().getKeys().then((keys: any[]) => keys.filter(key => key.startsWith('task:'))) console.log(tasks) // 如果无需排队,直接返回结果, 否则返回任务排队状态(预估等待时间) return event.context.body } // 逐删除自己的指定任务(普通用户只能删除自己的) if (event.node.req.method === 'DELETE') { await useStorage().removeItem(`task:${event.context.query.tid}`) return { 'message': 'ok' } } })