diff --git a/frontend/app/view/term/term.tsx b/frontend/app/view/term/term.tsx index fb429f7b7..60824412c 100644 --- a/frontend/app/view/term/term.tsx +++ b/frontend/app/view/term/term.tsx @@ -311,12 +311,18 @@ class TermViewModel implements ViewModel { } updateShellProcStatus(fullStatus: BlockControllerRuntimeStatus) { - globalStore.set(this.shellProcFullStatus, fullStatus); - const status = fullStatus?.shellprocstatus ?? "init"; - if (status == "running") { - this.termRef.current?.setIsRunning?.(true); - } else { - this.termRef.current?.setIsRunning?.(false); + if (fullStatus == null) { + return; + } + const curStatus = globalStore.get(this.shellProcFullStatus); + if (curStatus == null || curStatus.version < fullStatus.version) { + globalStore.set(this.shellProcFullStatus, fullStatus); + const status = fullStatus?.shellprocstatus ?? "init"; + if (status == "running") { + this.termRef.current?.setIsRunning?.(true); + } else { + this.termRef.current?.setIsRunning?.(false); + } } } diff --git a/frontend/types/gotypes.d.ts b/frontend/types/gotypes.d.ts index 224da154c..1e4d53ca1 100644 --- a/frontend/types/gotypes.d.ts +++ b/frontend/types/gotypes.d.ts @@ -56,6 +56,7 @@ declare global { // blockcontroller.BlockControllerRuntimeStatus type BlockControllerRuntimeStatus = { blockid: string; + version: number; shellprocstatus?: string; shellprocconnname?: string; shellprocexitcode: number; diff --git a/pkg/blockcontroller/blockcontroller.go b/pkg/blockcontroller/blockcontroller.go index bc7ef20be..0f863529d 100644 --- a/pkg/blockcontroller/blockcontroller.go +++ b/pkg/blockcontroller/blockcontroller.go @@ -79,10 +79,12 @@ type BlockController struct { ShellProcStatus string ShellProcExitCode int RunLock *atomic.Bool + StatusVersion int } type BlockControllerRuntimeStatus struct { BlockId string `json:"blockid"` + Version int `json:"version"` ShellProcStatus string `json:"shellprocstatus,omitempty"` ShellProcConnName string `json:"shellprocconnname,omitempty"` ShellProcExitCode int `json:"shellprocexitcode"` @@ -97,6 +99,8 @@ func (bc *BlockController) WithLock(f func()) { func (bc *BlockController) GetRuntimeStatus() *BlockControllerRuntimeStatus { var rtn BlockControllerRuntimeStatus bc.WithLock(func() { + bc.StatusVersion++ + rtn.Version = bc.StatusVersion rtn.BlockId = bc.BlockId rtn.ShellProcStatus = bc.ShellProcStatus if bc.ShellProc != nil {