reformat everything with clang-format
This commit is contained in:
		| @@ -4,24 +4,20 @@ | ||||
|  *  Copyright (c) 2019 Machine Zone, Inc. All rights reserved. | ||||
|  */ | ||||
|  | ||||
| #include "IXSnakeProtocol.h" | ||||
| #include "IXAppConfig.h" | ||||
|  | ||||
| #include "IXSnakeProtocol.h" | ||||
| #include <iostream> | ||||
| #include <ixcrypto/IXUuid.h> | ||||
|  | ||||
| namespace snake | ||||
| { | ||||
|     bool isAppKeyValid( | ||||
|         const AppConfig& appConfig, | ||||
|         std::string appkey) | ||||
|     bool isAppKeyValid(const AppConfig& appConfig, std::string appkey) | ||||
|     { | ||||
|         return appConfig.apps.count(appkey) != 0; | ||||
|     } | ||||
|  | ||||
|     std::string getRoleSecret( | ||||
|         const AppConfig& appConfig, | ||||
|         std::string appkey, | ||||
|         std::string role) | ||||
|     std::string getRoleSecret(const AppConfig& appConfig, std::string appkey, std::string role) | ||||
|     { | ||||
|         if (!isAppKeyValid(appConfig, appkey)) | ||||
|         { | ||||
| @@ -49,4 +45,4 @@ namespace snake | ||||
|         std::cout << "redis password: " << appConfig.redisPassword << std::endl; | ||||
|         std::cout << "redis port: " << appConfig.redisPort << std::endl; | ||||
|     } | ||||
| } | ||||
| } // namespace snake | ||||
|   | ||||
| @@ -16,16 +16,37 @@ namespace snake | ||||
|     class SnakeConnectionState : public ix::ConnectionState | ||||
|     { | ||||
|     public: | ||||
|         std::string getNonce() { return _nonce; } | ||||
|         void setNonce(const std::string& nonce) { _nonce = nonce; } | ||||
|         std::string getNonce() | ||||
|         { | ||||
|             return _nonce; | ||||
|         } | ||||
|         void setNonce(const std::string& nonce) | ||||
|         { | ||||
|             _nonce = nonce; | ||||
|         } | ||||
|  | ||||
|         std::string appkey() { return _appkey; } | ||||
|         void setAppkey(const std::string& appkey) { _appkey = appkey; } | ||||
|         std::string appkey() | ||||
|         { | ||||
|             return _appkey; | ||||
|         } | ||||
|         void setAppkey(const std::string& appkey) | ||||
|         { | ||||
|             _appkey = appkey; | ||||
|         } | ||||
|  | ||||
|         std::string role() { return _role; } | ||||
|         void setRole(const std::string& role) { _role = role; } | ||||
|         std::string role() | ||||
|         { | ||||
|             return _role; | ||||
|         } | ||||
|         void setRole(const std::string& role) | ||||
|         { | ||||
|             _role = role; | ||||
|         } | ||||
|  | ||||
|         ix::RedisClient& redisClient() { return _redisClient; } | ||||
|         ix::RedisClient& redisClient() | ||||
|         { | ||||
|             return _redisClient; | ||||
|         } | ||||
|  | ||||
|         std::future<void> fut; | ||||
|  | ||||
|   | ||||
| @@ -6,41 +6,32 @@ | ||||
|  | ||||
| #include "IXSnakeProtocol.h" | ||||
|  | ||||
| #include <ixwebsocket/IXWebSocket.h> | ||||
| #include <ixcrypto/IXHMac.h> | ||||
|  | ||||
| #include "IXSnakeConnectionState.h" | ||||
| #include "IXAppConfig.h" | ||||
|  | ||||
| #include "IXSnakeConnectionState.h" | ||||
| #include "nlohmann/json.hpp" | ||||
| #include <sstream> | ||||
| #include <iostream> | ||||
| #include <ixcrypto/IXHMac.h> | ||||
| #include <ixwebsocket/IXWebSocket.h> | ||||
| #include <sstream> | ||||
|  | ||||
| namespace snake | ||||
| { | ||||
|     void handleError( | ||||
|         const std::string& action, | ||||
|         std::shared_ptr<ix::WebSocket> ws, | ||||
|         nlohmann::json pdu, | ||||
|         const std::string& errMsg) | ||||
|     void handleError(const std::string& action, | ||||
|                      std::shared_ptr<ix::WebSocket> ws, | ||||
|                      nlohmann::json pdu, | ||||
|                      const std::string& errMsg) | ||||
|     { | ||||
|         std::string actionError(action); | ||||
|         actionError += "/error"; | ||||
|  | ||||
|         nlohmann::json response = { | ||||
|             {"action", actionError}, | ||||
|             {"id", pdu.value("id", 1)}, | ||||
|             {"body", { | ||||
|                 {"reason", errMsg} | ||||
|             }} | ||||
|         }; | ||||
|             {"action", actionError}, {"id", pdu.value("id", 1)}, {"body", {{"reason", errMsg}}}}; | ||||
|         ws->sendText(response.dump()); | ||||
|     } | ||||
|  | ||||
|     void handleHandshake( | ||||
|         std::shared_ptr<SnakeConnectionState> state, | ||||
|         std::shared_ptr<ix::WebSocket> ws, | ||||
|         const nlohmann::json& pdu) | ||||
|     void handleHandshake(std::shared_ptr<SnakeConnectionState> state, | ||||
|                          std::shared_ptr<ix::WebSocket> ws, | ||||
|                          const nlohmann::json& pdu) | ||||
|     { | ||||
|         std::string role = pdu["body"]["data"]["role"]; | ||||
|  | ||||
| @@ -50,13 +41,10 @@ namespace snake | ||||
|         nlohmann::json response = { | ||||
|             {"action", "auth/handshake/ok"}, | ||||
|             {"id", pdu.value("id", 1)}, | ||||
|             {"body", { | ||||
|                 {"data", { | ||||
|                     {"nonce", state->getNonce()}, | ||||
|                     {"connection_id", state->getId()} | ||||
|                 }}, | ||||
|             }} | ||||
|         }; | ||||
|             {"body", | ||||
|              { | ||||
|                  {"data", {{"nonce", state->getNonce()}, {"connection_id", state->getId()}}}, | ||||
|              }}}; | ||||
|  | ||||
|         auto serializedResponse = response.dump(); | ||||
|         std::cout << "response = " << serializedResponse << std::endl; | ||||
| @@ -64,11 +52,10 @@ namespace snake | ||||
|         ws->sendText(serializedResponse); | ||||
|     } | ||||
|  | ||||
|     void handleAuth( | ||||
|         std::shared_ptr<SnakeConnectionState> state, | ||||
|         std::shared_ptr<ix::WebSocket> ws, | ||||
|         const AppConfig& appConfig, | ||||
|         const nlohmann::json& pdu) | ||||
|     void handleAuth(std::shared_ptr<SnakeConnectionState> state, | ||||
|                     std::shared_ptr<ix::WebSocket> ws, | ||||
|                     const AppConfig& appConfig, | ||||
|                     const nlohmann::json& pdu) | ||||
|     { | ||||
|         auto secret = getRoleSecret(appConfig, state->appkey(), state->role()); | ||||
|         std::cout << "secret = " << secret << std::endl; | ||||
| @@ -78,11 +65,7 @@ namespace snake | ||||
|             nlohmann::json response = { | ||||
|                 {"action", "auth/authenticate/error"}, | ||||
|                 {"id", pdu.value("id", 1)}, | ||||
|                 {"body", { | ||||
|                     {"error", "authentication_failed"}, | ||||
|                     {"reason", "invalid secret"} | ||||
|                 }} | ||||
|             }; | ||||
|                 {"body", {{"error", "authentication_failed"}, {"reason", "invalid secret"}}}}; | ||||
|             ws->sendText(response.dump()); | ||||
|             return; | ||||
|         } | ||||
| @@ -102,28 +85,20 @@ namespace snake | ||||
|             nlohmann::json response = { | ||||
|                 {"action", "auth/authenticate/error"}, | ||||
|                 {"id", pdu.value("id", 1)}, | ||||
|                 {"body", { | ||||
|                     {"error", "authentication_failed"}, | ||||
|                     {"reason", "invalid hash"} | ||||
|                 }} | ||||
|             }; | ||||
|                 {"body", {{"error", "authentication_failed"}, {"reason", "invalid hash"}}}}; | ||||
|             ws->sendText(response.dump()); | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         nlohmann::json response = { | ||||
|             {"action", "auth/authenticate/ok"}, | ||||
|             {"id", pdu.value("id", 1)}, | ||||
|             {"body", {}} | ||||
|         }; | ||||
|             {"action", "auth/authenticate/ok"}, {"id", pdu.value("id", 1)}, {"body", {}}}; | ||||
|  | ||||
|         ws->sendText(response.dump()); | ||||
|     } | ||||
|  | ||||
|     void handlePublish( | ||||
|         std::shared_ptr<SnakeConnectionState> state, | ||||
|         std::shared_ptr<ix::WebSocket> ws, | ||||
|         const nlohmann::json& pdu) | ||||
|     void handlePublish(std::shared_ptr<SnakeConnectionState> state, | ||||
|                        std::shared_ptr<ix::WebSocket> ws, | ||||
|                        const nlohmann::json& pdu) | ||||
|     { | ||||
|         std::vector<std::string> channels; | ||||
|  | ||||
| @@ -150,9 +125,7 @@ namespace snake | ||||
|         for (auto&& channel : channels) | ||||
|         { | ||||
|             std::stringstream ss; | ||||
|             ss << state->appkey() | ||||
|                << "::" | ||||
|                << channel; | ||||
|             ss << state->appkey() << "::" << channel; | ||||
|  | ||||
|             std::string errMsg; | ||||
|             if (!state->redisClient().publish(ss.str(), pdu.dump(), errMsg)) | ||||
| @@ -165,10 +138,7 @@ namespace snake | ||||
|         } | ||||
|  | ||||
|         nlohmann::json response = { | ||||
|             {"action", "rtm/publish/ok"}, | ||||
|             {"id", pdu.value("id", 1)}, | ||||
|             {"body", {}} | ||||
|         }; | ||||
|             {"action", "rtm/publish/ok"}, {"id", pdu.value("id", 1)}, {"body", {}}}; | ||||
|  | ||||
|         ws->sendText(response.dump()); | ||||
|     } | ||||
| @@ -176,19 +146,16 @@ namespace snake | ||||
|     // | ||||
|     // FIXME: this is not cancellable. We should be able to cancel the redis subscription | ||||
|     // | ||||
|     void handleRedisSubscription( | ||||
|         std::shared_ptr<SnakeConnectionState> state, | ||||
|         std::shared_ptr<ix::WebSocket> ws, | ||||
|         const AppConfig& appConfig, | ||||
|         const nlohmann::json& pdu) | ||||
|     void handleRedisSubscription(std::shared_ptr<SnakeConnectionState> state, | ||||
|                                  std::shared_ptr<ix::WebSocket> ws, | ||||
|                                  const AppConfig& appConfig, | ||||
|                                  const nlohmann::json& pdu) | ||||
|     { | ||||
|         std::string channel = pdu["body"]["channel"]; | ||||
|         std::string subscriptionId = channel; | ||||
|  | ||||
|         std::stringstream ss; | ||||
|         ss << state->appkey() | ||||
|            << "::" | ||||
|            << channel; | ||||
|         ss << state->appkey() << "::" << channel; | ||||
|  | ||||
|         std::string appChannel(ss.str()); | ||||
|  | ||||
| @@ -224,8 +191,7 @@ namespace snake | ||||
|         } | ||||
|  | ||||
|         int id = 0; | ||||
|         auto callback = [ws, &id, &subscriptionId](const std::string& messageStr) | ||||
|         { | ||||
|         auto callback = [ws, &id, &subscriptionId](const std::string& messageStr) { | ||||
|             auto msg = nlohmann::json::parse(messageStr); | ||||
|  | ||||
|             msg = msg["body"]["message"]; | ||||
| @@ -233,27 +199,18 @@ namespace snake | ||||
|             nlohmann::json response = { | ||||
|                 {"action", "rtm/subscription/data"}, | ||||
|                 {"id", id++}, | ||||
|                 {"body", { | ||||
|                     {"subscription_id", subscriptionId}, | ||||
|                     {"messages", {msg}} | ||||
|                 }} | ||||
|             }; | ||||
|                 {"body", {{"subscription_id", subscriptionId}, {"messages", {msg}}}}}; | ||||
|  | ||||
|             ws->sendText(response.dump()); | ||||
|         }; | ||||
|  | ||||
|         auto responseCallback = [ws, pdu, &subscriptionId](const std::string& redisResponse) | ||||
|         { | ||||
|         auto responseCallback = [ws, pdu, &subscriptionId](const std::string& redisResponse) { | ||||
|             std::cout << "Redis subscribe response: " << redisResponse << std::endl; | ||||
|  | ||||
|             // Success | ||||
|             nlohmann::json response = { | ||||
|                 {"action", "rtm/subscribe/ok"}, | ||||
|                 {"id", pdu.value("id", 1)}, | ||||
|                 {"body", { | ||||
|                     {"subscription_id", subscriptionId} | ||||
|                 }} | ||||
|             }; | ||||
|             nlohmann::json response = {{"action", "rtm/subscribe/ok"}, | ||||
|                                        {"id", pdu.value("id", 1)}, | ||||
|                                        {"body", {{"subscription_id", subscriptionId}}}}; | ||||
|             ws->sendText(response.dump()); | ||||
|         }; | ||||
|  | ||||
| @@ -267,24 +224,18 @@ namespace snake | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     void handleSubscribe( | ||||
|         std::shared_ptr<SnakeConnectionState> state, | ||||
|         std::shared_ptr<ix::WebSocket> ws, | ||||
|         const AppConfig& appConfig, | ||||
|         const nlohmann::json& pdu) | ||||
|     void handleSubscribe(std::shared_ptr<SnakeConnectionState> state, | ||||
|                          std::shared_ptr<ix::WebSocket> ws, | ||||
|                          const AppConfig& appConfig, | ||||
|                          const nlohmann::json& pdu) | ||||
|     { | ||||
|         state->fut = std::async(std::launch::async, | ||||
|                                 handleRedisSubscription, | ||||
|                                 state, | ||||
|                                 ws, | ||||
|                                 appConfig, | ||||
|                                 pdu); | ||||
|         state->fut = | ||||
|             std::async(std::launch::async, handleRedisSubscription, state, ws, appConfig, pdu); | ||||
|     } | ||||
|  | ||||
|     void handleUnSubscribe( | ||||
|         std::shared_ptr<SnakeConnectionState> state, | ||||
|         std::shared_ptr<ix::WebSocket> ws, | ||||
|         const nlohmann::json& pdu) | ||||
|     void handleUnSubscribe(std::shared_ptr<SnakeConnectionState> state, | ||||
|                            std::shared_ptr<ix::WebSocket> ws, | ||||
|                            const nlohmann::json& pdu) | ||||
|     { | ||||
|         // extract subscription_id | ||||
|         auto body = pdu["body"]; | ||||
| @@ -292,21 +243,16 @@ namespace snake | ||||
|  | ||||
|         state->redisClient().stop(); | ||||
|  | ||||
|         nlohmann::json response = { | ||||
|             {"action", "rtm/unsubscribe/ok"}, | ||||
|             {"id", pdu.value("id", 1)}, | ||||
|             {"body", { | ||||
|                 {"subscription_id", subscriptionId} | ||||
|             }} | ||||
|         }; | ||||
|         nlohmann::json response = {{"action", "rtm/unsubscribe/ok"}, | ||||
|                                    {"id", pdu.value("id", 1)}, | ||||
|                                    {"body", {{"subscription_id", subscriptionId}}}}; | ||||
|         ws->sendText(response.dump()); | ||||
|     } | ||||
|  | ||||
|     void processCobraMessage( | ||||
|         std::shared_ptr<SnakeConnectionState> state, | ||||
|         std::shared_ptr<ix::WebSocket> ws, | ||||
|         const AppConfig& appConfig, | ||||
|         const std::string& str) | ||||
|     void processCobraMessage(std::shared_ptr<SnakeConnectionState> state, | ||||
|                              std::shared_ptr<ix::WebSocket> ws, | ||||
|                              const AppConfig& appConfig, | ||||
|                              const std::string& str) | ||||
|     { | ||||
|         auto pdu = nlohmann::json::parse(str); | ||||
|         std::cout << "Got " << str << std::endl; | ||||
| @@ -339,4 +285,4 @@ namespace snake | ||||
|             std::cerr << "Unhandled action: " << action << std::endl; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| } // namespace snake | ||||
|   | ||||
| @@ -5,18 +5,18 @@ | ||||
|  */ | ||||
|  | ||||
| #include "IXSnakeServer.h" | ||||
| #include "IXSnakeProtocol.h" | ||||
| #include "IXSnakeConnectionState.h" | ||||
| #include "IXAppConfig.h" | ||||
|  | ||||
| #include "IXAppConfig.h" | ||||
| #include "IXSnakeConnectionState.h" | ||||
| #include "IXSnakeProtocol.h" | ||||
| #include <iostream> | ||||
| #include <sstream> | ||||
|  | ||||
| namespace snake | ||||
| { | ||||
|     SnakeServer::SnakeServer(const AppConfig& appConfig) : | ||||
|         _appConfig(appConfig), | ||||
|         _server(appConfig.port, appConfig.hostname) | ||||
|     SnakeServer::SnakeServer(const AppConfig& appConfig) | ||||
|         : _appConfig(appConfig) | ||||
|         , _server(appConfig.port, appConfig.hostname) | ||||
|     { | ||||
|         ; | ||||
|     } | ||||
| @@ -32,7 +32,7 @@ namespace snake | ||||
|         idx = path.rfind('='); | ||||
|         if (idx != std::string::npos) | ||||
|         { | ||||
|             std::string appkey = path.substr(idx+1); | ||||
|             std::string appkey = path.substr(idx + 1); | ||||
|             return appkey; | ||||
|         } | ||||
|         else | ||||
| @@ -45,21 +45,18 @@ namespace snake | ||||
|     { | ||||
|         std::cout << "Listening on " << _appConfig.hostname << ":" << _appConfig.port << std::endl; | ||||
|  | ||||
|         auto factory = []() -> std::shared_ptr<ix::ConnectionState> | ||||
|         { | ||||
|         auto factory = []() -> std::shared_ptr<ix::ConnectionState> { | ||||
|             return std::make_shared<SnakeConnectionState>(); | ||||
|         }; | ||||
|         _server.setConnectionStateFactory(factory); | ||||
|  | ||||
|         _server.setOnConnectionCallback( | ||||
|             [this](std::shared_ptr<ix::WebSocket> webSocket, | ||||
|                    std::shared_ptr<ix::ConnectionState> connectionState) | ||||
|             { | ||||
|                    std::shared_ptr<ix::ConnectionState> connectionState) { | ||||
|                 auto state = std::dynamic_pointer_cast<SnakeConnectionState>(connectionState); | ||||
|  | ||||
|                 webSocket->setOnMessageCallback( | ||||
|                     [this, webSocket, state](const ix::WebSocketMessagePtr& msg) | ||||
|                     { | ||||
|                     [this, webSocket, state](const ix::WebSocketMessagePtr& msg) { | ||||
|                         if (msg->type == ix::WebSocketMessageType::Open) | ||||
|                         { | ||||
|                             std::cerr << "New connection" << std::endl; | ||||
| @@ -84,16 +81,16 @@ namespace snake | ||||
|                         else if (msg->type == ix::WebSocketMessageType::Close) | ||||
|                         { | ||||
|                             std::cerr << "Closed connection" | ||||
|                                       << " code " << msg->closeInfo.code | ||||
|                                       << " reason " << msg->closeInfo.reason << std::endl; | ||||
|                                       << " code " << msg->closeInfo.code << " reason " | ||||
|                                       << msg->closeInfo.reason << std::endl; | ||||
|                         } | ||||
|                         else if (msg->type == ix::WebSocketMessageType::Error) | ||||
|                         { | ||||
|                             std::stringstream ss; | ||||
|                             ss << "Connection error: " << msg->errorInfo.reason      << std::endl; | ||||
|                             ss << "#retries: "         << msg->errorInfo.retries     << std::endl; | ||||
|                             ss << "Wait time(ms): "    << msg->errorInfo.wait_time   << std::endl; | ||||
|                             ss << "HTTP Status: "      << msg->errorInfo.http_status << std::endl; | ||||
|                             ss << "Connection error: " << msg->errorInfo.reason << std::endl; | ||||
|                             ss << "#retries: " << msg->errorInfo.retries << std::endl; | ||||
|                             ss << "Wait time(ms): " << msg->errorInfo.wait_time << std::endl; | ||||
|                             ss << "HTTP Status: " << msg->errorInfo.http_status << std::endl; | ||||
|                             std::cerr << ss.str(); | ||||
|                         } | ||||
|                         else if (msg->type == ix::WebSocketMessageType::Fragment) | ||||
| @@ -105,10 +102,8 @@ namespace snake | ||||
|                             std::cerr << "Received " << msg->wireSize << " bytes" << std::endl; | ||||
|                             processCobraMessage(state, webSocket, _appConfig, msg->str); | ||||
|                         } | ||||
|                     } | ||||
|                 ); | ||||
|             } | ||||
|         ); | ||||
|                     }); | ||||
|             }); | ||||
|  | ||||
|         auto res = _server.listen(); | ||||
|         if (!res.first) | ||||
| @@ -133,4 +128,4 @@ namespace snake | ||||
|     { | ||||
|         _server.stop(); | ||||
|     } | ||||
| } | ||||
| } // namespace snake | ||||
|   | ||||
		Reference in New Issue
	
	Block a user