• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "websocket_module.h"
17 
18 #include "constant.h"
19 #include "netstack_log.h"
20 #include "module_template.h"
21 #include "netstack_common_utils.h"
22 #include "websocket_async_work.h"
23 
24 namespace OHOS::NetStack::Websocket {
25 static bool g_appIsAtomicService = false;
26 static std::once_flag g_isAtomicServiceFlag;
27 static std::string g_appBundleName;
28 
InitWebSocketModule(napi_env env,napi_value exports)29 napi_value WebSocketModule::InitWebSocketModule(napi_env env, napi_value exports)
30 {
31     DefineWebSocketClass(env, exports);
32     InitWebSocketProperties(env, exports);
33     NapiUtils::SetEnvValid(env);
34     std::call_once(g_isAtomicServiceFlag, []() {
35         g_appIsAtomicService = CommonUtils::IsAtomicService(g_appBundleName);
36         NETSTACK_LOGI("IsAtomicService  bundleName is %{public}s, isAtomicService is %{public}d",
37                       g_appBundleName.c_str(), g_appIsAtomicService);
38     });
39     auto envWrapper = new (std::nothrow)napi_env;
40     if (envWrapper == nullptr) {
41         return exports;
42     }
43     *envWrapper = env;
44     napi_add_env_cleanup_hook(env, NapiUtils::HookForEnvCleanup, envWrapper);
45     return exports;
46 }
47 
CreateWebSocket(napi_env env,napi_callback_info info)48 napi_value WebSocketModule::CreateWebSocket(napi_env env, napi_callback_info info)
49 {
50     return ModuleTemplate::NewInstanceWithSharedManager(env, info, INTERFACE_WEB_SOCKET, FinalizeWebSocketInstance);
51 }
52 
DefineWebSocketClass(napi_env env,napi_value exports)53 void WebSocketModule::DefineWebSocketClass(napi_env env, napi_value exports)
54 {
55     std::initializer_list<napi_property_descriptor> properties = {
56         DECLARE_NAPI_FUNCTION(WebSocket::FUNCTION_CONNECT, WebSocket::Connect),
57         DECLARE_NAPI_FUNCTION(WebSocket::FUNCTION_SEND, WebSocket::Send),
58         DECLARE_NAPI_FUNCTION(WebSocket::FUNCTION_CLOSE, WebSocket::Close),
59         DECLARE_NAPI_FUNCTION(WebSocket::FUNCTION_ON, WebSocket::On),
60         DECLARE_NAPI_FUNCTION(WebSocket::FUNCTION_OFF, WebSocket::Off),
61     };
62     ModuleTemplate::DefineClass(env, exports, properties, INTERFACE_WEB_SOCKET);
63 }
64 
InitWebSocketProperties(napi_env env,napi_value exports)65 void WebSocketModule::InitWebSocketProperties(napi_env env, napi_value exports)
66 {
67     std::initializer_list<napi_property_descriptor> properties = {
68         DECLARE_NAPI_FUNCTION(FUNCTION_CREATE_WEB_SOCKET, CreateWebSocket),
69     };
70     NapiUtils::DefineProperties(env, exports, properties);
71 }
72 
FinalizeWebSocketInstance(napi_env env,void * data,void * hint)73 void WebSocketModule::FinalizeWebSocketInstance(napi_env env, void *data, void *hint)
74 {
75     NETSTACK_LOGI("websocket handle is finalized");
76     auto sharedManager = reinterpret_cast<std::shared_ptr<EventManager> *>(data);
77     delete sharedManager;
78 }
79 
Connect(napi_env env,napi_callback_info info)80 napi_value WebSocketModule::WebSocket::Connect(napi_env env, napi_callback_info info)
81 {
82     return ModuleTemplate::InterfaceWithSharedManager<ConnectContext>(
83         env, info, "WebSocketConnect",
84         [](napi_env, napi_value, ConnectContext *context) -> bool {
85             context->SetAtomicService(g_appIsAtomicService);
86             context->SetBundleName(g_appBundleName);
87             return true;
88         },
89         WebSocketAsyncWork::ExecConnect, WebSocketAsyncWork::ConnectCallback);
90 }
91 
Send(napi_env env,napi_callback_info info)92 napi_value WebSocketModule::WebSocket::Send(napi_env env, napi_callback_info info)
93 {
94     return ModuleTemplate::InterfaceWithSharedManager<SendContext>(
95         env, info, "WebSocketSend", nullptr, WebSocketAsyncWork::ExecSend, WebSocketAsyncWork::SendCallback);
96 }
97 
Close(napi_env env,napi_callback_info info)98 napi_value WebSocketModule::WebSocket::Close(napi_env env, napi_callback_info info)
99 {
100     return ModuleTemplate::InterfaceWithSharedManager<CloseContext>(
101         env, info, "WebSocketClose", nullptr, WebSocketAsyncWork::ExecClose, WebSocketAsyncWork::CloseCallback);
102 }
103 
On(napi_env env,napi_callback_info info)104 napi_value WebSocketModule::WebSocket::On(napi_env env, napi_callback_info info)
105 {
106     ModuleTemplate::OnSharedManager(env, info,
107                                     {EventName::EVENT_OPEN, EventName::EVENT_MESSAGE, EventName::EVENT_CLOSE}, true);
108     return ModuleTemplate::OnSharedManager(
109         env, info, {EventName::EVENT_ERROR, EventName::EVENT_HEADER_RECEIVE, EventName::EVENT_DATA_END}, false);
110 }
111 
Off(napi_env env,napi_callback_info info)112 napi_value WebSocketModule::WebSocket::Off(napi_env env, napi_callback_info info)
113 {
114     return ModuleTemplate::OffSharedManager(env, info,
115                                             {EventName::EVENT_OPEN, EventName::EVENT_MESSAGE, EventName::EVENT_CLOSE,
116                                              EventName::EVENT_ERROR, EventName::EVENT_DATA_END,
117                                              EventName::EVENT_HEADER_RECEIVE});
118 }
119 
120 static napi_module g_websocketModule = {
121     .nm_version = 1,
122     .nm_flags = 0,
123     .nm_filename = nullptr,
124     .nm_register_func = WebSocketModule::InitWebSocketModule,
125     .nm_modname = "net.webSocket",
126     .nm_priv = nullptr,
127     .reserved = {nullptr},
128 };
129 
RegisterWebSocketModule(void)130 extern "C" __attribute__((constructor)) void RegisterWebSocketModule(void)
131 {
132     napi_module_register(&g_websocketModule);
133 }
134 } // namespace OHOS::NetStack::Websocket
135