94
94
new FirestoreClient (database_info, std::move (credentials_provider),
95
95
std::move (user_executor), std::move (worker_queue)));
96
96
97
- auto user_promise = std::make_shared<std::promise<User>>();
98
- bool credentials_initialized = false ;
99
-
100
97
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 {
103
99
auto shared_client = weak_client.lock ();
104
100
if (!shared_client) return ;
105
101
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
+ });
109
112
} else {
110
113
shared_client->worker_queue ()->Enqueue ([shared_client, user] {
111
114
shared_client->worker_queue ()->VerifyIsCurrentQueue ();
@@ -119,15 +122,9 @@ new FirestoreClient(database_info, std::move(credentials_provider),
119
122
shared_client->credentials_provider_ ->SetCredentialChangeListener (
120
123
credential_change_listener);
121
124
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" );
131
128
132
129
return shared_client;
133
130
}
0 commit comments