2121#include " Consumer.h"
2222#include " SchemaInfo.h"
2323#include " Message.h"
24+ #include " pulsar/ConsumerConfiguration.h"
2425#include < pulsar/c/consumer_configuration.h>
2526#include < pulsar/c/consumer.h>
2627#include < map>
@@ -55,6 +56,10 @@ static const std::string CFG_BATCH_RECEIVE_POLICY = "batchReceivePolicy";
5556static const std::string CFG_BATCH_RECEIVE_POLICY_MAX_NUM_MESSAGES = " maxNumMessages" ;
5657static const std::string CFG_BATCH_RECEIVE_POLICY_MAX_NUM_BYTES = " maxNumBytes" ;
5758static 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" ;
5863
5964static const std::map<std::string, pulsar_consumer_type> SUBSCRIPTION_TYPE = {
6065 {" Exclusive" , pulsar_ConsumerExclusive},
@@ -76,6 +81,15 @@ static const std::map<std::string, pulsar_consumer_crypto_failure_action> CONSUM
7681 {" CONSUME" , pulsar_ConsumerConsume},
7782};
7883
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+
7993void FinalizeListenerCallback (Napi::Env env, MessageListenerCallback *cb, void *) { delete cb; }
8094
8195ConsumerConfig::ConsumerConfig ()
@@ -324,6 +338,58 @@ void ConsumerConfig::InitConfig(std::shared_ptr<ThreadSafeDeferred> deferred,
324338 return ;
325339 }
326340 }
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+ }
327393}
328394
329395ConsumerConfig::~ConsumerConfig () {
0 commit comments