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