diff --git a/Cargo.lock b/Cargo.lock index 88bfb7f..dade6d6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -94,6 +94,12 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" +[[package]] +name = "itoa" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" + [[package]] name = "js-sys" version = "0.3.60" @@ -115,15 +121,6 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" -[[package]] -name = "lib0" -version = "0.16.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29dc19a026a0d45fc391898c6d4a6d0a5aab5ae6a826ebddc0f33572ffdae8dc" -dependencies = [ - "thiserror", -] - [[package]] name = "libc" version = "0.2.133" @@ -324,12 +321,49 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "ryu" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" + [[package]] name = "seq-macro" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3f0bf26fd526d2a95683cd0f87bf103b8539e2ca1ef48ce002d67aad59aa0b4" +[[package]] +name = "serde" +version = "1.0.195" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.195" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.46", +] + +[[package]] +name = "serde_json" +version = "1.0.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4" +dependencies = [ + "itoa", + "ryu", + "serde", +] + [[package]] name = "shell-words" version = "1.1.0" @@ -344,18 +378,18 @@ checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" [[package]] name = "smallstr" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e922794d168678729ffc7e07182721a14219c65814e66e91b839a272fe5ae4f" +checksum = "63b1aefdf380735ff8ded0b15f31aab05daf1f70216c01c02a12926badd1df9d" dependencies = [ "smallvec", ] [[package]] name = "smallvec" -version = "1.10.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" [[package]] name = "syn" @@ -489,11 +523,10 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "y-sync" -version = "0.3.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f54d34b68ec4514a0659838c2b1ba867c571b20b3804a1338dacf4fa9062d801" +checksum = "52e3675a497cde881a71e7e5c2ae1d087dfc7733ddece9b24a9a61408e969d3b" dependencies = [ - "lib0", "thiserror", "yrs", ] @@ -502,7 +535,6 @@ dependencies = [ name = "yrb" version = "0.5.4" dependencies = [ - "lib0", "magnus", "rb-sys", "thiserror", @@ -512,13 +544,14 @@ dependencies = [ [[package]] name = "yrs" -version = "0.16.10" +version = "0.17.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c48071f2693893c866cffdad3e6a931aefcd14e4400d45353a0e3f91a96e80b" +checksum = "c4830316bfee4bec0044fe34a001cda783506d5c4c0852f8433c6041dfbfce51" dependencies = [ "atomic_refcell", - "lib0", "rand", + "serde", + "serde_json", "smallstr", "smallvec", "thiserror", diff --git a/ext/yrb/Cargo.toml b/ext/yrb/Cargo.toml index f416e8f..8f0415a 100644 --- a/ext/yrb/Cargo.toml +++ b/ext/yrb/Cargo.toml @@ -7,11 +7,10 @@ homepage = "https://github.com/y-crdt/yrb" repository = "https://github.com/y-crdt/yrb" [dependencies] -lib0 = "0.16.10" # must match yrs version magnus = "0.6.2" thiserror = "1.0.56" -yrs = "=0.16.10" -y-sync = "=0.3.1" +yrs = "=0.17.4" +y-sync = "=0.4.0" rb-sys = "0.9.87" [dev-dependencies] diff --git a/ext/yrb/src/utils.rs b/ext/yrb/src/utils.rs index 053e77a..74a15c1 100644 --- a/ext/yrb/src/utils.rs +++ b/ext/yrb/src/utils.rs @@ -1,10 +1,9 @@ use crate::yvalue::YValue; -use lib0::any::Any; use magnus::r_hash::ForEach::Continue; use magnus::{exception, Error, RArray, RHash, RString, Symbol, Value}; use std::sync::Arc; use yrs::types::{Attrs, Value as YrsValue}; -use yrs::{Array, Map, TransactionMut}; +use yrs::{Any, Array, Map, TransactionMut}; #[derive(Debug, Clone)] pub(crate) struct TypeConversionError; diff --git a/ext/yrb/src/yany.rs b/ext/yrb/src/yany.rs index 24201bd..b2a4dd8 100644 --- a/ext/yrb/src/yany.rs +++ b/ext/yrb/src/yany.rs @@ -1,9 +1,9 @@ -use lib0::any::Any; use magnus::r_string::IntoRString; use magnus::value::ReprValue; use magnus::{value, IntoValue, RArray, RHash, RString, Value}; use std::borrow::Borrow; use std::ops::{Deref, DerefMut}; +use yrs::Any; pub(crate) struct YAny(pub(crate) Any); diff --git a/ext/yrb/src/yarray.rs b/ext/yrb/src/yarray.rs index 401e7ce..bb5583c 100644 --- a/ext/yrb/src/yarray.rs +++ b/ext/yrb/src/yarray.rs @@ -1,13 +1,12 @@ use crate::utils::convert_yvalue_to_ruby_value; use crate::ytransaction::YTransaction; use crate::yvalue::YValue; -use lib0::any::Any; use magnus::block::Proc; use magnus::value::Qnil; use magnus::{Error, IntoValue, RArray, RHash, Symbol, Value}; use std::cell::RefCell; use yrs::types::Change; -use yrs::{Array, ArrayRef, Observable}; +use yrs::{Any, Array, ArrayRef, Observable}; #[magnus::wrap(class = "Y::Array")] pub(crate) struct YArray(pub(crate) RefCell); diff --git a/ext/yrb/src/yattrs.rs b/ext/yrb/src/yattrs.rs index 8cb87c1..6cb346f 100644 --- a/ext/yrb/src/yattrs.rs +++ b/ext/yrb/src/yattrs.rs @@ -1,10 +1,10 @@ use crate::yvalue::YValue; -use lib0::any::Any; use magnus::r_hash::ForEach::Continue; use magnus::{RHash, Value}; use std::ops::{Deref, DerefMut}; use std::sync::Arc; use yrs::types::Attrs; +use yrs::Any; pub(crate) struct YAttrs(pub(crate) Attrs); diff --git a/ext/yrb/src/yawareness.rs b/ext/yrb/src/yawareness.rs index d2da2e1..72e35f0 100644 --- a/ext/yrb/src/yawareness.rs +++ b/ext/yrb/src/yawareness.rs @@ -17,10 +17,10 @@ unsafe impl Send for YAwareness {} impl YAwareness { pub(crate) fn yawareness_new() -> Self { let mut options = Options { - offset_kind: OffsetKind::Utf32, + offset_kind: OffsetKind::Utf16, ..Default::default() }; - options.offset_kind = OffsetKind::Utf32; + options.offset_kind = OffsetKind::Utf16; let doc = Doc::with_options(options); diff --git a/ext/yrb/src/ydoc.rs b/ext/yrb/src/ydoc.rs index 87a6966..248cbdc 100644 --- a/ext/yrb/src/ydoc.rs +++ b/ext/yrb/src/ydoc.rs @@ -25,7 +25,7 @@ impl YDoc { let value = client_id.first().unwrap(); options.client_id = Integer::from_value(*value).unwrap().to_u64().unwrap(); } - options.offset_kind = OffsetKind::Utf32; + options.offset_kind = OffsetKind::Utf16; let doc = Doc::with_options(options); Self(RefCell::new(doc)) diff --git a/ext/yrb/src/ymap.rs b/ext/yrb/src/ymap.rs index ac47fec..80e2ecb 100644 --- a/ext/yrb/src/ymap.rs +++ b/ext/yrb/src/ymap.rs @@ -1,12 +1,11 @@ use crate::utils::{convert_yvalue_to_ruby_value, indifferent_hash_key}; use crate::yvalue::YValue; use crate::YTransaction; -use lib0::any::Any; use magnus::block::Proc; use magnus::{exception, Error, RArray, RHash, Symbol, Value}; use std::cell::RefCell; use yrs::types::{EntryChange, Value as YrsValue}; -use yrs::{Map, MapRef, Observable}; +use yrs::{Any, Map, MapRef, Observable}; #[magnus::wrap(class = "Y::Map")] pub(crate) struct YMap(pub(crate) RefCell); diff --git a/ext/yrb/src/ytext.rs b/ext/yrb/src/ytext.rs index 9a1bdcb..9d50a52 100644 --- a/ext/yrb/src/ytext.rs +++ b/ext/yrb/src/ytext.rs @@ -1,13 +1,12 @@ use crate::yattrs::YAttrs; use crate::yvalue::YValue; use crate::YTransaction; -use lib0::any::Any; use magnus::block::Proc; use magnus::value::Qnil; use magnus::{Error, RHash, Symbol, Value}; use std::cell::RefCell; use yrs::types::Delta; -use yrs::{GetString, Observable, Text, TextRef}; +use yrs::{Any, GetString, Observable, Text, TextRef}; #[magnus::wrap(class = "Y::Text")] pub(crate) struct YText(pub(crate) RefCell); diff --git a/ext/yrb/src/yvalue.rs b/ext/yrb/src/yvalue.rs index f55846f..3bc823b 100644 --- a/ext/yrb/src/yvalue.rs +++ b/ext/yrb/src/yvalue.rs @@ -1,13 +1,13 @@ use crate::{YText, YXmlElement, YXmlText}; -use lib0::any::Any; use magnus::r_hash::ForEach::Continue; use magnus::value::{Qnil, ReprValue}; use magnus::{class, value, Float, Integer, IntoValue, RArray, RHash, RString, Symbol, Value}; use std::cell::RefCell; use std::collections::HashMap; +use std::sync::Arc; use yrs::types::Value as YrsValue; use yrs::{ - Array, Map, TextRef as YrsText, Transact, XmlElementRef as YrsXmlElement, + Any, Array, Map, TextRef as YrsText, Transact, XmlElementRef as YrsXmlElement, XmlTextRef as YrsXmlText, }; @@ -67,6 +67,12 @@ impl From for YValue { } } +impl From> for YValue { + fn from(value: Vec) -> Self { + YValue(RefCell::from(value.into_value())) + } +} + impl From for YValue { fn from(value: YrsText) -> Self { YValue(RefCell::from(YText(RefCell::from(value)).into_value())) @@ -113,8 +119,8 @@ impl From for YValue { Any::Bool(v) => YValue::from(v), Any::Number(v) => YValue::from(v), Any::BigInt(v) => YValue::from(v), - Any::String(v) => YValue::from(v.into_string()), - Any::Buffer(v) => YValue::from(v.into_vec().into_value()), + Any::String(v) => YValue::from(v.to_string()), + Any::Buffer(v) => YValue::from(v.to_vec()), Any::Array(v) => { let arr = RArray::new(); for item in v.iter() { @@ -146,7 +152,6 @@ impl From for YValue { YrsValue::YXmlElement(el) => YValue::from(el), YrsValue::YXmlText(text) => YValue::from(text), YrsValue::YArray(val) => { - print!("try to acquire transaction"); let tx = val.transact(); let arr = RArray::new(); for item in val.iter(&tx) { @@ -157,7 +162,6 @@ impl From for YValue { YValue::from(arr) } YrsValue::YMap(val) => { - print!("try to acquire transaction"); let tx = val.transact(); let iter = val.iter(&tx).map(|(key, val)| { let val = YValue::from(val); @@ -184,14 +188,14 @@ impl From for Any { Any::BigInt(i.to_i64().unwrap()) } else if value.is_kind_of(class::symbol()) { let s = Symbol::from_value(value).unwrap(); - Any::String(Box::from(s.name().unwrap())) + Any::String(Arc::from(s.name().unwrap())) } else if value.is_kind_of(class::true_class()) { Any::Bool(true) } else if value.is_kind_of(class::false_class()) { Any::Bool(false) } else if value.is_kind_of(class::string()) { let s = RString::from_value(value).unwrap(); - unsafe { Any::String(Box::from(s.as_str().unwrap().to_string())) } + unsafe { Any::String(Arc::from(s.as_str().unwrap().to_string())) } } else if value.is_kind_of(class::array()) { let arr = RArray::from_value(value).unwrap(); let items = arr @@ -201,7 +205,7 @@ impl From for Any { Any::from(yvalue) }) .collect::>(); - Any::Array(Box::from(items)) + Any::Array(Arc::from(items)) } else if value.is_kind_of(class::hash()) { let map = RHash::from_value(value).unwrap(); let mut m: HashMap = HashMap::new(); @@ -221,7 +225,7 @@ impl From for Any { }) .expect("cannot map key/value pair"); - Any::Map(Box::from(m)) + Any::Map(Arc::from(m)) } else { Any::Undefined } @@ -238,8 +242,8 @@ impl Into for YValue { #[cfg(test)] mod tests { use crate::yvalue::YValue; - use lib0::any::Any; use magnus::value::ReprValue; + use yrs::Any; #[test] fn convert_any_to_yvalue() { diff --git a/ext/yrb/src/yxml_text.rs b/ext/yrb/src/yxml_text.rs index dcbc3eb..5780b7f 100644 --- a/ext/yrb/src/yxml_text.rs +++ b/ext/yrb/src/yxml_text.rs @@ -2,10 +2,9 @@ use crate::utils::map_rhash_to_attrs; use crate::yvalue::YValue; use crate::yxml_fragment::YXmlFragment; use crate::{YTransaction, YXmlElement}; -use lib0::any::Any; use magnus::{Error, IntoValue, RHash, Value}; use std::cell::RefCell; -use yrs::{GetString, Text, Xml, XmlNode, XmlTextRef}; +use yrs::{Any, GetString, Text, Xml, XmlNode, XmlTextRef}; #[magnus::wrap(class = "Y::XMLText")] pub(crate) struct YXmlText(pub(crate) RefCell);