@celerispay/hazelcast-client 3.12.5-5 → 3.12.5-7

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.
@@ -47,6 +47,10 @@ export declare class ClusterService {
47
47
  */
48
48
  connectToCluster(): Promise<void>;
49
49
  getPossibleMemberAddresses(): Promise<string[]>;
50
+ /**
51
+ * Returns the owner connection if available
52
+ */
53
+ getOwnerConnection(): ClientConnection | null;
50
54
  /**
51
55
  * Returns the list of members in the cluster.
52
56
  * @returns
@@ -63,11 +67,6 @@ export declare class ClusterService {
63
67
  * @returns {ClientInfo}
64
68
  */
65
69
  getClientInfo(): ClientInfo;
66
- /**
67
- * Returns the connection associated with owner node of this client.
68
- * @returns {ClientConnection}
69
- */
70
- getOwnerConnection(): ClientConnection;
71
70
  /**
72
71
  * Adds MembershipListener to listen for membership updates. There is no check for duplicate registrations,
73
72
  * so if you register the listener twice, it will get events twice.
@@ -103,6 +103,12 @@ var ClusterService = /** @class */ (function () {
103
103
  return Array.from(new Set(Array.from(addresses).concat(Array.from(providerAddresses))));
104
104
  });
105
105
  };
106
+ /**
107
+ * Returns the owner connection if available
108
+ */
109
+ ClusterService.prototype.getOwnerConnection = function () {
110
+ return this.ownerConnection;
111
+ };
106
112
  /**
107
113
  * Returns the list of members in the cluster.
108
114
  * @returns
@@ -144,16 +150,15 @@ var ClusterService = /** @class */ (function () {
144
150
  ClusterService.prototype.getClientInfo = function () {
145
151
  var info = new ClientInfo_1.ClientInfo();
146
152
  info.uuid = this.uuid;
147
- info.localAddress = this.getOwnerConnection().getLocalAddress();
153
+ var ownerConnection = this.getOwnerConnection();
154
+ if (ownerConnection) {
155
+ info.localAddress = ownerConnection.getLocalAddress();
156
+ }
157
+ else {
158
+ info.localAddress = null;
159
+ }
148
160
  return info;
149
161
  };
150
- /**
151
- * Returns the connection associated with owner node of this client.
152
- * @returns {ClientConnection}
153
- */
154
- ClusterService.prototype.getOwnerConnection = function () {
155
- return this.ownerConnection;
156
- };
157
162
  /**
158
163
  * Adds MembershipListener to listen for membership updates. There is no check for duplicate registrations,
159
164
  * so if you register the listener twice, it will get events twice.
@@ -185,7 +190,11 @@ var ClusterService = /** @class */ (function () {
185
190
  var handleAttributeChange = _this.handleMemberAttributeChange.bind(_this);
186
191
  ClientAddMembershipListenerCodec_1.ClientAddMembershipListenerCodec.handle(m, handleMember, handleMemberList, handleAttributeChange, null);
187
192
  };
188
- return this.client.getInvocationService().invokeOnConnection(this.getOwnerConnection(), request, handler)
193
+ var ownerConnection = this.getOwnerConnection();
194
+ if (!ownerConnection) {
195
+ return Promise.reject(new Error('Cannot initialize membership listener: no owner connection available'));
196
+ }
197
+ return this.client.getInvocationService().invokeOnConnection(ownerConnection, request, handler)
189
198
  .then(function (resp) {
190
199
  _this.logger.trace('ClusterService', 'Registered listener with id '
191
200
  + ClientAddMembershipListenerCodec_1.ClientAddMembershipListenerCodec.decodeResponse(resp).response);
@@ -603,7 +612,7 @@ var ClusterService = /** @class */ (function () {
603
612
  // Check if we're already trying to connect to this address
604
613
  var connectionManager = this.client.getConnectionManager();
605
614
  var establishedConnections = connectionManager.getEstablishedConnections();
606
- var pendingConnections = Object.keys(connectionManager.getPendingConnections || {}).length;
615
+ var pendingConnections = Object.keys(connectionManager.getPendingConnections()).length;
607
616
  if (pendingConnections > 0) {
608
617
  this.logger.debug('ClusterService', "Already have pending connections, skipping reconnection to " + addressStr);
609
618
  return;
@@ -91,6 +91,9 @@ var ProxyManager = /** @class */ (function () {
91
91
  if (createAtServer) {
92
92
  this.createProxy(newProxy).then(function () {
93
93
  deferred.resolve(newProxy);
94
+ }).catch(function (error) {
95
+ _this.logger.error('ProxyManager', 'Failed to create proxy for ' + name + ': ' + error);
96
+ deferred.reject(error);
94
97
  });
95
98
  }
96
99
  this.proxies[fullName] = deferred.promise;
@@ -130,20 +133,32 @@ var ProxyManager = /** @class */ (function () {
130
133
  };
131
134
  ProxyManager.prototype.findNextAddress = function () {
132
135
  var members = this.client.getClusterService().getMembers();
136
+ // If no members available, return null but log the issue
137
+ if (!members || members.length === 0) {
138
+ this.logger.warn('ProxyManager', 'No cluster members available for proxy creation');
139
+ return null;
140
+ }
133
141
  var liteMember = null;
142
+ var dataMember = null;
134
143
  for (var _i = 0, members_1 = members; _i < members_1.length; _i++) {
135
144
  var member = members_1[_i];
136
145
  if (member != null && member.isLiteMember === false) {
137
- return member.address;
146
+ dataMember = member;
147
+ break; // Prefer data members
138
148
  }
139
149
  else if (member != null && member.isLiteMember) {
140
150
  liteMember = member;
141
151
  }
142
152
  }
143
- if (liteMember != null) {
153
+ // Return data member if available, otherwise lite member, otherwise null
154
+ if (dataMember != null) {
155
+ return dataMember.address;
156
+ }
157
+ else if (liteMember != null) {
144
158
  return liteMember.address;
145
159
  }
146
160
  else {
161
+ this.logger.warn('ProxyManager', 'No valid members found for proxy creation');
147
162
  return null;
148
163
  }
149
164
  };
@@ -151,6 +166,12 @@ var ProxyManager = /** @class */ (function () {
151
166
  var _this = this;
152
167
  if (Date.now() <= deadline) {
153
168
  var address = this.findNextAddress();
169
+ if (!address) {
170
+ var error = new Error('No cluster members available for proxy creation: ' + proxyObject.getName());
171
+ this.logger.error('ProxyManager', error.message);
172
+ promise.reject(error);
173
+ return;
174
+ }
154
175
  var request = ClientCreateProxyCodec_1.ClientCreateProxyCodec.encodeRequest(proxyObject.getName(), proxyObject.getServiceName(), address);
155
176
  var invocation = new InvocationService_1.Invocation(this.client, request);
156
177
  invocation.address = address;
@@ -160,10 +181,13 @@ var ProxyManager = /** @class */ (function () {
160
181
  if (_this.isRetryable(error)) {
161
182
  _this.logger.warn('ProxyManager', 'Create proxy request for ' + proxyObject.getName() +
162
183
  ' failed. Retrying in ' + _this.invocationRetryPauseMillis + 'ms. ' + error);
163
- setTimeout(_this.initializeProxy.bind(_this, proxyObject, promise, deadline), _this.invocationRetryPauseMillis);
184
+ setTimeout(function () {
185
+ _this.initializeProxy(proxyObject, promise, deadline);
186
+ }, _this.invocationRetryPauseMillis);
164
187
  }
165
188
  else {
166
- _this.logger.warn('ProxyManager', 'Create proxy request for ' + proxyObject.getName() + ' failed ' + error);
189
+ _this.logger.error('ProxyManager', 'Create proxy request for ' + proxyObject.getName() + ' failed ' + error);
190
+ promise.reject(error);
167
191
  }
168
192
  });
169
193
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@celerispay/hazelcast-client",
3
- "version": "3.12.5-5",
3
+ "version": "3.12.5-7",
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": {