@nxtedition/rocksdb 10.0.15 → 10.0.16

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.
package/binding.cc CHANGED
@@ -512,17 +512,17 @@ NAPI_METHOD(db_init) {
512
512
  NAPI_STATUS_THROWS(napi_get_value_string_utf8(env, argv[0], &location[0], length + 1, &length));
513
513
 
514
514
  database = new Database(location);
515
- napi_add_env_cleanup_hook(env, env_cleanup_hook, database);
516
- NAPI_STATUS_THROWS(napi_create_external(env, database, FinalizeDatabase, nullptr, &result));
515
+ napi_add_env_cleanup_hook(env, env_cleanup_hook, database);
516
+ NAPI_STATUS_THROWS(napi_create_external(env, database, FinalizeDatabase, nullptr, &result));
517
517
  } else if (type == napi_bigint) {
518
518
  int64_t value;
519
519
  bool lossless;
520
520
  NAPI_STATUS_THROWS(napi_get_value_bigint_int64(env, argv[0], &value, &lossless));
521
521
 
522
522
  database = reinterpret_cast<Database*>(value);
523
- NAPI_STATUS_THROWS(napi_create_external(env, database, nullptr, nullptr, &result));
523
+ NAPI_STATUS_THROWS(napi_create_external(env, database, nullptr, nullptr, &result));
524
524
 
525
- // We should have an env_cleanup_hook for closing iterators...
525
+ // We should have an env_cleanup_hook for closing iterators...
526
526
  } else {
527
527
  NAPI_STATUS_THROWS(napi_invalid_arg);
528
528
  }
@@ -966,6 +966,7 @@ NAPI_METHOD(db_get_many) {
966
966
  Database* database;
967
967
  NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], reinterpret_cast<void**>(&database)));
968
968
 
969
+ // TODO (fix): Ensure lifetime of buffer?
969
970
  std::vector<rocksdb::Slice> keys;
970
971
  {
971
972
  uint32_t length;
@@ -975,12 +976,7 @@ NAPI_METHOD(db_get_many) {
975
976
  for (uint32_t n = 0; n < length; n++) {
976
977
  napi_value element;
977
978
  NAPI_STATUS_THROWS(napi_get_element(env, argv[1], n, &element));
978
-
979
- char* buf = nullptr;
980
- size_t length = 0;
981
- NAPI_STATUS_THROWS(napi_get_buffer_info(env, element, reinterpret_cast<void**>(&buf), &length));
982
-
983
- keys[n] = { buf, length };
979
+ NAPI_STATUS_THROWS(GetValue(env, element, keys[n]));
984
980
  }
985
981
  }
986
982
 
@@ -1037,8 +1033,8 @@ NAPI_METHOD(db_get_many) {
1037
1033
  for (size_t idx = 0; idx < values.size(); idx++) {
1038
1034
  napi_value element;
1039
1035
  if (values[idx].GetSelf()) {
1040
- auto ptr = new rocksdb::PinnableSlice(std::move(values[idx]));
1041
- NAPI_STATUS_RETURN(napi_create_external_buffer(env, ptr->size(), const_cast<char*>(ptr->data()), Finalize<rocksdb::PinnableSlice>, ptr, &element));
1036
+ auto ptr = new rocksdb::PinnableSlice(std::move(values[idx]));
1037
+ NAPI_STATUS_RETURN(napi_create_external_buffer(env, ptr->size(), const_cast<char*>(ptr->data()), Finalize<rocksdb::PinnableSlice>, ptr, &element));
1042
1038
  } else {
1043
1039
  NAPI_STATUS_RETURN(napi_get_undefined(env, &element));
1044
1040
  }
@@ -1160,7 +1156,7 @@ NAPI_METHOD(db_get_property) {
1160
1156
  Database* database;
1161
1157
  NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], reinterpret_cast<void**>(&database)));
1162
1158
 
1163
- NapiSlice property;
1159
+ rocksdb::PinnableSlice property;
1164
1160
  NAPI_STATUS_THROWS(GetValue(env, argv[1], property));
1165
1161
 
1166
1162
  std::string value;
@@ -1259,7 +1255,7 @@ NAPI_METHOD(iterator_seek) {
1259
1255
  Iterator* iterator;
1260
1256
  NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], reinterpret_cast<void**>(&iterator)));
1261
1257
 
1262
- NapiSlice target;
1258
+ rocksdb::PinnableSlice target;
1263
1259
  NAPI_STATUS_THROWS(GetValue(env, argv[1], target));
1264
1260
 
1265
1261
  iterator->first_ = true;
@@ -1306,7 +1302,7 @@ NAPI_METHOD(iterator_nextv) {
1306
1302
  auto callback = argv[2];
1307
1303
 
1308
1304
  struct State {
1309
- std::vector<std::optional<std::string>> cache;
1305
+ std::vector<rocksdb::PinnableSlice> cache;
1310
1306
  bool finished = false;
1311
1307
  };
1312
1308
 
@@ -1329,24 +1325,22 @@ NAPI_METHOD(iterator_nextv) {
1329
1325
  if (!iterator->Valid() || !iterator->Increment())
1330
1326
  break;
1331
1327
 
1328
+ auto k = rocksdb::PinnableSlice();
1329
+ auto v = rocksdb::PinnableSlice();
1330
+
1332
1331
  if (iterator->keys_ && iterator->values_) {
1333
- auto k = iterator->CurrentKey();
1334
- auto v = iterator->CurrentValue();
1335
- bytesRead += k.size() + v.size();
1336
- state.cache.push_back(k.ToString());
1337
- state.cache.push_back(v.ToString());
1332
+ k.PinSelf(iterator->CurrentKey());
1333
+ v.PinSelf(iterator->CurrentValue());
1338
1334
  } else if (iterator->keys_) {
1339
- auto k = iterator->CurrentKey();
1340
- bytesRead += k.size();
1341
- state.cache.push_back(k.ToString());
1342
- state.cache.push_back(std::nullopt);
1335
+ k.PinSelf(iterator->CurrentKey());
1343
1336
  } else if (iterator->values_) {
1344
- auto v = iterator->CurrentValue();
1345
- bytesRead += v.size();
1346
- state.cache.push_back(std::nullopt);
1347
- state.cache.push_back(v.ToString());
1337
+ v.PinSelf(iterator->CurrentValue());
1348
1338
  }
1349
1339
 
1340
+ bytesRead += k.size() + v.size();
1341
+ state.cache.push_back(std::move(k));
1342
+ state.cache.push_back(std::move(v));
1343
+
1350
1344
  if (bytesRead > iterator->highWaterMarkBytes_ || state.cache.size() / 2 >= size) {
1351
1345
  state.finished = false;
1352
1346
  return rocksdb::Status::OK();
@@ -1366,8 +1360,8 @@ NAPI_METHOD(iterator_nextv) {
1366
1360
  napi_value key;
1367
1361
  napi_value val;
1368
1362
 
1369
- NAPI_STATUS_RETURN(Convert(env, state.cache[n + 0], iterator->keyEncoding_, key));
1370
- NAPI_STATUS_RETURN(Convert(env, state.cache[n + 1], iterator->valueEncoding_, val));
1363
+ NAPI_STATUS_RETURN(Convert(env, &state.cache[n + 0], iterator->keyEncoding_, key));
1364
+ NAPI_STATUS_RETURN(Convert(env, &state.cache[n + 1], iterator->valueEncoding_, val));
1371
1365
 
1372
1366
  NAPI_STATUS_RETURN(napi_set_element(env, argv[1], static_cast<int>(n + 0), key));
1373
1367
  NAPI_STATUS_RETURN(napi_set_element(env, argv[1], static_cast<int>(n + 1), val));
@@ -1400,9 +1394,9 @@ NAPI_METHOD(batch_do) {
1400
1394
  NAPI_STATUS_THROWS(napi_get_array_length(env, elements, &length));
1401
1395
 
1402
1396
  for (uint32_t i = 0; i < length; i++) {
1403
- NapiSlice type;
1404
- NapiSlice key;
1405
- NapiSlice value;
1397
+ rocksdb::PinnableSlice type;
1398
+ rocksdb::PinnableSlice key;
1399
+ rocksdb::PinnableSlice value;
1406
1400
 
1407
1401
  napi_value element;
1408
1402
  NAPI_STATUS_THROWS(napi_get_element(env, elements, i, &element));
@@ -1466,10 +1460,10 @@ NAPI_METHOD(batch_put) {
1466
1460
  rocksdb::WriteBatch* batch;
1467
1461
  NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], reinterpret_cast<void**>(&batch)));
1468
1462
 
1469
- NapiSlice key;
1463
+ rocksdb::Slice key;
1470
1464
  NAPI_STATUS_THROWS(GetValue(env, argv[1], key));
1471
1465
 
1472
- NapiSlice val;
1466
+ rocksdb::Slice val;
1473
1467
  NAPI_STATUS_THROWS(GetValue(env, argv[2], val));
1474
1468
 
1475
1469
  const auto options = argv[3];
@@ -1492,7 +1486,7 @@ NAPI_METHOD(batch_del) {
1492
1486
  rocksdb::WriteBatch* batch;
1493
1487
  NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], reinterpret_cast<void**>(&batch)));
1494
1488
 
1495
- NapiSlice key;
1489
+ rocksdb::Slice key;
1496
1490
  NAPI_STATUS_THROWS(GetValue(env, argv[1], key));
1497
1491
 
1498
1492
  const auto options = argv[2];
@@ -1515,10 +1509,10 @@ NAPI_METHOD(batch_merge) {
1515
1509
  rocksdb::WriteBatch* batch;
1516
1510
  NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], reinterpret_cast<void**>(&batch)));
1517
1511
 
1518
- NapiSlice key;
1512
+ rocksdb::Slice key;
1519
1513
  NAPI_STATUS_THROWS(GetValue(env, argv[1], key));
1520
1514
 
1521
- NapiSlice val;
1515
+ rocksdb::Slice val;
1522
1516
  NAPI_STATUS_THROWS(GetValue(env, argv[2], val));
1523
1517
 
1524
1518
  const auto options = argv[3];
@@ -1549,7 +1543,7 @@ NAPI_METHOD(batch_clear) {
1549
1543
  NAPI_METHOD(batch_write) {
1550
1544
  NAPI_ARGV(4);
1551
1545
 
1552
- napi_value result = 0;
1546
+ napi_value result = 0;
1553
1547
 
1554
1548
  Database* database;
1555
1549
  NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], reinterpret_cast<void**>(&database)));
@@ -1566,51 +1560,37 @@ NAPI_METHOD(batch_write) {
1566
1560
  bool lowPriority = false;
1567
1561
  NAPI_STATUS_THROWS(GetProperty(env, options, "lowPriority", lowPriority));
1568
1562
 
1569
- rocksdb::WriteOptions writeOptions;
1570
- writeOptions.sync = sync;
1571
- writeOptions.low_pri = lowPriority;
1572
- writeOptions.no_slowdown = true;
1573
-
1574
- const auto status = database->db->Write(writeOptions, batch);
1575
-
1576
- if (status == rocksdb::Status::Incomplete()) {
1577
- napi_ref batchRef;
1578
- NAPI_STATUS_THROWS(napi_create_reference(env, argv[1], 1, &batchRef));
1579
-
1580
- runAsync<int64_t>(
1581
- "leveldown.batch.write", env, callback,
1582
- [=](int64_t& seq) {
1583
- rocksdb::WriteOptions writeOptions;
1584
- writeOptions.sync = sync;
1585
- writeOptions.low_pri = lowPriority;
1586
- return database->db->Write(writeOptions, batch);
1587
- },
1588
- [=](int64_t& seq, auto env, auto& argv) {
1589
- NAPI_STATUS_RETURN(napi_delete_reference(env, batchRef));
1590
- return napi_ok;
1591
- });
1592
-
1593
- NAPI_STATUS_THROWS(napi_get_boolean(env, false, &result));
1594
- } else {
1595
- ROCKS_STATUS_THROWS_NAPI(status);
1596
- NAPI_STATUS_THROWS(napi_get_boolean(env, true, &result));
1597
- }
1563
+ rocksdb::WriteOptions writeOptions;
1564
+ writeOptions.sync = sync;
1565
+ writeOptions.low_pri = lowPriority;
1566
+ writeOptions.no_slowdown = true;
1598
1567
 
1599
- return result;
1600
- }
1568
+ const auto status = database->db->Write(writeOptions, batch);
1601
1569
 
1602
- NAPI_METHOD(batch_put_log_data) {
1603
- NAPI_ARGV(3);
1570
+ if (status == rocksdb::Status::Incomplete()) {
1571
+ napi_ref batchRef;
1572
+ NAPI_STATUS_THROWS(napi_create_reference(env, argv[1], 1, &batchRef));
1604
1573
 
1605
- rocksdb::WriteBatch* batch;
1606
- NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], reinterpret_cast<void**>(&batch)));
1607
-
1608
- NapiSlice logData;
1609
- NAPI_STATUS_THROWS(GetValue(env, argv[1], logData));
1574
+ runAsync<int64_t>(
1575
+ "leveldown.batch.write", env, callback,
1576
+ [=](int64_t& seq) {
1577
+ rocksdb::WriteOptions writeOptions;
1578
+ writeOptions.sync = sync;
1579
+ writeOptions.low_pri = lowPriority;
1580
+ return database->db->Write(writeOptions, batch);
1581
+ },
1582
+ [=](int64_t& seq, auto env, auto& argv) {
1583
+ NAPI_STATUS_RETURN(napi_delete_reference(env, batchRef));
1584
+ return napi_ok;
1585
+ });
1610
1586
 
1611
- ROCKS_STATUS_THROWS_NAPI(batch->PutLogData(logData));
1587
+ NAPI_STATUS_THROWS(napi_get_boolean(env, false, &result));
1588
+ } else {
1589
+ ROCKS_STATUS_THROWS_NAPI(status);
1590
+ NAPI_STATUS_THROWS(napi_get_boolean(env, true, &result));
1591
+ }
1612
1592
 
1613
- return 0;
1593
+ return result;
1614
1594
  }
1615
1595
 
1616
1596
  NAPI_METHOD(batch_count) {
@@ -1687,7 +1667,6 @@ NAPI_INIT() {
1687
1667
  NAPI_EXPORT_FUNCTION(batch_del);
1688
1668
  NAPI_EXPORT_FUNCTION(batch_clear);
1689
1669
  NAPI_EXPORT_FUNCTION(batch_write);
1690
- NAPI_EXPORT_FUNCTION(batch_put_log_data);
1691
1670
  NAPI_EXPORT_FUNCTION(batch_merge);
1692
1671
  NAPI_EXPORT_FUNCTION(batch_count);
1693
1672
  NAPI_EXPORT_FUNCTION(batch_iterate);
package/chained-batch.js CHANGED
@@ -34,6 +34,9 @@ class ChainedBatch extends AbstractChainedBatch {
34
34
  })
35
35
  }
36
36
 
37
+ key = typeof key === 'string' ? Buffer.from(key) : key
38
+ value = typeof value === 'string' ? Buffer.from(value) : value
39
+
37
40
  binding.batch_put(this[kBatchContext], key, value, options ?? EMPTY)
38
41
  }
39
42
 
@@ -44,6 +47,8 @@ class ChainedBatch extends AbstractChainedBatch {
44
47
  })
45
48
  }
46
49
 
50
+ key = typeof key === 'string' ? Buffer.from(key) : key
51
+
47
52
  binding.batch_del(this[kBatchContext], key, options ?? EMPTY)
48
53
  }
49
54
 
@@ -67,16 +72,6 @@ class ChainedBatch extends AbstractChainedBatch {
67
72
  return binding.batch_count(this[kBatchContext])
68
73
  }
69
74
 
70
- _putLogData (value, options) {
71
- if (value === null || value === undefined) {
72
- throw new ModuleError('value cannot be null or undefined', {
73
- code: 'LEVEL_INVALID_VALUE'
74
- })
75
- }
76
-
77
- binding.batch_put_log_data(this[kBatchContext], value, options ?? EMPTY)
78
- }
79
-
80
75
  _merge (key, value, options) {
81
76
  if (key === null || key === undefined) {
82
77
  throw new ModuleError('Key cannot be null or undefined', {
@@ -90,6 +85,9 @@ class ChainedBatch extends AbstractChainedBatch {
90
85
  })
91
86
  }
92
87
 
88
+ key = typeof key === 'string' ? Buffer.from(key) : key
89
+ value = typeof value === 'string' ? Buffer.from(value) : value
90
+
93
91
  binding.batch_merge(this[kBatchContext], key, value, options ?? EMPTY)
94
92
  }
95
93
 
package/index.js CHANGED
@@ -148,15 +148,17 @@ class RocksLevel extends AbstractLevel {
148
148
  _getMany (keys, options, callback) {
149
149
  callback = fromCallback(callback, kPromise)
150
150
 
151
- if (options?.keysEncoding !== 'buffer') {
151
+ const { keysEncoding, valueEncoding } = options ?? EMPTY
152
+
153
+ if (keysEncoding !== 'buffer') {
152
154
  keys = keys.map(key => Buffer.from(key))
153
155
  }
154
156
 
155
157
  try {
156
158
  this[kRef]()
157
159
  binding.db_get_many(this[kContext], keys, options ?? EMPTY, (err, val) => {
158
- if (options?.valueEncoding !== 'buffer') {
159
- val = val.map(v => v != null ? v.toString(options?.valueEncoding) : v)
160
+ if (valueEncoding !== 'buffer') {
161
+ val = val.map(v => v != null ? v.toString(valueEncoding) : v)
160
162
  }
161
163
  callback(err, val, keys)
162
164
  this[kUnref]()
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nxtedition/rocksdb",
3
- "version": "10.0.15",
3
+ "version": "10.0.16",
4
4
  "description": "A low-level Node.js RocksDB binding",
5
5
  "license": "MIT",
6
6
  "main": "index.js",
package/util.h CHANGED
@@ -91,6 +91,22 @@ static napi_value ToError(napi_env env, const rocksdb::Status& status) {
91
91
  return CreateError(env, {}, msg);
92
92
  }
93
93
 
94
+ static napi_status GetString(napi_env env, napi_value from, rocksdb::Slice& to) {
95
+ bool isBuffer;
96
+ NAPI_STATUS_RETURN(napi_is_buffer(env, from, &isBuffer));
97
+
98
+ if (isBuffer) {
99
+ char* buf = nullptr;
100
+ size_t length = 0;
101
+ NAPI_STATUS_RETURN(napi_get_buffer_info(env, from, reinterpret_cast<void**>(&buf), &length));
102
+ to = {buf, length};
103
+ } else {
104
+ return napi_invalid_arg;
105
+ }
106
+
107
+ return napi_ok;
108
+ }
109
+
94
110
  static napi_status GetString(napi_env env, napi_value from, std::string& to) {
95
111
  napi_valuetype type;
96
112
  NAPI_STATUS_RETURN(napi_typeof(env, from, &type));
@@ -117,60 +133,12 @@ static napi_status GetString(napi_env env, napi_value from, std::string& to) {
117
133
  return napi_ok;
118
134
  }
119
135
 
120
- class NapiSlice : public rocksdb::Slice {
121
- public:
122
- NapiSlice() {}
123
-
124
- NapiSlice(NapiSlice&& other) = delete;
125
- NapiSlice& operator=(NapiSlice&& other) = delete;
126
-
127
- NapiSlice(NapiSlice&) = delete;
128
- NapiSlice& operator=(NapiSlice&) = delete;
129
-
130
- std::array<char, 128> stack_;
131
- std::unique_ptr<char[]> heap_;
132
- size_t heap_size_ = 0;
133
- };
134
-
135
- static napi_status GetString(napi_env env, napi_value from, NapiSlice& to) {
136
+ static napi_status GetString(napi_env env, napi_value from, rocksdb::PinnableSlice& to) {
136
137
  napi_valuetype type;
137
138
  NAPI_STATUS_RETURN(napi_typeof(env, from, &type));
138
139
 
139
- if (type == napi_string) {
140
- size_t length = 0;
141
- NAPI_STATUS_RETURN(napi_get_value_string_utf8(env, from, nullptr, 0, &length));
142
-
143
- char* data;
144
- if (length + 1 > to.stack_.size()) {
145
- if (to.heap_size_ < length + 1) {
146
- to.heap_size_ = length + 1;
147
- to.heap_.reset(new char[to.heap_size_]);
148
- }
149
- data = to.heap_.get();
150
- } else {
151
- data = to.stack_.data();
152
- }
153
- data[length] = 0;
154
-
155
- NAPI_STATUS_RETURN(napi_get_value_string_utf8(env, from, data, length + 1, &length));
156
-
157
- to.data_ = data;
158
- to.size_ = length;
159
- } else {
160
- bool isBuffer;
161
- NAPI_STATUS_RETURN(napi_is_buffer(env, from, &isBuffer));
162
-
163
- if (isBuffer) {
164
- char* buf = nullptr;
165
- size_t length = 0;
166
- NAPI_STATUS_RETURN(napi_get_buffer_info(env, from, reinterpret_cast<void**>(&buf), &length));
167
-
168
- to.data_ = buf;
169
- to.size_ = length;
170
- } else {
171
- return napi_invalid_arg;
172
- }
173
- }
140
+ NAPI_STATUS_RETURN(GetString(env, from, *to.GetSelf()));
141
+ to.PinSelf();
174
142
 
175
143
  return napi_ok;
176
144
  }
@@ -204,7 +172,11 @@ static napi_status GetValue(napi_env env, napi_value value, std::string& result)
204
172
  return GetString(env, value, result);
205
173
  }
206
174
 
207
- static napi_status GetValue(napi_env env, napi_value value, NapiSlice& result) {
175
+ static napi_status GetValue(napi_env env, napi_value value, rocksdb::PinnableSlice& result) {
176
+ return GetString(env, value, result);
177
+ }
178
+
179
+ static napi_status GetValue(napi_env env, napi_value value, rocksdb::Slice& result) {
208
180
  return GetString(env, value, result);
209
181
  }
210
182
 
@@ -270,11 +242,12 @@ static napi_status GetProperty(napi_env env,
270
242
 
271
243
  template <typename T>
272
244
  napi_status Convert(napi_env env, rocksdb::PinnableSlice* s, Encoding encoding, napi_value& result) {
273
- if (!s) {
245
+ if (!s || !s->IsPinned()) {
274
246
  return napi_get_null(env, &result);
275
247
  } else if (encoding == Encoding::Buffer) {
276
- auto ptr = new rocksdb::PinnableSlice(std::move(*s));
277
- return napi_create_external_buffer(env, ptr->size(), const_cast<char*>(ptr->data()), Finalize<rocksdb::PinnableSlice>, ptr, &result);
248
+ auto ptr = new rocksdb::PinnableSlice(std::move(*s));
249
+ return napi_create_external_buffer(env, ptr->size(), const_cast<char*>(ptr->data()),
250
+ Finalize<rocksdb::PinnableSlice>, ptr, &result);
278
251
  } else if (encoding == Encoding::String) {
279
252
  return napi_create_string_utf8(env, s->data(), s->size(), &result);
280
253
  } else {
@@ -287,8 +260,6 @@ napi_status Convert(napi_env env, T&& s, Encoding encoding, napi_value& result)
287
260
  if (!s) {
288
261
  return napi_get_null(env, &result);
289
262
  } else if (encoding == Encoding::Buffer) {
290
- // napi_create_external_buffer would be nice but is unsafe since node
291
- // buffers are not read-only.
292
263
  return napi_create_buffer_copy(env, s->size(), s->data(), nullptr, &result);
293
264
  } else if (encoding == Encoding::String) {
294
265
  return napi_create_string_utf8(env, s->data(), s->size(), &result);
@@ -298,7 +269,12 @@ napi_status Convert(napi_env env, T&& s, Encoding encoding, napi_value& result)
298
269
  }
299
270
 
300
271
  template <typename State, typename T1, typename T2>
301
- napi_status runAsync(State&& state, const std::string& name, napi_env env, napi_value callback, T1&& execute, T2&& then) {
272
+ napi_status runAsync(State&& state,
273
+ const std::string& name,
274
+ napi_env env,
275
+ napi_value callback,
276
+ T1&& execute,
277
+ T2&& then) {
302
278
  struct Worker final {
303
279
  static void Execute(napi_env env, void* data) {
304
280
  auto worker = reinterpret_cast<Worker*>(data);
@@ -355,17 +331,13 @@ napi_status runAsync(State&& state, const std::string& name, napi_env env, napi_
355
331
 
356
332
  State state;
357
333
 
358
- napi_ref callbackRef = nullptr;
334
+ napi_ref callbackRef = nullptr;
359
335
  napi_async_work asyncWork = nullptr;
360
336
  rocksdb::Status status = rocksdb::Status::OK();
361
337
  };
362
338
 
363
- auto worker = std::unique_ptr<Worker>(new Worker{
364
- env,
365
- std::forward<T1>(execute),
366
- std::forward<T2>(then),
367
- std::move(state)
368
- });
339
+ auto worker =
340
+ std::unique_ptr<Worker>(new Worker{env, std::forward<T1>(execute), std::forward<T2>(then), std::move(state)});
369
341
 
370
342
  NAPI_STATUS_RETURN(napi_create_reference(env, callback, 1, &worker->callbackRef));
371
343
  napi_value asyncResourceName;
@@ -381,5 +353,5 @@ napi_status runAsync(State&& state, const std::string& name, napi_env env, napi_
381
353
  }
382
354
  template <typename State, typename T1, typename T2>
383
355
  napi_status runAsync(const std::string& name, napi_env env, napi_value callback, T1&& execute, T2&& then) {
384
- return runAsync<State>(State{}, name, env, callback, std::forward<T1>(execute), std::forward<T2>(then));
356
+ return runAsync<State>(State{}, name, env, callback, std::forward<T1>(execute), std::forward<T2>(then));
385
357
  }