UNPKG

eslint-remote-tester

Version:
70 lines (69 loc) 2.53 kB
import { Worker, isMainThread } from 'node:worker_threads'; import { fileURLToPath } from 'node:url'; import workerTask, { createErrorMessage, } from './worker-task.js'; import { resolveConfigurationLocation } from '../config/index.js'; if (!isMainThread) { workerTask(); } /** * Start scanning of given repository in a separate thread * - Keeps progress-logger up-to-date via onMessage */ function scanRepository(repository, onMessage, workerCallback) { return new Promise(resolve => { // Notify about worker starting. It can take a while to get worker starting up // Prevents showing blank screen between worker start and repository reading onMessage({ type: 'START' }); const worker = new Worker(fileURLToPath(import.meta.url), { workerData: { repository, configurationLocation: resolveConfigurationLocation(), }, env: { ...process.env, // Prevent git from prompting password. Instead just fail repository cloning. GIT_TERMINAL_PROMPT: '0', }, }); const cleanup = workerCallback(worker); worker.on('message', (message) => { switch (message.type) { case 'LINT_END': return resolve(); default: return onMessage(message); } }); worker.on('error', (error) => { const messages = [ createErrorMessage({ path: repository, ruleId: '', message: [error.code, error.message] .filter(Boolean) .join(' '), }), ]; onMessage({ type: 'WORKER_ERROR', payload: error.code }); onMessage({ type: 'ON_RESULT', payload: { messages } }); resolve(); }); worker.on('exit', code => { cleanup(); // 0 = success, 1 = termination if (code === 0 || code === 1) { return resolve(); } const messages = [ createErrorMessage({ message: `Worker exited with code ${code}`, path: repository, ruleId: '', }), ]; onMessage({ type: 'ON_RESULT', payload: { messages } }); resolve(); }); }); } export default { scanRepository };