WIP: feat(node_api): Add missing functions #7

Closed
abhisekp wants to merge 6 commits from abhisekp/feat-missing-functions into main
11 changed files with 1441 additions and 5 deletions
Showing only changes of commit 1efcf1aec9 - Show all commits

108
CONTRIBUTING.md Normal file
View File

@ -0,0 +1,108 @@
# Contributing
## TODO
### Unstable APIs
```go
// filename: node_api.go
package napi
func BasicFinalize(env Env, finalizeData, finalizeHint unsafe.Pointer) Status {
return Status(C.node_api_basic_finalize(
C.napi_env(env),
finalizeData,
finalizeHint,
))
}
func BasicEnv(env Env) Status {
return Status(C.node_api_basic_env(C.napi_env(env)))
}
func PostFinalizer(env Env, finalizeData, finalizeHint unsafe.Pointer) Status {
return Status(C.node_api_post_finalizer(
C.napi_env(env),
finalizeData,
finalizeHint,
))
}
```
### Fix the following functions
```go
// filename: node_api.go
package napi
/*
#include <stdlib.h>
#include <node/napi_api.h>
*/
import "C"
import "unsafe"
// OpenCallbackScope Function to open a callback scope
func OpenCallbackScope(env Env, resourceObject, context Value) (CallbackScope, Status) {
var scope CallbackScope
status := Status(C.napi_open_callback_scope(
C.napi_env(env),
C.napi_value(resourceObject),
C.napi_value(context),
(*C.napi_callback_scope)(unsafe.Pointer(&scope.scope)),
))
return scope, status
}
func CreateExternalStringLatin1(env Env, str string, finalize Finalize, finalizeHint unsafe.Pointer) (Value, Status) {
cstr := C.CString(str)
defer C.free(unsafe.Pointer(cstr))
finalizer := FinalizeToFinalizer(finalize)
var result Value
status := Status(C.node_api_create_external_string_latin1(
C.napi_env(env),
cstr,
C.size_t(len([]byte(str))),
C.napi_finalize(unsafe.Pointer(&finalizer)),
finalizeHint,
(*C.napi_value)(unsafe.Pointer(&result)),
))
return result, status
}
func CreateExternalStringUtf16(env Env, str []uint16, finalize Finalize, finalizeHint unsafe.Pointer) (Value, Status) {
var result Value
finalizer := FinalizeToFinalizer(finalize)
status := Status(C.node_api_create_external_string_utf16(
C.napi_env(env),
(*C.char16_t)(unsafe.Pointer(&str[0])),
C.size_t(len(str)),
C.napi_finalize(unsafe.Pointer(&finalizer)),
finalizeHint,
(*C.napi_value)(unsafe.Pointer(&result)),
))
return result, status
}
func CreateBufferFromArrayBuffer(env Env, arrayBuffer Value, byteOffset, length int) (Value, *byte, Status) {
var result Value
var data *byte
status := Status(C.node_api_create_buffer_from_arraybuffer(
C.napi_env(env),
C.napi_value(arrayBuffer),
C.size_t(byteOffset),
C.size_t(length),
unsafe.Pointer(&data),
(*C.napi_value)(unsafe.Pointer(&result)),
))
return result, data, status
}
```

View File

@ -340,13 +340,15 @@ func GetInstanceData(env Env) (any, Status) {
return provider.GetUserData(), status
}
func CreateBuffer(env Env, length int) (Value, *byte, Status) {
func CreateBuffer(env Env, length int) (Value, []byte, Status) {
var result Value
var data *byte
data := make([]byte, length)
dataPtr := unsafe.Pointer(&data[0])
status := Status(C.napi_create_buffer(
C.napi_env(env),
C.size_t(length),
(**C.void)(unsafe.Pointer(&data)),
&dataPtr,
(*C.napi_value)(unsafe.Pointer(&result)),
))
return result, data, status
@ -354,10 +356,11 @@ func CreateBuffer(env Env, length int) (Value, *byte, Status) {
func CreateExternal(env Env, data unsafe.Pointer, finalize Finalize, finalizeHint unsafe.Pointer) (Value, Status) {
var result Value
finalizer := FinalizeToFinalizer(finalize)
status := Status(C.napi_create_external(
C.napi_env(env),
data,
C.napi_finalize(finalize),
C.napi_finalize(unsafe.Pointer(&finalizer)),
finalizeHint,
(*C.napi_value)(unsafe.Pointer(&result)),
))
@ -365,13 +368,13 @@ func CreateExternal(env Env, data unsafe.Pointer, finalize Finalize, finalizeHin
}
func GetValueInt32(env Env, value Value) (int32, Status) {
var result int32
var result C.int32_t
status := Status(C.napi_get_value_int32(
C.napi_env(env),
C.napi_value(value),
(*C.int32_t)(unsafe.Pointer(&result)),
&result,
))
return result, status
return int32(result), status
}
func GetValueUint32(env Env, value Value) (uint32, Status) {
@ -469,11 +472,12 @@ func CoerceToString(env Env, value Value) (Value, Status) {
func CreateBufferCopy(env Env, data []byte) (Value, *byte, Status) {
var result Value
var copiedData *byte
copiedDataPtr := unsafe.Pointer(&copiedData)
status := Status(C.napi_create_buffer_copy(
C.napi_env(env),
C.size_t(len(data)),
unsafe.Pointer(&data[0]),
(**C.void)(unsafe.Pointer(&copiedData)),
&copiedDataPtr,
(*C.napi_value)(unsafe.Pointer(&result)),
))
return result, copiedData, status
@ -482,10 +486,13 @@ func CreateBufferCopy(env Env, data []byte) (Value, *byte, Status) {
func GetBufferInfo(env Env, value Value) (*byte, int, Status) {
var data *byte
var length C.size_t
dataPtr := unsafe.Pointer(&data)
status := Status(C.napi_get_buffer_info(
C.napi_env(env),
C.napi_value(value),
(**C.void)(unsafe.Pointer(&data)),
&dataPtr,
&length,
))
return data, int(length), status
@ -572,18 +579,24 @@ func IsTypedArray(env Env, value Value) (bool, Status) {
return result, status
}
func GetTypedArrayInfo(env Env, value Value) (TypedArrayType, int, *byte, Status) {
func GetTypedArrayInfo(env Env, value Value) (TypedArrayType, int, *byte, Value, int, Status) {
var type_ TypedArrayType
var length C.size_t
var data *byte
var arrayBuffer Value
var byteOffset C.size_t
dataPtr := unsafe.Pointer(&data)
status := Status(C.napi_get_typedarray_info(
C.napi_env(env),
C.napi_value(value),
(*C.napi_typedarray_type)(unsafe.Pointer(&type_)),
&length,
(**C.void)(unsafe.Pointer(&data)),
&dataPtr,
(*C.napi_value)(unsafe.Pointer(&arrayBuffer)),
&byteOffset,
))
return type_, int(length), data, status
return type_, int(length), data, arrayBuffer, int(byteOffset), status
}
func CreateTypedArray(env Env, type_ TypedArrayType, length int, arrayBuffer Value, byteOffset int) (Value, Status) {
@ -621,23 +634,32 @@ func CreateDataView(env Env, length int, arrayBuffer Value, byteOffset int) (Val
return result, status
}
func GetDataViewInfo(env Env, value Value) (int, *byte, Status) {
func GetDataViewInfo(env Env, value Value) (int, *byte, Value, int, Status) {
var length C.size_t
var data *byte
var arrayBuffer Value
var byteOffset C.size_t
dataPtr := unsafe.Pointer(&data)
status := Status(C.napi_get_dataview_info(
C.napi_env(env),
C.napi_value(value),
&length,
(**C.void)(unsafe.Pointer(&data)),
&dataPtr,
(*C.napi_value)(unsafe.Pointer(&arrayBuffer)),
&byteOffset,
))
return int(length), data, status
return int(length), data, arrayBuffer, int(byteOffset), status
}
func GetAllPropertyNames(env Env, object Value) (Value, Status) {
func GetAllPropertyNames(env Env, object Value, keyMode KeyCollectionMode, keyFilter KeyFilter, keyConversion KeyConversion) (Value, Status) {
var result Value
status := Status(C.napi_get_all_property_names(
C.napi_env(env),
C.napi_value(object),
C.napi_key_collection_mode(keyMode),
C.napi_key_filter(keyFilter),
C.napi_key_conversion(keyConversion),
(*C.napi_value)(unsafe.Pointer(&result)),
))
return result, status
@ -684,15 +706,18 @@ func DefineProperties(env Env, object Value, properties []PropertyDescriptor) St
))
}
// Wrap function to use the Finalizer type internally
func Wrap(env Env, jsObject Value, nativeObject unsafe.Pointer, finalize Finalize, finalizeHint unsafe.Pointer) Status {
return Status(C.napi_wrap(
var result Reference
status := Status(C.napi_wrap(
C.napi_env(env),
C.napi_value(jsObject),
nativeObject,
C.napi_finalize(finalize),
C.napi_finalize(unsafe.Pointer(&finalize)),
finalizeHint,
(*C.napi_value)(unsafe.Pointer(&jsObject)),
(*C.napi_ref)(unsafe.Pointer(&result)),
))
return status
}
func Unwrap(env Env, jsObject Value) (unsafe.Pointer, Status) {
@ -706,9 +731,11 @@ func Unwrap(env Env, jsObject Value) (unsafe.Pointer, Status) {
}
func RemoveWrap(env Env, jsObject Value) Status {
var result unsafe.Pointer
return Status(C.napi_remove_wrap(
C.napi_env(env),
C.napi_value(jsObject),
&result,
))
}
@ -724,7 +751,7 @@ func OpenHandleScope(env Env) (HandleScope, Status) {
func CloseHandleScope(env Env, scope HandleScope) Status {
return Status(C.napi_close_handle_scope(
C.napi_env(env),
C.napi_handle_scope(scope),
C.napi_handle_scope(unsafe.Pointer(&scope)),
))
}
@ -740,7 +767,7 @@ func OpenEscapableHandleScope(env Env) (EscapableHandleScope, Status) {
func CloseEscapableHandleScope(env Env, scope EscapableHandleScope) Status {
return Status(C.napi_close_escapable_handle_scope(
C.napi_env(env),
C.napi_escapable_handle_scope(scope),
C.napi_escapable_handle_scope(unsafe.Pointer(&scope)),
))
}
@ -748,7 +775,7 @@ func EscapeHandle(env Env, scope EscapableHandleScope, escapee Value) (Value, St
var result Value
status := Status(C.napi_escape_handle(
C.napi_env(env),
C.napi_escapable_handle_scope(scope),
C.napi_escapable_handle_scope(unsafe.Pointer(&scope)),
C.napi_value(escapee),
(*C.napi_value)(unsafe.Pointer(&result)),
))
@ -769,7 +796,7 @@ func CreateReference(env Env, value Value, initialRefcount int) (Reference, Stat
func DeleteReference(env Env, ref Reference) Status {
return Status(C.napi_delete_reference(
C.napi_env(env),
C.napi_ref(ref),
C.napi_ref(unsafe.Pointer(&ref)),
))
}
@ -777,7 +804,7 @@ func ReferenceRef(env Env, ref Reference) (int, Status) {
var result C.uint32_t
status := Status(C.napi_reference_ref(
C.napi_env(env),
C.napi_ref(ref),
C.napi_ref(unsafe.Pointer(&ref)),
&result,
))
return int(result), status
@ -787,7 +814,7 @@ func ReferenceUnref(env Env, ref Reference) (int, Status) {
var result C.uint32_t
status := Status(C.napi_reference_unref(
C.napi_env(env),
C.napi_ref(ref),
C.napi_ref(ref.Ref),
&result,
))
return int(result), status
@ -797,7 +824,7 @@ func GetReferenceValue(env Env, ref Reference) (Value, Status) {
var result Value
status := Status(C.napi_get_reference_value(
C.napi_env(env),
C.napi_ref(ref),
C.napi_ref(unsafe.Pointer(&ref)),
(*C.napi_value)(unsafe.Pointer(&result)),
))
return result, status
@ -877,10 +904,11 @@ func DetachArrayBuffer(env Env, value Value) Status {
func CreateArrayBuffer(env Env, length int) (Value, *byte, Status) {
var result Value
var data *byte
dataPtr := unsafe.Pointer(&data)
status := Status(C.napi_create_arraybuffer(
C.napi_env(env),
C.size_t(length),
(**C.void)(unsafe.Pointer(&data)),
&dataPtr,
(*C.napi_value)(unsafe.Pointer(&result)),
))
return result, data, status
@ -889,10 +917,11 @@ func CreateArrayBuffer(env Env, length int) (Value, *byte, Status) {
func GetArrayBufferInfo(env Env, value Value) (*byte, int, Status) {
var data *byte
var length C.size_t
dataPtr := unsafe.Pointer(&data)
status := Status(C.napi_get_arraybuffer_info(
C.napi_env(env),
C.napi_value(value),
(**C.void)(unsafe.Pointer(&data)),
&dataPtr,
&length,
))
return data, int(length), status
@ -900,11 +929,12 @@ func GetArrayBufferInfo(env Env, value Value) (*byte, int, Status) {
func CreateExternalArrayBuffer(env Env, data unsafe.Pointer, length int, finalize Finalize, finalizeHint unsafe.Pointer) (Value, Status) {
var result Value
finalizer := FinalizeToFinalizer(finalize)
status := Status(C.napi_create_external_arraybuffer(
C.napi_env(env),
data,
C.size_t(length),
C.napi_finalize(finalize),
C.napi_finalize(unsafe.Pointer(&finalizer)),
finalizeHint,
(*C.napi_value)(unsafe.Pointer(&result)),
))
@ -933,12 +963,15 @@ func GetProperty(env Env, object, key Value) (Value, Status) {
return result, status
}
func DeleteProperty(env Env, object, key Value) Status {
return Status(C.napi_delete_property(
func DeleteProperty(env Env, object, key Value) (bool, Status) {
var result bool
status := Status(C.napi_delete_property(
C.napi_env(env),
C.napi_value(object),
C.napi_value(key),
(*C.bool)(unsafe.Pointer(&result)),
))
return result, status
}
func SetNamedProperty(env Env, object Value, name string, value Value) Status {
@ -989,12 +1022,15 @@ func HasElement(env Env, object Value, index int) (bool, Status) {
return result, status
}
func DeleteElement(env Env, object Value, index int) Status {
return Status(C.napi_delete_element(
func DeleteElement(env Env, object Value, index int) (bool, Status) {
var result bool
status := Status(C.napi_delete_element(
C.napi_env(env),
C.napi_value(object),
C.uint32_t(index),
(*C.bool)(unsafe.Pointer(&result)),
))
return result, status
}
func ObjectFreeze(env Env, object Value) Status {
@ -1079,18 +1115,6 @@ type CallbackScope struct {
scope C.napi_callback_scope
}
// OpenCallbackScope Function to open a callback scope
func OpenCallbackScope(env Env, resourceObject, context Value) (CallbackScope, Status) {
var scope CallbackScope
status := Status(C.napi_open_callback_scope(
C.napi_env(env),
C.napi_value(resourceObject),
C.napi_value(context),
(*C.napi_callback_scope)(unsafe.Pointer(&scope.scope)),
))
return scope, status
}
// CloseCallbackScope Function to close a callback scope
func CloseCallbackScope(env Env, scope CallbackScope) Status {
return Status(C.napi_close_callback_scope(

34
key_type.go Normal file
View File

@ -0,0 +1,34 @@
package napi
/*
#include <node/node_api.h>
*/
import "C"
// KeyCollectionMode type
type KeyCollectionMode C.napi_key_collection_mode
const (
KeyIncludePrototypes KeyCollectionMode = C.napi_key_include_prototypes
KeyOwnOnly KeyCollectionMode = C.napi_key_own_only
)
// KeyFilter type
type KeyFilter C.napi_key_filter
const (
KeyAllProperties KeyFilter = C.napi_key_all_properties
KeyWritable KeyFilter = C.napi_key_writable
KeyEnumerable KeyFilter = C.napi_key_enumerable
KeyConfigurable KeyFilter = C.napi_key_configurable
KeySkipStrings KeyFilter = C.napi_key_skip_strings
KeySkipSymbols KeyFilter = C.napi_key_skip_symbols
)
// KeyConversion type
type KeyConversion C.napi_key_conversion
const (
KeyKeepNumbers KeyConversion = C.napi_key_keep_numbers
KeyNumbersToStrings KeyConversion = C.napi_key_numbers_to_strings
)

View File

@ -164,18 +164,6 @@ func UnrefThreadsafeFunction(env Env, fn ThreadsafeFunction) Status {
))
}
func BasicEnv(env Env) Status {
return Status(C.node_api_basic_env(C.napi_env(env)))
}
func BasicFinalize(env Env, finalizeData, finalizeHint unsafe.Pointer) Status {
return Status(C.node_api_basic_finalize(
C.napi_env(env),
finalizeData,
finalizeHint,
))
}
func ThrowSyntaxError(env Env, code, msg string) Status {
codeCStr, msgCStr := C.CString(code), C.CString(msg)
defer C.free(unsafe.Pointer(codeCStr))
@ -199,54 +187,12 @@ func CreateSyntaxError(env Env, code, msg Value) (Value, Status) {
return result, status
}
func SymbolFor(env Env, description Value) (Value, Status) {
func SymbolFor(env Env, description string) (Value, Status) {
var result Value
status := Status(C.node_api_symbol_for(
C.napi_env(env),
C.napi_value(description),
(*C.napi_value)(unsafe.Pointer(&result)),
))
return result, status
}
func CreateBufferFromArrayBuffer(env Env, arrayBuffer Value, byteOffset, length int) (Value, *byte, Status) {
var result Value
var data *byte
status := Status(C.node_api_create_buffer_from_arraybuffer(
C.napi_env(env),
C.napi_value(arrayBuffer),
C.size_t(byteOffset),
C.size_t(length),
(**C.void)(unsafe.Pointer(&data)),
(*C.napi_value)(unsafe.Pointer(&result)),
))
return result, data, status
}
func CreateExternalStringLatin1(env Env, str string, finalize Finalize, finalizeHint unsafe.Pointer) (Value, Status) {
cstr := C.CString(str)
defer C.free(unsafe.Pointer(cstr))
var result Value
status := Status(C.node_api_create_external_string_latin1(
C.napi_env(env),
cstr,
C.size_t(len([]byte(str))),
C.napi_finalize(finalize),
finalizeHint,
(*C.napi_value)(unsafe.Pointer(&result)),
))
return result, status
}
func CreateExternalStringUtf16(env Env, str []uint16, finalize Finalize, finalizeHint unsafe.Pointer) (Value, Status) {
var result Value
status := Status(C.node_api_create_external_string_utf16(
C.napi_env(env),
(*C.char16_t)(unsafe.Pointer(&str[0])),
C.size_t(len(str)),
C.napi_finalize(finalize),
finalizeHint,
C.CString(description),
C.size_t(len(description)),
(*C.napi_value)(unsafe.Pointer(&result)),
))
return result, status
@ -290,11 +236,3 @@ func CreatePropertyKeyUtf8(env Env, str string) (Value, Status) {
))
return result, status
}
func PostFinalizer(env Env, finalizeData, finalizeHint unsafe.Pointer) Status {
return Status(C.node_api_post_finalizer(
C.napi_env(env),
finalizeData,
finalizeHint,
))
}

View File

@ -1,5 +1,9 @@
package napi
/*
#include <node/node_api.h>
*/
import "C"
import "unsafe"
type PropertyDescriptor struct {
@ -15,6 +19,15 @@ type PropertyDescriptor struct {
type Finalize func(env Env, finalizeData, finalizeHint unsafe.Pointer)
func FinalizeToFinalizer(fn Finalize) Finalizer {
return func(env C.napi_env, finalizeData, finalizeHint unsafe.Pointer) {
fn(Env(env), finalizeData, finalizeHint)
}
}
// Finalizer as a C-compatible function pointer type
type Finalizer func(env C.napi_env, finalizeData, finalizeHint unsafe.Pointer)
type Reference struct {
Ref unsafe.Pointer
}