summaryrefslogtreecommitdiff
path: root/serde_v8/src
diff options
context:
space:
mode:
authorTim Ramlot <42113979+inteon@users.noreply.github.com>2021-05-11 21:09:09 +0200
committerGitHub <noreply@github.com>2021-05-11 21:09:09 +0200
commit635253bd3a3895f49e6c9606beb852da22fee205 (patch)
treecec9d75354b4e985a376f888564ecb63c99f2643 /serde_v8/src
parent0d319161bc19a520df653bc0c8386f14a68efbdb (diff)
feat(runtime/worker): Structured cloning worker message passing (#9323)
This commit upgrade "Worker.postMessage()" implementation to use structured clone algorithm instead of non-spec compliant JSON serialization.
Diffstat (limited to 'serde_v8/src')
-rw-r--r--serde_v8/src/magic/buffer.rs17
1 files changed, 12 insertions, 5 deletions
diff --git a/serde_v8/src/magic/buffer.rs b/serde_v8/src/magic/buffer.rs
index 893bf35e1..1fcfffc72 100644
--- a/serde_v8/src/magic/buffer.rs
+++ b/serde_v8/src/magic/buffer.rs
@@ -1,9 +1,9 @@
use rusty_v8 as v8;
-use std::cell::Cell;
use std::fmt;
use std::ops::Deref;
use std::ops::DerefMut;
+use std::sync::Mutex;
use super::zero_copy_buf::ZeroCopyBuf;
@@ -11,7 +11,7 @@ use super::zero_copy_buf::ZeroCopyBuf;
// allowing us to use a single type for familiarity
pub enum MagicBuffer {
FromV8(ZeroCopyBuf),
- ToV8(Cell<Option<Box<[u8]>>>),
+ ToV8(Mutex<Option<Box<[u8]>>>),
}
impl MagicBuffer {
@@ -21,6 +21,10 @@ impl MagicBuffer {
) -> Self {
Self::FromV8(ZeroCopyBuf::new(scope, view))
}
+
+ pub fn empty() -> Self {
+ MagicBuffer::ToV8(Mutex::new(Some(vec![0_u8; 0].into_boxed_slice())))
+ }
}
impl Clone for MagicBuffer {
@@ -65,7 +69,7 @@ impl DerefMut for MagicBuffer {
impl From<Box<[u8]>> for MagicBuffer {
fn from(buf: Box<[u8]>) -> Self {
- MagicBuffer::ToV8(Cell::new(Some(buf)))
+ MagicBuffer::ToV8(Mutex::new(Some(buf)))
}
}
@@ -88,8 +92,11 @@ impl serde::Serialize for MagicBuffer {
let mut s = serializer.serialize_struct(BUF_NAME, 1)?;
let boxed: Box<[u8]> = match self {
- Self::FromV8(_) => unreachable!(),
- Self::ToV8(x) => x.take().expect("MagicBuffer was empty"),
+ Self::FromV8(buf) => {
+ let value: &[u8] = &buf;
+ value.into()
+ }
+ Self::ToV8(x) => x.lock().unwrap().take().expect("MagicBuffer was empty"),
};
let hack: [usize; 2] = unsafe { std::mem::transmute(boxed) };
let f1: u64 = hack[0] as u64;