@@ -219,6 +219,8 @@ export default class TorusController extends BaseController<TorusControllerConfi
219219
220220 private instanceId = "" ;
221221
222+ private logoutBcAttached ! : boolean ;
223+
222224 constructor ( { _config, _state } : { _config : Partial < TorusControllerConfig > ; _state : Partial < TorusControllerState > } ) {
223225 super ( { config : _config , state : _state } ) ;
224226 }
@@ -777,7 +779,7 @@ export default class TorusController extends BaseController<TorusControllerConfi
777779 logout ( req : JRPCRequest < [ ] > , res : JRPCResponse < boolean > , _ : JRPCEngineNextCallback , end : JRPCEngineEndCallback ) : void {
778780 this . handleLogout ( ) ;
779781 res . result = true ;
780- end ( ) ;
782+ setTimeout ( ( ) => end ( ) , 100 ) ; // Make sure all async ops are executed.
781783 }
782784
783785 public handleLogout ( ) : void {
@@ -1241,9 +1243,6 @@ export default class TorusController extends BaseController<TorusControllerConfi
12411243 } ) ;
12421244 if ( waitSaving ) await saveToOpenLogin ;
12431245
1244- if ( isMain ) {
1245- this . attachLogoutBC ( ) ;
1246- }
12471246 this . emit ( "LOGIN_RESPONSE" , null , address ) ;
12481247 return result ;
12491248 } catch ( error ) {
@@ -1389,11 +1388,7 @@ export default class TorusController extends BaseController<TorusControllerConfi
13891388 // This call sync and refresh blockchain state
13901389 this . setSelectedAccount ( selectedAddress , true ) ;
13911390
1392- // Listen to logout events across tabs
1393- if ( isMain ) {
1394- this . attachLogoutBC ( ) ;
1395- }
1396-
1391+ this . attachLogoutBC ( ) ;
13971392 return true ;
13981393 } catch ( e ) {
13991394 log . error ( e , "Error restoring state after successful decrypt!" ) ;
@@ -1411,6 +1406,32 @@ export default class TorusController extends BaseController<TorusControllerConfi
14111406 return this . preferencesController . getDappList ( ) ;
14121407 }
14131408
1409+ attachLogoutBC ( ) {
1410+ if ( this . logoutBcAttached ) {
1411+ log . warn ( "Logout BC already attached" ) ;
1412+ return ;
1413+ }
1414+
1415+ const channelName = getLogoutBcChannelName ( this . origin , this . userInfo ) ;
1416+ const bc = new BroadcastChannel < LogoutMessage > ( channelName ) ;
1417+ this . logoutBcAttached = true ;
1418+
1419+ const thisInstance = this . instanceId . slice ( 0 , 8 ) ;
1420+ const eventListener = ( msg : LogoutMessage ) => {
1421+ if ( thisInstance === msg . instanceId ) return ;
1422+ bc . removeEventListener ( "message" , eventListener ) ;
1423+ bc . close ( )
1424+ . then ( ( ) => {
1425+ this . logoutBcAttached = false ;
1426+ this . emit ( "logout" , true ) ;
1427+ if ( ! isMain ) this . notifyEmbedLogout ( ) ;
1428+ return null ;
1429+ } )
1430+ . catch ( ( err ) => log . error ( "broadcastchannel close error" , err ) ) ;
1431+ } ;
1432+ bc . addEventListener ( "message" , eventListener ) ;
1433+ }
1434+
14141435 private async providerRequestAccounts ( req : JRPCRequest < unknown > ) {
14151436 const accounts = await this . requestAccounts ( req ) ;
14161437
@@ -1700,18 +1721,4 @@ export default class TorusController extends BaseController<TorusControllerConfi
17001721 } ;
17011722 this . embedController . initializeProvider ( commProviderHandlers ) ;
17021723 }
1703-
1704- private attachLogoutBC ( ) {
1705- const channelName = getLogoutBcChannelName ( this . origin , this . userInfo ) ;
1706- const bc = new BroadcastChannel < LogoutMessage > ( channelName ) ;
1707- const thisInstance = this . instanceId . slice ( 0 , 8 ) ;
1708- const eventListener = ( msg : LogoutMessage ) => {
1709- if ( thisInstance === msg . instanceId ) return ;
1710- bc . removeEventListener ( "message" , eventListener ) ;
1711- bc . close ( )
1712- . then ( ( ) => this . emit ( "logout" , true ) )
1713- . catch ( ( err ) => log . error ( "broadcastchannel close error" , err ) ) ;
1714- } ;
1715- bc . addEventListener ( "message" , eventListener ) ;
1716- }
17171724}
0 commit comments