1#include <stdlib.h> 2#define NAPI_EXPERIMENTAL 3#include <node_api.h> 4 5#define NAPI_CALL(env, call) \ 6 do { \ 7 napi_status status = (call); \ 8 if (status != napi_ok) { \ 9 napi_throw_error((env), NULL, #call " failed"); \ 10 return NULL; \ 11 } \ 12 } while (0) 13 14static napi_value 15GetCount(napi_env env, napi_callback_info info) { 16 napi_value result; 17 size_t* count; 18 19 NAPI_CALL(env, napi_get_instance_data(env, (void**)&count)); 20 NAPI_CALL(env, napi_create_uint32(env, *count, &result)); 21 22 return result; 23} 24 25static napi_value 26SetCount(napi_env env, napi_callback_info info) { 27 size_t* count; 28 29 NAPI_CALL(env, napi_get_instance_data(env, (void**)&count)); 30 31 // Set the count to zero irrespective of what is passed into the setter. 32 *count = 0; 33 34 return NULL; 35} 36 37static void 38IncrementCounter(napi_env env, void* data, void* hint) { 39 size_t* count = data; 40 (*count) = (*count) + 1; 41} 42 43static napi_value 44NewWeak(napi_env env, napi_callback_info info) { 45 napi_value result; 46 void* instance_data; 47 48 NAPI_CALL(env, napi_create_object(env, &result)); 49 NAPI_CALL(env, napi_get_instance_data(env, &instance_data)); 50 NAPI_CALL(env, napi_add_finalizer(env, 51 result, 52 instance_data, 53 IncrementCounter, 54 NULL, 55 NULL)); 56 57 return result; 58} 59 60static void 61FreeCount(napi_env env, void* data, void* hint) { 62 free(data); 63} 64 65/* napi_value */ 66NAPI_MODULE_INIT(/* napi_env env, napi_value exports */) { 67 napi_property_descriptor props[] = { 68 { "count", NULL, NULL, GetCount, SetCount, NULL, napi_enumerable, NULL }, 69 { "newWeak", NULL, NewWeak, NULL, NULL, NULL, napi_enumerable, NULL } 70 }; 71 72 size_t* count = malloc(sizeof(*count)); 73 *count = 0; 74 75 NAPI_CALL(env, napi_define_properties(env, 76 exports, 77 sizeof(props) / sizeof(*props), 78 props)); 79 NAPI_CALL(env, napi_set_instance_data(env, count, FreeCount, NULL)); 80 81 return exports; 82} 83