From a2d80ca3599dbec5c89f3595638ff2b253d5d63a Mon Sep 17 00:00:00 2001 From: Le Vivilet Date: Sat, 4 Jul 2026 22:47:19 +0200 Subject: [PATCH 1/2] move process kill to process explorer --- .../src/parts/KillProcess/KillProcess.ts | 5 ++-- .../src/parts/Signal/Signal.ts | 1 - .../test/ProcessCommands.test.ts | 23 ++++++++++++++++--- .../src/parts/CommandMap/CommandMap.ts | 2 ++ .../src/parts/KillProcess/KillProcess.ts | 6 +++++ .../src/parts/Process/Process.ts | 3 +++ .../src/parts/Signal/Signal.ts | 1 + .../test/CommandMapRpc.test.ts | 2 ++ .../process-explorer/test/KillProcess.test.ts | 17 ++++++++++++++ 9 files changed, 53 insertions(+), 7 deletions(-) delete mode 100644 packages/process-explorer-worker/src/parts/Signal/Signal.ts create mode 100644 packages/process-explorer/src/parts/KillProcess/KillProcess.ts create mode 100644 packages/process-explorer/src/parts/Process/Process.ts create mode 100644 packages/process-explorer/test/KillProcess.test.ts diff --git a/packages/process-explorer-worker/src/parts/KillProcess/KillProcess.ts b/packages/process-explorer-worker/src/parts/KillProcess/KillProcess.ts index 52da0b3..11d9efc 100644 --- a/packages/process-explorer-worker/src/parts/KillProcess/KillProcess.ts +++ b/packages/process-explorer-worker/src/parts/KillProcess/KillProcess.ts @@ -1,6 +1,5 @@ -import { RendererWorker } from '@lvce-editor/rpc-registry' import type { ProcessExplorerState } from '../ProcessExplorerState/ProcessExplorerState.ts' -import * as Signal from '../Signal/Signal.ts' +import * as ProcessExplorer from '../ProcessExplorer/ProcessExplorer.ts' export const killProcess = async ( state: ProcessExplorerState, @@ -10,6 +9,6 @@ export const killProcess = async ( if (!process) { return state } - await RendererWorker.invoke('Process.kill', process.pid, Signal.SigTerm) + await ProcessExplorer.invoke('Process.kill', process.pid) return state } diff --git a/packages/process-explorer-worker/src/parts/Signal/Signal.ts b/packages/process-explorer-worker/src/parts/Signal/Signal.ts deleted file mode 100644 index 29db7e4..0000000 --- a/packages/process-explorer-worker/src/parts/Signal/Signal.ts +++ /dev/null @@ -1 +0,0 @@ -export const SigTerm = 'SIGTERM' diff --git a/packages/process-explorer-worker/test/ProcessCommands.test.ts b/packages/process-explorer-worker/test/ProcessCommands.test.ts index 9ecf752..d610552 100644 --- a/packages/process-explorer-worker/test/ProcessCommands.test.ts +++ b/packages/process-explorer-worker/test/ProcessCommands.test.ts @@ -1,9 +1,26 @@ import { expect, jest, test } from '@jest/globals' +import { createMockRpc } from '@lvce-editor/rpc' import { RendererWorker } from '@lvce-editor/rpc-registry' import { createDefaultState } from '../src/parts/CreateDefaultState/CreateDefaultState.ts' import * as DebugProcess from '../src/parts/DebugProcess/DebugProcess.ts' import * as GetVisibleProcesses from '../src/parts/GetVisibleProcesses/GetVisibleProcesses.ts' import * as KillProcess from '../src/parts/KillProcess/KillProcess.ts' +import * as ProcessExplorer from '../src/parts/ProcessExplorer/ProcessExplorer.ts' + +interface DisposableMockRpc { + [Symbol.dispose](): void +} + +const registerProcessExplorerMock = ( + commandMap: Record, +): DisposableMockRpc => { + ProcessExplorer.set(createMockRpc({ commandMap })) + return { + [Symbol.dispose](): void { + ProcessExplorer.clear() + }, + } +} const processes = [ { @@ -24,7 +41,7 @@ const processes = [ test('killProcess', async () => { const kill = jest.fn() - using _mockRpc = RendererWorker.registerMockRpc({ + using _mockRpc = registerProcessExplorerMock({ 'Process.kill': kill, }) const state = { @@ -32,12 +49,12 @@ test('killProcess', async () => { visibleProcesses: GetVisibleProcesses.getVisibleProcesses(processes, [], 1), } await expect(KillProcess.killProcess(state, 0)).resolves.toBe(state) - expect(kill).toHaveBeenCalledWith(1, 'SIGTERM') + expect(kill).toHaveBeenCalledWith(1) }) test('killProcess - missing process', async () => { const kill = jest.fn() - using _mockRpc = RendererWorker.registerMockRpc({ + using _mockRpc = registerProcessExplorerMock({ 'Process.kill': kill, }) const state = createDefaultState() diff --git a/packages/process-explorer/src/parts/CommandMap/CommandMap.ts b/packages/process-explorer/src/parts/CommandMap/CommandMap.ts index 85fed7f..108aed4 100644 --- a/packages/process-explorer/src/parts/CommandMap/CommandMap.ts +++ b/packages/process-explorer/src/parts/CommandMap/CommandMap.ts @@ -2,6 +2,7 @@ import * as HandleElectronMessagePort from '../HandleElectronMessagePort/HandleE import * as HandleMessagePort from '../HandleMessagePort/HandleMessagePort.ts' import * as HandleSocket from '../HandleSocket/HandleSocket.ts' import * as HandleWebSocket from '../HandleWebSocket/HandleWebSocket.ts' +import * as KillProcess from '../KillProcess/KillProcess.ts' import * as ListProcessesWithMemoryUsage from '../ListProcessesWithMemoryUsage/ListProcessesWithMemoryUsage.ts' import * as ProcessId from '../ProcessId/ProcessId.ts' @@ -13,5 +14,6 @@ export const commandMap = { 'HandleWebSocket.handleWebSocket': HandleWebSocket.handleWebSocket, 'ListProcessesWithMemoryUsage.listProcessesWithMemoryUsage': ListProcessesWithMemoryUsage.listProcessesWithMemoryUsage, + 'Process.kill': KillProcess.killProcess, 'ProcessId.getMainProcessId': ProcessId.getMainProcessId, } diff --git a/packages/process-explorer/src/parts/KillProcess/KillProcess.ts b/packages/process-explorer/src/parts/KillProcess/KillProcess.ts new file mode 100644 index 0000000..f2c804f --- /dev/null +++ b/packages/process-explorer/src/parts/KillProcess/KillProcess.ts @@ -0,0 +1,6 @@ +import * as Process from '../Process/Process.ts' +import * as Signal from '../Signal/Signal.ts' + +export const killProcess = (pid: number): void => { + Process.kill(pid, Signal.SIGTERM) +} diff --git a/packages/process-explorer/src/parts/Process/Process.ts b/packages/process-explorer/src/parts/Process/Process.ts new file mode 100644 index 0000000..5b8a77d --- /dev/null +++ b/packages/process-explorer/src/parts/Process/Process.ts @@ -0,0 +1,3 @@ +export const kill = (pid: number, signal: NodeJS.Signals): void => { + process.kill(pid, signal) +} diff --git a/packages/process-explorer/src/parts/Signal/Signal.ts b/packages/process-explorer/src/parts/Signal/Signal.ts index e273494..ce77bd0 100644 --- a/packages/process-explorer/src/parts/Signal/Signal.ts +++ b/packages/process-explorer/src/parts/Signal/Signal.ts @@ -1 +1,2 @@ export const SIGINT = 'SIGINT' +export const SIGTERM = 'SIGTERM' diff --git a/packages/process-explorer/test/CommandMapRpc.test.ts b/packages/process-explorer/test/CommandMapRpc.test.ts index 1a6a3ef..1287e2d 100644 --- a/packages/process-explorer/test/CommandMapRpc.test.ts +++ b/packages/process-explorer/test/CommandMapRpc.test.ts @@ -4,6 +4,7 @@ import * as HandleElectronMessagePort from '../src/parts/HandleElectronMessagePo import * as HandleMessagePort from '../src/parts/HandleMessagePort/HandleMessagePort.ts' import * as HandleSocket from '../src/parts/HandleSocket/HandleSocket.ts' import * as HandleWebSocket from '../src/parts/HandleWebSocket/HandleWebSocket.ts' +import * as KillProcess from '../src/parts/KillProcess/KillProcess.ts' test('commandMap exposes rpc handoff commands', () => { expect( @@ -20,4 +21,5 @@ test('commandMap exposes rpc handoff commands', () => { expect(CommandMap.commandMap['HandleWebSocket.handleWebSocket']).toBe( HandleWebSocket.handleWebSocket, ) + expect(CommandMap.commandMap['Process.kill']).toBe(KillProcess.killProcess) }) diff --git a/packages/process-explorer/test/KillProcess.test.ts b/packages/process-explorer/test/KillProcess.test.ts new file mode 100644 index 0000000..108ae4d --- /dev/null +++ b/packages/process-explorer/test/KillProcess.test.ts @@ -0,0 +1,17 @@ +import { expect, jest, test } from '@jest/globals' + +const kill = jest.fn() + +jest.unstable_mockModule('../src/parts/Process/Process.ts', () => ({ + kill, +})) + +const KillProcess = await import( + '../src/parts/KillProcess/KillProcess.ts' +) + +test('killProcess', () => { + KillProcess.killProcess(123) + + expect(kill).toHaveBeenCalledWith(123, 'SIGTERM') +}) From cef8eb20affed5c0ce57a3756b870bc202bf49ec Mon Sep 17 00:00:00 2001 From: Le Vivilet Date: Sat, 4 Jul 2026 23:05:20 +0200 Subject: [PATCH 2/2] fix: avoid module mock in kill process test --- .../process-explorer/test/KillProcess.test.ts | 22 ++++++++----------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/packages/process-explorer/test/KillProcess.test.ts b/packages/process-explorer/test/KillProcess.test.ts index 108ae4d..2b1e994 100644 --- a/packages/process-explorer/test/KillProcess.test.ts +++ b/packages/process-explorer/test/KillProcess.test.ts @@ -1,17 +1,13 @@ import { expect, jest, test } from '@jest/globals' - -const kill = jest.fn() - -jest.unstable_mockModule('../src/parts/Process/Process.ts', () => ({ - kill, -})) - -const KillProcess = await import( - '../src/parts/KillProcess/KillProcess.ts' -) +import * as KillProcess from '../src/parts/KillProcess/KillProcess.ts' test('killProcess', () => { - KillProcess.killProcess(123) - - expect(kill).toHaveBeenCalledWith(123, 'SIGTERM') + const kill = jest.spyOn(process, 'kill').mockImplementation(() => true) + + try { + KillProcess.killProcess(123) + expect(kill).toHaveBeenCalledWith(123, 'SIGTERM') + } finally { + kill.mockRestore() + } })