diff options
Diffstat (limited to 'node_modules/uws/src/Hub.h')
-rw-r--r-- | node_modules/uws/src/Hub.h | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/node_modules/uws/src/Hub.h b/node_modules/uws/src/Hub.h new file mode 100644 index 0000000..f879579 --- /dev/null +++ b/node_modules/uws/src/Hub.h @@ -0,0 +1,97 @@ +#ifndef HUB_UWS_H +#define HUB_UWS_H + +#include "Group.h" +#include "Node.h" +#include <string> +#include <zlib.h> +#include <mutex> +#include <map> + +namespace uWS { + +struct WIN32_EXPORT Hub : private uS::Node, public Group<SERVER>, public Group<CLIENT> { +protected: + struct ConnectionData { + std::string path; + void *user; + Group<CLIENT> *group; + }; + + z_stream inflationStream = {}; + char *inflationBuffer; + char *inflate(char *data, size_t &length, size_t maxPayload); + std::string dynamicInflationBuffer; + static const int LARGE_BUFFER_SIZE = 300 * 1024; + + static void onServerAccept(uS::Socket *s); + static void onClientConnection(uS::Socket *s, bool error); + +public: + template <bool isServer> + Group<isServer> *createGroup(int extensionOptions = 0, unsigned int maxPayload = 16777216) { + return new Group<isServer>(extensionOptions, maxPayload, this, nodeData); + } + + template <bool isServer> + Group<isServer> &getDefaultGroup() { + return static_cast<Group<isServer> &>(*this); + } + + bool listen(int port, uS::TLS::Context sslContext = nullptr, int options = 0, Group<SERVER> *eh = nullptr); + bool listen(const char *host, int port, uS::TLS::Context sslContext = nullptr, int options = 0, Group<SERVER> *eh = nullptr); + void connect(std::string uri, void *user = nullptr, std::map<std::string, std::string> extraHeaders = {}, int timeoutMs = 5000, Group<CLIENT> *eh = nullptr); + void upgrade(uv_os_sock_t fd, const char *secKey, SSL *ssl, const char *extensions, size_t extensionsLength, const char *subprotocol, size_t subprotocolLength, Group<SERVER> *serverGroup = nullptr); + + Hub(int extensionOptions = 0, bool useDefaultLoop = false, unsigned int maxPayload = 16777216) : uS::Node(LARGE_BUFFER_SIZE, WebSocketProtocol<SERVER, WebSocket<SERVER>>::CONSUME_PRE_PADDING, WebSocketProtocol<SERVER, WebSocket<SERVER>>::CONSUME_POST_PADDING, useDefaultLoop), + Group<SERVER>(extensionOptions, maxPayload, this, nodeData), Group<CLIENT>(0, maxPayload, this, nodeData) { + inflateInit2(&inflationStream, -15); + inflationBuffer = new char[LARGE_BUFFER_SIZE]; + +#ifdef UWS_THREADSAFE + getLoop()->preCbData = nodeData; + getLoop()->preCb = [](void *nodeData) { + static_cast<uS::NodeData *>(nodeData)->asyncMutex->lock(); + }; + + getLoop()->postCbData = nodeData; + getLoop()->postCb = [](void *nodeData) { + static_cast<uS::NodeData *>(nodeData)->asyncMutex->unlock(); + }; +#endif + } + + ~Hub() { + inflateEnd(&inflationStream); + delete [] inflationBuffer; + } + + using uS::Node::run; + using uS::Node::getLoop; + using Group<SERVER>::onConnection; + using Group<CLIENT>::onConnection; + using Group<SERVER>::onTransfer; + using Group<SERVER>::onMessage; + using Group<CLIENT>::onMessage; + using Group<SERVER>::onDisconnection; + using Group<CLIENT>::onDisconnection; + using Group<SERVER>::onPing; + using Group<CLIENT>::onPing; + using Group<SERVER>::onPong; + using Group<CLIENT>::onPong; + using Group<SERVER>::onError; + using Group<CLIENT>::onError; + using Group<SERVER>::onHttpRequest; + using Group<SERVER>::onHttpData; + using Group<SERVER>::onHttpConnection; + using Group<SERVER>::onHttpDisconnection; + using Group<SERVER>::onHttpUpgrade; + using Group<SERVER>::onCancelledHttpRequest; + + friend struct WebSocket<SERVER>; + friend struct WebSocket<CLIENT>; +}; + +} + +#endif // HUB_UWS_H |