@@ -745,6 +745,66 @@ const defaultGatewayPostAttachRuntimeDeps: GatewayPostAttachRuntimeDeps = {
745745 ( await import ( "./server-tailscale.js" ) ) . startGatewayTailscaleExposure ( ...args ) ,
746746} ;
747747
748+ function createDeferredGatewayUpdateCheck ( params : {
749+ startupTrace ?: GatewayStartupTrace ;
750+ runtimeDeps : GatewayPostAttachRuntimeDeps ;
751+ cfg : OpenClawConfig ;
752+ log : {
753+ info : ( msg : string ) => void ;
754+ warn : ( msg : string ) => void ;
755+ } ;
756+ isNixMode : boolean ;
757+ broadcast : ( event : string , payload : unknown , opts ?: { dropIfSlow ?: boolean } ) => void ;
758+ } ) : { start : ( ) => void ; stop : ( ) => void } {
759+ let started = false ;
760+ let stopped = false ;
761+ let stopUpdateCheck : ( ( ) => void ) | null = null ;
762+
763+ const stop = ( ) => {
764+ stopped = true ;
765+ stopUpdateCheck ?.( ) ;
766+ stopUpdateCheck = null ;
767+ } ;
768+
769+ const start = ( ) => {
770+ if ( started || stopped ) {
771+ return ;
772+ }
773+ started = true ;
774+ setImmediate ( ( ) => {
775+ if ( stopped ) {
776+ return ;
777+ }
778+ void measureStartup ( params . startupTrace , "post-attach.update-check" , ( ) =>
779+ params . runtimeDeps . scheduleGatewayUpdateCheck ( {
780+ cfg : params . cfg ,
781+ log : params . log ,
782+ isNixMode : params . isNixMode ,
783+ onUpdateAvailableChange : ( updateAvailable ) => {
784+ const payload : GatewayUpdateAvailableEventPayload = { updateAvailable } ;
785+ params . broadcast ( GATEWAY_EVENT_UPDATE_AVAILABLE , payload , { dropIfSlow : true } ) ;
786+ } ,
787+ } ) ,
788+ )
789+ . then ( ( nextStop ) => {
790+ if ( stopped ) {
791+ nextStop ( ) ;
792+ return ;
793+ }
794+ stopUpdateCheck = nextStop ;
795+ } )
796+ . catch ( ( err ) => {
797+ if ( stopped ) {
798+ return ;
799+ }
800+ params . log . warn ( `gateway update check failed to start: ${ String ( err ) } ` ) ;
801+ } ) ;
802+ } ) ;
803+ } ;
804+
805+ return { start, stop } ;
806+ }
807+
748808export async function startGatewayPostAttachRuntime (
749809 params : {
750810 minimalTestGateway : boolean ;
@@ -833,19 +893,16 @@ export async function startGatewayPostAttachRuntime(
833893 } ) ,
834894 ) ;
835895
836- const stopGatewayUpdateCheckPromise = params . minimalTestGateway
837- ? Promise . resolve ( ( ) => { } )
838- : measureStartup ( params . startupTrace , "post-attach.update-check" , ( ) =>
839- runtimeDeps . scheduleGatewayUpdateCheck ( {
840- cfg : params . cfgAtStart ,
841- log : params . log ,
842- isNixMode : params . isNixMode ,
843- onUpdateAvailableChange : ( updateAvailable ) => {
844- const payload : GatewayUpdateAvailableEventPayload = { updateAvailable } ;
845- params . broadcast ( GATEWAY_EVENT_UPDATE_AVAILABLE , payload , { dropIfSlow : true } ) ;
846- } ,
847- } ) ,
848- ) ;
896+ const updateCheck = params . minimalTestGateway
897+ ? { start : ( ) => { } , stop : ( ) => { } }
898+ : createDeferredGatewayUpdateCheck ( {
899+ startupTrace : params . startupTrace ,
900+ runtimeDeps,
901+ cfg : params . cfgAtStart ,
902+ log : params . log ,
903+ isNixMode : params . isNixMode ,
904+ broadcast : params . broadcast ,
905+ } ) ;
849906
850907 const tailscaleCleanupPromise = params . minimalTestGateway
851908 ? Promise . resolve ( null )
@@ -961,26 +1018,27 @@ export async function startGatewayPostAttachRuntime(
9611018 } ) ;
9621019
9631020 if ( params . deferSidecars !== true ) {
964- const [ , stopGatewayUpdateCheck , tailscaleCleanup , sidecarsResult ] = await Promise . all ( [
1021+ const [ , tailscaleCleanup , sidecarsResult ] = await Promise . all ( [
9651022 startupLogPromise ,
966- stopGatewayUpdateCheckPromise ,
9671023 tailscaleCleanupPromise ,
9681024 sidecarsPromise ,
9691025 ] ) ;
1026+ updateCheck . start ( ) ;
9701027 return {
971- stopGatewayUpdateCheck,
1028+ stopGatewayUpdateCheck : updateCheck . stop ,
9721029 tailscaleCleanup,
9731030 pluginServices : sidecarsResult . pluginServices ,
9741031 } ;
9751032 }
9761033
977- const [ , stopGatewayUpdateCheck , tailscaleCleanup ] = await Promise . all ( [
978- startupLogPromise ,
979- stopGatewayUpdateCheckPromise ,
980- tailscaleCleanupPromise ,
981- ] ) ;
1034+ const [ , tailscaleCleanup ] = await Promise . all ( [ startupLogPromise , tailscaleCleanupPromise ] ) ;
1035+ updateCheck . start ( ) ;
9821036
983- return { stopGatewayUpdateCheck, tailscaleCleanup, pluginServices : reportedPluginServices } ;
1037+ return {
1038+ stopGatewayUpdateCheck : updateCheck . stop ,
1039+ tailscaleCleanup,
1040+ pluginServices : reportedPluginServices ,
1041+ } ;
9841042}
9851043
9861044export const __testing = {
0 commit comments