// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include #include #include #include #include ZEN_THIRD_PARTY_INCLUDES_START #include #include ZEN_THIRD_PARTY_INCLUDES_END namespace zen { class SessionsService; class HttpSessionsService final : public HttpService, public IHttpStatusProvider, public IHttpStatsProvider, public IWebSocketHandler { public: HttpSessionsService(HttpStatusService& StatusService, HttpStatsService& StatsService, SessionsService& Sessions, asio::io_context& IoContext); virtual ~HttpSessionsService(); virtual const char* BaseUri() const override; virtual void HandleRequest(HttpServerRequest& Request) override; virtual CbObject CollectStats() override; virtual void HandleStatsRequest(HttpServerRequest& Request) override; virtual void HandleStatusRequest(HttpServerRequest& Request) override; void SetSelfSessionId(const Oid& Id) { m_SelfSessionId = Id; } // IWebSocketHandler void OnWebSocketOpen(Ref Connection) override; void OnWebSocketMessage(WebSocketConnection& Conn, const WebSocketMessage& Msg) override; void OnWebSocketClose(WebSocketConnection& Conn, uint16_t Code, std::string_view Reason) override; private: struct SessionsStats { std::atomic_uint64_t SessionReadCount{}; std::atomic_uint64_t SessionWriteCount{}; std::atomic_uint64_t SessionDeleteCount{}; std::atomic_uint64_t SessionListCount{}; std::atomic_uint64_t RequestCount{}; std::atomic_uint64_t BadRequestCount{}; }; inline LoggerRef Log() { return m_Log; } LoggerRef m_Log; void Initialize(); void ListSessionsRequest(HttpRouterRequest& Req); void SessionRequest(HttpRouterRequest& Req); void SessionLogRequest(HttpRouterRequest& Req); HttpStatusService& m_StatusService; HttpStatsService& m_StatsService; HttpRequestRouter m_Router; SessionsService& m_Sessions; SessionsStats m_SessionsStats; metrics::OperationTiming m_HttpRequests; // WebSocket push RwLock m_WsConnectionsLock; std::vector> m_WsConnections; asio::steady_timer m_PushTimer; void BroadcastSessions(); void EnqueuePushTimer(); Oid m_SelfSessionId = Oid::Zero; CbObject BuildSessionListResponse(); }; } // namespace zen