@oxog/port-terminator
Version:
Cross-platform utility to terminate processes on ports with zero dependencies
106 lines • 3.8 kB
JavaScript
;
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