ndmspc v1.2.0-0.1.rc7
Loading...
Searching...
No Matches
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
31namespace Ndmspc {
32
36struct WS_URI {
37 std::string fScheme;
38 std::string fHost;
39 int fPort;
40 std::string fPath;
41};
42
49class 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[];
130 std::mutex fConnectMutex;
131 std::condition_variable fConnectCv;
132
133
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
void LwsServiceLoop()
Service loop for libwebsockets running in a separate thread.
NWsClient(int maxRetries=5, int retryDelayMs=1000)
Constructor.
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.
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.
static WS_URI ParseUri(const std::string &uriString)
Parse a WebSocket URI string into its components.
std::atomic< bool > fShutdownRequested
Shutdown flag.
Definition NWsClient.h:118
static lws_protocols fProtocols[]
Protocols supported by libwebsockets.
Definition NWsClient.h:129
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.
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.
void SetOnMessageCallback(OnMessageCallback callback)
Set the callback to be invoked when a message is received.
Definition NWsClient.h:97
Global callback function for libwebsockets client events.
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