From 9ec9ff1ab4bf4656ab5ef0a898af953ebff9046d Mon Sep 17 00:00:00 2001 From: Quinten Kock Date: Tue, 18 Nov 2025 01:43:27 +0100 Subject: [PATCH] further simplify and cleanup pty<->terminal comms --- src/app/terminal.ts | 19 +++++++------------ src/main/pty.ts | 1 + src/preload.ts | 35 ++++++++++++++++------------------- src/types/global.d.ts | 10 ++++------ 4 files changed, 28 insertions(+), 37 deletions(-) diff --git a/src/app/terminal.ts b/src/app/terminal.ts index e776506..6ce15ac 100644 --- a/src/app/terminal.ts +++ b/src/app/terminal.ts @@ -53,21 +53,16 @@ export class Terminal implements Displayable { // Set up data handling (subscribe/unsubscribe) this.unsubTerminalData = window.electronAPI.onTerminalData( - (id, data) => { - if (id === this.terminalId) { - this.term.write(data); - } - }, + this.terminalId, + (data) => this.term.write(data), ); this.unsubTerminalExit = window.electronAPI.onTerminalExit( - (id, exitCode) => { - if (id === this.terminalId) { - this.term.writeln( - `\r\n[Process exited with code ${exitCode}]`, - ); - } - }, + this.terminalId, + (exitCode) => + this.term.writeln( + `\r\n[Process exited with code ${exitCode}]`, + ), ); // Handle user input diff --git a/src/main/pty.ts b/src/main/pty.ts index 62e6d5c..02f27aa 100644 --- a/src/main/pty.ts +++ b/src/main/pty.ts @@ -33,6 +33,7 @@ export class TerminalManager { }; ptyProcess.onData((data) => { + console.log(`Terminal ${id} data:`, data); event.sender.send("terminal:data", id, data); }); diff --git a/src/preload.ts b/src/preload.ts index c8d97e3..56b24dd 100644 --- a/src/preload.ts +++ b/src/preload.ts @@ -8,21 +8,20 @@ import type { FolderTree } from "./types/global"; // and forward events to subscribed callbacks. Each `onTerminal*` returns an // unsubscribe function so individual renderer components can remove only // their own listeners. -const terminalDataCallbacks = new Set<(id: string, data: string) => void>(); -const terminalExitCallbacks = new Set< - (id: string, exitCode: number, signal: string) => void ->(); +const terminalDataCallbacks = new Map void>(); +const terminalExitCallbacks = new Map void>(); ipcRenderer.on("terminal:data", (_ev, id: string, data: string) => { - for (const cb of terminalDataCallbacks) cb(id, data); + const cb = terminalDataCallbacks.get(id); + if (cb) cb(data); + else console.warn(`No data callback for terminal ${id}`); }); -ipcRenderer.on( - "terminal:exit", - (_ev, id: string, exitCode: number, signal: string) => { - for (const cb of terminalExitCallbacks) cb(id, exitCode, signal); - }, -); +ipcRenderer.on("terminal:exit", (_ev, id: string, exitCode: number) => { + const cb = terminalExitCallbacks.get(id); + if (cb) cb(exitCode); + else console.warn(`No exit callback for terminal ${id}`); +}); contextBridge.exposeInMainWorld("electronAPI", { openFolder: () => @@ -83,15 +82,13 @@ contextBridge.exposeInMainWorld("electronAPI", { ipcRenderer.invoke("terminal:close", id) as Promise, // Terminal events (subscribe/unsubscribe) - onTerminalData: (callback: (id: string, data: string) => void) => { - terminalDataCallbacks.add(callback); - return () => terminalDataCallbacks.delete(callback); + onTerminalData: (id: string, callback: (data: string) => void) => { + terminalDataCallbacks.set(id, callback); + return () => terminalDataCallbacks.delete(id); }, - onTerminalExit: ( - callback: (id: string, exitCode: number, signal: string) => void, - ) => { - terminalExitCallbacks.add(callback); - return () => terminalExitCallbacks.delete(callback); + onTerminalExit: (id: string, callback: (exitCode: number) => void) => { + terminalExitCallbacks.set(id, callback); + return () => terminalExitCallbacks.delete(id); }, }); diff --git a/src/types/global.d.ts b/src/types/global.d.ts index 1959226..6470c2c 100644 --- a/src/types/global.d.ts +++ b/src/types/global.d.ts @@ -48,14 +48,12 @@ declare global { writeToTerminal: (id: string, data: string) => Promise; closeTerminal: (id: string) => Promise; onTerminalData: ( - callback: (id: string, data: string) => void, + id: string, + callback: (data: string) => void, ) => () => void; onTerminalExit: ( - callback: ( - id: string, - exitCode: number, - signal: string, - ) => void, + id: string, + callback: (exitCode: number) => void, ) => () => void; removeAllTerminalListeners: () => void; };