1 #include <node_api.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include "../../js-native-api/common.h"
5
6 static const char theText[] =
7 "Lorem ipsum dolor sit amet, consectetur adipiscing elit.";
8
malignDeleter(napi_env env,void * data,void * finalize_hint)9 static void malignDeleter(napi_env env, void* data, void* finalize_hint) {
10 NODE_API_ASSERT_RETURN_VOID(
11 env, data != NULL && strcmp(data, theText) == 0, "invalid data");
12 napi_ref finalizer_ref = (napi_ref)finalize_hint;
13 napi_value js_finalizer;
14 napi_value recv;
15 NODE_API_CALL_RETURN_VOID(
16 env, napi_get_reference_value(env, finalizer_ref, &js_finalizer));
17 NODE_API_CALL_RETURN_VOID(env, napi_get_global(env, &recv));
18 NODE_API_CALL_RETURN_VOID(
19 env, napi_call_function(env, recv, js_finalizer, 0, NULL, NULL));
20 NODE_API_CALL_RETURN_VOID(env, napi_delete_reference(env, finalizer_ref));
21 }
22
malignFinalizerBuffer(napi_env env,napi_callback_info info)23 static napi_value malignFinalizerBuffer(napi_env env, napi_callback_info info) {
24 size_t argc = 1;
25 napi_value args[1];
26 NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
27 NODE_API_ASSERT(env, argc == 1, "Wrong number of arguments");
28 napi_value finalizer = args[0];
29 napi_valuetype finalizer_valuetype;
30 NODE_API_CALL(env, napi_typeof(env, finalizer, &finalizer_valuetype));
31 NODE_API_ASSERT(env,
32 finalizer_valuetype == napi_function,
33 "Wrong type of first argument");
34 napi_ref finalizer_ref;
35 NODE_API_CALL(env, napi_create_reference(env, finalizer, 1, &finalizer_ref));
36
37 napi_value theBuffer;
38 NODE_API_CALL(env,
39 napi_create_external_buffer(env,
40 sizeof(theText),
41 (void*)theText,
42 malignDeleter,
43 finalizer_ref, // finalize_hint
44 &theBuffer));
45 return theBuffer;
46 }
47
Init(napi_env env,napi_value exports)48 static napi_value Init(napi_env env, napi_value exports) {
49 napi_property_descriptor methods[] = {
50 DECLARE_NODE_API_PROPERTY("malignFinalizerBuffer", malignFinalizerBuffer),
51 };
52
53 NODE_API_CALL(
54 env,
55 napi_define_properties(
56 env, exports, sizeof(methods) / sizeof(methods[0]), methods));
57
58 return exports;
59 }
60
61 NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)
62