@@ -2,15 +2,15 @@ import LoggerCore from "@App/app/logger/core";
22import Logger from "@App/app/logger/logger" ;
33import { ScriptDAO } from "@App/app/repo/scripts" ;
44import { type IGetSender , type Group , GetSenderType } from "@Packages/message/server" ;
5- import type { ExtMessageSender , MessageSend , TMessageCommAction } from "@Packages/message/types" ;
5+ import type { ExtMessageSender , MessageConnect , MessageSend , TMessageCommAction } from "@Packages/message/types" ;
66import { connect , sendMessage } from "@Packages/message/client" ;
77import type { IMessageQueue } from "@Packages/message/message_queue" ;
88import { type ValueService } from "@App/app/service/service_worker/value" ;
99import type { ConfirmParam } from "../permission_verify" ;
1010import PermissionVerify , { PermissionVerifyApiGet } from "../permission_verify" ;
1111import { cacheInstance } from "@App/app/cache" ;
1212import { type RuntimeService } from "../runtime" ;
13- import { getIcon , isFirefox , getCurrentTab , openInCurrentTab , cleanFileName , makeBlobURL } from "@App/pkg/utils/utils" ;
13+ import { getIcon , isFirefox , getCurrentTab , openInCurrentTab , cleanFileName , makeBlobURL , Deferred } from "@App/pkg/utils/utils" ;
1414import { deferred } from "@App/pkg/utils/utils" ;
1515import { type SystemConfig } from "@App/pkg/config/config" ;
1616import i18next , { i18nName } from "@App/locales/locales" ;
@@ -1316,31 +1316,34 @@ export default class GMApi {
13161316 if ( ! sender . isType ( GetSenderType . CONNECT ) ) {
13171317 throw new Error ( "GM_download ERROR: sender is not MessageConnect" ) ;
13181318 }
1319- const msgConn = sender . getConnect ( ) ;
1319+ let msgConn : MessageConnect | undefined | null = sender . getConnect ( ) ;
13201320 if ( ! msgConn ) {
13211321 throw new Error ( "GM_download ERROR: msgConn is undefined" ) ;
13221322 }
13231323 let isConnDisconnected = false ;
1324- const d = deferred < boolean > ( ) ;
1324+ let d : Deferred < boolean > | null = deferred < boolean > ( ) ;
13251325 let done : boolean = false ;
13261326 const onDisconnected = ( ) => {
13271327 if ( isConnDisconnected ) return ;
13281328 isConnDisconnected = true ;
1329- d . resolve ( done ) ;
1329+ d ! . resolve ( done ) ;
1330+ msgConn = null ; // release for GC
1331+ d = null ; // release for GC
13301332 } ;
13311333 msgConn . onDisconnect ( onDisconnected ) ;
1332- msgConn . onMessage ( ( data ) => {
1333- if ( data . action === "done" ) {
1334+ msgConn . onMessage ( ( msg ) => {
1335+ if ( msg . action === "done" ) {
13341336 done = true ;
1335- msgConn . disconnect ( ) ;
1337+ msgConn ? .disconnect ( ) ;
13361338 onDisconnected ( ) ; // in case .disconnect() not working
13371339 }
13381340 } ) ;
13391341 stackAsyncTask ( `${ lockKey } ` , async ( ) => {
1340- msgConn . sendMessage ( {
1342+ if ( isConnDisconnected ) return ;
1343+ msgConn ! . sendMessage ( {
13411344 action : "start" ,
13421345 } ) ;
1343- return d . promise ;
1346+ return d ! . promise ;
13441347 } ) ;
13451348 }
13461349
0 commit comments