• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2023 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 "napi_utils.h"
17 #include "securec.h"
18 #include "avsession_log.h"
19 #include "av_session.h"
20 #include "napi_meta_data.h"
21 #include "napi_playback_state.h"
22 #include "napi_media_description.h"
23 #include "napi_queue_item.h"
24 #include "native_engine/native_value.h"
25 #include "native_engine/native_engine.h"
26 #include "extension_context.h"
27 #include "ability_context.h"
28 #include "napi_common_want.h"
29 #include "napi_media_info_holder.h"
30 
31 namespace OHOS::AVSession {
32 static constexpr int32_t STR_MAX_LENGTH = 4096;
33 static constexpr size_t STR_TAIL_LENGTH = 1;
34 
ConvertSessionType(const std::string & typeString)35 int32_t NapiUtils::ConvertSessionType(const std::string& typeString)
36 {
37     if (typeString == "audio") {
38         return AVSession::SESSION_TYPE_AUDIO;
39     } else if (typeString == "video") {
40         return AVSession::SESSION_TYPE_VIDEO;
41     } else {
42         return AVSession::SESSION_TYPE_INVALID;
43     }
44 }
45 
ConvertSessionType(int32_t type)46 std::string NapiUtils::ConvertSessionType(int32_t type)
47 {
48     if (type == AVSession::SESSION_TYPE_AUDIO) {
49         return "audio";
50     } else if (type == AVSession::SESSION_TYPE_VIDEO) {
51         return "video";
52     } else {
53         return "";
54     }
55 }
56 
57 /* napi_value <-> bool */
GetValue(napi_env env,napi_value in,bool & out)58 napi_status NapiUtils::GetValue(napi_env env, napi_value in, bool& out)
59 {
60     return napi_get_value_bool(env, in, &out);
61 }
62 
SetValue(napi_env env,const bool & in,napi_value & out)63 napi_status NapiUtils::SetValue(napi_env env, const bool& in, napi_value& out)
64 {
65     return napi_get_boolean(env, in, &out);
66 }
67 
68 /* napi_value <-> int32_t */
GetValue(napi_env env,napi_value in,int32_t & out)69 napi_status NapiUtils::GetValue(napi_env env, napi_value in, int32_t& out)
70 {
71     return napi_get_value_int32(env, in, &out);
72 }
73 
SetValue(napi_env env,const int32_t & in,napi_value & out)74 napi_status NapiUtils::SetValue(napi_env env, const int32_t& in, napi_value& out)
75 {
76     return napi_create_int32(env, in, &out);
77 }
78 
79 /* napi_value <-> uint32_t */
GetValue(napi_env env,napi_value in,uint32_t & out)80 napi_status NapiUtils::GetValue(napi_env env, napi_value in, uint32_t& out)
81 {
82     return napi_get_value_uint32(env, in, &out);
83 }
84 
SetValue(napi_env env,const uint32_t & in,napi_value & out)85 napi_status NapiUtils::SetValue(napi_env env, const uint32_t& in, napi_value& out)
86 {
87     return napi_create_uint32(env, in, &out);
88 }
89 
90 /* napi_value <-> int64_t */
GetValue(napi_env env,napi_value in,int64_t & out)91 napi_status NapiUtils::GetValue(napi_env env, napi_value in, int64_t& out)
92 {
93     return napi_get_value_int64(env, in, &out);
94 }
95 
SetValue(napi_env env,const int64_t & in,napi_value & out)96 napi_status NapiUtils::SetValue(napi_env env, const int64_t& in, napi_value& out)
97 {
98     return napi_create_int64(env, in, &out);
99 }
100 
101 /* napi_value <-> double */
GetValue(napi_env env,napi_value in,double & out)102 napi_status NapiUtils::GetValue(napi_env env, napi_value in, double& out)
103 {
104     return napi_get_value_double(env, in, &out);
105 }
106 
SetValue(napi_env env,const double & in,napi_value & out)107 napi_status NapiUtils::SetValue(napi_env env, const double& in, napi_value& out)
108 {
109     return napi_create_double(env, in, &out);
110 }
111 
112 /* napi_value <-> std::string */
GetValue(napi_env env,napi_value in,std::string & out)113 napi_status NapiUtils::GetValue(napi_env env, napi_value in, std::string& out)
114 {
115     napi_valuetype type = napi_undefined;
116     napi_status status = napi_typeof(env, in, &type);
117     CHECK_RETURN((status == napi_ok) && (type == napi_string), "invalid type", napi_invalid_arg);
118 
119     size_t maxLen = STR_MAX_LENGTH;
120     status = napi_get_value_string_utf8(env, in, nullptr, 0, &maxLen);
121     if (maxLen <= 0 || maxLen >= STR_MAX_LENGTH) {
122         return napi_invalid_arg;
123     }
124 
125     char buf[STR_MAX_LENGTH + STR_TAIL_LENGTH] {};
126     size_t len = 0;
127     status = napi_get_value_string_utf8(env, in, buf, maxLen + STR_TAIL_LENGTH, &len);
128     if (status == napi_ok) {
129         out = std::string(buf);
130     }
131     return status;
132 }
133 
SetValue(napi_env env,const std::string & in,napi_value & out)134 napi_status NapiUtils::SetValue(napi_env env, const std::string& in, napi_value& out)
135 {
136     return napi_create_string_utf8(env, in.c_str(), in.size(), &out);
137 }
138 
139 /* napi_value <-> AppExecFwk::ElementName */
SetValue(napi_env env,const AppExecFwk::ElementName & in,napi_value & out)140 napi_status NapiUtils::SetValue(napi_env env, const AppExecFwk::ElementName& in, napi_value& out)
141 {
142     napi_status status = napi_create_object(env, &out);
143     CHECK_RETURN((status == napi_ok) && (out != nullptr), "create object failed", status);
144 
145     napi_value property = nullptr;
146     status = SetValue(env, in.GetDeviceID(), property);
147     CHECK_RETURN((status == napi_ok) && (property != nullptr), "create property failed", status);
148     status = napi_set_named_property(env, out, "deviceId", property);
149     CHECK_RETURN(status == napi_ok, "napi_set_named_property failed", status);
150 
151     status = SetValue(env, in.GetBundleName(), property);
152     CHECK_RETURN((status == napi_ok) && (property != nullptr), "create property failed", status);
153     status = napi_set_named_property(env, out, "bundleName", property);
154     CHECK_RETURN(status == napi_ok, "napi_set_named_property failed", status);
155 
156     status = SetValue(env, in.GetAbilityName(), property);
157     CHECK_RETURN((status == napi_ok) && (property != nullptr), "create property failed", status);
158     status = napi_set_named_property(env, out, "abilityName", property);
159     CHECK_RETURN(status == napi_ok, "napi_set_named_property failed", status);
160 
161     return napi_ok;
162 }
163 
SetOutPutDeviceIdValue(napi_env env,const std::vector<std::string> & in,napi_value & out)164 napi_status NapiUtils::SetOutPutDeviceIdValue(napi_env env, const std::vector<std::string>& in, napi_value& out)
165 {
166     napi_status status = napi_create_array_with_length(env, in.size(), &out);
167     CHECK_RETURN(status == napi_ok, "create array failed!", status);
168     int index = 0;
169     for (auto& item : in) {
170         napi_value element = nullptr;
171         SetValue(env, static_cast<int32_t>(std::stoi(item)), element);
172         status = napi_set_element(env, out, index++, element);
173         CHECK_RETURN((status == napi_ok), "napi_set_element failed!", status);
174     }
175     return status;
176 }
177 
178 /* napi_value <-> AVSessionDescriptor */
SetValue(napi_env env,const AVSessionDescriptor & in,napi_value & out)179 napi_status NapiUtils::SetValue(napi_env env, const AVSessionDescriptor& in, napi_value& out)
180 {
181     napi_status status = napi_create_object(env, &out);
182     CHECK_RETURN((status == napi_ok) && (out != nullptr), "create object failed", status);
183 
184     napi_value property = nullptr;
185     status = SetValue(env, in.sessionId_, property);
186     CHECK_RETURN((status == napi_ok) && (property != nullptr), "create object failed", status);
187     status = napi_set_named_property(env, out, "sessionId", property);
188     CHECK_RETURN(status == napi_ok, "napi_set_named_property failed", status);
189 
190     status = SetValue(env, ConvertSessionType(in.sessionType_), property);
191     CHECK_RETURN((status == napi_ok) && (property != nullptr), "create object failed", status);
192     status = napi_set_named_property(env, out, "type", property);
193     CHECK_RETURN(status == napi_ok, "napi_set_named_property failed", status);
194 
195     status = SetValue(env, in.sessionTag_, property);
196     CHECK_RETURN((status == napi_ok) && (property != nullptr), "create object failed", status);
197     status = napi_set_named_property(env, out, "sessionTag", property);
198     CHECK_RETURN(status == napi_ok, "napi_set_named_property failed", status);
199 
200     status = SetValue(env, in.elementName_, property);
201     CHECK_RETURN((status == napi_ok) && (property != nullptr), "create object failed", status);
202     status = napi_set_named_property(env, out, "elementName", property);
203     CHECK_RETURN(status == napi_ok, "napi_set_named_property failed", status);
204 
205     status = SetValue(env, in.isActive_, property);
206     CHECK_RETURN((status == napi_ok) && (property != nullptr), "create object failed", status);
207     status = napi_set_named_property(env, out, "isActive", property);
208     CHECK_RETURN(status == napi_ok, "napi_set_named_property failed", status);
209 
210     status = SetValue(env, in.isTopSession_, property);
211     CHECK_RETURN((status == napi_ok) && (property != nullptr), "create object failed", status);
212     status = napi_set_named_property(env, out, "isTopSession", property);
213     CHECK_RETURN(status == napi_ok, "napi_set_named_property failed", status);
214 
215     status = SetValue(env, in.outputDeviceInfo_, property);
216     CHECK_RETURN((status == napi_ok) && (property != nullptr), "create object failed", status);
217     status = napi_set_named_property(env, out, "outputDevice", property);
218     CHECK_RETURN(status == napi_ok, "napi_set_named_property failed", status);
219 
220     return napi_ok;
221 }
222 
223 /* napi_value <-> MMI::KeyEvent::KeyItem */
GetValue(napi_env env,napi_value in,MMI::KeyEvent::KeyItem & out)224 napi_status NapiUtils::GetValue(napi_env env, napi_value in, MMI::KeyEvent::KeyItem& out)
225 {
226     int32_t code {};
227     auto status = GetNamedProperty(env, in, "code", code);
228     CHECK_RETURN(status == napi_ok, "get code property failed", status);
229     SLOGI("code=%{public}d", code);
230     out.SetKeyCode(code);
231 
232     int64_t pressedTime {};
233     status = GetNamedProperty(env, in, "pressedTime", pressedTime);
234     CHECK_RETURN(status == napi_ok, "get pressedTime property failed", status);
235     SLOGI("pressedTime=%{public}" PRIu64, pressedTime);
236     out.SetDownTime(pressedTime);
237 
238     int32_t deviceId {};
239     status = GetNamedProperty(env, in, "deviceId", deviceId);
240     CHECK_RETURN(status == napi_ok, "get deviceId property failed", status);
241     SLOGI("deviceId=%{public}d", deviceId);
242     out.SetDeviceId(deviceId);
243     out.SetPressed(true);
244 
245     return status;
246 }
247 
SetValue(napi_env env,const std::optional<MMI::KeyEvent::KeyItem> in,napi_value & out)248 napi_status NapiUtils::SetValue(napi_env env, const std::optional<MMI::KeyEvent::KeyItem> in, napi_value& out)
249 {
250     auto status = napi_create_object(env, &out);
251     CHECK_RETURN(status == napi_ok, "create object failed", status);
252 
253     napi_value code {};
254     status = SetValue(env, in->GetKeyCode(), code);
255     CHECK_RETURN(status == napi_ok, "create property failed", status);
256     status = napi_set_named_property(env, out, "code", code);
257     CHECK_RETURN(status == napi_ok, "set property failed", status);
258 
259     napi_value pressedTime {};
260     status = SetValue(env, in->GetDownTime(), pressedTime);
261     CHECK_RETURN(status == napi_ok, "create property failed", status);
262     status = napi_set_named_property(env, out, "pressedTime", pressedTime);
263     CHECK_RETURN(status == napi_ok, "set property failed", status);
264 
265     napi_value deviceId {};
266     status = SetValue(env, in->GetDeviceId(), deviceId);
267     CHECK_RETURN(status == napi_ok, "create property failed", status);
268     status = napi_set_named_property(env, out, "deviceId", deviceId);
269     CHECK_RETURN(status == napi_ok, "set property failed", status);
270 
271     return status;
272 }
273 
274 /* napi_value <-> MMI::KeyEvent */
GetValue(napi_env env,napi_value in,std::shared_ptr<MMI::KeyEvent> & out)275 napi_status NapiUtils::GetValue(napi_env env, napi_value in, std::shared_ptr<MMI::KeyEvent>& out)
276 {
277     napi_valuetype valueType = napi_undefined;
278     auto status = napi_typeof(env, in, &valueType);
279     CHECK_RETURN((status == napi_ok) && (valueType == napi_object), "object type invalid", status);
280 
281     out = MMI::KeyEvent::Create();
282     CHECK_RETURN(out != nullptr, "create keyEvent failed", napi_generic_failure);
283 
284     int32_t action {};
285     status = GetNamedProperty(env, in, "action", action);
286     CHECK_RETURN(status == napi_ok, "get action property failed", napi_generic_failure);
287     SLOGI("action=%{public}d", action);
288     action += KEYEVENT_ACTION_JS_NATIVE_DELTA;
289     out->SetKeyAction(action);
290 
291     MMI::KeyEvent::KeyItem key;
292     status = GetNamedProperty(env, in, "key", key);
293     CHECK_RETURN(status == napi_ok, "get action property failed", napi_generic_failure);
294     out->SetKeyCode(key.GetKeyCode());
295 
296     napi_value keyItems {};
297     status = napi_get_named_property(env, in, "keys", &keyItems);
298     CHECK_RETURN((status == napi_ok) && (keyItems != nullptr), "get keys property failed", status);
299 
300     uint32_t length {};
301     status = napi_get_array_length(env, keyItems, &length);
302     CHECK_RETURN(status == napi_ok, "get array length failed", status);
303 
304     for (uint32_t i = 0; i < length; ++i) {
305         napi_value keyItem {};
306         status = napi_get_element(env, keyItems, i, &keyItem);
307         CHECK_RETURN((status == napi_ok) && (keyItem != nullptr), "get element failed", status);
308         MMI::KeyEvent::KeyItem item;
309         status = GetValue(env, keyItem, item);
310         CHECK_RETURN(status == napi_ok, "get KeyItem failed", status);
311         if ((key.GetKeyCode() == item.GetKeyCode()) && (action == MMI::KeyEvent::KEY_ACTION_UP)) {
312             item.SetPressed(false);
313         }
314         out->AddKeyItem(item);
315     }
316 
317     return napi_ok;
318 }
319 
SetValue(napi_env env,const std::shared_ptr<MMI::KeyEvent> & in,napi_value & out)320 napi_status NapiUtils::SetValue(napi_env env, const std::shared_ptr<MMI::KeyEvent>& in, napi_value& out)
321 {
322     CHECK_RETURN(in != nullptr, "key event is nullptr", napi_generic_failure);
323 
324     auto status = napi_create_object(env, &out);
325     CHECK_RETURN(status == napi_ok, "create object failed", status);
326 
327     napi_value action {};
328     status = SetValue(env, in->GetKeyAction() - KEYEVENT_ACTION_JS_NATIVE_DELTA, action);
329     CHECK_RETURN(status == napi_ok, "create action property failed", status);
330     status = napi_set_named_property(env, out, "action", action);
331     CHECK_RETURN(status == napi_ok, "set action property failed", status);
332 
333     napi_value key {};
334     CHECK_RETURN(in->GetKeyItem(), "get key item failed", napi_generic_failure);
335     status = SetValue(env, in->GetKeyItem(), key);
336     CHECK_RETURN(status == napi_ok, "create key property failed", status);
337     status = napi_set_named_property(env, out, "key", key);
338     CHECK_RETURN(status == napi_ok, "set key property failed", status);
339 
340     napi_value keys {};
341     status = napi_create_array(env, &keys);
342     CHECK_RETURN(status == napi_ok, "create array failed", status);
343 
344     uint32_t idx = 0;
345     std::vector<MMI::KeyEvent::KeyItem> keyItems = in->GetKeyItems();
346     for (const auto& keyItem : keyItems) {
347         napi_value item {};
348         status = SetValue(env, keyItem, item);
349         CHECK_RETURN(status == napi_ok, "create keyItem failed", status);
350 
351         status = napi_set_element(env, keys, idx, item);
352         CHECK_RETURN(status == napi_ok, "set element failed", status);
353         ++idx;
354     }
355 
356     status = napi_set_named_property(env, out, "keys", keys);
357     CHECK_RETURN(status == napi_ok, "set keys property failed", status);
358     return status;
359 }
360 
361 /* napi_value <-> AbilityRuntime::WantAgent::WantAgent */
GetValue(napi_env env,napi_value in,AbilityRuntime::WantAgent::WantAgent * & out)362 napi_status NapiUtils::GetValue(napi_env env, napi_value in, AbilityRuntime::WantAgent::WantAgent*& out)
363 {
364     auto status = napi_unwrap(env, in, reinterpret_cast<void**>(&out));
365     CHECK_RETURN(status == napi_ok, "unwrap failed", napi_invalid_arg);
366     return status;
367 }
368 
SetValue(napi_env env,AbilityRuntime::WantAgent::WantAgent & in,napi_value & out)369 napi_status NapiUtils::SetValue(napi_env env, AbilityRuntime::WantAgent::WantAgent& in, napi_value& out)
370 {
371     auto status = napi_create_object(env, &out);
372     CHECK_RETURN(status == napi_ok, "create object failed", napi_generic_failure);
373     auto finalizecb = [](napi_env env, void* data, void* hint) {};
374     status = napi_wrap(env, out, static_cast<void*>(&in), finalizecb, nullptr, nullptr);
375     CHECK_RETURN(status == napi_ok, "wrap object failed", napi_generic_failure);
376     return status;
377 }
378 
379 /* napi_value <-> AAFwk::WantParams */
GetValue(napi_env env,napi_value in,AAFwk::WantParams & out)380 napi_status NapiUtils::GetValue(napi_env env, napi_value in, AAFwk::WantParams& out)
381 {
382     auto status = AppExecFwk::UnwrapWantParams(env, in, out);
383     CHECK_RETURN(status == true, "unwrap object failed", napi_generic_failure);
384     return napi_ok;
385 }
386 
SetValue(napi_env env,const AAFwk::WantParams & in,napi_value & out)387 napi_status NapiUtils::SetValue(napi_env env, const AAFwk::WantParams& in, napi_value& out)
388 {
389     auto status = napi_create_object(env, &out);
390     CHECK_RETURN(status == napi_ok, "create object failed", napi_generic_failure);
391     out = AppExecFwk::WrapWantParams(env, in);
392     return status;
393 }
394 
395 /* napi_value <-> AVMetaData */
GetValue(napi_env env,napi_value in,AVMetaData & out)396 napi_status NapiUtils::GetValue(napi_env env, napi_value in, AVMetaData& out)
397 {
398     return NapiMetaData::GetValue(env, in, out);
399 }
400 
SetValue(napi_env env,const AVMetaData & in,napi_value & out)401 napi_status NapiUtils::SetValue(napi_env env, const AVMetaData& in, napi_value& out)
402 {
403     return NapiMetaData::SetValue(env, in, out);
404 }
405 
406 /* napi_value <-> AVMediaDescription */
GetValue(napi_env env,napi_value in,AVMediaDescription & out)407 napi_status NapiUtils::GetValue(napi_env env, napi_value in, AVMediaDescription& out)
408 {
409     return NapiMediaDescription::GetValue(env, in, out);
410 }
411 
SetValue(napi_env env,const AVMediaDescription & in,napi_value & out)412 napi_status NapiUtils::SetValue(napi_env env, const AVMediaDescription& in, napi_value& out)
413 {
414     return NapiMediaDescription::SetValue(env, in, out);
415 }
416 
417 /* napi_value <-> AVQueueItem */
GetValue(napi_env env,napi_value in,AVQueueItem & out)418 napi_status NapiUtils::GetValue(napi_env env, napi_value in, AVQueueItem& out)
419 {
420     return NapiQueueItem::GetValue(env, in, out);
421 }
422 
SetValue(napi_env env,const AVQueueItem & in,napi_value & out)423 napi_status NapiUtils::SetValue(napi_env env, const AVQueueItem& in, napi_value& out)
424 {
425     return NapiQueueItem::SetValue(env, in, out);
426 }
427 
428 /* napi_value <-> std::vector<AVQueueItem> */
GetValue(napi_env env,napi_value in,std::vector<AVQueueItem> & out)429 napi_status NapiUtils::GetValue(napi_env env, napi_value in, std::vector<AVQueueItem>& out)
430 {
431     uint32_t length {};
432     auto status = napi_get_array_length(env, in, &length);
433     CHECK_RETURN(status == napi_ok, "get AVQueueItem array length failed", status);
434     for (uint32_t i = 0; i < length; ++i) {
435         napi_value element {};
436         status = napi_get_element(env, in, i, &element);
437         CHECK_RETURN((status == napi_ok) && (element != nullptr), "get element failed", status);
438         AVQueueItem descriptor;
439         status = GetValue(env, element, descriptor);
440         out.push_back(descriptor);
441     }
442     return status;
443 }
444 
SetValue(napi_env env,const std::vector<AVQueueItem> & in,napi_value & out)445 napi_status NapiUtils::SetValue(napi_env env, const std::vector<AVQueueItem>& in, napi_value& out)
446 {
447     SLOGD("napi_value <- std::vector<std::string>");
448     napi_status status = napi_create_array_with_length(env, in.size(), &out);
449     CHECK_RETURN(status == napi_ok, "create AVQueueItem array failed!", status);
450     int index = 0;
451     for (auto& item : in) {
452         napi_value element = nullptr;
453         SetValue(env, item, element);
454         status = napi_set_element(env, out, index++, element);
455         CHECK_RETURN((status == napi_ok), "napi_set_element failed!", status);
456     }
457     return status;
458 }
459 
460 /* napi_value <-> AVPlaybackState */
GetValue(napi_env env,napi_value in,AVPlaybackState & out)461 napi_status NapiUtils::GetValue(napi_env env, napi_value in, AVPlaybackState& out)
462 {
463     return NapiPlaybackState::GetValue(env, in, out);
464 }
465 
SetValue(napi_env env,const AVPlaybackState & in,napi_value & out)466 napi_status NapiUtils::SetValue(napi_env env, const AVPlaybackState& in, napi_value& out)
467 {
468     return NapiPlaybackState::SetValue(env, in, out);
469 }
470 
471 /* napi_value <-> AVCastPlayerState */
GetValue(napi_env env,napi_value in,AVCastPlayerState & out)472 napi_status NapiUtils::GetValue(napi_env env, napi_value in, AVCastPlayerState& out)
473 {
474     napi_valuetype type = napi_undefined;
475     napi_status status = napi_typeof(env, in, &type);
476     CHECK_RETURN((status == napi_ok) && (type == napi_string), "invalid type", napi_invalid_arg);
477 
478     size_t maxLen = STR_MAX_LENGTH;
479     status = napi_get_value_string_utf8(env, in, nullptr, 0, &maxLen);
480     if (maxLen <= 0 || maxLen >= STR_MAX_LENGTH) {
481         return napi_invalid_arg;
482     }
483 
484     char buf[STR_MAX_LENGTH + STR_TAIL_LENGTH] {};
485     size_t len = 0;
486     status = napi_get_value_string_utf8(env, in, buf, maxLen + STR_TAIL_LENGTH, &len);
487     if (status == napi_ok) {
488         AVCastPlayerState castPlayerState;
489         castPlayerState.castPlayerState_ = std::string(buf);
490         out = castPlayerState;
491     }
492     return status;
493 }
494 
SetValue(napi_env env,const AVCastPlayerState & in,napi_value & out)495 napi_status NapiUtils::SetValue(napi_env env, const AVCastPlayerState& in, napi_value& out)
496 {
497     return napi_create_string_utf8(env, in.castPlayerState_.c_str(), in.castPlayerState_.size(), &out);
498 }
499 
500 /* napi_value <-> std::vector<std::string> */
GetValue(napi_env env,napi_value in,std::vector<std::string> & out)501 napi_status NapiUtils::GetValue(napi_env env, napi_value in, std::vector<std::string>& out)
502 {
503     SLOGD("napi_value -> std::vector<std::string>");
504     out.clear();
505     bool isArray = false;
506     napi_is_array(env, in, &isArray);
507     CHECK_RETURN(isArray, "not an array", napi_invalid_arg);
508 
509     uint32_t length = 0;
510     napi_status status = napi_get_array_length(env, in, &length);
511     CHECK_RETURN((status == napi_ok) && (length > 0), "get_array failed!", napi_invalid_arg);
512     for (uint32_t i = 0; i < length; ++i) {
513         napi_value item = nullptr;
514         status = napi_get_element(env, in, i, &item);
515         CHECK_RETURN((item != nullptr) && (status == napi_ok), "no element", napi_invalid_arg);
516         std::string value;
517         status = GetValue(env, item, value);
518         CHECK_RETURN(status == napi_ok, "not a string", napi_invalid_arg);
519         out.push_back(value);
520     }
521     return status;
522 }
523 
SetValue(napi_env env,const std::vector<std::string> & in,napi_value & out)524 napi_status NapiUtils::SetValue(napi_env env, const std::vector<std::string>& in, napi_value& out)
525 {
526     SLOGD("napi_value <- std::vector<std::string>");
527     napi_status status = napi_create_array_with_length(env, in.size(), &out);
528     CHECK_RETURN(status == napi_ok, "create array failed!", status);
529     int index = 0;
530     for (auto& item : in) {
531         napi_value element = nullptr;
532         SetValue(env, item, element);
533         status = napi_set_element(env, out, index++, element);
534         CHECK_RETURN((status == napi_ok), "napi_set_element failed!", status);
535     }
536     return status;
537 }
538 
539 /* napi_value <-> std::vector<uint8_t> */
GetValue(napi_env env,napi_value in,std::vector<uint8_t> & out)540 napi_status NapiUtils::GetValue(napi_env env, napi_value in, std::vector<uint8_t>& out)
541 {
542     out.clear();
543     SLOGD("napi_value -> std::vector<uint8_t> ");
544     napi_typedarray_type type = napi_biguint64_array;
545     size_t length = 0;
546     napi_value buffer = nullptr;
547     size_t offset = 0;
548     void* data = nullptr;
549     napi_status status = napi_get_typedarray_info(env, in, &type, &length, &data, &buffer, &offset);
550     SLOGD("array type=%{public}d length=%{public}d offset=%{public}d", static_cast<int>(type), static_cast<int>(length),
551           static_cast<int>(offset));
552     CHECK_RETURN(status == napi_ok, "napi_get_typedarray_info failed!", napi_invalid_arg);
553     CHECK_RETURN(type == napi_uint8_array, "is not Uint8Array!", napi_invalid_arg);
554     CHECK_RETURN((length > 0) && (data != nullptr), "invalid data!", napi_invalid_arg);
555     out.assign(static_cast<uint8_t*>(data), static_cast<uint8_t*>(data) + length);
556     return status;
557 }
558 
SetValue(napi_env env,const std::vector<uint8_t> & in,napi_value & out)559 napi_status NapiUtils::SetValue(napi_env env, const std::vector<uint8_t>& in, napi_value& out)
560 {
561     SLOGD("napi_value <- std::vector<uint8_t> ");
562     CHECK_RETURN(!in.empty(), "invalid std::vector<uint8_t>", napi_invalid_arg);
563     void* data = nullptr;
564     napi_value buffer = nullptr;
565     napi_status status = napi_create_arraybuffer(env, in.size(), &data, &buffer);
566     CHECK_RETURN((status == napi_ok), "create array buffer failed!", status);
567 
568     if (memcpy_s(data, in.size(), in.data(), in.size()) != EOK) {
569         SLOGE("memcpy_s not EOK");
570         return napi_invalid_arg;
571     }
572     status = napi_create_typedarray(env, napi_uint8_array, in.size(), buffer, 0, &out);
573     CHECK_RETURN((status == napi_ok), "napi_value <- std::vector<uint8_t> invalid value", status);
574     return status;
575 }
576 
577 template <typename T>
TypedArray2Vector(uint8_t * data,size_t length,napi_typedarray_type type,std::vector<T> & out)578 void TypedArray2Vector(uint8_t* data, size_t length, napi_typedarray_type type, std::vector<T>& out)
579 {
580     auto convert = [&out](auto* data, size_t elements) {
581         for (size_t index = 0; index < elements; index++) {
582             out.push_back(static_cast<T>(data[index]));
583         }
584     };
585 
586     switch (type) {
587         case napi_int8_array:
588             convert(reinterpret_cast<int8_t*>(data), length);
589             break;
590         case napi_uint8_array:
591             convert(data, length);
592             break;
593         case napi_uint8_clamped_array:
594             convert(data, length);
595             break;
596         case napi_int16_array:
597             convert(reinterpret_cast<int16_t*>(data), length / sizeof(int16_t));
598             break;
599         case napi_uint16_array:
600             convert(reinterpret_cast<uint16_t*>(data), length / sizeof(uint16_t));
601             break;
602         case napi_int32_array:
603             convert(reinterpret_cast<int32_t*>(data), length / sizeof(int32_t));
604             break;
605         case napi_uint32_array:
606             convert(reinterpret_cast<uint32_t*>(data), length / sizeof(uint32_t));
607             break;
608         case napi_float32_array:
609             convert(reinterpret_cast<float*>(data), length / sizeof(float));
610             break;
611         case napi_float64_array:
612             convert(reinterpret_cast<double*>(data), length / sizeof(double));
613             break;
614         case napi_bigint64_array:
615             convert(reinterpret_cast<int64_t*>(data), length / sizeof(int64_t));
616             break;
617         case napi_biguint64_array:
618             convert(reinterpret_cast<uint64_t*>(data), length / sizeof(uint64_t));
619             break;
620         default:
621             CHECK_RETURN_VOID(false, "[FATAL] invalid napi_typedarray_type!");
622     }
623 }
624 
625 /* napi_value <-> std::vector<int32_t> */
GetValue(napi_env env,napi_value in,std::vector<int32_t> & out)626 napi_status NapiUtils::GetValue(napi_env env, napi_value in, std::vector<int32_t>& out)
627 {
628     out.clear();
629     SLOGD("napi_value -> std::vector<int32_t> ");
630     napi_typedarray_type type = napi_biguint64_array;
631     size_t length = 0;
632     napi_value buffer = nullptr;
633     size_t offset = 0;
634     uint8_t* data = nullptr;
635     napi_status status = napi_get_typedarray_info(env, in, &type, &length,
636                                                   reinterpret_cast<void**>(&data), &buffer, &offset);
637     SLOGD("array type=%{public}d length=%{public}d offset=%{public}d", static_cast<int>(type), static_cast<int>(length),
638           static_cast<int>(offset));
639     CHECK_RETURN(status == napi_ok, "napi_get_typedarray_info failed!", napi_invalid_arg);
640     CHECK_RETURN(type <= napi_int32_array, "is not int32 supported typed array!", napi_invalid_arg);
641     CHECK_RETURN((length > 0) && (data != nullptr), "invalid data!", napi_invalid_arg);
642     TypedArray2Vector<int32_t>(data, length, type, out);
643     return status;
644 }
645 
SetValue(napi_env env,const std::vector<int32_t> & in,napi_value & out)646 napi_status NapiUtils::SetValue(napi_env env, const std::vector<int32_t>& in, napi_value& out)
647 {
648     SLOGD("napi_value <- std::vector<int32_t> ");
649     size_t bytes = in.size() * sizeof(int32_t);
650     CHECK_RETURN(bytes > 0, "invalid std::vector<int32_t>", napi_invalid_arg);
651     void* data = nullptr;
652     napi_value buffer = nullptr;
653     napi_status status = napi_create_arraybuffer(env, bytes, &data, &buffer);
654     CHECK_RETURN((status == napi_ok), "invalid buffer", status);
655 
656     if (memcpy_s(data, bytes, in.data(), bytes) != EOK) {
657         SLOGE("memcpy_s not EOK");
658         return napi_invalid_arg;
659     }
660     status = napi_create_typedarray(env, napi_int32_array, in.size(), buffer, 0, &out);
661     CHECK_RETURN((status == napi_ok), "invalid buffer", status);
662     return status;
663 }
664 
665 /* napi_value <-> std::vector<uint32_t> */
GetValue(napi_env env,napi_value in,std::vector<uint32_t> & out)666 napi_status NapiUtils::GetValue(napi_env env, napi_value in, std::vector<uint32_t>& out)
667 {
668     out.clear();
669     SLOGD("napi_value -> std::vector<uint32_t> ");
670     napi_typedarray_type type = napi_biguint64_array;
671     size_t length = 0;
672     napi_value buffer = nullptr;
673     size_t offset = 0;
674     uint8_t* data = nullptr;
675     napi_status status = napi_get_typedarray_info(env, in, &type, &length,
676                                                   reinterpret_cast<void**>(&data), &buffer, &offset);
677     SLOGD("napi_get_typedarray_info type=%{public}d", static_cast<int>(type));
678     CHECK_RETURN(status == napi_ok, "napi_get_typedarray_info failed!", napi_invalid_arg);
679     CHECK_RETURN((type <= napi_uint16_array) || (type == napi_uint32_array), "invalid type!", napi_invalid_arg);
680     CHECK_RETURN((length > 0) && (data != nullptr), "invalid data!", napi_invalid_arg);
681     TypedArray2Vector<uint32_t>(data, length, type, out);
682     return status;
683 }
684 
SetValue(napi_env env,const std::vector<uint32_t> & in,napi_value & out)685 napi_status NapiUtils::SetValue(napi_env env, const std::vector<uint32_t>& in, napi_value& out)
686 {
687     SLOGD("napi_value <- std::vector<uint32_t> ");
688     size_t bytes = in.size() * sizeof(uint32_t);
689     CHECK_RETURN(bytes > 0, "invalid std::vector<uint32_t>", napi_invalid_arg);
690     void* data = nullptr;
691     napi_value buffer = nullptr;
692     napi_status status = napi_create_arraybuffer(env, bytes, &data, &buffer);
693     CHECK_RETURN((status == napi_ok), "invalid buffer", status);
694 
695     if (memcpy_s(data, bytes, in.data(), bytes) != EOK) {
696         SLOGE("memcpy_s not EOK");
697         return napi_invalid_arg;
698     }
699     status = napi_create_typedarray(env, napi_uint32_array, in.size(), buffer, 0, &out);
700     CHECK_RETURN((status == napi_ok), "invalid buffer", status);
701     return status;
702 }
703 
704 /* napi_value <-> std::vector<int64_t> */
GetValue(napi_env env,napi_value in,std::vector<int64_t> & out)705 napi_status NapiUtils::GetValue(napi_env env, napi_value in, std::vector<int64_t>& out)
706 {
707     out.clear();
708     SLOGD("napi_value -> std::vector<int64_t> ");
709     napi_typedarray_type type = napi_biguint64_array;
710     size_t length = 0;
711     napi_value buffer = nullptr;
712     size_t offset = 0;
713     uint8_t* data = nullptr;
714     napi_status status = napi_get_typedarray_info(env, in, &type, &length,
715                                                   reinterpret_cast<void**>(&data), &buffer, &offset);
716     SLOGD("array type=%{public}d length=%{public}d offset=%{public}d", static_cast<int>(type), static_cast<int>(length),
717           static_cast<int>(offset));
718     CHECK_RETURN(status == napi_ok, "napi_get_typedarray_info failed!", napi_invalid_arg);
719     CHECK_RETURN((type <= napi_uint32_array) || (type == napi_bigint64_array), "invalid type!", napi_invalid_arg);
720     CHECK_RETURN((length > 0) && (data != nullptr), "invalid data!", napi_invalid_arg);
721     TypedArray2Vector<int64_t>(data, length, type, out);
722     return status;
723 }
724 
SetValue(napi_env env,const std::vector<int64_t> & in,napi_value & out)725 napi_status NapiUtils::SetValue(napi_env env, const std::vector<int64_t>& in, napi_value& out)
726 {
727     SLOGD("napi_value <- std::vector<int64_t> ");
728     size_t bytes = in.size() * sizeof(int64_t);
729     CHECK_RETURN(bytes > 0, "invalid std::vector<uint32_t>", napi_invalid_arg);
730     void* data = nullptr;
731     napi_value buffer = nullptr;
732     napi_status status = napi_create_arraybuffer(env, bytes, &data, &buffer);
733     CHECK_RETURN((status == napi_ok), "invalid buffer", status);
734 
735     if (memcpy_s(data, bytes, in.data(), bytes) != EOK) {
736         SLOGE("memcpy_s not EOK");
737         return napi_invalid_arg;
738     }
739     status = napi_create_typedarray(env, napi_bigint64_array, in.size(), buffer, 0, &out);
740     CHECK_RETURN((status == napi_ok), "invalid buffer", status);
741     return status;
742 }
743 /* napi_value <-> std::vector<double> */
GetValue(napi_env env,napi_value in,std::vector<double> & out)744 napi_status NapiUtils::GetValue(napi_env env, napi_value in, std::vector<double>& out)
745 {
746     out.clear();
747     bool isTypedArray = false;
748     napi_status status = napi_is_typedarray(env, in, &isTypedArray);
749     SLOGD("napi_value -> std::vector<double> input %{public}s a TypedArray", isTypedArray ? "is" : "is not");
750     CHECK_RETURN((status == napi_ok), "napi_is_typedarray failed!", status);
751     if (isTypedArray) {
752         SLOGD("napi_value -> std::vector<double> ");
753         napi_typedarray_type type = napi_biguint64_array;
754         size_t length = 0;
755         napi_value buffer = nullptr;
756         size_t offset = 0;
757         uint8_t* data = nullptr;
758         status = napi_get_typedarray_info(env, in, &type, &length, reinterpret_cast<void**>(&data), &buffer, &offset);
759         SLOGD("napi_get_typedarray_info status=%{public}d type=%{public}d", status, static_cast<int>(type));
760         CHECK_RETURN(status == napi_ok, "napi_get_typedarray_info failed!", napi_invalid_arg);
761         CHECK_RETURN((length > 0) && (data != nullptr), "invalid data!", napi_invalid_arg);
762         TypedArray2Vector<double>(data, length, type, out);
763     } else {
764         bool isArray = false;
765         status = napi_is_array(env, in, &isArray);
766         SLOGD("napi_value -> std::vector<double> input %{public}s an Array", isArray ? "is" : "is not");
767         CHECK_RETURN((status == napi_ok) && isArray, "invalid data!", napi_invalid_arg);
768         uint32_t length = 0;
769         status = napi_get_array_length(env, in, &length);
770         CHECK_RETURN((status == napi_ok) && (length > 0), "invalid data!", napi_invalid_arg);
771         for (uint32_t i = 0; i < length; ++i) {
772             napi_value item = nullptr;
773             status = napi_get_element(env, in, i, &item);
774             CHECK_RETURN((item != nullptr) && (status == napi_ok), "no element", napi_invalid_arg);
775             double vi = 0.0f;
776             status = napi_get_value_double(env, item, &vi);
777             CHECK_RETURN(status == napi_ok, "element not a double", napi_invalid_arg);
778             out.push_back(vi);
779         }
780     }
781     return status;
782 }
783 
SetValue(napi_env env,const std::vector<double> & in,napi_value & out)784 napi_status NapiUtils::SetValue(napi_env env, const std::vector<double>& in, napi_value& out)
785 {
786     SLOGD("napi_value <- std::vector<double> ");
787     (void)(env);
788     (void)(in);
789     (void)(out);
790     CHECK_RETURN(false, "std::vector<double> to napi_value, unsupported!", napi_invalid_arg);
791     return napi_invalid_arg;
792 }
793 
794 /* std::vector<AVSessionDescriptor> <-> napi_value */
SetValue(napi_env env,const std::vector<AVSessionDescriptor> & in,napi_value & out)795 napi_status NapiUtils::SetValue(napi_env env, const std::vector<AVSessionDescriptor>& in, napi_value& out)
796 {
797     SLOGD("napi_value <- std::vector<AVSessionDescriptor>  %{public}d", static_cast<int>(in.size()));
798     napi_status status = napi_create_array_with_length(env, in.size(), &out);
799     CHECK_RETURN((status == napi_ok), "create_array failed!", status);
800     int index = 0;
801     for (const auto& item : in) {
802         napi_value entry = nullptr;
803         SetValue(env, item, entry);
804         napi_set_element(env, out, index++, entry);
805     }
806     return status;
807 }
808 
809 /* napi_value <-> DeviceInfo */
SetValue(napi_env env,const DeviceInfo & in,napi_value & out)810 napi_status NapiUtils::SetValue(napi_env env, const DeviceInfo& in, napi_value& out)
811 {
812     napi_status status = napi_create_object(env, &out);
813     CHECK_RETURN((status == napi_ok) && (out != nullptr), "create object failed", status);
814 
815     napi_value property = nullptr;
816     status = SetValue(env, in.castCategory_, property);
817     CHECK_RETURN((status == napi_ok) && (property != nullptr), "create object failed", status);
818     status = napi_set_named_property(env, out, "castCategory", property);
819     CHECK_RETURN(status == napi_ok, "napi_set_named_property failed", status);
820 
821     status = SetValue(env, in.deviceId_, property);
822     CHECK_RETURN((status == napi_ok) && (property != nullptr), "create object failed", status);
823     status = napi_set_named_property(env, out, "deviceId", property);
824     CHECK_RETURN(status == napi_ok, "napi_set_named_property failed", status);
825 
826     status = SetValue(env, in.deviceName_, property);
827     CHECK_RETURN((status == napi_ok) && (property != nullptr), "create object failed", status);
828     status = napi_set_named_property(env, out, "deviceName", property);
829     CHECK_RETURN(status == napi_ok, "napi_set_named_property failed", status);
830 
831     status = SetValue(env, in.deviceType_, property);
832     CHECK_RETURN((status == napi_ok) && (property != nullptr), "create object failed", status);
833     status = napi_set_named_property(env, out, "deviceType", property);
834     CHECK_RETURN(status == napi_ok, "napi_set_named_property failed", status);
835 
836     status = SetValue(env, in.ipAddress_, property);
837     CHECK_RETURN((status == napi_ok) && (property != nullptr), "create object failed", status);
838     status = napi_set_named_property(env, out, "ipAddress", property);
839     CHECK_RETURN(status == napi_ok, "napi_set_named_property failed", status);
840 
841     status = SetValue(env, in.providerId_, property);
842     CHECK_RETURN((status == napi_ok) && (property != nullptr), "create object failed", status);
843     status = napi_set_named_property(env, out, "providerId", property);
844     CHECK_RETURN(status == napi_ok, "napi_set_named_property failed", status);
845 
846     return napi_ok;
847 }
848 
849 /* OutputDeviceInfo <-> napi_value */
SetValue(napi_env env,const OutputDeviceInfo & in,napi_value & out)850 napi_status NapiUtils::SetValue(napi_env env, const OutputDeviceInfo& in, napi_value& out)
851 {
852     SLOGD("napi_value <- OutputDeviceInfo");
853     napi_value temp {};
854     napi_create_object(env, &out);
855 
856     napi_status status = napi_create_array_with_length(env, in.deviceInfos_.size(), &temp);
857     CHECK_RETURN((status == napi_ok), "create_array failed!", status);
858     int index = 0;
859     SLOGD("The length of deviceInfos is %{public}d", static_cast<int32_t>(in.deviceInfos_.size()));
860     for (const auto& item : in.deviceInfos_) {
861         napi_value entry = nullptr;
862         status = SetValue(env, item, entry);
863         CHECK_RETURN((status == napi_ok), "create array failed!", status);
864         napi_set_element(env, temp, index++, entry);
865     }
866     status = napi_set_named_property(env, out, "devices", temp);
867     CHECK_RETURN((status == napi_ok), "set named property devices failed", status);
868     return status;
869 }
870 
Unwrap(napi_env env,napi_value in,void ** out,napi_value constructor)871 napi_status NapiUtils::Unwrap(napi_env env, napi_value in, void** out, napi_value constructor)
872 {
873     if (constructor != nullptr) {
874         bool isInstance = false;
875         napi_instanceof(env, in, constructor, &isInstance);
876         if (!isInstance) {
877             SLOGE("not a instance of *");
878             return napi_invalid_arg;
879         }
880     }
881     return napi_unwrap(env, in, out);
882 }
883 
Equals(napi_env env,napi_value value,napi_ref copy)884 bool NapiUtils::Equals(napi_env env, napi_value value, napi_ref copy)
885 {
886     if (copy == nullptr) {
887         return (value == nullptr);
888     }
889 
890     napi_value copyValue = nullptr;
891     napi_get_reference_value(env, copy, &copyValue);
892     CHECK_RETURN((napi_get_reference_value(env, copy, &copyValue) == napi_ok),
893                  "get ref value failed", napi_generic_failure);
894     bool isEquals = false;
895     CHECK_RETURN(napi_strict_equals(env, value, copyValue, &isEquals) == napi_ok,
896                  "get equals result failed", napi_generic_failure);
897     return isEquals;
898 }
899 
TypeCheck(napi_env env,napi_value value,napi_valuetype expectType)900 bool NapiUtils::TypeCheck(napi_env env, napi_value value, napi_valuetype expectType)
901 {
902     napi_valuetype valueType = napi_undefined;
903     napi_status status = napi_typeof(env, value, &valueType);
904     if (status != napi_ok || valueType != expectType) {
905         return false;
906     }
907     return true;
908 }
909 
GetUndefinedValue(napi_env env)910 napi_value NapiUtils::GetUndefinedValue(napi_env env)
911 {
912     napi_value result {};
913     napi_get_undefined(env, &result);
914     return result;
915 }
916 
GetPropertyNames(napi_env env,napi_value in,std::vector<std::string> & out)917 napi_status NapiUtils::GetPropertyNames(napi_env env, napi_value in, std::vector<std::string>& out)
918 {
919     napi_value names {};
920     NAPI_CALL_BASE(env, napi_get_property_names(env, in, &names), napi_generic_failure);
921     uint32_t length = 0;
922     NAPI_CALL_BASE(env, napi_get_array_length(env, names, &length), napi_generic_failure);
923 
924     for (uint32_t index = 0; index < length; ++index) {
925         napi_value name {};
926         std::string nameString;
927         if (napi_get_element(env, names, index, &name) != napi_ok) {
928             continue;
929         }
930         if (GetValue(env, name, nameString) != napi_ok) {
931             continue;
932         }
933         out.push_back(nameString);
934     }
935 
936     return napi_ok;
937 }
938 
GetDateValue(napi_env env,napi_value value,double & result)939 napi_status NapiUtils::GetDateValue(napi_env env, napi_value value, double& result)
940 {
941     CHECK_RETURN(env != nullptr, "env is nullptr", napi_invalid_arg);
942     CHECK_RETURN(value != nullptr, "value is nullptr", napi_invalid_arg);
943 
944     auto engine = reinterpret_cast<NativeEngine*>(env);
945     auto nativeValue = reinterpret_cast<NativeValue*>(value);
946     auto isDate = nativeValue->IsDate();
947     if (isDate) {
948         auto nativeDate = reinterpret_cast<NativeDate*>(nativeValue->GetInterface(NativeDate::INTERFACE_ID));
949         result = nativeDate->GetTime();
950         engine->ClearLastError();
951         return napi_ok;
952     } else {
953         SLOGE("value is not date type");
954         return napi_date_expected;
955     }
956 }
957 
SetDateValue(napi_env env,double time,napi_value & result)958 napi_status NapiUtils::SetDateValue(napi_env env, double time, napi_value& result)
959 {
960     CHECK_RETURN(env != nullptr, "env is nullptr", napi_invalid_arg);
961 
962     auto engine = reinterpret_cast<NativeEngine*>(env);
963     auto resultValue = engine->CreateDate(time);
964     result = reinterpret_cast<napi_value>(resultValue);
965     engine->ClearLastError();
966     return napi_ok;
967 }
968 
GetRefByCallback(napi_env env,std::list<napi_ref> callbackList,napi_value callback,napi_ref & callbackRef)969 napi_status NapiUtils::GetRefByCallback(napi_env env, std::list<napi_ref> callbackList, napi_value callback,
970                                         napi_ref& callbackRef)
971 {
972     for (auto ref = callbackList.begin(); ref != callbackList.end(); ++ref) {
973         if (Equals(env, callback, *ref)) {
974             SLOGD("Callback has been matched");
975             callbackRef = *ref;
976             break;
977         }
978     }
979     return napi_ok;
980 }
981 
982 /* napi_value is napi stage context */
GetStageElementName(napi_env env,napi_value in,AppExecFwk::ElementName & out)983 napi_status NapiUtils::GetStageElementName(napi_env env, napi_value in, AppExecFwk::ElementName& out)
984 {
985     std::shared_ptr<AbilityRuntime::Context> stageContext = AbilityRuntime::GetStageModeContext(env, in);
986     CHECK_RETURN(stageContext != nullptr, "get StagContext failed", napi_generic_failure);
987     std::shared_ptr <AppExecFwk::AbilityInfo> abilityInfo;
988     auto abilityContext = AbilityRuntime::Context::ConvertTo<AbilityRuntime::AbilityContext>(stageContext);
989     if (abilityContext != nullptr) {
990         abilityInfo = abilityContext->GetAbilityInfo();
991     } else {
992         auto extensionContext = AbilityRuntime::Context::ConvertTo<AbilityRuntime::ExtensionContext>(stageContext);
993         CHECK_RETURN(extensionContext != nullptr, "context ConvertTo AbilityContext and ExtensionContext fail",
994                      napi_generic_failure);
995         abilityInfo = extensionContext->GetAbilityInfo();
996     }
997     out.SetBundleName(abilityInfo->bundleName);
998     out.SetAbilityName(abilityInfo->name);
999     return napi_ok;
1000 }
1001 
GetFaElementName(napi_env env,AppExecFwk::ElementName & out)1002 napi_status NapiUtils::GetFaElementName(napi_env env, AppExecFwk::ElementName& out)
1003 {
1004     auto* ability = AbilityRuntime::GetCurrentAbility(env);
1005     CHECK_RETURN(ability != nullptr, "get feature ability failed", napi_generic_failure);
1006     auto want = ability->GetWant();
1007     CHECK_RETURN(want != nullptr, "get want failed", napi_generic_failure);
1008     out = want->GetElement();
1009     return napi_ok;
1010 }
1011 
GetValue(napi_env env,napi_value in,AppExecFwk::ElementName & out)1012 napi_status NapiUtils::GetValue(napi_env env, napi_value in, AppExecFwk::ElementName& out)
1013 {
1014     bool isStageMode = false;
1015     CHECK_RETURN(AbilityRuntime::IsStageContext(env, in, isStageMode) == napi_ok, "get context type failed",
1016                  napi_generic_failure);
1017     if (isStageMode) {
1018         CHECK_RETURN(GetStageElementName(env, in, out) == napi_ok, "get StagContext failed", napi_generic_failure);
1019     } else {
1020         CHECK_RETURN(GetFaElementName(env, out) == napi_ok, "get FaContext failed", napi_generic_failure);
1021     }
1022     return napi_ok;
1023 }
1024 
GetValue(napi_env env,napi_value in,SessionToken & out)1025 napi_status NapiUtils::GetValue(napi_env env, napi_value in, SessionToken& out)
1026 {
1027     napi_value value {};
1028     auto status = napi_get_named_property(env, in, "sessionId", &value);
1029     CHECK_RETURN(status == napi_ok, "get SessionToken sessionId failed", status);
1030     status = GetValue(env, value, out.sessionId);
1031     CHECK_RETURN(status == napi_ok, "get SessionToken sessionId value failed", status);
1032 
1033     bool hasPid = false;
1034     NAPI_CALL_BASE(env, napi_has_named_property(env, in, "pid", &hasPid), napi_invalid_arg);
1035     if (hasPid) {
1036         status = napi_get_named_property(env, in, "pid", &value);
1037         CHECK_RETURN(status == napi_ok, "get SessionToken pid failed", status);
1038         status = GetValue(env, value, out.pid);
1039         CHECK_RETURN(status == napi_ok, "get SessionToken pid value failed", status);
1040     } else {
1041         out.pid = 0;
1042     }
1043 
1044     bool hasUid = false;
1045     NAPI_CALL_BASE(env, napi_has_named_property(env, in, "uid", &hasUid), napi_invalid_arg);
1046     if (hasUid) {
1047         status = napi_get_named_property(env, in, "uid", &value);
1048         CHECK_RETURN(status == napi_ok, "get SessionToken uid failed", status);
1049         status = GetValue(env, value, out.pid);
1050         CHECK_RETURN(status == napi_ok, "get SessionToken uid value failed", status);
1051     } else {
1052         out.uid = 0;
1053     }
1054     return napi_ok;
1055 }
1056 
GetValue(napi_env env,napi_value in,AudioStandard::DeviceRole & out)1057 napi_status NapiUtils::GetValue(napi_env env, napi_value in, AudioStandard::DeviceRole& out)
1058 {
1059     int32_t deviceRole;
1060     auto status = GetValue(env, in, deviceRole);
1061     CHECK_RETURN(status == napi_ok, "get AudioDeviceDescriptor deviceRole failed", status);
1062     out = static_cast<AudioStandard::DeviceRole>(deviceRole);
1063     return napi_ok;
1064 }
1065 
GetValue(napi_env env,napi_value in,AudioStandard::DeviceType & out)1066 napi_status NapiUtils::GetValue(napi_env env, napi_value in, AudioStandard::DeviceType& out)
1067 {
1068     int32_t deviceType;
1069     auto status = GetValue(env, in, deviceType);
1070     CHECK_RETURN(status == napi_ok, "get AudioDeviceDescriptor deviceType failed", status);
1071     out = static_cast<AudioStandard::DeviceType>(deviceType);
1072     return napi_ok;
1073 }
1074 
GetSampleRate(napi_env env,napi_value in,AudioStandard::AudioSamplingRate & out)1075 napi_status NapiUtils::GetSampleRate(napi_env env, napi_value in, AudioStandard::AudioSamplingRate& out)
1076 {
1077     napi_value value {};
1078     auto status = napi_get_named_property(env, in, "sampleRates", &value);
1079     uint32_t length {};
1080     napi_get_array_length(env, value, &length);
1081     CHECK_RETURN(status == napi_ok, "get array length failed", status);
1082     if (length > 0) {
1083         napi_value element {};
1084         status = napi_get_element(env, value, 0, &element);
1085         CHECK_RETURN((status == napi_ok) && (element != nullptr), "get element failed", status);
1086         int32_t samplingRate;
1087         status = GetValue(env, element, samplingRate);
1088         CHECK_RETURN(status == napi_ok, "get AudioDeviceDescriptor audioStreamInfo_ samplingRate value failed", status);
1089         out = static_cast<AudioStandard::AudioSamplingRate>(samplingRate);
1090     }
1091     return status;
1092 }
1093 
GetChannels(napi_env env,napi_value in,AudioStandard::AudioChannel & out)1094 napi_status NapiUtils::GetChannels(napi_env env, napi_value in, AudioStandard::AudioChannel& out)
1095 {
1096     napi_value value {};
1097     auto status = napi_get_named_property(env, in, "channelCounts", &value);
1098     uint32_t length {};
1099     napi_get_array_length(env, value, &length);
1100     CHECK_RETURN(status == napi_ok, "get array length failed", status);
1101     if (length > 0) {
1102         napi_value element {};
1103         status = napi_get_element(env, value, 0, &element);
1104         CHECK_RETURN((status == napi_ok) && (element != nullptr), "get element failed", status);
1105         int32_t channel;
1106         status = GetValue(env, element, channel);
1107         CHECK_RETURN(status == napi_ok, "get AudioDeviceDescriptor audioStreamInfo_ channels value failed", status);
1108         out = static_cast<AudioStandard::AudioChannel>(channel);
1109     }
1110     return status;
1111 }
1112 
GetChannelMasks(napi_env env,napi_value in,int32_t & out)1113 napi_status NapiUtils::GetChannelMasks(napi_env env, napi_value in, int32_t& out)
1114 {
1115     napi_value value {};
1116     auto status = napi_get_named_property(env, in, "channelMasks", &value);
1117     uint32_t length {};
1118     napi_get_array_length(env, value, &length);
1119     CHECK_RETURN(status == napi_ok, "get array length failed", status);
1120     if (length > 0) {
1121         napi_value element {};
1122         status = napi_get_element(env, value, 0, &element);
1123         CHECK_RETURN((status == napi_ok) && (element != nullptr), "get element failed", status);
1124         status = GetValue(env, element, out);
1125         CHECK_RETURN(status == napi_ok, "get AudioDeviceDescriptor channelMasks_ value failed", status);
1126     }
1127     return status;
1128 }
1129 
GetValue(napi_env env,napi_value in,AudioStandard::AudioDeviceDescriptor & out)1130 napi_status NapiUtils::GetValue(napi_env env, napi_value in, AudioStandard::AudioDeviceDescriptor& out)
1131 {
1132     napi_value value {};
1133     auto status = napi_get_named_property(env, in, "id", &value);
1134     CHECK_RETURN(status == napi_ok, "get AudioDeviceDescriptor deviceId_ failed", status);
1135     status = GetValue(env, value, out.deviceId_);
1136     CHECK_RETURN(status == napi_ok, "get AudioDeviceDescriptor deviceId_ value failed", status);
1137 
1138     status = napi_get_named_property(env, in, "name", &value);
1139     CHECK_RETURN(status == napi_ok, "get AudioDeviceDescriptor deviceName_ failed", status);
1140     status = GetValue(env, value, out.deviceName_);
1141     CHECK_RETURN(status == napi_ok, "get AudioDeviceDescriptor deviceName_ value failed", status);
1142 
1143     status = napi_get_named_property(env, in, "networkId", &value);
1144     CHECK_RETURN(status == napi_ok, "get AudioDeviceDescriptor networkId failed", status);
1145     status = GetValue(env, value, out.networkId_);
1146     CHECK_RETURN(status == napi_ok, "get AudioDeviceDescriptor networkId value failed", status);
1147 
1148     status = napi_get_named_property(env, in, "deviceRole", &value);
1149     CHECK_RETURN(status == napi_ok, "get AudioDeviceDescriptor deviceRole_ failed", status);
1150     status = GetValue(env, value, out.deviceRole_);
1151     CHECK_RETURN(status == napi_ok, "get AudioDeviceDescriptor deviceRole_ value failed", status);
1152 
1153     if (napi_get_named_property(env, in, "address", &value) == napi_ok) {
1154         GetValue(env, value, out.macAddress_);
1155     }
1156 
1157     if (napi_get_named_property(env, in, "deviceType", &value) == napi_ok) {
1158         GetValue(env, value, out.deviceType_);
1159     }
1160 
1161     if (napi_get_named_property(env, in, "interruptGroupId", &value) == napi_ok) {
1162         GetValue(env, value, out.interruptGroupId_);
1163     }
1164 
1165     if (napi_get_named_property(env, in, "volumeGroupId", &value) == napi_ok) {
1166         GetValue(env, value, out.volumeGroupId_);
1167     }
1168 
1169     GetSampleRate(env, in, out.audioStreamInfo_.samplingRate);
1170     GetChannels(env, in, out.audioStreamInfo_.channels);
1171     GetChannelMasks(env, in, out.channelMasks_);
1172     return napi_ok;
1173 }
1174 
GetValue(napi_env env,napi_value in,std::vector<AudioStandard::AudioDeviceDescriptor> & out)1175 napi_status NapiUtils::GetValue(napi_env env, napi_value in, std::vector<AudioStandard::AudioDeviceDescriptor>& out)
1176 {
1177     uint32_t length {};
1178     auto status = napi_get_array_length(env, in, &length);
1179     CHECK_RETURN(status == napi_ok, "get array length failed", status);
1180     for (uint32_t i = 0; i < length; ++i) {
1181         napi_value element {};
1182         status = napi_get_element(env, in, i, &element);
1183         CHECK_RETURN((status == napi_ok) && (element != nullptr), "get element failed", status);
1184         AudioStandard::AudioDeviceDescriptor descriptor;
1185         status = GetValue(env, element, descriptor);
1186         out.push_back(descriptor);
1187     }
1188     return napi_ok;
1189 }
1190 
GetOptionalString(napi_env env,napi_value in,DeviceInfo & out)1191 napi_status NapiUtils::GetOptionalString(napi_env env, napi_value in, DeviceInfo& out)
1192 {
1193     napi_value value {};
1194     bool hasIpAddress = false;
1195     napi_has_named_property(env, in, "ipAddress", &hasIpAddress);
1196     if (hasIpAddress) {
1197         napi_status status = napi_get_named_property(env, in, "ipAddress", &value);
1198         CHECK_RETURN(status == napi_ok, "get DeviceInfo ipAddress failed", status);
1199 
1200         napi_valuetype type = napi_undefined;
1201         status = napi_typeof(env, value, &type);
1202         CHECK_RETURN((status == napi_ok) && type == napi_string, "invalid typ for ipAddress", napi_invalid_arg);
1203 
1204         size_t maxLen = STR_MAX_LENGTH;
1205         status = napi_get_value_string_utf8(env, value, nullptr, 0, &maxLen);
1206         if (maxLen == 0) {
1207             out.ipAddress_ = "";
1208         } else {
1209             if (maxLen < 0 || maxLen >= STR_MAX_LENGTH) {
1210                 return napi_invalid_arg;
1211             }
1212             char buf[STR_MAX_LENGTH + STR_TAIL_LENGTH] {};
1213             size_t len = 0;
1214             status = napi_get_value_string_utf8(env, value, buf, maxLen + STR_TAIL_LENGTH, &len);
1215             if (status == napi_ok) {
1216                 out.ipAddress_ = std::string(buf);
1217             }
1218         }
1219         CHECK_RETURN(status == napi_ok, "get DeviceInfo ipAddress value failed", status);
1220     } else {
1221         out.ipAddress_ = "";
1222     }
1223     return napi_ok;
1224 }
1225 
1226 /* napi_value -> DeviceInfo */
GetValue(napi_env env,napi_value in,DeviceInfo & out)1227 napi_status NapiUtils::GetValue(napi_env env, napi_value in, DeviceInfo& out)
1228 {
1229     napi_value value {};
1230     auto status = napi_get_named_property(env, in, "castCategory", &value);
1231     CHECK_RETURN(status == napi_ok, "get DeviceInfo castCategory_ failed", status);
1232     status = GetValue(env, value, out.castCategory_);
1233     CHECK_RETURN(status == napi_ok, "get DeviceInfo castCategory_ value failed", status);
1234 
1235     status = napi_get_named_property(env, in, "deviceId", &value);
1236     CHECK_RETURN(status == napi_ok, "get DeviceInfo deviceId_ failed", status);
1237     status = GetValue(env, value, out.deviceId_);
1238     CHECK_RETURN(status == napi_ok, "get DeviceInfo deviceId_ value failed", status);
1239 
1240     status = napi_get_named_property(env, in, "deviceName", &value);
1241     CHECK_RETURN(status == napi_ok, "get DeviceInfo deviceName_ failed", status);
1242     status = GetValue(env, value, out.deviceName_);
1243     CHECK_RETURN(status == napi_ok, "get DeviceInfo deviceName_ value failed", status);
1244 
1245     status = napi_get_named_property(env, in, "deviceType", &value);
1246     CHECK_RETURN(status == napi_ok, "get DeviceInfo deviceType_ failed", status);
1247     status = GetValue(env, value, out.deviceType_);
1248     CHECK_RETURN(status == napi_ok, "get DeviceInfo deviceType_ value failed", status);
1249 
1250     CHECK_RETURN(GetOptionalString(env, in, out) == napi_ok, "get DeviceInfo ip address value failed", status);
1251 
1252     bool hasProviderId = false;
1253     napi_has_named_property(env, in, "providerId", &hasProviderId);
1254     if (hasProviderId) {
1255         status = napi_get_named_property(env, in, "providerId", &value);
1256         CHECK_RETURN(status == napi_ok, "get DeviceInfo providerId failed", status);
1257         status = GetValue(env, value, out.providerId_);
1258         CHECK_RETURN(status == napi_ok, "get DeviceInfo providerId value failed", status);
1259     } else {
1260         out.providerId_ = 0;
1261     }
1262     return napi_ok;
1263 }
1264 
1265 /* napi_value -> OutputDeviceInfo */
GetValue(napi_env env,napi_value in,OutputDeviceInfo & out)1266 napi_status NapiUtils::GetValue(napi_env env, napi_value in, OutputDeviceInfo& out)
1267 {
1268     napi_value devices = nullptr;
1269     bool hasProperty = false;
1270     NAPI_CALL_BASE(env, napi_has_named_property(env, in, "devices", &hasProperty), napi_invalid_arg);
1271     if (!hasProperty) {
1272         SLOGE("devices is not exit in OutputDeviceInfo");
1273         return napi_invalid_arg;
1274     }
1275     NAPI_CALL_BASE(env, napi_get_named_property(env, in, "devices", &devices), napi_invalid_arg);
1276     bool isArray = false;
1277     NAPI_CALL_BASE(env, napi_is_array(env, devices, &isArray), napi_invalid_arg);
1278     if (!isArray) {
1279         SLOGE("devices is not array");
1280         return napi_invalid_arg;
1281     }
1282 
1283     uint32_t arrLen = 0;
1284     NAPI_CALL_BASE(env, napi_get_array_length(env, devices, &arrLen), napi_invalid_arg);
1285     if (arrLen == 0) {
1286         SLOGE("devices len is invalid");
1287         return napi_invalid_arg;
1288     }
1289 
1290     for (uint32_t i = 0; i < arrLen; i++) {
1291         napi_value item = nullptr;
1292         NAPI_CALL_BASE(env, napi_get_element(env, devices, i, &item), napi_invalid_arg);
1293         DeviceInfo deviceInfo;
1294         napi_status status = GetValue(env, item, deviceInfo);
1295         CHECK_RETURN(status == napi_ok, "not is device info", status);
1296         out.deviceInfos_.push_back(deviceInfo);
1297     }
1298     return napi_ok;
1299 }
1300 
1301 /* napi_value -> MediaInfoHolder */
GetValue(napi_env env,napi_value in,MediaInfoHolder & out)1302 napi_status NapiUtils::GetValue(napi_env env, napi_value in, MediaInfoHolder& out)
1303 {
1304     return NapiMediaInfoHolder::GetValue(env, in, out);
1305 }
1306 
1307 /* napi_value <-> MediaInfoHolder */
SetValue(napi_env env,const MediaInfoHolder & in,napi_value & out)1308 napi_status NapiUtils::SetValue(napi_env env, const MediaInfoHolder& in, napi_value& out)
1309 {
1310     return NapiMediaInfoHolder::SetValue(env, in, out);
1311 }
1312 
1313 /* napi_value -> MediaInfo */
GetValue(napi_env env,napi_value in,MediaInfo & out)1314 napi_status NapiUtils::GetValue(napi_env env, napi_value in, MediaInfo& out)
1315 {
1316     napi_value value {};
1317     auto status = napi_get_named_property(env, in, "mediaId", &value);
1318     CHECK_RETURN(status == napi_ok, "get mediaId failed", status);
1319     status = GetValue(env, value, out.mediaId_);
1320     CHECK_RETURN(status == napi_ok, "get mediaId value failed", status);
1321 
1322     status = napi_get_named_property(env, in, "mediaUrl", &value);
1323     CHECK_RETURN(status == napi_ok, "get mediaUrl failed", status);
1324     status = GetValue(env, value, out.mediaUrl_);
1325     CHECK_RETURN(status == napi_ok, "get mediaUrl value failed", status);
1326 
1327     bool hasStartPosition = false;
1328     napi_has_named_property(env, in, "startPosition", &hasStartPosition);
1329     if (hasStartPosition) {
1330         status = napi_get_named_property(env, in, "startPosition", &value);
1331         CHECK_RETURN(status == napi_ok, "get MediaInfo startPosition failed", status);
1332         status = GetValue(env, value, out.startPosition_);
1333         CHECK_RETURN(status == napi_ok, "get MediaInfo startPosition value failed", status);
1334     } else {
1335         out.startPosition_ = -1;
1336     }
1337     return napi_ok;
1338 }
1339 
1340 /* napi_value <- MediaInfo */
SetValue(napi_env env,const MediaInfo & in,napi_value & out)1341 napi_status NapiUtils::SetValue(napi_env env, const MediaInfo& in, napi_value& out)
1342 {
1343     napi_status status = napi_create_object(env, &out);
1344     CHECK_RETURN((status == napi_ok) && (out != nullptr), "create object failed", status);
1345 
1346     napi_value property = nullptr;
1347     status = SetValue(env, in.mediaId_, property);
1348     CHECK_RETURN((status == napi_ok) && (property != nullptr), "create object failed", status);
1349     status = napi_set_named_property(env, out, "mediaId", property);
1350     CHECK_RETURN(status == napi_ok, "napi_set_named_property failed", status);
1351 
1352     status = SetValue(env, in.mediaUrl_, property);
1353     CHECK_RETURN((status == napi_ok) && (property != nullptr), "create object failed", status);
1354     status = napi_set_named_property(env, out, "mediaUrl", property);
1355     CHECK_RETURN(status == napi_ok, "napi_set_named_property failed", status);
1356 
1357     if (in.startPosition_ != -1) {
1358         status = SetValue(env, in.startPosition_, property);
1359         CHECK_RETURN((status == napi_ok) && (property != nullptr), "create object failed", status);
1360         status = napi_set_named_property(env, out, "mediaInfo", property);
1361         CHECK_RETURN(status == napi_ok, "napi_set_named_property failed", status);
1362     }
1363 
1364     return napi_ok;
1365 }
1366 
1367 /* napi_value -> AVFileDescriptor */
GetValue(napi_env env,napi_value in,AVFileDescriptor & out)1368 napi_status NapiUtils::GetValue(napi_env env, napi_value in, AVFileDescriptor& out)
1369 {
1370     napi_value value {};
1371     auto status = napi_get_named_property(env, in, "fd", &value);
1372     CHECK_RETURN(status == napi_ok, "get fd failed", status);
1373     status = GetValue(env, value, out.fd_);
1374     CHECK_RETURN(status == napi_ok, "get fd value failed", status);
1375 
1376     bool hasOffset = false;
1377     napi_has_named_property(env, in, "offset", &hasOffset);
1378     if (hasOffset) {
1379         status = napi_get_named_property(env, in, "offset", &value);
1380         CHECK_RETURN(status == napi_ok, "get offset failed", status);
1381         status = GetValue(env, value, out.offset_);
1382         CHECK_RETURN(status == napi_ok, "get offset value failed", status);
1383     } else {
1384         out.offset_ = 0;
1385     }
1386 
1387     bool hasLength = false;
1388     napi_has_named_property(env, in, "length", &hasLength);
1389     if (hasLength) {
1390         status = napi_get_named_property(env, in, "length", &value);
1391         CHECK_RETURN(status == napi_ok, "get length failed", status);
1392         status = GetValue(env, value, out.length_);
1393         CHECK_RETURN(status == napi_ok, "get length value failed", status);
1394     } else {
1395         out.length_ = -1;
1396     }
1397     return napi_ok;
1398 }
1399 
1400 /* napi_value <- AVFileDescriptor */
SetValue(napi_env env,const AVFileDescriptor & in,napi_value & out)1401 napi_status NapiUtils::SetValue(napi_env env, const AVFileDescriptor& in, napi_value& out)
1402 {
1403     napi_status status = napi_create_object(env, &out);
1404     CHECK_RETURN((status == napi_ok) && (out != nullptr), "create object failed", status);
1405 
1406     napi_value property = nullptr;
1407     status = SetValue(env, in.fd_, property);
1408     CHECK_RETURN((status == napi_ok) && (property != nullptr), "create object failed", status);
1409     status = napi_set_named_property(env, out, "fd", property);
1410     CHECK_RETURN(status == napi_ok, "napi_set_named_property failed", status);
1411 
1412     if (in.offset_ != 0) {
1413         status = SetValue(env, in.offset_, property);
1414         CHECK_RETURN((status == napi_ok) && (property != nullptr), "create object failed", status);
1415         status = napi_set_named_property(env, out, "offset", property);
1416         CHECK_RETURN(status == napi_ok, "napi_set_named_property failed", status);
1417     }
1418 
1419     if (in.length_ != -1) {
1420         status = SetValue(env, in.length_, property);
1421         CHECK_RETURN((status == napi_ok) && (property != nullptr), "create object failed", status);
1422         status = napi_set_named_property(env, out, "length", property);
1423         CHECK_RETURN(status == napi_ok, "napi_set_named_property failed", status);
1424     }
1425     return napi_ok;
1426 }
1427 
ThrowError(napi_env env,const char * napiMessage,int32_t napiCode)1428 napi_status NapiUtils::ThrowError(napi_env env, const char* napiMessage, int32_t napiCode)
1429 {
1430     napi_value message = nullptr;
1431     napi_value code = nullptr;
1432     napi_value result = nullptr;
1433     napi_create_string_utf8(env, napiMessage, NAPI_AUTO_LENGTH, &message);
1434     napi_create_error(env, nullptr, message, &result);
1435     napi_create_int32(env, napiCode, &code);
1436     napi_set_named_property(env, result, "code", code);
1437     napi_throw(env, result);
1438     return napi_ok;
1439 }
1440 }
1441