ndmspc  v1.2.0-0.1.rc3
NWsClient.h
1 #ifndef NDMSPC_WEBSOCKET_CLIENT_H
2 #define NDMSPC_WEBSOCKET_CLIENT_H
3 
4 #include <libwebsockets.h>
5 
6 #include <string>
7 #include <thread>
8 #include <mutex>
9 #include <condition_variable>
10 #include <atomic>
11 #include <queue>
12 #include <vector>
13 #include <functional>
14 
15 // // Forward declaration of the global LWS callback function.
16 // /**
17 // * @brief Global callback function for libwebsockets client events.
18 // *
19 // * Handles various websocket events such as connection, message receipt, errors, etc.
20 // *
21 // * @param wsi Pointer to the websocket instance.
22 // * @param reason Callback reason/event type.
23 // * @param user User data pointer.
24 // * @param in Input data pointer.
25 // * @param len Length of input data.
26 // * @return Status code for libwebsockets.
27 // */
28 // static int lws_callback_client_impl(struct lws * wsi, enum lws_callback_reasons reason, void * user, void * in,
29 // size_t len);
30 
31 namespace Ndmspc {
32 
36 struct WS_URI {
37  std::string fScheme;
38  std::string fHost;
39  int fPort;
40  std::string fPath;
41 };
42 
49 class NWsClient {
50  public:
51  static constexpr const char * fgProtocolName = "ndmspc-protocol";
52 
58  NWsClient(int maxRetries = 5, int retryDelayMs = 1000);
59 
63  ~NWsClient();
64 
70  bool Connect(const std::string & uriString);
71 
75  void Disconnect();
76 
82  bool Send(const std::string & message);
83 
88  bool IsConnected() const { return fConnected.load(); }
89 
91  using OnMessageCallback = std::function<void(const std::string &)>;
92 
98 
104  static WS_URI ParseUri(const std::string & uriString);
105 
106  // private:
107  struct lws_context * fLwsContext;
108  struct lws * fWsi;
109  std::thread fLwsServiceThread;
112 
113  std::string fHost;
114  int fPort;
115  std::string fPath;
116 
117  std::atomic<bool> fConnected;
118  std::atomic<bool> fShutdownRequested;
119  std::atomic<bool> fConnectionAttemptComplete;
120 
121  std::queue<std::string> fOutgoingMessageQueue;
122  std::mutex fOutgoingMutex;
123  std::vector<unsigned char> fSendBuffer;
124  std::condition_variable fSendCv;
125 
127 
128  static lws_protocols fProtocols[];
129 
130  std::mutex fConnectMutex;
131  std::condition_variable fConnectCv;
132 
136  void LwsServiceLoop();
137 
138  // /**
139  // * @brief Friend declaration for the global callback function.
140  // */
141  // friend int lws_callback_client_impl(struct lws * wsi, enum lws_callback_reasons reason, void * user, void * in,
142  // size_t len);
143 };
144 
145 } // namespace Ndmspc
146 
147 #endif // NDMSPC_WEBSOCKET_CLIENT_H
WebSocket client for asynchronous communication using libwebsockets.
Definition: NWsClient.h:49
void LwsServiceLoop()
Service loop for libwebsockets running in a separate thread.
Definition: NWsClient.cxx:330
NWsClient(int maxRetries=5, int retryDelayMs=1000)
Constructor.
Definition: NWsClient.cxx:133
struct lws * fWsi
WebSocket instance.
Definition: NWsClient.h:108
int fRetryDelayMs
Delay between retries (ms)
Definition: NWsClient.h:111
bool Connect(const std::string &uriString)
Connect to a WebSocket server.
Definition: NWsClient.cxx:148
static constexpr const char * fgProtocolName
Protocol name for websocket communication.
Definition: NWsClient.h:51
int fMaxRetries
Maximum connection retries.
Definition: NWsClient.h:110
int fPort
Port number.
Definition: NWsClient.h:114
void Disconnect()
Disconnect from the WebSocket server.
Definition: NWsClient.cxx:256
static WS_URI ParseUri(const std::string &uriString)
Parse a WebSocket URI string into its components.
Definition: NWsClient.cxx:351
std::atomic< bool > fShutdownRequested
Shutdown flag.
Definition: NWsClient.h:118
static lws_protocols fProtocols[]
Protocols supported by libwebsockets.
Definition: NWsClient.h:128
std::string fPath
Path.
Definition: NWsClient.h:115
std::atomic< bool > fConnectionAttemptComplete
Connection attempt completion flag.
Definition: NWsClient.h:119
std::condition_variable fSendCv
Condition variable for sending messages.
Definition: NWsClient.h:124
bool Send(const std::string &message)
Send a message to the server.
Definition: NWsClient.cxx:300
bool IsConnected() const
Check if the client is currently connected.
Definition: NWsClient.h:88
struct lws_context * fLwsContext
libwebsockets context
Definition: NWsClient.h:107
std::vector< unsigned char > fSendBuffer
Buffer for sending messages.
Definition: NWsClient.h:123
std::atomic< bool > fConnected
Connection status.
Definition: NWsClient.h:117
std::queue< std::string > fOutgoingMessageQueue
Queue of outgoing messages.
Definition: NWsClient.h:121
std::mutex fConnectMutex
Mutex for connection state.
Definition: NWsClient.h:130
std::function< void(const std::string &)> OnMessageCallback
Callback type for received messages.
Definition: NWsClient.h:91
std::string fHost
Hostname.
Definition: NWsClient.h:113
std::mutex fOutgoingMutex
Mutex for outgoing queue.
Definition: NWsClient.h:122
std::thread fLwsServiceThread
Thread running the service loop.
Definition: NWsClient.h:109
std::condition_variable fConnectCv
Condition variable for connection.
Definition: NWsClient.h:131
OnMessageCallback fOnMessageCallback
Callback for received messages.
Definition: NWsClient.h:126
~NWsClient()
Destructor. Cleans up resources and disconnects.
Definition: NWsClient.cxx:142
void SetOnMessageCallback(OnMessageCallback callback)
Set the callback to be invoked when a message is received.
Definition: NWsClient.h:97
Structure representing a parsed WebSocket URI.
Definition: NWsClient.h:36
std::string fScheme
URI scheme (e.g., "ws", "wss")
Definition: NWsClient.h:37
std::string fPath
Path component.
Definition: NWsClient.h:40
int fPort
Port number.
Definition: NWsClient.h:39
std::string fHost
Hostname or IP address.
Definition: NWsClient.h:38