Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 1 addition & 6 deletions src/ctl/users.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,8 @@
#include <spdlog/sinks/basic_file_sink.h>
#include <spdlog/spdlog.h>

#include <chrono>
#include <filesystem>
#include <iostream>
#include <thread>

namespace tgfuse::ctl {

Expand Down Expand Up @@ -63,10 +61,7 @@ int exec_users_list() {
try {
tg::TelegramClient client(client_config);

client.start().get_result();

// Wait for TDLib to initialise
std::this_thread::sleep_for(std::chrono::seconds(2));
client.start().get_result(); // Now waits for TDLib initialization

auto state = client.get_auth_state().get_result();

Expand Down
38 changes: 38 additions & 0 deletions src/tg/client.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -258,6 +258,11 @@ class TelegramClient::Impl {
return;
}

// Prepare the initialization promise/future pair
init_promise_ = std::promise<void>();
init_future_ = init_promise_.get_future();
init_completed_ = false;

// Configure TDLib logging before creating the client
configure_tdlib_logging();

Expand Down Expand Up @@ -591,24 +596,28 @@ class TelegramClient::Impl {
case td_api::authorizationStateWaitPhoneNumber::ID:
spdlog::info("Authorization: waiting for phone number");
auth_state_ = AuthState::WAIT_PHONE;
complete_initialization(); // TDLib is now ready to accept queries
auth_cv_.notify_all();
break;

case td_api::authorizationStateWaitCode::ID:
spdlog::info("Authorization: waiting for code");
auth_state_ = AuthState::WAIT_CODE;
complete_initialization(); // TDLib is now ready to accept queries
auth_cv_.notify_all();
break;

case td_api::authorizationStateWaitPassword::ID:
spdlog::info("Authorization: waiting for password");
auth_state_ = AuthState::WAIT_PASSWORD;
complete_initialization(); // TDLib is now ready to accept queries
auth_cv_.notify_all();
break;

case td_api::authorizationStateReady::ID:
spdlog::info("Authorization: ready");
auth_state_ = AuthState::READY;
complete_initialization(); // TDLib is now ready to accept queries
auth_cv_.notify_all();
break;

Expand Down Expand Up @@ -642,6 +651,18 @@ class TelegramClient::Impl {
}
}

// Wait for TDLib initialization to complete
void wait_initialized(int timeout_ms = 30000) {
if (init_completed_) {
return;
}

if (init_future_.wait_for(std::chrono::milliseconds(timeout_ms)) == std::future_status::timeout) {
throw TimeoutException("TDLib initialization timeout");
}
init_future_.get(); // Propagate any exception
}

void send_phone_number(const std::string& phone) {
send_query(td_api::make_object<td_api::setAuthenticationPhoneNumber>(phone, nullptr), [](auto response) {
spdlog::debug("Phone number sent");
Expand Down Expand Up @@ -1228,6 +1249,17 @@ class TelegramClient::Impl {
}

private:
// Signal that TDLib initialization is complete
void complete_initialization() {
if (!init_completed_.exchange(true)) {
try {
init_promise_.set_value();
} catch (const std::future_error&) {
// Promise already satisfied - ignore
}
}
}

void configure_tdlib_logging() {
// Set log verbosity level
td::ClientManager::execute(td_api::make_object<td_api::setLogVerbosityLevel>(config_.log_verbosity));
Expand Down Expand Up @@ -1286,6 +1318,11 @@ class TelegramClient::Impl {
mutable std::mutex auth_mutex_;
std::condition_variable auth_cv_;

// Initialization synchronisation (for start() to wait until TDLib is ready)
std::promise<void> init_promise_;
std::future<void> init_future_;
std::atomic<bool> init_completed_{false};

// Message callback
std::function<void(const Message&)> message_callback_;
std::mutex message_callback_mutex_;
Expand Down Expand Up @@ -1334,6 +1371,7 @@ TelegramClient::~TelegramClient() = default;

Task<void> TelegramClient::start() {
impl_->start();
impl_->wait_initialized(); // Block until TDLib is ready
co_return;
}

Expand Down
1 change: 1 addition & 0 deletions tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ add_executable(tg-fuse-tests
tg/types_test.cpp
tg/cache_test.cpp
tg/async_test.cpp
tg/client_init_test.cpp
tg/formatters_test.cpp
tg/bustache_format_test.cpp
)
Expand Down
Loading