Upgrade bincode from 1.x to 2.0.0-rc.3 (#3899)

- Updated bincode dependency to 2.0.0-rc.3 in yew and yew-agent packages
- Migrated from bincode::serialize/deserialize to bincode::serde::encode_to_vec/decode_from_slice
- Updated test expectations for changed base64 encoding format
- Used 2.0.0-rc.3 to maintain MSRV compatibility with Rust 1.78.0
This commit is contained in:
Siyuan Yan 2025-08-22 03:57:44 +09:00 committed by GitHub
parent 0102d62d60
commit 50f987d9f5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 57 additions and 18 deletions

31
Cargo.lock generated
View File

@ -259,6 +259,25 @@ dependencies = [
"serde",
]
[[package]]
name = "bincode"
version = "2.0.0-rc.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f11ea1a0346b94ef188834a65c068a03aec181c94896d481d7a0a40d85b0ce95"
dependencies = [
"bincode_derive",
"serde",
]
[[package]]
name = "bincode_derive"
version = "2.0.0-rc.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7e30759b3b99a1b802a7a3aa21c85c3ded5c28e1c83170d82d70f08bbf7f3e4c"
dependencies = [
"virtue",
]
[[package]]
name = "bit-set"
version = "0.5.3"
@ -1281,7 +1300,7 @@ version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "085f262d7604911c8150162529cefab3782e91adb20202e8658f7275d2aefe5d"
dependencies = [
"bincode",
"bincode 1.3.3",
"futures 0.3.31",
"gloo-utils",
"gloo-worker-macros",
@ -3729,6 +3748,12 @@ version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
[[package]]
name = "virtue"
version = "0.0.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9dcc60c0624df774c82a0ef104151231d37da4962957d691c011c852b2473314"
[[package]]
name = "walkdir"
version = "2.5.0"
@ -4258,7 +4283,7 @@ name = "yew"
version = "0.21.0"
dependencies = [
"base64ct",
"bincode",
"bincode 2.0.0-rc.3",
"console_error_panic_hook",
"futures 0.3.31",
"gloo",
@ -4285,7 +4310,7 @@ dependencies = [
name = "yew-agent"
version = "0.3.0"
dependencies = [
"bincode",
"bincode 2.0.0-rc.3",
"futures 0.3.31",
"js-sys",
"pinned",

View File

@ -17,7 +17,7 @@ wasm-bindgen = "0.2"
js-sys = "0.3"
pinned = "0.1.0"
thiserror = "1.0.37"
bincode = { version = "1.3.3" }
bincode = { version = "2.0.0-rc.3", features = ["serde"] }
wasm-bindgen-futures = "0.4"
serde = { version = "1", features = ["derive"] }
futures = "0.3"

View File

@ -26,7 +26,8 @@ impl Codec for Bincode {
where
I: Serialize,
{
let buf = bincode::serialize(&input).expect("can't serialize an worker message");
let buf = bincode::serde::encode_to_vec(&input, bincode::config::standard())
.expect("can't serialize an worker message");
Uint8Array::from(buf.as_slice()).into()
}
@ -35,6 +36,8 @@ impl Codec for Bincode {
O: for<'de> Deserialize<'de>,
{
let data = Uint8Array::from(input).to_vec();
bincode::deserialize(&data).expect("can't deserialize an worker message")
let (result, _) = bincode::serde::decode_from_slice(&data, bincode::config::standard())
.expect("can't deserialize an worker message");
result
}
}

View File

@ -29,7 +29,7 @@ futures = { version = "0.3", default-features = false, features = ["std"] }
html-escape = { version = "0.2.13", optional = true }
implicit-clone = { version = "0.5", features = ["map"] }
base64ct = { version = "1.6.0", features = ["std"], optional = true }
bincode = { version = "1.3.3", optional = true }
bincode = { version = "2.0.0-rc.3", optional = true, features = ["serde"] }
serde = { version = "1", features = ["derive"] }
tracing = "0.1.40"
tokise = "0.2.0"

View File

@ -90,10 +90,15 @@ where
.await
.expect("failed to deserialize state");
let (state, deps) =
bincode::deserialize::<(Option<T>, Option<D>)>(&buf)
.map(|(state, deps)| (state.map(Rc::new), deps.map(Rc::new)))
.expect("failed to deserialize state");
let ((state, deps), _) =
bincode::serde::decode_from_slice::<(Option<T>, Option<D>), _>(
&buf,
bincode::config::standard(),
)
.map(|((state, deps), consumed)| {
((state.map(Rc::new), deps.map(Rc::new)), consumed)
})
.expect("failed to deserialize state");
data.set((Ok((state, deps)), None));
});

View File

@ -129,8 +129,11 @@ mod feat_any_hydration_ssr {
fn prepare(&self) -> String {
use base64ct::{Base64, Encoding};
let state = bincode::serialize(&(self.state.as_deref(), self.deps.as_deref()))
.expect("failed to prepare state");
let state = bincode::serde::encode_to_vec(
(self.state.as_deref(), self.deps.as_deref()),
bincode::config::standard(),
)
.expect("failed to prepare state");
Base64::encode_string(&state)
}

View File

@ -30,8 +30,11 @@ where
let f = self.state_fn.borrow_mut().take().unwrap();
let state = f(self.deps.clone());
let state = bincode::serialize(&(Some(&state), Some(&*self.deps)))
.expect("failed to prepare state");
let state = bincode::serde::encode_to_vec(
(Some(&state), Some(&*self.deps)),
bincode::config::standard(),
)
.expect("failed to prepare state");
Base64::encode_string(&state)
}

View File

@ -42,7 +42,7 @@ async fn use_prepared_state_works() {
assert_eq!(
s,
r#"<!--<[use_prepared_state::use_prepared_state_works::{{closure}}::App]>--><!--<[yew::suspense::component::feat_csr_ssr::Suspense]>--><!--<[yew::suspense::component::feat_csr_ssr::BaseSuspense]>--><!--<?>--><div><!--<[use_prepared_state::use_prepared_state_works::{{closure}}::Comp]>--><div>12345</div><script type="application/x-yew-comp-state">ATkwAAAB</script><!--</[use_prepared_state::use_prepared_state_works::{{closure}}::Comp]>--></div><!--</?>--><!--</[yew::suspense::component::feat_csr_ssr::BaseSuspense]>--><!--</[yew::suspense::component::feat_csr_ssr::Suspense]>--><!--</[use_prepared_state::use_prepared_state_works::{{closure}}::App]>-->"#
r#"<!--<[use_prepared_state::use_prepared_state_works::{{closure}}::App]>--><!--<[yew::suspense::component::feat_csr_ssr::Suspense]>--><!--<[yew::suspense::component::feat_csr_ssr::BaseSuspense]>--><!--<?>--><div><!--<[use_prepared_state::use_prepared_state_works::{{closure}}::Comp]>--><div>12345</div><script type="application/x-yew-comp-state">Afs5MAE=</script><!--</[use_prepared_state::use_prepared_state_works::{{closure}}::Comp]>--></div><!--</?>--><!--</[yew::suspense::component::feat_csr_ssr::BaseSuspense]>--><!--</[yew::suspense::component::feat_csr_ssr::Suspense]>--><!--</[use_prepared_state::use_prepared_state_works::{{closure}}::App]>-->"#
);
gloo::utils::document()
@ -92,7 +92,7 @@ async fn use_prepared_state_with_suspension_works() {
assert_eq!(
s,
r#"<!--<[use_prepared_state::use_prepared_state_with_suspension_works::{{closure}}::App]>--><!--<[yew::suspense::component::feat_csr_ssr::Suspense]>--><!--<[yew::suspense::component::feat_csr_ssr::BaseSuspense]>--><!--<?>--><div><!--<[use_prepared_state::use_prepared_state_with_suspension_works::{{closure}}::Comp]>--><div>12345</div><script type="application/x-yew-comp-state">ATkwAAAB</script><!--</[use_prepared_state::use_prepared_state_with_suspension_works::{{closure}}::Comp]>--></div><!--</?>--><!--</[yew::suspense::component::feat_csr_ssr::BaseSuspense]>--><!--</[yew::suspense::component::feat_csr_ssr::Suspense]>--><!--</[use_prepared_state::use_prepared_state_with_suspension_works::{{closure}}::App]>-->"#
r#"<!--<[use_prepared_state::use_prepared_state_with_suspension_works::{{closure}}::App]>--><!--<[yew::suspense::component::feat_csr_ssr::Suspense]>--><!--<[yew::suspense::component::feat_csr_ssr::BaseSuspense]>--><!--<?>--><div><!--<[use_prepared_state::use_prepared_state_with_suspension_works::{{closure}}::Comp]>--><div>12345</div><script type="application/x-yew-comp-state">Afs5MAE=</script><!--</[use_prepared_state::use_prepared_state_with_suspension_works::{{closure}}::Comp]>--></div><!--</?>--><!--</[yew::suspense::component::feat_csr_ssr::BaseSuspense]>--><!--</[yew::suspense::component::feat_csr_ssr::Suspense]>--><!--</[use_prepared_state::use_prepared_state_with_suspension_works::{{closure}}::App]>-->"#
);
gloo::utils::document()

View File

@ -42,7 +42,7 @@ async fn use_transitive_state_works() {
assert_eq!(
s,
// div text content should be 0 but state should be 12345.
r#"<!--<[use_transitive_state::use_transitive_state_works::{{closure}}::App]>--><!--<[yew::suspense::component::feat_csr_ssr::Suspense]>--><!--<[yew::suspense::component::feat_csr_ssr::BaseSuspense]>--><!--<?>--><div><!--<[use_transitive_state::use_transitive_state_works::{{closure}}::Comp]>--><div>0</div><script type="application/x-yew-comp-state">ATkwAAAB</script><!--</[use_transitive_state::use_transitive_state_works::{{closure}}::Comp]>--></div><!--</?>--><!--</[yew::suspense::component::feat_csr_ssr::BaseSuspense]>--><!--</[yew::suspense::component::feat_csr_ssr::Suspense]>--><!--</[use_transitive_state::use_transitive_state_works::{{closure}}::App]>-->"#
r#"<!--<[use_transitive_state::use_transitive_state_works::{{closure}}::App]>--><!--<[yew::suspense::component::feat_csr_ssr::Suspense]>--><!--<[yew::suspense::component::feat_csr_ssr::BaseSuspense]>--><!--<?>--><div><!--<[use_transitive_state::use_transitive_state_works::{{closure}}::Comp]>--><div>0</div><script type="application/x-yew-comp-state">Afs5MAE=</script><!--</[use_transitive_state::use_transitive_state_works::{{closure}}::Comp]>--></div><!--</?>--><!--</[yew::suspense::component::feat_csr_ssr::BaseSuspense]>--><!--</[yew::suspense::component::feat_csr_ssr::Suspense]>--><!--</[use_transitive_state::use_transitive_state_works::{{closure}}::App]>-->"#
);
gloo::utils::document()