summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/websocket/01_websocket.js2
-rw-r--r--serde_v8/magic/string_or_buffer.rs19
2 files changed, 19 insertions, 2 deletions
diff --git a/ext/websocket/01_websocket.js b/ext/websocket/01_websocket.js
index 797d64723..4b0b4e941 100644
--- a/ext/websocket/01_websocket.js
+++ b/ext/websocket/01_websocket.js
@@ -440,7 +440,7 @@
if (this.binaryType === "blob") {
data = new Blob([value]);
} else {
- data = value.buffer;
+ data = value;
}
const event = new MessageEvent("message", {
diff --git a/serde_v8/magic/string_or_buffer.rs b/serde_v8/magic/string_or_buffer.rs
index aa7e26d2b..582314d4b 100644
--- a/serde_v8/magic/string_or_buffer.rs
+++ b/serde_v8/magic/string_or_buffer.rs
@@ -29,7 +29,24 @@ impl ToV8 for StringOrBuffer {
scope: &mut v8::HandleScope<'a>,
) -> Result<v8::Local<'a, v8::Value>, crate::Error> {
match self {
- Self::Buffer(buf) => crate::to_v8(scope, buf),
+ Self::Buffer(buf) => {
+ let buf: Box<[u8]> = match buf {
+ ZeroCopyBuf::FromV8(buf) => {
+ let value: &[u8] = buf;
+ value.into()
+ }
+ ZeroCopyBuf::Temp(_) => unreachable!(),
+ ZeroCopyBuf::ToV8(ref mut x) => {
+ x.take().expect("ZeroCopyBuf was empty")
+ }
+ };
+ let backing_store =
+ v8::ArrayBuffer::new_backing_store_from_boxed_slice(buf);
+ Ok(
+ v8::ArrayBuffer::with_backing_store(scope, &backing_store.into())
+ .into(),
+ )
+ }
Self::String(s) => crate::to_v8(scope, s),
}
}