@launchdarkly/js-client-sdk-common 1.1.5 → 1.3.0
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/CHANGELOG.md +29 -0
- package/dist/LDClientImpl.d.ts +40 -32
- package/dist/LDClientImpl.d.ts.map +1 -1
- package/dist/LDClientImpl.js +179 -127
- package/dist/LDClientImpl.js.map +1 -1
- package/dist/api/ConnectionMode.d.ts +3 -1
- package/dist/api/ConnectionMode.d.ts.map +1 -1
- package/dist/api/LDClient.d.ts +1 -1
- package/dist/api/LDClient.d.ts.map +1 -1
- package/dist/api/LDOptions.d.ts +13 -0
- package/dist/api/LDOptions.d.ts.map +1 -1
- package/dist/configuration/Configuration.d.ts +2 -1
- package/dist/configuration/Configuration.d.ts.map +1 -1
- package/dist/configuration/Configuration.js +3 -1
- package/dist/configuration/Configuration.js.map +1 -1
- package/dist/configuration/validators.d.ts.map +1 -1
- package/dist/configuration/validators.js +4 -2
- package/dist/configuration/validators.js.map +1 -1
- package/dist/context/addAutoEnv.d.ts.map +1 -0
- package/dist/{utils → context}/addAutoEnv.js +4 -2
- package/dist/context/addAutoEnv.js.map +1 -0
- package/dist/{utils → context}/ensureKey.d.ts +1 -2
- package/dist/context/ensureKey.d.ts.map +1 -0
- package/dist/{utils → context}/ensureKey.js +6 -3
- package/dist/context/ensureKey.js.map +1 -0
- package/dist/flag-manager/ContextIndex.d.ts +39 -0
- package/dist/flag-manager/ContextIndex.d.ts.map +1 -0
- package/dist/flag-manager/ContextIndex.js +64 -0
- package/dist/flag-manager/ContextIndex.js.map +1 -0
- package/dist/flag-manager/FlagManager.d.ts +58 -0
- package/dist/flag-manager/FlagManager.d.ts.map +1 -0
- package/dist/flag-manager/FlagManager.js +74 -0
- package/dist/flag-manager/FlagManager.js.map +1 -0
- package/dist/flag-manager/FlagPersistence.d.ts +42 -0
- package/dist/flag-manager/FlagPersistence.d.ts.map +1 -0
- package/dist/flag-manager/FlagPersistence.js +120 -0
- package/dist/flag-manager/FlagPersistence.js.map +1 -0
- package/dist/flag-manager/FlagStore.d.ts +29 -0
- package/dist/flag-manager/FlagStore.d.ts.map +1 -0
- package/dist/flag-manager/FlagStore.js +28 -0
- package/dist/flag-manager/FlagStore.js.map +1 -0
- package/dist/flag-manager/FlagUpdater.d.ts +39 -0
- package/dist/flag-manager/FlagUpdater.d.ts.map +1 -0
- package/dist/flag-manager/FlagUpdater.js +69 -0
- package/dist/flag-manager/FlagUpdater.js.map +1 -0
- package/dist/flag-manager/ItemDescriptor.d.ts +10 -0
- package/dist/flag-manager/ItemDescriptor.d.ts.map +1 -0
- package/dist/flag-manager/ItemDescriptor.js +3 -0
- package/dist/flag-manager/ItemDescriptor.js.map +1 -0
- package/dist/flag-manager/calculateChangedKeys.d.ts +6 -0
- package/dist/flag-manager/calculateChangedKeys.d.ts.map +1 -0
- package/dist/flag-manager/calculateChangedKeys.js +22 -0
- package/dist/flag-manager/calculateChangedKeys.js.map +1 -0
- package/dist/polling/PollingProcessor.d.ts +3 -0
- package/dist/polling/PollingProcessor.d.ts.map +1 -0
- package/dist/polling/PollingProcessor.js +79 -0
- package/dist/polling/PollingProcessor.js.map +1 -0
- package/dist/polling/Requestor.d.ts +6 -0
- package/dist/polling/Requestor.d.ts.map +1 -0
- package/dist/polling/Requestor.js +50 -0
- package/dist/polling/Requestor.js.map +1 -0
- package/dist/storage/getOrGenerateKey.d.ts +11 -0
- package/dist/storage/getOrGenerateKey.d.ts.map +1 -0
- package/dist/storage/getOrGenerateKey.js +21 -0
- package/dist/storage/getOrGenerateKey.js.map +1 -0
- package/dist/storage/namespaceUtils.d.ts +20 -0
- package/dist/storage/namespaceUtils.d.ts.map +1 -0
- package/dist/storage/namespaceUtils.js +61 -0
- package/dist/storage/namespaceUtils.js.map +1 -0
- package/package.json +2 -2
- package/dist/evaluation/fetchFlags.d.ts +0 -6
- package/dist/evaluation/fetchFlags.d.ts.map +0 -1
- package/dist/evaluation/fetchFlags.js +0 -12
- package/dist/evaluation/fetchFlags.js.map +0 -1
- package/dist/evaluation/fetchUtils.d.ts +0 -7
- package/dist/evaluation/fetchUtils.d.ts.map +0 -1
- package/dist/evaluation/fetchUtils.js +0 -46
- package/dist/evaluation/fetchUtils.js.map +0 -1
- package/dist/utils/addAutoEnv.d.ts.map +0 -1
- package/dist/utils/addAutoEnv.js.map +0 -1
- package/dist/utils/calculateFlagChanges.d.ts +0 -3
- package/dist/utils/calculateFlagChanges.d.ts.map +0 -1
- package/dist/utils/calculateFlagChanges.js +0 -23
- package/dist/utils/calculateFlagChanges.js.map +0 -1
- package/dist/utils/ensureKey.d.ts.map +0 -1
- package/dist/utils/ensureKey.js.map +0 -1
- package/dist/utils/getOrGenerateKey.d.ts +0 -5
- package/dist/utils/getOrGenerateKey.d.ts.map +0 -1
- package/dist/utils/getOrGenerateKey.js +0 -29
- package/dist/utils/getOrGenerateKey.js.map +0 -1
- package/dist/utils/index.d.ts +0 -5
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -10
- package/dist/utils/index.js.map +0 -1
- /package/dist/{utils → context}/addAutoEnv.d.ts +0 -0
|
@@ -8,6 +8,7 @@ export default class Configuration {
|
|
|
8
8
|
readonly baseUri: string;
|
|
9
9
|
readonly eventsUri: string;
|
|
10
10
|
readonly streamUri: string;
|
|
11
|
+
readonly maxCachedContexts = 5;
|
|
11
12
|
readonly capacity = 100;
|
|
12
13
|
readonly diagnosticRecordingInterval = 900;
|
|
13
14
|
readonly flushInterval = 30;
|
|
@@ -22,7 +23,6 @@ export default class Configuration {
|
|
|
22
23
|
readonly inspectors: LDInspection[];
|
|
23
24
|
readonly privateAttributes: string[];
|
|
24
25
|
readonly initialConnectionMode: ConnectionMode;
|
|
25
|
-
connectionMode: ConnectionMode;
|
|
26
26
|
readonly tags: ApplicationTags;
|
|
27
27
|
readonly applicationInfo?: {
|
|
28
28
|
id?: string;
|
|
@@ -37,6 +37,7 @@ export default class Configuration {
|
|
|
37
37
|
readonly wrapperName?: string;
|
|
38
38
|
readonly wrapperVersion?: string;
|
|
39
39
|
readonly serviceEndpoints: ServiceEndpoints;
|
|
40
|
+
readonly pollInterval: number;
|
|
40
41
|
[index: string]: any;
|
|
41
42
|
constructor(pristineOptions?: LDOptions, internalOptions?: internal.LDInternalOptions);
|
|
42
43
|
validateTypesAndNames(pristineOptions: LDOptions): string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Configuration.d.ts","sourceRoot":"","sources":["../../src/configuration/Configuration.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EAEf,QAAQ,EACR,SAAS,EAGT,gBAAgB,EAEjB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,cAAc,EAAE,KAAK,SAAS,EAAE,MAAM,QAAQ,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"Configuration.d.ts","sourceRoot":"","sources":["../../src/configuration/Configuration.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EAEf,QAAQ,EACR,SAAS,EAGT,gBAAgB,EAEjB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,cAAc,EAAE,KAAK,SAAS,EAAE,MAAM,QAAQ,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAKnD,MAAM,CAAC,OAAO,OAAO,aAAa;IAChC,OAAc,eAAe,SAAwC;IACrE,OAAc,cAAc,SAA2C;IAEvE,SAAgB,MAAM,uGAAsB;IAE5C,SAAgB,OAAO,SAAiC;IACxD,SAAgB,SAAS,SAAmC;IAC5D,SAAgB,SAAS,SAAgC;IAEzD,SAAgB,iBAAiB,KAAK;IAEtC,SAAgB,QAAQ,OAAO;IAC/B,SAAgB,2BAA2B,OAAO;IAClD,SAAgB,aAAa,MAAM;IACnC,SAAgB,2BAA2B,KAAK;IAEhD,SAAgB,oBAAoB,SAAS;IAC7C,SAAgB,KAAK,SAAS;IAC9B,SAAgB,gBAAgB,SAAS;IACzC,SAAgB,UAAU,QAAQ;IAClC,SAAgB,aAAa,QAAQ;IAErC,SAAgB,SAAS,SAAS;IAClC,SAAgB,WAAW,SAAS;IAEpC,SAAgB,UAAU,EAAE,YAAY,EAAE,CAAM;IAChD,SAAgB,iBAAiB,EAAE,MAAM,EAAE,CAAM;IAEjD,SAAgB,qBAAqB,EAAE,cAAc,CAAe;IAEpE,SAAgB,IAAI,EAAE,eAAe,CAAC;IACtC,SAAgB,eAAe,CAAC,EAAE;QAChC,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,SAAgB,SAAS,CAAC,EAAE,SAAS,CAAC;IAGtC,SAAgB,sBAAsB,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/F,SAAgB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjC,SAAgB,IAAI,CAAC,EAAE,MAAM,CAAC;IAC9B,SAAgB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrC,SAAgB,cAAc,CAAC,EAAE,MAAM,CAAC;IAExC,SAAgB,gBAAgB,EAAE,gBAAgB,CAAC;IAEnD,SAAgB,YAAY,EAAE,MAAM,CAA4B;IAGhE,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAAC;gBAET,eAAe,GAAE,SAAc,EAAE,eAAe,GAAE,QAAQ,CAAC,iBAAsB;IAe7F,qBAAqB,CAAC,eAAe,EAAE,SAAS,GAAG,MAAM,EAAE;CAqC5D"}
|
|
@@ -2,12 +2,14 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const js_sdk_common_1 = require("@launchdarkly/js-sdk-common");
|
|
4
4
|
const validators_1 = require("./validators");
|
|
5
|
+
const DEFAULT_POLLING_INTERVAL = 60 * 5;
|
|
5
6
|
class Configuration {
|
|
6
7
|
constructor(pristineOptions = {}, internalOptions = {}) {
|
|
7
8
|
this.logger = (0, js_sdk_common_1.createSafeLogger)();
|
|
8
9
|
this.baseUri = Configuration.DEFAULT_POLLING;
|
|
9
10
|
this.eventsUri = js_sdk_common_1.ServiceEndpoints.DEFAULT_EVENTS;
|
|
10
11
|
this.streamUri = Configuration.DEFAULT_STREAM;
|
|
12
|
+
this.maxCachedContexts = 5;
|
|
11
13
|
this.capacity = 100;
|
|
12
14
|
this.diagnosticRecordingInterval = 900;
|
|
13
15
|
this.flushInterval = 30;
|
|
@@ -22,11 +24,11 @@ class Configuration {
|
|
|
22
24
|
this.inspectors = [];
|
|
23
25
|
this.privateAttributes = [];
|
|
24
26
|
this.initialConnectionMode = 'streaming';
|
|
27
|
+
this.pollInterval = DEFAULT_POLLING_INTERVAL;
|
|
25
28
|
const errors = this.validateTypesAndNames(pristineOptions);
|
|
26
29
|
errors.forEach((e) => this.logger.warn(e));
|
|
27
30
|
this.serviceEndpoints = new js_sdk_common_1.ServiceEndpoints(this.streamUri, this.baseUri, this.eventsUri, internalOptions.analyticsEventPath, internalOptions.diagnosticEventPath, internalOptions.includeAuthorizationHeader);
|
|
28
31
|
this.tags = new js_sdk_common_1.ApplicationTags({ application: this.applicationInfo, logger: this.logger });
|
|
29
|
-
this.connectionMode = this.initialConnectionMode;
|
|
30
32
|
}
|
|
31
33
|
validateTypesAndNames(pristineOptions) {
|
|
32
34
|
const errors = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Configuration.js","sourceRoot":"","sources":["../../src/configuration/Configuration.ts"],"names":[],"mappings":";;AAAA,+DASqC;AAIrC,6CAAsC;AAEtC,MAAqB,aAAa;
|
|
1
|
+
{"version":3,"file":"Configuration.js","sourceRoot":"","sources":["../../src/configuration/Configuration.ts"],"names":[],"mappings":";;AAAA,+DASqC;AAIrC,6CAAsC;AAEtC,MAAM,wBAAwB,GAAW,EAAE,GAAG,CAAC,CAAC;AAEhD,MAAqB,aAAa;IAsDhC,YAAY,kBAA6B,EAAE,EAAE,kBAA8C,EAAE;QAlD7E,WAAM,GAAG,IAAA,gCAAgB,GAAE,CAAC;QAE5B,YAAO,GAAG,aAAa,CAAC,eAAe,CAAC;QACxC,cAAS,GAAG,gCAAgB,CAAC,cAAc,CAAC;QAC5C,cAAS,GAAG,aAAa,CAAC,cAAc,CAAC;QAEzC,sBAAiB,GAAG,CAAC,CAAC;QAEtB,aAAQ,GAAG,GAAG,CAAC;QACf,gCAA2B,GAAG,GAAG,CAAC;QAClC,kBAAa,GAAG,EAAE,CAAC;QACnB,gCAA2B,GAAG,CAAC,CAAC;QAEhC,yBAAoB,GAAG,KAAK,CAAC;QAC7B,UAAK,GAAG,KAAK,CAAC;QACd,qBAAgB,GAAG,KAAK,CAAC;QACzB,eAAU,GAAG,IAAI,CAAC;QAClB,kBAAa,GAAG,IAAI,CAAC;QAErB,cAAS,GAAG,KAAK,CAAC;QAClB,gBAAW,GAAG,KAAK,CAAC;QAEpB,eAAU,GAAmB,EAAE,CAAC;QAChC,sBAAiB,GAAa,EAAE,CAAC;QAEjC,0BAAqB,GAAmB,WAAW,CAAC;QAoBpD,iBAAY,GAAW,wBAAwB,CAAC;QAM9D,MAAM,MAAM,GAAG,IAAI,CAAC,qBAAqB,CAAC,eAAe,CAAC,CAAC;QAC3D,MAAM,CAAC,OAAO,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAEnD,IAAI,CAAC,gBAAgB,GAAG,IAAI,gCAAgB,CAC1C,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,SAAS,EACd,eAAe,CAAC,kBAAkB,EAClC,eAAe,CAAC,mBAAmB,EACnC,eAAe,CAAC,0BAA0B,CAC3C,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,IAAI,+BAAe,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,qBAAqB,CAAC,eAA0B;QAC9C,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;YACjD,MAAM,SAAS,GAAG,oBAAU,CAAC,CAAoB,CAAC,CAAC;YAEnD,IAAI,SAAS,EAAE;gBACb,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;oBACpB,MAAM,aAAa,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;oBAE1C,IAAI,aAAa,KAAK,SAAS,EAAE;wBAC/B,MAAM,CAAC,IAAI,CAAC,8BAAc,CAAC,sBAAsB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;wBAChE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;qBACf;yBAAM,IAAI,aAAa,KAAK,4BAA4B,EAAE;wBACzD,MAAM,CAAC,IAAI,CAAC,8BAAc,CAAC,sBAAsB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;wBAEhE,IAAI,OAAO,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,WAAW,IAAI,CAAC,KAAK,IAAI,EAAE;4BACpE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;yBACf;qBACF;yBAAM,IAAI,SAAS,YAAY,iCAAiB,IAAI,8BAAc,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;wBAChF,MAAM,EAAE,GAAG,EAAE,GAAG,SAA8B,CAAC;wBAC/C,MAAM,CAAC,IAAI,CAAC,8BAAc,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;wBAC1D,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;qBACf;yBAAM;wBACL,MAAM,CAAC,IAAI,CAAC,8BAAc,CAAC,eAAe,CAAC,CAAC,EAAE,SAAS,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;qBAC/E;iBACF;qBAAM;oBACL,uDAAuD;oBACvD,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,aAAD,CAAC,cAAD,CAAC,GAAI,SAAS,CAAC;iBAC1B;aACF;iBAAM;gBACL,MAAM,CAAC,IAAI,CAAC,8BAAc,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;aAC9C;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;;AAxGa,6BAAe,GAAG,oCAAoC,AAAvC,CAAwC;AACvD,4BAAc,GAAG,uCAAuC,AAA1C,CAA2C;kBAFpD,aAAa"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/configuration/validators.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,aAAa,EAAkB,MAAM,6BAA6B,CAAC;AAElF,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,QAAQ,CAAC;AAuBxC,QAAA,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,SAAS,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/configuration/validators.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,aAAa,EAAkB,MAAM,6BAA6B,CAAC;AAElF,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,QAAQ,CAAC;AAuBxC,QAAA,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,SAAS,EAAE,aAAa,CAsCtD,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
|
@@ -12,15 +12,16 @@ class BootStrapValidator {
|
|
|
12
12
|
}
|
|
13
13
|
class ConnectionModeValidator {
|
|
14
14
|
is(u) {
|
|
15
|
-
return u === 'offline' || u === 'streaming';
|
|
15
|
+
return u === 'offline' || u === 'streaming' || u === 'polling';
|
|
16
16
|
}
|
|
17
17
|
getType() {
|
|
18
|
-
return `
|
|
18
|
+
return `offline | streaming | polling`;
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
const validators = {
|
|
22
22
|
initialConnectionMode: new ConnectionModeValidator(),
|
|
23
23
|
logger: js_sdk_common_1.TypeValidators.Object,
|
|
24
|
+
maxCachedContexts: js_sdk_common_1.TypeValidators.numberWithMin(0),
|
|
24
25
|
baseUri: js_sdk_common_1.TypeValidators.String,
|
|
25
26
|
streamUri: js_sdk_common_1.TypeValidators.String,
|
|
26
27
|
eventsUri: js_sdk_common_1.TypeValidators.String,
|
|
@@ -33,6 +34,7 @@ const validators = {
|
|
|
33
34
|
diagnosticOptOut: js_sdk_common_1.TypeValidators.Boolean,
|
|
34
35
|
withReasons: js_sdk_common_1.TypeValidators.Boolean,
|
|
35
36
|
sendEvents: js_sdk_common_1.TypeValidators.Boolean,
|
|
37
|
+
pollInterval: js_sdk_common_1.TypeValidators.numberWithMin(30),
|
|
36
38
|
// TODO: inspectors
|
|
37
39
|
// @ts-ignore
|
|
38
40
|
inspectors: js_sdk_common_1.TypeValidators.createTypeArray('LDInspection[]', {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/configuration/validators.ts"],"names":[],"mappings":";;AAAA,gDAAgD;AAChD,+DAAkF;AAKlF,MAAM,kBAAkB;IACtB,EAAE,CAAC,CAAU;QACX,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,WAAW,IAAI,CAAC,KAAK,IAAI,CAAC;IACzE,CAAC;IAED,OAAO;QACL,OAAO,WAAW,CAAC;IACrB,CAAC;CACF;AAED,MAAM,uBAAuB;IAC3B,EAAE,CAAC,CAAU;QACX,OAAO,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/configuration/validators.ts"],"names":[],"mappings":";;AAAA,gDAAgD;AAChD,+DAAkF;AAKlF,MAAM,kBAAkB;IACtB,EAAE,CAAC,CAAU;QACX,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,WAAW,IAAI,CAAC,KAAK,IAAI,CAAC;IACzE,CAAC;IAED,OAAO;QACL,OAAO,WAAW,CAAC;IACrB,CAAC;CACF;AAED,MAAM,uBAAuB;IAC3B,EAAE,CAAC,CAAU;QACX,OAAO,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,KAAK,SAAS,CAAC;IACjE,CAAC;IAED,OAAO;QACL,OAAO,+BAA+B,CAAC;IACzC,CAAC;CACF;AAED,MAAM,UAAU,GAA2C;IACzD,qBAAqB,EAAE,IAAI,uBAAuB,EAAE;IACpD,MAAM,EAAE,8BAAc,CAAC,MAAM;IAC7B,iBAAiB,EAAE,8BAAc,CAAC,aAAa,CAAC,CAAC,CAAC;IAElD,OAAO,EAAE,8BAAc,CAAC,MAAM;IAC9B,SAAS,EAAE,8BAAc,CAAC,MAAM;IAChC,SAAS,EAAE,8BAAc,CAAC,MAAM;IAEhC,QAAQ,EAAE,8BAAc,CAAC,aAAa,CAAC,CAAC,CAAC;IACzC,2BAA2B,EAAE,8BAAc,CAAC,aAAa,CAAC,CAAC,CAAC;IAC5D,aAAa,EAAE,8BAAc,CAAC,aAAa,CAAC,CAAC,CAAC;IAC9C,2BAA2B,EAAE,8BAAc,CAAC,aAAa,CAAC,CAAC,CAAC;IAE5D,oBAAoB,EAAE,8BAAc,CAAC,OAAO;IAC5C,KAAK,EAAE,8BAAc,CAAC,OAAO;IAC7B,gBAAgB,EAAE,8BAAc,CAAC,OAAO;IACxC,WAAW,EAAE,8BAAc,CAAC,OAAO;IACnC,UAAU,EAAE,8BAAc,CAAC,OAAO;IAElC,YAAY,EAAE,8BAAc,CAAC,aAAa,CAAC,EAAE,CAAC;IAE9C,mBAAmB;IACnB,aAAa;IACb,UAAU,EAAE,8BAAc,CAAC,eAAe,CAAe,gBAAgB,EAAE;QACzE,IAAI,EAAE,WAAW;QACjB,MAAM,EAAE,oBAAI;QACZ,IAAI,EAAE,EAAE;KACT,CAAC;IACF,iBAAiB,EAAE,8BAAc,CAAC,WAAW;IAE7C,eAAe,EAAE,8BAAc,CAAC,MAAM;IACtC,kBAAkB;IAClB,SAAS,EAAE,IAAI,kBAAkB,EAAE;IACnC,WAAW,EAAE,8BAAc,CAAC,MAAM;IAClC,cAAc,EAAE,8BAAc,CAAC,MAAM;IACrC,aAAa;IACb,IAAI,EAAE,8BAAc,CAAC,MAAM;CAC5B,CAAC;AAEF,kBAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addAutoEnv.d.ts","sourceRoot":"","sources":["../../src/context/addAutoEnv.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,aAAa,EACb,SAAS,EACT,QAAQ,EACR,kBAAkB,EAClB,mBAAmB,EACnB,MAAM,EACN,QAAQ,EACT,MAAM,6BAA6B,CAAC;AAErC,OAAO,aAAa,MAAM,kBAAkB,CAAC;AAO7C,eAAO,MAAM,OAAO,MAAO,mBAAmB;;;;;;;;;CAO7C,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,qBACX,QAAQ,uBACL,aAAa,KACjC,aAAa,GAAG,SA4BlB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,aAAa,aAAoB,QAAQ,kCA2BrD,CAAC;AAEF,eAAO,MAAM,UAAU,YAAmB,SAAS,YAAY,QAAQ,UAAU,aAAa,+DA2C7F,CAAC"}
|
|
@@ -14,7 +14,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
14
14
|
exports.addAutoEnv = exports.addDeviceInfo = exports.addApplicationInfo = exports.toMulti = void 0;
|
|
15
15
|
/* eslint-disable @typescript-eslint/naming-convention */
|
|
16
16
|
const js_sdk_common_1 = require("@launchdarkly/js-sdk-common");
|
|
17
|
-
const getOrGenerateKey_1 = require("
|
|
17
|
+
const getOrGenerateKey_1 = require("../storage/getOrGenerateKey");
|
|
18
|
+
const namespaceUtils_1 = require("../storage/namespaceUtils");
|
|
18
19
|
const { isLegacyUser, isSingleKind, isMultiKind } = js_sdk_common_1.internal;
|
|
19
20
|
const defaultAutoEnvSchemaVersion = '1.0';
|
|
20
21
|
const toMulti = (c) => {
|
|
@@ -72,7 +73,8 @@ const addDeviceInfo = async (platform) => {
|
|
|
72
73
|
}
|
|
73
74
|
// Check if device has any meaningful data before we return it.
|
|
74
75
|
if (Object.keys(device).filter((k) => k !== 'key' && k !== 'envAttributesVersion').length) {
|
|
75
|
-
|
|
76
|
+
const ldDeviceNamespace = (0, namespaceUtils_1.namespaceForGeneratedContextKey)('ld_device');
|
|
77
|
+
device.key = await (0, getOrGenerateKey_1.getOrGenerateKey)(ldDeviceNamespace, platform);
|
|
76
78
|
device.envAttributesVersion = device.envAttributesVersion || defaultAutoEnvSchemaVersion;
|
|
77
79
|
return device;
|
|
78
80
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addAutoEnv.js","sourceRoot":"","sources":["../../src/context/addAutoEnv.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,5 @@ import { LDContext, Platform } from '@launchdarkly/js-sdk-common';
|
|
|
6
6
|
* @param context
|
|
7
7
|
* @param platform
|
|
8
8
|
*/
|
|
9
|
-
declare const ensureKey: (context: LDContext, platform: Platform) => Promise<any>;
|
|
10
|
-
export default ensureKey;
|
|
9
|
+
export declare const ensureKey: (context: LDContext, platform: Platform) => Promise<any>;
|
|
11
10
|
//# sourceMappingURL=ensureKey.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ensureKey.d.ts","sourceRoot":"","sources":["../../src/context/ensureKey.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,SAAS,EAKT,QAAQ,EACT,MAAM,6BAA6B,CAAC;AAiDrC;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,YAAmB,SAAS,YAAY,QAAQ,iBAgBrE,CAAC"}
|
|
@@ -11,8 +11,10 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
11
11
|
return t;
|
|
12
12
|
};
|
|
13
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.ensureKey = void 0;
|
|
14
15
|
const js_sdk_common_1 = require("@launchdarkly/js-sdk-common");
|
|
15
|
-
const getOrGenerateKey_1 = require("
|
|
16
|
+
const getOrGenerateKey_1 = require("../storage/getOrGenerateKey");
|
|
17
|
+
const namespaceUtils_1 = require("../storage/namespaceUtils");
|
|
16
18
|
const { isLegacyUser, isMultiKind, isSingleKind } = js_sdk_common_1.internal;
|
|
17
19
|
/**
|
|
18
20
|
* This is the root ensureKey function. All other ensureKey functions reduce to this.
|
|
@@ -30,9 +32,10 @@ const { isLegacyUser, isMultiKind, isSingleKind } = js_sdk_common_1.internal;
|
|
|
30
32
|
const ensureKeyCommon = async (kind, c, platform) => {
|
|
31
33
|
const { anonymous, key } = c;
|
|
32
34
|
if (anonymous && !key) {
|
|
35
|
+
const storageKey = (0, namespaceUtils_1.namespaceForAnonymousGeneratedContextKey)(kind);
|
|
33
36
|
// This mutates a cloned copy of the original context from ensureyKey so this is safe.
|
|
34
37
|
// eslint-disable-next-line no-param-reassign
|
|
35
|
-
c.key = await (0, getOrGenerateKey_1.getOrGenerateKey)(
|
|
38
|
+
c.key = await (0, getOrGenerateKey_1.getOrGenerateKey)(storageKey, platform);
|
|
36
39
|
}
|
|
37
40
|
};
|
|
38
41
|
const ensureKeySingle = async (c, platform) => {
|
|
@@ -65,5 +68,5 @@ const ensureKey = async (context, platform) => {
|
|
|
65
68
|
}
|
|
66
69
|
return cloned;
|
|
67
70
|
};
|
|
68
|
-
exports.
|
|
71
|
+
exports.ensureKey = ensureKey;
|
|
69
72
|
//# sourceMappingURL=ensureKey.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ensureKey.js","sourceRoot":"","sources":["../../src/context/ensureKey.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,+DASqC;AAErC,kEAA+D;AAC/D,8DAAqF;AAErF,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,wBAAQ,CAAC;AAE7D;;;;;;;;;;;;GAYG;AACH,MAAM,eAAe,GAAG,KAAK,EAAE,IAAY,EAAE,CAAkB,EAAE,QAAkB,EAAE,EAAE;IACrF,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAE7B,IAAI,SAAS,IAAI,CAAC,GAAG,EAAE;QACrB,MAAM,UAAU,GAAG,IAAA,yDAAwC,EAAC,IAAI,CAAC,CAAC;QAClE,sFAAsF;QACtF,6CAA6C;QAC7C,CAAC,CAAC,GAAG,GAAG,MAAM,IAAA,mCAAgB,EAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;KACtD;AACH,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,KAAK,EAAE,CAAsB,EAAE,QAAkB,EAAE,EAAE;IAC3E,MAAM,eAAe,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC7C,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,KAAK,EAAE,YAAgC,EAAE,QAAkB,EAAE,EAAE;IACpF,MAAM,EAAE,IAAI,KAAwB,YAAY,EAA/B,cAAc,UAAK,YAAY,EAA1C,QAA2B,CAAe,CAAC;IAEjD,OAAO,OAAO,CAAC,GAAG,CAChB,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAC5C,eAAe,CAAC,CAAC,EAAE,CAAoB,EAAE,QAAQ,CAAC,CACnD,CACF,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,KAAK,EAAE,CAAS,EAAE,QAAkB,EAAE,EAAE;IAC9D,MAAM,eAAe,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC7C,CAAC,CAAC;AAEF;;;;;;GAMG;AACI,MAAM,SAAS,GAAG,KAAK,EAAE,OAAkB,EAAE,QAAkB,EAAE,EAAE;IACxE,MAAM,MAAM,GAAG,IAAA,qBAAK,EAAY,OAAO,CAAC,CAAC;IAEzC,IAAI,YAAY,CAAC,MAAM,CAAC,EAAE;QACxB,MAAM,eAAe,CAAC,MAA6B,EAAE,QAAQ,CAAC,CAAC;KAChE;IAED,IAAI,WAAW,CAAC,MAAM,CAAC,EAAE;QACvB,MAAM,cAAc,CAAC,MAA4B,EAAE,QAAQ,CAAC,CAAC;KAC9D;IAED,IAAI,YAAY,CAAC,MAAM,CAAC,EAAE;QACxB,MAAM,eAAe,CAAC,MAAgB,EAAE,QAAQ,CAAC,CAAC;KACnD;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAhBW,QAAA,SAAS,aAgBpB"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An index for tracking the most recently used contexts by timestamp with the ability to
|
|
3
|
+
* update entry timestamps and prune out least used contexts above a max capacity provided.
|
|
4
|
+
*/
|
|
5
|
+
export default class ContextIndex {
|
|
6
|
+
container: IndexContainer;
|
|
7
|
+
/**
|
|
8
|
+
* Creates a {@link ContextIndex} from its JSON representation (likely retrieved from persistence).
|
|
9
|
+
* @param json representation of the {@link ContextIndex}
|
|
10
|
+
* @returns the {@link ContextIndex}
|
|
11
|
+
*/
|
|
12
|
+
static fromJson(json: string): ContextIndex;
|
|
13
|
+
/**
|
|
14
|
+
* @returns the JSON representation of the {@link ContextIndex} (like for saving to persistence)
|
|
15
|
+
*/
|
|
16
|
+
toJson(): string;
|
|
17
|
+
/**
|
|
18
|
+
* Notice that a context has been used and when it was used. This will update an existing record
|
|
19
|
+
* with the given timestamp, or create a new record if one doesn't exist.
|
|
20
|
+
* @param id of the corresponding context
|
|
21
|
+
* @param timestamp in millis since epoch
|
|
22
|
+
*/
|
|
23
|
+
notice(id: string, timestamp: number): void;
|
|
24
|
+
/**
|
|
25
|
+
* Prune the index to the specified max size and then return the IDs
|
|
26
|
+
* @param maxContexts the maximum number of contexts to retain after this prune
|
|
27
|
+
* @returns an array of removed entries
|
|
28
|
+
*/
|
|
29
|
+
prune(maxContexts: number): Array<IndexEntry>;
|
|
30
|
+
}
|
|
31
|
+
export interface IndexContainer {
|
|
32
|
+
index: Array<IndexEntry>;
|
|
33
|
+
}
|
|
34
|
+
interface IndexEntry {
|
|
35
|
+
id: string;
|
|
36
|
+
timestamp: number;
|
|
37
|
+
}
|
|
38
|
+
export {};
|
|
39
|
+
//# sourceMappingURL=ContextIndex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContextIndex.d.ts","sourceRoot":"","sources":["../../src/flag-manager/ContextIndex.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,YAAY;IAC/B,SAAS,EAAE,cAAc,CAAsC;IAE/D;;;;OAIG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY;IAW3C;;OAEG;IACH,MAAM,IAAI,MAAM;IAIhB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IASpC;;;;OAIG;IACH,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC;CAU9C;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;CAC1B;AAED,UAAU,UAAU;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;CACnB"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/**
|
|
4
|
+
* An index for tracking the most recently used contexts by timestamp with the ability to
|
|
5
|
+
* update entry timestamps and prune out least used contexts above a max capacity provided.
|
|
6
|
+
*/
|
|
7
|
+
class ContextIndex {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.container = { index: new Array() };
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Creates a {@link ContextIndex} from its JSON representation (likely retrieved from persistence).
|
|
13
|
+
* @param json representation of the {@link ContextIndex}
|
|
14
|
+
* @returns the {@link ContextIndex}
|
|
15
|
+
*/
|
|
16
|
+
static fromJson(json) {
|
|
17
|
+
const contextIndex = new ContextIndex();
|
|
18
|
+
try {
|
|
19
|
+
contextIndex.container = JSON.parse(json);
|
|
20
|
+
}
|
|
21
|
+
catch (e) {
|
|
22
|
+
/* ignoring error and returning empty index */
|
|
23
|
+
}
|
|
24
|
+
return contextIndex;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* @returns the JSON representation of the {@link ContextIndex} (like for saving to persistence)
|
|
28
|
+
*/
|
|
29
|
+
toJson() {
|
|
30
|
+
return JSON.stringify(this.container);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Notice that a context has been used and when it was used. This will update an existing record
|
|
34
|
+
* with the given timestamp, or create a new record if one doesn't exist.
|
|
35
|
+
* @param id of the corresponding context
|
|
36
|
+
* @param timestamp in millis since epoch
|
|
37
|
+
*/
|
|
38
|
+
notice(id, timestamp) {
|
|
39
|
+
const entry = this.container.index.find((it) => it.id === id);
|
|
40
|
+
if (entry === undefined) {
|
|
41
|
+
this.container.index.push({ id, timestamp });
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
entry.timestamp = timestamp;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Prune the index to the specified max size and then return the IDs
|
|
49
|
+
* @param maxContexts the maximum number of contexts to retain after this prune
|
|
50
|
+
* @returns an array of removed entries
|
|
51
|
+
*/
|
|
52
|
+
prune(maxContexts) {
|
|
53
|
+
const clampedMax = Math.max(maxContexts, 0); // clamp to [0, infinity)
|
|
54
|
+
if (this.container.index.length > clampedMax) {
|
|
55
|
+
// sort by timestamp so that older timestamps appear first in the array
|
|
56
|
+
this.container.index.sort((a, b) => a.timestamp - b.timestamp);
|
|
57
|
+
// delete the first N many elements above capacity. splice returns removed elements
|
|
58
|
+
return this.container.index.splice(0, this.container.index.length - clampedMax);
|
|
59
|
+
}
|
|
60
|
+
return [];
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
exports.default = ContextIndex;
|
|
64
|
+
//# sourceMappingURL=ContextIndex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContextIndex.js","sourceRoot":"","sources":["../../src/flag-manager/ContextIndex.ts"],"names":[],"mappings":";;AAAA;;;GAGG;AACH,MAAqB,YAAY;IAAjC;QACE,cAAS,GAAmB,EAAE,KAAK,EAAE,IAAI,KAAK,EAAc,EAAE,CAAC;IAuDjE,CAAC;IArDC;;;;OAIG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAY;QAC1B,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;QACxC,IAAI;YACF,YAAY,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SAC3C;QAAC,OAAO,CAAC,EAAE;YACV,8CAA8C;SAC/C;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,EAAU,EAAE,SAAiB;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9D,IAAI,KAAK,KAAK,SAAS,EAAE;YACvB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;SAC9C;aAAM;YACL,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;SAC7B;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,WAAmB;QACvB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,yBAAyB;QACtE,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,UAAU,EAAE;YAC5C,uEAAuE;YACvE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;YAC/D,oFAAoF;YACpF,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC;SACjF;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;CACF;AAxDD,+BAwDC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Context, LDLogger, Platform } from '@launchdarkly/js-sdk-common';
|
|
2
|
+
import { FlagsChangeCallback } from './FlagUpdater';
|
|
3
|
+
import { ItemDescriptor } from './ItemDescriptor';
|
|
4
|
+
/**
|
|
5
|
+
* Top level manager of flags for the client. LDClient should be using this
|
|
6
|
+
* class and not any of the specific instances managed by it. Updates from
|
|
7
|
+
* data sources should be directed to the [init] and [upsert] methods of this
|
|
8
|
+
* class.
|
|
9
|
+
*/
|
|
10
|
+
export default class FlagManager {
|
|
11
|
+
private readonly timeStamper;
|
|
12
|
+
private flagStore;
|
|
13
|
+
private flagUpdater;
|
|
14
|
+
private flagPersistence;
|
|
15
|
+
/**
|
|
16
|
+
* @param platform implementation of various platform provided functionality
|
|
17
|
+
* @param sdkKey that will be used to distinguish different environments
|
|
18
|
+
* @param maxCachedContexts that specifies the max number of contexts that will be cached in persistence
|
|
19
|
+
* @param logger used for logging various messages
|
|
20
|
+
* @param timeStamper exists for testing purposes
|
|
21
|
+
*/
|
|
22
|
+
constructor(platform: Platform, sdkKey: string, maxCachedContexts: number, logger: LDLogger, timeStamper?: () => number);
|
|
23
|
+
/**
|
|
24
|
+
* Attempts to get a flag by key from the current flags.
|
|
25
|
+
*/
|
|
26
|
+
get(key: string): ItemDescriptor | undefined;
|
|
27
|
+
/**
|
|
28
|
+
* Gets all the current flags.
|
|
29
|
+
*/
|
|
30
|
+
getAll(): {
|
|
31
|
+
[key: string]: ItemDescriptor;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Initializes the flag manager with data from a data source.
|
|
35
|
+
* Persistence initialization is handled by {@link FlagPersistence}
|
|
36
|
+
*/
|
|
37
|
+
init(context: Context, newFlags: {
|
|
38
|
+
[key: string]: ItemDescriptor;
|
|
39
|
+
}): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Attempt to update a flag. If the flag is for the wrong context, or
|
|
42
|
+
* it is of an older version, then an update will not be performed.
|
|
43
|
+
*/
|
|
44
|
+
upsert(context: Context, key: string, item: ItemDescriptor): Promise<boolean>;
|
|
45
|
+
/**
|
|
46
|
+
* Asynchronously load cached values from persistence.
|
|
47
|
+
*/
|
|
48
|
+
loadCached(context: Context): Promise<boolean>;
|
|
49
|
+
/**
|
|
50
|
+
* Register a flag change callback.
|
|
51
|
+
*/
|
|
52
|
+
on(callback: FlagsChangeCallback): void;
|
|
53
|
+
/**
|
|
54
|
+
* Unregister a flag change callback.
|
|
55
|
+
*/
|
|
56
|
+
off(callback: FlagsChangeCallback): void;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=FlagManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FlagManager.d.ts","sourceRoot":"","sources":["../../src/flag-manager/FlagManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAK1E,OAAoB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAO,WAAW;IAiB5B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAhB9B,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,eAAe,CAAkB;IAEzC;;;;;;OAMG;gBAED,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,iBAAiB,EAAE,MAAM,EACzB,MAAM,EAAE,QAAQ,EACC,WAAW,GAAE,MAAM,MAAyB;IAgB/D;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI5C;;OAEG;IACH,MAAM,IAAI;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAAA;KAAE;IAI3C;;;OAGG;IACG,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxF;;;OAGG;IACG,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAInF;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAIpD;;OAEG;IACH,EAAE,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI;IAIvC;;OAEG;IACH,GAAG,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI;CAGzC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const namespaceUtils_1 = require("../storage/namespaceUtils");
|
|
4
|
+
const FlagPersistence_1 = require("./FlagPersistence");
|
|
5
|
+
const FlagStore_1 = require("./FlagStore");
|
|
6
|
+
const FlagUpdater_1 = require("./FlagUpdater");
|
|
7
|
+
/**
|
|
8
|
+
* Top level manager of flags for the client. LDClient should be using this
|
|
9
|
+
* class and not any of the specific instances managed by it. Updates from
|
|
10
|
+
* data sources should be directed to the [init] and [upsert] methods of this
|
|
11
|
+
* class.
|
|
12
|
+
*/
|
|
13
|
+
class FlagManager {
|
|
14
|
+
/**
|
|
15
|
+
* @param platform implementation of various platform provided functionality
|
|
16
|
+
* @param sdkKey that will be used to distinguish different environments
|
|
17
|
+
* @param maxCachedContexts that specifies the max number of contexts that will be cached in persistence
|
|
18
|
+
* @param logger used for logging various messages
|
|
19
|
+
* @param timeStamper exists for testing purposes
|
|
20
|
+
*/
|
|
21
|
+
constructor(platform, sdkKey, maxCachedContexts, logger, timeStamper = () => Date.now()) {
|
|
22
|
+
this.timeStamper = timeStamper;
|
|
23
|
+
this.flagStore = new FlagStore_1.DefaultFlagStore();
|
|
24
|
+
const environmentNamespace = (0, namespaceUtils_1.namespaceForEnvironment)(platform.crypto, sdkKey);
|
|
25
|
+
this.flagUpdater = new FlagUpdater_1.default(this.flagStore, logger);
|
|
26
|
+
this.flagPersistence = new FlagPersistence_1.default(platform, environmentNamespace, maxCachedContexts, this.flagStore, this.flagUpdater, logger, timeStamper);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Attempts to get a flag by key from the current flags.
|
|
30
|
+
*/
|
|
31
|
+
get(key) {
|
|
32
|
+
return this.flagStore.get(key);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Gets all the current flags.
|
|
36
|
+
*/
|
|
37
|
+
getAll() {
|
|
38
|
+
return this.flagStore.getAll();
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Initializes the flag manager with data from a data source.
|
|
42
|
+
* Persistence initialization is handled by {@link FlagPersistence}
|
|
43
|
+
*/
|
|
44
|
+
async init(context, newFlags) {
|
|
45
|
+
return this.flagPersistence.init(context, newFlags);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Attempt to update a flag. If the flag is for the wrong context, or
|
|
49
|
+
* it is of an older version, then an update will not be performed.
|
|
50
|
+
*/
|
|
51
|
+
async upsert(context, key, item) {
|
|
52
|
+
return this.flagPersistence.upsert(context, key, item);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Asynchronously load cached values from persistence.
|
|
56
|
+
*/
|
|
57
|
+
async loadCached(context) {
|
|
58
|
+
return this.flagPersistence.loadCached(context);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Register a flag change callback.
|
|
62
|
+
*/
|
|
63
|
+
on(callback) {
|
|
64
|
+
this.flagUpdater.on(callback);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Unregister a flag change callback.
|
|
68
|
+
*/
|
|
69
|
+
off(callback) {
|
|
70
|
+
this.flagUpdater.off(callback);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
exports.default = FlagManager;
|
|
74
|
+
//# sourceMappingURL=FlagManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FlagManager.js","sourceRoot":"","sources":["../../src/flag-manager/FlagManager.ts"],"names":[],"mappings":";;AAEA,8DAAoE;AACpE,uDAAgD;AAChD,2CAA+C;AAC/C,+CAAiE;AAGjE;;;;;GAKG;AACH,MAAqB,WAAW;IAK9B;;;;;;OAMG;IACH,YACE,QAAkB,EAClB,MAAc,EACd,iBAAyB,EACzB,MAAgB,EACC,cAA4B,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;QAA5C,gBAAW,GAAX,WAAW,CAAiC;QAhBvD,cAAS,GAAG,IAAI,4BAAgB,EAAE,CAAC;QAkBzC,MAAM,oBAAoB,GAAG,IAAA,wCAAuB,EAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAE9E,IAAI,CAAC,WAAW,GAAG,IAAI,qBAAW,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC3D,IAAI,CAAC,eAAe,GAAG,IAAI,yBAAe,CACxC,QAAQ,EACR,oBAAoB,EACpB,iBAAiB,EACjB,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,WAAW,EAChB,MAAM,EACN,WAAW,CACZ,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI,CAAC,OAAgB,EAAE,QAA2C;QACtE,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACtD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAM,CAAC,OAAgB,EAAE,GAAW,EAAE,IAAoB;QAC9D,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,OAAgB;QAC/B,OAAO,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC;IAED;;OAEG;IACH,EAAE,CAAC,QAA6B;QAC9B,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,QAA6B;QAC/B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;CACF;AAnFD,8BAmFC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Context, LDLogger, Platform } from '@launchdarkly/js-sdk-common';
|
|
2
|
+
import FlagStore from './FlagStore';
|
|
3
|
+
import FlagUpdater from './FlagUpdater';
|
|
4
|
+
import { ItemDescriptor } from './ItemDescriptor';
|
|
5
|
+
/**
|
|
6
|
+
* This class handles persisting and loading flag values from a persistent
|
|
7
|
+
* store. It intercepts updates and forwards them to the flag updater and
|
|
8
|
+
* then persists changes after the updater has completed.
|
|
9
|
+
*/
|
|
10
|
+
export default class FlagPersistence {
|
|
11
|
+
private readonly platform;
|
|
12
|
+
private readonly environmentNamespace;
|
|
13
|
+
private readonly maxCachedContexts;
|
|
14
|
+
private readonly flagStore;
|
|
15
|
+
private readonly flagUpdater;
|
|
16
|
+
private readonly logger;
|
|
17
|
+
private readonly timeStamper;
|
|
18
|
+
private contextIndex;
|
|
19
|
+
private indexKey;
|
|
20
|
+
constructor(platform: Platform, environmentNamespace: string, maxCachedContexts: number, flagStore: FlagStore, flagUpdater: FlagUpdater, logger: LDLogger, timeStamper?: () => number);
|
|
21
|
+
/**
|
|
22
|
+
* Inits flag persistence for the provided context with the provided flags. This will result
|
|
23
|
+
* in the underlying {@link FlagUpdater} switching its active context.
|
|
24
|
+
*/
|
|
25
|
+
init(context: Context, newFlags: {
|
|
26
|
+
[key: string]: ItemDescriptor;
|
|
27
|
+
}): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Upserts a flag into the {@link FlagUpdater} and stores that to persistence if the upsert
|
|
30
|
+
* was successful / accepted. An upsert may be rejected if the provided context is not
|
|
31
|
+
* the active context.
|
|
32
|
+
*/
|
|
33
|
+
upsert(context: Context, key: string, item: ItemDescriptor): Promise<boolean>;
|
|
34
|
+
/**
|
|
35
|
+
* Loads the flags from persistence for the provided context and gives those to the
|
|
36
|
+
* {@link FlagUpdater} this {@link FlagPersistence} was constructed with.
|
|
37
|
+
*/
|
|
38
|
+
loadCached(context: Context): Promise<boolean>;
|
|
39
|
+
private loadIndex;
|
|
40
|
+
private storeCache;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=FlagPersistence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FlagPersistence.d.ts","sourceRoot":"","sources":["../../src/flag-manager/FlagPersistence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAK1E,OAAO,SAAS,MAAM,aAAa,CAAC;AACpC,OAAO,WAAW,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD;;;;GAIG;AACH,MAAM,CAAC,OAAO,OAAO,eAAe;IAKhC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IACrC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAV9B,OAAO,CAAC,YAAY,CAA2B;IAC/C,OAAO,CAAC,QAAQ,CAAS;gBAGN,QAAQ,EAAE,QAAQ,EAClB,oBAAoB,EAAE,MAAM,EAC5B,iBAAiB,EAAE,MAAM,EACzB,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,QAAQ,EAChB,WAAW,GAAE,MAAM,MAAyB;IAK/D;;;OAGG;IACG,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxF;;;;OAIG;IACG,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAQnF;;;OAGG;IACG,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;YA4CtC,SAAS;YAqBT,UAAU;CA4BzB"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const namespaceUtils_1 = require("../storage/namespaceUtils");
|
|
4
|
+
const ContextIndex_1 = require("./ContextIndex");
|
|
5
|
+
/**
|
|
6
|
+
* This class handles persisting and loading flag values from a persistent
|
|
7
|
+
* store. It intercepts updates and forwards them to the flag updater and
|
|
8
|
+
* then persists changes after the updater has completed.
|
|
9
|
+
*/
|
|
10
|
+
class FlagPersistence {
|
|
11
|
+
constructor(platform, environmentNamespace, maxCachedContexts, flagStore, flagUpdater, logger, timeStamper = () => Date.now()) {
|
|
12
|
+
this.platform = platform;
|
|
13
|
+
this.environmentNamespace = environmentNamespace;
|
|
14
|
+
this.maxCachedContexts = maxCachedContexts;
|
|
15
|
+
this.flagStore = flagStore;
|
|
16
|
+
this.flagUpdater = flagUpdater;
|
|
17
|
+
this.logger = logger;
|
|
18
|
+
this.timeStamper = timeStamper;
|
|
19
|
+
this.indexKey = (0, namespaceUtils_1.namespaceForContextIndex)(this.environmentNamespace);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Inits flag persistence for the provided context with the provided flags. This will result
|
|
23
|
+
* in the underlying {@link FlagUpdater} switching its active context.
|
|
24
|
+
*/
|
|
25
|
+
async init(context, newFlags) {
|
|
26
|
+
this.flagUpdater.init(context, newFlags);
|
|
27
|
+
await this.storeCache(context);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Upserts a flag into the {@link FlagUpdater} and stores that to persistence if the upsert
|
|
31
|
+
* was successful / accepted. An upsert may be rejected if the provided context is not
|
|
32
|
+
* the active context.
|
|
33
|
+
*/
|
|
34
|
+
async upsert(context, key, item) {
|
|
35
|
+
if (this.flagUpdater.upsert(context, key, item)) {
|
|
36
|
+
await this.storeCache(context);
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Loads the flags from persistence for the provided context and gives those to the
|
|
43
|
+
* {@link FlagUpdater} this {@link FlagPersistence} was constructed with.
|
|
44
|
+
*/
|
|
45
|
+
async loadCached(context) {
|
|
46
|
+
var _a, _b, _c, _d;
|
|
47
|
+
const storageKey = (0, namespaceUtils_1.namespaceForContextData)(this.platform.crypto, this.environmentNamespace, context);
|
|
48
|
+
let flagsJson = await ((_a = this.platform.storage) === null || _a === void 0 ? void 0 : _a.get(storageKey));
|
|
49
|
+
if (flagsJson === null || flagsJson === undefined) {
|
|
50
|
+
// Fallback: in version <10.3.1 flag data was stored under the canonical key, check
|
|
51
|
+
// to see if data is present and migrate the data if present.
|
|
52
|
+
flagsJson = await ((_b = this.platform.storage) === null || _b === void 0 ? void 0 : _b.get(context.canonicalKey));
|
|
53
|
+
if (flagsJson === null || flagsJson === undefined) {
|
|
54
|
+
// return false indicating cache did not load if flag json is still absent
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
// migrate data from version <10.3.1 and cleanup data that was under canonical key
|
|
58
|
+
await ((_c = this.platform.storage) === null || _c === void 0 ? void 0 : _c.set(storageKey, flagsJson));
|
|
59
|
+
await ((_d = this.platform.storage) === null || _d === void 0 ? void 0 : _d.clear(context.canonicalKey));
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
const flags = JSON.parse(flagsJson);
|
|
63
|
+
// mapping flags to item descriptors
|
|
64
|
+
const descriptors = Object.entries(flags).reduce((acc, [key, flag]) => {
|
|
65
|
+
acc[key] = { version: flag.version, flag };
|
|
66
|
+
return acc;
|
|
67
|
+
}, {});
|
|
68
|
+
this.flagUpdater.initCached(context, descriptors);
|
|
69
|
+
this.logger.debug('Loaded cached flag evaluations from persistent storage');
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
catch (e) {
|
|
73
|
+
this.logger.warn(`Could not load cached flag evaluations from persistent storage: ${e.message}`);
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async loadIndex() {
|
|
78
|
+
var _a;
|
|
79
|
+
if (this.contextIndex !== undefined) {
|
|
80
|
+
return this.contextIndex;
|
|
81
|
+
}
|
|
82
|
+
const json = await ((_a = this.platform.storage) === null || _a === void 0 ? void 0 : _a.get(this.indexKey));
|
|
83
|
+
if (!json) {
|
|
84
|
+
this.contextIndex = new ContextIndex_1.default();
|
|
85
|
+
return this.contextIndex;
|
|
86
|
+
}
|
|
87
|
+
try {
|
|
88
|
+
this.contextIndex = ContextIndex_1.default.fromJson(json);
|
|
89
|
+
this.logger.debug('Loaded context index from persistent storage');
|
|
90
|
+
}
|
|
91
|
+
catch (e) {
|
|
92
|
+
this.logger.warn(`Could not load index from persistent storage: ${e.message}`);
|
|
93
|
+
this.contextIndex = new ContextIndex_1.default();
|
|
94
|
+
}
|
|
95
|
+
return this.contextIndex;
|
|
96
|
+
}
|
|
97
|
+
async storeCache(context) {
|
|
98
|
+
var _a, _b;
|
|
99
|
+
const index = await this.loadIndex();
|
|
100
|
+
const storageKey = (0, namespaceUtils_1.namespaceForContextData)(this.platform.crypto, this.environmentNamespace, context);
|
|
101
|
+
index.notice(storageKey, this.timeStamper());
|
|
102
|
+
const pruned = index.prune(this.maxCachedContexts);
|
|
103
|
+
await Promise.all(pruned.map(async (it) => { var _a; return (_a = this.platform.storage) === null || _a === void 0 ? void 0 : _a.clear(it.id); }));
|
|
104
|
+
// store index
|
|
105
|
+
await ((_a = this.platform.storage) === null || _a === void 0 ? void 0 : _a.set(this.indexKey, index.toJson()));
|
|
106
|
+
const allFlags = this.flagStore.getAll();
|
|
107
|
+
// mapping item descriptors to flags
|
|
108
|
+
const flags = Object.entries(allFlags).reduce((acc, [key, descriptor]) => {
|
|
109
|
+
if (descriptor.flag !== null && descriptor.flag !== undefined) {
|
|
110
|
+
acc[key] = descriptor.flag;
|
|
111
|
+
}
|
|
112
|
+
return acc;
|
|
113
|
+
}, {});
|
|
114
|
+
const jsonAll = JSON.stringify(flags);
|
|
115
|
+
// store flag data
|
|
116
|
+
await ((_b = this.platform.storage) === null || _b === void 0 ? void 0 : _b.set(storageKey, jsonAll));
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
exports.default = FlagPersistence;
|
|
120
|
+
//# sourceMappingURL=FlagPersistence.js.map
|