@@ -12,6 +12,7 @@ const WEBSOCKET_INACTIVITY_CLOSE_CODE = 4000;
1212export function useSocketTimeout ( wf : Core , timeoutMin : number ) {
1313 const timeoutMs = timeoutMin * 60 * 1_000 ;
1414 const logger = useLogger ( ) ;
15+ const abort = useAbortController ( ) ;
1516
1617 let timer = undefined ;
1718
@@ -51,8 +52,6 @@ export function useSocketTimeout(wf: Core, timeoutMin: number) {
5152 ( ) => ! prevent . value && ! isMessagePending . value ,
5253 ) ;
5354
54- const abort = useAbortController ( ) ;
55-
5655 function schedule ( ) {
5756 if ( ! canCloseSocket . value || document . visibilityState !== "hidden" )
5857 return false ;
@@ -77,13 +76,16 @@ export function useSocketTimeout(wf: Core, timeoutMin: number) {
7776 timer = undefined ;
7877 }
7978
79+ // cancel closing socket timer
8080 watch ( canCloseSocket , ( ) => {
8181 if ( ! canCloseSocket . value ) {
8282 clearSchedule ( ) ;
8383 } else if ( document . visibilityState === "hidden" ) {
8484 schedule ( ) ; // Reschedule now that activity is complete
8585 }
8686 } ) ;
87+
88+ // reflect `preventTasks` changes in session storage
8789 watch (
8890 preventTasks ,
8991 ( ) => {
@@ -92,6 +94,17 @@ export function useSocketTimeout(wf: Core, timeoutMin: number) {
9294 { deep : true } ,
9395 ) ;
9496
97+ // prevent closing socket when blueprint finish in background
98+ watch ( isMessagePending , ( hasPending , hadPending ) => {
99+ const hadCompletedJob = hadPending && ! hasPending ;
100+ if ( hadCompletedJob && document . visibilityState === "hidden" ) {
101+ logger . log (
102+ `[SocketTimeout] Preventing socket to be closed due to finished task in background...` ,
103+ ) ;
104+ preventTasks . value . add ( "pendingMessageInBackground" ) ;
105+ }
106+ } ) ;
107+
95108 async function reconnect ( ) {
96109 logger . info ( `[SocketTimeout] Attempting to reconnect socket...` ) ;
97110 reconnecting . value = true ;
@@ -112,6 +125,7 @@ export function useSocketTimeout(wf: Core, timeoutMin: number) {
112125
113126 function onVisibilityChange ( ) {
114127 if ( document . visibilityState === "visible" ) {
128+ preventTasks . value . delete ( "pendingMessageInBackground" ) ;
115129 clearSchedule ( ) ;
116130 } else if ( canCloseSocket . value ) {
117131 schedule ( ) ;
0 commit comments