15#ifndef ACTIONENGINE_NET_WEBSOCKETS_SERVER_H_ 
   16#define ACTIONENGINE_NET_WEBSOCKETS_SERVER_H_ 
   24#define BOOST_ASIO_NO_DEPRECATED 
   26#include <absl/base/nullability.h> 
   27#include <absl/base/thread_annotations.h> 
   28#include <absl/log/check.h> 
   29#include <absl/status/status.h> 
   30#include <absl/status/statusor.h> 
   31#include <absl/strings/str_format.h> 
   32#include <boost/asio/ip/tcp.hpp> 
   36#include "actionengine/net/stream.h" 
   37#include "actionengine/net/websockets/fiber_aware_websocket_stream.h" 
   38#include "actionengine/service/service.h" 
   42class WebsocketServer {
 
   44  explicit WebsocketServer(act::Service* absl_nonnull service,
 
   45                           std::string_view address = 
"0.0.0.0",
 
   46                           uint16_t port = 20000);
 
   52  absl::Status Cancel();
 
   57  absl::Status CancelInternal() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
 
   59  absl::Status JoinInternal() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
 
   61  act::Service* absl_nonnull const service_;
 
   62  std::unique_ptr<boost::asio::ip::tcp::acceptor> acceptor_;
 
   64  mutable act::Mutex mu_;
 
   65  std::unique_ptr<thread::Fiber> main_loop_;
 
   66  bool cancelled_ ABSL_GUARDED_BY(mu_) = false;
 
   67  act::CondVar join_cv_ ABSL_GUARDED_BY(mu_);
 
   68  bool joining_ ABSL_GUARDED_BY(mu_) = false;
 
Concurrency utilities for ActionEngine.
ActionEngine data structures used to implement actions and nodes (data streams).