pulsar-client 1.13.2 → 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.
- package/.idea/aws.xml +18 -0
- package/.idea/codeStyles/Project.xml +7 -0
- package/.idea/codeStyles/codeStyleConfig.xml +5 -0
- package/.idea/inspectionProfiles/Project_Default.xml +6 -0
- package/.idea/misc.xml +7 -0
- package/.idea/modules.xml +9 -0
- package/.idea/pulsar-client-node.iml +46 -0
- package/.idea/pulsar_client_node.iml +8 -0
- package/.idea/vcs.xml +6 -0
- package/index.d.ts +17 -0
- package/package.json +1 -1
- package/src/Client.cc +2 -1
- package/src/Client.h +1 -0
- package/src/ConsumerConfig.cc +66 -0
- package/src/cert.pem +3278 -0
- package/.clang-format +0 -26
- package/.eslintignore +0 -21
- package/.eslintrc.json +0 -22
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -85
- package/.github/workflows/ci-build-release-napi.yml +0 -211
- package/.github/workflows/ci-pr-validation.yml +0 -334
- package/build-support/download-release-artifacts.py +0 -77
- package/build-support/generate-source-archive.sh +0 -28
- package/build-support/pulsar-test-container-start.sh +0 -43
- package/build-support/pulsar-test-service-start.sh +0 -39
- package/build-support/pulsar-test-service-stop.sh +0 -32
- package/build-support/sign-files.sh +0 -32
- package/build-support/stage-release.sh +0 -44
- package/docs/release-process.md +0 -291
- package/examples/certificate/private-key.client-rsa.pem +0 -27
- package/examples/certificate/public-key.client-rsa.pem +0 -9
- package/examples/consumer-schema.js +0 -66
- package/examples/consumer.js +0 -46
- package/examples/consumer_listener.js +0 -44
- package/examples/consumer_tls_auth.js +0 -51
- package/examples/consummer_token_auth.js +0 -50
- package/examples/consummer_token_auth_supplier.js +0 -56
- package/examples/custom_logger.js +0 -60
- package/examples/encryption-consumer.js +0 -47
- package/examples/encryption-producer.js +0 -50
- package/examples/encryption-reader.js +0 -44
- package/examples/producer-schema.js +0 -76
- package/examples/producer.js +0 -48
- package/examples/producer_tls_auth.js +0 -52
- package/examples/producer_token_auth.js +0 -48
- package/examples/producer_token_auth_supplier.js +0 -53
- package/examples/reader.js +0 -43
- package/examples/reader_listener.js +0 -37
- package/license-checker-config.json +0 -43
- package/license-header.txt +0 -16
- package/perf/perf_consumer.js +0 -103
- package/perf/perf_producer.js +0 -118
- package/pkg/linux/Dockerfile_linux_glibc +0 -31
- package/pkg/linux/Dockerfile_linux_musl +0 -32
- package/pkg/linux/build-napi-inside-docker.sh +0 -31
- package/pkg/linux/download-cpp-client.sh +0 -65
- package/pkg/load_test.js +0 -34
- package/pkg/mac/download-cpp-client.sh +0 -36
- package/pkg/windows/download-cpp-client.bat +0 -12
- package/tests/certificate/private-key.client-rsa.pem +0 -27
- package/tests/certificate/public-key.client-rsa.pem +0 -9
- package/tests/certificate/server.crt +0 -20
- package/tests/certificate/server.key +0 -28
- package/tests/client.test.js +0 -122
- package/tests/conf/standalone.conf +0 -308
- package/tests/consumer.test.js +0 -434
- package/tests/docker-load-test.sh +0 -35
- package/tests/end_to_end.test.js +0 -1447
- package/tests/http_utils.js +0 -45
- package/tests/load-test.sh +0 -43
- package/tests/producer.test.js +0 -160
- package/tests/reader.test.js +0 -175
- package/tests/run-unit-tests.sh +0 -35
- package/tsconfig.json +0 -22
- package/tslint.json +0 -9
- package/tstest.ts +0 -408
- 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>
|
package/.idea/misc.xml
ADDED
|
@@ -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
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
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
|
-
|
|
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);
|
package/src/ConsumerConfig.cc
CHANGED
|
@@ -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() {
|