statsig-js
Version:
Statsig JavaScript client SDK for single user environments.
238 lines (237 loc) • 10.4 kB
TypeScript
import DynamicConfig from './DynamicConfig';
import ErrorBoundary from './ErrorBoundary';
import Layer from './Layer';
import type { DeviceInfo, ExpoConstants, ExpoDevice, NativeModules, Platform } from './StatsigIdentity';
import { UUID } from './StatsigIdentity';
import StatsigLogger from './StatsigLogger';
import StatsigNetwork from './StatsigNetwork';
import StatsigSDKOptions, { StatsigOptions } from './StatsigSDKOptions';
import StatsigStore, { EvaluationDetails } from './StatsigStore';
import { StatsigUser } from './StatsigUser';
import { UserCacheKey } from './utils/Hashing';
import type { AsyncStorage } from './utils/StatsigAsyncStorage';
import ConsoleLogger from './utils/ConsoleLogger';
export declare type AppStateEvent = 'change' | 'memoryWarning' | 'blur' | 'focus';
export declare type AppStateStatus = 'active' | 'background' | 'inactive' | 'unknown' | 'extension';
export declare type AppState = {
currentState: AppStateStatus;
addEventListener: (event: AppStateEvent, handler: (newState: AppStateStatus) => void) => void;
removeEventListener: (event: AppStateEvent, handler: (newState: AppStateStatus) => void) => void;
};
export declare type _SDKPackageInfo = {
sdkType: string;
sdkVersion: string;
};
declare type LegacyOverrideValue = Record<string, any>;
export interface IStatsig {
initializeAsync(): Promise<void>;
checkGate(gateName: string, ignoreOverrides?: boolean): boolean;
getConfig(configName: string, ignoreOverrides?: boolean): DynamicConfig;
getExperiment(experimentName: string, keepDeviceValue?: boolean, ignoreOverrides?: boolean): DynamicConfig;
logEvent(eventName: string, value?: string | number | null, metadata?: Record<string, string> | null): void;
updateUser(user: StatsigUser | null): Promise<boolean>;
shutdown(): void;
overrideGate(gateName: string, value: boolean): void;
overrideConfig(gateName: string, value: Record<string, unknown>): void;
removeGateOverride(gateName?: string): void;
removeConfigOverride(configName?: string): void;
getAllOverrides(): StatsigOverrides;
getStableID(): string;
removeOverride(overrideName?: string | null): void;
getOverrides(): Record<string, unknown>;
}
export interface IHasStatsigInternal {
getNetwork(): StatsigNetwork;
getStore(): StatsigStore;
getLogger(): StatsigLogger;
getOptions(): StatsigSDKOptions;
getCurrentUser(): StatsigUser | null;
getCurrentUserCacheKey(): UserCacheKey;
getCurrentUserUnitID(idType: string): string | null;
getCurrentUserID(): string | null;
getSDKKey(): string;
getStatsigMetadata(): Record<string, string | number>;
getErrorBoundary(): ErrorBoundary;
getSDKType(): string;
getSDKVersion(): string;
getConsoleLogger(): ConsoleLogger;
getStableID(): string;
}
export declare type StatsigOverrides = {
gates: Record<string, boolean>;
configs: Record<string, Record<string, unknown>>;
layers: Record<string, Record<string, unknown>>;
};
export default class StatsigClient implements IHasStatsigInternal, IStatsig {
private static reactNativeUUID?;
private appState;
private currentAppState;
private onCacheLoadedForReact;
private ready;
private initCalled;
private pendingInitPromise;
private optionalLoggingSetup;
private prefetchedUsersByCacheKey;
private startTime;
private errorBoundary;
getErrorBoundary(): ErrorBoundary;
private network;
getNetwork(): StatsigNetwork;
private store;
getStore(): StatsigStore;
private logger;
getLogger(): StatsigLogger;
private options;
getOptions(): StatsigSDKOptions;
private sdkKey;
getSDKKey(): string;
private identity;
getCurrentUser(): StatsigUser | null;
getCurrentUserCacheKey(): UserCacheKey;
getCurrentUserUnitID(idType: string): string | null;
getCurrentUserID(): string | null;
private getUnitID;
getStatsigMetadata(): Record<string, string | number>;
getSDKType(): string;
getSDKVersion(): string;
private consoleLogger;
getConsoleLogger(): ConsoleLogger;
constructor(sdkKey: string, user?: StatsigUser | null, options?: StatsigOptions | null);
private delayedSetup;
setInitializeValues(initializeValues: Record<string, unknown>): void;
initializeAsync(): Promise<void>;
prefetchUsers(users: StatsigUser[]): Promise<void>;
getEvaluationDetails(): EvaluationDetails;
/**
* Checks the value of a gate for the current user
* @param {string} gateName - the name of the gate to check
* @param {boolean} ignoreOverrides = false if this check should ignore local overrides
* @returns {boolean} - value of a gate for the user. Gates are "off" (return false) by default
* @throws Error if initialize() is not called first, or gateName is not a string
*/
checkGate(gateName: string, ignoreOverrides?: boolean): boolean;
checkGateWithExposureLoggingDisabled(gateName: string, ignoreOverrides?: boolean): boolean;
logGateExposure(gateName: string): void;
/**
* Checks the value of a config for the current user
* @param {string} configName - the name of the config to get
* @param {boolean} ignoreOverrides = false if this check should ignore local overrides
* @returns {DynamicConfig} - value of a config for the user
* @throws Error if initialize() is not called first, or configName is not a string
*/
getConfig(configName: string, ignoreOverrides?: boolean): DynamicConfig;
getConfigWithExposureLoggingDisabled(configName: string, ignoreOverrides?: boolean): DynamicConfig;
logConfigExposure(configName: string): void;
/**
* Gets the experiment for a given user
* @param {string} experimentName - the name of the experiment to get
* @param {boolean} keepDeviceValue = false if this should use "sticky" values persisted in local storage
* @param {boolean} ignoreOverrides = false if this check should ignore local overrides
* @returns {DynamicConfig} - value of the experiment for the user, represented by a Dynamic Config object
* @throws Error if initialize() is not called first, or experimentName is not a string
*/
getExperiment(experimentName: string, keepDeviceValue?: boolean, ignoreOverrides?: boolean): DynamicConfig;
getExperimentWithExposureLoggingDisabled(experimentName: string, keepDeviceValue?: boolean, ignoreOverrides?: boolean): DynamicConfig;
logExperimentExposure(experimentName: string, keepDeviceValue: boolean): void;
getLayer(layerName: string, keepDeviceValue?: boolean): Layer;
getLayerWithExposureLoggingDisabled(layerName: string, keepDeviceValue?: boolean): Layer;
logLayerParameterExposure(layerName: string, parameterName: string, keepDeviceValue?: boolean): void;
logEvent(eventName: string, value?: string | number | null, metadata?: Record<string, string> | null): void;
updateUserWithValues(user: StatsigUser | null, values: Record<string, unknown>): boolean;
updateUser(user: StatsigUser | null): Promise<boolean>;
/**
* Informs the statsig SDK that the client is closing or shutting down
* so the SDK can clean up internal state
*/
shutdown(): void;
getInitializeResponseJson(): {
values: string;
evaluationDetails: EvaluationDetails;
};
/**
* Stores a local gate override
* @param gateName the gate to override
* @param value the value to override the gate to
*/
overrideGate(gateName: string, value: boolean): void;
/**
* Stores a local config override
* @param configName the config to override
* @param value the json value to override the config to
*/
overrideConfig(configName: string, value: LegacyOverrideValue): void;
/**
* Stores a local layer override
* @param layerName the layer to override
* @param value the json value to override the config to
*/
overrideLayer(layerName: string, value: LegacyOverrideValue): void;
/**
* Removes the given gate override
* @param gateName
*/
removeGateOverride(gateName?: string): void;
/**
* Removes the given config override
* @param configName
*/
removeConfigOverride(configName?: string): void;
/**
* Removes the given layer override
* @param layerName
*/
removeLayerOverride(layerName?: string): void;
/**
* @deprecated - use removeGateOverride or removeConfig override
* Removes the given gate override
* @param gateName
*/
removeOverride(gateName?: string): void;
/**
* @deprecated - use getAllOverrides to get gate and config overrides
* @returns Gate overrides
*/
getOverrides(): Record<string, unknown>;
/**
* @returns The local gate and config overrides
*/
getAllOverrides(): StatsigOverrides;
/**
* @returns The Statsig stable ID used for device level experiments
*/
getStableID(): string;
initializeCalled(): boolean;
setSDKPackageInfo(sdkPackageInfo?: _SDKPackageInfo): void;
static setAsyncStorage(asyncStorage?: AsyncStorage | null): void;
setOnCacheLoadedReactCallback(fn?: (() => void) | null): void;
static setReactNativeUUID(uuid?: UUID | null): void;
setAppState(appState?: AppState | null): void;
setNativeModules(nativeModules?: NativeModules | null): void;
setPlatform(platform?: Platform | null): void;
setRNDeviceInfo(deviceInfo?: DeviceInfo | null): void;
setExpoConstants(expoConstants?: ExpoConstants | null): void;
setExpoDevice(expoDevice?: ExpoDevice | null): void;
flushEvents(): void;
reenableAllLogging(): void;
private isCacheValidForFetchMode;
private handleOptionalLogging;
private handleAppStateChange;
private shouldTrimParam;
private normalizePrefetchUsers;
private normalizeUser;
private trimUserObjIfNeeded;
private ensureStoreLoaded;
private getEvalutionDetailsForError;
private fetchAndSaveValues;
private checkGateImpl;
private logGateExposureImpl;
private getConfigImpl;
private logConfigExposureImpl;
private getExperimentImpl;
private logExperimentExposureImpl;
private getLayerImpl;
private logLayerParameterExposureForLayer;
private getEmptyConfig;
private fireAndForgetPrefechUsers;
}
export {};