9494 new FirestoreClient (database_info, std::move (credentials_provider),
9595 std::move (user_executor), std::move (worker_queue)));
9696
97- auto user_promise = std::make_shared<std::promise<User>>();
98- bool credentials_initialized = false ;
99-
10097 std::weak_ptr<FirestoreClient> weak_client (shared_client);
101- auto credential_change_listener = [credentials_initialized, user_promise,
102- weak_client ](User user) mutable {
98+ auto credential_change_listener = [weak_client, settings](User user) mutable {
10399 auto shared_client = weak_client.lock ();
104100 if (!shared_client) return ;
105101
106- if (!credentials_initialized) {
107- credentials_initialized = true ;
108- user_promise->set_value (user);
102+ if (!shared_client->credentials_initialized_ ) {
103+ shared_client->credentials_initialized_ = true ;
104+
105+ // When we register the credentials listener for the first time,
106+ // it is invoked synchronously on the calling thread. This ensures that
107+ // the first item enqueued on the worker queue is
108+ // `FirestoreClient::Initialize()`.
109+ shared_client->worker_queue ()->Enqueue ([shared_client, user, settings] {
110+ shared_client->Initialize (user, settings);
111+ });
109112 } else {
110113 shared_client->worker_queue ()->Enqueue ([shared_client, user] {
111114 shared_client->worker_queue ()->VerifyIsCurrentQueue ();
@@ -119,15 +122,9 @@ new FirestoreClient(database_info, std::move(credentials_provider),
119122 shared_client->credentials_provider_ ->SetCredentialChangeListener (
120123 credential_change_listener);
121124
122- // Defer initialization until we get the current user from the
123- // credential_change_listener. This is guaranteed to be synchronously
124- // dispatched onto our worker queue, so we will be initialized before any
125- // subsequently queued work runs.
126- shared_client->worker_queue ()->Enqueue (
127- [shared_client, user_promise, settings] {
128- User user = user_promise->get_future ().get ();
129- shared_client->Initialize (user, settings);
130- });
125+ HARD_ASSERT (
126+ shared_client->credentials_initialized_ ,
127+ " CredentialChangeListener not invoked during client initialization" );
131128
132129 return shared_client;
133130}
0 commit comments