WIP: feat(node_api): Add missing functions #7
182
.gitignore
vendored
Normal file
182
.gitignore
vendored
Normal file
@ -0,0 +1,182 @@
|
||||
### Node ###
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
lerna-debug.log*
|
||||
.pnpm-debug.log*
|
||||
|
||||
# Diagnostic reports (https://nodejs.org/api/report.html)
|
||||
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
||||
|
||||
# Runtime data
|
||||
pids
|
||||
*.pid
|
||||
*.seed
|
||||
*.pid.lock
|
||||
|
||||
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||
lib-cov
|
||||
|
||||
# Coverage directory used by tools like istanbul
|
||||
coverage
|
||||
*.lcov
|
||||
|
||||
# nyc test coverage
|
||||
.nyc_output
|
||||
|
||||
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
|
||||
.grunt
|
||||
|
||||
# Bower dependency directory (https://bower.io/)
|
||||
bower_components
|
||||
|
||||
# node-waf configuration
|
||||
.lock-wscript
|
||||
|
||||
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
||||
build/Release
|
||||
|
||||
# Dependency directories
|
||||
node_modules/
|
||||
jspm_packages/
|
||||
|
||||
# Snowpack dependency directory (https://snowpack.dev/)
|
||||
web_modules/
|
||||
|
||||
# TypeScript cache
|
||||
*.tsbuildinfo
|
||||
|
||||
# Optional npm cache directory
|
||||
.npm
|
||||
|
||||
# Optional eslint cache
|
||||
.eslintcache
|
||||
|
||||
# Optional stylelint cache
|
||||
.stylelintcache
|
||||
|
||||
# Microbundle cache
|
||||
.rpt2_cache/
|
||||
.rts2_cache_cjs/
|
||||
.rts2_cache_es/
|
||||
.rts2_cache_umd/
|
||||
|
||||
# Optional REPL history
|
||||
.node_repl_history
|
||||
|
||||
# Output of 'npm pack'
|
||||
*.tgz
|
||||
|
||||
# Yarn Integrity file
|
||||
.yarn-integrity
|
||||
|
||||
# dotenv environment variable files
|
||||
.env
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
.env.local
|
||||
|
||||
# parcel-bundler cache (https://parceljs.org/)
|
||||
.cache
|
||||
.parcel-cache
|
||||
|
||||
# Next.js build output
|
||||
.next
|
||||
out
|
||||
|
||||
# Nuxt.js build / generate output
|
||||
.nuxt
|
||||
dist
|
||||
|
||||
# Gatsby files
|
||||
.cache/
|
||||
# Comment in the public line in if your project uses Gatsby and not Next.js
|
||||
# https://nextjs.org/blog/next-9-1#public-directory-support
|
||||
# public
|
||||
|
||||
# vuepress build output
|
||||
.vuepress/dist
|
||||
|
||||
# vuepress v2.x temp and cache directory
|
||||
.temp
|
||||
|
||||
# Docusaurus cache and generated files
|
||||
.docusaurus
|
||||
|
||||
# Serverless directories
|
||||
.serverless/
|
||||
|
||||
# FuseBox cache
|
||||
.fusebox/
|
||||
|
||||
# DynamoDB Local files
|
||||
.dynamodb/
|
||||
|
||||
# TernJS port file
|
||||
.tern-port
|
||||
|
||||
# Stores VSCode versions used for testing VSCode extensions
|
||||
.vscode-test
|
||||
|
||||
# yarn v2
|
||||
.yarn/cache
|
||||
.yarn/unplugged
|
||||
.yarn/build-state.yml
|
||||
.yarn/install-state.gz
|
||||
.pnp.*
|
||||
|
||||
### Node Patch ###
|
||||
# Serverless Webpack directories
|
||||
.webpack/
|
||||
|
||||
# Optional stylelint cache
|
||||
|
||||
# SvelteKit build / generate output
|
||||
.svelte-kit
|
||||
|
||||
### Git template
|
||||
# Created by git for backups. To disable backups in Git:
|
||||
# $ git config --global mergetool.keepBackup false
|
||||
*.orig
|
||||
|
||||
# Created by git when using merge tools for conflicts
|
||||
*.BACKUP.*
|
||||
*.BASE.*
|
||||
*.LOCAL.*
|
||||
*.REMOTE.*
|
||||
*_BACKUP_*.txt
|
||||
*_BASE_*.txt
|
||||
*_LOCAL_*.txt
|
||||
*_REMOTE_*.txt
|
||||
|
||||
### Go template
|
||||
# If you prefer the allow list template instead of the deny list, see community template:
|
||||
# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore
|
||||
#
|
||||
# Binaries for programs and plugins
|
||||
*.exe
|
||||
*.exe~
|
||||
*.dll
|
||||
*.so
|
||||
*.dylib
|
||||
|
||||
# Test binary, built with `go test -c`
|
||||
*.test
|
||||
|
||||
# Output of the go coverage tool, specifically when used with LiteIDE
|
||||
*.out
|
||||
|
||||
# Dependency directories (remove the comment below to include it)
|
||||
vendor/
|
||||
|
||||
# Go workspace file
|
||||
go.work
|
||||
|
||||
### CUSTOM IGNORES ###
|
||||
temp/
|
||||
tmp/
|
||||
build/
|
108
CONTRIBUTING.md
Normal file
108
CONTRIBUTING.md
Normal 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
|
||||
}
|
||||
```
|
@ -102,14 +102,14 @@ func (p *Promise) ensurePending() {
|
||||
}
|
||||
|
||||
func (p *Promise) settle() {
|
||||
st := napi.CallThreadsafeFunction(p.ThreadsafeFunction)
|
||||
st := napi.CallThreadsafeFunction(p.ThreadsafeFunction, napi.Blocking)
|
||||
if st != napi.StatusOK {
|
||||
panic(napi.StatusError(st))
|
||||
}
|
||||
}
|
||||
|
||||
func (p *Promise) release() {
|
||||
st := napi.ReleaseThreadsafeFunction(p.ThreadsafeFunction)
|
||||
st := napi.ReleaseThreadsafeFunction(p.ThreadsafeFunction, napi.Release)
|
||||
if st == napi.StatusClosing {
|
||||
p.ThreadsafeFunction = nil
|
||||
} else if st != napi.StatusOK {
|
||||
|
883
js_native_api.go
883
js_native_api.go
@ -339,3 +339,886 @@ func GetInstanceData(env Env) (any, Status) {
|
||||
|
||||
return provider.GetUserData(), status
|
||||
}
|
||||
|
||||
func CreateBuffer(env Env, length int) (Value, []byte, Status) {
|
||||
var result Value
|
||||
data := make([]byte, length)
|
||||
dataPtr := unsafe.Pointer(&data[0])
|
||||
|
||||
status := Status(C.napi_create_buffer(
|
||||
C.napi_env(env),
|
||||
C.size_t(length),
|
||||
&dataPtr,
|
||||
(*C.napi_value)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, data, 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(unsafe.Pointer(&finalizer)),
|
||||
finalizeHint,
|
||||
(*C.napi_value)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func GetValueInt32(env Env, value Value) (int32, Status) {
|
||||
var result C.int32_t
|
||||
status := Status(C.napi_get_value_int32(
|
||||
C.napi_env(env),
|
||||
C.napi_value(value),
|
||||
&result,
|
||||
))
|
||||
return int32(result), status
|
||||
}
|
||||
|
||||
func GetValueUint32(env Env, value Value) (uint32, Status) {
|
||||
var result uint32
|
||||
status := Status(C.napi_get_value_uint32(
|
||||
C.napi_env(env),
|
||||
C.napi_value(value),
|
||||
(*C.uint32_t)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func GetValueInt64(env Env, value Value) (int64, Status) {
|
||||
var result int64
|
||||
status := Status(C.napi_get_value_int64(
|
||||
C.napi_env(env),
|
||||
C.napi_value(value),
|
||||
(*C.int64_t)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func GetValueBigIntInt64(env Env, value Value) (int64, bool, Status) {
|
||||
var result int64
|
||||
var lossless bool
|
||||
status := Status(C.napi_get_value_bigint_int64(
|
||||
C.napi_env(env),
|
||||
C.napi_value(value),
|
||||
(*C.int64_t)(unsafe.Pointer(&result)),
|
||||
(*C.bool)(unsafe.Pointer(&lossless)),
|
||||
))
|
||||
return result, lossless, status
|
||||
}
|
||||
|
||||
func GetValueBigIntWords(env Env, value Value, signBit int, wordCount int, words *uint64) Status {
|
||||
return Status(C.napi_get_value_bigint_words(
|
||||
C.napi_env(env),
|
||||
C.napi_value(value),
|
||||
(*C.int)(unsafe.Pointer(&signBit)),
|
||||
(*C.size_t)(unsafe.Pointer(&wordCount)),
|
||||
(*C.uint64_t)(unsafe.Pointer(words)),
|
||||
))
|
||||
}
|
||||
|
||||
func GetValueExternal(env Env, value Value) (unsafe.Pointer, Status) {
|
||||
var result unsafe.Pointer
|
||||
status := Status(C.napi_get_value_external(
|
||||
C.napi_env(env),
|
||||
C.napi_value(value),
|
||||
&result,
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func CoerceToBool(env Env, value Value) (Value, Status) {
|
||||
var result Value
|
||||
status := Status(C.napi_coerce_to_bool(
|
||||
C.napi_env(env),
|
||||
C.napi_value(value),
|
||||
(*C.napi_value)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func CoerceToNumber(env Env, value Value) (Value, Status) {
|
||||
var result Value
|
||||
status := Status(C.napi_coerce_to_number(
|
||||
C.napi_env(env),
|
||||
C.napi_value(value),
|
||||
(*C.napi_value)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func CoerceToObject(env Env, value Value) (Value, Status) {
|
||||
var result Value
|
||||
status := Status(C.napi_coerce_to_object(
|
||||
C.napi_env(env),
|
||||
C.napi_value(value),
|
||||
(*C.napi_value)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func CoerceToString(env Env, value Value) (Value, Status) {
|
||||
var result Value
|
||||
status := Status(C.napi_coerce_to_string(
|
||||
C.napi_env(env),
|
||||
C.napi_value(value),
|
||||
(*C.napi_value)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, 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]),
|
||||
&copiedDataPtr,
|
||||
(*C.napi_value)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, copiedData, 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),
|
||||
&dataPtr,
|
||||
&length,
|
||||
))
|
||||
return data, int(length), status
|
||||
}
|
||||
|
||||
func GetArrayLength(env Env, value Value) (int, Status) {
|
||||
var length C.uint32_t
|
||||
status := Status(C.napi_get_array_length(
|
||||
C.napi_env(env),
|
||||
C.napi_value(value),
|
||||
&length,
|
||||
))
|
||||
return int(length), status
|
||||
}
|
||||
|
||||
func GetPrototype(env Env, value Value) (Value, Status) {
|
||||
var result Value
|
||||
status := Status(C.napi_get_prototype(
|
||||
C.napi_env(env),
|
||||
C.napi_value(value),
|
||||
(*C.napi_value)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func InstanceOf(env Env, object, constructor Value) (bool, Status) {
|
||||
var result bool
|
||||
status := Status(C.napi_instanceof(
|
||||
C.napi_env(env),
|
||||
C.napi_value(object),
|
||||
C.napi_value(constructor),
|
||||
(*C.bool)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func IsArray(env Env, value Value) (bool, Status) {
|
||||
var result bool
|
||||
status := Status(C.napi_is_array(
|
||||
C.napi_env(env),
|
||||
C.napi_value(value),
|
||||
(*C.bool)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func IsBuffer(env Env, value Value) (bool, Status) {
|
||||
var result bool
|
||||
status := Status(C.napi_is_buffer(
|
||||
C.napi_env(env),
|
||||
C.napi_value(value),
|
||||
(*C.bool)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func IsError(env Env, value Value) (bool, Status) {
|
||||
var result bool
|
||||
status := Status(C.napi_is_error(
|
||||
C.napi_env(env),
|
||||
C.napi_value(value),
|
||||
(*C.bool)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func IsPromise(env Env, value Value) (bool, Status) {
|
||||
var result bool
|
||||
status := Status(C.napi_is_promise(
|
||||
C.napi_env(env),
|
||||
C.napi_value(value),
|
||||
(*C.bool)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func IsTypedArray(env Env, value Value) (bool, Status) {
|
||||
var result bool
|
||||
status := Status(C.napi_is_typedarray(
|
||||
C.napi_env(env),
|
||||
C.napi_value(value),
|
||||
(*C.bool)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, 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,
|
||||
&dataPtr,
|
||||
(*C.napi_value)(unsafe.Pointer(&arrayBuffer)),
|
||||
&byteOffset,
|
||||
))
|
||||
return type_, int(length), data, arrayBuffer, int(byteOffset), status
|
||||
}
|
||||
|
||||
func CreateTypedArray(env Env, type_ TypedArrayType, length int, arrayBuffer Value, byteOffset int) (Value, Status) {
|
||||
var result Value
|
||||
status := Status(C.napi_create_typedarray(
|
||||
C.napi_env(env),
|
||||
C.napi_typedarray_type(type_),
|
||||
C.size_t(length),
|
||||
C.napi_value(arrayBuffer),
|
||||
C.size_t(byteOffset),
|
||||
(*C.napi_value)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func AdjustExternalMemory(env Env, change int64) (int64, Status) {
|
||||
var result int64
|
||||
status := Status(C.napi_adjust_external_memory(
|
||||
C.napi_env(env),
|
||||
C.int64_t(change),
|
||||
(*C.int64_t)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func CreateDataView(env Env, length int, arrayBuffer Value, byteOffset int) (Value, Status) {
|
||||
var result Value
|
||||
status := Status(C.napi_create_dataview(
|
||||
C.napi_env(env),
|
||||
C.size_t(length),
|
||||
C.napi_value(arrayBuffer),
|
||||
C.size_t(byteOffset),
|
||||
(*C.napi_value)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, 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,
|
||||
&dataPtr,
|
||||
(*C.napi_value)(unsafe.Pointer(&arrayBuffer)),
|
||||
&byteOffset,
|
||||
))
|
||||
return int(length), data, arrayBuffer, int(byteOffset), 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
|
||||
}
|
||||
|
||||
func HasOwnProperty(env Env, object, key Value) (bool, Status) {
|
||||
var result bool
|
||||
status := Status(C.napi_has_own_property(
|
||||
C.napi_env(env),
|
||||
C.napi_value(object),
|
||||
C.napi_value(key),
|
||||
(*C.bool)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func HasProperty(env Env, object, key Value) (bool, Status) {
|
||||
var result bool
|
||||
status := Status(C.napi_has_property(
|
||||
C.napi_env(env),
|
||||
C.napi_value(object),
|
||||
C.napi_value(key),
|
||||
(*C.bool)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func GetPropertyNames(env Env, object Value) (Value, Status) {
|
||||
var result Value
|
||||
status := Status(C.napi_get_property_names(
|
||||
C.napi_env(env),
|
||||
C.napi_value(object),
|
||||
(*C.napi_value)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func DefineProperties(env Env, object Value, properties []PropertyDescriptor) Status {
|
||||
return Status(C.napi_define_properties(
|
||||
C.napi_env(env),
|
||||
C.napi_value(object),
|
||||
C.size_t(len(properties)),
|
||||
(*C.napi_property_descriptor)(unsafe.Pointer(&properties[0])),
|
||||
))
|
||||
}
|
||||
|
||||
// Wrap function to use the Finalizer type internally
|
||||
func Wrap(env Env, jsObject Value, nativeObject unsafe.Pointer, finalize Finalize, finalizeHint unsafe.Pointer) Status {
|
||||
var result Reference
|
||||
status := Status(C.napi_wrap(
|
||||
C.napi_env(env),
|
||||
C.napi_value(jsObject),
|
||||
nativeObject,
|
||||
C.napi_finalize(unsafe.Pointer(&finalize)),
|
||||
finalizeHint,
|
||||
(*C.napi_ref)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return status
|
||||
}
|
||||
|
||||
func Unwrap(env Env, jsObject Value) (unsafe.Pointer, Status) {
|
||||
var nativeObject unsafe.Pointer
|
||||
status := Status(C.napi_unwrap(
|
||||
C.napi_env(env),
|
||||
C.napi_value(jsObject),
|
||||
&nativeObject,
|
||||
))
|
||||
return nativeObject, 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,
|
||||
))
|
||||
}
|
||||
|
||||
func OpenHandleScope(env Env) (HandleScope, Status) {
|
||||
var scope HandleScope
|
||||
status := Status(C.napi_open_handle_scope(
|
||||
C.napi_env(env),
|
||||
(*C.napi_handle_scope)(unsafe.Pointer(&scope)),
|
||||
))
|
||||
return scope, status
|
||||
}
|
||||
|
||||
func CloseHandleScope(env Env, scope HandleScope) Status {
|
||||
return Status(C.napi_close_handle_scope(
|
||||
C.napi_env(env),
|
||||
C.napi_handle_scope(unsafe.Pointer(&scope)),
|
||||
))
|
||||
}
|
||||
|
||||
func OpenEscapableHandleScope(env Env) (EscapableHandleScope, Status) {
|
||||
var scope EscapableHandleScope
|
||||
status := Status(C.napi_open_escapable_handle_scope(
|
||||
C.napi_env(env),
|
||||
(*C.napi_escapable_handle_scope)(unsafe.Pointer(&scope)),
|
||||
))
|
||||
return scope, 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(unsafe.Pointer(&scope)),
|
||||
))
|
||||
}
|
||||
|
||||
func EscapeHandle(env Env, scope EscapableHandleScope, escapee Value) (Value, Status) {
|
||||
var result Value
|
||||
status := Status(C.napi_escape_handle(
|
||||
C.napi_env(env),
|
||||
C.napi_escapable_handle_scope(unsafe.Pointer(&scope)),
|
||||
C.napi_value(escapee),
|
||||
(*C.napi_value)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func CreateReference(env Env, value Value, initialRefcount int) (Reference, Status) {
|
||||
var ref Reference
|
||||
status := Status(C.napi_create_reference(
|
||||
C.napi_env(env),
|
||||
C.napi_value(value),
|
||||
C.uint32_t(initialRefcount),
|
||||
(*C.napi_ref)(unsafe.Pointer(&ref)),
|
||||
))
|
||||
return ref, status
|
||||
}
|
||||
|
||||
func DeleteReference(env Env, ref Reference) Status {
|
||||
return Status(C.napi_delete_reference(
|
||||
C.napi_env(env),
|
||||
C.napi_ref(unsafe.Pointer(&ref)),
|
||||
))
|
||||
}
|
||||
|
||||
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(unsafe.Pointer(&ref)),
|
||||
&result,
|
||||
))
|
||||
return int(result), status
|
||||
}
|
||||
|
||||
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.Ref),
|
||||
&result,
|
||||
))
|
||||
return int(result), status
|
||||
}
|
||||
|
||||
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(unsafe.Pointer(&ref)),
|
||||
(*C.napi_value)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func GetValueBigIntUint64(env Env, value Value) (uint64, bool, Status) {
|
||||
var result uint64
|
||||
var lossless bool
|
||||
status := Status(C.napi_get_value_bigint_uint64(
|
||||
C.napi_env(env),
|
||||
C.napi_value(value),
|
||||
(*C.uint64_t)(unsafe.Pointer(&result)),
|
||||
(*C.bool)(unsafe.Pointer(&lossless)),
|
||||
))
|
||||
return result, lossless, status
|
||||
}
|
||||
|
||||
func CreateBigIntInt64(env Env, value int64) (Value, Status) {
|
||||
var result Value
|
||||
status := Status(C.napi_create_bigint_int64(
|
||||
C.napi_env(env),
|
||||
C.int64_t(value),
|
||||
(*C.napi_value)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func CreateBigIntUint64(env Env, value uint64) (Value, Status) {
|
||||
var result Value
|
||||
status := Status(C.napi_create_bigint_uint64(
|
||||
C.napi_env(env),
|
||||
C.uint64_t(value),
|
||||
(*C.napi_value)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func CreateBigIntWords(env Env, signBit int, wordCount int, words *uint64) (Value, Status) {
|
||||
var result Value
|
||||
status := Status(C.napi_create_bigint_words(
|
||||
C.napi_env(env),
|
||||
C.int(signBit),
|
||||
C.size_t(wordCount),
|
||||
(*C.uint64_t)(unsafe.Pointer(words)),
|
||||
(*C.napi_value)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func IsDate(env Env, value Value) (bool, Status) {
|
||||
var result bool
|
||||
status := Status(C.napi_is_date(
|
||||
C.napi_env(env),
|
||||
C.napi_value(value),
|
||||
(*C.bool)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func IsDetachedArrayBuffer(env Env, value Value) (bool, Status) {
|
||||
var result bool
|
||||
status := Status(C.napi_is_detached_arraybuffer(
|
||||
C.napi_env(env),
|
||||
C.napi_value(value),
|
||||
(*C.bool)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func DetachArrayBuffer(env Env, value Value) Status {
|
||||
return Status(C.napi_detach_arraybuffer(
|
||||
C.napi_env(env),
|
||||
C.napi_value(value),
|
||||
))
|
||||
}
|
||||
|
||||
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),
|
||||
&dataPtr,
|
||||
(*C.napi_value)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, data, 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),
|
||||
&dataPtr,
|
||||
&length,
|
||||
))
|
||||
return data, int(length), 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(unsafe.Pointer(&finalizer)),
|
||||
finalizeHint,
|
||||
(*C.napi_value)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func GetElement(env Env, object Value, index int) (Value, Status) {
|
||||
var result Value
|
||||
status := Status(C.napi_get_element(
|
||||
C.napi_env(env),
|
||||
C.napi_value(object),
|
||||
C.uint32_t(index),
|
||||
(*C.napi_value)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func GetProperty(env Env, object, key Value) (Value, Status) {
|
||||
var result Value
|
||||
status := Status(C.napi_get_property(
|
||||
C.napi_env(env),
|
||||
C.napi_value(object),
|
||||
C.napi_value(key),
|
||||
(*C.napi_value)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
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 {
|
||||
cname := C.CString(name)
|
||||
defer C.free(unsafe.Pointer(cname))
|
||||
return Status(C.napi_set_named_property(
|
||||
C.napi_env(env),
|
||||
C.napi_value(object),
|
||||
cname,
|
||||
C.napi_value(value),
|
||||
))
|
||||
}
|
||||
|
||||
func GetNamedProperty(env Env, object Value, name string) (Value, Status) {
|
||||
cname := C.CString(name)
|
||||
defer C.free(unsafe.Pointer(cname))
|
||||
var result Value
|
||||
status := Status(C.napi_get_named_property(
|
||||
C.napi_env(env),
|
||||
C.napi_value(object),
|
||||
cname,
|
||||
(*C.napi_value)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func HasNamedProperty(env Env, object Value, name string) (bool, Status) {
|
||||
cname := C.CString(name)
|
||||
defer C.free(unsafe.Pointer(cname))
|
||||
var result bool
|
||||
status := Status(C.napi_has_named_property(
|
||||
C.napi_env(env),
|
||||
C.napi_value(object),
|
||||
cname,
|
||||
(*C.bool)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func HasElement(env Env, object Value, index int) (bool, Status) {
|
||||
var result bool
|
||||
status := Status(C.napi_has_element(
|
||||
C.napi_env(env),
|
||||
C.napi_value(object),
|
||||
C.uint32_t(index),
|
||||
(*C.bool)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
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 {
|
||||
return Status(C.napi_object_freeze(
|
||||
C.napi_env(env),
|
||||
C.napi_value(object),
|
||||
))
|
||||
}
|
||||
|
||||
func ObjectSeal(env Env, object Value) Status {
|
||||
return Status(C.napi_object_seal(
|
||||
C.napi_env(env),
|
||||
C.napi_value(object),
|
||||
))
|
||||
}
|
||||
|
||||
func ThrowTypeError(env Env, code, msg string) Status {
|
||||
codeCStr, msgCCstr := C.CString(code), C.CString(msg)
|
||||
defer C.free(unsafe.Pointer(codeCStr))
|
||||
defer C.free(unsafe.Pointer(msgCCstr))
|
||||
|
||||
return Status(C.napi_throw_type_error(
|
||||
C.napi_env(env),
|
||||
codeCStr,
|
||||
msgCCstr,
|
||||
))
|
||||
}
|
||||
|
||||
func ThrowRangeError(env Env, code, msg string) Status {
|
||||
codeCStr, msgCCstr := C.CString(code), C.CString(msg)
|
||||
defer C.free(unsafe.Pointer(codeCStr))
|
||||
defer C.free(unsafe.Pointer(msgCCstr))
|
||||
|
||||
return Status(C.napi_throw_range_error(
|
||||
C.napi_env(env),
|
||||
codeCStr,
|
||||
msgCCstr,
|
||||
))
|
||||
}
|
||||
|
||||
func CreateTypeError(env Env, code, msg Value) (Value, Status) {
|
||||
var result Value
|
||||
status := Status(C.napi_create_type_error(
|
||||
C.napi_env(env),
|
||||
C.napi_value(code),
|
||||
C.napi_value(msg),
|
||||
(*C.napi_value)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func CreateRangeError(env Env, code, msg Value) (Value, Status) {
|
||||
var result Value
|
||||
status := Status(C.napi_create_range_error(
|
||||
C.napi_env(env),
|
||||
C.napi_value(code),
|
||||
C.napi_value(msg),
|
||||
(*C.napi_value)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func IsExceptionPending(env Env) (bool, Status) {
|
||||
var result bool
|
||||
status := Status(C.napi_is_exception_pending(
|
||||
C.napi_env(env),
|
||||
(*C.bool)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func GetAndClearLastException(env Env) (Value, Status) {
|
||||
var result Value
|
||||
status := Status(C.napi_get_and_clear_last_exception(
|
||||
C.napi_env(env),
|
||||
(*C.napi_value)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
type CallbackScope struct {
|
||||
scope C.napi_callback_scope
|
||||
}
|
||||
|
||||
// CloseCallbackScope Function to close a callback scope
|
||||
func CloseCallbackScope(env Env, scope CallbackScope) Status {
|
||||
return Status(C.napi_close_callback_scope(
|
||||
C.napi_env(env),
|
||||
scope.scope,
|
||||
))
|
||||
}
|
||||
|
||||
// GetExtendedErrorInfo Function to retrieve extended error information
|
||||
func GetExtendedErrorInfo(env Env) (*C.napi_extended_error_info, Status) {
|
||||
var errorInfo *C.napi_extended_error_info
|
||||
status := Status(C.napi_get_last_error_info(
|
||||
C.napi_env(env),
|
||||
&errorInfo,
|
||||
))
|
||||
return errorInfo, status
|
||||
}
|
||||
|
||||
func CreateInt32(env Env, value int32) (Value, Status) {
|
||||
var result Value
|
||||
status := Status(C.napi_create_int32(
|
||||
C.napi_env(env),
|
||||
C.int32_t(value),
|
||||
(*C.napi_value)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func CreateUint32(env Env, value uint32) (Value, Status) {
|
||||
var result Value
|
||||
status := Status(C.napi_create_uint32(
|
||||
C.napi_env(env),
|
||||
C.uint32_t(value),
|
||||
(*C.napi_value)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func CreateInt64(env Env, value int64) (Value, Status) {
|
||||
var result Value
|
||||
status := Status(C.napi_create_int64(
|
||||
C.napi_env(env),
|
||||
C.int64_t(value),
|
||||
(*C.napi_value)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func CreateStringLatin1(env Env, str string) (Value, Status) {
|
||||
cstr := C.CString(str)
|
||||
defer C.free(unsafe.Pointer(cstr))
|
||||
|
||||
var result Value
|
||||
status := Status(C.napi_create_string_latin1(
|
||||
C.napi_env(env),
|
||||
cstr,
|
||||
C.size_t(len([]byte(str))),
|
||||
(*C.napi_value)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func CreateStringUtf16(env Env, str []uint16) (Value, Status) {
|
||||
var result Value
|
||||
status := Status(C.napi_create_string_utf16(
|
||||
C.napi_env(env),
|
||||
(*C.char16_t)(unsafe.Pointer(&str[0])),
|
||||
C.size_t(len(str)),
|
||||
(*C.napi_value)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func CallFunction(env Env, recv Value, fn Value, argc int, argv []Value) (Value, Status) {
|
||||
var result Value
|
||||
status := Status(C.napi_call_function(
|
||||
C.napi_env(env),
|
||||
C.napi_value(recv),
|
||||
C.napi_value(fn),
|
||||
C.size_t(argc),
|
||||
(*C.napi_value)(unsafe.Pointer(&argv[0])),
|
||||
(*C.napi_value)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func GetNewTarget(env Env, info CallbackInfo) (Value, Status) {
|
||||
var result Value
|
||||
status := Status(C.napi_get_new_target(
|
||||
C.napi_env(env),
|
||||
C.napi_callback_info(info),
|
||||
(*C.napi_value)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func NewInstance(env Env, constructor Value, argc int, argv []Value) (Value, Status) {
|
||||
var result Value
|
||||
status := Status(C.napi_new_instance(
|
||||
C.napi_env(env),
|
||||
C.napi_value(constructor),
|
||||
C.size_t(argc),
|
||||
(*C.napi_value)(unsafe.Pointer(&argv[0])),
|
||||
(*C.napi_value)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
34
key_type.go
Normal file
34
key_type.go
Normal 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
|
||||
)
|
105
node_api.go
105
node_api.go
@ -1,6 +1,7 @@
|
||||
package napi
|
||||
|
||||
/*
|
||||
#include <stdlib.h>
|
||||
#include <node/node_api.h>
|
||||
*/
|
||||
import "C"
|
||||
@ -113,11 +114,12 @@ func CreateThreadsafeFunction(
|
||||
|
||||
func CallThreadsafeFunction(
|
||||
fn ThreadsafeFunction,
|
||||
mode ThreadsafeFunctionCallMode,
|
||||
) Status {
|
||||
return Status(C.napi_call_threadsafe_function(
|
||||
C.napi_threadsafe_function(fn),
|
||||
nil,
|
||||
C.napi_tsfn_blocking,
|
||||
C.napi_threadsafe_function_call_mode(mode),
|
||||
))
|
||||
}
|
||||
|
||||
@ -129,9 +131,108 @@ func AcquireThreadsafeFunction(fn ThreadsafeFunction) Status {
|
||||
|
||||
func ReleaseThreadsafeFunction(
|
||||
fn ThreadsafeFunction,
|
||||
mode ThreadsafeFunctionReleaseMode,
|
||||
) Status {
|
||||
return Status(C.napi_release_threadsafe_function(
|
||||
C.napi_threadsafe_function(fn),
|
||||
C.napi_tsfn_release,
|
||||
C.napi_threadsafe_function_release_mode(mode),
|
||||
))
|
||||
}
|
||||
|
||||
func GetThreadsafeFunctionContext(
|
||||
fn ThreadsafeFunction,
|
||||
) (unsafe.Pointer, Status) {
|
||||
var context unsafe.Pointer
|
||||
status := Status(C.napi_get_threadsafe_function_context(
|
||||
C.napi_threadsafe_function(fn),
|
||||
&context,
|
||||
))
|
||||
return context, status
|
||||
}
|
||||
|
||||
func RefThreadsafeFunction(env Env, fn ThreadsafeFunction) Status {
|
||||
return Status(C.napi_ref_threadsafe_function(
|
||||
C.napi_env(env),
|
||||
C.napi_threadsafe_function(fn),
|
||||
))
|
||||
}
|
||||
|
||||
func UnrefThreadsafeFunction(env Env, fn ThreadsafeFunction) Status {
|
||||
return Status(C.napi_unref_threadsafe_function(
|
||||
C.napi_env(env),
|
||||
C.napi_threadsafe_function(fn),
|
||||
))
|
||||
}
|
||||
|
||||
func ThrowSyntaxError(env Env, code, msg string) Status {
|
||||
codeCStr, msgCStr := C.CString(code), C.CString(msg)
|
||||
defer C.free(unsafe.Pointer(codeCStr))
|
||||
defer C.free(unsafe.Pointer(msgCStr))
|
||||
|
||||
return Status(C.node_api_throw_syntax_error(
|
||||
C.napi_env(env),
|
||||
codeCStr,
|
||||
msgCStr,
|
||||
))
|
||||
}
|
||||
|
||||
func CreateSyntaxError(env Env, code, msg Value) (Value, Status) {
|
||||
var result Value
|
||||
status := Status(C.node_api_create_syntax_error(
|
||||
C.napi_env(env),
|
||||
C.napi_value(code),
|
||||
C.napi_value(msg),
|
||||
(*C.napi_value)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func SymbolFor(env Env, description string) (Value, Status) {
|
||||
var result Value
|
||||
status := Status(C.node_api_symbol_for(
|
||||
C.napi_env(env),
|
||||
C.CString(description),
|
||||
C.size_t(len(description)),
|
||||
(*C.napi_value)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func CreatePropertyKeyLatin1(env Env, str string) (Value, Status) {
|
||||
cstr := C.CString(str)
|
||||
defer C.free(unsafe.Pointer(cstr))
|
||||
|
||||
var result Value
|
||||
status := Status(C.node_api_create_property_key_latin1(
|
||||
C.napi_env(env),
|
||||
cstr,
|
||||
C.size_t(len([]byte(str))),
|
||||
(*C.napi_value)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func CreatePropertyKeyUtf16(env Env, str []uint16) (Value, Status) {
|
||||
var result Value
|
||||
status := Status(C.node_api_create_property_key_utf16(
|
||||
C.napi_env(env),
|
||||
(*C.char16_t)(unsafe.Pointer(&str[0])),
|
||||
C.size_t(len(str)),
|
||||
(*C.napi_value)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
||||
func CreatePropertyKeyUtf8(env Env, str string) (Value, Status) {
|
||||
cstr := C.CString(str)
|
||||
defer C.free(unsafe.Pointer(cstr))
|
||||
|
||||
var result Value
|
||||
status := Status(C.node_api_create_property_key_utf8(
|
||||
C.napi_env(env),
|
||||
cstr,
|
||||
C.size_t(len([]byte(str))),
|
||||
(*C.napi_value)(unsafe.Pointer(&result)),
|
||||
))
|
||||
return result, status
|
||||
}
|
||||
|
18
property_attrib_type.go
Normal file
18
property_attrib_type.go
Normal file
@ -0,0 +1,18 @@
|
||||
package napi
|
||||
|
||||
/*
|
||||
#include <node/node_api.h>
|
||||
*/
|
||||
import "C"
|
||||
|
||||
type PropertyAttributes C.napi_property_attributes
|
||||
|
||||
const (
|
||||
Default PropertyAttributes = C.napi_default
|
||||
Writable PropertyAttributes = C.napi_writable
|
||||
Enumerable PropertyAttributes = C.napi_enumerable
|
||||
Configurable PropertyAttributes = C.napi_configurable
|
||||
Static PropertyAttributes = C.napi_static
|
||||
DefaultMethod PropertyAttributes = C.napi_default_method
|
||||
DefaultJSProperty PropertyAttributes = C.napi_default_jsproperty
|
||||
)
|
20
threadsafe_function_type.go
Normal file
20
threadsafe_function_type.go
Normal file
@ -0,0 +1,20 @@
|
||||
package napi
|
||||
|
||||
/*
|
||||
#include <node/node_api.h>
|
||||
*/
|
||||
import "C"
|
||||
|
||||
type ThreadsafeFunctionReleaseMode C.napi_threadsafe_function_release_mode
|
||||
|
||||
const (
|
||||
Release ThreadsafeFunctionReleaseMode = C.napi_tsfn_release
|
||||
Abort ThreadsafeFunctionReleaseMode = C.napi_tsfn_abort
|
||||
)
|
||||
|
||||
type ThreadsafeFunctionCallMode C.napi_threadsafe_function_call_mode
|
||||
|
||||
const (
|
||||
NonBlocking ThreadsafeFunctionCallMode = C.napi_tsfn_nonblocking
|
||||
Blocking ThreadsafeFunctionCallMode = C.napi_tsfn_blocking
|
||||
)
|
22
typed_array_type.go
Normal file
22
typed_array_type.go
Normal file
@ -0,0 +1,22 @@
|
||||
package napi
|
||||
|
||||
/*
|
||||
#include <node/node_api.h>
|
||||
*/
|
||||
import "C"
|
||||
|
||||
type TypedArrayType C.napi_typedarray_type
|
||||
|
||||
const (
|
||||
TypedArrayInt8Array TypedArrayType = C.napi_int8_array
|
||||
TypedArrayUint8Array TypedArrayType = C.napi_uint8_array
|
||||
TypedArrayUint8ClampedArray TypedArrayType = C.napi_uint8_clamped_array
|
||||
TypedArrayInt16Array TypedArrayType = C.napi_int16_array
|
||||
TypedArrayUint16Array TypedArrayType = C.napi_uint16_array
|
||||
TypedArrayInt32Array TypedArrayType = C.napi_int32_array
|
||||
TypedArrayUint32Array TypedArrayType = C.napi_uint32_array
|
||||
TypedArrayFloat32Array TypedArrayType = C.napi_float32_array
|
||||
TypedArrayFloat64Array TypedArrayType = C.napi_float64_array
|
||||
TypedArrayBigInt64Array TypedArrayType = C.napi_bigint64_array
|
||||
TypedArrayBigUint64Array TypedArrayType = C.napi_biguint64_array
|
||||
)
|
41
types.go
Normal file
41
types.go
Normal file
@ -0,0 +1,41 @@
|
||||
package napi
|
||||
|
||||
/*
|
||||
#include <node/node_api.h>
|
||||
*/
|
||||
import "C"
|
||||
import "unsafe"
|
||||
|
||||
type PropertyDescriptor struct {
|
||||
Utf8name string
|
||||
Name Value
|
||||
Method Callback
|
||||
Getter Callback
|
||||
Setter Callback
|
||||
Value Value
|
||||
Attributes PropertyAttributes
|
||||
Data unsafe.Pointer
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
type EscapableHandleScope struct {
|
||||
Scope unsafe.Pointer
|
||||
}
|
||||
|
||||
type HandleScope struct {
|
||||
Scope unsafe.Pointer
|
||||
}
|
@ -5,7 +5,7 @@ package napi
|
||||
*/
|
||||
import "C"
|
||||
|
||||
type ValueType int
|
||||
type ValueType C.napi_valuetype
|
||||
|
||||
const (
|
||||
ValueTypeUndefined ValueType = C.napi_undefined
|
||||
@ -19,3 +19,30 @@ const (
|
||||
ValueTypeExternal ValueType = C.napi_external
|
||||
ValueTypeBigint ValueType = C.napi_bigint
|
||||
)
|
||||
|
||||
func (v ValueType) String() string {
|
||||
switch v {
|
||||
case ValueTypeUndefined:
|
||||
return "undefined"
|
||||
case ValueTypeNull:
|
||||
return "null"
|
||||
case ValueTypeBoolean:
|
||||
return "boolean"
|
||||
case ValueTypeNumber:
|
||||
return "number"
|
||||
case ValueTypeString:
|
||||
return "string"
|
||||
case ValueTypeSymbol:
|
||||
return "symbol"
|
||||
case ValueTypeObject:
|
||||
return "object"
|
||||
case ValueTypeFunction:
|
||||
return "function"
|
||||
case ValueTypeExternal:
|
||||
return "external"
|
||||
case ValueTypeBigint:
|
||||
return "bigint"
|
||||
default:
|
||||
return "undefined"
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user