feat(napi): implement dataview related apis
This commit is contained in:
parent
809ecfec49
commit
ae8de8a631
4 changed files with 73 additions and 16 deletions
|
@ -164,7 +164,7 @@ yarn test
|
||||||
| [napi_create_object](https://nodejs.org/api/n-api.html#n_api_napi_create_object) | 1 | v8.0.0 | ✅ |
|
| [napi_create_object](https://nodejs.org/api/n-api.html#n_api_napi_create_object) | 1 | v8.0.0 | ✅ |
|
||||||
| [napi_create_symbol](https://nodejs.org/api/n-api.html#n_api_napi_create_symbol) | 1 | v8.0.0 | ✅ |
|
| [napi_create_symbol](https://nodejs.org/api/n-api.html#n_api_napi_create_symbol) | 1 | v8.0.0 | ✅ |
|
||||||
| [napi_create_typedarray](https://nodejs.org/api/n-api.html#n_api_napi_create_typedarray) | 1 | v8.0.0 | ✅ |
|
| [napi_create_typedarray](https://nodejs.org/api/n-api.html#n_api_napi_create_typedarray) | 1 | v8.0.0 | ✅ |
|
||||||
| [napi_create_dataview](https://nodejs.org/api/n-api.html#n_api_napi_create_dataview) | 1 | v8.3.0 | ⛔️ |
|
| [napi_create_dataview](https://nodejs.org/api/n-api.html#n_api_napi_create_dataview) | 1 | v8.3.0 | ✅ |
|
||||||
| [napi_create_int32](https://nodejs.org/api/n-api.html#n_api_napi_create_int32) | 1 | v8.4.0 | ✅ |
|
| [napi_create_int32](https://nodejs.org/api/n-api.html#n_api_napi_create_int32) | 1 | v8.4.0 | ✅ |
|
||||||
| [napi_create_uint32](https://nodejs.org/api/n-api.html#n_api_napi_create_uint32) | 1 | v8.4.0 | ✅ |
|
| [napi_create_uint32](https://nodejs.org/api/n-api.html#n_api_napi_create_uint32) | 1 | v8.4.0 | ✅ |
|
||||||
| [napi_create_int64](https://nodejs.org/api/n-api.html#n_api_napi_create_int64) | 1 | v8.4.0 | ✅ |
|
| [napi_create_int64](https://nodejs.org/api/n-api.html#n_api_napi_create_int64) | 1 | v8.4.0 | ✅ |
|
||||||
|
@ -185,7 +185,7 @@ yarn test
|
||||||
| [napi_get_buffer_info](https://nodejs.org/api/n-api.html#n_api_napi_get_buffer_info) | 1 | v8.0.0 | ✅ |
|
| [napi_get_buffer_info](https://nodejs.org/api/n-api.html#n_api_napi_get_buffer_info) | 1 | v8.0.0 | ✅ |
|
||||||
| [napi_get_prototype](https://nodejs.org/api/n-api.html#n_api_napi_get_prototype) | 1 | v8.0.0 | ✅ |
|
| [napi_get_prototype](https://nodejs.org/api/n-api.html#n_api_napi_get_prototype) | 1 | v8.0.0 | ✅ |
|
||||||
| [napi_get_typedarray_info](https://nodejs.org/api/n-api.html#n_api_napi_get_typedarray_info) | 1 | v8.0.0 | ✅ |
|
| [napi_get_typedarray_info](https://nodejs.org/api/n-api.html#n_api_napi_get_typedarray_info) | 1 | v8.0.0 | ✅ |
|
||||||
| [napi_get_dataview_info](https://nodejs.org/api/n-api.html#n_api_napi_get_dataview_info) | 1 | v8.3.0 | ⛔️ |
|
| [napi_get_dataview_info](https://nodejs.org/api/n-api.html#n_api_napi_get_dataview_info) | 1 | v8.3.0 | ✅ |
|
||||||
| [napi_get_date_value](https://nodejs.org/api/n-api.html#n_api_napi_get_date_value) | 5 | v11.11.0 | ✅ |
|
| [napi_get_date_value](https://nodejs.org/api/n-api.html#n_api_napi_get_date_value) | 5 | v11.11.0 | ✅ |
|
||||||
| [napi_get_value_bool](https://nodejs.org/api/n-api.html#n_api_napi_get_value_bool) | 1 | v8.0.0 | ✅ |
|
| [napi_get_value_bool](https://nodejs.org/api/n-api.html#n_api_napi_get_value_bool) | 1 | v8.0.0 | ✅ |
|
||||||
| [napi_get_value_double](https://nodejs.org/api/n-api.html#n_api_napi_get_value_double) | 1 | v8.0.0 | ✅ |
|
| [napi_get_value_double](https://nodejs.org/api/n-api.html#n_api_napi_get_value_double) | 1 | v8.0.0 | ✅ |
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
use std::mem;
|
use std::mem;
|
||||||
use std::ops::Deref;
|
use std::ops::Deref;
|
||||||
|
use std::os::raw::c_void;
|
||||||
use std::ptr;
|
use std::ptr;
|
||||||
|
|
||||||
use super::{Value, ValueType};
|
use super::{Value, ValueType};
|
||||||
|
@ -7,7 +8,7 @@ use crate::error::check_status;
|
||||||
use crate::{sys, JsUnknown, NapiValue, Ref, Result};
|
use crate::{sys, JsUnknown, NapiValue, Ref, Result};
|
||||||
|
|
||||||
#[repr(transparent)]
|
#[repr(transparent)]
|
||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug)]
|
||||||
pub struct JsArrayBuffer(pub(crate) Value);
|
pub struct JsArrayBuffer(pub(crate) Value);
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
@ -17,18 +18,30 @@ pub struct JsArrayBufferValue {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[repr(transparent)]
|
#[repr(transparent)]
|
||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug)]
|
||||||
pub struct JsTypedArray(pub(crate) Value);
|
pub struct JsTypedArray(pub(crate) Value);
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct JsTypedArrayValue<T> {
|
pub struct JsTypedArrayValue {
|
||||||
pub arraybuffer: JsArrayBuffer,
|
pub arraybuffer: JsArrayBuffer,
|
||||||
pub data: mem::ManuallyDrop<Vec<T>>,
|
data: *mut c_void,
|
||||||
pub byte_offset: u64,
|
pub byte_offset: u64,
|
||||||
pub length: u64,
|
pub length: u64,
|
||||||
pub typedarray_type: TypedArrayType,
|
pub typedarray_type: TypedArrayType,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[repr(transparent)]
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct JsDataView(pub(crate) Value);
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct JsDataViewValue {
|
||||||
|
pub arraybuffer: JsArrayBuffer,
|
||||||
|
data: *mut c_void,
|
||||||
|
pub byte_offset: u64,
|
||||||
|
pub length: u64,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum TypedArrayType {
|
pub enum TypedArrayType {
|
||||||
Int8,
|
Int8,
|
||||||
|
@ -101,8 +114,8 @@ impl JsArrayBuffer {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn create_typed_array(
|
pub fn into_typedarray(
|
||||||
&self,
|
self,
|
||||||
typedarray_type: TypedArrayType,
|
typedarray_type: TypedArrayType,
|
||||||
length: u64,
|
length: u64,
|
||||||
byte_offset: u64,
|
byte_offset: u64,
|
||||||
|
@ -125,6 +138,24 @@ impl JsArrayBuffer {
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn into_dataview(self, length: u64, byte_offset: u64) -> Result<JsDataView> {
|
||||||
|
let mut dataview_value = ptr::null_mut();
|
||||||
|
check_status(unsafe {
|
||||||
|
sys::napi_create_dataview(
|
||||||
|
self.0.env,
|
||||||
|
length,
|
||||||
|
self.0.value,
|
||||||
|
byte_offset,
|
||||||
|
&mut dataview_value,
|
||||||
|
)
|
||||||
|
})?;
|
||||||
|
Ok(JsDataView(Value {
|
||||||
|
env: self.0.env,
|
||||||
|
value: dataview_value,
|
||||||
|
value_type: ValueType::Object,
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn into_ref(self) -> Result<Ref<JsArrayBufferValue>> {
|
pub fn into_ref(self) -> Result<Ref<JsArrayBufferValue>> {
|
||||||
Ref::new(self.0, 1, self.into_value()?)
|
Ref::new(self.0, 1, self.into_value()?)
|
||||||
|
@ -167,11 +198,11 @@ impl JsTypedArray {
|
||||||
/// https://nodejs.org/api/n-api.html#n_api_napi_get_typedarray_info
|
/// https://nodejs.org/api/n-api.html#n_api_napi_get_typedarray_info
|
||||||
///
|
///
|
||||||
/// ***Warning***: Use caution while using this API since the underlying data buffer is managed by the VM.
|
/// ***Warning***: Use caution while using this API since the underlying data buffer is managed by the VM.
|
||||||
pub fn into_value<T>(self) -> Result<JsTypedArrayValue<T>> {
|
pub fn into_value(self) -> Result<JsTypedArrayValue> {
|
||||||
let mut typedarray_type = sys::napi_typedarray_type::napi_int8_array;
|
let mut typedarray_type = sys::napi_typedarray_type::napi_int8_array;
|
||||||
let mut len = 0u64;
|
let mut len = 0u64;
|
||||||
let mut data = ptr::null_mut();
|
let mut data = ptr::null_mut();
|
||||||
let mut array_buffer = ptr::null_mut();
|
let mut arraybuffer_value = ptr::null_mut();
|
||||||
let mut byte_offset = 0u64;
|
let mut byte_offset = 0u64;
|
||||||
check_status(unsafe {
|
check_status(unsafe {
|
||||||
sys::napi_get_typedarray_info(
|
sys::napi_get_typedarray_info(
|
||||||
|
@ -180,19 +211,43 @@ impl JsTypedArray {
|
||||||
&mut typedarray_type,
|
&mut typedarray_type,
|
||||||
&mut len,
|
&mut len,
|
||||||
&mut data,
|
&mut data,
|
||||||
&mut array_buffer,
|
&mut arraybuffer_value,
|
||||||
&mut byte_offset,
|
&mut byte_offset,
|
||||||
)
|
)
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
Ok(JsTypedArrayValue {
|
Ok(JsTypedArrayValue {
|
||||||
data: mem::ManuallyDrop::new(unsafe {
|
data,
|
||||||
Vec::from_raw_parts(data as *mut T, len as usize, len as usize)
|
|
||||||
}),
|
|
||||||
length: len,
|
length: len,
|
||||||
byte_offset,
|
byte_offset,
|
||||||
typedarray_type: typedarray_type.into(),
|
typedarray_type: typedarray_type.into(),
|
||||||
arraybuffer: JsArrayBuffer::from_raw_unchecked(self.0.env, array_buffer),
|
arraybuffer: JsArrayBuffer::from_raw_unchecked(self.0.env, arraybuffer_value),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl JsDataView {
|
||||||
|
pub fn into_value(self) -> Result<JsDataViewValue> {
|
||||||
|
let mut length = 0u64;
|
||||||
|
let mut byte_offset = 0u64;
|
||||||
|
let mut arraybuffer_value = ptr::null_mut();
|
||||||
|
let mut data = ptr::null_mut();
|
||||||
|
|
||||||
|
check_status(unsafe {
|
||||||
|
sys::napi_get_dataview_info(
|
||||||
|
self.0.env,
|
||||||
|
self.0.value,
|
||||||
|
&mut length,
|
||||||
|
&mut data,
|
||||||
|
&mut arraybuffer_value,
|
||||||
|
&mut byte_offset,
|
||||||
|
)
|
||||||
|
})?;
|
||||||
|
Ok(JsDataViewValue {
|
||||||
|
arraybuffer: JsArrayBuffer::from_raw_unchecked(self.0.env, arraybuffer_value),
|
||||||
|
byte_offset,
|
||||||
|
length,
|
||||||
|
data,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,7 @@ use crate::error::check_status;
|
||||||
use crate::{sys, JsUnknown, NapiValue, Ref, Result};
|
use crate::{sys, JsUnknown, NapiValue, Ref, Result};
|
||||||
|
|
||||||
#[repr(transparent)]
|
#[repr(transparent)]
|
||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug)]
|
||||||
pub struct JsBuffer(pub(crate) Value);
|
pub struct JsBuffer(pub(crate) Value);
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
|
|
@ -446,6 +446,7 @@ impl_js_value_methods!(JsBoolean);
|
||||||
impl_js_value_methods!(JsBuffer);
|
impl_js_value_methods!(JsBuffer);
|
||||||
impl_js_value_methods!(JsArrayBuffer);
|
impl_js_value_methods!(JsArrayBuffer);
|
||||||
impl_js_value_methods!(JsTypedArray);
|
impl_js_value_methods!(JsTypedArray);
|
||||||
|
impl_js_value_methods!(JsDataView);
|
||||||
impl_js_value_methods!(JsNumber);
|
impl_js_value_methods!(JsNumber);
|
||||||
impl_js_value_methods!(JsString);
|
impl_js_value_methods!(JsString);
|
||||||
impl_js_value_methods!(JsObject);
|
impl_js_value_methods!(JsObject);
|
||||||
|
@ -470,6 +471,7 @@ impl_napi_value_trait!(JsBoolean, Boolean);
|
||||||
impl_napi_value_trait!(JsBuffer, Object);
|
impl_napi_value_trait!(JsBuffer, Object);
|
||||||
impl_napi_value_trait!(JsArrayBuffer, Object);
|
impl_napi_value_trait!(JsArrayBuffer, Object);
|
||||||
impl_napi_value_trait!(JsTypedArray, Object);
|
impl_napi_value_trait!(JsTypedArray, Object);
|
||||||
|
impl_napi_value_trait!(JsDataView, Object);
|
||||||
impl_napi_value_trait!(JsNumber, Number);
|
impl_napi_value_trait!(JsNumber, Number);
|
||||||
impl_napi_value_trait!(JsString, String);
|
impl_napi_value_trait!(JsString, String);
|
||||||
impl_napi_value_trait!(JsObject, Object);
|
impl_napi_value_trait!(JsObject, Object);
|
||||||
|
|
Loading…
Reference in a new issue