@celerispay/hazelcast-client 3.12.7-2 → 3.12.7-3

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.
@@ -115,6 +115,13 @@ export declare class ClusterService {
115
115
  private tryConnectingToAddresses(index, remainingAttemptLimit, attemptPeriod, cause?);
116
116
  private handleMember(member, eventType);
117
117
  private handleMemberList(members);
118
+ /**
119
+ * Proactively opens connections to all non-owner cluster members.
120
+ * Required for smart routing: the client needs a live connection to every
121
+ * node so it can route operations to the correct partition owner.
122
+ * Failures are silently ignored — the periodic reconnection task will retry.
123
+ */
124
+ private connectToNonOwnerMembers(members);
118
125
  private detectMembershipEvents(prevMembers);
119
126
  private fireMembershipEvent(membershipEvent);
120
127
  private handleMemberAttributeChange(uuid, key, operationType, value);
@@ -467,12 +467,46 @@ var ClusterService = /** @class */ (function () {
467
467
  this.logger.info('ClusterService', 'Members received.', this.members);
468
468
  // Log current state after member list update
469
469
  this.logCurrentState();
470
+ // In smart routing mode, proactively open connections to all non-owner members
471
+ // so that partition-aware routing can work across all nodes.
472
+ if (this.client.getConfig().networkConfig.smartRouting) {
473
+ this.connectToNonOwnerMembers(members);
474
+ }
470
475
  var events = this.detectMembershipEvents(prevMembers);
471
476
  for (var _i = 0, events_1 = events; _i < events_1.length; _i++) {
472
477
  var event = events_1[_i];
473
478
  this.fireMembershipEvent(event);
474
479
  }
475
480
  };
481
+ /**
482
+ * Proactively opens connections to all non-owner cluster members.
483
+ * Required for smart routing: the client needs a live connection to every
484
+ * node so it can route operations to the correct partition owner.
485
+ * Failures are silently ignored — the periodic reconnection task will retry.
486
+ */
487
+ ClusterService.prototype.connectToNonOwnerMembers = function (members) {
488
+ var _this = this;
489
+ var ownerAddress = this.ownerConnection ? this.ownerConnection.getAddress().toString() : null;
490
+ members.forEach(function (member) {
491
+ var memberAddressStr = member.address.toString();
492
+ // Skip the owner — already connected
493
+ if (memberAddressStr === ownerAddress) {
494
+ return;
495
+ }
496
+ // Skip if already connected
497
+ if (_this.client.getConnectionManager().hasConnection(member.address)) {
498
+ return;
499
+ }
500
+ _this.logger.info('ClusterService', "\uD83D\uDD17 SMART-ROUTING: Opening connection to non-owner member " + memberAddressStr);
501
+ _this.client.getConnectionManager().getOrConnect(member.address, false)
502
+ .then(function () {
503
+ _this.logger.info('ClusterService', "\u2705 SMART-ROUTING: Connected to member " + memberAddressStr);
504
+ })
505
+ .catch(function (err) {
506
+ _this.logger.warn('ClusterService', "\u26A0\uFE0F SMART-ROUTING: Could not connect to member " + memberAddressStr + ": " + err.message);
507
+ });
508
+ });
509
+ };
476
510
  ClusterService.prototype.detectMembershipEvents = function (prevMembers) {
477
511
  var events = [];
478
512
  var eventMembers = Array.from(this.members);
@@ -572,6 +606,7 @@ var ClusterService = /** @class */ (function () {
572
606
  * @param member The member that was added
573
607
  */
574
608
  ClusterService.prototype.handleMemberAdded = function (member) {
609
+ var _this = this;
575
610
  this.logger.info('ClusterService', "\u2705 SERVER CONFIRMED: Member[ uuid: " + member.uuid + ", address: " + member.address.toString() + "] added to cluster");
576
611
  // SERVER-FIRST: Store server data as credentials
577
612
  // The server is the authority - we store what it tells us
@@ -607,6 +642,22 @@ var ClusterService = /** @class */ (function () {
607
642
  // Refresh partition table (KEEPING REFRESH METHOD UNTOUCHED as requested)
608
643
  this.client.getPartitionService().refresh();
609
644
  this.logger.info('ClusterService', "\u2705 SERVER-FIRST: Member " + member.uuid + " at " + member.address.toString() + " credentials stored from server data");
645
+ // In smart routing mode, proactively open a connection to this member
646
+ // so it is immediately available for partition-aware routing.
647
+ if (this.client.getConfig().networkConfig.smartRouting) {
648
+ var ownerAddress = this.ownerConnection ? this.ownerConnection.getAddress().toString() : null;
649
+ var memberAddressStr_1 = member.address.toString();
650
+ if (memberAddressStr_1 !== ownerAddress && !this.client.getConnectionManager().hasConnection(member.address)) {
651
+ this.logger.info('ClusterService', "\uD83D\uDD17 SMART-ROUTING: Opening connection to newly joined member " + memberAddressStr_1);
652
+ this.client.getConnectionManager().getOrConnect(member.address, false)
653
+ .then(function () {
654
+ _this.logger.info('ClusterService', "\u2705 SMART-ROUTING: Connected to newly joined member " + memberAddressStr_1);
655
+ })
656
+ .catch(function (err) {
657
+ _this.logger.warn('ClusterService', "\u26A0\uFE0F SMART-ROUTING: Could not connect to newly joined member " + memberAddressStr_1 + ": " + err.message);
658
+ });
659
+ }
660
+ }
610
661
  };
611
662
  /**
612
663
  * Finds the current owner from the cluster state
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@celerispay/hazelcast-client",
3
- "version": "3.12.7-2",
3
+ "version": "3.12.7-3",
4
4
  "description": "Hazelcast - open source In-Memory Data Grid - client for NodeJS with critical connection failover fixes",
5
5
  "main": "./lib/index.js",
6
6
  "scripts": {