1e509ee18Sopenharmony_ci/* 2e509ee18Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 3e509ee18Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4e509ee18Sopenharmony_ci * you may not use this file except in compliance with the License. 5e509ee18Sopenharmony_ci * You may obtain a copy of the License at 6e509ee18Sopenharmony_ci * 7e509ee18Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8e509ee18Sopenharmony_ci * 9e509ee18Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10e509ee18Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11e509ee18Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12e509ee18Sopenharmony_ci * See the License for the specific language governing permissions and 13e509ee18Sopenharmony_ci * limitations under the License. 14e509ee18Sopenharmony_ci */ 15e509ee18Sopenharmony_ci 16e509ee18Sopenharmony_ci#ifndef ECMASCRIPT_TOOLING_CLIENT_SESSION_H 17e509ee18Sopenharmony_ci#define ECMASCRIPT_TOOLING_CLIENT_SESSION_H 18e509ee18Sopenharmony_ci 19e509ee18Sopenharmony_ci#include <atomic> 20e509ee18Sopenharmony_ci#include <iostream> 21e509ee18Sopenharmony_ci#include <memory> 22e509ee18Sopenharmony_ci#include <map> 23e509ee18Sopenharmony_ci#include <pthread.h> 24e509ee18Sopenharmony_ci#include <thread> 25e509ee18Sopenharmony_ci#include <uv.h> 26e509ee18Sopenharmony_ci 27e509ee18Sopenharmony_ci#include "tooling/client/manager/domain_manager.h" 28e509ee18Sopenharmony_ci#include "tooling/client/manager/breakpoint_manager.h" 29e509ee18Sopenharmony_ci#include "tooling/client/manager/source_manager.h" 30e509ee18Sopenharmony_ci#include "tooling/client/manager/stack_manager.h" 31e509ee18Sopenharmony_ci#include "tooling/client/manager/variable_manager.h" 32e509ee18Sopenharmony_ci#include "tooling/client/manager/watch_manager.h" 33e509ee18Sopenharmony_ci#include "websocket/client/websocket_client.h" 34e509ee18Sopenharmony_ci 35e509ee18Sopenharmony_cinamespace OHOS::ArkCompiler::Toolchain { 36e509ee18Sopenharmony_ciusing CmdForAllCB = std::function<void(uint32_t sessionId)>; 37e509ee18Sopenharmony_ciextern uv_async_t* g_socketSignal; 38e509ee18Sopenharmony_ciclass Session { 39e509ee18Sopenharmony_cipublic: 40e509ee18Sopenharmony_ci explicit Session(uint32_t sessionId, std::string& sockInfo); 41e509ee18Sopenharmony_ci ~Session() 42e509ee18Sopenharmony_ci { 43e509ee18Sopenharmony_ci Stop(); 44e509ee18Sopenharmony_ci } 45e509ee18Sopenharmony_ci 46e509ee18Sopenharmony_ci void SocketMessageLoop(); 47e509ee18Sopenharmony_ci int CreateSocket(); 48e509ee18Sopenharmony_ci int Start(); 49e509ee18Sopenharmony_ci int Stop(); 50e509ee18Sopenharmony_ci void CmdForAllSession(CmdForAllCB callback); 51e509ee18Sopenharmony_ci 52e509ee18Sopenharmony_ci uint32_t GetMessageId() 53e509ee18Sopenharmony_ci { 54e509ee18Sopenharmony_ci return messageId_.fetch_add(1); 55e509ee18Sopenharmony_ci } 56e509ee18Sopenharmony_ci 57e509ee18Sopenharmony_ci std::string& GetSockInfo() 58e509ee18Sopenharmony_ci { 59e509ee18Sopenharmony_ci return sockInfo_; 60e509ee18Sopenharmony_ci } 61e509ee18Sopenharmony_ci 62e509ee18Sopenharmony_ci bool ClientSendReq(const std::string &message) 63e509ee18Sopenharmony_ci { 64e509ee18Sopenharmony_ci return cliSocket_.SendReply(message); 65e509ee18Sopenharmony_ci } 66e509ee18Sopenharmony_ci 67e509ee18Sopenharmony_ci DomainManager& GetDomainManager() 68e509ee18Sopenharmony_ci { 69e509ee18Sopenharmony_ci return domainManager_; 70e509ee18Sopenharmony_ci } 71e509ee18Sopenharmony_ci 72e509ee18Sopenharmony_ci BreakPointManager& GetBreakPointManager() 73e509ee18Sopenharmony_ci { 74e509ee18Sopenharmony_ci return breakpoint_; 75e509ee18Sopenharmony_ci } 76e509ee18Sopenharmony_ci 77e509ee18Sopenharmony_ci StackManager& GetStackManager() 78e509ee18Sopenharmony_ci { 79e509ee18Sopenharmony_ci return stackManager_; 80e509ee18Sopenharmony_ci } 81e509ee18Sopenharmony_ci 82e509ee18Sopenharmony_ci VariableManager& GetVariableManager() 83e509ee18Sopenharmony_ci { 84e509ee18Sopenharmony_ci return variableManager_; 85e509ee18Sopenharmony_ci } 86e509ee18Sopenharmony_ci 87e509ee18Sopenharmony_ci WebSocketClient& GetWebSocketClient() 88e509ee18Sopenharmony_ci { 89e509ee18Sopenharmony_ci return cliSocket_; 90e509ee18Sopenharmony_ci } 91e509ee18Sopenharmony_ci 92e509ee18Sopenharmony_ci ProfilerSingleton& GetProfilerSingleton() 93e509ee18Sopenharmony_ci { 94e509ee18Sopenharmony_ci return profiler_; 95e509ee18Sopenharmony_ci } 96e509ee18Sopenharmony_ci 97e509ee18Sopenharmony_ci std::string GetSocketStateString() 98e509ee18Sopenharmony_ci { 99e509ee18Sopenharmony_ci return cliSocket_.GetSocketStateString(); 100e509ee18Sopenharmony_ci } 101e509ee18Sopenharmony_ci 102e509ee18Sopenharmony_ci void ProcSocketMsg(char* msg) 103e509ee18Sopenharmony_ci { 104e509ee18Sopenharmony_ci domainManager_.DispatcherReply(msg); 105e509ee18Sopenharmony_ci } 106e509ee18Sopenharmony_ci 107e509ee18Sopenharmony_ci SourceManager& GetSourceManager() 108e509ee18Sopenharmony_ci { 109e509ee18Sopenharmony_ci return sourceManager_; 110e509ee18Sopenharmony_ci } 111e509ee18Sopenharmony_ci 112e509ee18Sopenharmony_ci WatchManager& GetWatchManager() 113e509ee18Sopenharmony_ci { 114e509ee18Sopenharmony_ci return watchManager_; 115e509ee18Sopenharmony_ci } 116e509ee18Sopenharmony_ci 117e509ee18Sopenharmony_ciprivate: 118e509ee18Sopenharmony_ci uint32_t sessionId_; 119e509ee18Sopenharmony_ci std::string sockInfo_; 120e509ee18Sopenharmony_ci DomainManager domainManager_; 121e509ee18Sopenharmony_ci WebSocketClient cliSocket_; 122e509ee18Sopenharmony_ci uv_thread_t socketTid_ = 0; 123e509ee18Sopenharmony_ci std::atomic<uint32_t> messageId_ {1}; 124e509ee18Sopenharmony_ci BreakPointManager breakpoint_; 125e509ee18Sopenharmony_ci StackManager stackManager_; 126e509ee18Sopenharmony_ci VariableManager variableManager_; 127e509ee18Sopenharmony_ci ProfilerSingleton profiler_; 128e509ee18Sopenharmony_ci SourceManager sourceManager_; 129e509ee18Sopenharmony_ci WatchManager watchManager_; 130e509ee18Sopenharmony_ci}; 131e509ee18Sopenharmony_ci 132e509ee18Sopenharmony_ciconstexpr uint32_t MAX_SESSION_NUM = 8; 133e509ee18Sopenharmony_ciclass SessionManager { 134e509ee18Sopenharmony_cipublic: 135e509ee18Sopenharmony_ci static SessionManager& getInstance() 136e509ee18Sopenharmony_ci { 137e509ee18Sopenharmony_ci static SessionManager instance; 138e509ee18Sopenharmony_ci return instance; 139e509ee18Sopenharmony_ci } 140e509ee18Sopenharmony_ci 141e509ee18Sopenharmony_ci uint32_t GetCurrentSessionId() 142e509ee18Sopenharmony_ci { 143e509ee18Sopenharmony_ci return currentSessionId_; 144e509ee18Sopenharmony_ci } 145e509ee18Sopenharmony_ci 146e509ee18Sopenharmony_ci Session *GetCurrentSession() 147e509ee18Sopenharmony_ci { 148e509ee18Sopenharmony_ci if (currentSessionId_ >= MAX_SESSION_NUM || sessions_[currentSessionId_] == nullptr) { 149e509ee18Sopenharmony_ci return nullptr; 150e509ee18Sopenharmony_ci } 151e509ee18Sopenharmony_ci return sessions_[currentSessionId_].get(); 152e509ee18Sopenharmony_ci } 153e509ee18Sopenharmony_ci 154e509ee18Sopenharmony_ci Session *GetSessionById(uint32_t sessionId) 155e509ee18Sopenharmony_ci { 156e509ee18Sopenharmony_ci if (sessionId >= MAX_SESSION_NUM || sessions_[sessionId] == nullptr) { 157e509ee18Sopenharmony_ci return nullptr; 158e509ee18Sopenharmony_ci } 159e509ee18Sopenharmony_ci return sessions_[sessionId].get(); 160e509ee18Sopenharmony_ci } 161e509ee18Sopenharmony_ci 162e509ee18Sopenharmony_ci int CreateSessionById(uint32_t sessionId, std::string& sockInfo); 163e509ee18Sopenharmony_ci int CreateNewSession(std::string& sockInfo); 164e509ee18Sopenharmony_ci int CreateDefaultSession(std::string& sockInfo); 165e509ee18Sopenharmony_ci int DelSessionById(uint32_t sessionId); 166e509ee18Sopenharmony_ci int SessionList(); 167e509ee18Sopenharmony_ci int SessionSwitch(uint32_t sessionId); 168e509ee18Sopenharmony_ci void CmdForAllSessions(CmdForAllCB callback); 169e509ee18Sopenharmony_ci int CreateTestSession(std::string& sockInfo); 170e509ee18Sopenharmony_ci 171e509ee18Sopenharmony_ciprivate: 172e509ee18Sopenharmony_ci SessionManager() = default; 173e509ee18Sopenharmony_ci SessionManager(const SessionManager&) = delete; 174e509ee18Sopenharmony_ci SessionManager& operator=(const SessionManager&) = delete; 175e509ee18Sopenharmony_ci 176e509ee18Sopenharmony_ci std::unique_ptr<Session> sessions_[MAX_SESSION_NUM]; 177e509ee18Sopenharmony_ci uint32_t currentSessionId_ = 0; 178e509ee18Sopenharmony_ci}; 179e509ee18Sopenharmony_ci} // namespace OHOS::ArkCompiler::Toolchain 180e509ee18Sopenharmony_ci#endif