53class SignallingClient {
 
   55  explicit SignallingClient(std::string_view address = 
"localhost",
 
   59  SignallingClient(
const SignallingClient&) = 
delete;
 
   60  SignallingClient& operator=(
const SignallingClient&) = 
delete;
 
   64  void ResetCallbacks();
 
   66  void OnOffer(PeerJsonHandler on_offer) { on_offer_ = std::move(on_offer); }
 
   68  void OnCandidate(PeerJsonHandler on_candidate) {
 
   69    on_candidate_ = std::move(on_candidate);
 
   72  void OnAnswer(PeerJsonHandler on_answer) {
 
   73    on_answer_ = std::move(on_answer);
 
   76  thread::Case OnError()
 const { 
return error_event_.OnEvent(); }
 
   78  absl::Status GetStatus()
 const {
 
   79    act::MutexLock lock(&mu_);
 
   83  absl::Status ConnectWithIdentity(std::string_view identity);
 
   85  absl::Status Send(
const std::string& message) {
 
   86    return stream_.WriteText(message);
 
   90    act::MutexLock lock(&mu_);
 
   95    act::MutexLock lock(&mu_);
 
  100  void CancelInternal() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
 
  101    if (
const absl::Status status = stream_.Close(); !status.ok()) {
 
  102      LOG(ERROR) << 
"SignallingClient::Cancel failed: " << status;
 
  104    if (loop_ != 
nullptr) {
 
  107          absl::CancelledError(
"WebsocketActionEngineServer cancelled");
 
  111  void JoinInternal() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
 
  112    if (loop_ != 
nullptr) {
 
  119      thread_pool_->stop();
 
  120      thread_pool_->join();
 
  124  void RunLoop() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
 
  126  void CloseStreamAndJoinLoop() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
 
  128  std::string identity_;
 
  129  const std::string address_;
 
  130  const uint16_t port_;
 
  132  PeerJsonHandler on_offer_;
 
  133  PeerJsonHandler on_candidate_;
 
  134  PeerJsonHandler on_answer_;
 
  136  std::unique_ptr<boost::asio::thread_pool> thread_pool_;
 
  137  FiberAwareWebsocketStream stream_;
 
  138  std::unique_ptr<thread::Fiber> loop_;
 
  139  absl::Status loop_status_ ABSL_GUARDED_BY(mu_);
 
  140  mutable act::Mutex mu_;
 
  141  thread::PermanentEvent error_event_;