import { LOG_PREFIX_UNIQUE_KEYS_TRACKER } from '../logger/constants'; import { ILogger } from '../logger/types'; import { IUniqueKeysCacheBase } from '../storages/types'; import { IFilterAdapter, IUniqueKeysTracker } from './types'; const noopFilterAdapter = { add() { return true; }, contains() { return true; }, clear() { } }; /** * Tracks uniques keys * Unique Keys Tracker will be in charge of checking if the MTK was already sent to the BE in the last period * or schedule to be sent; if not it will be added in an internal cache and sent in the next post. * * @param log - Logger instance * @param uniqueKeysCache - cache to save unique keys * @param filterAdapter - filter adapter */ export function uniqueKeysTrackerFactory( log: ILogger, uniqueKeysCache: IUniqueKeysCacheBase, filterAdapter: IFilterAdapter = noopFilterAdapter, ): IUniqueKeysTracker { let intervalId: any; return { track(key: string, featureName: string): void { if (!filterAdapter.add(key, featureName)) { log.debug(`${LOG_PREFIX_UNIQUE_KEYS_TRACKER}The feature ${featureName} and key ${key} exist in the filter`); return; } uniqueKeysCache.track(key, featureName); }, start(): void { if (filterAdapter.refreshRate) { intervalId = setInterval(filterAdapter.clear, filterAdapter.refreshRate); } }, stop(): void { clearInterval(intervalId); } }; }