diff --git a/packages/common/y-octo/node/src/array.rs b/packages/common/y-octo/node/src/array.rs index ea3e615224..d2ac89c1eb 100644 --- a/packages/common/y-octo/node/src/array.rs +++ b/packages/common/y-octo/node/src/array.rs @@ -1,4 +1,7 @@ -use napi::{bindgen_prelude::Array as JsArray, Env, JsUnknown, ValueType}; +use napi::{ + bindgen_prelude::{Array as JsArray, Env, Unknown}, + ValueType, +}; use y_octo::{Any, Array, Value}; use super::*; @@ -104,7 +107,7 @@ impl YArray { Ok((object, length)) => { for i in 0..length { if let Ok(any) = object - .get_element::(i) + .get_element::(i) .and_then(get_any_from_js_unknown) { self diff --git a/packages/common/y-octo/node/src/doc.rs b/packages/common/y-octo/node/src/doc.rs index 7773ab5656..5f163a3277 100644 --- a/packages/common/y-octo/node/src/doc.rs +++ b/packages/common/y-octo/node/src/doc.rs @@ -1,5 +1,5 @@ use napi::{ - bindgen_prelude::{Buffer, Uint8Array}, + bindgen_prelude::Uint8Array, threadsafe_function::{ThreadsafeFunction, ThreadsafeFunctionCallMode}, }; use y_octo::{CrdtRead, Doc as YDoc, History, RawDecoder, StateVector}; @@ -120,7 +120,7 @@ impl Doc { } #[napi(ts_args_type = "callback: (result: Uint8Array) => void")] - pub fn on_update(&mut self, callback: ThreadsafeFunction) -> Result<()> { + pub fn on_update(&mut self, callback: ThreadsafeFunction) -> Result<()> { let callback = move |update: &[u8], _h: &[History]| { callback.call( Ok(update.to_vec().into()), diff --git a/packages/common/y-octo/node/src/map.rs b/packages/common/y-octo/node/src/map.rs index 17fce3f8d7..d9609de495 100644 --- a/packages/common/y-octo/node/src/map.rs +++ b/packages/common/y-octo/node/src/map.rs @@ -1,4 +1,4 @@ -use napi::{Env, JsObject, ValueType}; +use napi::bindgen_prelude::{Env, Object, ValueType}; use y_octo::{Any, Map, Value}; use super::*; @@ -10,12 +10,6 @@ pub struct YMap { #[napi] impl YMap { - #[allow(clippy::new_without_default)] - #[napi(constructor)] - pub fn new() -> Self { - unimplemented!() - } - pub(crate) fn inner_new(map: Map) -> Self { Self { map } } @@ -111,7 +105,7 @@ impl YMap { } #[napi] - pub fn to_json(&self, env: Env) -> Result { + pub fn to_json(&self, env: Env) -> Result { let mut js_object = env.create_object()?; for (key, value) in self.map.iter() { js_object.set(key, get_js_unknown_from_value(env, value))?; diff --git a/packages/common/y-octo/node/src/utils.rs b/packages/common/y-octo/node/src/utils.rs index 7103041401..e08bc41705 100644 --- a/packages/common/y-octo/node/src/utils.rs +++ b/packages/common/y-octo/node/src/utils.rs @@ -1,12 +1,17 @@ -use napi::{bindgen_prelude::Either4, Env, Error, JsObject, JsUnknown, Result, Status, ValueType}; +use napi::{ + bindgen_prelude::{ + Either4, Env, Error, External, Object, Result, Status, ToNapiValue, Unknown, ValueType, + }, + NapiValue, +}; use y_octo::{AHashMap, Any, HashMapExt, Value}; use super::*; -pub type MixedYType = Either4; -pub type MixedRefYType<'a> = Either4<&'a YArray, &'a YMap, &'a YText, JsUnknown>; +pub type MixedYType = Either4; +pub type MixedRefYType<'a> = Either4<&'a YArray, &'a YMap, &'a YText, Unknown>; -pub fn get_js_unknown_from_any(env: Env, any: Any) -> Result { +pub fn get_js_unknown_from_any(env: Env, any: Any) -> Result { match any { Any::Null | Any::Undefined => env.get_null().map(|v| v.into_unknown()), Any::True => env.get_boolean(true).map(|v| v.into_unknown()), @@ -27,29 +32,36 @@ pub fn get_js_unknown_from_any(env: Env, any: Any) -> Result { } } -#[allow(deprecated)] -// Wait for NAPI-RS External::into_unknown to be stabilized -pub fn get_js_unknown_from_value(env: Env, value: Value) -> Result { +pub fn get_js_unknown_from_value(env: Env, value: Value) -> Result { match value { Value::Any(any) => get_js_unknown_from_any(env, any), - Value::Array(array) => env - .create_external(YArray::inner_new(array), None) - .map(|o| o.into_unknown()), - Value::Map(map) => env - .create_external(YMap::inner_new(map), None) - .map(|o| o.into_unknown()), - Value::Text(text) => env - .create_external(YText::inner_new(text), None) - .map(|o| o.into_unknown()), + Value::Array(array) => { + let external = External::new(YArray::inner_new(array)); + Ok(unsafe { + Unknown::from_raw_unchecked(env.raw(), ToNapiValue::to_napi_value(env.raw(), external)?) + }) + } + Value::Map(map) => { + let external = External::new(YMap::inner_new(map)); + Ok(unsafe { + Unknown::from_raw_unchecked(env.raw(), ToNapiValue::to_napi_value(env.raw(), external)?) + }) + } + Value::Text(text) => { + let external = External::new(YText::inner_new(text)); + Ok(unsafe { + Unknown::from_raw_unchecked(env.raw(), ToNapiValue::to_napi_value(env.raw(), external)?) + }) + } _ => env.get_null().map(|v| v.into_unknown()), } } -pub fn get_any_from_js_object(object: JsObject) -> Result { +pub fn get_any_from_js_object(object: Object) -> Result { if let Ok(length) = object.get_array_length() { let mut array = Vec::with_capacity(length as usize); for i in 0..length { - if let Ok(value) = object.get_element::(i) { + if let Ok(value) = object.get_element::(i) { array.push(get_any_from_js_unknown(value)?); } } @@ -59,14 +71,14 @@ pub fn get_any_from_js_object(object: JsObject) -> Result { let keys = object.get_property_names()?; if let Ok(length) = keys.get_array_length() { for i in 0..length { - if let Ok((obj, key)) = keys.get_element::(i).and_then(|o| { + if let Ok((obj, key)) = keys.get_element::(i).and_then(|o| { o.coerce_to_string().and_then(|obj| { obj .into_utf8() .and_then(|s| s.as_str().map(|s| (obj, s.to_string()))) }) }) { - if let Ok(value) = object.get_property::<_, JsUnknown>(obj) { + if let Ok(value) = object.get_property::<_, Unknown>(obj) { println!("key: {}", key); map.insert(key, get_any_from_js_unknown(value)?); } @@ -77,7 +89,7 @@ pub fn get_any_from_js_object(object: JsObject) -> Result { } } -pub fn get_any_from_js_unknown(js_unknown: JsUnknown) -> Result { +pub fn get_any_from_js_unknown(js_unknown: Unknown) -> Result { match js_unknown.get_type()? { ValueType::Undefined | ValueType::Null => Ok(Any::Null), ValueType::Boolean => Ok(