k2hash 1.1.34 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -35,63 +35,75 @@
35
35
  // Callback function: function(string error)
36
36
  //
37
37
  //---------------------------------------------------------
38
- class CreateWorker : public Nan::AsyncWorker
38
+ class CreateAsyncWorker : public Napi::AsyncWorker
39
39
  {
40
40
  public:
41
- CreateWorker(Nan::Callback* callback, K2HShm* pobj, const char* k2hfile, bool fullmapping, int mask, int cmask, int element_cnt, size_t page) :
42
- Nan::AsyncWorker(callback), pk2hobj(pobj),
43
- strfile(k2hfile ? k2hfile : ""), isfullmapping(fullmapping), mask_bitcnt(mask), cmask_bitcnt(cmask), max_element_cnt(element_cnt), pagesize(page)
44
- {}
45
- ~CreateWorker() {}
41
+ CreateAsyncWorker(const Napi::Function& callback, K2HShm* k2hshm, const std::string& filename, bool isfullmapping, int mask_bitcnt, int cmask_bitcnt, int max_element_cnt, size_t pagesize) :
42
+ Napi::AsyncWorker(callback), _callbackRef(Napi::Persistent(callback)), _k2hshm(k2hshm),
43
+ _filename(filename), _isfullmapping(isfullmapping), _mask_bitcnt(mask_bitcnt), _cmask_bitcnt(cmask_bitcnt), _max_element_cnt(max_element_cnt), _pagesize(pagesize), _result(false)
44
+ {
45
+ _callbackRef.Ref();
46
+ }
47
+
48
+ ~CreateAsyncWorker() override
49
+ {
50
+ if(_callbackRef){
51
+ _callbackRef.Unref();
52
+ _callbackRef.Reset();
53
+ }
54
+ }
46
55
 
47
- void Execute()
56
+ // Run on worker thread
57
+ void Execute() override
48
58
  {
49
- if(!pk2hobj){
50
- Nan::ReferenceError("No object is associated to async worker");
59
+ if(!_k2hshm){
60
+ SetError("No object is associated to async worker");
51
61
  return;
52
62
  }
53
- if(!pk2hobj->Create(strfile.c_str(), isfullmapping, mask_bitcnt, cmask_bitcnt, max_element_cnt, pagesize)){
54
- // set error
55
- this->SetErrorMessage("Failed to initialize k2hash object.");
63
+ if(!_k2hshm->Create(_filename.c_str(), _isfullmapping, _mask_bitcnt, _cmask_bitcnt, _max_element_cnt, _pagesize)){
64
+ SetError(std::string("Failed to create K2HASH file: ") + _filename); // call SetError method in Napi::AsyncWorker
65
+ return;
56
66
  }
67
+ _result = true;
57
68
  }
58
69
 
59
- void HandleOKCallback()
70
+ // handler for success
71
+ void OnOK() override
60
72
  {
61
- Nan::HandleScope scope;
62
- const int argc = 1;
63
- v8::Local<v8::Value> argv[argc] = { Nan::Null() };
73
+ Napi::Env env = Env();
74
+ Napi::HandleScope scope(env);
64
75
 
65
- if(callback){
66
- callback->Call(argc, argv);
67
- }else{
68
- Nan::ThrowSyntaxError("Internal error in async worker");
69
- return;
76
+ // The first argument is null and the second argument is the result.
77
+ if(!_callbackRef.IsEmpty()){
78
+ _callbackRef.Value().Call({ env.Null(), Napi::Boolean::New(env, _result) });
70
79
  }
71
80
  }
72
81
 
73
- void HandleErrorCallback()
74
- {
75
- Nan::HandleScope scope;
76
- const int argc = 1;
77
- v8::Local<v8::Value> argv[argc] = { Nan::New<v8::String>(this->ErrorMessage()).ToLocalChecked() };
82
+ // handler for failure (by calling SetError)
83
+ void OnError(const Napi::Error& err) override
84
+ {
85
+ Napi::Env env = Env();
86
+ Napi::HandleScope scope(env);
78
87
 
79
- if(callback){
80
- callback->Call(argc, argv);
88
+ // The first argument is the error message.
89
+ if(!_callbackRef.IsEmpty()){
90
+ _callbackRef.Value().Call({ err.Value() });
81
91
  }else{
82
- Nan::ThrowSyntaxError("Internal error in async worker");
83
- return;
92
+ // Throw error
93
+ err.ThrowAsJavaScriptException();
84
94
  }
85
- }
95
+ }
86
96
 
87
97
  private:
88
- K2HShm* pk2hobj;
89
- std::string strfile;
90
- bool isfullmapping;
91
- int mask_bitcnt;
92
- int cmask_bitcnt;
93
- int max_element_cnt;
94
- size_t pagesize;
98
+ Napi::FunctionReference _callbackRef;
99
+ K2HShm* _k2hshm;
100
+ std::string _filename;
101
+ bool _isfullmapping;
102
+ int _mask_bitcnt;
103
+ int _cmask_bitcnt;
104
+ int _max_element_cnt;
105
+ size_t _pagesize;
106
+ bool _result;
95
107
  };
96
108
 
97
109
  //---------------------------------------------------------
@@ -101,66 +113,78 @@ class CreateWorker : public Nan::AsyncWorker
101
113
  // Callback function: function(string error)
102
114
  //
103
115
  //---------------------------------------------------------
104
- class OpenWorker : public Nan::AsyncWorker
116
+ class OpenAsyncWorker : public Napi::AsyncWorker
105
117
  {
106
118
  public:
107
- OpenWorker(Nan::Callback* callback, K2HShm* pobj, const char* k2hfile, bool readonly, bool create, bool tempfilemode, bool fullmapping, int mask, int cmask, int element_cnt, size_t page) :
108
- Nan::AsyncWorker(callback), pk2hobj(pobj),
109
- strfile(k2hfile ? k2hfile : ""), isReadOnly(readonly), isCreate(create), isTempFile(tempfilemode), isfullmapping(fullmapping), mask_bitcnt(mask), cmask_bitcnt(cmask), max_element_cnt(element_cnt), pagesize(page)
110
- {}
111
- ~OpenWorker() {}
119
+ OpenAsyncWorker(const Napi::Function& callback, K2HShm* k2hshm, const std::string& filename, bool isReadOnly, bool isCreate, bool isTempFile, bool isfullmapping, int mask_bitcnt, int cmask_bitcnt, int max_element_cnt, size_t pagesize) :
120
+ Napi::AsyncWorker(callback), _callbackRef(Napi::Persistent(callback)), _k2hshm(k2hshm),
121
+ _filename(filename), _isReadOnly(isReadOnly), _isCreate(isCreate), _isTempFile(isTempFile), _isfullmapping(isfullmapping), _mask_bitcnt(mask_bitcnt), _cmask_bitcnt(cmask_bitcnt), _max_element_cnt(max_element_cnt), _pagesize(pagesize), _result(false)
122
+ {
123
+ _callbackRef.Ref();
124
+ }
112
125
 
113
- void Execute()
126
+ ~OpenAsyncWorker() override
114
127
  {
115
- if(!pk2hobj){
116
- Nan::ReferenceError("No object is associated to async worker");
128
+ if(_callbackRef){
129
+ _callbackRef.Unref();
130
+ _callbackRef.Reset();
131
+ }
132
+ }
133
+
134
+ // Run on worker thread
135
+ void Execute() override
136
+ {
137
+ if(!_k2hshm){
138
+ SetError("No object is associated to async worker");
117
139
  return;
118
140
  }
119
- if(!pk2hobj->Attach(strfile.c_str(), isReadOnly, isCreate, isTempFile, isfullmapping, mask_bitcnt, cmask_bitcnt, max_element_cnt, pagesize)){
120
- // set error
121
- this->SetErrorMessage("Failed to attach(open) k2hash object.");
141
+ if(!_k2hshm->Attach(_filename.c_str(), _isReadOnly, _isCreate, _isTempFile, _isfullmapping, _mask_bitcnt, _cmask_bitcnt, _max_element_cnt, _pagesize)){
142
+ SetError(std::string("Failed to attach(open) k2hash object.")); // call SetError method in Napi::AsyncWorker
143
+ return;
122
144
  }
145
+ _result = true;
123
146
  }
124
147
 
125
- void HandleOKCallback()
148
+ // handler for success
149
+ void OnOK() override
126
150
  {
127
- Nan::HandleScope scope;
128
- const int argc = 1;
129
- v8::Local<v8::Value> argv[argc] = { Nan::Null() };
151
+ Napi::Env env = Env();
152
+ Napi::HandleScope scope(env);
130
153
 
131
- if(callback){
132
- callback->Call(argc, argv);
133
- }else{
134
- Nan::ThrowSyntaxError("Internal error in async worker");
135
- return;
154
+ // The first argument is null and the second argument is the result.
155
+ if(!_callbackRef.IsEmpty()){
156
+ _callbackRef.Value().Call({ env.Null(), Napi::Boolean::New(env, _result) });
136
157
  }
137
158
  }
138
159
 
139
- void HandleErrorCallback()
140
- {
141
- Nan::HandleScope scope;
142
- const int argc = 1;
143
- v8::Local<v8::Value> argv[argc] = { Nan::New<v8::String>(this->ErrorMessage()).ToLocalChecked() };
160
+ // handler for failure (by calling SetError)
161
+ void OnError(const Napi::Error& err) override
162
+ {
163
+ Napi::Env env = Env();
164
+ Napi::HandleScope scope(env);
144
165
 
145
- if(callback){
146
- callback->Call(argc, argv);
166
+ // The first argument is the error message.
167
+ if(!_callbackRef.IsEmpty()){
168
+ _callbackRef.Value().Call({ err.Value() });
147
169
  }else{
148
- Nan::ThrowSyntaxError("Internal error in async worker");
149
- return;
170
+ // Throw error
171
+ err.ThrowAsJavaScriptException();
150
172
  }
151
- }
173
+ }
152
174
 
153
175
  private:
154
- K2HShm* pk2hobj;
155
- std::string strfile;
156
- bool isReadOnly;
157
- bool isCreate;
158
- bool isTempFile;
159
- bool isfullmapping;
160
- int mask_bitcnt;
161
- int cmask_bitcnt;
162
- int max_element_cnt;
163
- size_t pagesize;
176
+ Napi::FunctionReference _callbackRef;
177
+ K2HShm* _k2hshm;
178
+ std::string _filename;
179
+ bool _isReadOnly;
180
+ bool _isCreate;
181
+ bool _isTempFile;
182
+ bool _isfullmapping;
183
+ int _mask_bitcnt;
184
+ int _cmask_bitcnt;
185
+ int _max_element_cnt;
186
+ size_t _pagesize;
187
+ bool _result;
164
188
  };
165
189
 
166
190
  //---------------------------------------------------------
@@ -170,54 +194,65 @@ class OpenWorker : public Nan::AsyncWorker
170
194
  // Callback function: function(string error)
171
195
  //
172
196
  //---------------------------------------------------------
173
- class CloseWorker : public Nan::AsyncWorker
197
+ class CloseAsyncWorker : public Napi::AsyncWorker
174
198
  {
175
199
  public:
176
- CloseWorker(Nan::Callback* callback, K2HShm* pobj) : Nan::AsyncWorker(callback), pk2hobj(pobj) {}
177
- ~CloseWorker() {}
200
+ CloseAsyncWorker(const Napi::Function& callback, K2HShm* k2hshm) : Napi::AsyncWorker(callback), _callbackRef(Napi::Persistent(callback)), _k2hshm(k2hshm)
201
+ {
202
+ _callbackRef.Ref();
203
+ }
204
+
205
+ ~CloseAsyncWorker() override
206
+ {
207
+ if(_callbackRef){
208
+ _callbackRef.Unref();
209
+ _callbackRef.Reset();
210
+ }
211
+ }
178
212
 
179
- void Execute()
213
+ // Run on worker thread
214
+ void Execute() override
180
215
  {
181
- if(!pk2hobj){
182
- Nan::ReferenceError("No object is associated to async worker");
216
+ if(!_k2hshm){
217
+ SetError("No object is associated to async worker");
183
218
  return;
184
219
  }
185
- if(!pk2hobj->Detach()){
186
- // set error
187
- this->SetErrorMessage("Failed to close k2hash object.");
220
+ if(!_k2hshm->Detach()){
221
+ SetError(std::string("Failed to close k2hash object.")); // call SetError method in Napi::AsyncWorker
222
+ return;
188
223
  }
189
224
  }
190
225
 
191
- void HandleOKCallback()
226
+ // handler for success
227
+ void OnOK() override
192
228
  {
193
- Nan::HandleScope scope;
194
- const int argc = 1;
195
- v8::Local<v8::Value> argv[argc] = { Nan::Null() };
229
+ Napi::Env env = Env();
230
+ Napi::HandleScope scope(env);
196
231
 
197
- if(callback){
198
- callback->Call(argc, argv);
199
- }else{
200
- Nan::ThrowSyntaxError("Internal error in async worker");
201
- return;
232
+ // The first argument is null and the second argument is the result.
233
+ if(!_callbackRef.IsEmpty()){
234
+ _callbackRef.Value().Call({ env.Null(), Napi::Boolean::New(env, true) });
202
235
  }
203
236
  }
204
237
 
205
- void HandleErrorCallback()
206
- {
207
- Nan::HandleScope scope;
208
- const int argc = 1;
209
- v8::Local<v8::Value> argv[argc] = { Nan::New<v8::String>(this->ErrorMessage()).ToLocalChecked() };
238
+ // handler for failure (by calling SetError)
239
+ void OnError(const Napi::Error& err) override
240
+ {
241
+ Napi::Env env = Env();
242
+ Napi::HandleScope scope(env);
210
243
 
211
- if(callback){
212
- callback->Call(argc, argv);
244
+ // The first argument is the error message.
245
+ if(!_callbackRef.IsEmpty()){
246
+ _callbackRef.Value().Call({ err.Value() });
213
247
  }else{
214
- Nan::ThrowSyntaxError("Internal error in async worker");
215
- return;
248
+ // Throw error
249
+ err.ThrowAsJavaScriptException();
216
250
  }
217
- }
251
+ }
218
252
 
219
253
  private:
220
- K2HShm* pk2hobj;
254
+ Napi::FunctionReference _callbackRef;
255
+ K2HShm* _k2hshm;
221
256
  };
222
257
 
223
258
  //---------------------------------------------------------
@@ -227,104 +262,117 @@ class CloseWorker : public Nan::AsyncWorker
227
262
  // Callback function: function(string error[, string value])
228
263
  //
229
264
  //---------------------------------------------------------
230
- class GetValueWorker : public Nan::AsyncWorker
265
+ class GetValueAsyncWorker : public Napi::AsyncWorker
231
266
  {
232
267
  public:
233
- GetValueWorker(Nan::Callback* callback, K2HShm* pobj, const char* pkey, const char* psubkey, bool attrchk, const char* ppass) :
234
- Nan::AsyncWorker(callback), pk2hobj(pobj),
235
- is_key_set(false), strkey(pkey ? pkey : ""), is_skey_set(false), strsubkey(psubkey ? psubkey : ""), is_attr_check(attrchk), is_pass_set(false), strpass(ppass ? ppass : ""), presult(NULL)
268
+ GetValueAsyncWorker(const Napi::Function& callback, K2HShm* k2hshm, const char* pkey, const char* psubkey, bool attrchk, const char* ppass) :
269
+ Napi::AsyncWorker(callback), _callbackRef(Napi::Persistent(callback)), _k2hshm(k2hshm),
270
+ _is_key_set(pkey != nullptr), _strkey(pkey ? pkey : ""), _is_skey_set(psubkey != nullptr), _strsubkey(psubkey ? psubkey : ""), _is_attr_check(attrchk), _is_pass_set(ppass != nullptr), _strpass(ppass ? ppass : ""), _presult(nullptr)
236
271
  {
237
- is_key_set = (NULL != pkey);
238
- is_skey_set = (NULL != psubkey);
239
- is_pass_set = (NULL != ppass);
272
+ _callbackRef.Ref();
240
273
  }
241
- ~GetValueWorker()
274
+
275
+ ~GetValueAsyncWorker() override
242
276
  {
243
- K2H_Free(presult);
277
+ if(_callbackRef){
278
+ _callbackRef.Unref();
279
+ _callbackRef.Reset();
280
+ }
281
+ K2H_Free(_presult);
244
282
  }
245
283
 
246
- void Execute()
284
+ // Run on worker thread
285
+ void Execute() override
247
286
  {
248
- if(!pk2hobj){
249
- Nan::ReferenceError("No object is associated to async worker");
287
+ if(!_k2hshm){
288
+ SetError("No object is associated to async worker");
250
289
  return;
251
290
  }
252
- if(!is_key_set){
253
- Nan::ReferenceError("Specified key is empty(null)");
291
+ if(!_is_key_set){
292
+ SetError("Specified key is empty(null)");
254
293
  return;
255
294
  }
256
295
 
257
296
  // check subkey if specified
258
- if(is_skey_set){
297
+ if(_is_skey_set){
259
298
  // subkey is specified, thus need to check the key has it.
260
299
  bool found = false;
261
- K2HSubKeys* sk = pk2hobj->GetSubKeys(strkey.c_str());
300
+ K2HSubKeys* sk = _k2hshm->GetSubKeys(_strkey.c_str());
262
301
  if(sk){
263
302
  strarr_t strarr;
264
303
  sk->StringArray(strarr);
265
- for(strarr_t::const_iterator iter = strarr.begin(); iter != strarr.end(); ++iter){
266
- if(0 == strcmp(iter->c_str(), strsubkey.c_str())){
267
- found = true;
268
- break;
269
- }
270
- }
304
+ found = std::any_of(strarr.begin(), strarr.end(), [&](const auto &_str){ return _str == _strsubkey; });
271
305
  delete sk;
272
306
  }
273
307
  if(!found){
274
- // set error
275
- this->SetErrorMessage("There is no specified subkey in key subkey list.");
308
+ SetError("There is no specified subkey in key subkey list.");
276
309
  return;
277
310
  }
278
- strkey = strsubkey;
311
+ _strkey = _strsubkey;
279
312
  }
280
313
 
281
314
  // get value
282
- presult = pk2hobj->Get(strkey.c_str(), is_attr_check, (is_pass_set ? strpass.c_str() : NULL));
283
- if(!presult){
284
- // set error
285
- this->SetErrorMessage("Failed to get value from key/subkey or the value is empty(null).");
315
+ _presult = _k2hshm->Get(_strkey.c_str(), _is_attr_check, (_is_pass_set ? _strpass.c_str() : NULL));
316
+ if(!_presult){
317
+ SetError("Failed to get value from key/subkey or the value is empty(null).");
286
318
  return;
287
319
  }
288
320
  }
289
321
 
290
- void HandleOKCallback()
322
+ // handler for success
323
+ void OnOK() override
291
324
  {
292
- Nan::HandleScope scope;
293
- const int argc = 2;
294
- v8::Local<v8::Value> argv[argc] = { Nan::Null(), Nan::New<v8::String>(presult).ToLocalChecked() };
325
+ Napi::Env env = Env();
326
+ Napi::HandleScope scope(env);
295
327
 
296
- if(callback){
297
- callback->Call(argc, argv);
328
+ // The first argument is null and the second argument is the result.
329
+ if(!_callbackRef.IsEmpty()){
330
+ Napi::String jsValue = Napi::String::New(env, (_presult ? _presult : ""), (_presult ? static_cast<size_t>(strlen(_presult)) : 0));
331
+ _callbackRef.Value().Call({ env.Null(), jsValue });
298
332
  }else{
299
- Nan::ThrowSyntaxError("Internal error in async worker");
300
- return;
333
+ Napi::TypeError::New(env, "Internal error in async worker").ThrowAsJavaScriptException();
301
334
  }
302
335
  }
303
336
 
304
- void HandleErrorCallback()
305
- {
306
- Nan::HandleScope scope;
307
- const int argc = 2;
308
- v8::Local<v8::Value> argv[argc] = { Nan::New<v8::String>(this->ErrorMessage()).ToLocalChecked(), Nan::Null() };
337
+ // handler for failure (by calling SetError)
338
+ void OnError(const Napi::Error& err) override
339
+ {
340
+ Napi::Env env = Env();
341
+ Napi::HandleScope scope(env);
342
+
343
+ std::string msg;
344
+ if(err.Value().IsObject()){
345
+ Napi::Object obj = err.Value().As<Napi::Object>();
346
+ Napi::Value msgval = obj.Get("message");
347
+ if(msgval.IsString()){
348
+ msg = msgval.As<Napi::String>().Utf8Value();
349
+ }else{
350
+ Napi::String _str = obj.ToString();
351
+ msg = _str.Utf8Value();
352
+ }
353
+ }else{
354
+ msg = "Unknown error";
355
+ }
309
356
 
310
- if(callback){
311
- callback->Call(argc, argv);
357
+ // The first argument is the error message.
358
+ if(!_callbackRef.IsEmpty()){
359
+ _callbackRef.Value().Call({ Napi::String::New(env, msg), env.Null() });
312
360
  }else{
313
- Nan::ThrowSyntaxError("Internal error in async worker");
314
- return;
361
+ err.ThrowAsJavaScriptException();
315
362
  }
316
- }
363
+ }
317
364
 
318
365
  private:
319
- K2HShm* pk2hobj;
320
- bool is_key_set;
321
- std::string strkey;
322
- bool is_skey_set;
323
- std::string strsubkey;
324
- bool is_attr_check;
325
- bool is_pass_set;
326
- std::string strpass;
327
- char* presult;
366
+ Napi::FunctionReference _callbackRef;
367
+ K2HShm* _k2hshm;
368
+ bool _is_key_set;
369
+ std::string _strkey;
370
+ bool _is_skey_set;
371
+ std::string _strsubkey;
372
+ bool _is_attr_check;
373
+ bool _is_pass_set;
374
+ std::string _strpass;
375
+ char* _presult;
328
376
  };
329
377
 
330
378
  //---------------------------------------------------------
@@ -334,82 +382,101 @@ class GetValueWorker : public Nan::AsyncWorker
334
382
  // Callback function: function(string error, array subkeys)
335
383
  //
336
384
  //---------------------------------------------------------
337
- class GetSubkeysWorker : public Nan::AsyncWorker
385
+ class GetSubkeysAsyncWorker : public Napi::AsyncWorker
338
386
  {
339
387
  public:
340
- GetSubkeysWorker(Nan::Callback* callback, K2HShm* pobj, const char* pkey) : Nan::AsyncWorker(callback), pk2hobj(pobj), is_key_set(false), strkey(pkey ? pkey : "")
388
+ GetSubkeysAsyncWorker(const Napi::Function& callback, K2HShm* pobj, const char* pkey) :
389
+ Napi::AsyncWorker(callback), _callbackRef(Napi::Persistent(callback)), _k2hshm(pobj), _is_key_set(pkey != nullptr), _strkey(pkey ? pkey : ""), _subkey_array()
341
390
  {
342
- is_key_set = (NULL != pkey);
391
+ _callbackRef.Ref();
392
+ }
393
+
394
+ ~GetSubkeysAsyncWorker() override
395
+ {
396
+ if(_callbackRef){
397
+ _callbackRef.Unref();
398
+ _callbackRef.Reset();
399
+ }
343
400
  }
344
- ~GetSubkeysWorker() {}
345
401
 
346
- void Execute()
402
+ // Run on worker thread
403
+ void Execute() override
347
404
  {
348
- if(!pk2hobj){
349
- Nan::ReferenceError("No object is associated to async worker");
405
+ if(!_k2hshm){
406
+ SetError("No object is associated to async worker");
350
407
  return;
351
408
  }
352
- if(!is_key_set){
353
- Nan::ReferenceError("Specified key is empty(null)");
409
+ if(!_is_key_set){
410
+ SetError("Specified key is empty(null)");
354
411
  return;
355
412
  }
356
413
 
357
- // get subkey
358
- K2HSubKeys* sk = pk2hobj->GetSubKeys(strkey.c_str());
414
+ // get subkeys
415
+ K2HSubKeys* sk = _k2hshm->GetSubKeys(_strkey.c_str());
359
416
  if(sk){
360
- subkey_array.clear();
361
- sk->StringArray(subkey_array);
362
- delete sk;
363
- if(0 == subkey_array.size()){
364
- // set error
365
- this->SetErrorMessage("Failed to get subkey because the key does not have any subkey.");
417
+ _subkey_array.clear();
418
+ sk->StringArray(_subkey_array);
419
+ delete sk;
420
+ if(0 == _subkey_array.size()){
421
+ SetError("Failed to get subkey because the key does not have any subkey.");
366
422
  return;
367
423
  }
368
424
  }else{
369
- // set error
370
- this->SetErrorMessage("Failed to get subkey from key or key does not have any subkey.");
425
+ SetError("Failed to get subkey from key or key does not have any subkey.");
371
426
  return;
372
427
  }
373
428
  }
374
429
 
375
- void HandleOKCallback()
430
+ // handler for success
431
+ void OnOK() override
376
432
  {
377
- Nan::HandleScope scope;
378
- v8::Local<v8::Array> retarr = Nan::New<v8::Array>();
379
- int pos = 0 ;
380
- for(strarr_t::const_iterator iter = subkey_array.begin(); iter != subkey_array.end(); ++iter, ++pos){
381
- Nan::Set(retarr, pos, Nan::New<v8::String>(iter->c_str()).ToLocalChecked());
382
- }
383
- const int argc = 2;
384
- v8::Local<v8::Value> argv[argc] = { Nan::Null(), retarr };
385
-
386
- if(callback){
387
- callback->Call(argc, argv);
433
+ Napi::Env env = Env();
434
+ Napi::HandleScope scope(env);
435
+
436
+ if(!_callbackRef.IsEmpty()){
437
+ Napi::Array retarr = Napi::Array::New(env, _subkey_array.size());
438
+ uint32_t idx = 0;
439
+ for(const auto &_str : _subkey_array){
440
+ retarr.Set(idx++, Napi::String::New(env, _str.c_str(), static_cast<size_t>(strlen(_str.c_str()))));
441
+ }
442
+ _callbackRef.Value().Call({ env.Null(), retarr });
388
443
  }else{
389
- Nan::ThrowSyntaxError("Internal error in async worker");
390
- return;
444
+ Napi::TypeError::New(env, "Internal error in async worker").ThrowAsJavaScriptException();
391
445
  }
392
446
  }
393
447
 
394
- void HandleErrorCallback()
395
- {
396
- Nan::HandleScope scope;
397
- const int argc = 2;
398
- v8::Local<v8::Value> argv[argc] = { Nan::New<v8::String>(this->ErrorMessage()).ToLocalChecked(), Nan::Null() };
448
+ // handler for failure (by calling SetError)
449
+ void OnError(const Napi::Error& err) override
450
+ {
451
+ Napi::Env env = Env();
452
+ Napi::HandleScope scope(env);
453
+
454
+ std::string msg;
455
+ if(err.Value().IsObject()){
456
+ Napi::Object obj = err.Value().As<Napi::Object>();
457
+ Napi::Value mv = obj.Get("message");
458
+ if(mv.IsString()){
459
+ msg = mv.As<Napi::String>().Utf8Value();
460
+ }else{
461
+ msg = err.Message();
462
+ }
463
+ }else{
464
+ msg = err.Message();
465
+ }
399
466
 
400
- if(callback){
401
- callback->Call(argc, argv);
467
+ if(!_callbackRef.IsEmpty()){
468
+ _callbackRef.Value().Call({ Napi::String::New(env, msg), env.Null() });
402
469
  }else{
403
- Nan::ThrowSyntaxError("Internal error in async worker");
404
- return;
470
+ err.ThrowAsJavaScriptException();
405
471
  }
406
- }
472
+ }
407
473
 
408
474
  private:
409
- K2HShm* pk2hobj;
410
- bool is_key_set;
411
- std::string strkey;
412
- strarr_t subkey_array;
475
+ Napi::FunctionReference _callbackRef;
476
+ K2HShm* _k2hshm;
477
+ bool _is_key_set;
478
+ std::string _strkey;
479
+ strarr_t _subkey_array;
413
480
  };
414
481
 
415
482
  //---------------------------------------------------------
@@ -419,82 +486,101 @@ class GetSubkeysWorker : public Nan::AsyncWorker
419
486
  // Callback function: function(string error, array attrs)
420
487
  //
421
488
  //---------------------------------------------------------
422
- class GetAttrsWorker : public Nan::AsyncWorker
489
+ class GetAttrsAsyncWorker : public Napi::AsyncWorker
423
490
  {
424
491
  public:
425
- GetAttrsWorker(Nan::Callback* callback, K2HShm* pobj, const char* pkey) : Nan::AsyncWorker(callback), pk2hobj(pobj), is_key_set(false), strkey(pkey ? pkey : "")
492
+ GetAttrsAsyncWorker(const Napi::Function& callback, K2HShm* pobj, const char* pkey) :
493
+ Napi::AsyncWorker(callback), _callbackRef(Napi::Persistent(callback)), _k2hshm(pobj), _is_key_set(pkey != nullptr), _strkey(pkey ? pkey : ""), _attrs_array()
494
+ {
495
+ _callbackRef.Ref();
496
+ }
497
+
498
+ ~GetAttrsAsyncWorker() override
426
499
  {
427
- is_key_set = (NULL != pkey);
500
+ if(_callbackRef){
501
+ _callbackRef.Unref();
502
+ _callbackRef.Reset();
503
+ }
428
504
  }
429
- ~GetAttrsWorker() {}
430
505
 
431
- void Execute()
506
+ // Run on worker thread
507
+ void Execute() override
432
508
  {
433
- if(!pk2hobj){
434
- Nan::ReferenceError("No object is associated to async worker");
509
+ if(!_k2hshm){
510
+ SetError("No object is associated to async worker");
435
511
  return;
436
512
  }
437
- if(!is_key_set){
438
- Nan::ReferenceError("Specified key is empty(null)");
513
+ if(!_is_key_set){
514
+ SetError("Specified key is empty(null)");
439
515
  return;
440
516
  }
441
517
 
442
518
  // get attributes
443
- K2HAttrs* attrs = pk2hobj->GetAttrs(strkey.c_str());
519
+ K2HAttrs* attrs = _k2hshm->GetAttrs(_strkey.c_str());
444
520
  if(attrs){
445
- attrs_array.clear();
446
- attrs->KeyStringArray(attrs_array);
521
+ _attrs_array.clear();
522
+ attrs->KeyStringArray(_attrs_array);
447
523
  delete attrs;
448
- if(0 == attrs_array.size()){
449
- // set error
450
- this->SetErrorMessage("Failed to get attributes because the key does not have any attribute.");
524
+ if(0 == _attrs_array.size()){
525
+ SetError("Failed to get attributes because the key does not have any attribute.");
451
526
  return;
452
527
  }
453
528
  }else{
454
- // get error
455
- this->SetErrorMessage("Failed to get attributes from key or key does not have any attribute.");
529
+ SetError("Failed to get attributes from key or key does not have any attribute.");
456
530
  return;
457
531
  }
458
532
  }
459
533
 
460
- void HandleOKCallback()
534
+ // handler for success
535
+ void OnOK() override
461
536
  {
462
- Nan::HandleScope scope;
463
- v8::Local<v8::Array> retarr = Nan::New<v8::Array>();
464
- int pos = 0 ;
465
- for(strarr_t::const_iterator iter = attrs_array.begin(); iter != attrs_array.end(); ++iter, ++pos){
466
- Nan::Set(retarr, pos, Nan::New<v8::String>(iter->c_str()).ToLocalChecked());
467
- }
468
- const int argc = 2;
469
- v8::Local<v8::Value> argv[argc] = { Nan::Null(), retarr };
470
-
471
- if(callback){
472
- callback->Call(argc, argv);
537
+ Napi::Env env = Env();
538
+ Napi::HandleScope scope(env);
539
+
540
+ if(!_callbackRef.IsEmpty()){
541
+ Napi::Array retarr = Napi::Array::New(env, _attrs_array.size());
542
+ uint32_t idx = 0;
543
+ for(const auto &_str: _attrs_array){
544
+ retarr.Set(idx++, Napi::String::New(env, _str.c_str(), static_cast<size_t>(strlen(_str.c_str()))));
545
+ }
546
+ _callbackRef.Value().Call({ env.Null(), retarr });
473
547
  }else{
474
- Nan::ThrowSyntaxError("Internal error in async worker");
475
- return;
548
+ Napi::TypeError::New(env, "Internal error in async worker").ThrowAsJavaScriptException();
476
549
  }
477
550
  }
478
551
 
479
- void HandleErrorCallback()
480
- {
481
- Nan::HandleScope scope;
482
- const int argc = 2;
483
- v8::Local<v8::Value> argv[argc] = { Nan::New<v8::String>(this->ErrorMessage()).ToLocalChecked(), Nan::Null() };
552
+ // handler for failure (by calling SetError)
553
+ void OnError(const Napi::Error& err) override
554
+ {
555
+ Napi::Env env = Env();
556
+ Napi::HandleScope scope(env);
557
+
558
+ std::string msg;
559
+ if(err.Value().IsObject()){
560
+ Napi::Object obj = err.Value().As<Napi::Object>();
561
+ Napi::Value mv = obj.Get("message");
562
+ if(mv.IsString()){
563
+ msg = mv.As<Napi::String>().Utf8Value();
564
+ }else{
565
+ msg = err.Message();
566
+ }
567
+ }else{
568
+ msg = err.Message();
569
+ }
484
570
 
485
- if(callback){
486
- callback->Call(argc, argv);
571
+ if(!_callbackRef.IsEmpty()){
572
+ _callbackRef.Value().Call({ Napi::String::New(env, msg), env.Null() });
487
573
  }else{
488
- Nan::ThrowSyntaxError("Internal error in async worker");
489
- return;
574
+ err.ThrowAsJavaScriptException();
490
575
  }
491
- }
576
+ }
492
577
 
493
578
  private:
494
- K2HShm* pk2hobj;
495
- bool is_key_set;
496
- std::string strkey;
497
- strarr_t attrs_array;
579
+ Napi::FunctionReference _callbackRef;
580
+ K2HShm* _k2hshm;
581
+ bool _is_key_set;
582
+ std::string _strkey;
583
+ strarr_t _attrs_array;
498
584
  };
499
585
 
500
586
  //---------------------------------------------------------
@@ -504,100 +590,120 @@ class GetAttrsWorker : public Nan::AsyncWorker
504
590
  // Callback function: function(string error[, string value])
505
591
  //
506
592
  //---------------------------------------------------------
507
- class GetAttrValueWorker : public Nan::AsyncWorker
593
+ class GetAttrValueAsyncWorker : public Napi::AsyncWorker
508
594
  {
509
595
  public:
510
- GetAttrValueWorker(Nan::Callback* callback, K2HShm* pobj, const char* pkey, const char* pattr) : Nan::AsyncWorker(callback), pk2hobj(pobj), is_key_set(false), strkey(pkey ? pkey : ""), is_attr_set(false), strattr(pattr ? pattr : "")
596
+ GetAttrValueAsyncWorker(const Napi::Function& callback, K2HShm* pobj, const char* pkey, const char* pattr) :
597
+ Napi::AsyncWorker(callback), _callbackRef(Napi::Persistent(callback)), _k2hshm(pobj), _is_key_set(pkey != nullptr), _strkey(pkey ? pkey : ""), _is_attr_set(pattr != nullptr), _strattr(pattr ? pattr : ""), _attrval()
598
+ {
599
+ _callbackRef.Ref();
600
+ }
601
+
602
+ ~GetAttrValueAsyncWorker() override
511
603
  {
512
- is_key_set = (NULL != pkey);
513
- is_attr_set = (NULL != pattr);
604
+ if(_callbackRef){
605
+ _callbackRef.Unref();
606
+ _callbackRef.Reset();
607
+ }
514
608
  }
515
- ~GetAttrValueWorker() {}
516
609
 
517
- void Execute()
610
+ // Run on worker thread
611
+ void Execute() override
518
612
  {
519
- if(!pk2hobj){
520
- Nan::ReferenceError("No object is associated to async worker");
613
+ if(!_k2hshm){
614
+ SetError("No object is associated to async worker");
521
615
  return;
522
616
  }
523
- if(!is_key_set){
524
- Nan::ReferenceError("Specified key is empty(null)");
617
+ if(!_is_key_set){
618
+ SetError("Specified key is empty(null)");
525
619
  return;
526
620
  }
527
- if(!is_attr_set){
528
- Nan::ReferenceError("Specified attribute key is empty(null)");
621
+ if(!_is_attr_set){
622
+ SetError("Specified attribute key is empty(null)");
529
623
  return;
530
624
  }
531
625
 
532
626
  // get attributes
533
- K2HAttrs* attrs = pk2hobj->GetAttrs(strkey.c_str());
627
+ K2HAttrs* attrs = _k2hshm->GetAttrs(_strkey.c_str());
534
628
  if(attrs){
535
629
  bool is_found = false;
536
630
  for(K2HAttrs::iterator iter = attrs->begin(); iter != attrs->end(); ++iter){
537
631
  if(0UL == iter->keylength || !iter->pkey){
538
632
  continue;
539
633
  }
540
- if(iter->keylength != static_cast<size_t>(strattr.length() + 1)){
634
+ if(iter->keylength != static_cast<size_t>(_strattr.length() + 1)){
541
635
  continue;
542
636
  }
543
- if(0 == memcmp(iter->pkey, strattr.c_str(), iter->keylength)){
637
+ if(0 == memcmp(iter->pkey, _strattr.c_str(), iter->keylength)){
544
638
  // found
545
639
  if(0 < iter->vallength && iter->pval){
546
- attrval = std::string(reinterpret_cast<const char*>(iter->pval), iter->vallength);
640
+ _attrval.assign(reinterpret_cast<const char*>(iter->pval), iter->vallength);
547
641
  }else{
548
- this->SetErrorMessage("Failed to get attribute value because the attr does not have any value.");
642
+ SetError("Failed to get attribute value because the attr does not have any value.");
549
643
  }
550
- is_found = true;
644
+ is_found = true;
551
645
  break;
552
646
  }
553
647
  }
554
648
  delete attrs;
555
649
  if(!is_found){
556
- // not found
557
- this->SetErrorMessage("Failed to get attribute value because the attr does not have any value.");
650
+ SetError("Failed to get attribute value because the attr does not have any value.");
558
651
  }
559
652
  }else{
560
- // get error
561
- this->SetErrorMessage("Failed to get attribute value from key or key does not have attribute.");
653
+ SetError("Failed to get attribute value from key or key does not have attribute.");
562
654
  return;
563
655
  }
564
656
  }
565
657
 
566
- void HandleOKCallback()
658
+ // handler for success
659
+ void OnOK() override
567
660
  {
568
- Nan::HandleScope scope;
569
- const int argc = 2;
570
- v8::Local<v8::Value> argv[argc] = { Nan::Null(), Nan::New<v8::String>(attrval.c_str()).ToLocalChecked() };
661
+ Napi::Env env = Env();
662
+ Napi::HandleScope scope(env);
571
663
 
572
- if(callback){
573
- callback->Call(argc, argv);
664
+ if(!_callbackRef.IsEmpty()){
665
+ Napi::String jsVal = Napi::String::New(env, _attrval.c_str(), static_cast<size_t>(strlen(_attrval.c_str())));
666
+ _callbackRef.Value().Call({ env.Null(), jsVal });
574
667
  }else{
575
- Nan::ThrowSyntaxError("Internal error in async worker");
576
- return;
668
+ Napi::TypeError::New(env, "Internal error in async worker").ThrowAsJavaScriptException();
577
669
  }
578
670
  }
579
671
 
580
- void HandleErrorCallback()
581
- {
582
- Nan::HandleScope scope;
583
- const int argc = 1;
584
- v8::Local<v8::Value> argv[argc] = { Nan::New<v8::String>(this->ErrorMessage()).ToLocalChecked() };
672
+ // handler for failure (by calling SetError)
673
+ void OnError(const Napi::Error& err) override
674
+ {
675
+ Napi::Env env = Env();
676
+ Napi::HandleScope scope(env);
677
+
678
+ // Extract error message
679
+ std::string msg;
680
+ if(err.Value().IsObject()){
681
+ Napi::Object obj = err.Value().As<Napi::Object>();
682
+ Napi::Value mv = obj.Get("message");
683
+ if(mv.IsString()){
684
+ msg = mv.As<Napi::String>().Utf8Value();
685
+ }else{
686
+ msg = err.Message();
687
+ }
688
+ }else{
689
+ msg = err.Message();
690
+ }
585
691
 
586
- if(callback){
587
- callback->Call(argc, argv);
692
+ if(!_callbackRef.IsEmpty()){
693
+ _callbackRef.Value().Call({ Napi::String::New(env, msg) });
588
694
  }else{
589
- Nan::ThrowSyntaxError("Internal error in async worker");
590
- return;
695
+ err.ThrowAsJavaScriptException();
591
696
  }
592
- }
697
+ }
593
698
 
594
699
  private:
595
- K2HShm* pk2hobj;
596
- bool is_key_set;
597
- std::string strkey;
598
- bool is_attr_set;
599
- std::string strattr;
600
- std::string attrval;
700
+ Napi::FunctionReference _callbackRef;
701
+ K2HShm* _k2hshm;
702
+ bool _is_key_set;
703
+ std::string _strkey;
704
+ bool _is_attr_set;
705
+ std::string _strattr;
706
+ std::string _attrval;
601
707
  };
602
708
 
603
709
  //---------------------------------------------------------
@@ -607,84 +713,89 @@ class GetAttrValueWorker : public Nan::AsyncWorker
607
713
  // Callback function: function(string error)
608
714
  //
609
715
  //---------------------------------------------------------
610
- class SetValueWorker : public Nan::AsyncWorker
716
+ class SetValueAsyncWorker : public Napi::AsyncWorker
611
717
  {
612
718
  public:
613
- SetValueWorker(Nan::Callback* callback, K2HShm* pobj, const char* pkey, const char* psubkey, const char* pval, const char* ppass, const time_t* pexpire) :
614
- Nan::AsyncWorker(callback), pk2hobj(pobj),
615
- is_key_set(false), strkey(pkey ? pkey : ""), is_skey_set(false), strsubkey(psubkey ? psubkey : ""), is_val_set(false), strval(pval ? pval : ""), is_pass_set(false), strpass(ppass ? ppass : ""), expire(pexpire ? *pexpire : 0)
719
+ SetValueAsyncWorker(const Napi::Function& callback, K2HShm* pobj, const char* pkey, const char* psubkey, const char* pval, const char* ppass, const time_t* p_expire) :
720
+ Napi::AsyncWorker(callback), _callbackRef(Napi::Persistent(callback)), _k2hshm(pobj),
721
+ _is_key_set(pkey != nullptr), _strkey(pkey ? pkey : ""), _is_skey_set(psubkey != nullptr), _strsubkey(psubkey ? psubkey : ""), _is_val_set(pval != nullptr), _strval(pval ? pval : ""), _is_pass_set(ppass != nullptr), _strpass(ppass ? ppass : ""), _expire(p_expire ? *p_expire : 0)
616
722
  {
617
- is_key_set = (NULL != pkey);
618
- is_skey_set = (NULL != psubkey);
619
- is_val_set = (NULL != pval);
620
- is_pass_set = (NULL != ppass);
723
+ _callbackRef.Ref();
621
724
  }
622
- ~SetValueWorker() {}
623
725
 
624
- void Execute()
726
+ ~SetValueAsyncWorker() override
625
727
  {
626
- if(!pk2hobj){
627
- Nan::ReferenceError("No object is associated to async worker");
728
+ if(_callbackRef){
729
+ _callbackRef.Unref();
730
+ _callbackRef.Reset();
731
+ }
732
+ }
733
+
734
+ // Run on worker thread
735
+ void Execute() override
736
+ {
737
+ if(!_k2hshm){
738
+ SetError("No object is associated to async worker");
628
739
  return;
629
740
  }
630
- if(!is_key_set){
631
- Nan::ReferenceError("Specified key is empty(null)");
741
+ if(!_is_key_set){
742
+ SetError("Specified key is empty(null)");
632
743
  return;
633
744
  }
634
745
 
635
- bool result;
636
- if(is_skey_set){
746
+ bool result = false;
747
+ if(_is_skey_set){
637
748
  // subkey is specified
638
- result = pk2hobj->AddSubkey(strkey.c_str(), strsubkey.c_str(), (is_val_set ? strval.c_str() : NULL), (is_pass_set ? strpass.c_str() : NULL), (expire > 0 ? &expire : NULL));
749
+ result = _k2hshm->AddSubkey(_strkey.c_str(), _strsubkey.c_str(), (_is_val_set ? _strval.c_str() : NULL), (_is_pass_set ? _strpass.c_str() : NULL), (_expire > 0 ? &_expire : NULL));
639
750
  }else{
640
751
  // subkey is not specified
641
- result = pk2hobj->Set(strkey.c_str(), (is_val_set ? strval.c_str() : NULL), (is_pass_set ? strpass.c_str() : NULL), (expire > 0 ? &expire : NULL));
752
+ result = _k2hshm->Set(_strkey.c_str(), (_is_val_set ? _strval.c_str() : NULL), (_is_pass_set ? _strpass.c_str() : NULL), (_expire > 0 ? &_expire : NULL));
642
753
  }
643
754
  if(!result){
644
- // set error
645
- this->SetErrorMessage("Failed to set key/subkey and value.");
755
+ SetError("Failed to set key/subkey and value.");
756
+ return;
646
757
  }
647
758
  }
648
759
 
649
- void HandleOKCallback()
760
+ // handler for success
761
+ void OnOK() override
650
762
  {
651
- Nan::HandleScope scope;
652
- const int argc = 1;
653
- v8::Local<v8::Value> argv[argc] = { Nan::Null() };
763
+ Napi::Env env = Env();
764
+ Napi::HandleScope scope(env);
654
765
 
655
- if(callback){
656
- callback->Call(argc, argv);
766
+ if(!_callbackRef.IsEmpty()){
767
+ _callbackRef.Value().Call({ env.Null() });
657
768
  }else{
658
- Nan::ThrowSyntaxError("Internal error in async worker");
659
- return;
769
+ Napi::TypeError::New(env, "Internal error in async worker").ThrowAsJavaScriptException();
660
770
  }
661
771
  }
662
772
 
663
- void HandleErrorCallback()
664
- {
665
- Nan::HandleScope scope;
666
- const int argc = 1;
667
- v8::Local<v8::Value> argv[argc] = { Nan::New<v8::String>(this->ErrorMessage()).ToLocalChecked() };
773
+ // handler for failure (by calling SetError)
774
+ void OnError(const Napi::Error& err) override
775
+ {
776
+ Napi::Env env = Env();
777
+ Napi::HandleScope scope(env);
668
778
 
669
- if(callback){
670
- callback->Call(argc, argv);
779
+ std::string msg = err.Message();
780
+ if(!_callbackRef.IsEmpty()){
781
+ _callbackRef.Value().Call({ Napi::String::New(env, msg) });
671
782
  }else{
672
- Nan::ThrowSyntaxError("Internal error in async worker");
673
- return;
783
+ err.ThrowAsJavaScriptException();
674
784
  }
675
- }
785
+ }
676
786
 
677
787
  private:
678
- K2HShm* pk2hobj;
679
- bool is_key_set;
680
- std::string strkey;
681
- bool is_skey_set;
682
- std::string strsubkey;
683
- bool is_val_set;
684
- std::string strval;
685
- bool is_pass_set;
686
- std::string strpass;
687
- time_t expire;
788
+ Napi::FunctionReference _callbackRef;
789
+ K2HShm* _k2hshm;
790
+ bool _is_key_set;
791
+ std::string _strkey;
792
+ bool _is_skey_set;
793
+ std::string _strsubkey;
794
+ bool _is_val_set;
795
+ std::string _strval;
796
+ bool _is_pass_set;
797
+ std::string _strpass;
798
+ time_t _expire;
688
799
  };
689
800
 
690
801
  //---------------------------------------------------------
@@ -694,77 +805,82 @@ class SetValueWorker : public Nan::AsyncWorker
694
805
  // Callback function: function(string error)
695
806
  //
696
807
  //---------------------------------------------------------
697
- class AddSubkeyWorker : public Nan::AsyncWorker
808
+ class AddSubkeyAsyncWorker : public Napi::AsyncWorker
698
809
  {
699
810
  public:
700
- AddSubkeyWorker(Nan::Callback* callback, K2HShm* pobj, const char* pkey, const char* psubkey, const char* pval) :
701
- Nan::AsyncWorker(callback), pk2hobj(pobj),
702
- is_key_set(false), strkey(pkey ? pkey : ""), is_skey_set(false), strsubkey(psubkey ? psubkey : ""), is_val_set(false), strval(pval ? pval : "")
811
+ AddSubkeyAsyncWorker(const Napi::Function& callback, K2HShm* pobj, const char* pkey, const char* psubkey, const char* pval) :
812
+ Napi::AsyncWorker(callback), _callbackRef(Napi::Persistent(callback)), _k2hshm(pobj), _is_key_set(pkey != nullptr), _strkey(pkey ? pkey : ""), _is_skey_set(psubkey != nullptr), _strsubkey(psubkey ? psubkey : ""), _is_val_set(pval != nullptr), _strval(pval ? pval : "")
813
+ {
814
+ _callbackRef.Ref();
815
+ }
816
+
817
+ ~AddSubkeyAsyncWorker() override
703
818
  {
704
- is_key_set = (NULL != pkey);
705
- is_skey_set = (NULL != psubkey);
706
- is_val_set = (NULL != pval);
819
+ if(_callbackRef){
820
+ _callbackRef.Unref();
821
+ _callbackRef.Reset();
822
+ }
707
823
  }
708
- ~AddSubkeyWorker() {}
709
824
 
710
- void Execute()
825
+ // Run on worker thread
826
+ void Execute() override
711
827
  {
712
- if(!pk2hobj){
713
- Nan::ReferenceError("No object is associated to async worker");
828
+ if(!_k2hshm){
829
+ SetError("No object is associated to async worker");
714
830
  return;
715
831
  }
716
- if(!is_key_set){
717
- Nan::ReferenceError("Specified key is empty(null)");
832
+ if(!_is_key_set){
833
+ SetError("Specified key is empty(null)");
718
834
  return;
719
835
  }
720
- if(!is_skey_set){
721
- Nan::ReferenceError("Specified subkey is empty(null)");
836
+ if(!_is_skey_set){
837
+ SetError("Specified subkey is empty(null)");
722
838
  return;
723
839
  }
724
840
 
725
841
  // add subkey
726
- if(!pk2hobj->AddSubkey(strkey.c_str(), strsubkey.c_str(), (is_val_set ? strval.c_str() : NULL))){
727
- // set error
728
- this->SetErrorMessage("Failed to set subkey and value to key.");
842
+ if(!_k2hshm->AddSubkey(_strkey.c_str(), _strsubkey.c_str(), (_is_val_set ? _strval.c_str() : NULL))){
843
+ SetError("Failed to set subkey and value to key.");
844
+ return;
729
845
  }
730
846
  }
731
847
 
732
- void HandleOKCallback()
848
+ // handler for success
849
+ void OnOK() override
733
850
  {
734
- Nan::HandleScope scope;
735
- const int argc = 1;
736
- v8::Local<v8::Value> argv[argc] = { Nan::Null() };
851
+ Napi::Env env = Env();
852
+ Napi::HandleScope scope(env);
737
853
 
738
- if(callback){
739
- callback->Call(argc, argv);
854
+ if(!_callbackRef.IsEmpty()){
855
+ _callbackRef.Value().Call({ env.Null() });
740
856
  }else{
741
- Nan::ThrowSyntaxError("Internal error in async worker");
742
- return;
857
+ Napi::TypeError::New(env, "Internal error in async worker").ThrowAsJavaScriptException();
743
858
  }
744
859
  }
745
860
 
746
- void HandleErrorCallback()
747
- {
748
- Nan::HandleScope scope;
749
- const int argc = 1;
750
- v8::Local<v8::Value> argv[argc] = { Nan::New<v8::String>(this->ErrorMessage()).ToLocalChecked() };
861
+ // handler for failure (by calling SetError)
862
+ void OnError(const Napi::Error& err) override
863
+ {
864
+ Napi::Env env = Env();
865
+ Napi::HandleScope scope(env);
751
866
 
752
- if(callback){
753
- callback->Call(argc, argv);
867
+ std::string msg = err.Message();
868
+ if(!_callbackRef.IsEmpty()){
869
+ _callbackRef.Value().Call({ Napi::String::New(env, msg) });
754
870
  }else{
755
- Nan::ThrowSyntaxError("Internal error in async worker");
756
- return;
871
+ err.ThrowAsJavaScriptException();
757
872
  }
758
- }
873
+ }
759
874
 
760
875
  private:
761
- K2HShm* pk2hobj;
762
- bool is_key_set;
763
- std::string strkey;
764
- bool is_skey_set;
765
- std::string strsubkey;
766
- bool is_val_set;
767
- std::string strval;
876
+ Napi::FunctionReference _callbackRef;
877
+ K2HShm* _k2hshm;
878
+ bool _is_key_set;
879
+ std::string _strkey;
880
+ bool _is_skey_set;
881
+ std::string _strsubkey;
882
+ bool _is_val_set;
883
+ std::string _strval;
768
884
  };
769
885
 
770
886
  //---------------------------------------------------------
@@ -774,84 +890,91 @@ class AddSubkeyWorker : public Nan::AsyncWorker
774
890
  // Callback function: function(string error)
775
891
  //
776
892
  //---------------------------------------------------------
777
- class AddSubkeysWorker : public Nan::AsyncWorker
893
+ class AddSubkeysAsyncWorker : public Napi::AsyncWorker
778
894
  {
779
895
  public:
780
- AddSubkeysWorker(Nan::Callback* callback, K2HShm* pobj, const char* pkey, const unsigned char* psubkeys, size_t skey_length) : Nan::AsyncWorker(callback), pk2hobj(pobj), is_key_set(false), strkey(pkey ? pkey : ""), bySubkeys(NULL), skeylen(0), alloc_error(false)
896
+ AddSubkeysAsyncWorker(const Napi::Function& callback, K2HShm* pobj, const char* pkey, const unsigned char* psubkeys, size_t skey_length) :
897
+ Napi::AsyncWorker(callback), _callbackRef(Napi::Persistent(callback)), _k2hshm(pobj), _is_key_set(pkey != nullptr), _strkey(pkey ? pkey : ""), _bySubkeys(nullptr), _skeylen(0), _alloc_error(false)
781
898
  {
782
899
  if(psubkeys && 0UL < skey_length){
783
- if(NULL != (bySubkeys = reinterpret_cast<unsigned char*>(malloc(skey_length)))){
784
- memcpy(bySubkeys, psubkeys, skey_length);
785
- skeylen = skey_length;
900
+ if(nullptr != (_bySubkeys = reinterpret_cast<unsigned char*>(malloc(skey_length)))){
901
+ memcpy(_bySubkeys, psubkeys, skey_length);
902
+ _skeylen = skey_length;
786
903
  }else{
787
904
  // could not allocate memory.
788
- alloc_error = true;
905
+ _alloc_error = true;
789
906
  }
790
907
  }
791
- is_key_set = (NULL != pkey);
908
+ _callbackRef.Ref();
792
909
  }
793
- ~AddSubkeysWorker()
910
+
911
+ ~AddSubkeysAsyncWorker() override
794
912
  {
795
- K2H_Free(bySubkeys);
913
+ if(_callbackRef){
914
+ _callbackRef.Unref();
915
+ _callbackRef.Reset();
916
+ }
917
+ K2H_Free(_bySubkeys);
796
918
  }
797
919
 
798
- void Execute()
920
+ // Run on worker thread
921
+ void Execute() override
799
922
  {
800
- if(!pk2hobj){
801
- Nan::ReferenceError("No object is associated to async worker");
923
+ if(!_k2hshm){
924
+ SetError("No object is associated to async worker");
802
925
  return;
803
926
  }
804
- if(!is_key_set){
805
- Nan::ReferenceError("Specified key is empty(null)");
927
+ if(!_is_key_set){
928
+ SetError("Specified key is empty(null)");
806
929
  return;
807
930
  }
808
- if(alloc_error){
809
- Nan::ReferenceError("Could not allocate memory");
931
+ if(_alloc_error){
932
+ SetError("Could not allocate memory");
810
933
  return;
811
934
  }
812
935
 
813
936
  // add subkeys
814
- if(!pk2hobj->ReplaceSubkeys(reinterpret_cast<const unsigned char*>(strkey.c_str()), strkey.length() + 1, bySubkeys, skeylen)){
815
- // set error
816
- this->SetErrorMessage("Failed to replace subkeys to key.");
937
+ if(!_k2hshm->ReplaceSubkeys(reinterpret_cast<const unsigned char*>(_strkey.c_str()), _strkey.length() + 1, _bySubkeys, _skeylen)){
938
+ SetError("Failed to replace subkeys to key.");
939
+ return;
817
940
  }
818
941
  }
819
942
 
820
- void HandleOKCallback()
943
+ // handler for success
944
+ void OnOK() override
821
945
  {
822
- Nan::HandleScope scope;
823
- const int argc = 1;
824
- v8::Local<v8::Value> argv[argc] = { Nan::Null() };
946
+ Napi::Env env = Env();
947
+ Napi::HandleScope scope(env);
825
948
 
826
- if(callback){
827
- callback->Call(argc, argv);
949
+ if(!_callbackRef.IsEmpty()){
950
+ _callbackRef.Value().Call({ env.Null() });
828
951
  }else{
829
- Nan::ThrowSyntaxError("Internal error in async worker");
830
- return;
952
+ Napi::TypeError::New(env, "Internal error in async worker").ThrowAsJavaScriptException();
831
953
  }
832
954
  }
833
955
 
834
- void HandleErrorCallback()
835
- {
836
- Nan::HandleScope scope;
837
- const int argc = 1;
838
- v8::Local<v8::Value> argv[argc] = { Nan::New<v8::String>(this->ErrorMessage()).ToLocalChecked() };
956
+ // handler for failure (by calling SetError)
957
+ void OnError(const Napi::Error& err) override
958
+ {
959
+ Napi::Env env = Env();
960
+ Napi::HandleScope scope(env);
839
961
 
840
- if(callback){
841
- callback->Call(argc, argv);
962
+ std::string msg = err.Message();
963
+ if(!_callbackRef.IsEmpty()){
964
+ _callbackRef.Value().Call({ Napi::String::New(env, msg) });
842
965
  }else{
843
- Nan::ThrowSyntaxError("Internal error in async worker");
844
- return;
966
+ err.ThrowAsJavaScriptException();
845
967
  }
846
- }
968
+ }
847
969
 
848
970
  private:
849
- K2HShm* pk2hobj;
850
- bool is_key_set;
851
- std::string strkey;
852
- unsigned char* bySubkeys;
853
- size_t skeylen;
854
- bool alloc_error;
971
+ Napi::FunctionReference _callbackRef;
972
+ K2HShm* _k2hshm;
973
+ bool _is_key_set;
974
+ std::string _strkey;
975
+ unsigned char* _bySubkeys;
976
+ size_t _skeylen;
977
+ bool _alloc_error;
855
978
  };
856
979
 
857
980
  //---------------------------------------------------------
@@ -861,77 +984,95 @@ class AddSubkeysWorker : public Nan::AsyncWorker
861
984
  // Callback function: function(string error)
862
985
  //
863
986
  //---------------------------------------------------------
864
- class AddAttrWorker : public Nan::AsyncWorker
987
+ class AddAttrAsyncWorker : public Napi::AsyncWorker
865
988
  {
866
989
  public:
867
- AddAttrWorker(Nan::Callback* callback, K2HShm* pobj, const char* pkey, const char* pattrkey, const char* pattrval) :
868
- Nan::AsyncWorker(callback), pk2hobj(pobj),
869
- is_key_set(false), strkey(pkey ? pkey : ""), is_attr_set(false), strattr(pattrkey ? pattrkey : ""), is_val_set(false), strval(pattrval ? pattrval : "")
990
+ AddAttrAsyncWorker(const Napi::Function& callback, K2HShm* pobj, const char* pkey, const char* pattrkey, const char* pattrval) :
991
+ Napi::AsyncWorker(callback), _callbackRef(Napi::Persistent(callback)), _k2hshm(pobj), _is_key_set(pkey != nullptr), _strkey(pkey ? pkey : ""), _is_attr_set(pattrkey != nullptr), _strattr(pattrkey ? pattrkey : ""), _is_val_set(pattrval != nullptr), _strval(pattrval ? pattrval : "")
992
+ {
993
+ _callbackRef.Ref();
994
+ }
995
+
996
+ ~AddAttrAsyncWorker() override
870
997
  {
871
- is_key_set = (NULL != pkey);
872
- is_attr_set = (NULL != pattrkey);
873
- is_val_set = (NULL != pattrval);
998
+ if(_callbackRef){
999
+ _callbackRef.Unref();
1000
+ _callbackRef.Reset();
1001
+ }
874
1002
  }
875
- ~AddAttrWorker() {}
876
1003
 
877
- void Execute()
1004
+ // Run on worker thread
1005
+ void Execute() override
878
1006
  {
879
- if(!pk2hobj){
880
- Nan::ReferenceError("No object is associated to async worker");
1007
+ if(!_k2hshm){
1008
+ SetError("No object is associated to async worker");
881
1009
  return;
882
1010
  }
883
- if(!is_key_set){
884
- Nan::ReferenceError("Specified key is empty(null)");
1011
+ if(!_is_key_set){
1012
+ SetError("Specified key is empty(null)");
885
1013
  return;
886
1014
  }
887
- if(!is_attr_set){
888
- Nan::ReferenceError("Specified attribute name is empty(null)");
1015
+ if(!_is_attr_set){
1016
+ SetError("Specified attribute name is empty(null)");
889
1017
  return;
890
1018
  }
891
1019
 
892
1020
  // add attribute
893
- if(!pk2hobj->AddAttr(strkey.c_str(), strattr.c_str(), (is_val_set ? strval.c_str() : NULL))){
894
- // set error
895
- this->SetErrorMessage("Failed to set attribute and value to key.");
1021
+ if(!_k2hshm->AddAttr(_strkey.c_str(), _strattr.c_str(), (_is_val_set ? _strval.c_str() : NULL))){
1022
+ SetError("Failed to set attribute and value to key.");
1023
+ return;
896
1024
  }
897
1025
  }
898
1026
 
899
- void HandleOKCallback()
1027
+ // handler for success
1028
+ void OnOK() override
900
1029
  {
901
- Nan::HandleScope scope;
902
- const int argc = 1;
903
- v8::Local<v8::Value> argv[argc] = { Nan::Null() };
1030
+ Napi::Env env = Env();
1031
+ Napi::HandleScope scope(env);
904
1032
 
905
- if(callback){
906
- callback->Call(argc, argv);
1033
+ if(!_callbackRef.IsEmpty()){
1034
+ _callbackRef.Value().Call({ env.Null() });
907
1035
  }else{
908
- Nan::ThrowSyntaxError("Internal error in async worker");
909
- return;
1036
+ Napi::TypeError::New(env, "Internal error in async worker").ThrowAsJavaScriptException();
910
1037
  }
911
1038
  }
912
1039
 
913
- void HandleErrorCallback()
914
- {
915
- Nan::HandleScope scope;
916
- const int argc = 1;
917
- v8::Local<v8::Value> argv[argc] = { Nan::New<v8::String>(this->ErrorMessage()).ToLocalChecked() };
1040
+ // handler for failure (by calling SetError)
1041
+ void OnError(const Napi::Error& err) override
1042
+ {
1043
+ Napi::Env env = Env();
1044
+ Napi::HandleScope scope(env);
1045
+
1046
+ // Extract message
1047
+ std::string msg;
1048
+ if(err.Value().IsObject()){
1049
+ Napi::Object obj = err.Value().As<Napi::Object>();
1050
+ Napi::Value mv = obj.Get("message");
1051
+ if(mv.IsString()){
1052
+ msg = mv.As<Napi::String>().Utf8Value();
1053
+ }else{
1054
+ msg = err.Message();
1055
+ }
1056
+ }else{
1057
+ msg = err.Message();
1058
+ }
918
1059
 
919
- if(callback){
920
- callback->Call(argc, argv);
1060
+ if(!_callbackRef.IsEmpty()){
1061
+ _callbackRef.Value().Call({ Napi::String::New(env, msg) });
921
1062
  }else{
922
- Nan::ThrowSyntaxError("Internal error in async worker");
923
- return;
1063
+ err.ThrowAsJavaScriptException();
924
1064
  }
925
- }
1065
+ }
926
1066
 
927
1067
  private:
928
- K2HShm* pk2hobj;
929
- bool is_key_set;
930
- std::string strkey;
931
- bool is_attr_set;
932
- std::string strattr;
933
- bool is_val_set;
934
- std::string strval;
1068
+ Napi::FunctionReference _callbackRef;
1069
+ K2HShm* _k2hshm;
1070
+ bool _is_key_set;
1071
+ std::string _strkey;
1072
+ bool _is_attr_set;
1073
+ std::string _strattr;
1074
+ bool _is_val_set;
1075
+ std::string _strval;
935
1076
  };
936
1077
 
937
1078
  //---------------------------------------------------------
@@ -941,81 +1082,88 @@ class AddAttrWorker : public Nan::AsyncWorker
941
1082
  // Callback function: function(string error)
942
1083
  //
943
1084
  //---------------------------------------------------------
944
- class RemoveWorker : public Nan::AsyncWorker
1085
+ class RemoveAsyncWorker : public Napi::AsyncWorker
945
1086
  {
946
1087
  public:
947
- RemoveWorker(Nan::Callback* callback, K2HShm* pobj, const char* pkey, const char* psubkey, bool is_all) : Nan::AsyncWorker(callback), pk2hobj(pobj), is_key_set(false), strkey(pkey ? pkey : ""), is_skey_set(false), strsubkey(psubkey ? psubkey : ""), is_remove_all(is_all)
1088
+ RemoveAsyncWorker(const Napi::Function& callback, K2HShm* pobj, const char* pkey, const char* psubkey, bool is_all) :
1089
+ Napi::AsyncWorker(callback), _callbackRef(Napi::Persistent(callback)), _k2hshm(pobj), _is_key_set(pkey != nullptr), _strkey(pkey ? pkey : ""), _is_skey_set(psubkey != nullptr), _strsubkey(psubkey ? psubkey : ""), _is_remove_all(is_all)
948
1090
  {
949
- is_key_set = (NULL != pkey);
950
- if(is_remove_all){
951
- strsubkey.clear();
952
- }else{
953
- is_skey_set = (NULL != psubkey);
1091
+ if(_is_remove_all){
1092
+ _strsubkey.clear();
1093
+ _is_skey_set = false;
954
1094
  }
1095
+ _callbackRef.Ref();
955
1096
  }
956
- ~RemoveWorker() {}
957
1097
 
958
- void Execute()
1098
+ ~RemoveAsyncWorker() override
959
1099
  {
960
- if(!pk2hobj){
961
- Nan::ReferenceError("No object is associated to async worker");
1100
+ if(_callbackRef){
1101
+ _callbackRef.Unref();
1102
+ _callbackRef.Reset();
1103
+ }
1104
+ }
1105
+
1106
+ // Run on worker thread
1107
+ void Execute() override
1108
+ {
1109
+ if(!_k2hshm){
1110
+ SetError("No object is associated to async worker");
962
1111
  return;
963
1112
  }
964
- if(!is_key_set){
965
- Nan::ReferenceError("Specified key is empty(null)");
1113
+ if(!_is_key_set){
1114
+ SetError("Specified key is empty(null)");
966
1115
  return;
967
1116
  }
968
1117
 
969
- // remove
970
- bool result;
971
- if(is_remove_all){
972
- result = pk2hobj->Remove(strkey.c_str(), true);
973
- }else if(is_skey_set){
974
- result = pk2hobj->Remove(strkey.c_str(), strsubkey.c_str());
1118
+ bool result = false;
1119
+ if(_is_remove_all){
1120
+ result = _k2hshm->Remove(_strkey.c_str(), true);
1121
+ }else if(_is_skey_set){
1122
+ result = _k2hshm->Remove(_strkey.c_str(), _strsubkey.c_str());
975
1123
  }else{
976
- result = pk2hobj->Remove(strkey.c_str(), false);
1124
+ result = _k2hshm->Remove(_strkey.c_str(), false);
977
1125
  }
978
1126
  if(!result){
979
- // set error
980
- this->SetErrorMessage("Failed to remove key (and subkey).");
1127
+ SetError("Failed to remove key (and subkey).");
1128
+ return;
981
1129
  }
982
1130
  }
983
1131
 
984
- void HandleOKCallback()
1132
+ // handler for success
1133
+ void OnOK() override
985
1134
  {
986
- Nan::HandleScope scope;
987
- const int argc = 1;
988
- v8::Local<v8::Value> argv[argc] = { Nan::Null() };
1135
+ Napi::Env env = Env();
1136
+ Napi::HandleScope scope(env);
989
1137
 
990
- if(callback){
991
- callback->Call(argc, argv);
1138
+ if(!_callbackRef.IsEmpty()){
1139
+ _callbackRef.Value().Call({ env.Null() });
992
1140
  }else{
993
- Nan::ThrowSyntaxError("Internal error in async worker");
994
- return;
1141
+ Napi::TypeError::New(env, "Internal error in async worker").ThrowAsJavaScriptException();
995
1142
  }
996
1143
  }
997
1144
 
998
- void HandleErrorCallback()
999
- {
1000
- Nan::HandleScope scope;
1001
- const int argc = 1;
1002
- v8::Local<v8::Value> argv[argc] = { Nan::New<v8::String>(this->ErrorMessage()).ToLocalChecked() };
1145
+ // handler for failure (by calling SetError)
1146
+ void OnError(const Napi::Error& err) override
1147
+ {
1148
+ Napi::Env env = Env();
1149
+ Napi::HandleScope scope(env);
1003
1150
 
1004
- if(callback){
1005
- callback->Call(argc, argv);
1151
+ std::string msg = err.Message();
1152
+ if(!_callbackRef.IsEmpty()){
1153
+ _callbackRef.Value().Call({ Napi::String::New(env, msg) });
1006
1154
  }else{
1007
- Nan::ThrowSyntaxError("Internal error in async worker");
1008
- return;
1155
+ err.ThrowAsJavaScriptException();
1009
1156
  }
1010
- }
1157
+ }
1011
1158
 
1012
1159
  private:
1013
- K2HShm* pk2hobj;
1014
- bool is_key_set;
1015
- std::string strkey;
1016
- bool is_skey_set;
1017
- std::string strsubkey;
1018
- bool is_remove_all;
1160
+ Napi::FunctionReference _callbackRef;
1161
+ K2HShm* _k2hshm;
1162
+ bool _is_key_set;
1163
+ std::string _strkey;
1164
+ bool _is_skey_set;
1165
+ std::string _strsubkey;
1166
+ bool _is_remove_all;
1019
1167
  };
1020
1168
 
1021
1169
  //---------------------------------------------------------
@@ -1025,75 +1173,84 @@ class RemoveWorker : public Nan::AsyncWorker
1025
1173
  // Callback function: function(string error)
1026
1174
  //
1027
1175
  //---------------------------------------------------------
1028
- class ArchiveWorker : public Nan::AsyncWorker
1176
+ class ArchiveAsyncWorker : public Napi::AsyncWorker
1029
1177
  {
1030
1178
  public:
1031
- ArchiveWorker(Nan::Callback* callback, K2HShm* pobj, const char* file, bool is_error_skip, bool is_load) : Nan::AsyncWorker(callback), pk2hobj(pobj), is_file_set(false), strfile(file ? file : ""), errskip(is_error_skip), is_load_type(is_load)
1179
+ ArchiveAsyncWorker(const Napi::Function& callback, K2HShm* pobj, const char* file, bool is_error_skip, bool is_load) :
1180
+ Napi::AsyncWorker(callback), _callbackRef(Napi::Persistent(callback)), _k2hshm(pobj), _is_file_set(file != nullptr), _strfile(file ? file : ""), _errskip(is_error_skip), _is_load_type(is_load)
1181
+ {
1182
+ _callbackRef.Ref();
1183
+ }
1184
+
1185
+ ~ArchiveAsyncWorker() override
1032
1186
  {
1033
- is_file_set = (NULL != file);
1187
+ if(_callbackRef){
1188
+ _callbackRef.Unref();
1189
+ _callbackRef.Reset();
1190
+ }
1034
1191
  }
1035
- ~ArchiveWorker() {}
1036
1192
 
1037
- void Execute()
1193
+ // Run on worker thread
1194
+ void Execute() override
1038
1195
  {
1039
- if(!pk2hobj){
1040
- Nan::ReferenceError("No object is associated to async worker");
1196
+ if(!_k2hshm){
1197
+ SetError("No object is associated to async worker");
1041
1198
  return;
1042
1199
  }
1043
- if(!is_file_set){
1044
- Nan::ReferenceError("Specified file name is empty(null)");
1200
+ if(!_is_file_set){
1201
+ SetError("Specified file name is empty(null)");
1045
1202
  return;
1046
1203
  }
1047
1204
 
1048
- if(is_load_type){
1205
+ if(_is_load_type){
1049
1206
  // load archive
1050
- if(!k2h_load_archive(reinterpret_cast<k2h_h>(pk2hobj), strfile.c_str(), errskip)){
1051
- // set error
1052
- this->SetErrorMessage("Failed to load archive file.");
1207
+ if(!k2h_load_archive(reinterpret_cast<k2h_h>(_k2hshm), _strfile.c_str(), _errskip)){
1208
+ SetError("Failed to load archive file.");
1209
+ return;
1053
1210
  }
1054
1211
  }else{
1055
1212
  // put archive
1056
- if(!k2h_put_archive(reinterpret_cast<k2h_h>(pk2hobj), strfile.c_str(), errskip)){
1057
- // set error
1058
- this->SetErrorMessage("Failed to put archive file.");
1213
+ if(!k2h_put_archive(reinterpret_cast<k2h_h>(_k2hshm), _strfile.c_str(), _errskip)){
1214
+ SetError("Failed to put archive file.");
1215
+ return;
1059
1216
  }
1060
1217
  }
1061
1218
  }
1062
1219
 
1063
- void HandleOKCallback()
1220
+ // handler for success
1221
+ void OnOK() override
1064
1222
  {
1065
- Nan::HandleScope scope;
1066
- const int argc = 1;
1067
- v8::Local<v8::Value> argv[argc] = { Nan::Null() };
1223
+ Napi::Env env = Env();
1224
+ Napi::HandleScope scope(env);
1068
1225
 
1069
- if(callback){
1070
- callback->Call(argc, argv);
1226
+ if(!_callbackRef.IsEmpty()){
1227
+ _callbackRef.Value().Call({ env.Null() });
1071
1228
  }else{
1072
- Nan::ThrowSyntaxError("Internal error in async worker");
1073
- return;
1229
+ Napi::TypeError::New(env, "Internal error in async worker").ThrowAsJavaScriptException();
1074
1230
  }
1075
1231
  }
1076
1232
 
1077
- void HandleErrorCallback()
1078
- {
1079
- Nan::HandleScope scope;
1080
- const int argc = 1;
1081
- v8::Local<v8::Value> argv[argc] = { Nan::New<v8::String>(this->ErrorMessage()).ToLocalChecked() };
1233
+ // handler for failure (by calling SetError)
1234
+ void OnError(const Napi::Error& err) override
1235
+ {
1236
+ Napi::Env env = Env();
1237
+ Napi::HandleScope scope(env);
1082
1238
 
1083
- if(callback){
1084
- callback->Call(argc, argv);
1239
+ std::string msg = err.Message();
1240
+ if(!_callbackRef.IsEmpty()){
1241
+ _callbackRef.Value().Call({ Napi::String::New(env, msg) });
1085
1242
  }else{
1086
- Nan::ThrowSyntaxError("Internal error in async worker");
1087
- return;
1243
+ err.ThrowAsJavaScriptException();
1088
1244
  }
1089
- }
1245
+ }
1090
1246
 
1091
1247
  private:
1092
- K2HShm* pk2hobj;
1093
- bool is_file_set;
1094
- std::string strfile;
1095
- bool errskip;
1096
- bool is_load_type;
1248
+ Napi::FunctionReference _callbackRef;
1249
+ K2HShm* _k2hshm;
1250
+ bool _is_file_set;
1251
+ std::string _strfile;
1252
+ bool _errskip;
1253
+ bool _is_load_type;
1097
1254
  };
1098
1255
 
1099
1256
  #endif