@statsig/client-core 0.0.1-beta.1 → 0.0.1-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -1
- package/package.json +1 -1
- package/src/ClientInterfaces.d.ts +6 -2
- package/src/DataAdapterCore.d.ts +33 -0
- package/src/DataAdapterCore.js +241 -0
- package/src/ErrorBoundary.d.ts +1 -0
- package/src/ErrorBoundary.js +3 -0
- package/src/EventLogger.d.ts +7 -1
- package/src/EventLogger.js +55 -29
- package/src/Monitoring.d.ts +1 -2
- package/src/Monitoring.js +66 -13
- package/src/NetworkCore.d.ts +13 -4
- package/src/NetworkCore.js +68 -60
- package/src/StableID.js +1 -1
- package/src/StatsigClientBase.d.ts +10 -17
- package/src/StatsigClientBase.js +19 -219
- package/src/StatsigClientEventEmitter.d.ts +26 -4
- package/src/StatsigDataAdapter.d.ts +43 -0
- package/src/StatsigDataAdapter.js +4 -0
- package/src/StatsigEvent.d.ts +2 -3
- package/src/StatsigEvent.js +15 -8
- package/src/StatsigMetadata.js +1 -1
- package/src/StatsigOptionsCommon.d.ts +5 -5
- package/src/StatsigTypes.d.ts +9 -4
- package/src/StatsigTypes.js +6 -6
- package/src/StatsigUser.js +16 -17
- package/src/StorageProvider.d.ts +2 -0
- package/src/StorageProvider.js +11 -0
- package/src/VisibilityChangeObserver.js +4 -1
- package/src/index.d.ts +6 -3
- package/src/index.js +9 -4
- package/src/StatsigDataProvider.d.ts +0 -9
- package/src/StatsigDataProvider.js +0 -2
package/src/StatsigEvent.js
CHANGED
|
@@ -4,12 +4,12 @@ exports.createLayerParameterExposure = exports.createConfigExposure = exports.cr
|
|
|
4
4
|
var CONFIG_EXPOSURE_NAME = 'statsig::config_exposure';
|
|
5
5
|
var GATE_EXPOSURE_NAME = 'statsig::gate_exposure';
|
|
6
6
|
var LAYER_EXPOSURE_NAME = 'statsig::layer_exposure';
|
|
7
|
-
function createExposure(eventName, user, metadata, secondaryExposures) {
|
|
7
|
+
function createExposure(eventName, user, details, metadata, secondaryExposures) {
|
|
8
8
|
return {
|
|
9
9
|
eventName: eventName,
|
|
10
10
|
user: user,
|
|
11
11
|
value: null,
|
|
12
|
-
metadata: metadata,
|
|
12
|
+
metadata: _addEvaluationDetailsToMetadata(details, metadata),
|
|
13
13
|
secondaryExposures: secondaryExposures,
|
|
14
14
|
time: Date.now(),
|
|
15
15
|
};
|
|
@@ -20,19 +20,17 @@ function isExposureEvent(_a) {
|
|
|
20
20
|
}
|
|
21
21
|
exports.isExposureEvent = isExposureEvent;
|
|
22
22
|
function createGateExposure(user, gate, secondaryExposures) {
|
|
23
|
-
return createExposure(GATE_EXPOSURE_NAME, user, {
|
|
23
|
+
return createExposure(GATE_EXPOSURE_NAME, user, gate.details, {
|
|
24
24
|
gate: gate.name,
|
|
25
25
|
gateValue: String(gate.value),
|
|
26
26
|
ruleID: gate.ruleID,
|
|
27
|
-
reason: gate.source,
|
|
28
27
|
}, secondaryExposures !== null && secondaryExposures !== void 0 ? secondaryExposures : []);
|
|
29
28
|
}
|
|
30
29
|
exports.createGateExposure = createGateExposure;
|
|
31
30
|
function createConfigExposure(user, config, secondaryExposures) {
|
|
32
|
-
return createExposure(CONFIG_EXPOSURE_NAME, user, {
|
|
31
|
+
return createExposure(CONFIG_EXPOSURE_NAME, user, config.details, {
|
|
33
32
|
config: config.name,
|
|
34
33
|
ruleID: config.ruleID,
|
|
35
|
-
reason: config.source,
|
|
36
34
|
}, secondaryExposures !== null && secondaryExposures !== void 0 ? secondaryExposures : []);
|
|
37
35
|
}
|
|
38
36
|
exports.createConfigExposure = createConfigExposure;
|
|
@@ -45,13 +43,22 @@ function createLayerParameterExposure(user, layerName, parameterName, spec) {
|
|
|
45
43
|
allocatedExperiment = spec.allocated_experiment_name;
|
|
46
44
|
secondaryExposures = spec.secondary_exposures;
|
|
47
45
|
}
|
|
48
|
-
return createExposure(LAYER_EXPOSURE_NAME, user, {
|
|
46
|
+
return createExposure(LAYER_EXPOSURE_NAME, user, spec.details, {
|
|
49
47
|
config: layerName,
|
|
50
48
|
parameterName: parameterName,
|
|
51
49
|
ruleID: spec.rule_id,
|
|
52
50
|
allocatedExperiment: allocatedExperiment,
|
|
53
51
|
isExplicitParameter: String(isExplicit),
|
|
54
|
-
reason: spec.source,
|
|
55
52
|
}, secondaryExposures);
|
|
56
53
|
}
|
|
57
54
|
exports.createLayerParameterExposure = createLayerParameterExposure;
|
|
55
|
+
function _addEvaluationDetailsToMetadata(details, metadata) {
|
|
56
|
+
metadata['reason'] = details.reason;
|
|
57
|
+
if (details.lcut) {
|
|
58
|
+
metadata['lcut'] = String(details.lcut);
|
|
59
|
+
}
|
|
60
|
+
if (details.receivedAt) {
|
|
61
|
+
metadata['receivedAt'] = String(details.receivedAt);
|
|
62
|
+
}
|
|
63
|
+
return metadata;
|
|
64
|
+
}
|
package/src/StatsigMetadata.js
CHANGED
|
@@ -12,7 +12,7 @@ var __assign = (this && this.__assign) || function () {
|
|
|
12
12
|
};
|
|
13
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
14
|
exports.StatsigMetadataProvider = void 0;
|
|
15
|
-
var SDK_VERSION = '0.0.1-beta.
|
|
15
|
+
var SDK_VERSION = '0.0.1-beta.10';
|
|
16
16
|
var metadata = {
|
|
17
17
|
sdkVersion: SDK_VERSION,
|
|
18
18
|
sdkType: 'js-mono', // js-mono is overwritten by Precomp and OnDevice clients
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { LogLevel } from './Log';
|
|
2
|
-
import {
|
|
2
|
+
import { StatsigDataAdapter } from './StatsigDataAdapter';
|
|
3
3
|
/** Common options for configuring the Statsig SDK. */
|
|
4
4
|
export type StatsigOptionsCommon = {
|
|
5
5
|
/**
|
|
@@ -18,14 +18,14 @@ export type StatsigOptionsCommon = {
|
|
|
18
18
|
overrideStableID?: string;
|
|
19
19
|
/**
|
|
20
20
|
* How much information is allowed to be printed to the console.
|
|
21
|
-
* Default: LogLevel.
|
|
21
|
+
* Default: LogLevel.Warn
|
|
22
22
|
*/
|
|
23
23
|
logLevel?: LogLevel;
|
|
24
24
|
/**
|
|
25
|
-
*
|
|
26
|
-
* Default:
|
|
25
|
+
* StatsigDataAdapter implementor used to customize the initialization/update flow.
|
|
26
|
+
* Default: EvaluationsDataAdapter (Precomputed) or SpecsDataAdapter (OnDevice)
|
|
27
27
|
*/
|
|
28
|
-
|
|
28
|
+
dataAdapter?: StatsigDataAdapter;
|
|
29
29
|
/**
|
|
30
30
|
* The maximum amount of time (in milliseconds) that any network request can take
|
|
31
31
|
* before timing out. Default: 10,000 (10 seconds)
|
package/src/StatsigTypes.d.ts
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
export type Flatten<T> = {
|
|
2
2
|
[K in keyof T]: T[K];
|
|
3
3
|
} & {};
|
|
4
|
+
export type EvaluationDetails = {
|
|
5
|
+
reason: string;
|
|
6
|
+
lcut?: number;
|
|
7
|
+
receivedAt?: number;
|
|
8
|
+
};
|
|
4
9
|
type EvaluatedSpec = {
|
|
5
10
|
readonly name: string;
|
|
6
11
|
readonly ruleID: string;
|
|
7
|
-
readonly
|
|
12
|
+
readonly details: EvaluationDetails;
|
|
8
13
|
};
|
|
9
14
|
export type FeatureGate = EvaluatedSpec & {
|
|
10
15
|
readonly value: boolean;
|
|
@@ -16,7 +21,7 @@ export type Experiment = DynamicConfig;
|
|
|
16
21
|
export type Layer = EvaluatedSpec & {
|
|
17
22
|
readonly getValue: (parameterName: string) => unknown;
|
|
18
23
|
};
|
|
19
|
-
export declare function makeFeatureGate(name: string,
|
|
20
|
-
export declare function makeDynamicConfig(name: string,
|
|
21
|
-
export declare function makeLayer(name: string,
|
|
24
|
+
export declare function makeFeatureGate(name: string, details: EvaluationDetails, ruleID?: string, value?: boolean): FeatureGate;
|
|
25
|
+
export declare function makeDynamicConfig(name: string, details: EvaluationDetails, ruleID?: string, value?: Record<string, unknown>): DynamicConfig;
|
|
26
|
+
export declare function makeLayer(name: string, details: EvaluationDetails, ruleID?: string, getValue?: (param: string) => unknown): Layer;
|
|
22
27
|
export {};
|
package/src/StatsigTypes.js
CHANGED
|
@@ -2,28 +2,28 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.makeLayer = exports.makeDynamicConfig = exports.makeFeatureGate = void 0;
|
|
4
4
|
var DEFAULT_RULE = 'default';
|
|
5
|
-
function makeFeatureGate(name,
|
|
5
|
+
function makeFeatureGate(name, details, ruleID, value) {
|
|
6
6
|
return {
|
|
7
7
|
name: name,
|
|
8
|
-
|
|
8
|
+
details: details,
|
|
9
9
|
ruleID: ruleID !== null && ruleID !== void 0 ? ruleID : DEFAULT_RULE,
|
|
10
10
|
value: value === true,
|
|
11
11
|
};
|
|
12
12
|
}
|
|
13
13
|
exports.makeFeatureGate = makeFeatureGate;
|
|
14
|
-
function makeDynamicConfig(name,
|
|
14
|
+
function makeDynamicConfig(name, details, ruleID, value) {
|
|
15
15
|
return {
|
|
16
16
|
name: name,
|
|
17
|
-
|
|
17
|
+
details: details,
|
|
18
18
|
ruleID: ruleID !== null && ruleID !== void 0 ? ruleID : DEFAULT_RULE,
|
|
19
19
|
value: value !== null && value !== void 0 ? value : {},
|
|
20
20
|
};
|
|
21
21
|
}
|
|
22
22
|
exports.makeDynamicConfig = makeDynamicConfig;
|
|
23
|
-
function makeLayer(name,
|
|
23
|
+
function makeLayer(name, details, ruleID, getValue) {
|
|
24
24
|
return {
|
|
25
25
|
name: name,
|
|
26
|
-
|
|
26
|
+
details: details,
|
|
27
27
|
getValue: getValue !== null && getValue !== void 0 ? getValue : (function () { return undefined; }),
|
|
28
28
|
ruleID: ruleID !== null && ruleID !== void 0 ? ruleID : DEFAULT_RULE,
|
|
29
29
|
};
|
package/src/StatsigUser.js
CHANGED
|
@@ -16,22 +16,21 @@ function normalizeUser(original, environment) {
|
|
|
16
16
|
}
|
|
17
17
|
exports.normalizeUser = normalizeUser;
|
|
18
18
|
function getUserStorageKey(sdkKey, user) {
|
|
19
|
-
|
|
20
|
-
var parts = [
|
|
21
|
-
"uid:".concat((_a = user === null || user === void 0 ? void 0 : user.userID) !== null && _a !== void 0 ? _a : ''),
|
|
22
|
-
"cids:".concat(Object.entries((_b = user === null || user === void 0 ? void 0 : user.customIDs) !== null && _b !== void 0 ? _b : {})
|
|
23
|
-
.sort(function (_a, _b) {
|
|
24
|
-
var leftKey = _a[0];
|
|
25
|
-
var rightKey = _b[0];
|
|
26
|
-
return leftKey.localeCompare(rightKey);
|
|
27
|
-
})
|
|
28
|
-
.map(function (_a) {
|
|
29
|
-
var key = _a[0], value = _a[1];
|
|
30
|
-
return "".concat(key, "-").concat(value);
|
|
31
|
-
})
|
|
32
|
-
.join(',')),
|
|
33
|
-
"k:".concat(sdkKey),
|
|
34
|
-
];
|
|
35
|
-
return (0, Hashing_1.DJB2)(parts.join('|'));
|
|
19
|
+
return (0, Hashing_1.DJB2)(JSON.stringify(_getSortedObject({ sdkKey: sdkKey, user: user })));
|
|
36
20
|
}
|
|
37
21
|
exports.getUserStorageKey = getUserStorageKey;
|
|
22
|
+
function _getSortedObject(object) {
|
|
23
|
+
if (object == null) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
var keys = Object.keys(object).sort();
|
|
27
|
+
var sortedObject = {};
|
|
28
|
+
keys.forEach(function (key) {
|
|
29
|
+
var value = object[key];
|
|
30
|
+
if (value instanceof Object) {
|
|
31
|
+
value = _getSortedObject(value);
|
|
32
|
+
}
|
|
33
|
+
sortedObject[key] = value;
|
|
34
|
+
});
|
|
35
|
+
return sortedObject;
|
|
36
|
+
}
|
package/src/StorageProvider.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
type StorageProvider = {
|
|
2
|
+
getProviderName: () => string;
|
|
2
3
|
getItem: (key: string) => Promise<string | null>;
|
|
3
4
|
setItem: (key: string, value: string) => Promise<void>;
|
|
4
5
|
removeItem: (key: string) => Promise<void>;
|
|
6
|
+
getAllKeys: () => Promise<readonly string[]>;
|
|
5
7
|
};
|
|
6
8
|
export declare const Storage: StorageProvider & {
|
|
7
9
|
setProvider: (n: StorageProvider) => void;
|
package/src/StorageProvider.js
CHANGED
|
@@ -40,6 +40,7 @@ exports.setObjectInStorage = exports.getObjectFromStorage = exports.Storage = vo
|
|
|
40
40
|
var Log_1 = require("./Log");
|
|
41
41
|
var inMemoryStore = {};
|
|
42
42
|
var provider = {
|
|
43
|
+
getProviderName: function () { return 'InMemory'; },
|
|
43
44
|
getItem: function (key) {
|
|
44
45
|
var _a;
|
|
45
46
|
return Promise.resolve((_a = inMemoryStore[key]) !== null && _a !== void 0 ? _a : null);
|
|
@@ -52,10 +53,14 @@ var provider = {
|
|
|
52
53
|
delete inMemoryStore[key];
|
|
53
54
|
return Promise.resolve();
|
|
54
55
|
},
|
|
56
|
+
getAllKeys: function () {
|
|
57
|
+
return Promise.resolve(Object.keys(inMemoryStore));
|
|
58
|
+
},
|
|
55
59
|
};
|
|
56
60
|
try {
|
|
57
61
|
if (typeof window !== 'undefined' && 'localStorage' in window) {
|
|
58
62
|
provider = {
|
|
63
|
+
getProviderName: function () { return 'LocalStorage'; },
|
|
59
64
|
getItem: function (key) {
|
|
60
65
|
return Promise.resolve(localStorage.getItem(key));
|
|
61
66
|
},
|
|
@@ -67,6 +72,10 @@ try {
|
|
|
67
72
|
localStorage.removeItem(key);
|
|
68
73
|
return Promise.resolve();
|
|
69
74
|
},
|
|
75
|
+
getAllKeys: function () {
|
|
76
|
+
var keys = Object.keys(localStorage);
|
|
77
|
+
return Promise.resolve(keys);
|
|
78
|
+
},
|
|
70
79
|
};
|
|
71
80
|
}
|
|
72
81
|
}
|
|
@@ -74,9 +83,11 @@ catch (error) {
|
|
|
74
83
|
Log_1.Log.warn('Failed to get storage provider. Failling back to in memory store.');
|
|
75
84
|
}
|
|
76
85
|
exports.Storage = {
|
|
86
|
+
getProviderName: function () { return provider.getProviderName(); },
|
|
77
87
|
getItem: function (key) { return provider.getItem(key); },
|
|
78
88
|
setItem: function (key, value) { return provider.setItem(key, value); },
|
|
79
89
|
removeItem: function (key) { return provider.removeItem(key); },
|
|
90
|
+
getAllKeys: function () { return provider.getAllKeys(); },
|
|
80
91
|
setProvider: function (newProvider) {
|
|
81
92
|
provider = newProvider;
|
|
82
93
|
},
|
|
@@ -24,12 +24,15 @@ var VisibilityChangeObserver = /** @class */ (function () {
|
|
|
24
24
|
this._listeners.forEach(function (l) { return l.onVisibilityChanged(visibility); });
|
|
25
25
|
};
|
|
26
26
|
VisibilityChangeObserver._listeners = [];
|
|
27
|
-
VisibilityChangeObserver._current =
|
|
27
|
+
VisibilityChangeObserver._current = 'foreground';
|
|
28
28
|
return VisibilityChangeObserver;
|
|
29
29
|
}());
|
|
30
30
|
exports.VisibilityChangeObserver = VisibilityChangeObserver;
|
|
31
31
|
if (typeof window !== 'undefined' &&
|
|
32
32
|
typeof window.addEventListener === 'function') {
|
|
33
|
+
window.addEventListener('focus', function () {
|
|
34
|
+
return VisibilityChangeObserver.notify('foreground');
|
|
35
|
+
});
|
|
33
36
|
window.addEventListener('blur', function () {
|
|
34
37
|
return VisibilityChangeObserver.notify('background');
|
|
35
38
|
});
|
package/src/index.d.ts
CHANGED
|
@@ -1,23 +1,26 @@
|
|
|
1
1
|
/** Statsig Global should go first */
|
|
2
2
|
import './$_StatsigGlobal';
|
|
3
3
|
import { EventLogger } from './EventLogger';
|
|
4
|
+
import { Log } from './Log';
|
|
5
|
+
import { Storage } from './StorageProvider';
|
|
4
6
|
export * from './$_StatsigGlobal';
|
|
5
7
|
export * from './ClientInterfaces';
|
|
8
|
+
export * from './DataAdapterCore';
|
|
6
9
|
export * from './ErrorBoundary';
|
|
7
10
|
export * from './Hashing';
|
|
8
|
-
export * from './StorageProvider';
|
|
9
11
|
export * from './Log';
|
|
10
12
|
export * from './Monitoring';
|
|
11
13
|
export * from './NetworkCore';
|
|
12
14
|
export * from './StableID';
|
|
13
15
|
export * from './StatsigClientBase';
|
|
14
16
|
export * from './StatsigClientEventEmitter';
|
|
15
|
-
export * from './
|
|
17
|
+
export * from './StatsigDataAdapter';
|
|
16
18
|
export * from './StatsigEvent';
|
|
17
19
|
export * from './StatsigMetadata';
|
|
18
20
|
export * from './StatsigOptionsCommon';
|
|
19
21
|
export * from './StatsigTypes';
|
|
20
22
|
export * from './StatsigUser';
|
|
23
|
+
export * from './StorageProvider';
|
|
21
24
|
export * from './UUID';
|
|
22
25
|
export * from './VisibilityChangeObserver';
|
|
23
|
-
export { EventLogger };
|
|
26
|
+
export { EventLogger, Storage, Log };
|
package/src/index.js
CHANGED
|
@@ -25,28 +25,33 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
25
25
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
26
26
|
};
|
|
27
27
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
28
|
-
exports.EventLogger = void 0;
|
|
28
|
+
exports.Log = exports.Storage = exports.EventLogger = void 0;
|
|
29
29
|
/** Statsig Global should go first */
|
|
30
30
|
require("./$_StatsigGlobal");
|
|
31
31
|
var EventLogger_1 = require("./EventLogger");
|
|
32
32
|
Object.defineProperty(exports, "EventLogger", { enumerable: true, get: function () { return EventLogger_1.EventLogger; } });
|
|
33
|
+
var Log_1 = require("./Log");
|
|
34
|
+
Object.defineProperty(exports, "Log", { enumerable: true, get: function () { return Log_1.Log; } });
|
|
35
|
+
var StorageProvider_1 = require("./StorageProvider");
|
|
36
|
+
Object.defineProperty(exports, "Storage", { enumerable: true, get: function () { return StorageProvider_1.Storage; } });
|
|
33
37
|
__exportStar(require("./$_StatsigGlobal"), exports);
|
|
34
38
|
__exportStar(require("./ClientInterfaces"), exports);
|
|
39
|
+
__exportStar(require("./DataAdapterCore"), exports);
|
|
35
40
|
__exportStar(require("./ErrorBoundary"), exports);
|
|
36
41
|
__exportStar(require("./Hashing"), exports);
|
|
37
|
-
__exportStar(require("./StorageProvider"), exports);
|
|
38
42
|
__exportStar(require("./Log"), exports);
|
|
39
43
|
__exportStar(require("./Monitoring"), exports);
|
|
40
44
|
__exportStar(require("./NetworkCore"), exports);
|
|
41
45
|
__exportStar(require("./StableID"), exports);
|
|
42
46
|
__exportStar(require("./StatsigClientBase"), exports);
|
|
43
47
|
__exportStar(require("./StatsigClientEventEmitter"), exports);
|
|
44
|
-
__exportStar(require("./
|
|
48
|
+
__exportStar(require("./StatsigDataAdapter"), exports);
|
|
45
49
|
__exportStar(require("./StatsigEvent"), exports);
|
|
46
50
|
__exportStar(require("./StatsigMetadata"), exports);
|
|
47
51
|
__exportStar(require("./StatsigOptionsCommon"), exports);
|
|
48
52
|
__exportStar(require("./StatsigTypes"), exports);
|
|
49
53
|
__exportStar(require("./StatsigUser"), exports);
|
|
54
|
+
__exportStar(require("./StorageProvider"), exports);
|
|
50
55
|
__exportStar(require("./UUID"), exports);
|
|
51
56
|
__exportStar(require("./VisibilityChangeObserver"), exports);
|
|
52
|
-
__STATSIG__ = __assign(__assign({}, (__STATSIG__ !== null && __STATSIG__ !== void 0 ? __STATSIG__ : {})), { EventLogger: EventLogger_1.EventLogger });
|
|
57
|
+
__STATSIG__ = __assign(__assign({}, (__STATSIG__ !== null && __STATSIG__ !== void 0 ? __STATSIG__ : {})), { EventLogger: EventLogger_1.EventLogger, Log: Log_1.Log, Storage: StorageProvider_1.Storage });
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { StatsigUser } from './StatsigUser';
|
|
2
|
-
export type DataSource = 'Uninitialized' | 'Loading' | 'NoValues' | 'Cache' | 'Network' | 'Bootstrap' | 'Prefetch';
|
|
3
|
-
export type StatsigDataProvider = {
|
|
4
|
-
readonly getData?: (sdkKey: string, user?: StatsigUser) => string | null;
|
|
5
|
-
readonly getDataAsync?: (sdkKey: string, user?: StatsigUser) => Promise<string | null>;
|
|
6
|
-
readonly getDataPostInit?: (sdkKey: string, user?: StatsigUser) => Promise<string | null>;
|
|
7
|
-
readonly setDataPostInit?: (sdkKey: string, data: string, user?: StatsigUser) => Promise<void>;
|
|
8
|
-
readonly source: DataSource;
|
|
9
|
-
};
|