From 5b093ce037b9342297a4cb95c54d8ffaefa010f2 Mon Sep 17 00:00:00 2001 From: Aomsin Date: Mon, 27 Oct 2025 05:23:27 +0700 Subject: [PATCH 1/5] feat: Launch.kill() --- src/Launch.ts | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/Launch.ts b/src/Launch.ts index d1663f3..203199d 100755 --- a/src/Launch.ts +++ b/src/Launch.ts @@ -200,7 +200,7 @@ export type LaunchOPTS = { export default class Launch extends EventEmitter { options: LaunchOPTS; - + pid: number | null = null; async Launch(opt: LaunchOPTS) { const defaultOptions: LaunchOPTS = { url: null, @@ -302,6 +302,7 @@ export default class Launch extends EventEmitter { this.emit('data', `Launching with arguments ${argumentsLogs}`); let minecraftDebug = spawn(java, Arguments, { cwd: logs, detached: this.options.detached }) + this.pid = minecraftDebug.pid; minecraftDebug.stdout.on('data', (data) => this.emit('data', data.toString('utf-8'))) minecraftDebug.stderr.on('data', (data) => this.emit('data', data.toString('utf-8'))) minecraftDebug.on('close', (code) => this.emit('close', 'Minecraft closed')) @@ -401,4 +402,17 @@ export default class Launch extends EventEmitter { minecraftJava: gameJava } } + + kill() { + if (this.pid) { + try { + process.kill(-this.pid); + this.emit('data', 'Minecraft process killed'); + } catch (e) { + this.emit('error', { error: 'Failed to kill Minecraft process', details: e }); + } + } else { + this.emit('error', { error: 'No Minecraft process to kill' }); + } + } } \ No newline at end of file From 6fc788a8a7b2c9b85445f5e69912f14603f5705c Mon Sep 17 00:00:00 2001 From: Aomsin Date: Mon, 27 Oct 2025 05:27:41 +0700 Subject: [PATCH 2/5] feat: package.json prepare --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 56072a9..1664632 100755 --- a/package.json +++ b/package.json @@ -12,7 +12,8 @@ "scripts": { "dev": "rimraf ./build && tsc -w", "build": "rimraf ./build && tsc", - "prepublishOnly": "npm i && npm run build" + "prepublishOnly": "npm i && npm run build", + "prepare": "npm i && npm run build" }, "engines": { "node": ">=18.0.0" From a4e87fd586d85673b7e6667841868b2b13bb2848 Mon Sep 17 00:00:00 2001 From: Aomsin Date: Mon, 27 Oct 2025 05:30:11 +0700 Subject: [PATCH 3/5] feat: packageManager pnpm --- package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 1664632..6e7d776 100755 --- a/package.json +++ b/package.json @@ -12,9 +12,10 @@ "scripts": { "dev": "rimraf ./build && tsc -w", "build": "rimraf ./build && tsc", - "prepublishOnly": "npm i && npm run build", - "prepare": "npm i && npm run build" + "prepublishOnly": "pnpm i && pnpm run build", + "prepare": "pnpm i && pnpm run build" }, + "packageManager": "pnpm@10.17.0", "engines": { "node": ">=18.0.0" }, From a0688db8163ca9bd0cda0dbb37bb8db1bbd1c389 Mon Sep 17 00:00:00 2001 From: Aomsin Date: Mon, 27 Oct 2025 05:37:04 +0700 Subject: [PATCH 4/5] feat: packageManager pnpm --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6e7d776..2904ac8 100755 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "dev": "rimraf ./build && tsc -w", "build": "rimraf ./build && tsc", "prepublishOnly": "pnpm i && pnpm run build", - "prepare": "pnpm i && pnpm run build" + "prepare": "pnpm run build" }, "packageManager": "pnpm@10.17.0", "engines": { From e1fe8afcd5955939a22a43f487ff9830003fdda1 Mon Sep 17 00:00:00 2001 From: Aomsin Date: Mon, 27 Oct 2025 05:53:35 +0700 Subject: [PATCH 5/5] fix: improve Minecraft process kill handling across platforms --- src/Launch.ts | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/Launch.ts b/src/Launch.ts index 203199d..05fc0d9 100755 --- a/src/Launch.ts +++ b/src/Launch.ts @@ -404,15 +404,31 @@ export default class Launch extends EventEmitter { } kill() { - if (this.pid) { - try { - process.kill(-this.pid); - this.emit('data', 'Minecraft process killed'); - } catch (e) { + if (!this.pid) { + this.emit('error', { error: 'No Minecraft process to kill' }); + return; + } + + try { + if (process.platform === 'win32') { + // On Windows, just kill the process + process.kill(this.pid, 'SIGTERM'); // use SIGTERM instead of default for safer termination + } else { + // On Unix-like systems, kill the process group + // Ensure the PID is negative to target the process group + process.kill(-this.pid, 'SIGTERM'); + } + this.emit('data', 'Minecraft process killed'); + } catch (e: any) { + if (e.code === 'ESRCH') { + // Process does not exist + this.emit('data', 'Minecraft process already exited'); + } else if (e.code === 'EPERM') { + // Permission error + this.emit('error', { error: 'Permission denied when killing process', details: e }); + } else { this.emit('error', { error: 'Failed to kill Minecraft process', details: e }); } - } else { - this.emit('error', { error: 'No Minecraft process to kill' }); } } } \ No newline at end of file