@flopflip/launchdarkly-adapter 13.2.3 → 13.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/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 +67 -41
- package/dist/flopflip-launchdarkly-adapter.cjs.prod.js +67 -41
- package/dist/flopflip-launchdarkly-adapter.esm.js +68 -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): Promise<any>;
|
|
10
|
+
export { CACHE_PREFIX, getCache, getCachedFlags };
|
|
@@ -40,14 +40,74 @@ 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
|
+
async function getCachedFlags(cacheIdentifier) {
|
|
90
|
+
const cacheModule = await importCache(cacheIdentifier);
|
|
91
|
+
const createCache = cacheModule.default;
|
|
92
|
+
const referenceCache = createCache({
|
|
93
|
+
prefix: CACHE_PREFIX
|
|
94
|
+
});
|
|
95
|
+
const reference = referenceCache.get(FLAGS_REFERENCE_KEY);
|
|
96
|
+
if (reference) {
|
|
97
|
+
// Cache without prefix as the reference is already prefixed.
|
|
98
|
+
const flagsCache = createCache({
|
|
99
|
+
prefix: ''
|
|
100
|
+
});
|
|
101
|
+
return flagsCache.get(reference);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
44
105
|
var _adapterState = /*#__PURE__*/_classPrivateFieldLooseKey("adapterState");
|
|
45
106
|
var _updateFlagsInAdapterState = /*#__PURE__*/_classPrivateFieldLooseKey("updateFlagsInAdapterState");
|
|
46
107
|
var _getIsAdapterUnsubscribed = /*#__PURE__*/_classPrivateFieldLooseKey("getIsAdapterUnsubscribed");
|
|
47
108
|
var _getIsFlagUnsubcribed = /*#__PURE__*/_classPrivateFieldLooseKey("getIsFlagUnsubcribed");
|
|
48
109
|
var _getIsFlagLocked = /*#__PURE__*/_classPrivateFieldLooseKey("getIsFlagLocked");
|
|
49
110
|
var _withoutUnsubscribedOrLockedFlags = /*#__PURE__*/_classPrivateFieldLooseKey("withoutUnsubscribedOrLockedFlags");
|
|
50
|
-
var _getCache = /*#__PURE__*/_classPrivateFieldLooseKey("getCache");
|
|
51
111
|
var _getIsAnonymousContext = /*#__PURE__*/_classPrivateFieldLooseKey("getIsAnonymousContext");
|
|
52
112
|
var _ensureContext = /*#__PURE__*/_classPrivateFieldLooseKey("ensureContext");
|
|
53
113
|
var _initializeClient = /*#__PURE__*/_classPrivateFieldLooseKey("initializeClient");
|
|
@@ -104,40 +164,6 @@ class LaunchDarklyAdapter {
|
|
|
104
164
|
return !_classPrivateFieldLooseBase(this, _getIsFlagUnsubcribed)[_getIsFlagUnsubcribed](flagName) && !_classPrivateFieldLooseBase(this, _getIsFlagLocked)[_getIsFlagLocked](flagName);
|
|
105
165
|
}))
|
|
106
166
|
});
|
|
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
167
|
Object.defineProperty(this, _getIsAnonymousContext, {
|
|
142
168
|
writable: true,
|
|
143
169
|
value: context => !(context !== null && context !== void 0 && context.key)
|
|
@@ -190,7 +216,7 @@ class LaunchDarklyAdapter {
|
|
|
190
216
|
const normalizedFlags = adapterUtilities.normalizeFlags(flagsFromSdk);
|
|
191
217
|
if (cacheIdentifier) {
|
|
192
218
|
var _classPrivateFieldLoo2;
|
|
193
|
-
const cache = await
|
|
219
|
+
const cache = await getCache(cacheIdentifier, (_classPrivateFieldLoo2 = _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context) === null || _classPrivateFieldLoo2 === void 0 ? void 0 : _classPrivateFieldLoo2.key);
|
|
194
220
|
cache.set(normalizedFlags);
|
|
195
221
|
}
|
|
196
222
|
const flags = _classPrivateFieldLooseBase(this, _withoutUnsubscribedOrLockedFlags)[_withoutUnsubscribedOrLockedFlags](normalizedFlags);
|
|
@@ -241,7 +267,6 @@ class LaunchDarklyAdapter {
|
|
|
241
267
|
const updatedFlags = {
|
|
242
268
|
[normalizedFlagName]: normalizedFlagValue
|
|
243
269
|
};
|
|
244
|
-
|
|
245
270
|
// NOTE: Adapter state needs to be updated outside of debounced-fn
|
|
246
271
|
// so that no flag updates are lost.
|
|
247
272
|
_classPrivateFieldLooseBase(this, _updateFlagsInAdapterState)[_updateFlagsInAdapterState](updatedFlags);
|
|
@@ -324,7 +349,7 @@ class LaunchDarklyAdapter {
|
|
|
324
349
|
let cachedFlags;
|
|
325
350
|
_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context = _classPrivateFieldLooseBase(this, _ensureContext)[_ensureContext](context);
|
|
326
351
|
if (adapterArgs.cacheIdentifier) {
|
|
327
|
-
const cache = await
|
|
352
|
+
const cache = await getCache(adapterArgs.cacheIdentifier, context.key);
|
|
328
353
|
cachedFlags = cache.get();
|
|
329
354
|
if (cachedFlags) {
|
|
330
355
|
_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].flags = cachedFlags;
|
|
@@ -356,7 +381,7 @@ class LaunchDarklyAdapter {
|
|
|
356
381
|
if (!isEqual__default["default"](_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context, nextContext)) {
|
|
357
382
|
if (adapterArgs.cacheIdentifier) {
|
|
358
383
|
var _classPrivateFieldLoo3;
|
|
359
|
-
const cache = await
|
|
384
|
+
const cache = await getCache(adapterArgs.cacheIdentifier, (_classPrivateFieldLoo3 = _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context) === null || _classPrivateFieldLoo3 === void 0 ? void 0 : _classPrivateFieldLoo3.key);
|
|
360
385
|
cache.unset();
|
|
361
386
|
}
|
|
362
387
|
_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context = nextContext;
|
|
@@ -394,7 +419,8 @@ class LaunchDarklyAdapter {
|
|
|
394
419
|
const adapter = new LaunchDarklyAdapter();
|
|
395
420
|
adapterUtilities.exposeGlobally(adapter);
|
|
396
421
|
|
|
397
|
-
const version = "13.
|
|
422
|
+
const version = "13.3.0";
|
|
398
423
|
|
|
399
424
|
exports["default"] = adapter;
|
|
425
|
+
exports.getCachedFlags = getCachedFlags;
|
|
400
426
|
exports.version = version;
|
|
@@ -40,14 +40,74 @@ 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
|
+
async function getCachedFlags(cacheIdentifier) {
|
|
90
|
+
const cacheModule = await importCache(cacheIdentifier);
|
|
91
|
+
const createCache = cacheModule.default;
|
|
92
|
+
const referenceCache = createCache({
|
|
93
|
+
prefix: CACHE_PREFIX
|
|
94
|
+
});
|
|
95
|
+
const reference = referenceCache.get(FLAGS_REFERENCE_KEY);
|
|
96
|
+
if (reference) {
|
|
97
|
+
// Cache without prefix as the reference is already prefixed.
|
|
98
|
+
const flagsCache = createCache({
|
|
99
|
+
prefix: ''
|
|
100
|
+
});
|
|
101
|
+
return flagsCache.get(reference);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
44
105
|
var _adapterState = /*#__PURE__*/_classPrivateFieldLooseKey("adapterState");
|
|
45
106
|
var _updateFlagsInAdapterState = /*#__PURE__*/_classPrivateFieldLooseKey("updateFlagsInAdapterState");
|
|
46
107
|
var _getIsAdapterUnsubscribed = /*#__PURE__*/_classPrivateFieldLooseKey("getIsAdapterUnsubscribed");
|
|
47
108
|
var _getIsFlagUnsubcribed = /*#__PURE__*/_classPrivateFieldLooseKey("getIsFlagUnsubcribed");
|
|
48
109
|
var _getIsFlagLocked = /*#__PURE__*/_classPrivateFieldLooseKey("getIsFlagLocked");
|
|
49
110
|
var _withoutUnsubscribedOrLockedFlags = /*#__PURE__*/_classPrivateFieldLooseKey("withoutUnsubscribedOrLockedFlags");
|
|
50
|
-
var _getCache = /*#__PURE__*/_classPrivateFieldLooseKey("getCache");
|
|
51
111
|
var _getIsAnonymousContext = /*#__PURE__*/_classPrivateFieldLooseKey("getIsAnonymousContext");
|
|
52
112
|
var _ensureContext = /*#__PURE__*/_classPrivateFieldLooseKey("ensureContext");
|
|
53
113
|
var _initializeClient = /*#__PURE__*/_classPrivateFieldLooseKey("initializeClient");
|
|
@@ -104,40 +164,6 @@ class LaunchDarklyAdapter {
|
|
|
104
164
|
return !_classPrivateFieldLooseBase(this, _getIsFlagUnsubcribed)[_getIsFlagUnsubcribed](flagName) && !_classPrivateFieldLooseBase(this, _getIsFlagLocked)[_getIsFlagLocked](flagName);
|
|
105
165
|
}))
|
|
106
166
|
});
|
|
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
167
|
Object.defineProperty(this, _getIsAnonymousContext, {
|
|
142
168
|
writable: true,
|
|
143
169
|
value: context => !(context !== null && context !== void 0 && context.key)
|
|
@@ -190,7 +216,7 @@ class LaunchDarklyAdapter {
|
|
|
190
216
|
const normalizedFlags = adapterUtilities.normalizeFlags(flagsFromSdk);
|
|
191
217
|
if (cacheIdentifier) {
|
|
192
218
|
var _classPrivateFieldLoo2;
|
|
193
|
-
const cache = await
|
|
219
|
+
const cache = await getCache(cacheIdentifier, (_classPrivateFieldLoo2 = _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context) === null || _classPrivateFieldLoo2 === void 0 ? void 0 : _classPrivateFieldLoo2.key);
|
|
194
220
|
cache.set(normalizedFlags);
|
|
195
221
|
}
|
|
196
222
|
const flags = _classPrivateFieldLooseBase(this, _withoutUnsubscribedOrLockedFlags)[_withoutUnsubscribedOrLockedFlags](normalizedFlags);
|
|
@@ -241,7 +267,6 @@ class LaunchDarklyAdapter {
|
|
|
241
267
|
const updatedFlags = {
|
|
242
268
|
[normalizedFlagName]: normalizedFlagValue
|
|
243
269
|
};
|
|
244
|
-
|
|
245
270
|
// NOTE: Adapter state needs to be updated outside of debounced-fn
|
|
246
271
|
// so that no flag updates are lost.
|
|
247
272
|
_classPrivateFieldLooseBase(this, _updateFlagsInAdapterState)[_updateFlagsInAdapterState](updatedFlags);
|
|
@@ -324,7 +349,7 @@ class LaunchDarklyAdapter {
|
|
|
324
349
|
let cachedFlags;
|
|
325
350
|
_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context = _classPrivateFieldLooseBase(this, _ensureContext)[_ensureContext](context);
|
|
326
351
|
if (adapterArgs.cacheIdentifier) {
|
|
327
|
-
const cache = await
|
|
352
|
+
const cache = await getCache(adapterArgs.cacheIdentifier, context.key);
|
|
328
353
|
cachedFlags = cache.get();
|
|
329
354
|
if (cachedFlags) {
|
|
330
355
|
_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].flags = cachedFlags;
|
|
@@ -356,7 +381,7 @@ class LaunchDarklyAdapter {
|
|
|
356
381
|
if (!isEqual__default["default"](_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context, nextContext)) {
|
|
357
382
|
if (adapterArgs.cacheIdentifier) {
|
|
358
383
|
var _classPrivateFieldLoo3;
|
|
359
|
-
const cache = await
|
|
384
|
+
const cache = await getCache(adapterArgs.cacheIdentifier, (_classPrivateFieldLoo3 = _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context) === null || _classPrivateFieldLoo3 === void 0 ? void 0 : _classPrivateFieldLoo3.key);
|
|
360
385
|
cache.unset();
|
|
361
386
|
}
|
|
362
387
|
_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context = nextContext;
|
|
@@ -394,7 +419,8 @@ class LaunchDarklyAdapter {
|
|
|
394
419
|
const adapter = new LaunchDarklyAdapter();
|
|
395
420
|
adapterUtilities.exposeGlobally(adapter);
|
|
396
421
|
|
|
397
|
-
const version = "13.
|
|
422
|
+
const version = "13.3.0";
|
|
398
423
|
|
|
399
424
|
exports["default"] = adapter;
|
|
425
|
+
exports.getCachedFlags = getCachedFlags;
|
|
400
426
|
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,74 @@ 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
|
+
async function getCachedFlags(cacheIdentifier) {
|
|
61
|
+
const cacheModule = await importCache(cacheIdentifier);
|
|
62
|
+
const createCache = cacheModule.default;
|
|
63
|
+
const referenceCache = createCache({
|
|
64
|
+
prefix: CACHE_PREFIX
|
|
65
|
+
});
|
|
66
|
+
const reference = referenceCache.get(FLAGS_REFERENCE_KEY);
|
|
67
|
+
if (reference) {
|
|
68
|
+
// Cache without prefix as the reference is already prefixed.
|
|
69
|
+
const flagsCache = createCache({
|
|
70
|
+
prefix: ''
|
|
71
|
+
});
|
|
72
|
+
return flagsCache.get(reference);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
15
76
|
var _adapterState = /*#__PURE__*/_classPrivateFieldLooseKey("adapterState");
|
|
16
77
|
var _updateFlagsInAdapterState = /*#__PURE__*/_classPrivateFieldLooseKey("updateFlagsInAdapterState");
|
|
17
78
|
var _getIsAdapterUnsubscribed = /*#__PURE__*/_classPrivateFieldLooseKey("getIsAdapterUnsubscribed");
|
|
18
79
|
var _getIsFlagUnsubcribed = /*#__PURE__*/_classPrivateFieldLooseKey("getIsFlagUnsubcribed");
|
|
19
80
|
var _getIsFlagLocked = /*#__PURE__*/_classPrivateFieldLooseKey("getIsFlagLocked");
|
|
20
81
|
var _withoutUnsubscribedOrLockedFlags = /*#__PURE__*/_classPrivateFieldLooseKey("withoutUnsubscribedOrLockedFlags");
|
|
21
|
-
var _getCache = /*#__PURE__*/_classPrivateFieldLooseKey("getCache");
|
|
22
82
|
var _getIsAnonymousContext = /*#__PURE__*/_classPrivateFieldLooseKey("getIsAnonymousContext");
|
|
23
83
|
var _ensureContext = /*#__PURE__*/_classPrivateFieldLooseKey("ensureContext");
|
|
24
84
|
var _initializeClient = /*#__PURE__*/_classPrivateFieldLooseKey("initializeClient");
|
|
@@ -75,40 +135,6 @@ class LaunchDarklyAdapter {
|
|
|
75
135
|
return !_classPrivateFieldLooseBase(this, _getIsFlagUnsubcribed)[_getIsFlagUnsubcribed](flagName) && !_classPrivateFieldLooseBase(this, _getIsFlagLocked)[_getIsFlagLocked](flagName);
|
|
76
136
|
}))
|
|
77
137
|
});
|
|
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
138
|
Object.defineProperty(this, _getIsAnonymousContext, {
|
|
113
139
|
writable: true,
|
|
114
140
|
value: context => !(context !== null && context !== void 0 && context.key)
|
|
@@ -161,7 +187,7 @@ class LaunchDarklyAdapter {
|
|
|
161
187
|
const normalizedFlags = normalizeFlags(flagsFromSdk);
|
|
162
188
|
if (cacheIdentifier) {
|
|
163
189
|
var _classPrivateFieldLoo2;
|
|
164
|
-
const cache = await
|
|
190
|
+
const cache = await getCache(cacheIdentifier, (_classPrivateFieldLoo2 = _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context) === null || _classPrivateFieldLoo2 === void 0 ? void 0 : _classPrivateFieldLoo2.key);
|
|
165
191
|
cache.set(normalizedFlags);
|
|
166
192
|
}
|
|
167
193
|
const flags = _classPrivateFieldLooseBase(this, _withoutUnsubscribedOrLockedFlags)[_withoutUnsubscribedOrLockedFlags](normalizedFlags);
|
|
@@ -212,7 +238,6 @@ class LaunchDarklyAdapter {
|
|
|
212
238
|
const updatedFlags = {
|
|
213
239
|
[normalizedFlagName]: normalizedFlagValue
|
|
214
240
|
};
|
|
215
|
-
|
|
216
241
|
// NOTE: Adapter state needs to be updated outside of debounced-fn
|
|
217
242
|
// so that no flag updates are lost.
|
|
218
243
|
_classPrivateFieldLooseBase(this, _updateFlagsInAdapterState)[_updateFlagsInAdapterState](updatedFlags);
|
|
@@ -295,7 +320,7 @@ class LaunchDarklyAdapter {
|
|
|
295
320
|
let cachedFlags;
|
|
296
321
|
_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context = _classPrivateFieldLooseBase(this, _ensureContext)[_ensureContext](context);
|
|
297
322
|
if (adapterArgs.cacheIdentifier) {
|
|
298
|
-
const cache = await
|
|
323
|
+
const cache = await getCache(adapterArgs.cacheIdentifier, context.key);
|
|
299
324
|
cachedFlags = cache.get();
|
|
300
325
|
if (cachedFlags) {
|
|
301
326
|
_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].flags = cachedFlags;
|
|
@@ -327,7 +352,7 @@ class LaunchDarklyAdapter {
|
|
|
327
352
|
if (!isEqual(_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context, nextContext)) {
|
|
328
353
|
if (adapterArgs.cacheIdentifier) {
|
|
329
354
|
var _classPrivateFieldLoo3;
|
|
330
|
-
const cache = await
|
|
355
|
+
const cache = await getCache(adapterArgs.cacheIdentifier, (_classPrivateFieldLoo3 = _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context) === null || _classPrivateFieldLoo3 === void 0 ? void 0 : _classPrivateFieldLoo3.key);
|
|
331
356
|
cache.unset();
|
|
332
357
|
}
|
|
333
358
|
_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context = nextContext;
|
|
@@ -365,6 +390,6 @@ class LaunchDarklyAdapter {
|
|
|
365
390
|
const adapter = new LaunchDarklyAdapter();
|
|
366
391
|
exposeGlobally(adapter);
|
|
367
392
|
|
|
368
|
-
const version = "13.
|
|
393
|
+
const version = "13.3.0";
|
|
369
394
|
|
|
370
|
-
export { adapter as default, version };
|
|
395
|
+
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.0",
|
|
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.0",
|
|
31
|
+
"@flopflip/localstorage-cache": "13.3.0",
|
|
32
|
+
"@flopflip/sessionstorage-cache": "13.3.0",
|
|
33
|
+
"@flopflip/types": "13.3.0",
|
|
34
34
|
"debounce-fn": "4.0.0",
|
|
35
35
|
"launchdarkly-js-client-sdk": "3.1.4",
|
|
36
36
|
"lodash": "4.17.21",
|