From c86f0e66dfba6f21749bc9044da9892cae60d756 Mon Sep 17 00:00:00 2001 From: theodore Date: Sun, 27 Oct 2024 12:52:09 +0100 Subject: [PATCH] fix: temporary allocation for serialization --- crates/parser-common/src/value/mod.rs | 4 ++-- crates/parser-common/src/value/ser.rs | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/crates/parser-common/src/value/mod.rs b/crates/parser-common/src/value/mod.rs index a79277f1..7c48d718 100644 --- a/crates/parser-common/src/value/mod.rs +++ b/crates/parser-common/src/value/mod.rs @@ -44,12 +44,12 @@ pub fn from_value<'de, T: Deserialize<'de>>( /// Serialize any serializable data and an event to a generic [`SocketIoValue`] data. pub fn to_value(data: &T, event: Option<&str>) -> serde_json::Result { - let (writer, binary) = if is_ser_tuple(data) { + let (buff, binary) = if is_ser_tuple(data) { ser::into_str(data, event)? } else { ser::into_str(&(data,), event)? }; - let data = unsafe { Str::from_bytes_unchecked(Bytes::from(writer)) }; + let data = unsafe { Str::from_bytes_unchecked(buff) }; Ok(Value::Str(data, (!binary.is_empty()).then_some(binary))) } diff --git a/crates/parser-common/src/value/ser.rs b/crates/parser-common/src/value/ser.rs index f4ff3ae8..26291d84 100644 --- a/crates/parser-common/src/value/ser.rs +++ b/crates/parser-common/src/value/ser.rs @@ -1,7 +1,7 @@ //! This module contains a specialized JSON serializer wrapper that can serialize binary payloads as placeholders. use std::{cell::UnsafeCell, collections::VecDeque}; -use bytes::Bytes; +use bytes::{BufMut, Bytes, BytesMut}; use serde::ser::{ self, SerializeMap, SerializeSeq, SerializeStruct, SerializeStructVariant, SerializeTuple, SerializeTupleStruct, SerializeTupleVariant, @@ -16,7 +16,7 @@ use serde::ser::{ pub fn into_str( data: &T, event: Option<&str>, -) -> Result<(Vec, VecDeque), serde_json::Error> { +) -> Result<(Bytes, VecDeque), serde_json::Error> { let mut writer = Vec::new(); let binary_payloads = UnsafeCell::new(VecDeque::new()); let ser = &mut serde_json::Serializer::new(&mut writer); @@ -27,7 +27,8 @@ pub fn into_str( is_root: true, }; data.serialize(ser)?; - Ok((writer, binary_payloads.into_inner())) + writer.shrink_to_fit(); + Ok((Bytes::from(writer), binary_payloads.into_inner())) } struct Serializer<'a, S> {