UNPKG

repomix

Version:

A tool to pack repository contents to single file for AI consumption

84 lines (83 loc) 2.76 kB
import { workerData } from 'node:worker_threads'; const handlerCache = new Map(); const loadWorkerHandler = async (workerType) => { const cached = handlerCache.get(workerType); if (cached) { return cached; } let result; switch (workerType) { case 'fileProcess': { const module = await import('../core/file/workers/fileProcessWorker.js'); result = { handler: module.default, cleanup: module.onWorkerTermination }; break; } case 'securityCheck': { const module = await import('../core/security/workers/securityCheckWorker.js'); result = { handler: module.default, cleanup: module.onWorkerTermination }; break; } case 'calculateMetrics': { const module = await import('../core/metrics/workers/calculateMetricsWorker.js'); result = { handler: module.default, cleanup: module.onWorkerTermination }; break; } default: throw new Error(`Unknown worker type: ${workerType}`); } handlerCache.set(workerType, result); return result; }; const inferWorkerTypeFromTask = (task) => { if (!task || typeof task !== 'object') { return null; } const taskObj = task; if ('rawFile' in taskObj && 'config' in taskObj) { return 'fileProcess'; } if ('encoding' in taskObj && ('content' in taskObj || 'items' in taskObj)) { return 'calculateMetrics'; } if ('items' in taskObj && !('encoding' in taskObj)) { return 'securityCheck'; } return null; }; const getWorkerTypeFromWorkerData = () => { if (!workerData) { return undefined; } if (Array.isArray(workerData)) { for (const item of workerData) { if (item && typeof item === 'object' && 'workerType' in item) { return item.workerType; } } return undefined; } if (typeof workerData === 'object' && 'workerType' in workerData) { return workerData.workerType; } return undefined; }; export default async (task) => { let workerType = getWorkerTypeFromWorkerData() ?? process.env.REPOMIX_WORKER_TYPE; const inferredType = inferWorkerTypeFromTask(task); if (inferredType) { workerType = inferredType; } if (!workerType) { throw new Error('Cannot determine worker type from workerData, env, or task structure'); } const { handler } = await loadWorkerHandler(workerType); return handler(task); }; export const onWorkerTermination = async () => { for (const { cleanup } of handlerCache.values()) { if (cleanup) { await cleanup(); } } handlerCache.clear(); };