8 #ifndef WPIUTIL_WPI_WEBSOCKET_H_
9 #define WPIUTIL_WPI_WEBSOCKET_H_
14 #include <initializer_list>
19 #include "wpi/ArrayRef.h"
20 #include "wpi/Signal.h"
21 #include "wpi/SmallVector.h"
22 #include "wpi/StringRef.h"
23 #include "wpi/Twine.h"
24 #include "wpi/uv/Buffer.h"
25 #include "wpi/uv/Error.h"
26 #include "wpi/uv/Timer.h"
37 class WebSocket :
public std::enable_shared_from_this<WebSocket> {
38 struct private_init {};
40 static constexpr uint8_t kOpCont = 0x00;
41 static constexpr uint8_t kOpText = 0x01;
42 static constexpr uint8_t kOpBinary = 0x02;
43 static constexpr uint8_t kOpClose = 0x08;
44 static constexpr uint8_t kOpPing = 0x09;
45 static constexpr uint8_t kOpPong = 0x0A;
46 static constexpr uint8_t kOpMask = 0x0F;
47 static constexpr uint8_t kFlagFin = 0x80;
48 static constexpr uint8_t kFlagMasking = 0x80;
49 static constexpr uint8_t kLenMask = 0x7f;
101 const ClientOptions& options = ClientOptions{});
115 std::initializer_list<StringRef> protocols,
136 uv::Stream& stream, StringRef key, StringRef version,
137 StringRef protocol = StringRef{});
192 Send(kFlagFin | kOpText, data, callback);
203 Send(kFlagFin | kOpBinary, data, callback);
216 Send(kOpText, data, callback);
229 Send(kOpBinary, data, callback);
242 Send(kOpCont | (fin ? kFlagFin : 0), data, callback);
252 if (callback) callback(err);
265 Send(kFlagFin | kOpPing, data, callback);
275 if (callback) callback(err);
288 Send(kFlagFin | kOpPong, data, callback);
294 void Fail(uint16_t code = 1002,
const Twine& reason =
"protocol error");
299 void Terminate(uint16_t code = 1006,
const Twine& reason =
"terminated");
305 template <
typename T =
void>
307 return std::static_pointer_cast<T>(m_data);
314 void SetData(std::shared_ptr<void> data) { m_data = std::move(data); }
356 std::shared_ptr<void> m_data;
363 std::string m_protocol;
366 size_t m_maxMessageSize = 128 * 1024;
367 bool m_combineFragments =
true;
374 size_t m_headerSize = 0;
376 size_t m_frameStart = 0;
377 uint64_t m_frameSize = UINT64_MAX;
378 uint8_t m_fragmentOpcode = 0;
381 class ClientHandshakeData;
382 std::unique_ptr<ClientHandshakeData> m_clientHandshake;
387 void SendClose(uint16_t code,
const Twine& reason);
388 void SetClosed(uint16_t code,
const Twine& reason,
bool failed =
false);
398 #endif // WPIUTIL_WPI_WEBSOCKET_H_
void SendPing(ArrayRef< uv::Buffer > data, std::function< void(MutableArrayRef< uv::Buffer >, uv::Error)> callback)
Send a ping frame.
Definition: WebSocket.h:262
Stream handle.
Definition: Stream.h:69
The connection is open and ready to communicate.
Definition: WebSocket.h:66
void SendBinaryFragment(ArrayRef< uv::Buffer > data, std::function< void(MutableArrayRef< uv::Buffer >, uv::Error)> callback)
Send a text message fragment.
Definition: WebSocket.h:226
The connection is closed.
Definition: WebSocket.h:72
The connection is not yet open.
Definition: WebSocket.h:64
void SetData(std::shared_ptr< void > data)
Sets user-defined data.
Definition: WebSocket.h:314
static std::shared_ptr< WebSocket > CreateServer(uv::Stream &stream, StringRef key, StringRef version, StringRef protocol=StringRef{})
Starts a server connection by performing the initial server side handshake.
std::shared_ptr< T > GetData() const
Gets user-defined data.
Definition: WebSocket.h:306
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:42
void SendBinary(ArrayRef< uv::Buffer > data, std::function< void(MutableArrayRef< uv::Buffer >, uv::Error)> callback)
Send a binary message.
Definition: WebSocket.h:200
void SendPong(ArrayRef< uv::Buffer > data, std::function< void(MutableArrayRef< uv::Buffer >, uv::Error)> callback)
Send a pong frame.
Definition: WebSocket.h:285
State GetState() const
Get connection state.
Definition: WebSocket.h:142
sig::Signal< ArrayRef< uint8_t > > pong
Pong event.
Definition: WebSocket.h:352
StringRef GetProtocol() const
Get the selected sub-protocol.
Definition: WebSocket.h:158
Data buffer.
Definition: Buffer.h:27
ArrayRef< T > makeArrayRef(const T &OneElt)
Construct an ArrayRef from a single element.
Definition: ArrayRef.h:447
void StartServer(StringRef persist_filename, const char *listen_address, unsigned int port)
Starts a server using the specified filename, listening address, and port.
RFC 6455 compliant WebSocket client and server implementation.
Definition: WebSocket.h:37
The connection failed.
Definition: WebSocket.h:70
void SendPing(std::function< void(uv::Error)> callback=nullptr)
Send a ping frame with no data.
Definition: WebSocket.h:250
WPILib C++ utilities (wpiutil) namespace.
Definition: EventLoopRunner.h:17
sig::Signal< StringRef > open
Open event.
Definition: WebSocket.h:320
static std::shared_ptr< WebSocket > CreateClient(uv::Stream &stream, const Twine &uri, const Twine &host, std::initializer_list< StringRef > protocols, const ClientOptions &options=ClientOptions{})
Starts a client connection by performing the initial client handshake.
Definition: WebSocket.h:113
Client connection options.
Definition: WebSocket.h:78
uv::Timer::Time handshakeTimeout
Timeout for the handshake request.
Definition: WebSocket.h:82
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:49
void SendTextFragment(ArrayRef< uv::Buffer > data, std::function< void(MutableArrayRef< uv::Buffer >, uv::Error)> callback)
Send a text message fragment.
Definition: WebSocket.h:213
static std::shared_ptr< WebSocket > CreateClient(uv::Stream &stream, const Twine &uri, const Twine &host, ArrayRef< StringRef > protocols=ArrayRef< StringRef >{}, const ClientOptions &options=ClientOptions{})
Starts a client connection by performing the initial client handshake.
void StartClient()
Starts a client.
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
Definition: ArrayRef.h:287
void SetMaxMessageSize(size_t size)
Set the maximum message size.
Definition: WebSocket.h:166
The connection is in the process of closing.
Definition: WebSocket.h:68
void Fail(uint16_t code=1002, const Twine &reason="protocol error")
Fail the connection.
void Close(uint16_t code=1005, const Twine &reason=Twine{})
Initiate a closing handshake.
State
Connection states.
Definition: WebSocket.h:62
auto size(R &&Range, typename std::enable_if< std::is_same< typename std::iterator_traits< decltype(Range.begin())>::iterator_category, std::random_access_iterator_tag >::value, void >::type *=nullptr) -> decltype(std::distance(Range.begin(), Range.end()))
Get the size of a range.
Definition: STLExtras.h:1007
void SendText(ArrayRef< uv::Buffer > data, std::function< void(MutableArrayRef< uv::Buffer >, uv::Error)> callback)
Send a text message.
Definition: WebSocket.h:189
sig::Signal< ArrayRef< uint8_t >, bool > binary
Binary message event.
Definition: WebSocket.h:342
void Terminate(uint16_t code=1006, const Twine &reason="terminated")
Forcibly close the connection.
Error code.
Definition: Error.h:19
sig::Signal< StringRef, bool > text
Text message event.
Definition: WebSocket.h:335
void SetCombineFragments(bool combine)
Set whether or not fragmented frames should be combined.
Definition: WebSocket.h:174
sig::Signal< uint16_t, StringRef > closed
Close event.
Definition: WebSocket.h:328
void SendPong(std::function< void(uv::Error)> callback=nullptr)
Send a pong frame with no data.
Definition: WebSocket.h:273
bool IsOpen() const
Return if the connection is open.
Definition: WebSocket.h:148
sig::Signal< ArrayRef< uint8_t > > ping
Ping event.
Definition: WebSocket.h:347
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition: Twine.h:85
SignalBase is an implementation of the observer pattern, through the use of an emitting object and sl...
Definition: Signal.h:495
void SendFragment(ArrayRef< uv::Buffer > data, bool fin, std::function< void(MutableArrayRef< uv::Buffer >, uv::Error)> callback)
Send a continuation frame.
Definition: WebSocket.h:239
uv::Stream & GetStream() const
Get the underlying stream.
Definition: WebSocket.h:153
ArrayRef< std::pair< StringRef, StringRef > > extraHeaders
Additional headers to include in handshake.
Definition: WebSocket.h:85