Sort out what we wait for after login

We were waiting only for the client to become logged in rather than
for setLoggedIn() to finish but then we were waiting for the first
sync to complete which is far longer. We need setLoggedIn to have
finished for crypto to be set up so we can query cross-signing keys,
so just wait for that anyway, the logic becomes a lot simpler and
we're waiting the same amount of time because we have to wait for
the first sync to finish. We can also download keys in parallel.
pull/21833/head
David Baker 2020-06-05 17:52:09 +01:00
parent 68e555a0c6
commit 7c59e39710
1 changed files with 15 additions and 28 deletions

View File

@ -1868,42 +1868,31 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> {
this.accountPasswordTimer = null;
}, 60 * 5 * 1000);
// Wait for the client to be logged in (but not started)
// which is enough to ask the server about account data.
const loggedIn = new Promise(resolve => {
const actionHandlerRef = dis.register(payload => {
if (payload.action !== "on_logged_in") {
return;
}
dis.unregister(actionHandlerRef);
resolve();
});
});
// Create and start the client in the background
const setLoggedInPromise = Lifecycle.setLoggedIn(credentials);
await loggedIn;
// Create and start the client
await Lifecycle.setLoggedIn(credentials);
const cli = MatrixClientPeg.get();
// We're checking `isCryptoAvailable` here instead of `isCryptoEnabled`
// because the client hasn't been started yet.
const cryptoAvailable = isCryptoAvailable();
if (!cryptoAvailable) {
const cryptoEnabled = cli.isCryptoEnabled();
if (!cryptoEnabled) {
this.onLoggedIn();
}
this.setState({ pendingInitialSync: true });
await this.firstSyncPromise.promise;
const promisesList = [this.firstSyncPromise.promise];
if (cryptoEnabled) {
// wait for the client to finish downloading cross-signing keys for us so we
// know whether or not we have keys set up on this account
promisesList.push(cli.downloadKeys([cli.getUserId()]));
}
if (!cryptoAvailable) {
this.setState({ pendingInitialSync: true });
await Promise.all(promisesList);
if (!cryptoEnabled) {
this.setState({ pendingInitialSync: false });
return setLoggedInPromise;
}
// wait for the client to finish downloading cross-signing keys for us so we
// know whether or not we have keys set up on this account
await cli.downloadKeys([cli.getUserId()]);
const crossSigningIsSetUp = cli.getStoredCrossSigningForUser(cli.getUserId());
if (crossSigningIsSetUp) {
this.setStateForNewView({ view: Views.COMPLETE_SECURITY });
@ -1913,8 +1902,6 @@ export default class MatrixChat extends React.PureComponent<IProps, IState> {
this.onLoggedIn();
}
this.setState({ pendingInitialSync: false });
return setLoggedInPromise;
};
// complete security / e2e setup has finished