xref: /interface/sdk_c/arkui/napi/native_api.h (revision 7777dab0)
1/*
2 * Copyright (c) 2021 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#ifndef FOUNDATION_ACE_NAPI_INTERFACES_KITS_NAPI_NATIVE_API_H
17#define FOUNDATION_ACE_NAPI_INTERFACES_KITS_NAPI_NATIVE_API_H
18
19#ifndef NAPI_VERSION
20#define NAPI_VERSION 8
21#endif
22
23#ifndef NAPI_EXPERIMENTAL
24#define NAPI_EXPERIMENTAL
25#endif
26
27#include "common.h"
28#include "node_api.h"
29
30#ifdef NAPI_TEST
31#ifdef _WIN32
32#define NAPI_INNER_EXTERN __declspec(dllexport)
33#else
34#define NAPI_INNER_EXTERN __attribute__((visibility("default")))
35#endif
36#else
37#ifdef _WIN32
38#define NAPI_INNER_EXTERN __declspec(deprecated)
39#else
40#define NAPI_INNER_EXTERN __attribute__((__deprecated__))
41#endif
42#endif
43
44NAPI_EXTERN napi_status napi_fatal_exception(napi_env env, napi_value err);
45
46NAPI_EXTERN napi_status napi_create_string_utf16(napi_env env,
47                                                 const char16_t* str,
48                                                 size_t length,
49                                                 napi_value* result);
50
51NAPI_EXTERN napi_status napi_get_value_string_utf16(napi_env env,
52                                                    napi_value value,
53                                                    char16_t* buf,
54                                                    size_t bufsize,
55                                                    size_t* result);
56
57NAPI_EXTERN napi_status napi_type_tag_object(napi_env env,
58                                             napi_value value,
59                                             const napi_type_tag* type_tag);
60
61NAPI_EXTERN napi_status napi_check_object_type_tag(napi_env env,
62                                                   napi_value value,
63                                                   const napi_type_tag* type_tag,
64                                                   bool* result);
65
66NAPI_INNER_EXTERN napi_status napi_adjust_external_memory(napi_env env,
67                                                          int64_t change_in_bytes,
68                                                          int64_t* adjusted_value);
69
70
71#ifdef __cplusplus
72extern "C" {
73#endif
74
75/**
76 * @brief Native detach callback of napi_coerce_to_native_binding_object that can be used to
77 *        detach the js object and the native object.
78 *
79 * @since 11
80 */
81typedef void* (*napi_native_binding_detach_callback)(napi_env env, void* native_object, void* hint);
82/**
83 * @brief Native attach callback of napi_coerce_to_native_binding_object that can be used to
84 *        bind the js object and the native object.
85 *
86 * @since 11
87 */
88typedef napi_value (*napi_native_binding_attach_callback)(napi_env env, void* native_object, void* hint);
89
90NAPI_EXTERN napi_status napi_run_script_path(napi_env env, const char* path, napi_value* result);
91NAPI_EXTERN napi_status napi_queue_async_work_with_qos(napi_env env, napi_async_work work, napi_qos_t qos);
92NAPI_EXTERN napi_status napi_load_module(napi_env env, const char* path, napi_value* result);
93
94/**
95 * @brief The module is loaded through the NAPI. By default, the default object is exported from the module.
96 *
97 * @param env Current running virtual machine context.
98 * @param path Path name of the module to be loaded, like @ohos.hilog.
99 * @param module_info Path names of bundle and module, like com.example.application/entry.
100 * @param result Result of loading a module, which is an exported object of the module.
101 * @return Returns the function execution status.
102 * @since 12
103*/
104NAPI_EXTERN napi_status napi_load_module_with_info(napi_env env,
105                                                   const char* path,
106                                                   const char* module_info,
107                                                   napi_value* result);
108NAPI_EXTERN napi_status napi_get_instance_data(napi_env env, void** data);
109NAPI_EXTERN napi_status napi_set_instance_data(napi_env env,
110                                               void* data,
111                                               napi_finalize finalize_cb,
112                                               void* finalize_hint);
113NAPI_EXTERN napi_status napi_remove_env_cleanup_hook(napi_env env, void (*fun)(void* arg), void* arg);
114NAPI_EXTERN napi_status napi_add_env_cleanup_hook(napi_env env, void (*fun)(void* arg), void* arg);
115NAPI_EXTERN napi_status napi_remove_async_cleanup_hook(napi_async_cleanup_hook_handle remove_handle);
116NAPI_EXTERN napi_status napi_add_async_cleanup_hook(napi_env env,
117                                                    napi_async_cleanup_hook hook,
118                                                    void* arg,
119                                                    napi_async_cleanup_hook_handle* remove_handle);
120NAPI_EXTERN napi_status napi_async_destroy(napi_env env,
121                                           napi_async_context async_context);
122NAPI_EXTERN napi_status napi_async_init(napi_env env,
123                                        napi_value async_resource,
124                                        napi_value async_resource_name,
125                                        napi_async_context* result);
126NAPI_EXTERN napi_status napi_close_callback_scope(napi_env env, napi_callback_scope scope);
127NAPI_EXTERN napi_status napi_open_callback_scope(napi_env env,
128                                                 napi_value resource_object,
129                                                 napi_async_context context,
130                                                 napi_callback_scope* result);
131NAPI_EXTERN napi_status node_api_get_module_file_name(napi_env env, const char** result);
132// Create JSObject with initial properties given by descriptors, note that property key must be String,
133// and must can not convert to element_index, also all keys must not duplicate.
134NAPI_EXTERN napi_status napi_create_object_with_properties(napi_env env,
135                                                           napi_value* result,
136                                                           size_t property_count,
137                                                           const napi_property_descriptor* properties);
138// Create JSObject with initial properties given by keys and values, note that property key must be String,
139// and must can not convert to element_index, also all keys must not duplicate.
140NAPI_EXTERN napi_status napi_create_object_with_named_properties(napi_env env,
141                                                                 napi_value* result,
142                                                                 size_t property_count,
143                                                                 const char** keys,
144                                                                 const napi_value* values);
145/**
146 * @brief This API sets native properties to a object and converts this js object to native binding object.
147 *
148 * @param[in] env Current running virtual machine context.
149 * @param[in] js_object The JavaScript value to coerce.
150 * @param[in] detach_cb Native callback that can be used to detach the js object and the native object.
151 * @param[in] attach_cb Native callback that can be used to bind the js object and the native object.
152 * @param[in] native_object User-provided native instance to pass to thr detach callback and attach callback.
153 * @param[in] hint Optional hint to pass to the detach callback and attach callback.
154 * @return Return the function execution status.
155 * @since 11
156 */
157NAPI_EXTERN napi_status napi_coerce_to_native_binding_object(napi_env env,
158                                                             napi_value js_object,
159                                                             napi_native_binding_detach_callback detach_cb,
160                                                             napi_native_binding_attach_callback attach_cb,
161                                                             void* native_object,
162                                                             void* hint);
163NAPI_EXTERN napi_status napi_add_finalizer(napi_env env,
164                                           napi_value js_object,
165                                           void* native_object,
166                                           napi_finalize finalize_cb,
167                                           void* finalize_hint,
168                                           napi_ref* result);
169/**
170 * @brief Create the ark runtime.
171 *
172 * @param env Indicates the ark runtime environment.
173 * @since 12
174 */
175NAPI_EXTERN napi_status napi_create_ark_runtime(napi_env* env);
176
177/**
178 * @brief Destroy the ark runtime.
179 *
180 * @param env Indicates the ark runtime environment.
181 * @since 12
182 */
183NAPI_EXTERN napi_status napi_destroy_ark_runtime(napi_env* env);
184
185/*
186 * @brief Defines a sendable class.
187 *
188 * @param env: The environment that the API is invoked under.
189 * @param utf8name: Name of the ArkTS constructor function.
190 * @param length: The length of the utf8name in bytes, or NAPI_AUTO_LENGTH if it is null-terminated.
191 * @param constructor: Callback function that handles constructing instances of the class.
192 * @param data: Optional data to be passed to the constructor callback as the data property of the callback info.
193 * @param property_count: Number of items in the properties array argument.
194 * @param properties: Array of property descriptors describing static and instance data properties, accessors, and
195 * methods on the class. See napi_property_descriptor.
196 * @param parent: A napi_value representing the Superclass.
197 * @param result: A napi_value representing the constructor function for the class.
198 * @return Return the function execution status.
199 * @since 12
200 */
201NAPI_EXTERN napi_status napi_define_sendable_class(napi_env env,
202                                                   const char* utf8name,
203                                                   size_t length,
204                                                   napi_callback constructor,
205                                                   void* data,
206                                                   size_t property_count,
207                                                   const napi_property_descriptor* properties,
208                                                   napi_value parent,
209                                                   napi_value* result);
210
211/**
212 * @brief Queries a napi_value to check if it is sendable.
213 *
214 * @param env The environment that the API is invoked under.
215 * @param value The napi_value to be checked.
216 * @param result Boolean value that is set to true if napi_value is sendable, false otherwise.
217 * @return Return the function execution status.
218 * @since 12
219 */
220NAPI_EXTERN napi_status napi_is_sendable(napi_env env, napi_value value, bool* result);
221/**
222 * @brief Defines a sendable object.
223 *
224 * @param env The environment that the API is invoked under.
225 * @param property_count The count of object properties.
226 * @param properties Object properties.
227 * @return Return the function execution status.
228 * @since 12
229 */
230NAPI_EXTERN napi_status napi_create_sendable_object_with_properties(napi_env env, size_t property_count,
231                                                                    const napi_property_descriptor* properties,
232                                                                    napi_value* result);
233/**
234 * @brief Wraps a native instance in a ArkTS object.
235 *
236 * @param env The environment that the API is invoked under.
237 * @param js_object The ArkTS object that will be the wrapper for the native object.
238 * @param native_object The native instance that will be wrapped in the ArkTS object.
239 * @param finalize_lib Optional native callback that can be used to free the native instance when the ArkTS object
240 * has been garbage-collected.
241 * @param finalize_hint Optional contextual hint that is passed to the finalize callback.
242 * @return Return the function execution status.
243 * @since 12
244 */
245NAPI_EXTERN napi_status napi_wrap_sendable(napi_env env, napi_value js_object, void* native_object,
246                                           napi_finalize finalize_cb, void* finalize_hint);
247/**
248 * @brief Wraps a native instance in a ArkTS object.
249 *
250 * @param env The environment that the API is invoked under.
251 * @param js_object The ArkTS object that will be the wrapper for the native object.
252 * @param native_object The native instance that will be wrapped in the ArkTS object.
253 * @param finalize_lib Optional native callback that can be used to free the native instance when the ArkTS object
254 * has been garbage-collected.
255 * @param finalize_hint Optional contextual hint that is passed to the finalize callback.
256 * @param native_binding_size The size of native binding.
257 * @return Return the function execution status.
258 * @since 12
259 */
260NAPI_EXTERN napi_status napi_wrap_sendable_with_size(napi_env env, napi_value js_object, void* native_object,
261                                                     napi_finalize finalize_cb, void* finalize_hint,
262                                                     size_t native_binding_size);
263/**
264 * @brief Retrieves a native instance that was previously wrapped in a ArkTS object.
265 *
266 * @param env The environment that the API is invoked under.
267 * @param js_object The object associated with the native instance.
268 * @param result Pointer to the wrapped native instance.
269 * @return Return the function execution status.
270 * @since 12
271 */
272NAPI_EXTERN napi_status napi_unwrap_sendable(napi_env env, napi_value js_object, void** result);
273/**
274 * @brief Retrieves a native instance that was previously wrapped in a ArkTS object and removes the wrapping.
275 *
276 * @param env The environment that the API is invoked under.
277 * @param js_object The object associated with the native instance.
278 * @param result Pointer to the wrapped native instance.
279 * @return Return the function execution status.
280 * @since 12
281 */
282NAPI_EXTERN napi_status napi_remove_wrap_sendable(napi_env env, napi_value js_object, void** result);
283/*
284 * @brief Create a sendable array.
285 *
286 * @param env: The environment that the API is invoked under.
287 * @param result: A napi_value representing a sendable array.
288 * @return Return the function execution status.
289 * @since 12
290 */
291NAPI_EXTERN napi_status napi_create_sendable_array(napi_env env, napi_value* result);
292
293/*
294 * @brief Create a sendable array with length.
295 *
296 * @param env: The environment that the API is invoked under.
297 * @param length: The initial length of the sendable array.
298 * @param result: A napi_value representing a sendable array.
299 * @return Return the function execution status.
300 * @since 12
301 */
302NAPI_EXTERN napi_status napi_create_sendable_array_with_length(napi_env env, size_t length, napi_value* result);
303
304/*
305 * @brief Create a sendable arraybuffer.
306 *
307 * @param env: The environment that the API is invoked under.
308 * @param byte_length: The length in bytes of the sendable arraybuffer to create.
309 * @param data: Pointer to the underlying byte buffer of the sendable arraybuffer.
310 * @param result: A napi_value representing a sendable arraybuffer.
311 * @return Return the function execution status.
312 * @since 12
313 */
314NAPI_EXTERN napi_status napi_create_sendable_arraybuffer(napi_env env, size_t byte_length,
315                                                         void** data, napi_value* result);
316
317/*
318 * @brief Create a sendable typedarray.
319 *
320 * @param env: The environment that the API is invoked under.
321 * @param type: Scalar datatype of the elements within the sendable typedarray.
322 * @param length: Number of elements in the typedarray.
323 * @param arraybuffer: Sendable arraybuffer underlying the sendable typedarray.
324 * @param byte_offset: The byte offset within the sendable arraybuffer from
325 * which to start projecting the sendable typedarray.
326 * @param result: A napi_value representing a sendable typedarray.
327 * @return Return the function execution status.
328 * @since 12
329 */
330NAPI_EXTERN napi_status napi_create_sendable_typedarray(napi_env env,
331                                                        napi_typedarray_type type,
332                                                        size_t length,
333                                                        napi_value arraybuffer,
334                                                        size_t byte_offset,
335                                                        napi_value* result);
336
337/**
338 * @brief Run the event loop by the given env and running mode in current thread.
339 *
340 * Support to run the native event loop in an asynchronous native thread with the specified running mode.
341 *
342 * @param env Current running virtual machine context.
343 * @param mode Indicates the running mode of the native event loop.
344 * @return Return the function execution status.
345 * @since 12
346 */
347NAPI_EXTERN napi_status napi_run_event_loop(napi_env env, napi_event_mode mode);
348
349/**
350 * @brief Stop the event loop in current thread.
351 *
352 * Support to stop the running event loop in current native thread.
353 *
354 * @param env Current running virtual machine context.
355 * @return Return the function execution status.
356 * @since 12
357 */
358NAPI_EXTERN napi_status napi_stop_event_loop(napi_env env);
359
360/**
361 * @brief Serialize a JS object.
362 *
363 * @param env Current running virtual machine context.
364 * @param object The JavaScript value to serialize.
365 * @param transfer_list List of data to transfer in transfer mode.
366 * @param clone_list List of Sendable data to transfer in clone mode.
367 * @param result Serialization result of the JS object.
368 * @return Returns the function execution status.
369 * @since 12
370*/
371NAPI_EXTERN napi_status napi_serialize(napi_env env,
372                                       napi_value object,
373                                       napi_value transfer_list,
374                                       napi_value clone_list,
375                                       void** result);
376
377/**
378 * @brief Restore serialization data to a ArkTS object.
379 *
380 * @param env Current running virtual machine context.
381 * @param buffer Data to deserialize.
382 * @param object ArkTS object obtained by deserialization.
383 * @return Returns the function execution status.
384 * @since 12
385*/
386NAPI_EXTERN napi_status napi_deserialize(napi_env env, void* buffer, napi_value* object);
387
388/**
389 * @brief Delete serialization data.
390 *
391 * @param env Current running virtual machine context.
392 * @param buffer Data to delete.
393 * @return Returns the function execution status.
394 * @since 12
395*/
396NAPI_EXTERN napi_status napi_delete_serialization_data(napi_env env, void* buffer);
397
398/**
399 * @brief Dispatch a task with specified priority from a native thread to an ArkTS thread, the task will execute
400 *        the given thread safe function.
401 *
402 * @param func Indicates the thread safe function.
403 * @param data Indicates the data anticipated to be transferred to the ArkTS thread.
404 * @param priority Indicates the priority of the task dispatched.
405 * @param isTail Indicates the way of the task dispatched into the native event queue. When "isTail" is true,
406 *        the task will be dispatched to the tail of the native event queue. Conversely, when "isTail" is false, the
407 *        tasks will be dispatched to the head of the native event queue.
408 * @return Return the function execution status.
409 * @since 12
410 */
411NAPI_EXTERN napi_status napi_call_threadsafe_function_with_priority(napi_threadsafe_function func,
412                                                                    void *data,
413                                                                    napi_task_priority priority,
414                                                                    bool isTail);
415#ifdef __cplusplus
416}
417#endif
418#endif /* FOUNDATION_ACE_NAPI_INTERFACES_KITS_NAPI_NATIVE_API_H */
419