11using async_fn = std::function<void(msgpack::sbuffer&)>;
31 : Napi::AsyncWorker(env)
47 }
catch (
const std::exception& e) {
52 SetError(
"Unknown exception occurred during async operation");
58 auto buf = Napi::Buffer<char>::Copy(Env(),
_result.data(),
_result.size());
94 auto dummy = Napi::Function::New(env, [](
const Napi::CallbackInfo&) {});
95 _completion_tsfn = Napi::ThreadSafeFunction::New(env, dummy,
"ThreadedAsyncOpComplete", 0, 1);
105 static void Run(Napi::Env env, std::shared_ptr<Napi::Promise::Deferred> deferred,
async_fn fn)
114 auto self = shared_from_this();
115 std::thread([self]() {
117 self->_fn(self->_result);
118 self->_success =
true;
119 }
catch (
const std::exception& e) {
120 self->_error = e.what();
121 self->_success =
false;
123 self->_error =
"Unknown exception occurred during threaded async operation";
124 self->_success =
false;
131 self->_completion_tsfn.BlockingCall([self](Napi::Env env, Napi::Function ) {
132 if (self->_success) {
133 auto buf = Napi::Buffer<char>::Copy(env, self->_result.data(), self->_result.size());
134 self->_deferred->Resolve(buf);
136 auto error = Napi::Error::New(env, self->_error);
137 self->_deferred->Reject(error.Value());
139 self->_completion_tsfn.Release();
Encapsulatest some work that can be done off the JavaScript main thread.
AsyncOperation & operator=(AsyncOperation &&)=delete
AsyncOperation(AsyncOperation &&)=delete
AsyncOperation & operator=(const AsyncOperation &)=delete
AsyncOperation(const AsyncOperation &)=delete
~AsyncOperation() override=default
AsyncOperation(Napi::Env env, std::shared_ptr< Napi::Promise::Deferred > deferred, async_fn fn)
void OnError(const Napi::Error &e) override
std::shared_ptr< Napi::Promise::Deferred > _deferred
Runs work on a dedicated std::thread instead of the libuv thread pool.
ThreadedAsyncOperation & operator=(const ThreadedAsyncOperation &)=delete
ThreadedAsyncOperation(Napi::Env env, std::shared_ptr< Napi::Promise::Deferred > deferred, async_fn fn)
ThreadedAsyncOperation(const ThreadedAsyncOperation &)=delete
~ThreadedAsyncOperation()=default
std::shared_ptr< Napi::Promise::Deferred > _deferred
static void Run(Napi::Env env, std::shared_ptr< Napi::Promise::Deferred > deferred, async_fn fn)
ThreadedAsyncOperation & operator=(ThreadedAsyncOperation &&)=delete
Napi::ThreadSafeFunction _completion_tsfn
ThreadedAsyncOperation(ThreadedAsyncOperation &&)=delete
std::function< void(msgpack::sbuffer &)> async_fn
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept