@splitsoftware/splitio-commons
Version:
Split JavaScript SDK common components
53 lines (52 loc) • 2.82 kB
JavaScript
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;
}
};
}