use std::thread::sleep; use napi::bindgen_prelude::*; struct DelaySum(u32, u32); #[napi] impl napi::Task for DelaySum { type Output = u32; type JsValue = u32; fn compute(&mut self) -> Result { sleep(std::time::Duration::from_millis(100)); Ok(self.0 + self.1) } fn resolve(&mut self, _env: napi::Env, output: Self::Output) -> Result { Ok(output) } } #[napi] fn without_abort_controller(a: u32, b: u32) -> AsyncTask { AsyncTask::new(DelaySum(a, b)) } #[napi] fn with_abort_controller(a: u32, b: u32, signal: AbortSignal) -> AsyncTask { AsyncTask::with_signal(DelaySum(a, b), signal) } struct AsyncTaskVoidReturn {} #[napi] impl Task for AsyncTaskVoidReturn { type JsValue = (); type Output = (); fn compute(&mut self) -> Result { Ok(()) } fn resolve(&mut self, _env: Env, output: Self::Output) -> Result { Ok(output) } } #[napi] fn async_task_void_return() -> AsyncTask { AsyncTask::new(AsyncTaskVoidReturn {}) } struct AsyncTaskOptionalReturn {} #[napi] impl Task for AsyncTaskOptionalReturn { type JsValue = Option; type Output = (); fn compute(&mut self) -> Result { Ok(()) } fn resolve(&mut self, _env: Env, _: Self::Output) -> Result { Ok(None) } } #[napi] fn async_task_optional_return() -> AsyncTask { AsyncTask::new(AsyncTaskOptionalReturn {}) } pub struct AsyncTaskReadFile { path: String, } #[napi] impl Task for AsyncTaskReadFile { type Output = Vec; type JsValue = Buffer; fn compute(&mut self) -> Result { std::fs::read(&self.path).map_err(|e| Error::new(Status::GenericFailure, format!("{}", e))) } fn resolve(&mut self, _: Env, output: Self::Output) -> Result { Ok(output.into()) } } #[napi] pub fn async_task_read_file(path: String) -> AsyncTask { AsyncTask::new(AsyncTaskReadFile { path }) }