@statsig/client-core 0.0.1-beta.2 → 0.0.1-beta.21
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 +1 -1
- package/package.json +1 -1
- package/src/$_StatsigGlobal.d.ts +2 -1
- package/src/$_StatsigGlobal.js +10 -12
- package/src/ClientInterfaces.d.ts +20 -13
- package/src/DataAdapterCore.d.ts +32 -0
- package/src/DataAdapterCore.js +167 -0
- package/src/Diagnostics.js +21 -26
- package/src/ErrorBoundary.d.ts +1 -0
- package/src/ErrorBoundary.js +39 -86
- package/src/EvaluationOptions.d.ts +20 -0
- package/src/EvaluationTypes.d.ts +39 -0
- package/src/EvaluationTypes.js +2 -0
- package/src/EventLogger.d.ts +17 -4
- package/src/EventLogger.js +186 -225
- package/src/Hashing.d.ts +1 -0
- package/src/Hashing.js +23 -4
- package/src/Log.js +15 -34
- package/src/Monitoring.d.ts +1 -2
- package/src/Monitoring.js +68 -27
- package/src/NetworkCore.d.ts +13 -5
- package/src/NetworkCore.js +96 -164
- package/src/OverrideAdapter.d.ts +16 -0
- package/src/OverrideAdapter.js +24 -0
- package/src/SessionID.js +3 -3
- package/src/StableID.js +23 -52
- package/src/StatsigClientBase.d.ts +20 -29
- package/src/StatsigClientBase.js +58 -248
- package/src/StatsigClientEventEmitter.d.ts +55 -28
- package/src/StatsigDataAdapter.d.ts +89 -0
- package/src/StatsigDataAdapter.js +4 -0
- package/src/StatsigEvent.d.ts +9 -18
- package/src/StatsigEvent.js +40 -31
- package/src/StatsigMetadata.js +5 -16
- package/src/StatsigOptionsCommon.d.ts +42 -12
- package/src/StatsigTypes.d.ts +23 -15
- package/src/StatsigTypes.js +23 -16
- package/src/StatsigUser.d.ts +1 -0
- package/src/StatsigUser.js +12 -20
- package/src/StorageProvider.d.ts +7 -2
- package/src/StorageProvider.js +53 -62
- package/src/TypedJsonParse.d.ts +8 -0
- package/src/TypedJsonParse.js +27 -0
- package/src/UUID.js +9 -5
- package/src/UrlOverrides.d.ts +1 -0
- package/src/UrlOverrides.js +15 -0
- package/src/UtitlityTypes.d.ts +3 -0
- package/src/UtitlityTypes.js +2 -0
- package/src/VisibilityChangeObserver.js +18 -24
- package/src/__tests__/MockLocalStorage.js +18 -19
- package/src/index.d.ts +12 -3
- package/src/index.js +18 -16
- package/src/StatsigDataProvider.d.ts +0 -9
- /package/src/{StatsigDataProvider.js → EvaluationOptions.js} +0 -0
package/src/StatsigMetadata.js
CHANGED
|
@@ -1,25 +1,14 @@
|
|
|
1
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
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
3
|
exports.StatsigMetadataProvider = void 0;
|
|
15
|
-
|
|
16
|
-
|
|
4
|
+
const SDK_VERSION = '0.0.1-beta.21';
|
|
5
|
+
let metadata = {
|
|
17
6
|
sdkVersion: SDK_VERSION,
|
|
18
7
|
sdkType: 'js-mono', // js-mono is overwritten by Precomp and OnDevice clients
|
|
19
8
|
};
|
|
20
9
|
exports.StatsigMetadataProvider = {
|
|
21
|
-
get:
|
|
22
|
-
add:
|
|
23
|
-
metadata =
|
|
10
|
+
get: () => metadata,
|
|
11
|
+
add: (additions) => {
|
|
12
|
+
metadata = Object.assign(Object.assign({}, metadata), additions);
|
|
24
13
|
},
|
|
25
14
|
};
|
|
@@ -1,12 +1,37 @@
|
|
|
1
1
|
import { LogLevel } from './Log';
|
|
2
|
-
import {
|
|
3
|
-
/**
|
|
4
|
-
export type
|
|
2
|
+
import { OverrideAdapter } from './OverrideAdapter';
|
|
3
|
+
/** Options that can be set at init and updated during runtime. */
|
|
4
|
+
export type StatsigRuntimeMutableOptions = {
|
|
5
|
+
/**
|
|
6
|
+
* Prevents writing anything to storage.
|
|
7
|
+
* Note: caching will not work if storage is disabled
|
|
8
|
+
*/
|
|
9
|
+
disableLogging?: boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Prevents writing anything to storage.
|
|
12
|
+
* Note: caching will not work if storage is disabled
|
|
13
|
+
*/
|
|
14
|
+
disableStorage?: boolean;
|
|
15
|
+
};
|
|
16
|
+
/** Options for configuring a Statsig client. */
|
|
17
|
+
export type StatsigOptionsCommon = StatsigRuntimeMutableOptions & {
|
|
5
18
|
/**
|
|
6
19
|
* The API to use for all SDK network requests. You should not need to override this
|
|
7
20
|
* unless you have another API that implements the Statsig API endpoints.
|
|
8
21
|
*/
|
|
9
22
|
api?: string;
|
|
23
|
+
/**
|
|
24
|
+
* The URL used to flush queued events via a POST request. Takes precedence over {@link StatsigOptionsCommon.api}.
|
|
25
|
+
*
|
|
26
|
+
* default: `https://api.statsig.com/v1/initialize`
|
|
27
|
+
*/
|
|
28
|
+
logEventUrl?: string;
|
|
29
|
+
/**
|
|
30
|
+
* The URL used to flush queued events via {@link window.navigator.sendBeacon} (web only). Takes precedence over {@link StatsigOptionsCommon.api}.
|
|
31
|
+
*
|
|
32
|
+
* default: `https://api.statsig.com/v1/initialize`
|
|
33
|
+
*/
|
|
34
|
+
logEventBeaconUrl?: string;
|
|
10
35
|
/**
|
|
11
36
|
* An object you can use to set environment variables that apply to all of your users
|
|
12
37
|
* in the same session.
|
|
@@ -18,29 +43,34 @@ export type StatsigOptionsCommon = {
|
|
|
18
43
|
overrideStableID?: string;
|
|
19
44
|
/**
|
|
20
45
|
* How much information is allowed to be printed to the console.
|
|
21
|
-
*
|
|
46
|
+
*
|
|
47
|
+
* default: {@link LogLevel.Warn}
|
|
22
48
|
*/
|
|
23
49
|
logLevel?: LogLevel;
|
|
24
|
-
/**
|
|
25
|
-
* StatsigDataProvider implementors used to customize the initialization flow.
|
|
26
|
-
* Default: LocalStorageCache then Network
|
|
27
|
-
*/
|
|
28
|
-
dataProviders?: StatsigDataProvider[];
|
|
29
50
|
/**
|
|
30
51
|
* The maximum amount of time (in milliseconds) that any network request can take
|
|
31
|
-
* before timing out.
|
|
52
|
+
* before timing out.
|
|
53
|
+
*
|
|
54
|
+
* default: `10,000 ms` (10 seconds)
|
|
32
55
|
*/
|
|
33
56
|
networkTimeoutMs?: number;
|
|
34
57
|
/**
|
|
35
58
|
* The maximum number of events to batch before flushing logs to Statsig.
|
|
36
|
-
*
|
|
59
|
+
*
|
|
60
|
+
* default: `50`
|
|
37
61
|
*/
|
|
38
62
|
loggingBufferMaxSize?: number;
|
|
39
63
|
/**
|
|
40
64
|
* How often (in milliseconds) to flush logs to Statsig.
|
|
41
|
-
*
|
|
65
|
+
*
|
|
66
|
+
* default: `10,000 ms` (10 seconds)
|
|
42
67
|
*/
|
|
43
68
|
loggingIntervalMs?: number;
|
|
69
|
+
/**
|
|
70
|
+
* An implementor of {@link OverrideAdapter}, used to alter evaluations before its
|
|
71
|
+
* returned to the caller of a check api (checkGate/getExperiment etc).
|
|
72
|
+
*/
|
|
73
|
+
overrideAdapter?: OverrideAdapter;
|
|
44
74
|
};
|
|
45
75
|
export type StatsigEnvironment = {
|
|
46
76
|
tier?: string;
|
package/src/StatsigTypes.d.ts
CHANGED
|
@@ -1,22 +1,30 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
type EvaluatedSpec = {
|
|
1
|
+
import { DynamicConfigEvaluation, EvaluationDetails, ExperimentEvaluation, GateEvaluation, LayerEvaluation } from './EvaluationTypes';
|
|
2
|
+
import { Flatten } from './UtitlityTypes';
|
|
3
|
+
type CommonFields = {
|
|
5
4
|
readonly name: string;
|
|
6
5
|
readonly ruleID: string;
|
|
7
|
-
readonly
|
|
6
|
+
readonly details: EvaluationDetails;
|
|
8
7
|
};
|
|
9
|
-
export type
|
|
8
|
+
export type SpecType = 'gate' | 'dynamic_config' | 'experiment' | 'layer';
|
|
9
|
+
export type FeatureGate = Flatten<CommonFields & {
|
|
10
10
|
readonly value: boolean;
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
readonly __evaluation: GateEvaluation | null;
|
|
12
|
+
}>;
|
|
13
|
+
export type DynamicConfig = Flatten<CommonFields & {
|
|
13
14
|
readonly value: Record<string, unknown>;
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
export type
|
|
15
|
+
readonly __evaluation: DynamicConfigEvaluation | null;
|
|
16
|
+
}>;
|
|
17
|
+
export type Experiment = Flatten<CommonFields & {
|
|
18
|
+
readonly value: Record<string, unknown>;
|
|
19
|
+
readonly __evaluation: ExperimentEvaluation | null;
|
|
20
|
+
}>;
|
|
21
|
+
export type Layer = Flatten<CommonFields & {
|
|
17
22
|
readonly getValue: (parameterName: string) => unknown;
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
export
|
|
23
|
+
readonly _value: Record<string, unknown>;
|
|
24
|
+
readonly __evaluation: LayerEvaluation | null;
|
|
25
|
+
}>;
|
|
26
|
+
export type AnyConfig = FeatureGate | DynamicConfig | Experiment | Layer;
|
|
27
|
+
export declare function makeFeatureGate(name: string, details: EvaluationDetails, evaluation: GateEvaluation | null): FeatureGate;
|
|
28
|
+
export declare function makeDynamicConfig(name: string, details: EvaluationDetails, evaluation: DynamicConfigEvaluation | null): DynamicConfig;
|
|
29
|
+
export declare function makeLayer(name: string, details: EvaluationDetails, evaluation: LayerEvaluation | null, getValue?: (param: string) => unknown): Layer;
|
|
22
30
|
export {};
|
package/src/StatsigTypes.js
CHANGED
|
@@ -1,31 +1,38 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.makeLayer = exports.makeDynamicConfig = exports.makeFeatureGate = void 0;
|
|
4
|
-
|
|
5
|
-
function makeFeatureGate(name,
|
|
4
|
+
const DEFAULT_RULE = 'default';
|
|
5
|
+
function makeFeatureGate(name, details, evaluation) {
|
|
6
|
+
var _a;
|
|
6
7
|
return {
|
|
7
|
-
name
|
|
8
|
-
|
|
9
|
-
ruleID:
|
|
10
|
-
value: value === true,
|
|
8
|
+
name,
|
|
9
|
+
details,
|
|
10
|
+
ruleID: (_a = evaluation === null || evaluation === void 0 ? void 0 : evaluation.rule_id) !== null && _a !== void 0 ? _a : DEFAULT_RULE,
|
|
11
|
+
value: (evaluation === null || evaluation === void 0 ? void 0 : evaluation.value) === true,
|
|
12
|
+
__evaluation: evaluation,
|
|
11
13
|
};
|
|
12
14
|
}
|
|
13
15
|
exports.makeFeatureGate = makeFeatureGate;
|
|
14
|
-
function makeDynamicConfig(name,
|
|
16
|
+
function makeDynamicConfig(name, details, evaluation) {
|
|
17
|
+
var _a, _b;
|
|
15
18
|
return {
|
|
16
|
-
name
|
|
17
|
-
|
|
18
|
-
ruleID:
|
|
19
|
-
value: value !== null &&
|
|
19
|
+
name,
|
|
20
|
+
details,
|
|
21
|
+
ruleID: (_a = evaluation === null || evaluation === void 0 ? void 0 : evaluation.rule_id) !== null && _a !== void 0 ? _a : DEFAULT_RULE,
|
|
22
|
+
value: (_b = evaluation === null || evaluation === void 0 ? void 0 : evaluation.value) !== null && _b !== void 0 ? _b : {},
|
|
23
|
+
__evaluation: evaluation,
|
|
20
24
|
};
|
|
21
25
|
}
|
|
22
26
|
exports.makeDynamicConfig = makeDynamicConfig;
|
|
23
|
-
function makeLayer(name,
|
|
27
|
+
function makeLayer(name, details, evaluation, getValue) {
|
|
28
|
+
var _a, _b;
|
|
24
29
|
return {
|
|
25
|
-
name
|
|
26
|
-
|
|
27
|
-
getValue: getValue !== null && getValue !== void 0 ? getValue : (
|
|
28
|
-
ruleID:
|
|
30
|
+
name,
|
|
31
|
+
details,
|
|
32
|
+
getValue: getValue !== null && getValue !== void 0 ? getValue : (() => undefined),
|
|
33
|
+
ruleID: (_a = evaluation === null || evaluation === void 0 ? void 0 : evaluation.rule_id) !== null && _a !== void 0 ? _a : DEFAULT_RULE,
|
|
34
|
+
_value: (_b = evaluation === null || evaluation === void 0 ? void 0 : evaluation.value) !== null && _b !== void 0 ? _b : {},
|
|
35
|
+
__evaluation: evaluation,
|
|
29
36
|
};
|
|
30
37
|
}
|
|
31
38
|
exports.makeLayer = makeLayer;
|
package/src/StatsigUser.d.ts
CHANGED
|
@@ -21,4 +21,5 @@ export type StatsigUserInternal = StatsigUser & {
|
|
|
21
21
|
};
|
|
22
22
|
export declare function normalizeUser(original: StatsigUser, environment?: StatsigEnvironment): StatsigUser;
|
|
23
23
|
export declare function getUserStorageKey(sdkKey: string, user?: StatsigUser): string;
|
|
24
|
+
export declare function getUnitIDFromUser(user: StatsigUser, idType: string): string | undefined;
|
|
24
25
|
export {};
|
package/src/StatsigUser.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getUserStorageKey = exports.normalizeUser = void 0;
|
|
4
|
-
|
|
3
|
+
exports.getUnitIDFromUser = exports.getUserStorageKey = exports.normalizeUser = void 0;
|
|
4
|
+
const Hashing_1 = require("./Hashing");
|
|
5
5
|
function normalizeUser(original, environment) {
|
|
6
6
|
try {
|
|
7
|
-
|
|
7
|
+
const copy = JSON.parse(JSON.stringify(original));
|
|
8
8
|
if (environment != null) {
|
|
9
9
|
copy.statsigEnvironment = environment;
|
|
10
10
|
}
|
|
@@ -16,22 +16,14 @@ 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.DJB2Object)({ sdkKey, user });
|
|
36
20
|
}
|
|
37
21
|
exports.getUserStorageKey = getUserStorageKey;
|
|
22
|
+
function getUnitIDFromUser(user, idType) {
|
|
23
|
+
var _a, _b, _c;
|
|
24
|
+
if (typeof idType === 'string' && idType.toLowerCase() !== 'userid') {
|
|
25
|
+
return (_b = (_a = user.customIDs) === null || _a === void 0 ? void 0 : _a[idType]) !== null && _b !== void 0 ? _b : (_c = user === null || user === void 0 ? void 0 : user.customIDs) === null || _c === void 0 ? void 0 : _c[idType.toLowerCase()];
|
|
26
|
+
}
|
|
27
|
+
return user.userID;
|
|
28
|
+
}
|
|
29
|
+
exports.getUnitIDFromUser = getUnitIDFromUser;
|
package/src/StorageProvider.d.ts
CHANGED
|
@@ -1,11 +1,16 @@
|
|
|
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[]>;
|
|
7
|
+
getItemSync?: (key: string) => string | null;
|
|
5
8
|
};
|
|
6
|
-
|
|
7
|
-
setProvider: (
|
|
9
|
+
type StorageProviderManagment = {
|
|
10
|
+
setProvider: (newProvider: StorageProvider) => void;
|
|
11
|
+
setDisabled: (isDisabled: boolean) => void;
|
|
8
12
|
};
|
|
13
|
+
export declare const Storage: StorageProvider & StorageProviderManagment;
|
|
9
14
|
export declare function getObjectFromStorage<T>(key: string): Promise<T | null>;
|
|
10
15
|
export declare function setObjectInStorage(key: string, obj: unknown): Promise<void>;
|
|
11
16
|
export {};
|
package/src/StorageProvider.js
CHANGED
|
@@ -8,103 +8,94 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
9
|
});
|
|
10
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
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
12
|
exports.setObjectInStorage = exports.getObjectFromStorage = exports.Storage = void 0;
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
13
|
+
const Log_1 = require("./Log");
|
|
14
|
+
const inMemoryStore = {};
|
|
15
|
+
const _inMemoryProvider = {
|
|
16
|
+
getProviderName: () => 'InMemory',
|
|
17
|
+
getItemSync(key) {
|
|
18
|
+
var _a;
|
|
19
|
+
return (_a = inMemoryStore[key]) !== null && _a !== void 0 ? _a : null;
|
|
20
|
+
},
|
|
21
|
+
getItem(key) {
|
|
44
22
|
var _a;
|
|
45
23
|
return Promise.resolve((_a = inMemoryStore[key]) !== null && _a !== void 0 ? _a : null);
|
|
46
24
|
},
|
|
47
|
-
setItem
|
|
25
|
+
setItem(key, value) {
|
|
48
26
|
inMemoryStore[key] = value;
|
|
49
27
|
return Promise.resolve();
|
|
50
28
|
},
|
|
51
|
-
removeItem
|
|
29
|
+
removeItem(key) {
|
|
52
30
|
delete inMemoryStore[key];
|
|
53
31
|
return Promise.resolve();
|
|
54
32
|
},
|
|
33
|
+
getAllKeys() {
|
|
34
|
+
return Promise.resolve(Object.keys(inMemoryStore));
|
|
35
|
+
},
|
|
55
36
|
};
|
|
37
|
+
let _localStorageProvider = null;
|
|
56
38
|
try {
|
|
57
39
|
if (typeof window !== 'undefined' && 'localStorage' in window) {
|
|
58
|
-
|
|
59
|
-
|
|
40
|
+
_localStorageProvider = {
|
|
41
|
+
getProviderName: () => 'LocalStorage',
|
|
42
|
+
getItemSync(key) {
|
|
43
|
+
return localStorage.getItem(key);
|
|
44
|
+
},
|
|
45
|
+
getItem(key) {
|
|
60
46
|
return Promise.resolve(localStorage.getItem(key));
|
|
61
47
|
},
|
|
62
|
-
setItem
|
|
48
|
+
setItem(key, value) {
|
|
63
49
|
localStorage.setItem(key, value);
|
|
64
50
|
return Promise.resolve();
|
|
65
51
|
},
|
|
66
|
-
removeItem
|
|
52
|
+
removeItem(key) {
|
|
67
53
|
localStorage.removeItem(key);
|
|
68
54
|
return Promise.resolve();
|
|
69
55
|
},
|
|
56
|
+
getAllKeys() {
|
|
57
|
+
const keys = Object.keys(localStorage);
|
|
58
|
+
return Promise.resolve(keys);
|
|
59
|
+
},
|
|
70
60
|
};
|
|
71
61
|
}
|
|
72
62
|
}
|
|
73
63
|
catch (error) {
|
|
74
|
-
Log_1.Log.warn('Failed to
|
|
64
|
+
Log_1.Log.warn('Failed to setup localStorageProvider.');
|
|
75
65
|
}
|
|
66
|
+
let _main = _localStorageProvider !== null && _localStorageProvider !== void 0 ? _localStorageProvider : _inMemoryProvider;
|
|
67
|
+
let _current = _main;
|
|
76
68
|
exports.Storage = {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
69
|
+
getProviderName: () => _current.getProviderName(),
|
|
70
|
+
getItem: (key) => _current.getItem(key),
|
|
71
|
+
setItem: (key, value) => _current.setItem(key, value),
|
|
72
|
+
removeItem: (key) => _current.removeItem(key),
|
|
73
|
+
getAllKeys: () => _current.getAllKeys(),
|
|
74
|
+
getItemSync: (key) => { var _a, _b; return (_b = (_a = _current.getItemSync) === null || _a === void 0 ? void 0 : _a.call(_current, key)) !== null && _b !== void 0 ? _b : null; },
|
|
75
|
+
// StorageProviderManagment
|
|
76
|
+
setProvider: (newProvider) => {
|
|
77
|
+
_main = newProvider;
|
|
78
|
+
_current = newProvider;
|
|
79
|
+
},
|
|
80
|
+
setDisabled: (isDisabled) => {
|
|
81
|
+
if (isDisabled) {
|
|
82
|
+
_current = _inMemoryProvider;
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
_current = _main;
|
|
86
|
+
}
|
|
82
87
|
},
|
|
83
88
|
};
|
|
84
89
|
function getObjectFromStorage(key) {
|
|
85
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
86
|
-
|
|
87
|
-
return
|
|
88
|
-
switch (_a.label) {
|
|
89
|
-
case 0: return [4 /*yield*/, provider.getItem(key)];
|
|
90
|
-
case 1:
|
|
91
|
-
value = _a.sent();
|
|
92
|
-
return [2 /*return*/, JSON.parse(value !== null && value !== void 0 ? value : 'null')];
|
|
93
|
-
}
|
|
94
|
-
});
|
|
90
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
91
|
+
const value = yield _current.getItem(key);
|
|
92
|
+
return JSON.parse(value !== null && value !== void 0 ? value : 'null');
|
|
95
93
|
});
|
|
96
94
|
}
|
|
97
95
|
exports.getObjectFromStorage = getObjectFromStorage;
|
|
98
96
|
function setObjectInStorage(key, obj) {
|
|
99
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
100
|
-
|
|
101
|
-
switch (_a.label) {
|
|
102
|
-
case 0: return [4 /*yield*/, provider.setItem(key, JSON.stringify(obj))];
|
|
103
|
-
case 1:
|
|
104
|
-
_a.sent();
|
|
105
|
-
return [2 /*return*/];
|
|
106
|
-
}
|
|
107
|
-
});
|
|
97
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
98
|
+
yield _current.setItem(key, JSON.stringify(obj));
|
|
108
99
|
});
|
|
109
100
|
}
|
|
110
101
|
exports.setObjectInStorage = setObjectInStorage;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* @param {string} data The values to parse into T
|
|
4
|
+
* @param {string} guard A field that must exists on the parsed object for the parse to be valid
|
|
5
|
+
* @param {string} error An error to print via Log.error() when parsing fails
|
|
6
|
+
* @returns {T | null} The parse object T or null if it failed
|
|
7
|
+
*/
|
|
8
|
+
export declare function typedJsonParse<T>(data: string, guard: string, error: string): T | null;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.typedJsonParse = void 0;
|
|
4
|
+
const Log_1 = require("./Log");
|
|
5
|
+
/**
|
|
6
|
+
*
|
|
7
|
+
* @param {string} data The values to parse into T
|
|
8
|
+
* @param {string} guard A field that must exists on the parsed object for the parse to be valid
|
|
9
|
+
* @param {string} error An error to print via Log.error() when parsing fails
|
|
10
|
+
* @returns {T | null} The parse object T or null if it failed
|
|
11
|
+
*/
|
|
12
|
+
function typedJsonParse(data, guard, error) {
|
|
13
|
+
try {
|
|
14
|
+
const result = JSON.parse(data);
|
|
15
|
+
if (typeof result === 'object' &&
|
|
16
|
+
guard in result) {
|
|
17
|
+
return result;
|
|
18
|
+
}
|
|
19
|
+
return result;
|
|
20
|
+
}
|
|
21
|
+
catch (_a) {
|
|
22
|
+
// noop
|
|
23
|
+
}
|
|
24
|
+
Log_1.Log.error(error);
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
exports.typedJsonParse = typedJsonParse;
|
package/src/UUID.js
CHANGED
|
@@ -2,14 +2,18 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getUUID = void 0;
|
|
4
4
|
function getUUID() {
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
if (typeof crypto !== 'undefined' &&
|
|
6
|
+
typeof crypto.randomUUID === 'function') {
|
|
7
|
+
return crypto.randomUUID();
|
|
8
|
+
}
|
|
9
|
+
let d = new Date().getTime();
|
|
10
|
+
let d2 = (typeof performance !== 'undefined' &&
|
|
7
11
|
performance.now &&
|
|
8
12
|
performance.now() * 1000) ||
|
|
9
13
|
0;
|
|
10
|
-
|
|
11
|
-
return
|
|
12
|
-
|
|
14
|
+
const y = '89ab'[Math.floor(Math.random() * 4)];
|
|
15
|
+
return `xxxxxxxx-xxxx-4xxx-${y}xxx-xxxxxxxxxxxx`.replace(/[xy]/g, (c) => {
|
|
16
|
+
let r = Math.random() * 16;
|
|
13
17
|
if (d > 0) {
|
|
14
18
|
r = (d + r) % 16 | 0;
|
|
15
19
|
d = Math.floor(d / 16);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function _getOverridableUrl(overrideUrl: string | undefined, overrideApi: string | undefined, defaultEndpoint: string, defaultApi: string): string;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports._getOverridableUrl = void 0;
|
|
4
|
+
function _getOverridableUrl(overrideUrl, overrideApi, defaultEndpoint, defaultApi) {
|
|
5
|
+
if (overrideUrl) {
|
|
6
|
+
return overrideUrl;
|
|
7
|
+
}
|
|
8
|
+
else if (overrideApi) {
|
|
9
|
+
return `${overrideApi}${defaultEndpoint}`;
|
|
10
|
+
}
|
|
11
|
+
else {
|
|
12
|
+
return `${defaultApi}${defaultEndpoint}`;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
exports._getOverridableUrl = _getOverridableUrl;
|
|
@@ -1,45 +1,39 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.VisibilityChangeObserver = void 0;
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
}
|
|
7
|
-
VisibilityChangeObserver.isCurrentlyVisible = function () {
|
|
4
|
+
class VisibilityChangeObserver {
|
|
5
|
+
static isCurrentlyVisible() {
|
|
8
6
|
return this._current === 'foreground';
|
|
9
|
-
}
|
|
10
|
-
|
|
7
|
+
}
|
|
8
|
+
static add(listener) {
|
|
11
9
|
this._listeners.push(listener);
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
|
|
10
|
+
}
|
|
11
|
+
static remove(listener) {
|
|
12
|
+
const index = this._listeners.indexOf(listener);
|
|
15
13
|
if (index !== -1) {
|
|
16
14
|
this._listeners.splice(index, 1);
|
|
17
15
|
}
|
|
18
|
-
}
|
|
19
|
-
|
|
16
|
+
}
|
|
17
|
+
static notify(visibility) {
|
|
20
18
|
if (visibility === this._current) {
|
|
21
19
|
return;
|
|
22
20
|
}
|
|
23
21
|
this._current = visibility;
|
|
24
|
-
this._listeners.forEach(
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
VisibilityChangeObserver._current = null;
|
|
28
|
-
return VisibilityChangeObserver;
|
|
29
|
-
}());
|
|
22
|
+
this._listeners.forEach((l) => l.onVisibilityChanged(visibility));
|
|
23
|
+
}
|
|
24
|
+
}
|
|
30
25
|
exports.VisibilityChangeObserver = VisibilityChangeObserver;
|
|
26
|
+
VisibilityChangeObserver._listeners = [];
|
|
27
|
+
VisibilityChangeObserver._current = 'foreground';
|
|
31
28
|
if (typeof window !== 'undefined' &&
|
|
32
29
|
typeof window.addEventListener === 'function') {
|
|
33
|
-
window.addEventListener('
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
window.addEventListener('beforeunload', function () {
|
|
37
|
-
return VisibilityChangeObserver.notify('background');
|
|
38
|
-
});
|
|
30
|
+
window.addEventListener('focus', () => VisibilityChangeObserver.notify('foreground'));
|
|
31
|
+
window.addEventListener('blur', () => VisibilityChangeObserver.notify('background'));
|
|
32
|
+
window.addEventListener('beforeunload', () => VisibilityChangeObserver.notify('background'));
|
|
39
33
|
}
|
|
40
34
|
if (typeof document !== 'undefined' &&
|
|
41
35
|
typeof document.addEventListener === 'function') {
|
|
42
|
-
document.addEventListener('visibilitychange',
|
|
36
|
+
document.addEventListener('visibilitychange', () => {
|
|
43
37
|
VisibilityChangeObserver.notify(document.visibilityState === 'visible' ? 'foreground' : 'background');
|
|
44
38
|
});
|
|
45
39
|
}
|