/********************************************************************* * NAN - Native Abstractions for Node.js * * Copyright (c) 2018 NAN contributors * * MIT License ********************************************************************/ #include #include "sleep.h" // NOLINT(build/include) using namespace Nan; // NOLINT(build/namespaces) // Custom data type: This serves as an example of how external // libraries could be hooked in, populate their objects and send them to JS. struct data_t { int index; int data; }; // Unlike test/cpp/ayncprogressworker.cpp this test is explicitly templated. template class ProgressWorker : public AsyncProgressWorkerBase { public: ProgressWorker( Callback *callback , Callback *progress , int milliseconds , int iters) : AsyncProgressWorkerBase(callback), progress(progress) , milliseconds(milliseconds), iters(iters) {} ~ProgressWorker() { delete progress; } void Execute ( const typename AsyncProgressWorkerBase::ExecutionProgress& progress) { data_t data; for (int i = 0; i < iters; ++i) { data.index = i; data.data = i * 2; progress.Send(&data, 1); Sleep(milliseconds); } } void HandleProgressCallback(const T *data, size_t count) { HandleScope scope; v8::Local obj = Nan::New(); Nan::Set( obj, Nan::New("index").ToLocalChecked(), New(data->index)); Nan::Set( obj, Nan::New("data").ToLocalChecked(), New(data->data)); v8::Local argv[] = { obj }; progress->Call(1, argv, this->async_resource); } private: Callback *progress; int milliseconds; int iters; }; NAN_METHOD(DoProgress) { Callback *progress = new Callback(To(info[2]).ToLocalChecked()); Callback *callback = new Callback(To(info[3]).ToLocalChecked()); AsyncQueueWorker(new ProgressWorker( callback , progress , To(info[0]).FromJust() , To(info[1]).FromJust())); } NAN_MODULE_INIT(Init) { Set(target , New("a").ToLocalChecked() , GetFunction(New(DoProgress)).ToLocalChecked()); } NODE_MODULE(asyncprogressworkerstream, Init)