@@ -772,17 +772,51 @@ export class ScriptService {
772772 setTimeout ( resolve , Math . round ( MIN_DELAY + ( ( ++ i / n + Math . random ( ) ) / 2 ) * ( MAX_DELAY - MIN_DELAY ) ) )
773773 ) ;
774774
775- return Promise . all (
776- ( uuids as string [ ] ) . map ( async ( uuid , _idx ) => {
777- const script = scripts [ _idx ] ;
778- const res =
779- ! script || script . uuid !== uuid || ! checkScripts . includes ( script )
780- ? false
781- : await this . _checkUpdateAvailable ( script , delayFn ) ;
782- if ( ! res ) return false ;
783- return res ;
784- } )
785- ) ;
775+ const CHECK_UPDATE_TIMEOUT_MS = 300_000 ; // 5 分钟超时
776+
777+ const results = new Map <
778+ string ,
779+ | false
780+ | {
781+ updateAvailable : true ;
782+ code : string ;
783+ metadata : Partial < Record < string , string [ ] > > ;
784+ }
785+ > ( ) ;
786+
787+ // 预初始化 Map 确保顺序
788+ for ( const uuid of uuids as string [ ] ) {
789+ results . set ( uuid , false ) ;
790+ }
791+
792+ const abortController = new AbortController ( ) ;
793+ let timeoutId : ReturnType < typeof setTimeout > ;
794+
795+ const timeoutPromise = new Promise < void > ( ( resolve ) => {
796+ timeoutId = setTimeout ( ( ) => {
797+ abortController . abort ( ) ;
798+ resolve ( ) ;
799+ } , CHECK_UPDATE_TIMEOUT_MS ) ;
800+ } ) ;
801+
802+ await Promise . race ( [
803+ timeoutPromise ,
804+ Promise . allSettled (
805+ ( uuids as string [ ] ) . map ( async ( uuid , _idx ) => {
806+ const script = scripts [ _idx ] ;
807+ const res =
808+ ! script || script . uuid !== uuid || ! checkScripts . includes ( script )
809+ ? false
810+ : await this . _checkUpdateAvailable ( script , delayFn , abortController . signal ) ;
811+ if ( ! res ) return false ;
812+ results . set ( uuid , res ) ;
813+ return res ;
814+ } )
815+ ) . finally ( ( ) => {
816+ clearTimeout ( timeoutId ) ;
817+ } ) ,
818+ ] ) ;
819+ return [ ...results . values ( ) ] ;
786820 }
787821
788822 async _checkUpdateAvailable (
@@ -792,7 +826,8 @@ export class ScriptService {
792826 checkUpdateUrl ?: string ;
793827 metadata : Partial < Record < string , any > > ;
794828 } ,
795- delayFn ?: ( ) => Promise < any >
829+ delayFn ?: ( ) => Promise < any > ,
830+ signal ?: AbortSignal
796831 ) : Promise < false | { updateAvailable : true ; code : string ; metadata : SCMetadata } > {
797832 const { uuid, name, checkUpdateUrl } = script ;
798833
@@ -804,8 +839,12 @@ export class ScriptService {
804839 name,
805840 } ) ;
806841 try {
807- if ( delayFn ) await delayFn ( ) ;
808- const code = await fetchScriptBody ( checkUpdateUrl ) ;
842+ if ( delayFn ) {
843+ if ( signal ?. aborted ) return false ;
844+ await delayFn ( ) ;
845+ }
846+ if ( signal ?. aborted ) return false ;
847+ const code = await fetchScriptBody ( checkUpdateUrl , signal ) ;
809848 const metadata = parseMetadata ( code ) ;
810849 if ( ! metadata ) {
811850 logger . error ( "parse metadata failed" ) ;
0 commit comments