couchbase 4.2.5-dev.3 → 4.2.6-dev

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.
Files changed (122) hide show
  1. package/README.md +81 -9
  2. package/deps/couchbase-cxx-client/CMakeLists.txt +9 -1
  3. package/deps/couchbase-cxx-client/bin/api.rb +234 -0
  4. package/deps/couchbase-cxx-client/bin/create-search-index +18 -135
  5. package/deps/couchbase-cxx-client/bin/init-cluster +17 -139
  6. package/deps/couchbase-cxx-client/bin/load-sample-buckets +54 -0
  7. package/deps/couchbase-cxx-client/core/cluster.hxx +33 -12
  8. package/deps/couchbase-cxx-client/core/cluster_options.hxx +3 -0
  9. package/deps/couchbase-cxx-client/core/crud_component.cxx +51 -22
  10. package/deps/couchbase-cxx-client/core/impl/build_deferred_query_indexes.cxx +115 -50
  11. package/deps/couchbase-cxx-client/core/impl/cluster.cxx +6 -0
  12. package/deps/couchbase-cxx-client/core/impl/create_bucket.cxx +155 -0
  13. package/deps/couchbase-cxx-client/core/impl/create_query_index.cxx +172 -59
  14. package/deps/couchbase-cxx-client/core/impl/dns_srv_tracker.cxx +2 -1
  15. package/deps/couchbase-cxx-client/core/impl/drop_bucket.cxx +66 -0
  16. package/deps/couchbase-cxx-client/core/impl/drop_query_index.cxx +138 -59
  17. package/deps/couchbase-cxx-client/core/impl/flush_bucket.cxx +66 -0
  18. package/deps/couchbase-cxx-client/core/impl/get_all_buckets.cxx +163 -0
  19. package/deps/couchbase-cxx-client/core/impl/get_all_query_indexes.cxx +67 -37
  20. package/deps/couchbase-cxx-client/core/impl/get_bucket.cxx +153 -0
  21. package/deps/couchbase-cxx-client/core/impl/internal_manager_error_context.cxx +113 -0
  22. package/deps/couchbase-cxx-client/core/impl/internal_manager_error_context.hxx +60 -0
  23. package/deps/couchbase-cxx-client/core/impl/key_value_error_category.cxx +2 -4
  24. package/deps/couchbase-cxx-client/core/impl/manager_error_context.cxx +100 -0
  25. package/deps/couchbase-cxx-client/core/impl/query.cxx +1 -0
  26. package/deps/couchbase-cxx-client/core/impl/update_bucket.cxx +130 -0
  27. package/deps/couchbase-cxx-client/core/impl/watch_query_indexes.cxx +53 -29
  28. package/deps/couchbase-cxx-client/core/io/dns_client.cxx +71 -38
  29. package/deps/couchbase-cxx-client/core/io/dns_config.cxx +5 -4
  30. package/deps/couchbase-cxx-client/core/io/mcbp_session.cxx +5 -6
  31. package/deps/couchbase-cxx-client/core/meta/features.hxx +6 -0
  32. package/deps/couchbase-cxx-client/core/operations/document_query.cxx +11 -0
  33. package/deps/couchbase-cxx-client/core/operations/document_query.hxx +1 -0
  34. package/deps/couchbase-cxx-client/core/origin.cxx +270 -0
  35. package/deps/couchbase-cxx-client/core/origin.hxx +2 -0
  36. package/deps/couchbase-cxx-client/core/protocol/status.cxx +2 -2
  37. package/deps/couchbase-cxx-client/core/range_scan_options.cxx +3 -27
  38. package/deps/couchbase-cxx-client/core/range_scan_options.hxx +13 -17
  39. package/deps/couchbase-cxx-client/core/range_scan_orchestrator.cxx +367 -170
  40. package/deps/couchbase-cxx-client/core/range_scan_orchestrator.hxx +13 -2
  41. package/deps/couchbase-cxx-client/core/range_scan_orchestrator_options.hxx +5 -3
  42. package/deps/couchbase-cxx-client/core/scan_options.hxx +0 -19
  43. package/deps/couchbase-cxx-client/core/scan_result.cxx +19 -5
  44. package/deps/couchbase-cxx-client/core/scan_result.hxx +5 -2
  45. package/deps/couchbase-cxx-client/core/timeout_defaults.hxx +2 -3
  46. package/deps/couchbase-cxx-client/core/topology/capabilities.hxx +1 -0
  47. package/deps/couchbase-cxx-client/core/topology/capabilities_fmt.hxx +2 -0
  48. package/deps/couchbase-cxx-client/core/topology/collections_manifest_fmt.hxx +1 -1
  49. package/deps/couchbase-cxx-client/core/topology/configuration.hxx +5 -0
  50. package/deps/couchbase-cxx-client/core/topology/configuration_json.hxx +2 -0
  51. package/deps/couchbase-cxx-client/core/utils/connection_string.cxx +4 -0
  52. package/deps/couchbase-cxx-client/couchbase/behavior_options.hxx +19 -2
  53. package/deps/couchbase-cxx-client/couchbase/bucket_manager.hxx +135 -0
  54. package/deps/couchbase-cxx-client/couchbase/build_query_index_options.hxx +0 -30
  55. package/deps/couchbase-cxx-client/couchbase/cluster.hxx +14 -0
  56. package/deps/couchbase-cxx-client/couchbase/collection_query_index_manager.hxx +7 -48
  57. package/deps/couchbase-cxx-client/couchbase/create_bucket_options.hxx +41 -0
  58. package/deps/couchbase-cxx-client/couchbase/create_primary_query_index_options.hxx +0 -29
  59. package/deps/couchbase-cxx-client/couchbase/create_query_index_options.hxx +0 -33
  60. package/deps/couchbase-cxx-client/couchbase/drop_bucket_options.hxx +41 -0
  61. package/deps/couchbase-cxx-client/couchbase/drop_primary_query_index_options.hxx +0 -30
  62. package/deps/couchbase-cxx-client/couchbase/drop_query_index_options.hxx +0 -31
  63. package/deps/couchbase-cxx-client/couchbase/error_codes.hxx +1 -2
  64. package/deps/couchbase-cxx-client/couchbase/flush_bucket_options.hxx +41 -0
  65. package/deps/couchbase-cxx-client/couchbase/get_all_buckets_options.hxx +44 -0
  66. package/deps/couchbase-cxx-client/couchbase/get_all_query_indexes_options.hxx +0 -30
  67. package/deps/couchbase-cxx-client/couchbase/get_bucket_options.hxx +43 -0
  68. package/deps/couchbase-cxx-client/couchbase/management/bucket_settings.hxx +116 -0
  69. package/deps/couchbase-cxx-client/couchbase/manager_error_context.hxx +29 -53
  70. package/deps/couchbase-cxx-client/couchbase/query_index_manager.hxx +16 -83
  71. package/deps/couchbase-cxx-client/couchbase/query_options.hxx +18 -0
  72. package/deps/couchbase-cxx-client/couchbase/security_options.hxx +15 -0
  73. package/deps/couchbase-cxx-client/couchbase/update_bucket_options.hxx +41 -0
  74. package/deps/couchbase-cxx-client/couchbase/watch_query_indexes_options.hxx +0 -31
  75. package/deps/couchbase-cxx-client/docs/cbc-analytics.md +1 -0
  76. package/deps/couchbase-cxx-client/docs/cbc-get.md +1 -0
  77. package/deps/couchbase-cxx-client/docs/cbc-pillowfight.md +1 -0
  78. package/deps/couchbase-cxx-client/docs/cbc-query.md +1 -0
  79. package/deps/couchbase-cxx-client/docs/cbc.md +10 -0
  80. package/deps/couchbase-cxx-client/test/CMakeLists.txt +1 -0
  81. package/deps/couchbase-cxx-client/test/test_integration_collections.cxx +6 -0
  82. package/deps/couchbase-cxx-client/test/test_integration_crud.cxx +5 -0
  83. package/deps/couchbase-cxx-client/test/test_integration_examples.cxx +137 -1
  84. package/deps/couchbase-cxx-client/test/test_integration_management.cxx +709 -266
  85. package/deps/couchbase-cxx-client/test/test_integration_query.cxx +19 -7
  86. package/deps/couchbase-cxx-client/test/test_integration_range_scan.cxx +351 -112
  87. package/deps/couchbase-cxx-client/test/test_integration_search.cxx +10 -1
  88. package/deps/couchbase-cxx-client/test/test_transaction_public_async_api.cxx +13 -12
  89. package/deps/couchbase-cxx-client/test/test_transaction_public_blocking_api.cxx +27 -21
  90. package/deps/couchbase-cxx-client/test/test_unit_query.cxx +75 -0
  91. package/deps/couchbase-cxx-client/test/utils/server_version.hxx +5 -0
  92. package/deps/couchbase-cxx-client/test/utils/wait_until.cxx +29 -10
  93. package/deps/couchbase-cxx-client/test/utils/wait_until.hxx +3 -1
  94. package/deps/couchbase-cxx-client/tools/utils.cxx +4 -1
  95. package/dist/binding.d.ts +21 -16
  96. package/dist/binding.js +1 -4
  97. package/dist/bindingutilities.d.ts +6 -1
  98. package/dist/bindingutilities.js +36 -1
  99. package/dist/collection.d.ts +65 -3
  100. package/dist/collection.js +107 -0
  101. package/dist/crudoptypes.d.ts +34 -0
  102. package/dist/crudoptypes.js +18 -1
  103. package/dist/queryexecutor.js +1 -0
  104. package/dist/querytypes.d.ts +7 -0
  105. package/dist/rangeScan.d.ts +107 -0
  106. package/dist/rangeScan.js +91 -0
  107. package/dist/streamablepromises.d.ts +6 -0
  108. package/dist/streamablepromises.js +25 -1
  109. package/package.json +13 -14
  110. package/scripts/createPlatformPackages.js +1 -4
  111. package/src/addondata.hpp +1 -0
  112. package/src/binding.cpp +5 -2
  113. package/src/connection.cpp +108 -2
  114. package/src/connection.hpp +1 -0
  115. package/src/constants.cpp +2 -12
  116. package/src/jstocbpp_autogen.hpp +49 -22
  117. package/src/jstocbpp_basic.hpp +2 -8
  118. package/src/mutationtoken.cpp +13 -0
  119. package/src/scan_iterator.cpp +90 -0
  120. package/src/scan_iterator.hpp +30 -0
  121. package/tools/gen-bindings-json.py +9 -8
  122. package/deps/couchbase-cxx-client/core/impl/collection_query_index_manager.cxx +0 -93
@@ -53,10 +53,7 @@ try {
53
53
  fs.renameSync(oldPath, path.join(newPath, newPrebuildName))
54
54
  const platformPackage = `@${packageName}/${platPkg}`
55
55
  // build the platform package files: package.json, README and index.js
56
- const engines = { node: `>=16.0.0` }
57
- if (runtime === 'napi') {
58
- engines.node = nodeVersion >= 18 ? '>=18.0.0' : '<18'
59
- }
56
+ const engines = { node: nodeVersion >= 18 ? '>=18' : '<18' }
60
57
  fs.writeFileSync(
61
58
  path.join(newPath, 'package.json'),
62
59
  JSON.stringify(
package/src/addondata.hpp CHANGED
@@ -22,6 +22,7 @@ public:
22
22
  Napi::FunctionReference _mutationTokenCtor;
23
23
  Napi::FunctionReference _transactionsCtor;
24
24
  Napi::FunctionReference _transactionCtor;
25
+ Napi::FunctionReference _scanIteratorCtor;
25
26
  };
26
27
 
27
28
  } // namespace couchnode
package/src/binding.cpp CHANGED
@@ -3,6 +3,7 @@
3
3
  #include "connection.hpp"
4
4
  #include "constants.hpp"
5
5
  #include "mutationtoken.hpp"
6
+ #include "scan_iterator.hpp"
6
7
  #include "transaction.hpp"
7
8
  #include "transactions.hpp"
8
9
  #include <napi.h>
@@ -55,11 +56,13 @@ Napi::Object Init(Napi::Env env, Napi::Object exports)
55
56
  Connection::Init(env, exports);
56
57
  Transactions::Init(env, exports);
57
58
  Transaction::Init(env, exports);
59
+ ScanIterator::Init(env, exports);
58
60
 
59
61
  exports.Set(Napi::String::New(env, "cbppVersion"),
60
62
  Napi::String::New(env, "1.0.0-beta"));
61
- exports.Set(Napi::String::New(env, "cbppMetadata"),
62
- Napi::String::New(env, couchbase::core::meta::sdk_build_info_json()));
63
+ exports.Set(
64
+ Napi::String::New(env, "cbppMetadata"),
65
+ Napi::String::New(env, couchbase::core::meta::sdk_build_info_json()));
63
66
  return exports;
64
67
  }
65
68
 
@@ -3,8 +3,11 @@
3
3
  #include "instance.hpp"
4
4
  #include "jstocbpp.hpp"
5
5
  #include "mutationtoken.hpp"
6
+ #include "scan_iterator.hpp"
6
7
  #include "transcoder.hpp"
8
+ #include <core/agent_group.hxx>
7
9
  #include <core/operations/management/freeform.hxx>
10
+ #include <core/range_scan_orchestrator.hxx>
8
11
  #include <type_traits>
9
12
 
10
13
  namespace couchnode
@@ -35,6 +38,7 @@ void Connection::Init(Napi::Env env, Napi::Object exports)
35
38
  InstanceMethod<&Connection::jsOpenBucket>("openBucket"),
36
39
  InstanceMethod<&Connection::jsDiagnostics>("diagnostics"),
37
40
  InstanceMethod<&Connection::jsPing>("ping"),
41
+ InstanceMethod<&Connection::jsScan>("scan"),
38
42
 
39
43
  //#region Autogenerated Method Registration
40
44
 
@@ -253,9 +257,30 @@ Napi::Value Connection::jsConnect(const Napi::CallbackInfo &info)
253
257
  jsToCbpp<couchbase::core::cluster_credentials>(credentialsJsObj);
254
258
 
255
259
  if (!info[2].IsNull()) {
256
- auto dnsConfigJsObj = info[2].As<Napi::Object>();
260
+ auto jsDnsConfigObj = info[2].As<Napi::Object>();
261
+ auto jsNameserver = jsDnsConfigObj.Get("nameserver");
262
+ if (jsNameserver.IsNull() || jsNameserver.IsUndefined() ||
263
+ jsNameserver.IsEmpty()) {
264
+ jsDnsConfigObj.Set(
265
+ "nameserver",
266
+ cbpp_to_js<std::string>(
267
+ info.Env(), connstrInfo.options.dns_config.nameserver()));
268
+ }
269
+ auto jsPort = jsDnsConfigObj.Get("port");
270
+ if (jsPort.IsNull() || jsPort.IsUndefined()) {
271
+ jsDnsConfigObj.Set(
272
+ "port", cbpp_to_js<std::uint16_t>(
273
+ info.Env(), connstrInfo.options.dns_config.port()));
274
+ }
275
+ auto jsTimeout = jsDnsConfigObj.Get("dnsSrvTimeout");
276
+ if (jsTimeout.IsNull() || jsTimeout.IsUndefined()) {
277
+ jsDnsConfigObj.Set(
278
+ "dnsSrvTimeout",
279
+ cbpp_to_js<std::chrono::milliseconds>(
280
+ info.Env(), connstrInfo.options.dns_config.timeout()));
281
+ }
257
282
  auto cppDnsConfig =
258
- jsToCbpp<couchbase::core::io::dns::dns_config>(dnsConfigJsObj);
283
+ jsToCbpp<couchbase::core::io::dns::dns_config>(jsDnsConfigObj);
259
284
  connstrInfo.options.dns_config = cppDnsConfig;
260
285
  }
261
286
 
@@ -366,4 +391,85 @@ Napi::Value Connection::jsPing(const Napi::CallbackInfo &info)
366
391
  return info.Env().Null();
367
392
  }
368
393
 
394
+ Napi::Value Connection::jsScan(const Napi::CallbackInfo &info)
395
+ {
396
+ auto bucketName = info[0].ToString().Utf8Value();
397
+ auto scopeName = info[1].ToString().Utf8Value();
398
+ auto collectionName = info[2].ToString().Utf8Value();
399
+ auto scanTypeName = info[3].ToString().Utf8Value();
400
+ // scanType handled below
401
+ auto optionsObj = info[5].As<Napi::Object>();
402
+
403
+ auto env = info.Env();
404
+ auto resObj = Napi::Object::New(env);
405
+
406
+ auto barrier = std::make_shared<std::promise<
407
+ tl::expected<couchbase::core::topology::configuration::vbucket_map,
408
+ std::error_code>>>();
409
+ auto f = barrier->get_future();
410
+ this->_instance->_cluster->with_bucket_configuration(
411
+ bucketName,
412
+ [barrier](
413
+ std::error_code ec,
414
+ const couchbase::core::topology::configuration &config) mutable {
415
+ if (ec) {
416
+ return barrier->set_value(tl::unexpected(ec));
417
+ }
418
+ if (!config.vbmap || config.vbmap->empty()) {
419
+ return barrier->set_value(tl::unexpected(
420
+ couchbase::errc::common::feature_not_available));
421
+ }
422
+ barrier->set_value(config.vbmap.value());
423
+ });
424
+ auto vbucket_map = f.get();
425
+ if (!vbucket_map.has_value()) {
426
+ resObj.Set("cppErr", cbpp_to_js(env, vbucket_map.error()));
427
+ resObj.Set("result", env.Null());
428
+ return resObj;
429
+ }
430
+
431
+ auto agentGroup = couchbase::core::agent_group(
432
+ this->_instance->_io,
433
+ couchbase::core::agent_group_config{{this->_instance->_cluster}});
434
+ agentGroup.open_bucket(bucketName);
435
+ auto agent = agentGroup.get_agent(bucketName);
436
+ auto options = js_to_cbpp<couchbase::core::range_scan_orchestrator_options>(
437
+ optionsObj);
438
+
439
+ if (!agent.has_value()) {
440
+ resObj.Set("cppErr", cbpp_to_js(env, agent.error()));
441
+ resObj.Set("result", env.Null());
442
+ return resObj;
443
+ }
444
+
445
+ std::variant<std::monostate, couchbase::core::range_scan,
446
+ couchbase::core::prefix_scan, couchbase::core::sampling_scan>
447
+ scanType;
448
+ if (scanTypeName.compare("range_scan") == 0) {
449
+ scanType = js_to_cbpp<couchbase::core::range_scan>(info[4]);
450
+ } else if (scanTypeName.compare("sampling_scan") == 0) {
451
+ scanType = js_to_cbpp<couchbase::core::sampling_scan>(info[4]);
452
+ } else {
453
+ scanType = js_to_cbpp<couchbase::core::prefix_scan>(info[4]);
454
+ }
455
+
456
+ auto orchestrator = couchbase::core::range_scan_orchestrator(
457
+ this->_instance->_io, agent.value(), vbucket_map.value(), scopeName,
458
+ collectionName, scanType, options);
459
+ auto scanResult = orchestrator.scan();
460
+ if (!scanResult.has_value()) {
461
+ resObj.Set("cppErr", cbpp_to_js(env, scanResult.error()));
462
+ resObj.Set("result", env.Null());
463
+ return resObj;
464
+ }
465
+
466
+ auto ext = Napi::External<couchbase::core::scan_result>::New(
467
+ env, &scanResult.value());
468
+ auto scanIterator = ScanIterator::constructor(info.Env()).New({ext});
469
+ resObj.Set("cppErr", env.Null());
470
+ resObj.Set("result", scanIterator);
471
+
472
+ return resObj;
473
+ }
474
+
369
475
  } // namespace couchnode
@@ -69,6 +69,7 @@ public:
69
69
  Napi::Value jsOpenBucket(const Napi::CallbackInfo &info);
70
70
  Napi::Value jsDiagnostics(const Napi::CallbackInfo &info);
71
71
  Napi::Value jsPing(const Napi::CallbackInfo &info);
72
+ Napi::Value jsScan(const Napi::CallbackInfo &info);
72
73
 
73
74
  //#region Autogenerated Method Declarations
74
75
 
package/src/constants.cpp CHANGED
@@ -701,10 +701,8 @@ void Constants::InitAutogen(Napi::Env env, Napi::Object exports)
701
701
  couchbase::errc::key_value::xattr_no_access},
702
702
  {"cannot_revive_living_document",
703
703
  couchbase::errc::key_value::cannot_revive_living_document},
704
- {"range_scan_cancelled",
705
- couchbase::errc::key_value::range_scan_cancelled},
706
- {"range_scan_vb_uuid_not_equal",
707
- couchbase::errc::key_value::range_scan_vb_uuid_not_equal},
704
+ {"mutation_token_outdated",
705
+ couchbase::errc::key_value::mutation_token_outdated},
708
706
  {"range_scan_completed",
709
707
  couchbase::errc::key_value::range_scan_completed},
710
708
  }));
@@ -1050,14 +1048,6 @@ void Constants::InitAutogen(Napi::Env env, Napi::Object exports)
1050
1048
  {"three", couchbase::replicate_to::three},
1051
1049
  }));
1052
1050
 
1053
- exports.Set(
1054
- "scan_sort",
1055
- cbppEnumToJs<couchbase::core::scan_sort>(
1056
- env, {
1057
- {"none", couchbase::core::scan_sort::none},
1058
- {"ascending", couchbase::core::scan_sort::ascending},
1059
- }));
1060
-
1061
1051
  //#endregion Autogenerated Constants
1062
1052
  }
1063
1053
 
@@ -2418,6 +2418,8 @@ struct js_to_cbpp_t<couchbase::core::operations::query_request> {
2418
2418
  js_to_cbpp<bool>(cppObj.readonly, jsObj.Get("readonly"));
2419
2419
  js_to_cbpp<bool>(cppObj.flex_index, jsObj.Get("flex_index"));
2420
2420
  js_to_cbpp<bool>(cppObj.preserve_expiry, jsObj.Get("preserve_expiry"));
2421
+ js_to_cbpp<std::optional<bool>>(cppObj.use_replica,
2422
+ jsObj.Get("use_replica"));
2421
2423
  js_to_cbpp<std::optional<std::uint64_t>>(cppObj.max_parallelism,
2422
2424
  jsObj.Get("max_parallelism"));
2423
2425
  js_to_cbpp<std::optional<std::uint64_t>>(cppObj.scan_cap,
@@ -2469,6 +2471,8 @@ struct js_to_cbpp_t<couchbase::core::operations::query_request> {
2469
2471
  resObj.Set("flex_index", cbpp_to_js<bool>(env, cppObj.flex_index));
2470
2472
  resObj.Set("preserve_expiry",
2471
2473
  cbpp_to_js<bool>(env, cppObj.preserve_expiry));
2474
+ resObj.Set("use_replica",
2475
+ cbpp_to_js<std::optional<bool>>(env, cppObj.use_replica));
2472
2476
  resObj.Set("max_parallelism", cbpp_to_js<std::optional<std::uint64_t>>(
2473
2477
  env, cppObj.max_parallelism));
2474
2478
  resObj.Set("scan_cap", cbpp_to_js<std::optional<std::uint64_t>>(
@@ -9888,7 +9892,7 @@ struct js_to_cbpp_t<couchbase::core::scan_term> {
9888
9892
  {
9889
9893
  auto jsObj = jsVal.ToObject();
9890
9894
  couchbase::core::scan_term cppObj;
9891
- js_to_cbpp<std::vector<std::byte>>(cppObj.id, jsObj.Get("id"));
9895
+ js_to_cbpp<std::string>(cppObj.term, jsObj.Get("term"));
9892
9896
  js_to_cbpp<bool>(cppObj.exclusive, jsObj.Get("exclusive"));
9893
9897
  return cppObj;
9894
9898
  }
@@ -9896,7 +9900,7 @@ struct js_to_cbpp_t<couchbase::core::scan_term> {
9896
9900
  const couchbase::core::scan_term &cppObj)
9897
9901
  {
9898
9902
  auto resObj = Napi::Object::New(env);
9899
- resObj.Set("id", cbpp_to_js<std::vector<std::byte>>(env, cppObj.id));
9903
+ resObj.Set("term", cbpp_to_js<std::string>(env, cppObj.term));
9900
9904
  resObj.Set("exclusive", cbpp_to_js<bool>(env, cppObj.exclusive));
9901
9905
  return resObj;
9902
9906
  }
@@ -9908,19 +9912,39 @@ struct js_to_cbpp_t<couchbase::core::range_scan> {
9908
9912
  {
9909
9913
  auto jsObj = jsVal.ToObject();
9910
9914
  couchbase::core::range_scan cppObj;
9911
- js_to_cbpp<couchbase::core::scan_term>(cppObj.start_,
9912
- jsObj.Get("start_"));
9913
- js_to_cbpp<couchbase::core::scan_term>(cppObj.end_, jsObj.Get("end_"));
9915
+ js_to_cbpp<std::optional<couchbase::core::scan_term>>(
9916
+ cppObj.from, jsObj.Get("from"));
9917
+ js_to_cbpp<std::optional<couchbase::core::scan_term>>(cppObj.to,
9918
+ jsObj.Get("to"));
9914
9919
  return cppObj;
9915
9920
  }
9916
9921
  static inline Napi::Value to_js(Napi::Env env,
9917
9922
  const couchbase::core::range_scan &cppObj)
9918
9923
  {
9919
9924
  auto resObj = Napi::Object::New(env);
9920
- resObj.Set("start_",
9921
- cbpp_to_js<couchbase::core::scan_term>(env, cppObj.start_));
9922
- resObj.Set("end_",
9923
- cbpp_to_js<couchbase::core::scan_term>(env, cppObj.end_));
9925
+ resObj.Set("from",
9926
+ cbpp_to_js<std::optional<couchbase::core::scan_term>>(
9927
+ env, cppObj.from));
9928
+ resObj.Set("to", cbpp_to_js<std::optional<couchbase::core::scan_term>>(
9929
+ env, cppObj.to));
9930
+ return resObj;
9931
+ }
9932
+ };
9933
+
9934
+ template <>
9935
+ struct js_to_cbpp_t<couchbase::core::prefix_scan> {
9936
+ static inline couchbase::core::prefix_scan from_js(Napi::Value jsVal)
9937
+ {
9938
+ auto jsObj = jsVal.ToObject();
9939
+ couchbase::core::prefix_scan cppObj;
9940
+ js_to_cbpp<std::string>(cppObj.prefix, jsObj.Get("prefix"));
9941
+ return cppObj;
9942
+ }
9943
+ static inline Napi::Value to_js(Napi::Env env,
9944
+ const couchbase::core::prefix_scan &cppObj)
9945
+ {
9946
+ auto resObj = Napi::Object::New(env);
9947
+ resObj.Set("prefix", cbpp_to_js<std::string>(env, cppObj.prefix));
9924
9948
  return resObj;
9925
9949
  }
9926
9950
  };
@@ -9932,7 +9956,7 @@ struct js_to_cbpp_t<couchbase::core::sampling_scan> {
9932
9956
  auto jsObj = jsVal.ToObject();
9933
9957
  couchbase::core::sampling_scan cppObj;
9934
9958
  js_to_cbpp<std::size_t>(cppObj.limit, jsObj.Get("limit"));
9935
- js_to_cbpp<std::optional<std::uint32_t>>(cppObj.seed,
9959
+ js_to_cbpp<std::optional<std::uint64_t>>(cppObj.seed,
9936
9960
  jsObj.Get("seed"));
9937
9961
  return cppObj;
9938
9962
  }
@@ -9942,7 +9966,7 @@ struct js_to_cbpp_t<couchbase::core::sampling_scan> {
9942
9966
  auto resObj = Napi::Object::New(env);
9943
9967
  resObj.Set("limit", cbpp_to_js<std::size_t>(env, cppObj.limit));
9944
9968
  resObj.Set("seed",
9945
- cbpp_to_js<std::optional<std::uint32_t>>(env, cppObj.seed));
9969
+ cbpp_to_js<std::optional<std::uint64_t>>(env, cppObj.seed));
9946
9970
  return resObj;
9947
9971
  }
9948
9972
  };
@@ -9986,11 +10010,15 @@ struct js_to_cbpp_t<couchbase::core::range_scan_create_options> {
9986
10010
  auto scan_type_name =
9987
10011
  jsToCbpp<std::string>(jsObj.Get("scan_type_name"));
9988
10012
  std::variant<std::monostate, couchbase::core::range_scan,
10013
+ couchbase::core::prefix_scan,
9989
10014
  couchbase::core::sampling_scan>
9990
10015
  scan_type;
9991
10016
  if (scan_type_name.compare("range_scan") == 0) {
9992
10017
  scan_type = js_to_cbpp<couchbase::core::range_scan>(
9993
10018
  jsObj.Get("scan_type_value"));
10019
+ } else if (scan_type_name.compare("prefix_scan") == 0) {
10020
+ scan_type = js_to_cbpp<couchbase::core::prefix_scan>(
10021
+ jsObj.Get("scan_type_value"));
9994
10022
  } else if (scan_type_name.compare("sampling_scan") == 0) {
9995
10023
  scan_type = js_to_cbpp<couchbase::core::sampling_scan>(
9996
10024
  jsObj.Get("scan_type_value"));
@@ -10023,6 +10051,7 @@ struct js_to_cbpp_t<couchbase::core::range_scan_create_options> {
10023
10051
  resObj.Set(
10024
10052
  "scan_type",
10025
10053
  cbpp_to_js<std::variant<std::monostate, couchbase::core::range_scan,
10054
+ couchbase::core::prefix_scan,
10026
10055
  couchbase::core::sampling_scan>>(
10027
10056
  env, cppObj.scan_type));
10028
10057
  resObj.Set("timeout",
@@ -10076,10 +10105,11 @@ struct js_to_cbpp_t<couchbase::core::range_scan_continue_options> {
10076
10105
  jsObj.Get("batch_item_limit"));
10077
10106
  js_to_cbpp<std::uint32_t>(cppObj.batch_byte_limit,
10078
10107
  jsObj.Get("batch_byte_limit"));
10108
+ js_to_cbpp<std::chrono::milliseconds>(cppObj.timeout,
10109
+ jsObj.Get("timeout"));
10079
10110
  js_to_cbpp<std::chrono::milliseconds>(cppObj.batch_time_limit,
10080
10111
  jsObj.Get("batch_time_limit"));
10081
10112
  // retry_strategy
10082
- js_to_cbpp<bool>(cppObj.ids_only, jsObj.Get("ids_only"));
10083
10113
  // internal
10084
10114
  return cppObj;
10085
10115
  }
@@ -10092,10 +10122,11 @@ struct js_to_cbpp_t<couchbase::core::range_scan_continue_options> {
10092
10122
  cbpp_to_js<std::uint32_t>(env, cppObj.batch_item_limit));
10093
10123
  resObj.Set("batch_byte_limit",
10094
10124
  cbpp_to_js<std::uint32_t>(env, cppObj.batch_byte_limit));
10125
+ resObj.Set("timeout",
10126
+ cbpp_to_js<std::chrono::milliseconds>(env, cppObj.timeout));
10095
10127
  resObj.Set("batch_time_limit", cbpp_to_js<std::chrono::milliseconds>(
10096
10128
  env, cppObj.batch_time_limit));
10097
10129
  // retry_strategy
10098
- resObj.Set("ids_only", cbpp_to_js<bool>(env, cppObj.ids_only));
10099
10130
  // internal
10100
10131
  return resObj;
10101
10132
  }
@@ -10189,7 +10220,7 @@ struct js_to_cbpp_t<couchbase::core::range_scan_item> {
10189
10220
  {
10190
10221
  auto jsObj = jsVal.ToObject();
10191
10222
  couchbase::core::range_scan_item cppObj;
10192
- js_to_cbpp<std::vector<std::byte>>(cppObj.key, jsObj.Get("key"));
10223
+ js_to_cbpp<std::string>(cppObj.key, jsObj.Get("key"));
10193
10224
  js_to_cbpp<std::optional<couchbase::core::range_scan_item_body>>(
10194
10225
  cppObj.body, jsObj.Get("body"));
10195
10226
  return cppObj;
@@ -10198,7 +10229,7 @@ struct js_to_cbpp_t<couchbase::core::range_scan_item> {
10198
10229
  to_js(Napi::Env env, const couchbase::core::range_scan_item &cppObj)
10199
10230
  {
10200
10231
  auto resObj = Napi::Object::New(env);
10201
- resObj.Set("key", cbpp_to_js<std::vector<std::byte>>(env, cppObj.key));
10232
+ resObj.Set("key", cbpp_to_js<std::string>(env, cppObj.key));
10202
10233
  resObj.Set(
10203
10234
  "body",
10204
10235
  cbpp_to_js<std::optional<couchbase::core::range_scan_item_body>>(
@@ -10255,13 +10286,11 @@ struct js_to_cbpp_t<couchbase::core::range_scan_orchestrator_options> {
10255
10286
  js_to_cbpp<bool>(cppObj.ids_only, jsObj.Get("ids_only"));
10256
10287
  js_to_cbpp<std::optional<couchbase::core::mutation_state>>(
10257
10288
  cppObj.consistent_with, jsObj.Get("consistent_with"));
10258
- js_to_cbpp<couchbase::core::scan_sort>(cppObj.sort, jsObj.Get("sort"));
10259
10289
  js_to_cbpp<std::uint32_t>(cppObj.batch_item_limit,
10260
10290
  jsObj.Get("batch_item_limit"));
10261
10291
  js_to_cbpp<std::uint32_t>(cppObj.batch_byte_limit,
10262
10292
  jsObj.Get("batch_byte_limit"));
10263
- js_to_cbpp<std::chrono::milliseconds>(cppObj.batch_time_limit,
10264
- jsObj.Get("batch_time_limit"));
10293
+ js_to_cbpp<std::uint16_t>(cppObj.concurrency, jsObj.Get("concurrency"));
10265
10294
  // retry_strategy
10266
10295
  js_to_cbpp<std::chrono::milliseconds>(cppObj.timeout,
10267
10296
  jsObj.Get("timeout"));
@@ -10277,14 +10306,12 @@ struct js_to_cbpp_t<couchbase::core::range_scan_orchestrator_options> {
10277
10306
  resObj.Set("consistent_with",
10278
10307
  cbpp_to_js<std::optional<couchbase::core::mutation_state>>(
10279
10308
  env, cppObj.consistent_with));
10280
- resObj.Set("sort",
10281
- cbpp_to_js<couchbase::core::scan_sort>(env, cppObj.sort));
10282
10309
  resObj.Set("batch_item_limit",
10283
10310
  cbpp_to_js<std::uint32_t>(env, cppObj.batch_item_limit));
10284
10311
  resObj.Set("batch_byte_limit",
10285
10312
  cbpp_to_js<std::uint32_t>(env, cppObj.batch_byte_limit));
10286
- resObj.Set("batch_time_limit", cbpp_to_js<std::chrono::milliseconds>(
10287
- env, cppObj.batch_time_limit));
10313
+ resObj.Set("concurrency",
10314
+ cbpp_to_js<std::uint16_t>(env, cppObj.concurrency));
10288
10315
  // retry_strategy
10289
10316
  resObj.Set("timeout",
10290
10317
  cbpp_to_js<std::chrono::milliseconds>(env, cppObj.timeout));
@@ -49,15 +49,9 @@ struct js_to_cbpp_t<couchbase::core::io::dns::dns_config> {
49
49
  from_js(Napi::Value jsVal)
50
50
  {
51
51
  auto jsObj = jsVal.ToObject();
52
- auto nameserver = js_to_cbpp<std::string>(jsObj.Get("nameserver"));
53
- auto jsPort = jsObj.Get("port");
54
52
  auto cppObj = couchbase::core::io::dns::dns_config{
55
- nameserver.empty()
56
- ? couchbase::core::io::dns::dns_config::default_nameserver
57
- : nameserver,
58
- jsPort.IsNull() || jsPort.IsUndefined()
59
- ? couchbase::core::io::dns::dns_config::default_port
60
- : js_to_cbpp<std::uint16_t>(jsPort),
53
+ js_to_cbpp<std::string>(jsObj.Get("nameserver")),
54
+ js_to_cbpp<std::uint16_t>(jsObj.Get("port")),
61
55
  js_to_cbpp<std::chrono::milliseconds>(jsObj.Get("dnsSrvTimeout"))};
62
56
  return cppObj;
63
57
  }
@@ -1,4 +1,5 @@
1
1
  #include "mutationtoken.hpp"
2
+ #include "jstocbpp.hpp"
2
3
  #include "utils.hpp"
3
4
  #include <sstream>
4
5
 
@@ -81,6 +82,18 @@ couchbase::mutation_token MutationToken::parse(Napi::Value val)
81
82
  return couchbase::mutation_token{};
82
83
  } else if (val.IsObject()) {
83
84
  auto objVal = val.As<Napi::Object>();
85
+ if (objVal.HasOwnProperty("partition_uuid")) {
86
+ auto partitionUuid =
87
+ jsToCbpp<std::uint64_t>(objVal.Get("partition_uuid"));
88
+ auto sequenceNumber =
89
+ jsToCbpp<std::uint64_t>(objVal.Get("sequence_number"));
90
+ auto partitionId =
91
+ jsToCbpp<std::uint16_t>(objVal.Get("partition_id"));
92
+ auto bucketName = jsToCbpp<std::string>(objVal.Get("bucket_name"));
93
+ return couchbase::mutation_token{partitionUuid, sequenceNumber,
94
+ partitionId, bucketName};
95
+ }
96
+
84
97
  auto maybeRawVal = objVal.Get("raw");
85
98
  if (!maybeRawVal.IsEmpty()) {
86
99
  return MutationToken::fromBuffer(maybeRawVal);
@@ -0,0 +1,90 @@
1
+ #include "scan_iterator.hpp"
2
+ #include "connection.hpp"
3
+ #include "jstocbpp.hpp"
4
+
5
+ namespace couchnode
6
+ {
7
+
8
+ void ScanIterator::Init(Napi::Env env, Napi::Object exports)
9
+ {
10
+ Napi::Function func = DefineClass(
11
+ env, "ScanIterator",
12
+ {
13
+ InstanceMethod<&ScanIterator::jsNext>("next"),
14
+ InstanceMethod<&ScanIterator::jsCancel>("cancel"),
15
+ InstanceAccessor<&ScanIterator::jsCancelled>("cancelled"),
16
+ });
17
+
18
+ constructor(env) = Napi::Persistent(func);
19
+ exports.Set("ScanIterator", func);
20
+ }
21
+
22
+ ScanIterator::ScanIterator(const Napi::CallbackInfo &info)
23
+ : Napi::ObjectWrap<ScanIterator>(info)
24
+ {
25
+ if (info.Length() > 0) {
26
+ auto wrapped_result =
27
+ *info[0]
28
+ .As<const Napi::External<couchbase::core::scan_result>>()
29
+ .Data();
30
+ this->result_ =
31
+ std::make_shared<couchbase::core::scan_result>(wrapped_result);
32
+ }
33
+ }
34
+
35
+ ScanIterator::~ScanIterator()
36
+ {
37
+ }
38
+
39
+ Napi::Value ScanIterator::jsNext(const Napi::CallbackInfo &info)
40
+ {
41
+ auto env = info.Env();
42
+ auto callbackJsFn = info[0].As<Napi::Function>();
43
+ auto cookie = CallCookie(env, callbackJsFn, "cbRangeScanNext");
44
+
45
+ auto handler = [](Napi::Env env, Napi::Function callback,
46
+ couchbase::core::range_scan_item resp,
47
+ std::error_code ec) mutable {
48
+ Napi::Value jsErr, jsRes;
49
+ if (ec && ec == couchbase::errc::key_value::range_scan_completed) {
50
+ jsErr = env.Null();
51
+ jsRes = env.Undefined();
52
+ } else {
53
+ try {
54
+ jsErr = cbpp_to_js(env, ec);
55
+ jsRes = cbpp_to_js(env, resp);
56
+ } catch (const Napi::Error &e) {
57
+ jsErr = e.Value();
58
+ jsRes = env.Null();
59
+ }
60
+ }
61
+ callback.Call({jsErr, jsRes});
62
+ };
63
+
64
+ this->result_->next(
65
+ [cookie = std::move(cookie), handler = std::move(handler)](
66
+ couchbase::core::range_scan_item resp, std::error_code ec) mutable {
67
+ cookie.invoke([handler = std::move(handler), resp = std::move(resp),
68
+ ec = std::move(ec)](
69
+ Napi::Env env, Napi::Function callback) mutable {
70
+ handler(env, callback, std::move(resp), std::move(ec));
71
+ });
72
+ });
73
+
74
+ return env.Null();
75
+ }
76
+
77
+ Napi::Value ScanIterator::jsCancel(const Napi::CallbackInfo &info)
78
+ {
79
+ auto env = info.Env();
80
+ this->result_->cancel();
81
+ return Napi::Boolean::New(env, this->result_->is_cancelled());
82
+ }
83
+
84
+ Napi::Value ScanIterator::jsCancelled(const Napi::CallbackInfo &info)
85
+ {
86
+ auto env = info.Env();
87
+ return Napi::Boolean::New(env, this->result_->is_cancelled());
88
+ }
89
+
90
+ } // namespace couchnode
@@ -0,0 +1,30 @@
1
+ #pragma once
2
+ #include "addondata.hpp"
3
+ #include "napi.h"
4
+ #include <core/scan_result.hxx>
5
+
6
+ namespace couchnode
7
+ {
8
+
9
+ class ScanIterator : public Napi::ObjectWrap<ScanIterator>
10
+ {
11
+ public:
12
+ static Napi::FunctionReference &constructor(Napi::Env env)
13
+ {
14
+ return AddonData::fromEnv(env)->_scanIteratorCtor;
15
+ }
16
+
17
+ static void Init(Napi::Env env, Napi::Object exports);
18
+
19
+ ScanIterator(const Napi::CallbackInfo &info);
20
+ ~ScanIterator();
21
+
22
+ Napi::Value jsNext(const Napi::CallbackInfo &info);
23
+ Napi::Value jsCancel(const Napi::CallbackInfo &info);
24
+ Napi::Value jsCancelled(const Napi::CallbackInfo &info);
25
+
26
+ private:
27
+ std::shared_ptr<couchbase::core::scan_result> result_;
28
+ };
29
+
30
+ } // namespace couchnode
@@ -1,15 +1,12 @@
1
- from logging.config import valid_ident
2
1
  import os
3
2
  import json
4
3
  import re
5
- import subprocess
6
- from unittest import TestCase
7
4
  import clang.cindex
8
5
 
9
6
  # configurable part
10
7
 
11
8
  CLANG_VERSION='13.0.1'
12
- # homebrew installs for llvm (brew info llvm gives details):
9
+ # homebrew installs for llvm (brew info llvm gives details):
13
10
  # x64: /usr/local/opt/llvm/lib
14
11
  # arm64: /opt/homebrew/opt/llvm/lib
15
12
  llvmLibPath = "/usr/local/Cellar/llvm/13.0.1_1/lib/"
@@ -148,6 +145,7 @@ typeList = [
148
145
  "couchbase::core::scan_term",
149
146
  "couchbase::core::scan_sort",
150
147
  "couchbase::core::range_scan",
148
+ "couchbase::core::prefix_scan",
151
149
  "couchbase::core::sampling_scan",
152
150
  "couchbase::core::range_snapshot_requirements",
153
151
  "couchbase::core::range_scan_item_body",
@@ -341,7 +339,7 @@ def parse_type_str(typeStr):
341
339
  "to": parse_type_str(variantParts[1]),
342
340
  "comparator": parse_type_str(variantParts[2])
343
341
  }
344
-
342
+
345
343
  if tplClassName == "std::shared_ptr":
346
344
  return {
347
345
  "name": "std::shared_ptr",
@@ -358,6 +356,7 @@ def parse_type_str(typeStr):
358
356
  return {"name": typeStr}
359
357
 
360
358
  internal_structs = []
359
+ UNNAMED_STRUCT_DELIM = '::(unnamed struct'
361
360
 
362
361
  def traverse(node, namespace, main_file):
363
362
  # only scan the elements of the file we parsed
@@ -366,8 +365,9 @@ def traverse(node, namespace, main_file):
366
365
 
367
366
  if node.kind == clang.cindex.CursorKind.STRUCT_DECL or node.kind == clang.cindex.CursorKind.CLASS_DECL:
368
367
  fullStructName = "::".join([*namespace, node.displayname])
369
- if fullStructName.endswith('::'):
370
- match = next((s for s in internal_structs if fullStructName in s), None)
368
+ if fullStructName.endswith('::') or UNNAMED_STRUCT_DELIM in fullStructName:
369
+ struct_name = fullStructName if fullStructName.endswith('::') else fullStructName.split(UNNAMED_STRUCT_DELIM)[0]
370
+ match = next((s for s in internal_structs if struct_name in s), None)
371
371
  if match:
372
372
  fullStructName = match
373
373
 
@@ -451,7 +451,8 @@ for headerPath in fullFileList:
451
451
  "-I" + cxxClientRoot + "/third_party/json/include",
452
452
  "-I" + cxxClientRoot + "/third_party/json/external/PEGTL/include",
453
453
  "-I" + cxxClientRoot + "/third_party/asio/asio/include",
454
- "-I" + f"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/{CLANG_VERSION}/include"
454
+ "-I" + f"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/{CLANG_VERSION}/include",
455
+ # "-I" + f'/opt/homebrew/Cellar/llvm/{CLANG_VERSION}/lib/clang/{CLANG_VERSION[:2]}/include',
455
456
  ]
456
457
  translation_unit = index.parse(headerPath, args=args)
457
458