@splitsoftware/splitio-commons
Version:
Split JavaScript SDK common components
61 lines (49 loc) • 2.29 kB
text/typescript
import { ERROR_NOT_BOOLEAN, USER_CONSENT_UPDATED, USER_CONSENT_NOT_UPDATED, USER_CONSENT_INITIAL } from '../logger/constants';
import { isConsentGranted } from './index';
import { CONSENT_GRANTED, CONSENT_DECLINED, CONSENT_UNKNOWN } from '../utils/constants';
import { isBoolean } from '../utils/lang';
import { ISdkFactoryContext } from '../sdkFactory/types';
// User consent enum
const ConsentStatus = {
GRANTED: CONSENT_GRANTED,
DECLINED: CONSENT_DECLINED,
UNKNOWN: CONSENT_UNKNOWN,
};
/**
* The public user consent API exposed via SplitFactory, used to control if the SDK tracks and sends impressions and events or not.
*/
export function createUserConsentAPI(params: ISdkFactoryContext) {
const { settings, settings: { log }, syncManager, storage: { events, impressions, impressionCounts, uniqueKeys } } = params;
if (!isConsentGranted(settings)) log.info(USER_CONSENT_INITIAL, [settings.userConsent]);
return {
setStatus(consent: unknown) {
// validate input param
if (!isBoolean(consent)) {
log.warn(ERROR_NOT_BOOLEAN, ['UserConsent.setStatus']);
return false;
}
const newConsentStatus = consent ? CONSENT_GRANTED : CONSENT_DECLINED;
if (settings.userConsent !== newConsentStatus) {
log.info(USER_CONSENT_UPDATED, [settings.userConsent, newConsentStatus]); // @ts-ignore, modify readonly prop
settings.userConsent = newConsentStatus;
if (consent) { // resumes submitters if transitioning to GRANTED
syncManager?.submitterManager?.start();
} else { // pauses submitters (except telemetry), and drops tracked data if transitioning to DECLINED
syncManager?.submitterManager?.stop(true);
// @ts-ignore, clear method is present in storage for standalone and partial consumer mode
if (events.clear) events.clear(); // @ts-ignore
if (impressions.clear) impressions.clear(); // @ts-ignore
if (impressionCounts.clear) impressionCounts.clear(); // @ts-ignore
if (uniqueKeys.clear) uniqueKeys.clear();
}
} else {
log.info(USER_CONSENT_NOT_UPDATED, [newConsentStatus]);
}
return true;
},
getStatus() {
return settings.userConsent;
},
Status: ConsentStatus
};
}