Fix ineffective restartInitiated guard with proper debouncing

The guard was setting and immediately resetting the flag in the same
synchronous execution, providing no actual protection. Now the flag
stays true until proxy reaches a stable state (running/exited/error)
via WebSocket notification, with additional client-side guard.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Andras Bacsai 2025-12-04 08:57:03 +01:00
parent d53a12182e
commit 2fc870c6eb
2 changed files with 7 additions and 5 deletions

View file

@ -67,7 +67,7 @@ public function restart()
try {
$this->authorize('manageProxy', $this->server);
// Prevent duplicate restart messages (e.g., from double-click or re-render)
// Prevent duplicate restart calls
if ($this->restartInitiated) {
return;
}
@ -75,10 +75,6 @@ public function restart()
// Always use background job for all servers
RestartProxyJob::dispatch($this->server);
// $this->dispatch('info', 'Proxy restart initiated.');
// Reset the flag after a short delay to allow future restarts
$this->restartInitiated = false;
} catch (\Throwable $e) {
$this->restartInitiated = false;
@ -147,6 +143,11 @@ public function showNotification($event = null)
$this->dispatch('activityMonitor', $event['activityId']);
}
// Reset restart flag when proxy reaches a stable state
if (in_array($this->proxyStatus, ['running', 'exited', 'error'])) {
$this->restartInitiated = false;
}
// Skip notification if we already notified about this status (prevents duplicates)
if ($this->lastNotifiedStatus === $this->proxyStatus) {
return;

View file

@ -181,6 +181,7 @@ class="flex items-center gap-6 overflow-x-scroll sm:overflow-x-hidden scrollbar
}
});
$wire.$on('restartEvent', () => {
if ($wire.restartInitiated) return;
window.dispatchEvent(new CustomEvent('startproxy'))
$wire.$call('restart');
});