pulsar-client 1.13.2-rc.1 → 1.14.0-rc.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.
Files changed (77) hide show
  1. package/.idea/aws.xml +18 -0
  2. package/.idea/codeStyles/Project.xml +7 -0
  3. package/.idea/codeStyles/codeStyleConfig.xml +5 -0
  4. package/.idea/inspectionProfiles/Project_Default.xml +6 -0
  5. package/.idea/misc.xml +7 -0
  6. package/.idea/modules.xml +9 -0
  7. package/.idea/pulsar-client-node.iml +46 -0
  8. package/.idea/pulsar_client_node.iml +8 -0
  9. package/.idea/vcs.xml +6 -0
  10. package/index.d.ts +17 -0
  11. package/package.json +1 -1
  12. package/src/Client.cc +2 -1
  13. package/src/Client.h +1 -0
  14. package/src/ConsumerConfig.cc +66 -0
  15. package/src/cert.pem +3278 -0
  16. package/.clang-format +0 -26
  17. package/.eslintignore +0 -21
  18. package/.eslintrc.json +0 -22
  19. package/.github/PULL_REQUEST_TEMPLATE.md +0 -85
  20. package/.github/workflows/ci-build-release-napi.yml +0 -211
  21. package/.github/workflows/ci-pr-validation.yml +0 -334
  22. package/build-support/download-release-artifacts.py +0 -77
  23. package/build-support/generate-source-archive.sh +0 -28
  24. package/build-support/pulsar-test-container-start.sh +0 -43
  25. package/build-support/pulsar-test-service-start.sh +0 -39
  26. package/build-support/pulsar-test-service-stop.sh +0 -32
  27. package/build-support/sign-files.sh +0 -32
  28. package/build-support/stage-release.sh +0 -44
  29. package/docs/release-process.md +0 -291
  30. package/examples/certificate/private-key.client-rsa.pem +0 -27
  31. package/examples/certificate/public-key.client-rsa.pem +0 -9
  32. package/examples/consumer-schema.js +0 -66
  33. package/examples/consumer.js +0 -46
  34. package/examples/consumer_listener.js +0 -44
  35. package/examples/consumer_tls_auth.js +0 -51
  36. package/examples/consummer_token_auth.js +0 -50
  37. package/examples/consummer_token_auth_supplier.js +0 -56
  38. package/examples/custom_logger.js +0 -60
  39. package/examples/encryption-consumer.js +0 -47
  40. package/examples/encryption-producer.js +0 -50
  41. package/examples/encryption-reader.js +0 -44
  42. package/examples/producer-schema.js +0 -76
  43. package/examples/producer.js +0 -48
  44. package/examples/producer_tls_auth.js +0 -52
  45. package/examples/producer_token_auth.js +0 -48
  46. package/examples/producer_token_auth_supplier.js +0 -53
  47. package/examples/reader.js +0 -43
  48. package/examples/reader_listener.js +0 -37
  49. package/license-checker-config.json +0 -43
  50. package/license-header.txt +0 -16
  51. package/perf/perf_consumer.js +0 -103
  52. package/perf/perf_producer.js +0 -118
  53. package/pkg/linux/Dockerfile_linux_glibc +0 -31
  54. package/pkg/linux/Dockerfile_linux_musl +0 -32
  55. package/pkg/linux/build-napi-inside-docker.sh +0 -31
  56. package/pkg/linux/download-cpp-client.sh +0 -65
  57. package/pkg/load_test.js +0 -34
  58. package/pkg/mac/download-cpp-client.sh +0 -36
  59. package/pkg/windows/download-cpp-client.bat +0 -12
  60. package/tests/certificate/private-key.client-rsa.pem +0 -27
  61. package/tests/certificate/public-key.client-rsa.pem +0 -9
  62. package/tests/certificate/server.crt +0 -20
  63. package/tests/certificate/server.key +0 -28
  64. package/tests/client.test.js +0 -122
  65. package/tests/conf/standalone.conf +0 -308
  66. package/tests/consumer.test.js +0 -434
  67. package/tests/docker-load-test.sh +0 -35
  68. package/tests/end_to_end.test.js +0 -1447
  69. package/tests/http_utils.js +0 -45
  70. package/tests/load-test.sh +0 -43
  71. package/tests/producer.test.js +0 -160
  72. package/tests/reader.test.js +0 -175
  73. package/tests/run-unit-tests.sh +0 -35
  74. package/tsconfig.json +0 -22
  75. package/tslint.json +0 -9
  76. package/tstest.ts +0 -408
  77. package/typedoc.json +0 -15
package/.idea/aws.xml ADDED
@@ -0,0 +1,18 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="accountSettings">
4
+ <option name="activeProfile" value="profile:default" />
5
+ <option name="activeRegion" value="us-east-1" />
6
+ <option name="recentlyUsedProfiles">
7
+ <list>
8
+ <option value="profile:default" />
9
+ <option value="profile:support-admin" />
10
+ </list>
11
+ </option>
12
+ <option name="recentlyUsedRegions">
13
+ <list>
14
+ <option value="us-east-1" />
15
+ </list>
16
+ </option>
17
+ </component>
18
+ </project>
@@ -0,0 +1,7 @@
1
+ <component name="ProjectCodeStyleConfiguration">
2
+ <code_scheme name="Project" version="173">
3
+ <clangFormatSettings>
4
+ <option name="ENABLED" value="true" />
5
+ </clangFormatSettings>
6
+ </code_scheme>
7
+ </component>
@@ -0,0 +1,5 @@
1
+ <component name="ProjectCodeStyleConfiguration">
2
+ <state>
3
+ <option name="USE_PER_PROJECT_SETTINGS" value="true" />
4
+ </state>
5
+ </component>
@@ -0,0 +1,6 @@
1
+ <component name="InspectionProjectProfileManager">
2
+ <profile version="1.0">
3
+ <option name="myName" value="Project Default" />
4
+ <inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
5
+ </profile>
6
+ </component>
package/.idea/misc.xml ADDED
@@ -0,0 +1,7 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="Black">
4
+ <option name="sdkName" value="Python 3.10" />
5
+ </component>
6
+ <component name="CMakeWorkspace" PROJECT_DIR="$PROJECT_DIR$" />
7
+ </project>
@@ -0,0 +1,9 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="ProjectModuleManager">
4
+ <modules>
5
+ <module fileurl="file://$PROJECT_DIR$/.idea/pulsar-client-node.iml" filepath="$PROJECT_DIR$/.idea/pulsar-client-node.iml" />
6
+ <module fileurl="file://$PROJECT_DIR$/.idea/pulsar_client_node.iml" filepath="$PROJECT_DIR$/.idea/pulsar_client_node.iml" />
7
+ </modules>
8
+ </component>
9
+ </project>
@@ -0,0 +1,46 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <module type="WEB_MODULE" version="4">
3
+ <component name="FacetManager">
4
+ <facet type="Python" name="Python facet">
5
+ <configuration sdkName="Python 3.13 virtualenv at ~/baodi-py" />
6
+ </facet>
7
+ </component>
8
+ <component name="NewModuleRootManager">
9
+ <content url="file://$MODULE_DIR$">
10
+ <excludeFolder url="file://$MODULE_DIR$/temp" />
11
+ <excludeFolder url="file://$MODULE_DIR$/.tmp" />
12
+ <excludeFolder url="file://$MODULE_DIR$/tmp" />
13
+ <excludeFolder url="file://$MODULE_DIR$/CMakeFiles" />
14
+ <excludeFolder url="file://$MODULE_DIR$/CMakeFiles" />
15
+ <excludeFolder url="file://$MODULE_DIR$/cmake-build-debug" />
16
+ <excludeFolder url="file://$MODULE_DIR$/cmake-build-debug" />
17
+ <excludeFolder url="file://$MODULE_DIR$/CMakeFiles" />
18
+ <excludeFolder url="file://$MODULE_DIR$/CMakeFiles" />
19
+ <excludeFolder url="file://$MODULE_DIR$/cmake-build-debug" />
20
+ <excludeFolder url="file://$MODULE_DIR$/cmake-build-debug" />
21
+ <excludeFolder url="file://$MODULE_DIR$/CMakeFiles" />
22
+ <excludeFolder url="file://$MODULE_DIR$/cmake-build-debug" />
23
+ <excludeFolder url="file://$MODULE_DIR$/CMakeFiles" />
24
+ <excludeFolder url="file://$MODULE_DIR$/cmake-build-debug" />
25
+ <excludeFolder url="file://$MODULE_DIR$/CMakeFiles" />
26
+ <excludeFolder url="file://$MODULE_DIR$/cmake-build-debug" />
27
+ <excludeFolder url="file://$MODULE_DIR$/CMakeFiles" />
28
+ <excludeFolder url="file://$MODULE_DIR$/cmake-build-debug" />
29
+ <excludeFolder url="file://$MODULE_DIR$/CMakeFiles" />
30
+ <excludeFolder url="file://$MODULE_DIR$/cmake-build-debug" />
31
+ <excludeFolder url="file://$MODULE_DIR$/CMakeFiles" />
32
+ <excludeFolder url="file://$MODULE_DIR$/CMakeFiles" />
33
+ <excludeFolder url="file://$MODULE_DIR$/cmake-build-debug" />
34
+ <excludeFolder url="file://$MODULE_DIR$/cmake-build-debug" />
35
+ <excludeFolder url="file://$MODULE_DIR$/CMakeFiles" />
36
+ <excludeFolder url="file://$MODULE_DIR$/CMakeFiles" />
37
+ <excludeFolder url="file://$MODULE_DIR$/cmake-build-debug" />
38
+ <excludeFolder url="file://$MODULE_DIR$/cmake-build-debug" />
39
+ <excludeFolder url="file://$MODULE_DIR$/CMakeFiles" />
40
+ <excludeFolder url="file://$MODULE_DIR$/cmake-build-debug" />
41
+ </content>
42
+ <orderEntry type="inheritedJdk" />
43
+ <orderEntry type="sourceFolder" forTests="false" />
44
+ <orderEntry type="library" name="Python 3.13 virtualenv at ~/baodi-py interpreter library" level="application" />
45
+ </component>
46
+ </module>
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <module classpath="CMake" type="CPP_MODULE" version="4">
3
+ <component name="FacetManager">
4
+ <facet type="Python" name="Python facet">
5
+ <configuration sdkName="Python 3.13 virtualenv at ~/baodi-py" />
6
+ </facet>
7
+ </component>
8
+ </module>
package/.idea/vcs.xml ADDED
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="VcsDirectoryMappings">
4
+ <mapping directory="$PROJECT_DIR$" vcs="Git" />
5
+ </component>
6
+ </project>
package/index.d.ts CHANGED
@@ -103,6 +103,7 @@ export interface ConsumerConfig {
103
103
  regexSubscriptionMode?: RegexSubscriptionMode;
104
104
  deadLetterPolicy?: DeadLetterPolicy;
105
105
  batchReceivePolicy?: ConsumerBatchReceivePolicy;
106
+ keySharedPolicy?: KeySharedPolicy;
106
107
  }
107
108
 
108
109
  export class Consumer {
@@ -194,6 +195,18 @@ export interface ConsumerBatchReceivePolicy {
194
195
  timeoutMs?: number;
195
196
  }
196
197
 
198
+ export interface ConsumerKeyShareStickyRange {
199
+ start: number;
200
+ end: number;
201
+ }
202
+ export type ConsumerKeyShareStickyRanges = ConsumerKeyShareStickyRange[];
203
+
204
+ export interface KeySharedPolicy {
205
+ keyShareMode?: ConsumerKeyShareMode;
206
+ allowOutOfOrderDelivery?: boolean;
207
+ stickyRanges?: ConsumerKeyShareStickyRanges;
208
+ }
209
+
197
210
  export class AuthenticationTls {
198
211
  constructor(params: { certificatePath: string, privateKeyPath: string });
199
212
  }
@@ -296,6 +309,10 @@ export type ConsumerCryptoFailureAction =
296
309
  'DISCARD' |
297
310
  'CONSUME';
298
311
 
312
+ export type ConsumerKeyShareMode =
313
+ 'AutoSplit' |
314
+ 'Sticky';
315
+
299
316
  export type RegexSubscriptionMode =
300
317
  'PersistentOnly' |
301
318
  'NonPersistentOnly' |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pulsar-client",
3
- "version": "1.13.2-rc.1",
3
+ "version": "1.14.0-rc.1",
4
4
  "description": "Pulsar Node.js client",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
package/src/Client.cc CHANGED
@@ -144,7 +144,8 @@ Client::Client(const Napi::CallbackInfo &info) : Napi::ObjectWrap<Client>(info)
144
144
  if (clientConfig.Has(CFG_AUTH) && clientConfig.Get(CFG_AUTH).IsObject()) {
145
145
  Napi::Object obj = clientConfig.Get(CFG_AUTH).ToObject();
146
146
  if (obj.Has(CFG_AUTH_PROP) && obj.Get(CFG_AUTH_PROP).IsObject()) {
147
- Authentication *auth = Authentication::Unwrap(obj.Get(CFG_AUTH_PROP).ToObject());
147
+ this->authRef_ = Napi::Persistent(obj.Get(CFG_AUTH_PROP).As<Napi::Object>());
148
+ Authentication *auth = Authentication::Unwrap(this->authRef_.Value());
148
149
  pulsar_client_configuration_set_auth(cClientConfig.get(), auth->GetCAuthentication());
149
150
  }
150
151
  }
package/src/Client.h CHANGED
@@ -54,6 +54,7 @@ class Client : public Napi::ObjectWrap<Client> {
54
54
  std::shared_ptr<pulsar_client_t> cClient;
55
55
  std::shared_ptr<pulsar_client_configuration_t> cClientConfig;
56
56
  pulsar_logger_level_t logLevel = pulsar_logger_level_t::pulsar_INFO;
57
+ Napi::ObjectReference authRef_;
57
58
 
58
59
  Napi::Value CreateProducer(const Napi::CallbackInfo &info);
59
60
  Napi::Value Subscribe(const Napi::CallbackInfo &info);
@@ -21,6 +21,7 @@
21
21
  #include "Consumer.h"
22
22
  #include "SchemaInfo.h"
23
23
  #include "Message.h"
24
+ #include "pulsar/ConsumerConfiguration.h"
24
25
  #include <pulsar/c/consumer_configuration.h>
25
26
  #include <pulsar/c/consumer.h>
26
27
  #include <map>
@@ -55,6 +56,10 @@ static const std::string CFG_BATCH_RECEIVE_POLICY = "batchReceivePolicy";
55
56
  static const std::string CFG_BATCH_RECEIVE_POLICY_MAX_NUM_MESSAGES = "maxNumMessages";
56
57
  static const std::string CFG_BATCH_RECEIVE_POLICY_MAX_NUM_BYTES = "maxNumBytes";
57
58
  static const std::string CFG_BATCH_RECEIVE_POLICY_TIMEOUT_MS = "timeoutMs";
59
+ static const std::string CFG_KEY_SHARED_POLICY = "keySharedPolicy";
60
+ static const std::string CFG_KEY_SHARED_POLICY_MODE = "keyShareMode";
61
+ static const std::string CFG_KEY_SHARED_POLICY_ALLOW_OUT_OF_ORDER = "allowOutOfOrderDelivery";
62
+ static const std::string CFG_KEY_SHARED_POLICY_STICKY_RANGES = "stickyRanges";
58
63
 
59
64
  static const std::map<std::string, pulsar_consumer_type> SUBSCRIPTION_TYPE = {
60
65
  {"Exclusive", pulsar_ConsumerExclusive},
@@ -76,6 +81,15 @@ static const std::map<std::string, pulsar_consumer_crypto_failure_action> CONSUM
76
81
  {"CONSUME", pulsar_ConsumerConsume},
77
82
  };
78
83
 
84
+ static const std::map<std::string, pulsar::KeySharedMode> CONSUMER_KEY_SHARED_POLICY_MODE = {
85
+ {"AutoSplit", pulsar::KeySharedMode::AUTO_SPLIT},
86
+ {"Sticky", pulsar::KeySharedMode::STICKY},
87
+ };
88
+
89
+ struct _pulsar_consumer_configuration {
90
+ pulsar::ConsumerConfiguration consumerConfiguration;
91
+ };
92
+
79
93
  void FinalizeListenerCallback(Napi::Env env, MessageListenerCallback *cb, void *) { delete cb; }
80
94
 
81
95
  ConsumerConfig::ConsumerConfig()
@@ -324,6 +338,58 @@ void ConsumerConfig::InitConfig(std::shared_ptr<ThreadSafeDeferred> deferred,
324
338
  return;
325
339
  }
326
340
  }
341
+
342
+ if (consumerConfig.Has(CFG_KEY_SHARED_POLICY) && consumerConfig.Get(CFG_KEY_SHARED_POLICY).IsObject()) {
343
+ Napi::Object propObj = consumerConfig.Get(CFG_KEY_SHARED_POLICY).ToObject();
344
+ pulsar::KeySharedPolicy cppKeySharedPolicy;
345
+
346
+ if (propObj.Has(CFG_KEY_SHARED_POLICY_MODE) && propObj.Get(CFG_KEY_SHARED_POLICY_MODE).IsString()) {
347
+ std::string keyShareModeStr = propObj.Get(CFG_KEY_SHARED_POLICY_MODE).ToString().Utf8Value();
348
+ if (CONSUMER_KEY_SHARED_POLICY_MODE.count(keyShareModeStr)) {
349
+ cppKeySharedPolicy.setKeySharedMode(CONSUMER_KEY_SHARED_POLICY_MODE.at(keyShareModeStr));
350
+ }
351
+ }
352
+
353
+ if (propObj.Has(CFG_KEY_SHARED_POLICY_ALLOW_OUT_OF_ORDER) &&
354
+ propObj.Get(CFG_KEY_SHARED_POLICY_ALLOW_OUT_OF_ORDER).IsBoolean()) {
355
+ bool allowOutOfOrderDelivery = propObj.Get(CFG_KEY_SHARED_POLICY_ALLOW_OUT_OF_ORDER).ToBoolean();
356
+ cppKeySharedPolicy.setAllowOutOfOrderDelivery(allowOutOfOrderDelivery);
357
+ }
358
+
359
+ if (propObj.Has(CFG_KEY_SHARED_POLICY_STICKY_RANGES) &&
360
+ propObj.Get(CFG_KEY_SHARED_POLICY_STICKY_RANGES).IsArray()) {
361
+ Napi::Array rangesArray = propObj.Get(CFG_KEY_SHARED_POLICY_STICKY_RANGES).As<Napi::Array>();
362
+ pulsar::StickyRanges stickyRanges;
363
+ for (uint32_t i = 0; i < rangesArray.Length(); i++) {
364
+ if (rangesArray.Get(i).IsObject()) {
365
+ Napi::Object rangeObj = rangesArray.Get(i).ToObject();
366
+ if (rangeObj.Has("start") && rangeObj.Has("end") && rangeObj.Get("start").IsNumber() &&
367
+ rangeObj.Get("end").IsNumber()) {
368
+ int start = rangeObj.Get("start").ToNumber().Int32Value();
369
+ int end = rangeObj.Get("end").ToNumber().Int32Value();
370
+ if (start > end) {
371
+ std::string error = "Invalid sticky range at index " + std::to_string(i) + ": start (" +
372
+ std::to_string(start) + ") > end (" + std::to_string(end) + ")";
373
+ deferred->Reject(error);
374
+ return;
375
+ }
376
+ stickyRanges.emplace_back(start, end);
377
+ } else {
378
+ std::string error = "Invalid sticky range format at index " + std::to_string(i) +
379
+ ": missing 'start'/'end' or invalid type, should be number type";
380
+ deferred->Reject(error);
381
+ return;
382
+ }
383
+ } else {
384
+ std::string error = "Sticky range element at index " + std::to_string(i) + " is not an object";
385
+ deferred->Reject(error);
386
+ return;
387
+ }
388
+ }
389
+ cppKeySharedPolicy.setStickyRanges(stickyRanges);
390
+ }
391
+ this->cConsumerConfig.get()->consumerConfiguration.setKeySharedPolicy(cppKeySharedPolicy);
392
+ }
327
393
  }
328
394
 
329
395
  ConsumerConfig::~ConsumerConfig() {