UNPKG

@oxog/port-terminator

Version:

Cross-platform utility to terminate processes on ports with zero dependencies

106 lines 3.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ProcessKiller = void 0; const platform_1 = require("../utils/platform"); const windows_1 = require("../platforms/windows"); const macos_1 = require("../platforms/macos"); const linux_1 = require("../platforms/linux"); const errors_1 = require("../errors"); class ProcessKiller { constructor() { const platformName = (0, platform_1.getPlatform)(); switch (platformName) { case 'win32': this.platform = new windows_1.WindowsPlatform(); break; case 'darwin': this.platform = new macos_1.MacOSPlatform(); break; case 'linux': this.platform = new linux_1.LinuxPlatform(); break; default: throw new errors_1.PlatformError(platformName); } } async killProcess(pid, force = false, gracefulTimeout = 5000) { if (!force && gracefulTimeout > 0) { try { await this.platform.killProcess(pid, false); const isKilled = await this.waitForProcessToExit(pid, gracefulTimeout); if (isKilled) { return true; } } catch (error) { // Continue to force kill } } return this.platform.killProcess(pid, true); } async killProcesses(pids, force = false, gracefulTimeout = 5000) { const results = new Map(); await Promise.all(pids.map(async (pid) => { try { const success = await this.killProcess(pid, force, gracefulTimeout); results.set(pid, success); } catch (error) { results.set(pid, false); } })); return results; } async killProcessesByPort(port, force = false, gracefulTimeout = 5000, protocol) { const processes = await this.platform.findProcessesByPort(port, protocol); if (processes.length === 0) { return []; } const killedProcesses = []; for (const process of processes) { try { const success = await this.killProcess(process.pid, force, gracefulTimeout); if (success) { killedProcesses.push(process); } } catch (error) { // Log error but continue with other processes } } return killedProcesses; } async killProcessesByPorts(ports, force = false, gracefulTimeout = 5000, protocol) { const results = new Map(); await Promise.all(ports.map(async (port) => { try { const killedProcesses = await this.killProcessesByPort(port, force, gracefulTimeout, protocol); results.set(port, killedProcesses); } catch (error) { results.set(port, []); } })); return results; } async waitForProcessToExit(pid, timeout) { const startTime = Date.now(); const checkInterval = 100; while (Date.now() - startTime < timeout) { try { const processes = await this.platform.findProcessesByPort(0); const processExists = processes.some((p) => p.pid === pid); if (!processExists) { return true; } await new Promise((resolve) => setTimeout(resolve, checkInterval)); } catch (error) { return true; } } return false; } } exports.ProcessKiller = ProcessKiller; //# sourceMappingURL=process-killer.js.map