From 7b9be980b938450d597e0f0c7705c6a4f080d109 Mon Sep 17 00:00:00 2001 From: Huakun Shen Date: Tue, 12 Nov 2024 14:40:27 -0500 Subject: [PATCH] feat: implement extension spawned process auto cleanup If extension doesn't kill the processes it spawns, Kunkun will auto clean up all spawned processes on exit/window close --- apps/desktop/src/lib/cmds/ext.ts | 2 -- apps/desktop/src/lib/stores/winExtMap.ts | 18 ++++++++++++------ apps/desktop/src/lib/utils/style.ts | 1 - apps/desktop/src/routes/+layout.svelte | 15 ++++++++++++++- apps/desktop/src/routes/+page.svelte | 12 ++++-------- .../routes/extension/ui-iframe/+page.svelte | 1 - .../routes/extension/ui-worker/+page.svelte | 6 +----- .../ui/src/components/main/ExtCmdsGroup.svelte | 6 +++--- 8 files changed, 34 insertions(+), 27 deletions(-) diff --git a/apps/desktop/src/lib/cmds/ext.ts b/apps/desktop/src/lib/cmds/ext.ts index b29abe9..5a6617a 100644 --- a/apps/desktop/src/lib/cmds/ext.ts +++ b/apps/desktop/src/lib/cmds/ext.ts @@ -63,7 +63,6 @@ export async function onCustomUiCmdSelect( const newUrl = `http://${addr}` url2 = `/extension/ui-iframe?url=${encodeURIComponent(newUrl)}&extPath=${encodeURIComponent(ext.extPath)}` } - console.log("URL 2", url2) const window = launchNewExtWindow(winLabel, url2, cmd.window) window.onCloseRequested(async (event) => { await winExtMap.unregisterExtensionFromWindow(winLabel) @@ -81,7 +80,6 @@ export async function onCustomUiCmdSelect( const newUrl = `http://${addr}` url2 = `/extension/ui-iframe?url=${encodeURIComponent(newUrl)}&extPath=${encodeURIComponent(ext.extPath)}` } - console.log("URL 2", url2) goto(url2) } appState.clearSearchTerm() diff --git a/apps/desktop/src/lib/stores/winExtMap.ts b/apps/desktop/src/lib/stores/winExtMap.ts index 2bea26a..dfd3178 100644 --- a/apps/desktop/src/lib/stores/winExtMap.ts +++ b/apps/desktop/src/lib/stores/winExtMap.ts @@ -30,6 +30,7 @@ type API = { dist?: string }) => Promise unregisterExtensionFromWindow: (windowLabel: string) => Promise + cleanupProcessesFromWindow: (windowLabel: string) => Promise registerProcess: (windowLabel: string, pid: number) => Promise unregisterProcess: (pid: number) => Promise } @@ -84,11 +85,10 @@ function createWinExtMapStore(): Writable & API { if (winExtMap[windowLabel]) { // clean up processes spawned by extension but not killed by itself const extLabelMap = await getExtLabelMap() // realtime data from core process - Object.entries(extLabelMap).forEach(([label, ext]) => { - if (label === windowLabel) { - killProcesses(ext.processes) - } - }) + if (extLabelMap[windowLabel]) { + console.log("kill processes", extLabelMap[windowLabel].processes) + killProcesses(extLabelMap[windowLabel].processes) + } await unregisterExtensionWindow(windowLabel) delete winExtMap[windowLabel] store.set(winExtMap) @@ -96,9 +96,15 @@ function createWinExtMapStore(): Writable & API { warn(`Window ${windowLabel} does not have an extension registered`) } }, + cleanupProcessesFromWindow: async (windowLabel: string) => { + const winExtMap = get(store) + if (winExtMap[windowLabel]) { + await killProcesses(winExtMap[windowLabel].pids) + } + }, registerProcess: async (windowLabel: string, pid: number) => { const winExtMap = get(store) - registerExtensionSpawnedProcess(windowLabel, pid) + await registerExtensionSpawnedProcess(windowLabel, pid) if (!winExtMap[windowLabel]) { throw new Error(`Window ${windowLabel} does not have an extension registered`) } diff --git a/apps/desktop/src/lib/utils/style.ts b/apps/desktop/src/lib/utils/style.ts index 12e3b17..f84a872 100644 --- a/apps/desktop/src/lib/utils/style.ts +++ b/apps/desktop/src/lib/utils/style.ts @@ -29,7 +29,6 @@ export function positionToTailwindClasses(position: Position) { if (parseOutput.output.left) { className += ` left-[${parseOutput.output.left / 4}rem]` } - console.log(position, className) return className } } diff --git a/apps/desktop/src/routes/+layout.svelte b/apps/desktop/src/routes/+layout.svelte index 079021f..164a602 100644 --- a/apps/desktop/src/routes/+layout.svelte +++ b/apps/desktop/src/routes/+layout.svelte @@ -1,12 +1,13 @@