fix: Improve heartbeat handling and session.json debounce cleanup

- Echo heartbeat messages back to clients for better connection monitoring
- Properly clear debounce timer references to prevent memory leaks
- Pass client socket to message handler for proper heartbeat responses
This commit is contained in:
Peter Steinberger 2025-07-01 12:48:41 +01:00
parent 646b478075
commit 3b99312fdb

View file

@ -719,7 +719,7 @@ export class PtyManager extends EventEmitter {
parser.addData(chunk); parser.addData(chunk);
for (const { type, payload } of parser.parseMessages()) { for (const { type, payload } of parser.parseMessages()) {
this.handleSocketMessage(session, type, payload); this.handleSocketMessage(session, type, payload, client);
} }
}); });
@ -750,7 +750,12 @@ export class PtyManager extends EventEmitter {
/** /**
* Handle incoming socket messages * Handle incoming socket messages
*/ */
private handleSocketMessage(session: PtySession, type: MessageType, payload: Buffer): void { private handleSocketMessage(
session: PtySession,
type: MessageType,
payload: Buffer,
client?: net.Socket
): void {
try { try {
const data = parsePayload(type, payload); const data = parsePayload(type, payload);
@ -773,7 +778,11 @@ export class PtyManager extends EventEmitter {
} }
case MessageType.HEARTBEAT: case MessageType.HEARTBEAT:
// Echo heartbeat back (could add heartbeat response later) // Echo heartbeat back to the client
if (client && !client.destroyed) {
const heartbeatFrame = frameMessage(MessageType.HEARTBEAT, Buffer.alloc(0));
client.write(heartbeatFrame);
}
break; break;
default: default:
@ -802,8 +811,9 @@ export class PtyManager extends EventEmitter {
debounceTimer = setTimeout(() => { debounceTimer = setTimeout(() => {
this.handleSessionJsonChange(session); this.handleSessionJsonChange(session);
// Clear the timer reference after execution // Clear both timer references after execution
session.sessionJsonDebounceTimer = null; session.sessionJsonDebounceTimer = null;
debounceTimer = null;
}, 100); }, 100);
// Update the session's timer reference // Update the session's timer reference
@ -811,6 +821,9 @@ export class PtyManager extends EventEmitter {
} }
}); });
// Store watcher for cleanup BEFORE setting up error handler
session.sessionJsonWatcher = watcher;
// Add error handling for watcher // Add error handling for watcher
watcher.on('error', (error) => { watcher.on('error', (error) => {
logger.error(`Session.json watcher failed for ${session.id}:`, error); logger.error(`Session.json watcher failed for ${session.id}:`, error);
@ -823,9 +836,6 @@ export class PtyManager extends EventEmitter {
} }
}); });
// Store watcher for cleanup
session.sessionJsonWatcher = watcher;
// Unref the watcher so it doesn't keep the process alive // Unref the watcher so it doesn't keep the process alive
watcher.unref(); watcher.unref();