hazelcast-client
Version:
Hazelcast - open source In-Memory Data Grid - client for NodeJS
191 lines • 9.94 kB
JavaScript
"use strict";
/*
* Copyright (c) 2008-2018, Hazelcast, Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
Object.defineProperty(exports, "__esModule", { value: true });
var Promise = require("bluebird");
var MapProxy_1 = require("./MapProxy");
var SetProxy_1 = require("./SetProxy");
var ClientCreateProxyCodec_1 = require("../codec/ClientCreateProxyCodec");
var ClientDestroyProxyCodec_1 = require("../codec/ClientDestroyProxyCodec");
var ClientAddDistributedObjectListenerCodec_1 = require("../codec/ClientAddDistributedObjectListenerCodec");
var ClientRemoveDistributedObjectListenerCodec_1 = require("../codec/ClientRemoveDistributedObjectListenerCodec");
var QueueProxy_1 = require("./QueueProxy");
var ListProxy_1 = require("./ListProxy");
var LockProxy_1 = require("./LockProxy");
var MultiMapProxy_1 = require("./MultiMapProxy");
var RingbufferProxy_1 = require("./ringbuffer/RingbufferProxy");
var ReplicatedMapProxy_1 = require("./ReplicatedMapProxy");
var NearCachedMapProxy_1 = require("./NearCachedMapProxy");
var SemaphoreProxy_1 = require("./SemaphoreProxy");
var AtomicLongProxy_1 = require("./AtomicLongProxy");
var LoggingService_1 = require("../logging/LoggingService");
var InvocationService_1 = require("../invocation/InvocationService");
var HazelcastError_1 = require("../HazelcastError");
var FlakeIdGeneratorProxy_1 = require("./FlakeIdGeneratorProxy");
var PNCounterProxy_1 = require("./PNCounterProxy");
var ReliableTopicProxy_1 = require("./topic/ReliableTopicProxy");
var ProxyManager = /** @class */ (function () {
function ProxyManager(client) {
this.service = {};
this.proxies = {};
this.logger = LoggingService_1.LoggingService.getLoggingService();
this.client = client;
this.invocationTimeoutMillis = this.client.getInvocationService().getInvocationTimeoutMillis();
this.invocationRetryPauseMillis = this.client.getInvocationService().getInvocationRetryPauseMillis();
}
ProxyManager.prototype.init = function () {
this.service[ProxyManager.MAP_SERVICE] = MapProxy_1.MapProxy;
this.service[ProxyManager.SET_SERVICE] = SetProxy_1.SetProxy;
this.service[ProxyManager.QUEUE_SERVICE] = QueueProxy_1.QueueProxy;
this.service[ProxyManager.LIST_SERVICE] = ListProxy_1.ListProxy;
this.service[ProxyManager.LOCK_SERVICE] = LockProxy_1.LockProxy;
this.service[ProxyManager.MULTIMAP_SERVICE] = MultiMapProxy_1.MultiMapProxy;
this.service[ProxyManager.RINGBUFFER_SERVICE] = RingbufferProxy_1.RingbufferProxy;
this.service[ProxyManager.REPLICATEDMAP_SERVICE] = ReplicatedMapProxy_1.ReplicatedMapProxy;
this.service[ProxyManager.SEMAPHORE_SERVICE] = SemaphoreProxy_1.SemaphoreProxy;
this.service[ProxyManager.ATOMICLONG_SERVICE] = AtomicLongProxy_1.AtomicLongProxy;
this.service[ProxyManager.FLAKEID_SERVICE] = FlakeIdGeneratorProxy_1.FlakeIdGeneratorProxy;
this.service[ProxyManager.PNCOUNTER_SERVICE] = PNCounterProxy_1.PNCounterProxy;
this.service[ProxyManager.RELIABLETOPIC_SERVICE] = ReliableTopicProxy_1.ReliableTopicProxy;
};
ProxyManager.prototype.getOrCreateProxy = function (name, serviceName, createAtServer) {
if (createAtServer === void 0) { createAtServer = true; }
if (this.proxies[name]) {
return this.proxies[name];
}
else {
var newProxy = void 0;
if (serviceName === ProxyManager.MAP_SERVICE && this.client.getConfig().getNearCacheConfig(name)) {
newProxy = new NearCachedMapProxy_1.NearCachedMapProxy(this.client, serviceName, name);
}
else {
newProxy = new this.service[serviceName](this.client, serviceName, name);
}
if (createAtServer) {
this.createProxy(newProxy);
}
this.proxies[name] = newProxy;
return newProxy;
}
};
ProxyManager.prototype.createProxy = function (proxyObject) {
var promise = Promise.defer();
this.initializeProxy(proxyObject, promise, Date.now() + this.invocationTimeoutMillis);
return promise.promise;
};
ProxyManager.prototype.findNextAddress = function () {
var members = this.client.getClusterService().getMembers();
var liteMember = null;
for (var i = 0; i < members.length; i++) {
var currentMember = members[i];
if (currentMember != null && currentMember.isLiteMember === false) {
return currentMember.address;
}
else if (currentMember != null && currentMember.isLiteMember) {
liteMember = currentMember;
}
}
if (liteMember != null) {
return liteMember.address;
}
else {
return null;
}
};
ProxyManager.prototype.initializeProxy = function (proxyObject, promise, deadline) {
var _this = this;
if (Date.now() <= deadline) {
var address = this.findNextAddress();
var request = ClientCreateProxyCodec_1.ClientCreateProxyCodec.encodeRequest(proxyObject.getName(), proxyObject.getServiceName(), address);
var invocation = new InvocationService_1.Invocation(this.client, request);
invocation.address = address;
this.client.getInvocationService().invoke(invocation).then(function (response) {
promise.resolve(response);
}).catch(function (error) {
if (_this.isRetryable(error)) {
_this.logger.warn('ProxyManager', 'Create proxy request for ' + proxyObject.getName() +
' failed. Retrying in ' + _this.invocationRetryPauseMillis + 'ms. ' + error);
setTimeout(_this.initializeProxy.bind(_this, proxyObject, promise, deadline), _this.invocationRetryPauseMillis);
}
else {
_this.logger.warn('ProxyManager', 'Create proxy request for ' + proxyObject.getName() + ' failed ' + error);
}
});
}
else {
promise.reject('Create proxy request timed-out for ' + proxyObject.getName());
}
};
ProxyManager.prototype.isRetryable = function (error) {
if (error instanceof HazelcastError_1.ClientNotActiveError) {
return false;
}
return true;
};
ProxyManager.prototype.destroyProxy = function (name, serviceName) {
delete this.proxies[name];
var clientMessage = ClientDestroyProxyCodec_1.ClientDestroyProxyCodec.encodeRequest(name, serviceName);
clientMessage.setPartitionId(-1);
return this.client.getInvocationService().invokeOnRandomTarget(clientMessage).return();
};
ProxyManager.prototype.addDistributedObjectListener = function (listenerFunc) {
var handler = function (clientMessage) {
var converterFunc = function (name, serviceName, eventType) {
if (eventType === 'CREATED') {
listenerFunc(name, serviceName, 'created');
}
else if (eventType === 'DESTROYED') {
listenerFunc(name, serviceName, 'destroyed');
}
};
ClientAddDistributedObjectListenerCodec_1.ClientAddDistributedObjectListenerCodec.handle(clientMessage, converterFunc, null);
};
var codec = this.createDistributedObjectListener();
return this.client.getListenerService().registerListener(codec, handler);
};
ProxyManager.prototype.removeDistributedObjectListener = function (listenerId) {
return this.client.getListenerService().deregisterListener(listenerId);
};
ProxyManager.prototype.createDistributedObjectListener = function () {
return {
encodeAddRequest: function (localOnly) {
return ClientAddDistributedObjectListenerCodec_1.ClientAddDistributedObjectListenerCodec.encodeRequest(localOnly);
},
decodeAddResponse: function (msg) {
return ClientAddDistributedObjectListenerCodec_1.ClientAddDistributedObjectListenerCodec.decodeResponse(msg).response;
},
encodeRemoveRequest: function (listenerId) {
return ClientRemoveDistributedObjectListenerCodec_1.ClientRemoveDistributedObjectListenerCodec.encodeRequest(listenerId);
}
};
};
ProxyManager.MAP_SERVICE = 'hz:impl:mapService';
ProxyManager.SET_SERVICE = 'hz:impl:setService';
ProxyManager.LOCK_SERVICE = 'hz:impl:lockService';
ProxyManager.QUEUE_SERVICE = 'hz:impl:queueService';
ProxyManager.LIST_SERVICE = 'hz:impl:listService';
ProxyManager.MULTIMAP_SERVICE = 'hz:impl:multiMapService';
ProxyManager.RINGBUFFER_SERVICE = 'hz:impl:ringbufferService';
ProxyManager.REPLICATEDMAP_SERVICE = 'hz:impl:replicatedMapService';
ProxyManager.SEMAPHORE_SERVICE = 'hz:impl:semaphoreService';
ProxyManager.ATOMICLONG_SERVICE = 'hz:impl:atomicLongService';
ProxyManager.FLAKEID_SERVICE = 'hz:impl:flakeIdGeneratorService';
ProxyManager.PNCOUNTER_SERVICE = 'hz:impl:PNCounterService';
ProxyManager.RELIABLETOPIC_SERVICE = 'hz:impl:reliableTopicService';
return ProxyManager;
}());
exports.ProxyManager = ProxyManager;
//# sourceMappingURL=ProxyManager.js.map