@splitsoftware/splitio-commons
Version:
Split JavaScript SDK common components
101 lines (100 loc) • 4.58 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.pollingManagerCSFactory = void 0;
var lang_1 = require("../../utils/lang");
var mySegmentsSyncTask_1 = require("./syncTasks/mySegmentsSyncTask");
var definitionsSyncTask_1 = require("./syncTasks/definitionsSyncTask");
var key_1 = require("../../utils/key");
var constants_1 = require("../../readiness/constants");
var constants_2 = require("../../logger/constants");
var AbstractDefinitionsCacheSync_1 = require("../../storages/AbstractDefinitionsCacheSync");
/**
* Expose start / stop mechanism for polling data from services.
* For client-side API with multiple clients.
*/
function pollingManagerCSFactory(params, definitionChangesFetcher) {
var serviceApi = params.serviceApi, storage = params.storage, readiness = params.readiness, settings = params.settings;
var log = settings.log;
var definitionsSyncTask = (0, definitionsSyncTask_1.definitionsSyncTaskFactory)(definitionChangesFetcher, storage, readiness, settings);
// Map of matching keys to their corresponding MySegmentsSyncTask.
var mySegmentsSyncTasks = {};
var matchingKey = (0, key_1.getMatching)(settings.core.key);
var mySegmentsSyncTask = add(matchingKey, readiness, storage);
function startMySegmentsSyncTasks() {
(0, lang_1.forOwn)(mySegmentsSyncTasks, function (mySegmentsSyncTask) {
mySegmentsSyncTask.start();
});
}
function stopMySegmentsSyncTasks() {
(0, lang_1.forOwn)(mySegmentsSyncTasks, function (mySegmentsSyncTask) {
if (mySegmentsSyncTask.isRunning())
mySegmentsSyncTask.stop();
});
}
// smart pausing
readiness.definitions.on(constants_1.SDK_DEFINITIONS_ARRIVED, function () {
if (!definitionsSyncTask.isRunning())
return; // noop if not doing polling
var usingSegments = (0, AbstractDefinitionsCacheSync_1.usesSegmentsSync)(storage);
if (usingSegments !== mySegmentsSyncTask.isRunning()) {
log.info(constants_2.POLLING_SMART_PAUSING, [usingSegments ? 'ON' : 'OFF']);
if (usingSegments) {
startMySegmentsSyncTasks();
}
else {
stopMySegmentsSyncTasks();
}
}
});
function add(matchingKey, readiness, storage) {
var mySegmentsSyncTask = (0, mySegmentsSyncTask_1.mySegmentsSyncTaskFactory)(serviceApi.fetchMemberships, storage, readiness, settings, matchingKey);
// smart ready
function smartReady(metadata) {
if (!readiness.isReady() && !(0, AbstractDefinitionsCacheSync_1.usesSegmentsSync)(storage))
readiness.segments.emit(constants_1.SDK_SEGMENTS_ARRIVED, metadata);
}
if (!(0, AbstractDefinitionsCacheSync_1.usesSegmentsSync)(storage))
setTimeout(smartReady, 0);
else
readiness.definitions.once(constants_1.SDK_DEFINITIONS_ARRIVED, smartReady);
mySegmentsSyncTasks[matchingKey] = mySegmentsSyncTask;
return mySegmentsSyncTask;
}
return {
definitionsSyncTask: definitionsSyncTask,
segmentsSyncTask: mySegmentsSyncTask,
// Start periodic fetching (polling)
start: function () {
log.info(constants_2.POLLING_START);
definitionsSyncTask.start();
if ((0, AbstractDefinitionsCacheSync_1.usesSegmentsSync)(storage))
startMySegmentsSyncTasks();
},
// Stop periodic fetching (polling)
stop: function () {
log.info(constants_2.POLLING_STOP);
if (definitionsSyncTask.isRunning())
definitionsSyncTask.stop();
stopMySegmentsSyncTasks();
},
// Used by SyncManager to know if running in polling mode.
isRunning: definitionsSyncTask.isRunning,
// fetch definitions and segments
syncAll: function () {
var promises = [definitionsSyncTask.execute()];
(0, lang_1.forOwn)(mySegmentsSyncTasks, function (mySegmentsSyncTask) {
promises.push(mySegmentsSyncTask.execute());
});
return Promise.all(promises);
},
// Support for handling mySegments sync of multiple clients
add: add,
remove: function (matchingKey) {
delete mySegmentsSyncTasks[matchingKey];
},
get: function (matchingKey) {
return mySegmentsSyncTasks[matchingKey];
}
};
}
exports.pollingManagerCSFactory = pollingManagerCSFactory;