UNPKG

@splitsoftware/splitio-commons

Version:
96 lines (95 loc) 5.37 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.impressionsTrackerFactory = void 0; var objectAssign_1 = require("../utils/lang/objectAssign"); var thenable_1 = require("../utils/promise/thenable"); var constants_1 = require("../logger/constants"); var constants_2 = require("../utils/constants"); var strategyDebug_1 = require("./strategy/strategyDebug"); var strategyNone_1 = require("./strategy/strategyNone"); var strategyOptimized_1 = require("./strategy/strategyOptimized"); var uniqueKeysTracker_1 = require("./uniqueKeysTracker"); /** * Impressions tracker stores impressions in cache and pass them to the listener and integrations manager if provided. */ function impressionsTrackerFactory(params, storage, integrationsManager) { var settings = params.settings, impressionsObserverFactory = params.impressionsObserverFactory, filterAdapterFactory = params.filterAdapterFactory; var log = settings.log, impressionListener = settings.impressionListener, _a = settings.runtime, ip = _a.ip, hostname = _a.hostname, version = settings.version, impressionsMode = settings.sync.impressionsMode; var observer = impressionsObserverFactory(); var uniqueKeysTracker = (0, uniqueKeysTracker_1.uniqueKeysTrackerFactory)(log, storage.uniqueKeys, filterAdapterFactory && filterAdapterFactory()); var noneStrategy = (0, strategyNone_1.strategyNoneFactory)(storage.impressionCounts, uniqueKeysTracker); var strategy = impressionsMode === constants_2.OPTIMIZED ? (0, strategyOptimized_1.strategyOptimizedFactory)(observer, storage.impressionCounts) : impressionsMode === constants_2.DEBUG ? (0, strategyDebug_1.strategyDebugFactory)(observer) : noneStrategy; return { start: function () { uniqueKeysTracker.start(); }, stop: function () { uniqueKeysTracker.stop(); }, track: function (impressions, attributes) { if (settings.userConsent === constants_2.CONSENT_DECLINED) return; var impressionsToStore = impressions.filter(function (_a) { var imp = _a.imp, disabled = _a.disabled; return disabled ? noneStrategy.process(imp) : strategy.process(imp); }); var impressionsLength = impressions.length; var impressionsToStoreLength = impressionsToStore.length; if (impressionsToStoreLength) { var res = storage.impressions.track(impressionsToStore.map(function (item) { return item.imp; })); // If we're on an async storage, handle error and log it. if ((0, thenable_1.thenable)(res)) { res.then(function () { log.info(constants_1.IMPRESSIONS_TRACKER_SUCCESS, [impressionsLength]); }).catch(function (err) { log.error(constants_1.ERROR_IMPRESSIONS_TRACKER, [impressionsLength, err]); }); } else { // Record when impressionsCache is sync only (standalone mode) // @TODO we are not dropping impressions on full queue yet, so DROPPED stats are not recorded if (storage.telemetry) { storage.telemetry.recordImpressionStats(constants_2.QUEUED, impressionsToStoreLength); storage.telemetry.recordImpressionStats(constants_2.DEDUPED, impressionsLength - impressionsToStoreLength); } } } // @TODO next block might be handled by the integration manager. In that case, the metadata object doesn't need to be passed in the constructor if (impressionListener || integrationsManager) { var _loop_1 = function (i) { var impressionData = { // copy of impression, to avoid unexpected behavior if modified by integrations or impressionListener impression: (0, objectAssign_1.objectAssign)({}, impressions[i].imp), attributes: attributes, ip: ip, hostname: hostname, sdkLanguageVersion: version }; // Wrap in a timeout because we don't want it to be blocking. setTimeout(function () { // integrationsManager.handleImpression does not throw errors if (integrationsManager) integrationsManager.handleImpression(impressionData); try { // @ts-ignore. An exception on the listeners should not break the SDK. if (impressionListener) impressionListener.logImpression(impressionData); } catch (err) { log.error(constants_1.ERROR_IMPRESSIONS_LISTENER, [err]); } }); }; for (var i = 0; i < impressionsLength; i++) { _loop_1(i); } } } }; } exports.impressionsTrackerFactory = impressionsTrackerFactory;