fix: unify PTY process termination handling across platforms

Refactored the process termination logic in both ClaudeUsageService and TerminalService to use a centralized method for killing PTY processes. This ensures consistent handling of process termination across Windows and Unix-like systems, improving reliability and maintainability of the code.
This commit is contained in:
Kacper
2026-01-16 20:34:12 +01:00
committed by Scott
parent d22deabe79
commit f0e655f49a
2 changed files with 42 additions and 11 deletions

View File

@@ -23,6 +23,22 @@ export class ClaudeUsageService {
private isWindows = os.platform() === 'win32';
private isLinux = os.platform() === 'linux';
/**
* Kill a PTY process with platform-specific handling.
* Windows doesn't support Unix signals like SIGTERM, so we call kill() without arguments.
* On Unix-like systems (macOS, Linux), we can specify the signal.
*
* @param ptyProcess - The PTY process to kill
* @param signal - The signal to send on Unix-like systems (default: 'SIGTERM')
*/
private killPtyProcess(ptyProcess: pty.IPty, signal: string = 'SIGTERM'): void {
if (this.isWindows) {
ptyProcess.kill();
} else {
ptyProcess.kill(signal);
}
}
/**
* Check if Claude CLI is available on the system
*/
@@ -211,7 +227,7 @@ export class ClaudeUsageService {
if (!settled) {
settled = true;
if (ptyProcess && !ptyProcess.killed) {
ptyProcess.kill();
this.killPtyProcess(ptyProcess);
}
// Don't fail if we have data - return it instead
if (output.includes('Current session')) {
@@ -253,7 +269,7 @@ export class ClaudeUsageService {
if (!settled) {
settled = true;
if (ptyProcess && !ptyProcess.killed) {
ptyProcess.kill();
this.killPtyProcess(ptyProcess);
}
reject(
new Error(
@@ -277,14 +293,10 @@ export class ClaudeUsageService {
ptyProcess.write('\x1b'); // Send escape key
// Fallback: if ESC doesn't exit (Linux), use SIGTERM after 2s
// Windows doesn't support signals, so just call kill() without args
// Windows doesn't support signals, so killPtyProcess handles platform differences
setTimeout(() => {
if (!settled && ptyProcess && !ptyProcess.killed) {
if (this.isWindows) {
ptyProcess.kill();
} else {
ptyProcess.kill('SIGTERM');
}
this.killPtyProcess(ptyProcess);
}
}, 2000);
}