@flopflip/launchdarkly-adapter 13.2.3 → 13.3.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/dist/declarations/src/adapter/cache.d.ts +10 -0
- package/dist/declarations/src/adapter/index.d.ts +1 -0
- package/dist/declarations/src/index.d.ts +1 -1
- package/dist/flopflip-launchdarkly-adapter.cjs.dev.js +66 -41
- package/dist/flopflip-launchdarkly-adapter.cjs.prod.js +66 -41
- package/dist/flopflip-launchdarkly-adapter.esm.js +67 -43
- package/package.json +5 -5
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type TCacheIdentifiers, type TFlags } from '@flopflip/types';
|
|
2
|
+
import { type LDContext } from 'launchdarkly-js-client-sdk';
|
|
3
|
+
declare const CACHE_PREFIX = "@flopflip/launchdarkly-adapter";
|
|
4
|
+
declare function getCache(cacheIdentifier: TCacheIdentifiers, cacheKey: LDContext['key']): Promise<{
|
|
5
|
+
set(flags: TFlags): any;
|
|
6
|
+
get(): any;
|
|
7
|
+
unset(): any;
|
|
8
|
+
}>;
|
|
9
|
+
declare function getCachedFlags(cacheIdentifier: TCacheIdentifiers): any;
|
|
10
|
+
export { CACHE_PREFIX, getCache, getCachedFlags };
|
|
@@ -40,14 +40,73 @@ var isEqual__default = /*#__PURE__*/_interopDefault(isEqual);
|
|
|
40
40
|
var mitt__default = /*#__PURE__*/_interopDefault(mitt);
|
|
41
41
|
var warning__default = /*#__PURE__*/_interopDefault(warning);
|
|
42
42
|
|
|
43
|
-
const
|
|
43
|
+
const CACHE_PREFIX = '@flopflip/launchdarkly-adapter';
|
|
44
|
+
const FLAGS_KEY = 'flags';
|
|
45
|
+
const FLAGS_REFERENCE_KEY = 'flags-reference';
|
|
46
|
+
async function importCache(cacheIdentifier) {
|
|
47
|
+
let cacheModule;
|
|
48
|
+
switch (cacheIdentifier) {
|
|
49
|
+
case types.cacheIdentifiers.local:
|
|
50
|
+
{
|
|
51
|
+
cacheModule = await Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require('@flopflip/localstorage-cache')); });
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
case types.cacheIdentifiers.session:
|
|
55
|
+
{
|
|
56
|
+
cacheModule = await Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require('@flopflip/sessionstorage-cache')); });
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return cacheModule;
|
|
61
|
+
}
|
|
62
|
+
async function getCache(cacheIdentifier, cacheKey) {
|
|
63
|
+
const cacheModule = await importCache(cacheIdentifier);
|
|
64
|
+
const createCache = cacheModule.default;
|
|
65
|
+
const flagsCachePrefix = [CACHE_PREFIX, cacheKey].filter(Boolean).join('/');
|
|
66
|
+
const flagsCache = createCache({
|
|
67
|
+
prefix: flagsCachePrefix
|
|
68
|
+
});
|
|
69
|
+
const referenceCache = createCache({
|
|
70
|
+
prefix: CACHE_PREFIX
|
|
71
|
+
});
|
|
72
|
+
return {
|
|
73
|
+
set(flags) {
|
|
74
|
+
const haveFlagsBeenWritten = flagsCache.set(FLAGS_KEY, flags);
|
|
75
|
+
if (haveFlagsBeenWritten) {
|
|
76
|
+
referenceCache.set(FLAGS_REFERENCE_KEY, [flagsCachePrefix, FLAGS_KEY].join('/'));
|
|
77
|
+
}
|
|
78
|
+
return haveFlagsBeenWritten;
|
|
79
|
+
},
|
|
80
|
+
get() {
|
|
81
|
+
return flagsCache.get(FLAGS_KEY);
|
|
82
|
+
},
|
|
83
|
+
unset() {
|
|
84
|
+
referenceCache.unset(FLAGS_REFERENCE_KEY);
|
|
85
|
+
return flagsCache.unset(FLAGS_KEY);
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
function getCachedFlags(cacheIdentifier) {
|
|
90
|
+
const cacheModule = cacheIdentifier === types.cacheIdentifiers.local ? localStorage : sessionStorage;
|
|
91
|
+
const referenceToCachedFlags = cacheModule.get(FLAGS_REFERENCE_KEY);
|
|
92
|
+
if (referenceToCachedFlags) {
|
|
93
|
+
try {
|
|
94
|
+
const cacheKey = JSON.parse(referenceToCachedFlags);
|
|
95
|
+
const cachedFlags = cacheModule.get(cacheKey);
|
|
96
|
+
if (cacheKey && cachedFlags) {
|
|
97
|
+
return JSON.parse(cachedFlags);
|
|
98
|
+
}
|
|
99
|
+
return {};
|
|
100
|
+
} catch (error) {}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
44
104
|
var _adapterState = /*#__PURE__*/_classPrivateFieldLooseKey("adapterState");
|
|
45
105
|
var _updateFlagsInAdapterState = /*#__PURE__*/_classPrivateFieldLooseKey("updateFlagsInAdapterState");
|
|
46
106
|
var _getIsAdapterUnsubscribed = /*#__PURE__*/_classPrivateFieldLooseKey("getIsAdapterUnsubscribed");
|
|
47
107
|
var _getIsFlagUnsubcribed = /*#__PURE__*/_classPrivateFieldLooseKey("getIsFlagUnsubcribed");
|
|
48
108
|
var _getIsFlagLocked = /*#__PURE__*/_classPrivateFieldLooseKey("getIsFlagLocked");
|
|
49
109
|
var _withoutUnsubscribedOrLockedFlags = /*#__PURE__*/_classPrivateFieldLooseKey("withoutUnsubscribedOrLockedFlags");
|
|
50
|
-
var _getCache = /*#__PURE__*/_classPrivateFieldLooseKey("getCache");
|
|
51
110
|
var _getIsAnonymousContext = /*#__PURE__*/_classPrivateFieldLooseKey("getIsAnonymousContext");
|
|
52
111
|
var _ensureContext = /*#__PURE__*/_classPrivateFieldLooseKey("ensureContext");
|
|
53
112
|
var _initializeClient = /*#__PURE__*/_classPrivateFieldLooseKey("initializeClient");
|
|
@@ -104,40 +163,6 @@ class LaunchDarklyAdapter {
|
|
|
104
163
|
return !_classPrivateFieldLooseBase(this, _getIsFlagUnsubcribed)[_getIsFlagUnsubcribed](flagName) && !_classPrivateFieldLooseBase(this, _getIsFlagLocked)[_getIsFlagLocked](flagName);
|
|
105
164
|
}))
|
|
106
165
|
});
|
|
107
|
-
Object.defineProperty(this, _getCache, {
|
|
108
|
-
writable: true,
|
|
109
|
-
value: async (cacheIdentifier, cacheKey) => {
|
|
110
|
-
let cacheModule;
|
|
111
|
-
switch (cacheIdentifier) {
|
|
112
|
-
case types.cacheIdentifiers.local:
|
|
113
|
-
{
|
|
114
|
-
cacheModule = await Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require('@flopflip/localstorage-cache')); });
|
|
115
|
-
break;
|
|
116
|
-
}
|
|
117
|
-
case types.cacheIdentifiers.session:
|
|
118
|
-
{
|
|
119
|
-
cacheModule = await Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require('@flopflip/sessionstorage-cache')); });
|
|
120
|
-
break;
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
const createCache = cacheModule.default;
|
|
124
|
-
const cachePrefix = [STORAGE_SLICE, cacheKey].filter(Boolean).join('/');
|
|
125
|
-
const cache = createCache({
|
|
126
|
-
prefix: cachePrefix
|
|
127
|
-
});
|
|
128
|
-
return {
|
|
129
|
-
set(flags) {
|
|
130
|
-
return cache.set('flags', flags);
|
|
131
|
-
},
|
|
132
|
-
get() {
|
|
133
|
-
return cache.get('flags');
|
|
134
|
-
},
|
|
135
|
-
unset() {
|
|
136
|
-
return cache.unset('flags');
|
|
137
|
-
}
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
});
|
|
141
166
|
Object.defineProperty(this, _getIsAnonymousContext, {
|
|
142
167
|
writable: true,
|
|
143
168
|
value: context => !(context !== null && context !== void 0 && context.key)
|
|
@@ -190,7 +215,7 @@ class LaunchDarklyAdapter {
|
|
|
190
215
|
const normalizedFlags = adapterUtilities.normalizeFlags(flagsFromSdk);
|
|
191
216
|
if (cacheIdentifier) {
|
|
192
217
|
var _classPrivateFieldLoo2;
|
|
193
|
-
const cache = await
|
|
218
|
+
const cache = await getCache(cacheIdentifier, (_classPrivateFieldLoo2 = _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context) === null || _classPrivateFieldLoo2 === void 0 ? void 0 : _classPrivateFieldLoo2.key);
|
|
194
219
|
cache.set(normalizedFlags);
|
|
195
220
|
}
|
|
196
221
|
const flags = _classPrivateFieldLooseBase(this, _withoutUnsubscribedOrLockedFlags)[_withoutUnsubscribedOrLockedFlags](normalizedFlags);
|
|
@@ -241,7 +266,6 @@ class LaunchDarklyAdapter {
|
|
|
241
266
|
const updatedFlags = {
|
|
242
267
|
[normalizedFlagName]: normalizedFlagValue
|
|
243
268
|
};
|
|
244
|
-
|
|
245
269
|
// NOTE: Adapter state needs to be updated outside of debounced-fn
|
|
246
270
|
// so that no flag updates are lost.
|
|
247
271
|
_classPrivateFieldLooseBase(this, _updateFlagsInAdapterState)[_updateFlagsInAdapterState](updatedFlags);
|
|
@@ -324,7 +348,7 @@ class LaunchDarklyAdapter {
|
|
|
324
348
|
let cachedFlags;
|
|
325
349
|
_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context = _classPrivateFieldLooseBase(this, _ensureContext)[_ensureContext](context);
|
|
326
350
|
if (adapterArgs.cacheIdentifier) {
|
|
327
|
-
const cache = await
|
|
351
|
+
const cache = await getCache(adapterArgs.cacheIdentifier, context.key);
|
|
328
352
|
cachedFlags = cache.get();
|
|
329
353
|
if (cachedFlags) {
|
|
330
354
|
_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].flags = cachedFlags;
|
|
@@ -356,7 +380,7 @@ class LaunchDarklyAdapter {
|
|
|
356
380
|
if (!isEqual__default["default"](_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context, nextContext)) {
|
|
357
381
|
if (adapterArgs.cacheIdentifier) {
|
|
358
382
|
var _classPrivateFieldLoo3;
|
|
359
|
-
const cache = await
|
|
383
|
+
const cache = await getCache(adapterArgs.cacheIdentifier, (_classPrivateFieldLoo3 = _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context) === null || _classPrivateFieldLoo3 === void 0 ? void 0 : _classPrivateFieldLoo3.key);
|
|
360
384
|
cache.unset();
|
|
361
385
|
}
|
|
362
386
|
_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context = nextContext;
|
|
@@ -394,7 +418,8 @@ class LaunchDarklyAdapter {
|
|
|
394
418
|
const adapter = new LaunchDarklyAdapter();
|
|
395
419
|
adapterUtilities.exposeGlobally(adapter);
|
|
396
420
|
|
|
397
|
-
const version = "13.
|
|
421
|
+
const version = "13.3.1";
|
|
398
422
|
|
|
399
423
|
exports["default"] = adapter;
|
|
424
|
+
exports.getCachedFlags = getCachedFlags;
|
|
400
425
|
exports.version = version;
|
|
@@ -40,14 +40,73 @@ var isEqual__default = /*#__PURE__*/_interopDefault(isEqual);
|
|
|
40
40
|
var mitt__default = /*#__PURE__*/_interopDefault(mitt);
|
|
41
41
|
var warning__default = /*#__PURE__*/_interopDefault(warning);
|
|
42
42
|
|
|
43
|
-
const
|
|
43
|
+
const CACHE_PREFIX = '@flopflip/launchdarkly-adapter';
|
|
44
|
+
const FLAGS_KEY = 'flags';
|
|
45
|
+
const FLAGS_REFERENCE_KEY = 'flags-reference';
|
|
46
|
+
async function importCache(cacheIdentifier) {
|
|
47
|
+
let cacheModule;
|
|
48
|
+
switch (cacheIdentifier) {
|
|
49
|
+
case types.cacheIdentifiers.local:
|
|
50
|
+
{
|
|
51
|
+
cacheModule = await Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require('@flopflip/localstorage-cache')); });
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
case types.cacheIdentifiers.session:
|
|
55
|
+
{
|
|
56
|
+
cacheModule = await Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require('@flopflip/sessionstorage-cache')); });
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return cacheModule;
|
|
61
|
+
}
|
|
62
|
+
async function getCache(cacheIdentifier, cacheKey) {
|
|
63
|
+
const cacheModule = await importCache(cacheIdentifier);
|
|
64
|
+
const createCache = cacheModule.default;
|
|
65
|
+
const flagsCachePrefix = [CACHE_PREFIX, cacheKey].filter(Boolean).join('/');
|
|
66
|
+
const flagsCache = createCache({
|
|
67
|
+
prefix: flagsCachePrefix
|
|
68
|
+
});
|
|
69
|
+
const referenceCache = createCache({
|
|
70
|
+
prefix: CACHE_PREFIX
|
|
71
|
+
});
|
|
72
|
+
return {
|
|
73
|
+
set(flags) {
|
|
74
|
+
const haveFlagsBeenWritten = flagsCache.set(FLAGS_KEY, flags);
|
|
75
|
+
if (haveFlagsBeenWritten) {
|
|
76
|
+
referenceCache.set(FLAGS_REFERENCE_KEY, [flagsCachePrefix, FLAGS_KEY].join('/'));
|
|
77
|
+
}
|
|
78
|
+
return haveFlagsBeenWritten;
|
|
79
|
+
},
|
|
80
|
+
get() {
|
|
81
|
+
return flagsCache.get(FLAGS_KEY);
|
|
82
|
+
},
|
|
83
|
+
unset() {
|
|
84
|
+
referenceCache.unset(FLAGS_REFERENCE_KEY);
|
|
85
|
+
return flagsCache.unset(FLAGS_KEY);
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
function getCachedFlags(cacheIdentifier) {
|
|
90
|
+
const cacheModule = cacheIdentifier === types.cacheIdentifiers.local ? localStorage : sessionStorage;
|
|
91
|
+
const referenceToCachedFlags = cacheModule.get(FLAGS_REFERENCE_KEY);
|
|
92
|
+
if (referenceToCachedFlags) {
|
|
93
|
+
try {
|
|
94
|
+
const cacheKey = JSON.parse(referenceToCachedFlags);
|
|
95
|
+
const cachedFlags = cacheModule.get(cacheKey);
|
|
96
|
+
if (cacheKey && cachedFlags) {
|
|
97
|
+
return JSON.parse(cachedFlags);
|
|
98
|
+
}
|
|
99
|
+
return {};
|
|
100
|
+
} catch (error) {}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
44
104
|
var _adapterState = /*#__PURE__*/_classPrivateFieldLooseKey("adapterState");
|
|
45
105
|
var _updateFlagsInAdapterState = /*#__PURE__*/_classPrivateFieldLooseKey("updateFlagsInAdapterState");
|
|
46
106
|
var _getIsAdapterUnsubscribed = /*#__PURE__*/_classPrivateFieldLooseKey("getIsAdapterUnsubscribed");
|
|
47
107
|
var _getIsFlagUnsubcribed = /*#__PURE__*/_classPrivateFieldLooseKey("getIsFlagUnsubcribed");
|
|
48
108
|
var _getIsFlagLocked = /*#__PURE__*/_classPrivateFieldLooseKey("getIsFlagLocked");
|
|
49
109
|
var _withoutUnsubscribedOrLockedFlags = /*#__PURE__*/_classPrivateFieldLooseKey("withoutUnsubscribedOrLockedFlags");
|
|
50
|
-
var _getCache = /*#__PURE__*/_classPrivateFieldLooseKey("getCache");
|
|
51
110
|
var _getIsAnonymousContext = /*#__PURE__*/_classPrivateFieldLooseKey("getIsAnonymousContext");
|
|
52
111
|
var _ensureContext = /*#__PURE__*/_classPrivateFieldLooseKey("ensureContext");
|
|
53
112
|
var _initializeClient = /*#__PURE__*/_classPrivateFieldLooseKey("initializeClient");
|
|
@@ -104,40 +163,6 @@ class LaunchDarklyAdapter {
|
|
|
104
163
|
return !_classPrivateFieldLooseBase(this, _getIsFlagUnsubcribed)[_getIsFlagUnsubcribed](flagName) && !_classPrivateFieldLooseBase(this, _getIsFlagLocked)[_getIsFlagLocked](flagName);
|
|
105
164
|
}))
|
|
106
165
|
});
|
|
107
|
-
Object.defineProperty(this, _getCache, {
|
|
108
|
-
writable: true,
|
|
109
|
-
value: async (cacheIdentifier, cacheKey) => {
|
|
110
|
-
let cacheModule;
|
|
111
|
-
switch (cacheIdentifier) {
|
|
112
|
-
case types.cacheIdentifiers.local:
|
|
113
|
-
{
|
|
114
|
-
cacheModule = await Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require('@flopflip/localstorage-cache')); });
|
|
115
|
-
break;
|
|
116
|
-
}
|
|
117
|
-
case types.cacheIdentifiers.session:
|
|
118
|
-
{
|
|
119
|
-
cacheModule = await Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require('@flopflip/sessionstorage-cache')); });
|
|
120
|
-
break;
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
const createCache = cacheModule.default;
|
|
124
|
-
const cachePrefix = [STORAGE_SLICE, cacheKey].filter(Boolean).join('/');
|
|
125
|
-
const cache = createCache({
|
|
126
|
-
prefix: cachePrefix
|
|
127
|
-
});
|
|
128
|
-
return {
|
|
129
|
-
set(flags) {
|
|
130
|
-
return cache.set('flags', flags);
|
|
131
|
-
},
|
|
132
|
-
get() {
|
|
133
|
-
return cache.get('flags');
|
|
134
|
-
},
|
|
135
|
-
unset() {
|
|
136
|
-
return cache.unset('flags');
|
|
137
|
-
}
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
});
|
|
141
166
|
Object.defineProperty(this, _getIsAnonymousContext, {
|
|
142
167
|
writable: true,
|
|
143
168
|
value: context => !(context !== null && context !== void 0 && context.key)
|
|
@@ -190,7 +215,7 @@ class LaunchDarklyAdapter {
|
|
|
190
215
|
const normalizedFlags = adapterUtilities.normalizeFlags(flagsFromSdk);
|
|
191
216
|
if (cacheIdentifier) {
|
|
192
217
|
var _classPrivateFieldLoo2;
|
|
193
|
-
const cache = await
|
|
218
|
+
const cache = await getCache(cacheIdentifier, (_classPrivateFieldLoo2 = _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context) === null || _classPrivateFieldLoo2 === void 0 ? void 0 : _classPrivateFieldLoo2.key);
|
|
194
219
|
cache.set(normalizedFlags);
|
|
195
220
|
}
|
|
196
221
|
const flags = _classPrivateFieldLooseBase(this, _withoutUnsubscribedOrLockedFlags)[_withoutUnsubscribedOrLockedFlags](normalizedFlags);
|
|
@@ -241,7 +266,6 @@ class LaunchDarklyAdapter {
|
|
|
241
266
|
const updatedFlags = {
|
|
242
267
|
[normalizedFlagName]: normalizedFlagValue
|
|
243
268
|
};
|
|
244
|
-
|
|
245
269
|
// NOTE: Adapter state needs to be updated outside of debounced-fn
|
|
246
270
|
// so that no flag updates are lost.
|
|
247
271
|
_classPrivateFieldLooseBase(this, _updateFlagsInAdapterState)[_updateFlagsInAdapterState](updatedFlags);
|
|
@@ -324,7 +348,7 @@ class LaunchDarklyAdapter {
|
|
|
324
348
|
let cachedFlags;
|
|
325
349
|
_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context = _classPrivateFieldLooseBase(this, _ensureContext)[_ensureContext](context);
|
|
326
350
|
if (adapterArgs.cacheIdentifier) {
|
|
327
|
-
const cache = await
|
|
351
|
+
const cache = await getCache(adapterArgs.cacheIdentifier, context.key);
|
|
328
352
|
cachedFlags = cache.get();
|
|
329
353
|
if (cachedFlags) {
|
|
330
354
|
_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].flags = cachedFlags;
|
|
@@ -356,7 +380,7 @@ class LaunchDarklyAdapter {
|
|
|
356
380
|
if (!isEqual__default["default"](_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context, nextContext)) {
|
|
357
381
|
if (adapterArgs.cacheIdentifier) {
|
|
358
382
|
var _classPrivateFieldLoo3;
|
|
359
|
-
const cache = await
|
|
383
|
+
const cache = await getCache(adapterArgs.cacheIdentifier, (_classPrivateFieldLoo3 = _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context) === null || _classPrivateFieldLoo3 === void 0 ? void 0 : _classPrivateFieldLoo3.key);
|
|
360
384
|
cache.unset();
|
|
361
385
|
}
|
|
362
386
|
_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context = nextContext;
|
|
@@ -394,7 +418,8 @@ class LaunchDarklyAdapter {
|
|
|
394
418
|
const adapter = new LaunchDarklyAdapter();
|
|
395
419
|
adapterUtilities.exposeGlobally(adapter);
|
|
396
420
|
|
|
397
|
-
const version = "13.
|
|
421
|
+
const version = "13.3.1";
|
|
398
422
|
|
|
399
423
|
exports["default"] = adapter;
|
|
424
|
+
exports.getCachedFlags = getCachedFlags;
|
|
400
425
|
exports.version = version;
|
|
@@ -3,7 +3,7 @@ import _slicedToArray from '@babel/runtime/helpers/esm/slicedToArray';
|
|
|
3
3
|
import _classPrivateFieldLooseBase from '@babel/runtime/helpers/esm/classPrivateFieldLooseBase';
|
|
4
4
|
import _classPrivateFieldLooseKey from '@babel/runtime/helpers/esm/classPrivateFieldLooseKey';
|
|
5
5
|
import { exposeGlobally, denormalizeFlagName, normalizeFlags, normalizeFlag } from '@flopflip/adapter-utilities';
|
|
6
|
-
import {
|
|
6
|
+
import { cacheIdentifiers, AdapterSubscriptionStatus, AdapterConfigurationStatus, AdapterInitializationStatus, adapterIdentifiers } from '@flopflip/types';
|
|
7
7
|
import debounce from 'debounce-fn';
|
|
8
8
|
import { initialize } from 'launchdarkly-js-client-sdk';
|
|
9
9
|
import isEqual from 'lodash/isEqual';
|
|
@@ -11,14 +11,73 @@ import mitt from 'mitt';
|
|
|
11
11
|
import warning from 'tiny-warning';
|
|
12
12
|
import { merge } from 'ts-deepmerge';
|
|
13
13
|
|
|
14
|
-
const
|
|
14
|
+
const CACHE_PREFIX = '@flopflip/launchdarkly-adapter';
|
|
15
|
+
const FLAGS_KEY = 'flags';
|
|
16
|
+
const FLAGS_REFERENCE_KEY = 'flags-reference';
|
|
17
|
+
async function importCache(cacheIdentifier) {
|
|
18
|
+
let cacheModule;
|
|
19
|
+
switch (cacheIdentifier) {
|
|
20
|
+
case cacheIdentifiers.local:
|
|
21
|
+
{
|
|
22
|
+
cacheModule = await import('@flopflip/localstorage-cache');
|
|
23
|
+
break;
|
|
24
|
+
}
|
|
25
|
+
case cacheIdentifiers.session:
|
|
26
|
+
{
|
|
27
|
+
cacheModule = await import('@flopflip/sessionstorage-cache');
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return cacheModule;
|
|
32
|
+
}
|
|
33
|
+
async function getCache(cacheIdentifier, cacheKey) {
|
|
34
|
+
const cacheModule = await importCache(cacheIdentifier);
|
|
35
|
+
const createCache = cacheModule.default;
|
|
36
|
+
const flagsCachePrefix = [CACHE_PREFIX, cacheKey].filter(Boolean).join('/');
|
|
37
|
+
const flagsCache = createCache({
|
|
38
|
+
prefix: flagsCachePrefix
|
|
39
|
+
});
|
|
40
|
+
const referenceCache = createCache({
|
|
41
|
+
prefix: CACHE_PREFIX
|
|
42
|
+
});
|
|
43
|
+
return {
|
|
44
|
+
set(flags) {
|
|
45
|
+
const haveFlagsBeenWritten = flagsCache.set(FLAGS_KEY, flags);
|
|
46
|
+
if (haveFlagsBeenWritten) {
|
|
47
|
+
referenceCache.set(FLAGS_REFERENCE_KEY, [flagsCachePrefix, FLAGS_KEY].join('/'));
|
|
48
|
+
}
|
|
49
|
+
return haveFlagsBeenWritten;
|
|
50
|
+
},
|
|
51
|
+
get() {
|
|
52
|
+
return flagsCache.get(FLAGS_KEY);
|
|
53
|
+
},
|
|
54
|
+
unset() {
|
|
55
|
+
referenceCache.unset(FLAGS_REFERENCE_KEY);
|
|
56
|
+
return flagsCache.unset(FLAGS_KEY);
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function getCachedFlags(cacheIdentifier) {
|
|
61
|
+
const cacheModule = cacheIdentifier === cacheIdentifiers.local ? localStorage : sessionStorage;
|
|
62
|
+
const referenceToCachedFlags = cacheModule.get(FLAGS_REFERENCE_KEY);
|
|
63
|
+
if (referenceToCachedFlags) {
|
|
64
|
+
try {
|
|
65
|
+
const cacheKey = JSON.parse(referenceToCachedFlags);
|
|
66
|
+
const cachedFlags = cacheModule.get(cacheKey);
|
|
67
|
+
if (cacheKey && cachedFlags) {
|
|
68
|
+
return JSON.parse(cachedFlags);
|
|
69
|
+
}
|
|
70
|
+
return {};
|
|
71
|
+
} catch (error) {}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
15
75
|
var _adapterState = /*#__PURE__*/_classPrivateFieldLooseKey("adapterState");
|
|
16
76
|
var _updateFlagsInAdapterState = /*#__PURE__*/_classPrivateFieldLooseKey("updateFlagsInAdapterState");
|
|
17
77
|
var _getIsAdapterUnsubscribed = /*#__PURE__*/_classPrivateFieldLooseKey("getIsAdapterUnsubscribed");
|
|
18
78
|
var _getIsFlagUnsubcribed = /*#__PURE__*/_classPrivateFieldLooseKey("getIsFlagUnsubcribed");
|
|
19
79
|
var _getIsFlagLocked = /*#__PURE__*/_classPrivateFieldLooseKey("getIsFlagLocked");
|
|
20
80
|
var _withoutUnsubscribedOrLockedFlags = /*#__PURE__*/_classPrivateFieldLooseKey("withoutUnsubscribedOrLockedFlags");
|
|
21
|
-
var _getCache = /*#__PURE__*/_classPrivateFieldLooseKey("getCache");
|
|
22
81
|
var _getIsAnonymousContext = /*#__PURE__*/_classPrivateFieldLooseKey("getIsAnonymousContext");
|
|
23
82
|
var _ensureContext = /*#__PURE__*/_classPrivateFieldLooseKey("ensureContext");
|
|
24
83
|
var _initializeClient = /*#__PURE__*/_classPrivateFieldLooseKey("initializeClient");
|
|
@@ -75,40 +134,6 @@ class LaunchDarklyAdapter {
|
|
|
75
134
|
return !_classPrivateFieldLooseBase(this, _getIsFlagUnsubcribed)[_getIsFlagUnsubcribed](flagName) && !_classPrivateFieldLooseBase(this, _getIsFlagLocked)[_getIsFlagLocked](flagName);
|
|
76
135
|
}))
|
|
77
136
|
});
|
|
78
|
-
Object.defineProperty(this, _getCache, {
|
|
79
|
-
writable: true,
|
|
80
|
-
value: async (cacheIdentifier, cacheKey) => {
|
|
81
|
-
let cacheModule;
|
|
82
|
-
switch (cacheIdentifier) {
|
|
83
|
-
case cacheIdentifiers.local:
|
|
84
|
-
{
|
|
85
|
-
cacheModule = await import('@flopflip/localstorage-cache');
|
|
86
|
-
break;
|
|
87
|
-
}
|
|
88
|
-
case cacheIdentifiers.session:
|
|
89
|
-
{
|
|
90
|
-
cacheModule = await import('@flopflip/sessionstorage-cache');
|
|
91
|
-
break;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
const createCache = cacheModule.default;
|
|
95
|
-
const cachePrefix = [STORAGE_SLICE, cacheKey].filter(Boolean).join('/');
|
|
96
|
-
const cache = createCache({
|
|
97
|
-
prefix: cachePrefix
|
|
98
|
-
});
|
|
99
|
-
return {
|
|
100
|
-
set(flags) {
|
|
101
|
-
return cache.set('flags', flags);
|
|
102
|
-
},
|
|
103
|
-
get() {
|
|
104
|
-
return cache.get('flags');
|
|
105
|
-
},
|
|
106
|
-
unset() {
|
|
107
|
-
return cache.unset('flags');
|
|
108
|
-
}
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
});
|
|
112
137
|
Object.defineProperty(this, _getIsAnonymousContext, {
|
|
113
138
|
writable: true,
|
|
114
139
|
value: context => !(context !== null && context !== void 0 && context.key)
|
|
@@ -161,7 +186,7 @@ class LaunchDarklyAdapter {
|
|
|
161
186
|
const normalizedFlags = normalizeFlags(flagsFromSdk);
|
|
162
187
|
if (cacheIdentifier) {
|
|
163
188
|
var _classPrivateFieldLoo2;
|
|
164
|
-
const cache = await
|
|
189
|
+
const cache = await getCache(cacheIdentifier, (_classPrivateFieldLoo2 = _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context) === null || _classPrivateFieldLoo2 === void 0 ? void 0 : _classPrivateFieldLoo2.key);
|
|
165
190
|
cache.set(normalizedFlags);
|
|
166
191
|
}
|
|
167
192
|
const flags = _classPrivateFieldLooseBase(this, _withoutUnsubscribedOrLockedFlags)[_withoutUnsubscribedOrLockedFlags](normalizedFlags);
|
|
@@ -212,7 +237,6 @@ class LaunchDarklyAdapter {
|
|
|
212
237
|
const updatedFlags = {
|
|
213
238
|
[normalizedFlagName]: normalizedFlagValue
|
|
214
239
|
};
|
|
215
|
-
|
|
216
240
|
// NOTE: Adapter state needs to be updated outside of debounced-fn
|
|
217
241
|
// so that no flag updates are lost.
|
|
218
242
|
_classPrivateFieldLooseBase(this, _updateFlagsInAdapterState)[_updateFlagsInAdapterState](updatedFlags);
|
|
@@ -295,7 +319,7 @@ class LaunchDarklyAdapter {
|
|
|
295
319
|
let cachedFlags;
|
|
296
320
|
_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context = _classPrivateFieldLooseBase(this, _ensureContext)[_ensureContext](context);
|
|
297
321
|
if (adapterArgs.cacheIdentifier) {
|
|
298
|
-
const cache = await
|
|
322
|
+
const cache = await getCache(adapterArgs.cacheIdentifier, context.key);
|
|
299
323
|
cachedFlags = cache.get();
|
|
300
324
|
if (cachedFlags) {
|
|
301
325
|
_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].flags = cachedFlags;
|
|
@@ -327,7 +351,7 @@ class LaunchDarklyAdapter {
|
|
|
327
351
|
if (!isEqual(_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context, nextContext)) {
|
|
328
352
|
if (adapterArgs.cacheIdentifier) {
|
|
329
353
|
var _classPrivateFieldLoo3;
|
|
330
|
-
const cache = await
|
|
354
|
+
const cache = await getCache(adapterArgs.cacheIdentifier, (_classPrivateFieldLoo3 = _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context) === null || _classPrivateFieldLoo3 === void 0 ? void 0 : _classPrivateFieldLoo3.key);
|
|
331
355
|
cache.unset();
|
|
332
356
|
}
|
|
333
357
|
_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context = nextContext;
|
|
@@ -365,6 +389,6 @@ class LaunchDarklyAdapter {
|
|
|
365
389
|
const adapter = new LaunchDarklyAdapter();
|
|
366
390
|
exposeGlobally(adapter);
|
|
367
391
|
|
|
368
|
-
const version = "13.
|
|
392
|
+
const version = "13.3.1";
|
|
369
393
|
|
|
370
|
-
export { adapter as default, version };
|
|
394
|
+
export { adapter as default, getCachedFlags, version };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flopflip/launchdarkly-adapter",
|
|
3
|
-
"version": "13.
|
|
3
|
+
"version": "13.3.1",
|
|
4
4
|
"description": "A adapter around the LaunchDarkly client for flipflop",
|
|
5
5
|
"main": "dist/flopflip-launchdarkly-adapter.cjs.js",
|
|
6
6
|
"module": "dist/flopflip-launchdarkly-adapter.esm.js",
|
|
@@ -27,10 +27,10 @@
|
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"@babel/runtime": "7.24.0",
|
|
30
|
-
"@flopflip/adapter-utilities": "13.
|
|
31
|
-
"@flopflip/localstorage-cache": "13.
|
|
32
|
-
"@flopflip/sessionstorage-cache": "13.
|
|
33
|
-
"@flopflip/types": "13.
|
|
30
|
+
"@flopflip/adapter-utilities": "13.3.1",
|
|
31
|
+
"@flopflip/localstorage-cache": "13.3.1",
|
|
32
|
+
"@flopflip/sessionstorage-cache": "13.3.1",
|
|
33
|
+
"@flopflip/types": "13.3.1",
|
|
34
34
|
"debounce-fn": "4.0.0",
|
|
35
35
|
"launchdarkly-js-client-sdk": "3.1.4",
|
|
36
36
|
"lodash": "4.17.21",
|