Skip to content

Commit 00cd5bf

Browse files
committed
feat: logout sync for embed
feat: logout for embed
1 parent edb5d33 commit 00cd5bf

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
@@ -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
}

src/modules/controllers.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,11 @@ class ControllerModule extends VuexModule {
418418
this.torus.on("logout", (fromBC?: boolean) => {
419419
this.logout(fromBC);
420420
});
421+
this.torus.on("LOGIN_RESPONSE", (message?: string, address?: string) => {
422+
if (message === null && address) {
423+
this.torus.attachLogoutBC();
424+
}
425+
});
421426
this.setInstanceId(instanceId);
422427

423428
if (!isMain) {
@@ -490,8 +495,8 @@ class ControllerModule extends VuexModule {
490495
async logout(fromBC?: boolean): Promise<void> {
491496
if (isMain && this.selectedAddress) {
492497
this.openloginLogout();
493-
if (!fromBC) logoutWithBC(this.torus.origin, this.instanceId, this.torus.userInfo);
494498
}
499+
if (!fromBC) await logoutWithBC(this.torus.origin, this.instanceId, this.torus.userInfo);
495500
const initialState = { ...cloneDeep(DEFAULT_STATE) };
496501
// this.updateTorusState(initialState);
497502

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)