use super::{c_string, completion, loaded_bytes, receive};
use emscripten_functions_sys::emscripten as ffi;
use std::{
ffi::{c_char, c_void},
io,
};
pub async unsafe fn call_worker(
worker: ffi::worker_handle,
function: &str,
data: &[u8],
) -> io::Result<Vec<u8>> {
unsafe extern "C" fn reply(data: *mut c_char, len: i32, arg: *mut c_void) {
unsafe { loaded_bytes(arg, data.cast(), len) };
}
let function = c_string(function)?;
let len = i32::try_from(data.len())
.map_err(|err| io::Error::new(io::ErrorKind::InvalidInput, err))?;
let (arg, receiver) = completion::<Vec<u8>>();
unsafe {
ffi::emscripten_call_worker(
worker,
function.as_ptr(),
data.as_ptr().cast_mut().cast(),
len,
Some(reply),
arg,
)
};
receive(receiver).await
}