UNPKG

hazelcast-client

Version:

Hazelcast - open source In-Memory Data Grid - client for NodeJS

118 lines 5.27 kB
"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