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