aboutsummaryrefslogtreecommitdiffhomepage
path: root/node_modules/uws/src/Group.h
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/uws/src/Group.h')
-rw-r--r--node_modules/uws/src/Group.h144
1 files changed, 144 insertions, 0 deletions
diff --git a/node_modules/uws/src/Group.h b/node_modules/uws/src/Group.h
new file mode 100644
index 0000000..18c8c63
--- /dev/null
+++ b/node_modules/uws/src/Group.h
@@ -0,0 +1,144 @@
+#ifndef GROUP_UWS_H
+#define GROUP_UWS_H
+
+#include "WebSocket.h"
+#include "HTTPSocket.h"
+#include "Extensions.h"
+#include <functional>
+#include <stack>
+
+namespace uWS {
+
+enum ListenOptions {
+ TRANSFERS
+};
+
+struct Hub;
+
+template <bool isServer>
+struct WIN32_EXPORT Group : private uS::NodeData {
+protected:
+ friend struct Hub;
+ friend struct WebSocket<isServer>;
+ friend struct HttpSocket<false>;
+ friend struct HttpSocket<true>;
+
+ std::function<void(WebSocket<isServer> *, HttpRequest)> connectionHandler;
+ std::function<void(WebSocket<isServer> *)> transferHandler;
+ std::function<void(WebSocket<isServer> *, char *message, size_t length, OpCode opCode)> messageHandler;
+ std::function<void(WebSocket<isServer> *, int code, char *message, size_t length)> disconnectionHandler;
+ std::function<void(WebSocket<isServer> *, char *, size_t)> pingHandler;
+ std::function<void(WebSocket<isServer> *, char *, size_t)> pongHandler;
+ std::function<void(HttpSocket<isServer> *)> httpConnectionHandler;
+ std::function<void(HttpResponse *, HttpRequest, char *, size_t, size_t)> httpRequestHandler;
+ std::function<void(HttpResponse *, char *, size_t, size_t)> httpDataHandler;
+ std::function<void(HttpResponse *)> httpCancelledRequestHandler;
+ std::function<void(HttpSocket<isServer> *)> httpDisconnectionHandler;
+ std::function<void(HttpSocket<isServer> *, HttpRequest)> httpUpgradeHandler;
+
+ using errorType = typename std::conditional<isServer, int, void *>::type;
+ std::function<void(errorType)> errorHandler;
+
+ unsigned int maxPayload;
+ Hub *hub;
+ int extensionOptions;
+ Timer *timer = nullptr, *httpTimer = nullptr;
+ std::string userPingMessage;
+ std::stack<Poll *> iterators;
+
+ // todo: cannot be named user, collides with parent!
+ void *userData = nullptr;
+ static void timerCallback(Timer *timer);
+
+ WebSocket<isServer> *webSocketHead = nullptr;
+ HttpSocket<isServer> *httpSocketHead = nullptr;
+
+ void addWebSocket(WebSocket<isServer> *webSocket);
+ void removeWebSocket(WebSocket<isServer> *webSocket);
+
+ // todo: remove these, template
+ void addHttpSocket(HttpSocket<isServer> *httpSocket);
+ void removeHttpSocket(HttpSocket<isServer> *httpSocket);
+
+ Group(int extensionOptions, unsigned int maxPayload, Hub *hub, uS::NodeData *nodeData);
+ void stopListening();
+
+public:
+ void onConnection(std::function<void(WebSocket<isServer> *, HttpRequest)> handler);
+ void onTransfer(std::function<void(WebSocket<isServer> *)> handler);
+ void onMessage(std::function<void(WebSocket<isServer> *, char *, size_t, OpCode)> handler);
+ void onDisconnection(std::function<void(WebSocket<isServer> *, int code, char *message, size_t length)> handler);
+ void onPing(std::function<void(WebSocket<isServer> *, char *, size_t)> handler);
+ void onPong(std::function<void(WebSocket<isServer> *, char *, size_t)> handler);
+ void onError(std::function<void(errorType)> handler);
+ void onHttpConnection(std::function<void(HttpSocket<isServer> *)> handler);
+ void onHttpRequest(std::function<void(HttpResponse *, HttpRequest, char *data, size_t length, size_t remainingBytes)> handler);
+ void onHttpData(std::function<void(HttpResponse *, char *data, size_t length, size_t remainingBytes)> handler);
+ void onHttpDisconnection(std::function<void(HttpSocket<isServer> *)> handler);
+ void onCancelledHttpRequest(std::function<void(HttpResponse *)> handler);
+ void onHttpUpgrade(std::function<void(HttpSocket<isServer> *, HttpRequest)> handler);
+
+ // Thread safe
+ void broadcast(const char *message, size_t length, OpCode opCode);
+ void setUserData(void *user);
+ void *getUserData();
+
+ // Not thread safe
+ void terminate();
+ void close(int code = 1000, char *message = nullptr, size_t length = 0);
+ void startAutoPing(int intervalMs, std::string userMessage = "");
+
+ // same as listen(TRANSFERS), backwards compatible API for now
+ void addAsync() {
+ if (!async) {
+ NodeData::addAsync();
+ }
+ }
+
+ void listen(ListenOptions listenOptions) {
+ if (listenOptions == TRANSFERS && !async) {
+ addAsync();
+ }
+ }
+
+ template <class F>
+ void forEach(const F &cb) {
+ Poll *iterator = webSocketHead;
+ iterators.push(iterator);
+ while (iterator) {
+ Poll *lastIterator = iterator;
+ cb((WebSocket<isServer> *) iterator);
+ iterator = iterators.top();
+ if (lastIterator == iterator) {
+ iterator = ((uS::Socket *) iterator)->next;
+ iterators.top() = iterator;
+ }
+ }
+ iterators.pop();
+ }
+
+ // duplicated code for now!
+ template <class F>
+ void forEachHttpSocket(const F &cb) {
+ Poll *iterator = httpSocketHead;
+ iterators.push(iterator);
+ while (iterator) {
+ Poll *lastIterator = iterator;
+ cb((HttpSocket<isServer> *) iterator);
+ iterator = iterators.top();
+ if (lastIterator == iterator) {
+ iterator = ((uS::Socket *) iterator)->next;
+ iterators.top() = iterator;
+ }
+ }
+ iterators.pop();
+ }
+
+ static Group<isServer> *from(uS::Socket *s) {
+ return static_cast<Group<isServer> *>(s->getNodeData());
+ }
+};
+
+}
+
+#endif // GROUP_UWS_H