hazelcast-client
Version:
Hazelcast - open source In-Memory Data Grid - client for NodeJS
118 lines • 5.27 kB
JavaScript
"use strict";
var Promise = require("bluebird");
var UuidUtil_1 = require("../../util/UuidUtil");
var ReliableTopicListenerRunner_1 = require("./ReliableTopicListenerRunner");
var RawTopicMessage_1 = require("./RawTopicMessage");
var OverflowPolicy_1 = require("../../core/OverflowPolicy");
var TopicOverloadPolicy_1 = require("./TopicOverloadPolicy");
var Long = require("long");
exports.RINGBUFFER_PREFIX = '_hz_rb_';
exports.TOPIC_INITIAL_BACKOFF = 100;
exports.TOPIC_MAX_BACKOFF = 2000;
var ReliableTopicProxy = (function () {
function ReliableTopicProxy(name, client) {
this.runners = {};
this.ringbuffer = client.getRingbuffer(exports.RINGBUFFER_PREFIX + name);
this.localAddress = client.getClusterService().getClientInfo().localAddress;
var configs = client.getConfig().reliableTopicConfigs;
var config = configs[name] || configs['default'];
this.batchSize = config.readBatchSize;
this.overloadPolicy = config.overloadPolicy;
this.serializationService = client.getSerializationService();
this.name = name;
}
ReliableTopicProxy.prototype.addMessageListener = function (listener) {
var listenerId = UuidUtil_1.UuidUtil.generate();
var runner = new ReliableTopicListenerRunner_1.ReliableTopicListenerRunner(listenerId, listener, this.ringbuffer, this.batchSize, this.serializationService, this);
this.runners[listenerId] = runner;
this.ringbuffer.tailSequence().then(function (sequence) {
runner.sequenceNumber = sequence.toNumber() + 1;
runner.next();
});
return listenerId;
};
ReliableTopicProxy.prototype.removeMessageListener = function (id) {
var runner = this.runners[id];
if (!runner) {
return false;
}
runner.cancel();
delete this.runners[id];
return true;
};
ReliableTopicProxy.prototype.publish = function (message) {
var reliableTopicMessage = new RawTopicMessage_1.RawTopicMessage();
reliableTopicMessage.payload = this.serializationService.toData(message);
reliableTopicMessage.publishTime = Long.fromNumber(new Date().getTime());
reliableTopicMessage.publisherAddress = this.localAddress;
switch (this.overloadPolicy) {
case TopicOverloadPolicy_1.TopicOverloadPolicy.ERROR:
return this.addWithError(reliableTopicMessage);
case TopicOverloadPolicy_1.TopicOverloadPolicy.DISCARD_NEWEST:
return this.addOrDiscard(reliableTopicMessage);
case TopicOverloadPolicy_1.TopicOverloadPolicy.DISCARD_OLDEST:
return this.addOrOverwrite(reliableTopicMessage);
case TopicOverloadPolicy_1.TopicOverloadPolicy.BLOCK:
return this.addWithBackoff(reliableTopicMessage);
default:
throw new Error('Unknown overload policy');
}
};
ReliableTopicProxy.prototype.addOrDiscard = function (reliableTopicMessage) {
return this.ringbuffer.add(reliableTopicMessage, OverflowPolicy_1.OverflowPolicy.FAIL).then(function () {
return null;
});
};
ReliableTopicProxy.prototype.addWithError = function (reliableTopicMessage) {
return this.ringbuffer.add(reliableTopicMessage, OverflowPolicy_1.OverflowPolicy.FAIL).then(function (seq) {
if (seq.toNumber() === -1) {
throw new Error('Failed to add an item to the topic');
}
return null;
});
};
ReliableTopicProxy.prototype.addOrOverwrite = function (reliableTopicMessage) {
return this.ringbuffer.add(reliableTopicMessage, OverflowPolicy_1.OverflowPolicy.OVERWRITE).then(function () {
return null;
});
};
ReliableTopicProxy.prototype.addWithBackoff = function (reliableTopicMessage) {
var resolve;
var promise = new Promise(function () {
resolve = arguments[0];
});
this.trySendMessage(reliableTopicMessage, exports.TOPIC_INITIAL_BACKOFF, resolve);
return promise;
};
ReliableTopicProxy.prototype.trySendMessage = function (message, delay, resolve) {
var _this = this;
this.ringbuffer.add(message, OverflowPolicy_1.OverflowPolicy.FAIL).then(function (seq) {
if (seq.toNumber() === -1) {
var newDelay = delay *= 2;
if (newDelay > exports.TOPIC_MAX_BACKOFF) {
newDelay = exports.TOPIC_MAX_BACKOFF;
}
_this.trySendMessage(message, newDelay, resolve);
}
else {
resolve();
}
});
};
ReliableTopicProxy.prototype.getRingbuffer = function () {
return this.ringbuffer;
};
ReliableTopicProxy.prototype.getName = function () {
return this.name;
};
ReliableTopicProxy.prototype.destroy = function () {
for (var k in this.runners) {
var runner = this.runners[k];
runner.cancel();
}
return this.ringbuffer.destroy();
};
return ReliableTopicProxy;
}());
exports.ReliableTopicProxy = ReliableTopicProxy;
//# sourceMappingURL=ReliableTopicProxy.js.map