1 /*********************************************************************
2  * NAN - Native Abstractions for Node.js
3  *
4  * Copyright (c) 2018 NAN contributors
5  *
6  * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
7  ********************************************************************/
8 
9 #include <nan.h>
10 
11 #include "sleep.h"  // NOLINT(build/include)
12 
13 using namespace Nan;  // NOLINT(build/namespaces)
14 
15 class ProgressWorker : public AsyncProgressWorker {
16  public:
ProgressWorker(Callback * callback,Callback * progress,int milliseconds,int iters)17   ProgressWorker(
18       Callback *callback
19     , Callback *progress
20     , int milliseconds
21     , int iters)
22     : AsyncProgressWorker(callback), progress(progress)
23     , milliseconds(milliseconds), iters(iters) {}
24 
~ProgressWorker()25   ~ProgressWorker() {
26     delete progress;
27   }
28 
Execute(const AsyncProgressWorker::ExecutionProgress & progress)29   void Execute (const AsyncProgressWorker::ExecutionProgress& progress) {
30     for (int i = 0; i < iters; ++i) {
31       progress.Signal();
32       Sleep(milliseconds);
33     }
34   }
35 
HandleProgressCallback(const char * data,size_t count)36   void HandleProgressCallback(const char *data, size_t count) {
37     HandleScope scope;
38 
39     v8::Local<v8::Value> arg = New<v8::Boolean>(data == NULL && count == 0);
40     progress->Call(1, &arg, async_resource);
41   }
42 
43  private:
44   Callback *progress;
45   int milliseconds;
46   int iters;
47 };
48 
NAN_METHOD(DoProgress)49 NAN_METHOD(DoProgress) {
50   Callback *progress = new Callback(To<v8::Function>(info[2]).ToLocalChecked());
51   Callback *callback = new Callback(To<v8::Function>(info[3]).ToLocalChecked());
52   AsyncQueueWorker(new ProgressWorker(
53       callback
54     , progress
55     , To<uint32_t>(info[0]).FromJust()
56     , To<uint32_t>(info[1]).FromJust()));
57 }
58 
NAN_MODULE_INIT(Init)59 NAN_MODULE_INIT(Init) {
60   Set(target
61     , New<v8::String>("a").ToLocalChecked()
62     , GetFunction(New<v8::FunctionTemplate>(DoProgress)).ToLocalChecked());
63 }
64 
65 NODE_MODULE(asyncprogressworkersignal, Init)
66