UNPKG

@splitsoftware/splitio-commons

Version:
97 lines (96 loc) 4.18 kB
import { forOwn } from '../../utils/lang'; import { mySegmentsSyncTaskFactory } from './syncTasks/mySegmentsSyncTask'; import { definitionsSyncTaskFactory } from './syncTasks/definitionsSyncTask'; import { getMatching } from '../../utils/key'; import { SDK_DEFINITIONS_ARRIVED, SDK_SEGMENTS_ARRIVED } from '../../readiness/constants'; import { POLLING_SMART_PAUSING, POLLING_START, POLLING_STOP } from '../../logger/constants'; import { usesSegmentsSync } from '../../storages/AbstractDefinitionsCacheSync'; /** * Expose start / stop mechanism for polling data from services. * For client-side API with multiple clients. */ export function pollingManagerCSFactory(params, definitionChangesFetcher) { var serviceApi = params.serviceApi, storage = params.storage, readiness = params.readiness, settings = params.settings; var log = settings.log; var definitionsSyncTask = definitionsSyncTaskFactory(definitionChangesFetcher, storage, readiness, settings); // Map of matching keys to their corresponding MySegmentsSyncTask. var mySegmentsSyncTasks = {}; var matchingKey = getMatching(settings.core.key); var mySegmentsSyncTask = add(matchingKey, readiness, storage); function startMySegmentsSyncTasks() { forOwn(mySegmentsSyncTasks, function (mySegmentsSyncTask) { mySegmentsSyncTask.start(); }); } function stopMySegmentsSyncTasks() { forOwn(mySegmentsSyncTasks, function (mySegmentsSyncTask) { if (mySegmentsSyncTask.isRunning()) mySegmentsSyncTask.stop(); }); } // smart pausing readiness.definitions.on(SDK_DEFINITIONS_ARRIVED, function () { if (!definitionsSyncTask.isRunning()) return; // noop if not doing polling var usingSegments = usesSegmentsSync(storage); if (usingSegments !== mySegmentsSyncTask.isRunning()) { log.info(POLLING_SMART_PAUSING, [usingSegments ? 'ON' : 'OFF']); if (usingSegments) { startMySegmentsSyncTasks(); } else { stopMySegmentsSyncTasks(); } } }); function add(matchingKey, readiness, storage) { var mySegmentsSyncTask = mySegmentsSyncTaskFactory(serviceApi.fetchMemberships, storage, readiness, settings, matchingKey); // smart ready function smartReady(metadata) { if (!readiness.isReady() && !usesSegmentsSync(storage)) readiness.segments.emit(SDK_SEGMENTS_ARRIVED, metadata); } if (!usesSegmentsSync(storage)) setTimeout(smartReady, 0); else readiness.definitions.once(SDK_DEFINITIONS_ARRIVED, smartReady); mySegmentsSyncTasks[matchingKey] = mySegmentsSyncTask; return mySegmentsSyncTask; } return { definitionsSyncTask: definitionsSyncTask, segmentsSyncTask: mySegmentsSyncTask, // Start periodic fetching (polling) start: function () { log.info(POLLING_START); definitionsSyncTask.start(); if (usesSegmentsSync(storage)) startMySegmentsSyncTasks(); }, // Stop periodic fetching (polling) stop: function () { log.info(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()]; 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]; } }; }