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::Websocket {
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 EventManager::SetInvalid(manager);
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,
87 EventName::EVENT_DATA_END}, true);
88 return ModuleTemplate::On(env, info, {EventName::EVENT_ERROR}, false);
89 }
90
Off(napi_env env,napi_callback_info info)91 napi_value WebSocketModule::WebSocket::Off(napi_env env, napi_callback_info info)
92 {
93 return ModuleTemplate::Off(
94 env, info, {EventName::EVENT_OPEN, EventName::EVENT_MESSAGE, EventName::EVENT_CLOSE,
95 EventName::EVENT_ERROR, EventName::EVENT_DATA_END});
96 }
97
98 static napi_module g_websocketModule = {
99 .nm_version = 1,
100 .nm_flags = 0,
101 .nm_filename = nullptr,
102 .nm_register_func = WebSocketModule::InitWebSocketModule,
103 .nm_modname = "net.webSocket",
104 .nm_priv = nullptr,
105 .reserved = {nullptr},
106 };
107
RegisterWebSocketModule(void)108 extern "C" __attribute__((constructor)) void RegisterWebSocketModule(void)
109 {
110 napi_module_register(&g_websocketModule);
111 }
112 } // namespace OHOS::NetStack::Websocket
113