nj_core/
safebuffer.rs

1use std::ptr;
2
3use crate::TryIntoJs;
4use crate::sys::napi_value;
5use crate::val::JsEnv;
6use crate::NjError;
7
8/// Rust representation of Nodejs [ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer)
9/// In regular cases can be used ArrayBuffer and it will be more effective. But in the case of usage node_bindgen in electron context,
10/// ArrayBuffer will not work because of restrictions from electron side. SafeArrayBuffer can be used as an effective workaround. Theoretically,
11/// usage of SafeArrayBuffer might give a very small performance degradation compared to ArrayBuffer, but it can be ignored in most cases.
12///
13/// # Examples
14///
15/// ```no_run
16/// use node_bindgen::derive::node_bindgen;
17/// use node_bindgen::core::{buffer::JSArrayBuffer, safebuffer::{SafeArrayBuffer}};
18///
19/// #[node_bindgen]
20/// fn msg_from_js(data: JSArrayBuffer) -> Result<String, NjError> {
21///   let message = String::from_utf8(data.to_vec())?;
22///    Ok(format!("reply {}", message))
23/// }
24/// #[node_bindgen]
25/// fn msg_to_js() -> Result<SafeArrayBuffer, NjError> {
26///   let message = String::from("Hello from Rust!");
27///   Ok(SafeArrayBuffer::new(message.to_vec()))
28/// }
29/// ```
30pub struct SafeArrayBuffer {
31    data: Vec<u8>,
32}
33
34use std::fmt;
35use std::fmt::Debug;
36
37impl Debug for SafeArrayBuffer {
38    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
39        f.write_fmt(format_args!("SafeArrayBuffer len: {}", self.data.len()))
40    }
41}
42
43impl SafeArrayBuffer {
44    pub fn new(data: Vec<u8>) -> Self {
45        Self { data }
46    }
47}
48
49impl TryIntoJs for SafeArrayBuffer {
50    fn try_to_js(self, js_env: &JsEnv) -> Result<napi_value, NjError> {
51        let len = self.data.len();
52        let mut napi_buffer = ptr::null_mut();
53        crate::napi_call_result!(crate::sys::napi_create_buffer_copy(
54            js_env.inner(),
55            len,
56            self.data.as_ptr() as *const std::ffi::c_void,
57            std::ptr::null_mut(),
58            &mut napi_buffer,
59        ))?;
60        Ok(napi_buffer)
61    }
62}