Spaces:
Sleeping
Sleeping
| // const { Queue, Worker, QueueScheduler, Job } = require('bullmq'); | |
| // const IORedis = require('ioredis'); | |
| // const fs = require('fs-extra'); | |
| // const path = require('path'); | |
| // const { v4: uuidv4 } = require('uuid'); | |
| // const { generateShadow } = require('./shadowGenerator'); // your existing shadow logic | |
| // // Redis connection | |
| // const connection = new IORedis(); | |
| // // Queue setup | |
| // const shadowQueue = new Queue('shadowQueue', { connection }); | |
| // new QueueScheduler('shadowQueue', { connection }); | |
| // // RAM and disk buffers | |
| // const RAM_LIMIT = 20; // max tasks in RAM | |
| // const RAM_BUFFER = []; | |
| // const DISK_BUFFER = path.join(__dirname, 'diskQueue'); | |
| // fs.ensureDirSync(DISK_BUFFER); | |
| // // In-memory results | |
| // const RESULTS = {}; | |
| // // ---------------- Add Task ---------------- | |
| // async function addTask(fileBuffer, options = {}) { | |
| // const taskId = uuidv4(); // unique ID for each task | |
| // const task = { id: taskId, file: fileBuffer, options }; | |
| // if (RAM_BUFFER.length < RAM_LIMIT) { | |
| // RAM_BUFFER.push(task); | |
| // processRAMBuffer(); | |
| // } else { | |
| // // Move to disk | |
| // const filePath = path.join(DISK_BUFFER, `${taskId}.json`); | |
| // await fs.writeJson(filePath, task, { spaces: 0 }); | |
| // } | |
| // return taskId; | |
| // } | |
| // // ---------------- Process RAM tasks ---------------- | |
| // let processing = false; | |
| // async function processRAMBuffer() { | |
| // if (processing || RAM_BUFFER.length === 0) return; | |
| // processing = true; | |
| // while (RAM_BUFFER.length > 0) { | |
| // const task = RAM_BUFFER.shift(); | |
| // try { | |
| // const imgBuffer = await generateShadow(task.file, task.options); | |
| // RESULTS[task.id] = imgBuffer; | |
| // } catch (err) { | |
| // console.error(`Task ${task.id} failed:`, err); | |
| // RESULTS[task.id] = null; | |
| // } | |
| // // Move tasks from disk to RAM if space available | |
| // const diskFiles = await fs.readdir(DISK_BUFFER); | |
| // while (RAM_BUFFER.length < RAM_LIMIT && diskFiles.length > 0) { | |
| // const diskFile = diskFiles.shift(); | |
| // const taskFromDisk = await fs.readJson(path.join(DISK_BUFFER, diskFile)); | |
| // RAM_BUFFER.push(taskFromDisk); | |
| // await fs.remove(path.join(DISK_BUFFER, diskFile)); | |
| // } | |
| // } | |
| // processing = false; | |
| // } | |
| // // ---------------- Check Task Status ---------------- | |
| // function getTaskStatus(taskId) { | |
| // if (RESULTS[taskId] === undefined) return 'pending'; | |
| // if (RESULTS[taskId] === null) return 'failed'; | |
| // return 'done'; | |
| // } | |
| // // ---------------- Fetch Result ---------------- | |
| // function getTaskResult(taskId) { | |
| // return RESULTS[taskId] || null; | |
| // } | |
| // module.exports = { | |
| // addTask, | |
| // getTaskStatus, | |
| // getTaskResult | |
| // }; | |
| const { v4: uuidv4 } = require('uuid'); | |
| const { generateShadow } = require('../core/shadowGenerator'); | |
| const RAM_LIMIT = 20; | |
| const RAM_BUFFER = []; | |
| const RESULTS = {}; | |
| const CLEANUP_TIME = 10 * 60 * 1000; // 10 minutes | |
| let processing = false; | |
| // ---------------- Add Task ---------------- | |
| async function addTask(fileBuffer, options = {}) { | |
| const taskId = uuidv4(); | |
| const task = { id: taskId, file: fileBuffer, options }; | |
| if (RAM_BUFFER.length < RAM_LIMIT) { | |
| RAM_BUFFER.push(task); | |
| processRAMBuffer(); | |
| } else { | |
| return Promise.reject(new Error('Server busy, try again')); | |
| } | |
| return taskId; | |
| } | |
| // ---------------- Process RAM tasks ---------------- | |
| async function processRAMBuffer() { | |
| if (processing || RAM_BUFFER.length === 0) return; | |
| processing = true; | |
| while (RAM_BUFFER.length > 0) { | |
| const task = RAM_BUFFER.shift(); | |
| try { | |
| const imgBuffer = await generateShadow(task.file, task.options); | |
| RESULTS[task.id] = imgBuffer; | |
| // Auto-clean after CLEANUP_TIME | |
| setTimeout(() => { | |
| delete RESULTS[task.id]; | |
| }, CLEANUP_TIME); | |
| } catch (err) { | |
| console.error(`Task ${task.id} failed:`, err); | |
| RESULTS[task.id] = null; | |
| } | |
| } | |
| processing = false; | |
| } | |
| // ---------------- Check Task Status ---------------- | |
| function getTaskStatus(taskId) { | |
| if (RESULTS[taskId] === undefined) return 'pending'; | |
| if (RESULTS[taskId] === null) return 'failed'; | |
| return 'done'; | |
| } | |
| // ---------------- Fetch Result ---------------- | |
| function getTaskResult(taskId) { | |
| return RESULTS[taskId] || null; | |
| } | |
| // ---------------- Queue Length ---------------- | |
| function getQueueLength() { | |
| return RAM_BUFFER.length; | |
| } | |
| module.exports = { | |
| addTask, | |
| getTaskStatus, | |
| getTaskResult, | |
| getQueueLength | |
| }; | |