Skip to content

Commit 8c35ca7

Browse files
committed
feat: logout sync for embed
feat: logout for embed
1 parent 06eef30 commit 8c35ca7

3 files changed

Lines changed: 38 additions & 27 deletions

File tree

src/controllers/TorusController.ts

Lines changed: 30 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,8 @@ export default class TorusController extends BaseController<TorusControllerConfi
218218

219219
private instanceId = "";
220220

221+
private logoutBcAttached!: boolean;
222+
221223
constructor({ _config, _state }: { _config: Partial<TorusControllerConfig>; _state: Partial<TorusControllerState> }) {
222224
super({ config: _config, state: _state });
223225
}
@@ -776,7 +778,7 @@ export default class TorusController extends BaseController<TorusControllerConfi
776778
logout(req: JRPCRequest<[]>, res: JRPCResponse<boolean>, _: JRPCEngineNextCallback, end: JRPCEngineEndCallback): void {
777779
this.handleLogout();
778780
res.result = true;
779-
end();
781+
setTimeout(() => end(), 100); // Make sure all async ops are executed.
780782
}
781783

782784
public handleLogout(): void {
@@ -1240,9 +1242,6 @@ export default class TorusController extends BaseController<TorusControllerConfi
12401242
});
12411243
if (waitSaving) await saveToOpenLogin;
12421244

1243-
if (isMain) {
1244-
this.attachLogoutBC();
1245-
}
12461245
this.emit("LOGIN_RESPONSE", null, address);
12471246
return result;
12481247
} 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
}

src/modules/controllers.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,11 @@ class ControllerModule extends VuexModule {
416416
this.torus.on("logout", (fromBC?: boolean) => {
417417
this.logout(fromBC);
418418
});
419+
this.torus.on("LOGIN_RESPONSE", (message?: string, address?: string) => {
420+
if (message === null && address) {
421+
this.torus.attachLogoutBC();
422+
}
423+
});
419424
this.setInstanceId(instanceId);
420425

421426
if (!isMain) {
@@ -488,8 +493,8 @@ class ControllerModule extends VuexModule {
488493
async logout(fromBC?: boolean): Promise<void> {
489494
if (isMain && this.selectedAddress) {
490495
this.openloginLogout();
491-
if (!fromBC) logoutWithBC(this.torus.origin, this.instanceId, this.torus.userInfo);
492496
}
497+
if (!fromBC) await logoutWithBC(this.torus.origin, this.instanceId, this.torus.userInfo);
493498
const initialState = { ...cloneDeep(DEFAULT_STATE) };
494499
// this.updateTorusState(initialState);
495500

src/utils/helpers.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -210,9 +210,8 @@ export const logoutWithBC = async (origin: string, _instanceId: string, userInfo
210210
const bc = new BroadcastChannel<LogoutMessage>(`${channelName}`, { server: { timeout: 5 } });
211211
const timestamp = new Date().getTime();
212212
const instanceId = _instanceId.slice(0, 8);
213-
bc.postMessage({ instanceId, timestamp })
214-
.then(() => bc.close())
215-
.catch((err) => log.error(err));
213+
await bc.postMessage({ instanceId, timestamp });
214+
await bc.close();
216215
};
217216

218217
export function getBrowserKey() {

0 commit comments

Comments
 (0)