• 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 "websocket_async_work.h"
22 
23 namespace OHOS::NetStack {
InitWebSocketModule(napi_env env,napi_value exports)24 napi_value WebSocketModule::InitWebSocketModule(napi_env env, napi_value exports)
25 {
26     DefineWebSocketClass(env, exports);
27     InitWebSocketProperties(env, exports);
28 
29     return exports;
30 }
31 
CreateWebSocket(napi_env env,napi_callback_info info)32 napi_value WebSocketModule::CreateWebSocket(napi_env env, napi_callback_info info)
33 {
34     return ModuleTemplate::NewInstance(env, info, INTERFACE_WEB_SOCKET, FinalizeWebSocketInstance);
35 }
36 
DefineWebSocketClass(napi_env env,napi_value exports)37 void WebSocketModule::DefineWebSocketClass(napi_env env, napi_value exports)
38 {
39     std::initializer_list<napi_property_descriptor> properties = {
40         DECLARE_NAPI_FUNCTION(WebSocket::FUNCTION_CONNECT, WebSocket::Connect),
41         DECLARE_NAPI_FUNCTION(WebSocket::FUNCTION_SEND, WebSocket::Send),
42         DECLARE_NAPI_FUNCTION(WebSocket::FUNCTION_CLOSE, WebSocket::Close),
43         DECLARE_NAPI_FUNCTION(WebSocket::FUNCTION_ON, WebSocket::On),
44         DECLARE_NAPI_FUNCTION(WebSocket::FUNCTION_OFF, WebSocket::Off),
45     };
46     ModuleTemplate::DefineClass(env, exports, properties, INTERFACE_WEB_SOCKET);
47 }
48 
InitWebSocketProperties(napi_env env,napi_value exports)49 void WebSocketModule::InitWebSocketProperties(napi_env env, napi_value exports)
50 {
51     std::initializer_list<napi_property_descriptor> properties = {
52         DECLARE_NAPI_FUNCTION(FUNCTION_CREATE_WEB_SOCKET, CreateWebSocket),
53     };
54     NapiUtils::DefineProperties(env, exports, properties);
55 }
56 
FinalizeWebSocketInstance(napi_env env,void * data,void * hint)57 void WebSocketModule::FinalizeWebSocketInstance(napi_env env, void *data, void *hint)
58 {
59     NETSTACK_LOGI("websocket handle is finalized");
60     auto manager = reinterpret_cast<EventManager *>(data);
61     if (manager != nullptr) {
62         manager->SetInvalid();
63     }
64 }
65 
Connect(napi_env env,napi_callback_info info)66 napi_value WebSocketModule::WebSocket::Connect(napi_env env, napi_callback_info info)
67 {
68     return ModuleTemplate::Interface<ConnectContext>(
69         env, info, "WebSocketConnect", nullptr, WebSocketAsyncWork::ExecConnect, WebSocketAsyncWork::ConnectCallback);
70 }
71 
Send(napi_env env,napi_callback_info info)72 napi_value WebSocketModule::WebSocket::Send(napi_env env, napi_callback_info info)
73 {
74     return ModuleTemplate::Interface<SendContext>(env, info, "WebSocketSend", nullptr, WebSocketAsyncWork::ExecSend,
75                                                   WebSocketAsyncWork::SendCallback);
76 }
77 
Close(napi_env env,napi_callback_info info)78 napi_value WebSocketModule::WebSocket::Close(napi_env env, napi_callback_info info)
79 {
80     return ModuleTemplate::Interface<CloseContext>(env, info, "WebSocketClose", nullptr, WebSocketAsyncWork::ExecClose,
81                                                    WebSocketAsyncWork::CloseCallback);
82 }
83 
On(napi_env env,napi_callback_info info)84 napi_value WebSocketModule::WebSocket::On(napi_env env, napi_callback_info info)
85 {
86     ModuleTemplate::On(env, info, {EventName::EVENT_OPEN, EventName::EVENT_MESSAGE, EventName::EVENT_CLOSE}, true);
87     return ModuleTemplate::On(env, info, {EventName::EVENT_ERROR}, false);
88 }
89 
Off(napi_env env,napi_callback_info info)90 napi_value WebSocketModule::WebSocket::Off(napi_env env, napi_callback_info info)
91 {
92     return ModuleTemplate::Off(
93         env, info, {EventName::EVENT_OPEN, EventName::EVENT_MESSAGE, EventName::EVENT_CLOSE, EventName::EVENT_ERROR});
94 }
95 
96 static napi_module g_websocketModule = {
97     .nm_version = 1,
98     .nm_flags = 0,
99     .nm_filename = nullptr,
100     .nm_register_func = WebSocketModule::InitWebSocketModule,
101     .nm_modname = "net.webSocket",
102     .nm_priv = nullptr,
103     .reserved = {nullptr},
104 };
105 
RegisterWebSocketModule(void)106 extern "C" __attribute__((constructor)) void RegisterWebSocketModule(void)
107 {
108     napi_module_register(&g_websocketModule);
109 }
110 } // namespace OHOS::NetStack
111