napi_status napi_define_class(napi_env env, const char* utf8name, size_t length, napi_callback constructor, void* data, size_t property_count, const napi_property_descriptor* properties, napi_value* result) { NAPI_TRY_ENV(env); napi_value nval; NAPI_INTERNAL_CALL( napi_create_function(env, utf8name, length, constructor, data, &nval)); // `prototype` is undefined in `napi_create_function` results napi_value nval_prototype; NAPI_INTERNAL_CALL(napi_create_object(env, &nval_prototype)); NAPI_INTERNAL_CALL( napi_set_named_property(env, nval, "prototype", nval_prototype)); for (size_t i = 0; i < property_count; ++i) { napi_property_descriptor prop = properties[i]; if (prop.attributes & napi_static) { NAPI_INTERNAL_CALL(napi_define_properties(env, nval, 1, &prop)); } else { NAPI_INTERNAL_CALL(napi_define_properties(env, nval_prototype, 1, &prop)); } } NAPI_ASSIGN(result, nval); NAPI_RETURN(napi_ok); }
static napi_value Init(napi_env env, napi_value exports) { napi_value result; assert(napi_create_object(env, &result) == napi_ok); napi_value get_fn; assert(napi_create_function(env, "get", NAPI_AUTO_LENGTH, xattr_get, NULL, &get_fn) == napi_ok); assert(napi_set_named_property(env, result, "get", get_fn) == napi_ok); napi_value set_fn; assert(napi_create_function(env, "set", NAPI_AUTO_LENGTH, xattr_set, NULL, &set_fn) == napi_ok); assert(napi_set_named_property(env, result, "set", set_fn) == napi_ok); napi_value list_fn; assert(napi_create_function(env, "list", NAPI_AUTO_LENGTH, xattr_list, NULL, &list_fn) == napi_ok); assert(napi_set_named_property(env, result, "list", list_fn) == napi_ok); napi_value remove_fn; assert(napi_create_function(env, "remove", NAPI_AUTO_LENGTH, xattr_remove, NULL, &remove_fn) == napi_ok); assert(napi_set_named_property(env, result, "remove", remove_fn) == napi_ok); napi_value get_sync_fn; assert(napi_create_function(env, "getSync", NAPI_AUTO_LENGTH, xattr_get_sync, NULL, &get_sync_fn) == napi_ok); assert(napi_set_named_property(env, result, "getSync", get_sync_fn) == napi_ok); napi_value set_sync_fn; assert(napi_create_function(env, "setSync", NAPI_AUTO_LENGTH, xattr_set_sync, NULL, &set_sync_fn) == napi_ok); assert(napi_set_named_property(env, result, "setSync", set_sync_fn) == napi_ok); napi_value list_sync_fn; assert(napi_create_function(env, "listSync", NAPI_AUTO_LENGTH, xattr_list_sync, NULL, &list_sync_fn) == napi_ok); assert(napi_set_named_property(env, result, "listSync", list_sync_fn) == napi_ok); napi_value remove_sync_fn; assert(napi_create_function(env, "removeSync", NAPI_AUTO_LENGTH, xattr_remove_sync, NULL, &remove_sync_fn) == napi_ok); assert(napi_set_named_property(env, result, "removeSync", remove_sync_fn) == napi_ok); return result; }
napi_value bufferInfo(napi_env env, napi_callback_info info){ size_t argc=1; napi_value args[1]; napi_status status; //napi_valuetype valuetype; //bool valuetype; status=napi_get_cb_info(env, info, &argc, args,NULL,NULL); if(status !=napi_ok){return NULL;} //assert(status==napi_ok); //if(argc > 1){napi_throw_type_error(env,nullptr,"Wrong number of arguments!"); // return NULL; //} //status=napi_is_buffer(env,args[0], &valuetype); //if(status !=napi_ok){return status;} //assert(status==napi_ok); //if(valuetype == false){ //napi_throw_type_error(env,nullptr,"Wrong type of argument. Expects a buffer!"); //return NULL; //} napi_value theBuffer=args[0], ua_family; const char* bufferData; napi_value obj; //size_t bufferLength; status=napi_get_buffer_info(env,theBuffer,(void**)(&bufferData),/*&bufferLength*/NULL); if(status !=napi_ok){return NULL;} //assert(status==napi_ok); //printf("here: %s\n",bufferData); //printf("here len: %zu\n",bufferLength); //printf("sizeof(theText): %zu\n",sizeof(theText)); //status=napi_get_boolean(env,!strcmp(bufferData,theText) && bufferLength==sizeof(theText),&returnValue); //assert(status==napi_ok); //struct user_agent_parser *ua_parser = user_agent_parser_create(); //struct user_agent_info *ua_info = user_agent_info_create(); //user_agent_parser_read_buffer(ua_parser, ___uap_core_regexes_yaml, ___uap_core_regexes_yaml_len); status=napi_create_object(env,&obj); if(status !=napi_ok){return NULL;} if (user_agent_parser_parse_string(ua_parser, ua_info,bufferData)) { //status= napi_create_string_utf8(env,ua_info->user_agent.family,NAPI_AUTO_LENGTH,&ua_family); //if(status !=napi_ok){return NULL;} //assert(status==napi_ok); //assert(status==napi_ok); //status=napi_set_named_property(env,obj,"ua_family",ua_family);//major,minor,patch //if(status !=napi_ok){return NULL;} //assert(status==napi_ok); } napi_property_descriptor descriptors[]={ {"ua_family",NULL,0,0,0,ua_family,napi_default,0} }; status=napi_define_properties(env,obj,sizeof(descriptors)/sizeof(descriptors[0]),descriptors); //assert(status==napi_ok); //user_agent_parser_destroy(ua_parser); //user_agent_info_destroy(ua_info); return obj; }
static napi_value NewScope(napi_env env, napi_callback_info info) { napi_handle_scope scope; napi_value output = NULL; NAPI_CALL(env, napi_open_handle_scope(env, &scope)); NAPI_CALL(env, napi_create_object(env, &output)); NAPI_CALL(env, napi_close_handle_scope(env, scope)); return NULL; }
static napi_value NewScopeEscape(napi_env env, napi_callback_info info) { napi_escapable_handle_scope scope; napi_value output = NULL; napi_value escapee = NULL; NAPI_CALL(env, napi_open_escapable_handle_scope(env, &scope)); NAPI_CALL(env, napi_create_object(env, &output)); NAPI_CALL(env, napi_escape_handle(env, scope, output, &escapee)); NAPI_CALL(env, napi_close_escapable_handle_scope(env, scope)); return escapee; }
static napi_value CreateObject(napi_env env, napi_callback_info info) { size_t argc = 1; napi_value args[1]; NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL)); napi_value obj; NAPI_CALL(env, napi_create_object(env, &obj)); NAPI_CALL(env, napi_set_named_property(env, obj, "msg", args[0])); return obj; }
static napi_value NewScopeEscapeTwice(napi_env env, napi_callback_info info) { napi_escapable_handle_scope scope; napi_value output = NULL; napi_value escapee = NULL; napi_status status; NAPI_CALL(env, napi_open_escapable_handle_scope(env, &scope)); NAPI_CALL(env, napi_create_object(env, &output)); NAPI_CALL(env, napi_escape_handle(env, scope, output, &escapee)); status = napi_escape_handle(env, scope, output, &escapee); NAPI_ASSERT(env, status == napi_escape_called_twice, "Escaping twice fails"); NAPI_CALL(env, napi_close_escapable_handle_scope(env, scope)); return NULL; }
static napi_value CreateAsyncResource(napi_env env, napi_callback_info info) { napi_value object; NAPI_CALL(env, napi_create_object(env, &object)); napi_value resource_name; NAPI_CALL(env, napi_create_string_utf8( env, "test_gcable", NAPI_AUTO_LENGTH, &resource_name)); napi_async_context context; NAPI_CALL(env, napi_async_init(env, object, resource_name, &context)); NAPI_CALL(env, napi_add_finalizer( env, object, (void*)context, AsyncDestroyCb, NULL, NULL)); return object; }
napi_value New(napi_env env, napi_callback_info info) { napi_value ret; NAPI_CALL(env, napi_create_object(env, &ret)); napi_value num; NAPI_CALL(env, napi_create_int32(env, 987654321, &num)); NAPI_CALL(env, napi_set_named_property(env, ret, "test_number", num)); napi_value str; const char* str_val = "test string"; size_t str_len = strlen(str_val); NAPI_CALL(env, napi_create_string_utf8(env, str_val, str_len, &str)); NAPI_CALL(env, napi_set_named_property(env, ret, "test_string", str)); return ret; }
static napi_value NewScopeWithException(napi_env env, napi_callback_info info) { napi_handle_scope scope; size_t argc; napi_value exception_function; napi_status status; napi_value output = NULL; NAPI_CALL(env, napi_open_handle_scope(env, &scope)); NAPI_CALL(env, napi_create_object(env, &output)); argc = 1; NAPI_CALL(env, napi_get_cb_info( env, info, &argc, &exception_function, NULL, NULL)); status = napi_call_function( env, output, exception_function, 0, NULL, NULL); NAPI_ASSERT(env, status == napi_pending_exception, "Function should have thrown."); // Closing a handle scope should still work while an exception is pending. NAPI_CALL(env, napi_close_handle_scope(env, scope)); return NULL; }