@statsig/client-core 0.0.1-beta.1
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 +5 -0
- package/package.json +8 -0
- package/src/$_StatsigGlobal.d.ts +10 -0
- package/src/$_StatsigGlobal.js +14 -0
- package/src/ClientInterfaces.d.ts +28 -0
- package/src/ClientInterfaces.js +2 -0
- package/src/Diagnostics.d.ts +5 -0
- package/src/Diagnostics.js +54 -0
- package/src/ErrorBoundary.d.ts +9 -0
- package/src/ErrorBoundary.js +131 -0
- package/src/EventLogger.d.ts +31 -0
- package/src/EventLogger.js +285 -0
- package/src/Hashing.d.ts +1 -0
- package/src/Hashing.js +13 -0
- package/src/Log.d.ts +14 -0
- package/src/Log.js +59 -0
- package/src/Monitoring.d.ts +3 -0
- package/src/Monitoring.js +33 -0
- package/src/NetworkCore.d.ts +22 -0
- package/src/NetworkCore.js +197 -0
- package/src/SessionID.d.ts +3 -0
- package/src/SessionID.js +13 -0
- package/src/StableID.d.ts +4 -0
- package/src/StableID.js +78 -0
- package/src/StatsigClientBase.d.ts +37 -0
- package/src/StatsigClientBase.js +272 -0
- package/src/StatsigClientEventEmitter.d.ts +33 -0
- package/src/StatsigClientEventEmitter.js +2 -0
- package/src/StatsigDataProvider.d.ts +9 -0
- package/src/StatsigDataProvider.js +2 -0
- package/src/StatsigEvent.d.ts +31 -0
- package/src/StatsigEvent.js +57 -0
- package/src/StatsigMetadata.d.ts +18 -0
- package/src/StatsigMetadata.js +25 -0
- package/src/StatsigOptionsCommon.d.ts +48 -0
- package/src/StatsigOptionsCommon.js +2 -0
- package/src/StatsigTypes.d.ts +22 -0
- package/src/StatsigTypes.js +31 -0
- package/src/StatsigUser.d.ts +24 -0
- package/src/StatsigUser.js +37 -0
- package/src/StorageProvider.d.ts +11 -0
- package/src/StorageProvider.js +110 -0
- package/src/UUID.d.ts +1 -0
- package/src/UUID.js +24 -0
- package/src/VisibilityChangeObserver.d.ts +13 -0
- package/src/VisibilityChangeObserver.js +45 -0
- package/src/__tests__/MockLocalStorage.d.ts +9 -0
- package/src/__tests__/MockLocalStorage.js +37 -0
- package/src/index.d.ts +23 -0
- package/src/index.js +52 -0
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
var __asyncValues = (this && this.__asyncValues) || function (o) {
|
|
39
|
+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
40
|
+
var m = o[Symbol.asyncIterator], i;
|
|
41
|
+
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
|
|
42
|
+
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
|
|
43
|
+
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
|
|
44
|
+
};
|
|
45
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
+
exports.StatsigClientBase = exports.DEFAULT_EVAL_OPTIONS = void 0;
|
|
47
|
+
require("./$_StatsigGlobal");
|
|
48
|
+
var ErrorBoundary_1 = require("./ErrorBoundary");
|
|
49
|
+
var EventLogger_1 = require("./EventLogger");
|
|
50
|
+
var Log_1 = require("./Log");
|
|
51
|
+
var StableID_1 = require("./StableID");
|
|
52
|
+
exports.DEFAULT_EVAL_OPTIONS = {
|
|
53
|
+
disableExposureLog: false,
|
|
54
|
+
};
|
|
55
|
+
var StatsigClientBase = /** @class */ (function () {
|
|
56
|
+
function StatsigClientBase(sdkKey, network, options, dataProviders) {
|
|
57
|
+
var _a, _b;
|
|
58
|
+
this.loadingStatus = 'Uninitialized';
|
|
59
|
+
this._listeners = {};
|
|
60
|
+
this._logger = new EventLogger_1.EventLogger(sdkKey, this.emit.bind(this), network, options);
|
|
61
|
+
this._sdkKey = sdkKey;
|
|
62
|
+
this._errorBoundary = new ErrorBoundary_1.ErrorBoundary(sdkKey);
|
|
63
|
+
if (options === null || options === void 0 ? void 0 : options.overrideStableID) {
|
|
64
|
+
StableID_1.StableID.setOverride(options.overrideStableID, sdkKey);
|
|
65
|
+
}
|
|
66
|
+
__STATSIG__ = __STATSIG__ !== null && __STATSIG__ !== void 0 ? __STATSIG__ : {};
|
|
67
|
+
var instances = (_a = __STATSIG__.instances) !== null && _a !== void 0 ? _a : new Set();
|
|
68
|
+
instances.add(this);
|
|
69
|
+
__STATSIG__.instances = instances;
|
|
70
|
+
Log_1.Log.level = (_b = options === null || options === void 0 ? void 0 : options.logLevel) !== null && _b !== void 0 ? _b : Log_1.LogLevel.Error;
|
|
71
|
+
this._dataProviders = dataProviders;
|
|
72
|
+
}
|
|
73
|
+
StatsigClientBase.prototype.on = function (event, listener) {
|
|
74
|
+
if (!this._listeners[event]) {
|
|
75
|
+
this._listeners[event] = [];
|
|
76
|
+
}
|
|
77
|
+
this._listeners[event].push(listener);
|
|
78
|
+
};
|
|
79
|
+
StatsigClientBase.prototype.off = function (event, listener) {
|
|
80
|
+
if (this._listeners[event]) {
|
|
81
|
+
var index = this._listeners[event].indexOf(listener);
|
|
82
|
+
if (index !== -1) {
|
|
83
|
+
this._listeners[event].splice(index, 1);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
StatsigClientBase.prototype.emit = function (data) {
|
|
88
|
+
var _a;
|
|
89
|
+
if (this._listeners[data.event]) {
|
|
90
|
+
this._listeners[data.event].forEach(function (listener) { return listener(data); });
|
|
91
|
+
}
|
|
92
|
+
(_a = this._listeners['*']) === null || _a === void 0 ? void 0 : _a.forEach(function (listener) { return listener(data); });
|
|
93
|
+
};
|
|
94
|
+
StatsigClientBase.prototype._setStatus = function (newStatus) {
|
|
95
|
+
this.loadingStatus = newStatus;
|
|
96
|
+
this.emit({ event: 'status_change', loadingStatus: newStatus });
|
|
97
|
+
};
|
|
98
|
+
StatsigClientBase.prototype._getDataFromProviders = function (user) {
|
|
99
|
+
var _a;
|
|
100
|
+
for (var _i = 0, _b = this._dataProviders; _i < _b.length; _i++) {
|
|
101
|
+
var provider = _b[_i];
|
|
102
|
+
var data = (_a = provider.getData) === null || _a === void 0 ? void 0 : _a.call(provider, this._sdkKey, user);
|
|
103
|
+
if (data) {
|
|
104
|
+
return { data: data, source: provider.source };
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return { data: null, source: 'NoValues' };
|
|
108
|
+
};
|
|
109
|
+
StatsigClientBase.prototype._getDataFromProvidersAsync = function (user) {
|
|
110
|
+
var _a, e_1, _b, _c;
|
|
111
|
+
var _d;
|
|
112
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
113
|
+
var _e, _f, _g, provider, data, e_1_1;
|
|
114
|
+
return __generator(this, function (_h) {
|
|
115
|
+
switch (_h.label) {
|
|
116
|
+
case 0:
|
|
117
|
+
_h.trys.push([0, 6, 7, 12]);
|
|
118
|
+
_e = true, _f = __asyncValues(this._dataProviders);
|
|
119
|
+
_h.label = 1;
|
|
120
|
+
case 1: return [4 /*yield*/, _f.next()];
|
|
121
|
+
case 2:
|
|
122
|
+
if (!(_g = _h.sent(), _a = _g.done, !_a)) return [3 /*break*/, 5];
|
|
123
|
+
_c = _g.value;
|
|
124
|
+
_e = false;
|
|
125
|
+
provider = _c;
|
|
126
|
+
return [4 /*yield*/, ((_d = provider.getDataAsync) === null || _d === void 0 ? void 0 : _d.call(provider, this._sdkKey, user))];
|
|
127
|
+
case 3:
|
|
128
|
+
data = _h.sent();
|
|
129
|
+
if (data) {
|
|
130
|
+
return [2 /*return*/, { data: data, source: provider.source }];
|
|
131
|
+
}
|
|
132
|
+
_h.label = 4;
|
|
133
|
+
case 4:
|
|
134
|
+
_e = true;
|
|
135
|
+
return [3 /*break*/, 1];
|
|
136
|
+
case 5: return [3 /*break*/, 12];
|
|
137
|
+
case 6:
|
|
138
|
+
e_1_1 = _h.sent();
|
|
139
|
+
e_1 = { error: e_1_1 };
|
|
140
|
+
return [3 /*break*/, 12];
|
|
141
|
+
case 7:
|
|
142
|
+
_h.trys.push([7, , 10, 11]);
|
|
143
|
+
if (!(!_e && !_a && (_b = _f.return))) return [3 /*break*/, 9];
|
|
144
|
+
return [4 /*yield*/, _b.call(_f)];
|
|
145
|
+
case 8:
|
|
146
|
+
_h.sent();
|
|
147
|
+
_h.label = 9;
|
|
148
|
+
case 9: return [3 /*break*/, 11];
|
|
149
|
+
case 10:
|
|
150
|
+
if (e_1) throw e_1.error;
|
|
151
|
+
return [7 /*endfinally*/];
|
|
152
|
+
case 11: return [7 /*endfinally*/];
|
|
153
|
+
case 12: return [2 /*return*/, { data: null, source: 'NoValues' }];
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
};
|
|
158
|
+
StatsigClientBase.prototype._getDataPostInitFromProviders = function (user) {
|
|
159
|
+
var _a, e_2, _b, _c;
|
|
160
|
+
var _d;
|
|
161
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
162
|
+
var _e, _f, _g, provider, data, e_2_1;
|
|
163
|
+
return __generator(this, function (_h) {
|
|
164
|
+
switch (_h.label) {
|
|
165
|
+
case 0:
|
|
166
|
+
_h.trys.push([0, 6, 7, 12]);
|
|
167
|
+
_e = true, _f = __asyncValues(this._dataProviders);
|
|
168
|
+
_h.label = 1;
|
|
169
|
+
case 1: return [4 /*yield*/, _f.next()];
|
|
170
|
+
case 2:
|
|
171
|
+
if (!(_g = _h.sent(), _a = _g.done, !_a)) return [3 /*break*/, 5];
|
|
172
|
+
_c = _g.value;
|
|
173
|
+
_e = false;
|
|
174
|
+
provider = _c;
|
|
175
|
+
return [4 /*yield*/, ((_d = provider.getDataPostInit) === null || _d === void 0 ? void 0 : _d.call(provider, this._sdkKey, user))];
|
|
176
|
+
case 3:
|
|
177
|
+
data = _h.sent();
|
|
178
|
+
if (data) {
|
|
179
|
+
return [2 /*return*/, { data: data, source: provider.source }];
|
|
180
|
+
}
|
|
181
|
+
_h.label = 4;
|
|
182
|
+
case 4:
|
|
183
|
+
_e = true;
|
|
184
|
+
return [3 /*break*/, 1];
|
|
185
|
+
case 5: return [3 /*break*/, 12];
|
|
186
|
+
case 6:
|
|
187
|
+
e_2_1 = _h.sent();
|
|
188
|
+
e_2 = { error: e_2_1 };
|
|
189
|
+
return [3 /*break*/, 12];
|
|
190
|
+
case 7:
|
|
191
|
+
_h.trys.push([7, , 10, 11]);
|
|
192
|
+
if (!(!_e && !_a && (_b = _f.return))) return [3 /*break*/, 9];
|
|
193
|
+
return [4 /*yield*/, _b.call(_f)];
|
|
194
|
+
case 8:
|
|
195
|
+
_h.sent();
|
|
196
|
+
_h.label = 9;
|
|
197
|
+
case 9: return [3 /*break*/, 11];
|
|
198
|
+
case 10:
|
|
199
|
+
if (e_2) throw e_2.error;
|
|
200
|
+
return [7 /*endfinally*/];
|
|
201
|
+
case 11: return [7 /*endfinally*/];
|
|
202
|
+
case 12: return [2 /*return*/, { data: null, source: 'NoValues' }];
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
};
|
|
207
|
+
StatsigClientBase.prototype._saveToDataProviders = function (data, user) {
|
|
208
|
+
var _this = this;
|
|
209
|
+
(function () { return __awaiter(_this, void 0, void 0, function () {
|
|
210
|
+
var localResult, _a, _b, _c, provider, e_3_1;
|
|
211
|
+
var _d, e_3, _e, _f;
|
|
212
|
+
var _g, _h;
|
|
213
|
+
return __generator(this, function (_j) {
|
|
214
|
+
switch (_j.label) {
|
|
215
|
+
case 0: return [4 /*yield*/, this._getDataPostInitFromProviders(user)];
|
|
216
|
+
case 1:
|
|
217
|
+
localResult = _j.sent();
|
|
218
|
+
data = (_g = localResult.data) !== null && _g !== void 0 ? _g : data;
|
|
219
|
+
if (!data) {
|
|
220
|
+
return [2 /*return*/];
|
|
221
|
+
}
|
|
222
|
+
_j.label = 2;
|
|
223
|
+
case 2:
|
|
224
|
+
_j.trys.push([2, 8, 9, 14]);
|
|
225
|
+
_a = true, _b = __asyncValues(this._dataProviders);
|
|
226
|
+
_j.label = 3;
|
|
227
|
+
case 3: return [4 /*yield*/, _b.next()];
|
|
228
|
+
case 4:
|
|
229
|
+
if (!(_c = _j.sent(), _d = _c.done, !_d)) return [3 /*break*/, 7];
|
|
230
|
+
_f = _c.value;
|
|
231
|
+
_a = false;
|
|
232
|
+
provider = _f;
|
|
233
|
+
return [4 /*yield*/, ((_h = provider.setDataPostInit) === null || _h === void 0 ? void 0 : _h.call(provider, this._sdkKey, data, user))];
|
|
234
|
+
case 5:
|
|
235
|
+
_j.sent();
|
|
236
|
+
_j.label = 6;
|
|
237
|
+
case 6:
|
|
238
|
+
_a = true;
|
|
239
|
+
return [3 /*break*/, 3];
|
|
240
|
+
case 7: return [3 /*break*/, 14];
|
|
241
|
+
case 8:
|
|
242
|
+
e_3_1 = _j.sent();
|
|
243
|
+
e_3 = { error: e_3_1 };
|
|
244
|
+
return [3 /*break*/, 14];
|
|
245
|
+
case 9:
|
|
246
|
+
_j.trys.push([9, , 12, 13]);
|
|
247
|
+
if (!(!_a && !_d && (_e = _b.return))) return [3 /*break*/, 11];
|
|
248
|
+
return [4 /*yield*/, _e.call(_b)];
|
|
249
|
+
case 10:
|
|
250
|
+
_j.sent();
|
|
251
|
+
_j.label = 11;
|
|
252
|
+
case 11: return [3 /*break*/, 13];
|
|
253
|
+
case 12:
|
|
254
|
+
if (e_3) throw e_3.error;
|
|
255
|
+
return [7 /*endfinally*/];
|
|
256
|
+
case 13: return [7 /*endfinally*/];
|
|
257
|
+
case 14: return [2 /*return*/];
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
}); })().catch(function (error) {
|
|
261
|
+
_this.emit({ event: 'error', error: error });
|
|
262
|
+
});
|
|
263
|
+
};
|
|
264
|
+
StatsigClientBase.prototype._enqueueExposure = function (options, exposure) {
|
|
265
|
+
if (options.disableExposureLog === true) {
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
this._logger.enqueue(exposure);
|
|
269
|
+
};
|
|
270
|
+
return StatsigClientBase;
|
|
271
|
+
}());
|
|
272
|
+
exports.StatsigClientBase = StatsigClientBase;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { DynamicConfig, Experiment, FeatureGate, Layer } from './StatsigTypes';
|
|
2
|
+
export type StatsigLoadingStatus = 'Uninitialized' | 'Loading' | 'Ready' | 'Error';
|
|
3
|
+
export type StatsigClientEvent = 'status_change' | 'error' | 'logs_flushed' | 'gate_evaluation' | 'dynamic_config_evaluation' | 'experiment_evaluation' | 'layer_evaluation';
|
|
4
|
+
export type StatsigClientEventData = {
|
|
5
|
+
event: StatsigClientEvent;
|
|
6
|
+
} | {
|
|
7
|
+
event: 'status_change';
|
|
8
|
+
loadingStatus: StatsigLoadingStatus;
|
|
9
|
+
} | {
|
|
10
|
+
event: 'error';
|
|
11
|
+
error: unknown;
|
|
12
|
+
} | {
|
|
13
|
+
event: 'logs_flushed';
|
|
14
|
+
events: Record<string, unknown>[];
|
|
15
|
+
} | {
|
|
16
|
+
event: 'gate_evaluation';
|
|
17
|
+
gate: FeatureGate;
|
|
18
|
+
} | {
|
|
19
|
+
event: 'dynamic_config_evaluation';
|
|
20
|
+
dynamicConfig: DynamicConfig;
|
|
21
|
+
} | {
|
|
22
|
+
event: 'experiment_evaluation';
|
|
23
|
+
experiment: Experiment;
|
|
24
|
+
} | {
|
|
25
|
+
event: 'layer_evaluation';
|
|
26
|
+
layer: Layer;
|
|
27
|
+
};
|
|
28
|
+
export type StatsigClientEventCallback = (data: StatsigClientEventData) => void;
|
|
29
|
+
export interface StatsigClientEventEmitterInterface {
|
|
30
|
+
readonly loadingStatus: StatsigLoadingStatus;
|
|
31
|
+
on(event: StatsigClientEvent, listener: StatsigClientEventCallback): void;
|
|
32
|
+
off(event: StatsigClientEvent, listener: StatsigClientEventCallback): void;
|
|
33
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
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
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { DataSource } from './StatsigDataProvider';
|
|
2
|
+
import { DynamicConfig, FeatureGate } from './StatsigTypes';
|
|
3
|
+
import { StatsigUser } from './StatsigUser';
|
|
4
|
+
export type SecondaryExposure = {
|
|
5
|
+
gate: string;
|
|
6
|
+
gateValue: string;
|
|
7
|
+
ruleID: string;
|
|
8
|
+
};
|
|
9
|
+
export type StatsigEvent = {
|
|
10
|
+
eventName: string;
|
|
11
|
+
value?: string | number | null;
|
|
12
|
+
metadata?: {
|
|
13
|
+
[key: string]: string;
|
|
14
|
+
} | null;
|
|
15
|
+
};
|
|
16
|
+
export type StatsigEventInternal = StatsigEvent & {
|
|
17
|
+
user: StatsigUser | null;
|
|
18
|
+
time: number;
|
|
19
|
+
secondaryExposures?: SecondaryExposure[];
|
|
20
|
+
};
|
|
21
|
+
export declare function isExposureEvent({ eventName }: StatsigEventInternal): boolean;
|
|
22
|
+
export declare function createGateExposure(user: StatsigUser, gate: FeatureGate, secondaryExposures: SecondaryExposure[] | undefined): StatsigEventInternal;
|
|
23
|
+
export declare function createConfigExposure(user: StatsigUser, config: DynamicConfig, secondaryExposures: SecondaryExposure[] | undefined): StatsigEventInternal;
|
|
24
|
+
export declare function createLayerParameterExposure(user: StatsigUser, layerName: string, parameterName: string, spec: {
|
|
25
|
+
rule_id: string;
|
|
26
|
+
explicit_parameters: string[];
|
|
27
|
+
undelegated_secondary_exposures?: SecondaryExposure[];
|
|
28
|
+
secondary_exposures: SecondaryExposure[];
|
|
29
|
+
allocated_experiment_name: string;
|
|
30
|
+
source: DataSource;
|
|
31
|
+
}): StatsigEventInternal;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createLayerParameterExposure = exports.createConfigExposure = exports.createGateExposure = exports.isExposureEvent = void 0;
|
|
4
|
+
var CONFIG_EXPOSURE_NAME = 'statsig::config_exposure';
|
|
5
|
+
var GATE_EXPOSURE_NAME = 'statsig::gate_exposure';
|
|
6
|
+
var LAYER_EXPOSURE_NAME = 'statsig::layer_exposure';
|
|
7
|
+
function createExposure(eventName, user, metadata, secondaryExposures) {
|
|
8
|
+
return {
|
|
9
|
+
eventName: eventName,
|
|
10
|
+
user: user,
|
|
11
|
+
value: null,
|
|
12
|
+
metadata: metadata,
|
|
13
|
+
secondaryExposures: secondaryExposures,
|
|
14
|
+
time: Date.now(),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function isExposureEvent(_a) {
|
|
18
|
+
var eventName = _a.eventName;
|
|
19
|
+
return eventName === GATE_EXPOSURE_NAME || eventName === CONFIG_EXPOSURE_NAME;
|
|
20
|
+
}
|
|
21
|
+
exports.isExposureEvent = isExposureEvent;
|
|
22
|
+
function createGateExposure(user, gate, secondaryExposures) {
|
|
23
|
+
return createExposure(GATE_EXPOSURE_NAME, user, {
|
|
24
|
+
gate: gate.name,
|
|
25
|
+
gateValue: String(gate.value),
|
|
26
|
+
ruleID: gate.ruleID,
|
|
27
|
+
reason: gate.source,
|
|
28
|
+
}, secondaryExposures !== null && secondaryExposures !== void 0 ? secondaryExposures : []);
|
|
29
|
+
}
|
|
30
|
+
exports.createGateExposure = createGateExposure;
|
|
31
|
+
function createConfigExposure(user, config, secondaryExposures) {
|
|
32
|
+
return createExposure(CONFIG_EXPOSURE_NAME, user, {
|
|
33
|
+
config: config.name,
|
|
34
|
+
ruleID: config.ruleID,
|
|
35
|
+
reason: config.source,
|
|
36
|
+
}, secondaryExposures !== null && secondaryExposures !== void 0 ? secondaryExposures : []);
|
|
37
|
+
}
|
|
38
|
+
exports.createConfigExposure = createConfigExposure;
|
|
39
|
+
function createLayerParameterExposure(user, layerName, parameterName, spec) {
|
|
40
|
+
var _a;
|
|
41
|
+
var isExplicit = spec.explicit_parameters.includes(parameterName);
|
|
42
|
+
var allocatedExperiment = '';
|
|
43
|
+
var secondaryExposures = (_a = spec.undelegated_secondary_exposures) !== null && _a !== void 0 ? _a : [];
|
|
44
|
+
if (isExplicit) {
|
|
45
|
+
allocatedExperiment = spec.allocated_experiment_name;
|
|
46
|
+
secondaryExposures = spec.secondary_exposures;
|
|
47
|
+
}
|
|
48
|
+
return createExposure(LAYER_EXPOSURE_NAME, user, {
|
|
49
|
+
config: layerName,
|
|
50
|
+
parameterName: parameterName,
|
|
51
|
+
ruleID: spec.rule_id,
|
|
52
|
+
allocatedExperiment: allocatedExperiment,
|
|
53
|
+
isExplicitParameter: String(isExplicit),
|
|
54
|
+
reason: spec.source,
|
|
55
|
+
}, secondaryExposures);
|
|
56
|
+
}
|
|
57
|
+
exports.createLayerParameterExposure = createLayerParameterExposure;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type StatsigMetadata = {
|
|
2
|
+
readonly [key: string]: string | undefined;
|
|
3
|
+
readonly appVersion?: string;
|
|
4
|
+
readonly deviceModel?: string;
|
|
5
|
+
readonly deviceModelName?: string;
|
|
6
|
+
readonly locale?: string;
|
|
7
|
+
readonly sdkType: string;
|
|
8
|
+
readonly sdkVersion: string;
|
|
9
|
+
readonly stableID?: string;
|
|
10
|
+
readonly systemName?: string;
|
|
11
|
+
readonly systemVersion?: string;
|
|
12
|
+
};
|
|
13
|
+
export declare const StatsigMetadataProvider: {
|
|
14
|
+
get: () => StatsigMetadata;
|
|
15
|
+
add: (additions: {
|
|
16
|
+
[key: string]: string | undefined;
|
|
17
|
+
}) => void;
|
|
18
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.StatsigMetadataProvider = void 0;
|
|
15
|
+
var SDK_VERSION = '0.0.1-beta.1';
|
|
16
|
+
var metadata = {
|
|
17
|
+
sdkVersion: SDK_VERSION,
|
|
18
|
+
sdkType: 'js-mono', // js-mono is overwritten by Precomp and OnDevice clients
|
|
19
|
+
};
|
|
20
|
+
exports.StatsigMetadataProvider = {
|
|
21
|
+
get: function () { return metadata; },
|
|
22
|
+
add: function (additions) {
|
|
23
|
+
metadata = __assign(__assign({}, metadata), additions);
|
|
24
|
+
},
|
|
25
|
+
};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { LogLevel } from './Log';
|
|
2
|
+
import { StatsigDataProvider } from './StatsigDataProvider';
|
|
3
|
+
/** Common options for configuring the Statsig SDK. */
|
|
4
|
+
export type StatsigOptionsCommon = {
|
|
5
|
+
/**
|
|
6
|
+
* The API to use for all SDK network requests. You should not need to override this
|
|
7
|
+
* unless you have another API that implements the Statsig API endpoints.
|
|
8
|
+
*/
|
|
9
|
+
api?: string;
|
|
10
|
+
/**
|
|
11
|
+
* An object you can use to set environment variables that apply to all of your users
|
|
12
|
+
* in the same session.
|
|
13
|
+
*/
|
|
14
|
+
environment?: StatsigEnvironment;
|
|
15
|
+
/**
|
|
16
|
+
* Overrides the auto-generated StableID that is set for the device.
|
|
17
|
+
*/
|
|
18
|
+
overrideStableID?: string;
|
|
19
|
+
/**
|
|
20
|
+
* How much information is allowed to be printed to the console.
|
|
21
|
+
* Default: LogLevel.Error
|
|
22
|
+
*/
|
|
23
|
+
logLevel?: LogLevel;
|
|
24
|
+
/**
|
|
25
|
+
* StatsigDataProvider implementors used to customize the initialization flow.
|
|
26
|
+
* Default: LocalStorageCache then Network
|
|
27
|
+
*/
|
|
28
|
+
dataProviders?: StatsigDataProvider[];
|
|
29
|
+
/**
|
|
30
|
+
* The maximum amount of time (in milliseconds) that any network request can take
|
|
31
|
+
* before timing out. Default: 10,000 (10 seconds)
|
|
32
|
+
*/
|
|
33
|
+
networkTimeoutMs?: number;
|
|
34
|
+
/**
|
|
35
|
+
* The maximum number of events to batch before flushing logs to Statsig.
|
|
36
|
+
* Default: 50
|
|
37
|
+
*/
|
|
38
|
+
loggingBufferMaxSize?: number;
|
|
39
|
+
/**
|
|
40
|
+
* How often (in milliseconds) to flush logs to Statsig.
|
|
41
|
+
* Default: 10,000 (10 seconds)
|
|
42
|
+
*/
|
|
43
|
+
loggingIntervalMs?: number;
|
|
44
|
+
};
|
|
45
|
+
export type StatsigEnvironment = {
|
|
46
|
+
tier?: string;
|
|
47
|
+
[key: string]: string | undefined;
|
|
48
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export type Flatten<T> = {
|
|
2
|
+
[K in keyof T]: T[K];
|
|
3
|
+
} & {};
|
|
4
|
+
type EvaluatedSpec = {
|
|
5
|
+
readonly name: string;
|
|
6
|
+
readonly ruleID: string;
|
|
7
|
+
readonly source: string;
|
|
8
|
+
};
|
|
9
|
+
export type FeatureGate = EvaluatedSpec & {
|
|
10
|
+
readonly value: boolean;
|
|
11
|
+
};
|
|
12
|
+
export type DynamicConfig = EvaluatedSpec & {
|
|
13
|
+
readonly value: Record<string, unknown>;
|
|
14
|
+
};
|
|
15
|
+
export type Experiment = DynamicConfig;
|
|
16
|
+
export type Layer = EvaluatedSpec & {
|
|
17
|
+
readonly getValue: (parameterName: string) => unknown;
|
|
18
|
+
};
|
|
19
|
+
export declare function makeFeatureGate(name: string, source: string, ruleID?: string, value?: boolean): FeatureGate;
|
|
20
|
+
export declare function makeDynamicConfig(name: string, source: string, ruleID?: string, value?: Record<string, unknown>): DynamicConfig;
|
|
21
|
+
export declare function makeLayer(name: string, source: string, ruleID?: string, getValue?: (param: string) => unknown): Layer;
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.makeLayer = exports.makeDynamicConfig = exports.makeFeatureGate = void 0;
|
|
4
|
+
var DEFAULT_RULE = 'default';
|
|
5
|
+
function makeFeatureGate(name, source, ruleID, value) {
|
|
6
|
+
return {
|
|
7
|
+
name: name,
|
|
8
|
+
source: source,
|
|
9
|
+
ruleID: ruleID !== null && ruleID !== void 0 ? ruleID : DEFAULT_RULE,
|
|
10
|
+
value: value === true,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
exports.makeFeatureGate = makeFeatureGate;
|
|
14
|
+
function makeDynamicConfig(name, source, ruleID, value) {
|
|
15
|
+
return {
|
|
16
|
+
name: name,
|
|
17
|
+
source: source,
|
|
18
|
+
ruleID: ruleID !== null && ruleID !== void 0 ? ruleID : DEFAULT_RULE,
|
|
19
|
+
value: value !== null && value !== void 0 ? value : {},
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
exports.makeDynamicConfig = makeDynamicConfig;
|
|
23
|
+
function makeLayer(name, source, ruleID, getValue) {
|
|
24
|
+
return {
|
|
25
|
+
name: name,
|
|
26
|
+
source: source,
|
|
27
|
+
getValue: getValue !== null && getValue !== void 0 ? getValue : (function () { return undefined; }),
|
|
28
|
+
ruleID: ruleID !== null && ruleID !== void 0 ? ruleID : DEFAULT_RULE,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
exports.makeLayer = makeLayer;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { StatsigEnvironment } from './StatsigOptionsCommon';
|
|
2
|
+
type StatsigUserPrimitives = string | number | boolean | Array<string> | undefined;
|
|
3
|
+
export type StatsigUser = ({
|
|
4
|
+
userID: string;
|
|
5
|
+
} | {
|
|
6
|
+
customIDs: Record<string, string>;
|
|
7
|
+
}) & {
|
|
8
|
+
userID?: string;
|
|
9
|
+
customIDs?: Record<string, string>;
|
|
10
|
+
email?: string;
|
|
11
|
+
ip?: string;
|
|
12
|
+
userAgent?: string;
|
|
13
|
+
country?: string;
|
|
14
|
+
locale?: string;
|
|
15
|
+
appVersion?: string;
|
|
16
|
+
custom?: Record<string, StatsigUserPrimitives>;
|
|
17
|
+
privateAttributes?: Record<string, StatsigUserPrimitives> | null;
|
|
18
|
+
};
|
|
19
|
+
export type StatsigUserInternal = StatsigUser & {
|
|
20
|
+
statsigEnvironment?: StatsigEnvironment;
|
|
21
|
+
};
|
|
22
|
+
export declare function normalizeUser(original: StatsigUser, environment?: StatsigEnvironment): StatsigUser;
|
|
23
|
+
export declare function getUserStorageKey(sdkKey: string, user?: StatsigUser): string;
|
|
24
|
+
export {};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getUserStorageKey = exports.normalizeUser = void 0;
|
|
4
|
+
var Hashing_1 = require("./Hashing");
|
|
5
|
+
function normalizeUser(original, environment) {
|
|
6
|
+
try {
|
|
7
|
+
var copy = JSON.parse(JSON.stringify(original));
|
|
8
|
+
if (environment != null) {
|
|
9
|
+
copy.statsigEnvironment = environment;
|
|
10
|
+
}
|
|
11
|
+
return copy;
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
throw new Error('User object must be convertable to JSON string.');
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.normalizeUser = normalizeUser;
|
|
18
|
+
function getUserStorageKey(sdkKey, user) {
|
|
19
|
+
var _a, _b;
|
|
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('|'));
|
|
36
|
+
}
|
|
37
|
+
exports.getUserStorageKey = getUserStorageKey;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
type StorageProvider = {
|
|
2
|
+
getItem: (key: string) => Promise<string | null>;
|
|
3
|
+
setItem: (key: string, value: string) => Promise<void>;
|
|
4
|
+
removeItem: (key: string) => Promise<void>;
|
|
5
|
+
};
|
|
6
|
+
export declare const Storage: StorageProvider & {
|
|
7
|
+
setProvider: (n: StorageProvider) => void;
|
|
8
|
+
};
|
|
9
|
+
export declare function getObjectFromStorage<T>(key: string): Promise<T | null>;
|
|
10
|
+
export declare function setObjectInStorage(key: string, obj: unknown): Promise<void>;
|
|
11
|
+
export {};
|