UNPKG

@splitsoftware/splitio-commons

Version:
53 lines (52 loc) 2.82 kB
import { thenable } from '../utils/promise/thenable'; import { getMatching } from '../utils/key'; import { validateTrafficTypeExistence } from '../utils/inputValidation/trafficTypeExistence'; import { validateKey, validateTrafficType, validateEvent, validateEventValue, validateEventProperties, validateIfNotDestroyed } from '../utils/inputValidation'; import { TRACK, TRACK_FN_LABEL } from '../utils/constants'; import { isConsumerMode } from '../utils/settingsValidation/mode'; /** * Creates a standalone `track` function with input validation. * Reusable by FF SDK client, Configs SDK, and thin-client SDK. */ export function trackMethodFactory(params, warnTTExistence) { if (warnTTExistence === void 0) { warnTTExistence = true; } var settings = params.settings, definitions = params.storage.definitions, telemetryTracker = params.telemetryTracker, eventTracker = params.eventTracker, readinessManager = params.sdkReadinessManager.readinessManager; var log = settings.log, mode = settings.mode; var isAsync = isConsumerMode(mode); return function track(maybeKey, maybeTT, maybeEvent, maybeEventValue, maybeProperties) { // Input validation var key = validateKey(log, maybeKey, TRACK_FN_LABEL); var trafficTypeName = validateTrafficType(log, maybeTT, TRACK_FN_LABEL); var eventTypeId = validateEvent(log, maybeEvent, TRACK_FN_LABEL); var value = validateEventValue(log, maybeEventValue, TRACK_FN_LABEL); var _a = validateEventProperties(log, maybeProperties, TRACK_FN_LABEL), properties = _a.properties, size = _a.size; var isNotDestroyed = validateIfNotDestroyed(log, readinessManager, TRACK_FN_LABEL); if (!(isNotDestroyed && key && trafficTypeName && eventTypeId && value !== false && properties !== false)) { return isAsync ? Promise.resolve(false) : false; } // Core logic var stopTelemetryTracker = telemetryTracker.trackEval(TRACK); var eventData = { eventTypeId: eventTypeId, trafficTypeName: trafficTypeName, value: value, timestamp: Date.now(), key: getMatching(key), properties: properties }; // This may be async but we only warn, we don't actually care if it is valid or not in terms of queueing the event. if (warnTTExistence) validateTrafficTypeExistence(log, readinessManager, definitions, mode, trafficTypeName, TRACK_FN_LABEL); var result = eventTracker.track(eventData, size); if (thenable(result)) { return result.then(function (result) { stopTelemetryTracker(); return result; }); } else { stopTelemetryTracker(); return result; } }; }