@flopflip/launchdarkly-adapter 13.5.2 → 14.0.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.
@@ -1,2 +1 @@
1
1
  export { default } from "./adapter.js";
2
- export { getCachedFlags } from "./cache.js";
@@ -1,3 +1,3 @@
1
1
  declare const version = "__@FLOPFLIP/VERSION_OF_RELEASE__";
2
2
  export { version };
3
- export { default, getCachedFlags } from "./adapter/index.js";
3
+ export { default } from "./adapter/index.js";
@@ -7,6 +7,7 @@ var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
7
7
  var _classPrivateFieldLooseBase = require('@babel/runtime/helpers/classPrivateFieldLooseBase');
8
8
  var _classPrivateFieldLooseKey = require('@babel/runtime/helpers/classPrivateFieldLooseKey');
9
9
  var adapterUtilities = require('@flopflip/adapter-utilities');
10
+ var cache = require('@flopflip/cache');
10
11
  var types = require('@flopflip/types');
11
12
  var debounce = require('debounce-fn');
12
13
  var launchdarklyJsClientSdk = require('launchdarkly-js-client-sdk');
@@ -17,91 +18,11 @@ var tsDeepmerge = require('ts-deepmerge');
17
18
 
18
19
  function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }
19
20
 
20
- function _interopNamespace(e) {
21
- if (e && e.__esModule) return e;
22
- var n = Object.create(null);
23
- if (e) {
24
- Object.keys(e).forEach(function (k) {
25
- if (k !== 'default') {
26
- var d = Object.getOwnPropertyDescriptor(e, k);
27
- Object.defineProperty(n, k, d.get ? d : {
28
- enumerable: true,
29
- get: function () { return e[k]; }
30
- });
31
- }
32
- });
33
- }
34
- n["default"] = e;
35
- return Object.freeze(n);
36
- }
37
-
38
21
  var debounce__default = /*#__PURE__*/_interopDefault(debounce);
39
22
  var isEqual__default = /*#__PURE__*/_interopDefault(isEqual);
40
23
  var mitt__default = /*#__PURE__*/_interopDefault(mitt);
41
24
  var warning__default = /*#__PURE__*/_interopDefault(warning);
42
25
 
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 flagReferenceKey = [CACHE_PREFIX, FLAGS_REFERENCE_KEY].join('/');
92
- const referenceToCachedFlags = cacheModule.getItem(flagReferenceKey);
93
- if (referenceToCachedFlags) {
94
- try {
95
- const cacheKey = JSON.parse(referenceToCachedFlags);
96
- const cachedFlags = cacheModule.getItem(cacheKey);
97
- if (cacheKey && cachedFlags) {
98
- return JSON.parse(cachedFlags);
99
- }
100
- } catch (error) {}
101
- }
102
- return {};
103
- }
104
-
105
26
  var _adapterState = /*#__PURE__*/_classPrivateFieldLooseKey("adapterState");
106
27
  var _updateFlagsInAdapterState = /*#__PURE__*/_classPrivateFieldLooseKey("updateFlagsInAdapterState");
107
28
  var _getIsAdapterUnsubscribed = /*#__PURE__*/_classPrivateFieldLooseKey("getIsAdapterUnsubscribed");
@@ -197,9 +118,10 @@ class LaunchDarklyAdapter {
197
118
  value: async (flagsToCache, cacheIdentifier) => {
198
119
  if (cacheIdentifier) {
199
120
  var _classPrivateFieldLoo2;
200
- const cache = await getCache(cacheIdentifier, (_classPrivateFieldLoo2 = _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context) === null || _classPrivateFieldLoo2 === void 0 ? void 0 : _classPrivateFieldLoo2.key);
201
- const cachedFlags = cache.get();
202
- cache.set(_objectSpread(_objectSpread({}, cachedFlags), flagsToCache));
121
+ const cache$1 = await cache.getCache(cacheIdentifier, types.adapterIdentifiers.launchdarkly, // NOTE: LDContextCommon is part of the type which we never use.
122
+ (_classPrivateFieldLoo2 = _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context) === null || _classPrivateFieldLoo2 === void 0 ? void 0 : _classPrivateFieldLoo2.key);
123
+ const cachedFlags = cache$1.get();
124
+ cache$1.set(_objectSpread(_objectSpread({}, cachedFlags), flagsToCache));
203
125
  }
204
126
  }
205
127
  });
@@ -208,7 +130,8 @@ class LaunchDarklyAdapter {
208
130
  value: async _ref5 => {
209
131
  let flags = _ref5.flags,
210
132
  throwOnInitializationFailure = _ref5.throwOnInitializationFailure,
211
- cacheIdentifier = _ref5.cacheIdentifier;
133
+ cacheIdentifier = _ref5.cacheIdentifier,
134
+ cacheMode = _ref5.cacheMode;
212
135
  if (_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].client) {
213
136
  return _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].client.waitForInitialization().then(async () => {
214
137
  let flagsFromSdk;
@@ -228,7 +151,10 @@ class LaunchDarklyAdapter {
228
151
  const normalizedFlags = adapterUtilities.normalizeFlags(flagsFromSdk);
229
152
  await _classPrivateFieldLooseBase(this, _maybeUpdateFlagsInCache)[_maybeUpdateFlagsInCache](normalizedFlags, cacheIdentifier);
230
153
  const flags = _classPrivateFieldLooseBase(this, _withoutUnsubscribedOrLockedFlags)[_withoutUnsubscribedOrLockedFlags](normalizedFlags);
231
- this.updateFlags(flags);
154
+ _classPrivateFieldLooseBase(this, _updateFlagsInAdapterState)[_updateFlagsInAdapterState](flags);
155
+ if (cacheMode !== types.cacheModes.lazy) {
156
+ _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].emitter.emit('flagsStateChange', _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].flags);
157
+ }
232
158
  }
233
159
  this.setConfigurationStatus(types.AdapterConfigurationStatus.Configured);
234
160
  return Promise.resolve({
@@ -260,7 +186,8 @@ class LaunchDarklyAdapter {
260
186
  value: _ref8 => {
261
187
  let flagsFromSdk = _ref8.flagsFromSdk,
262
188
  flagsUpdateDelayMs = _ref8.flagsUpdateDelayMs,
263
- cacheIdentifier = _ref8.cacheIdentifier;
189
+ cacheIdentifier = _ref8.cacheIdentifier,
190
+ cacheMode = _ref8.cacheMode;
264
191
  for (const flagName in flagsFromSdk) {
265
192
  // Dispatch whenever a configured flag value changes
266
193
  if (Object.hasOwn(flagsFromSdk, flagName) && _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].client) {
@@ -283,6 +210,9 @@ class LaunchDarklyAdapter {
283
210
  // so that no flag updates are lost.
284
211
  _classPrivateFieldLooseBase(this, _updateFlagsInAdapterState)[_updateFlagsInAdapterState](updatedFlags);
285
212
  const flushFlagsUpdate = () => {
213
+ if (cacheMode === types.cacheModes.lazy) {
214
+ return;
215
+ }
286
216
  _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].emitter.emit('flagsStateChange', _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].flags);
287
217
  };
288
218
  const scheduleImmediately = {
@@ -353,20 +283,16 @@ class LaunchDarklyAdapter {
353
283
  const sdk = adapterArgs.sdk,
354
284
  context = adapterArgs.context,
355
285
  flags = adapterArgs.flags,
356
- _adapterArgs$subscrib = adapterArgs.subscribeToFlagChanges,
357
- subscribeToFlagChanges = _adapterArgs$subscrib === void 0 ? true : _adapterArgs$subscrib,
358
286
  _adapterArgs$throwOnI = adapterArgs.throwOnInitializationFailure,
359
287
  throwOnInitializationFailure = _adapterArgs$throwOnI === void 0 ? false : _adapterArgs$throwOnI,
360
288
  flagsUpdateDelayMs = adapterArgs.flagsUpdateDelayMs;
361
289
  let cachedFlags;
362
290
  _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context = _classPrivateFieldLooseBase(this, _ensureContext)[_ensureContext](context);
363
291
  if (adapterArgs.cacheIdentifier) {
364
- const cache = await getCache(adapterArgs.cacheIdentifier, context.key);
365
- cachedFlags = cache.get();
292
+ const cache$1 = await cache.getCache(adapterArgs.cacheIdentifier, types.adapterIdentifiers.launchdarkly, context.key);
293
+ cachedFlags = cache$1.get();
366
294
  if (cachedFlags) {
367
- _classPrivateFieldLooseBase(this, _updateFlagsInAdapterState)[_updateFlagsInAdapterState](cachedFlags, {
368
- unsubscribeFlags: adapterArgs.unsubscribeFromCachedFlags
369
- });
295
+ _classPrivateFieldLooseBase(this, _updateFlagsInAdapterState)[_updateFlagsInAdapterState](cachedFlags);
370
296
  _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].flags = cachedFlags;
371
297
  _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].emitter.emit('flagsStateChange', cachedFlags);
372
298
  }
@@ -375,15 +301,17 @@ class LaunchDarklyAdapter {
375
301
  return _classPrivateFieldLooseBase(this, _getInitialFlags)[_getInitialFlags]({
376
302
  flags,
377
303
  throwOnInitializationFailure,
378
- cacheIdentifier: adapterArgs.cacheIdentifier
304
+ cacheIdentifier: adapterArgs.cacheIdentifier,
305
+ cacheMode: adapterArgs.cacheMode
379
306
  }).then(_ref9 => {
380
307
  let flagsFromSdk = _ref9.flagsFromSdk,
381
308
  initializationStatus = _ref9.initializationStatus;
382
- if (subscribeToFlagChanges && flagsFromSdk) {
309
+ if (flagsFromSdk) {
383
310
  _classPrivateFieldLooseBase(this, _setupFlagSubcription)[_setupFlagSubcription]({
384
311
  flagsFromSdk,
385
312
  flagsUpdateDelayMs,
386
- cacheIdentifier: adapterArgs.cacheIdentifier
313
+ cacheIdentifier: adapterArgs.cacheIdentifier,
314
+ cacheMode: adapterArgs.cacheMode
387
315
  });
388
316
  }
389
317
  return {
@@ -397,8 +325,8 @@ class LaunchDarklyAdapter {
397
325
  if (!isEqual__default["default"](_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context, nextContext)) {
398
326
  if (adapterArgs.cacheIdentifier) {
399
327
  var _classPrivateFieldLoo3;
400
- const cache = await getCache(adapterArgs.cacheIdentifier, (_classPrivateFieldLoo3 = _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context) === null || _classPrivateFieldLoo3 === void 0 ? void 0 : _classPrivateFieldLoo3.key);
401
- cache.unset();
328
+ const cache$1 = await cache.getCache(adapterArgs.cacheIdentifier, types.adapterIdentifiers.launchdarkly, (_classPrivateFieldLoo3 = _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context) === null || _classPrivateFieldLoo3 === void 0 ? void 0 : _classPrivateFieldLoo3.key);
329
+ cache$1.unset();
402
330
  }
403
331
  _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context = nextContext;
404
332
  await _classPrivateFieldLooseBase(this, _changeClientContext)[_changeClientContext](_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context);
@@ -435,8 +363,7 @@ class LaunchDarklyAdapter {
435
363
  const adapter = new LaunchDarklyAdapter();
436
364
  adapterUtilities.exposeGlobally(adapter);
437
365
 
438
- const version = "13.5.2";
366
+ const version = "14.0.0";
439
367
 
440
368
  exports["default"] = adapter;
441
- exports.getCachedFlags = getCachedFlags;
442
369
  exports.version = version;
@@ -7,6 +7,7 @@ var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
7
7
  var _classPrivateFieldLooseBase = require('@babel/runtime/helpers/classPrivateFieldLooseBase');
8
8
  var _classPrivateFieldLooseKey = require('@babel/runtime/helpers/classPrivateFieldLooseKey');
9
9
  var adapterUtilities = require('@flopflip/adapter-utilities');
10
+ var cache = require('@flopflip/cache');
10
11
  var types = require('@flopflip/types');
11
12
  var debounce = require('debounce-fn');
12
13
  var launchdarklyJsClientSdk = require('launchdarkly-js-client-sdk');
@@ -17,91 +18,11 @@ var tsDeepmerge = require('ts-deepmerge');
17
18
 
18
19
  function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }
19
20
 
20
- function _interopNamespace(e) {
21
- if (e && e.__esModule) return e;
22
- var n = Object.create(null);
23
- if (e) {
24
- Object.keys(e).forEach(function (k) {
25
- if (k !== 'default') {
26
- var d = Object.getOwnPropertyDescriptor(e, k);
27
- Object.defineProperty(n, k, d.get ? d : {
28
- enumerable: true,
29
- get: function () { return e[k]; }
30
- });
31
- }
32
- });
33
- }
34
- n["default"] = e;
35
- return Object.freeze(n);
36
- }
37
-
38
21
  var debounce__default = /*#__PURE__*/_interopDefault(debounce);
39
22
  var isEqual__default = /*#__PURE__*/_interopDefault(isEqual);
40
23
  var mitt__default = /*#__PURE__*/_interopDefault(mitt);
41
24
  var warning__default = /*#__PURE__*/_interopDefault(warning);
42
25
 
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 flagReferenceKey = [CACHE_PREFIX, FLAGS_REFERENCE_KEY].join('/');
92
- const referenceToCachedFlags = cacheModule.getItem(flagReferenceKey);
93
- if (referenceToCachedFlags) {
94
- try {
95
- const cacheKey = JSON.parse(referenceToCachedFlags);
96
- const cachedFlags = cacheModule.getItem(cacheKey);
97
- if (cacheKey && cachedFlags) {
98
- return JSON.parse(cachedFlags);
99
- }
100
- } catch (error) {}
101
- }
102
- return {};
103
- }
104
-
105
26
  var _adapterState = /*#__PURE__*/_classPrivateFieldLooseKey("adapterState");
106
27
  var _updateFlagsInAdapterState = /*#__PURE__*/_classPrivateFieldLooseKey("updateFlagsInAdapterState");
107
28
  var _getIsAdapterUnsubscribed = /*#__PURE__*/_classPrivateFieldLooseKey("getIsAdapterUnsubscribed");
@@ -197,9 +118,10 @@ class LaunchDarklyAdapter {
197
118
  value: async (flagsToCache, cacheIdentifier) => {
198
119
  if (cacheIdentifier) {
199
120
  var _classPrivateFieldLoo2;
200
- const cache = await getCache(cacheIdentifier, (_classPrivateFieldLoo2 = _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context) === null || _classPrivateFieldLoo2 === void 0 ? void 0 : _classPrivateFieldLoo2.key);
201
- const cachedFlags = cache.get();
202
- cache.set(_objectSpread(_objectSpread({}, cachedFlags), flagsToCache));
121
+ const cache$1 = await cache.getCache(cacheIdentifier, types.adapterIdentifiers.launchdarkly, // NOTE: LDContextCommon is part of the type which we never use.
122
+ (_classPrivateFieldLoo2 = _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context) === null || _classPrivateFieldLoo2 === void 0 ? void 0 : _classPrivateFieldLoo2.key);
123
+ const cachedFlags = cache$1.get();
124
+ cache$1.set(_objectSpread(_objectSpread({}, cachedFlags), flagsToCache));
203
125
  }
204
126
  }
205
127
  });
@@ -208,7 +130,8 @@ class LaunchDarklyAdapter {
208
130
  value: async _ref5 => {
209
131
  let flags = _ref5.flags,
210
132
  throwOnInitializationFailure = _ref5.throwOnInitializationFailure,
211
- cacheIdentifier = _ref5.cacheIdentifier;
133
+ cacheIdentifier = _ref5.cacheIdentifier,
134
+ cacheMode = _ref5.cacheMode;
212
135
  if (_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].client) {
213
136
  return _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].client.waitForInitialization().then(async () => {
214
137
  let flagsFromSdk;
@@ -228,7 +151,10 @@ class LaunchDarklyAdapter {
228
151
  const normalizedFlags = adapterUtilities.normalizeFlags(flagsFromSdk);
229
152
  await _classPrivateFieldLooseBase(this, _maybeUpdateFlagsInCache)[_maybeUpdateFlagsInCache](normalizedFlags, cacheIdentifier);
230
153
  const flags = _classPrivateFieldLooseBase(this, _withoutUnsubscribedOrLockedFlags)[_withoutUnsubscribedOrLockedFlags](normalizedFlags);
231
- this.updateFlags(flags);
154
+ _classPrivateFieldLooseBase(this, _updateFlagsInAdapterState)[_updateFlagsInAdapterState](flags);
155
+ if (cacheMode !== types.cacheModes.lazy) {
156
+ _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].emitter.emit('flagsStateChange', _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].flags);
157
+ }
232
158
  }
233
159
  this.setConfigurationStatus(types.AdapterConfigurationStatus.Configured);
234
160
  return Promise.resolve({
@@ -260,7 +186,8 @@ class LaunchDarklyAdapter {
260
186
  value: _ref8 => {
261
187
  let flagsFromSdk = _ref8.flagsFromSdk,
262
188
  flagsUpdateDelayMs = _ref8.flagsUpdateDelayMs,
263
- cacheIdentifier = _ref8.cacheIdentifier;
189
+ cacheIdentifier = _ref8.cacheIdentifier,
190
+ cacheMode = _ref8.cacheMode;
264
191
  for (const flagName in flagsFromSdk) {
265
192
  // Dispatch whenever a configured flag value changes
266
193
  if (Object.hasOwn(flagsFromSdk, flagName) && _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].client) {
@@ -283,6 +210,9 @@ class LaunchDarklyAdapter {
283
210
  // so that no flag updates are lost.
284
211
  _classPrivateFieldLooseBase(this, _updateFlagsInAdapterState)[_updateFlagsInAdapterState](updatedFlags);
285
212
  const flushFlagsUpdate = () => {
213
+ if (cacheMode === types.cacheModes.lazy) {
214
+ return;
215
+ }
286
216
  _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].emitter.emit('flagsStateChange', _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].flags);
287
217
  };
288
218
  const scheduleImmediately = {
@@ -353,20 +283,16 @@ class LaunchDarklyAdapter {
353
283
  const sdk = adapterArgs.sdk,
354
284
  context = adapterArgs.context,
355
285
  flags = adapterArgs.flags,
356
- _adapterArgs$subscrib = adapterArgs.subscribeToFlagChanges,
357
- subscribeToFlagChanges = _adapterArgs$subscrib === void 0 ? true : _adapterArgs$subscrib,
358
286
  _adapterArgs$throwOnI = adapterArgs.throwOnInitializationFailure,
359
287
  throwOnInitializationFailure = _adapterArgs$throwOnI === void 0 ? false : _adapterArgs$throwOnI,
360
288
  flagsUpdateDelayMs = adapterArgs.flagsUpdateDelayMs;
361
289
  let cachedFlags;
362
290
  _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context = _classPrivateFieldLooseBase(this, _ensureContext)[_ensureContext](context);
363
291
  if (adapterArgs.cacheIdentifier) {
364
- const cache = await getCache(adapterArgs.cacheIdentifier, context.key);
365
- cachedFlags = cache.get();
292
+ const cache$1 = await cache.getCache(adapterArgs.cacheIdentifier, types.adapterIdentifiers.launchdarkly, context.key);
293
+ cachedFlags = cache$1.get();
366
294
  if (cachedFlags) {
367
- _classPrivateFieldLooseBase(this, _updateFlagsInAdapterState)[_updateFlagsInAdapterState](cachedFlags, {
368
- unsubscribeFlags: adapterArgs.unsubscribeFromCachedFlags
369
- });
295
+ _classPrivateFieldLooseBase(this, _updateFlagsInAdapterState)[_updateFlagsInAdapterState](cachedFlags);
370
296
  _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].flags = cachedFlags;
371
297
  _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].emitter.emit('flagsStateChange', cachedFlags);
372
298
  }
@@ -375,15 +301,17 @@ class LaunchDarklyAdapter {
375
301
  return _classPrivateFieldLooseBase(this, _getInitialFlags)[_getInitialFlags]({
376
302
  flags,
377
303
  throwOnInitializationFailure,
378
- cacheIdentifier: adapterArgs.cacheIdentifier
304
+ cacheIdentifier: adapterArgs.cacheIdentifier,
305
+ cacheMode: adapterArgs.cacheMode
379
306
  }).then(_ref9 => {
380
307
  let flagsFromSdk = _ref9.flagsFromSdk,
381
308
  initializationStatus = _ref9.initializationStatus;
382
- if (subscribeToFlagChanges && flagsFromSdk) {
309
+ if (flagsFromSdk) {
383
310
  _classPrivateFieldLooseBase(this, _setupFlagSubcription)[_setupFlagSubcription]({
384
311
  flagsFromSdk,
385
312
  flagsUpdateDelayMs,
386
- cacheIdentifier: adapterArgs.cacheIdentifier
313
+ cacheIdentifier: adapterArgs.cacheIdentifier,
314
+ cacheMode: adapterArgs.cacheMode
387
315
  });
388
316
  }
389
317
  return {
@@ -397,8 +325,8 @@ class LaunchDarklyAdapter {
397
325
  if (!isEqual__default["default"](_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context, nextContext)) {
398
326
  if (adapterArgs.cacheIdentifier) {
399
327
  var _classPrivateFieldLoo3;
400
- const cache = await getCache(adapterArgs.cacheIdentifier, (_classPrivateFieldLoo3 = _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context) === null || _classPrivateFieldLoo3 === void 0 ? void 0 : _classPrivateFieldLoo3.key);
401
- cache.unset();
328
+ const cache$1 = await cache.getCache(adapterArgs.cacheIdentifier, types.adapterIdentifiers.launchdarkly, (_classPrivateFieldLoo3 = _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context) === null || _classPrivateFieldLoo3 === void 0 ? void 0 : _classPrivateFieldLoo3.key);
329
+ cache$1.unset();
402
330
  }
403
331
  _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context = nextContext;
404
332
  await _classPrivateFieldLooseBase(this, _changeClientContext)[_changeClientContext](_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context);
@@ -435,8 +363,7 @@ class LaunchDarklyAdapter {
435
363
  const adapter = new LaunchDarklyAdapter();
436
364
  adapterUtilities.exposeGlobally(adapter);
437
365
 
438
- const version = "13.5.2";
366
+ const version = "14.0.0";
439
367
 
440
368
  exports["default"] = adapter;
441
- exports.getCachedFlags = getCachedFlags;
442
369
  exports.version = version;
@@ -3,7 +3,8 @@ 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 { cacheIdentifiers, AdapterSubscriptionStatus, AdapterConfigurationStatus, AdapterInitializationStatus, adapterIdentifiers } from '@flopflip/types';
6
+ import { getCache } from '@flopflip/cache';
7
+ import { AdapterSubscriptionStatus, adapterIdentifiers, cacheModes, AdapterConfigurationStatus, AdapterInitializationStatus } from '@flopflip/types';
7
8
  import debounce from 'debounce-fn';
8
9
  import { initialize } from 'launchdarkly-js-client-sdk';
9
10
  import isEqual from 'lodash/isEqual';
@@ -11,68 +12,6 @@ import mitt from 'mitt';
11
12
  import warning from 'tiny-warning';
12
13
  import { merge } from 'ts-deepmerge';
13
14
 
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 flagReferenceKey = [CACHE_PREFIX, FLAGS_REFERENCE_KEY].join('/');
63
- const referenceToCachedFlags = cacheModule.getItem(flagReferenceKey);
64
- if (referenceToCachedFlags) {
65
- try {
66
- const cacheKey = JSON.parse(referenceToCachedFlags);
67
- const cachedFlags = cacheModule.getItem(cacheKey);
68
- if (cacheKey && cachedFlags) {
69
- return JSON.parse(cachedFlags);
70
- }
71
- } catch (error) {}
72
- }
73
- return {};
74
- }
75
-
76
15
  var _adapterState = /*#__PURE__*/_classPrivateFieldLooseKey("adapterState");
77
16
  var _updateFlagsInAdapterState = /*#__PURE__*/_classPrivateFieldLooseKey("updateFlagsInAdapterState");
78
17
  var _getIsAdapterUnsubscribed = /*#__PURE__*/_classPrivateFieldLooseKey("getIsAdapterUnsubscribed");
@@ -168,7 +107,8 @@ class LaunchDarklyAdapter {
168
107
  value: async (flagsToCache, cacheIdentifier) => {
169
108
  if (cacheIdentifier) {
170
109
  var _classPrivateFieldLoo2;
171
- const cache = await getCache(cacheIdentifier, (_classPrivateFieldLoo2 = _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context) === null || _classPrivateFieldLoo2 === void 0 ? void 0 : _classPrivateFieldLoo2.key);
110
+ const cache = await getCache(cacheIdentifier, adapterIdentifiers.launchdarkly, // NOTE: LDContextCommon is part of the type which we never use.
111
+ (_classPrivateFieldLoo2 = _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context) === null || _classPrivateFieldLoo2 === void 0 ? void 0 : _classPrivateFieldLoo2.key);
172
112
  const cachedFlags = cache.get();
173
113
  cache.set(_objectSpread(_objectSpread({}, cachedFlags), flagsToCache));
174
114
  }
@@ -179,7 +119,8 @@ class LaunchDarklyAdapter {
179
119
  value: async _ref5 => {
180
120
  let flags = _ref5.flags,
181
121
  throwOnInitializationFailure = _ref5.throwOnInitializationFailure,
182
- cacheIdentifier = _ref5.cacheIdentifier;
122
+ cacheIdentifier = _ref5.cacheIdentifier,
123
+ cacheMode = _ref5.cacheMode;
183
124
  if (_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].client) {
184
125
  return _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].client.waitForInitialization().then(async () => {
185
126
  let flagsFromSdk;
@@ -199,7 +140,10 @@ class LaunchDarklyAdapter {
199
140
  const normalizedFlags = normalizeFlags(flagsFromSdk);
200
141
  await _classPrivateFieldLooseBase(this, _maybeUpdateFlagsInCache)[_maybeUpdateFlagsInCache](normalizedFlags, cacheIdentifier);
201
142
  const flags = _classPrivateFieldLooseBase(this, _withoutUnsubscribedOrLockedFlags)[_withoutUnsubscribedOrLockedFlags](normalizedFlags);
202
- this.updateFlags(flags);
143
+ _classPrivateFieldLooseBase(this, _updateFlagsInAdapterState)[_updateFlagsInAdapterState](flags);
144
+ if (cacheMode !== cacheModes.lazy) {
145
+ _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].emitter.emit('flagsStateChange', _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].flags);
146
+ }
203
147
  }
204
148
  this.setConfigurationStatus(AdapterConfigurationStatus.Configured);
205
149
  return Promise.resolve({
@@ -231,7 +175,8 @@ class LaunchDarklyAdapter {
231
175
  value: _ref8 => {
232
176
  let flagsFromSdk = _ref8.flagsFromSdk,
233
177
  flagsUpdateDelayMs = _ref8.flagsUpdateDelayMs,
234
- cacheIdentifier = _ref8.cacheIdentifier;
178
+ cacheIdentifier = _ref8.cacheIdentifier,
179
+ cacheMode = _ref8.cacheMode;
235
180
  for (const flagName in flagsFromSdk) {
236
181
  // Dispatch whenever a configured flag value changes
237
182
  if (Object.hasOwn(flagsFromSdk, flagName) && _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].client) {
@@ -254,6 +199,9 @@ class LaunchDarklyAdapter {
254
199
  // so that no flag updates are lost.
255
200
  _classPrivateFieldLooseBase(this, _updateFlagsInAdapterState)[_updateFlagsInAdapterState](updatedFlags);
256
201
  const flushFlagsUpdate = () => {
202
+ if (cacheMode === cacheModes.lazy) {
203
+ return;
204
+ }
257
205
  _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].emitter.emit('flagsStateChange', _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].flags);
258
206
  };
259
207
  const scheduleImmediately = {
@@ -324,20 +272,16 @@ class LaunchDarklyAdapter {
324
272
  const sdk = adapterArgs.sdk,
325
273
  context = adapterArgs.context,
326
274
  flags = adapterArgs.flags,
327
- _adapterArgs$subscrib = adapterArgs.subscribeToFlagChanges,
328
- subscribeToFlagChanges = _adapterArgs$subscrib === void 0 ? true : _adapterArgs$subscrib,
329
275
  _adapterArgs$throwOnI = adapterArgs.throwOnInitializationFailure,
330
276
  throwOnInitializationFailure = _adapterArgs$throwOnI === void 0 ? false : _adapterArgs$throwOnI,
331
277
  flagsUpdateDelayMs = adapterArgs.flagsUpdateDelayMs;
332
278
  let cachedFlags;
333
279
  _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context = _classPrivateFieldLooseBase(this, _ensureContext)[_ensureContext](context);
334
280
  if (adapterArgs.cacheIdentifier) {
335
- const cache = await getCache(adapterArgs.cacheIdentifier, context.key);
281
+ const cache = await getCache(adapterArgs.cacheIdentifier, adapterIdentifiers.launchdarkly, context.key);
336
282
  cachedFlags = cache.get();
337
283
  if (cachedFlags) {
338
- _classPrivateFieldLooseBase(this, _updateFlagsInAdapterState)[_updateFlagsInAdapterState](cachedFlags, {
339
- unsubscribeFlags: adapterArgs.unsubscribeFromCachedFlags
340
- });
284
+ _classPrivateFieldLooseBase(this, _updateFlagsInAdapterState)[_updateFlagsInAdapterState](cachedFlags);
341
285
  _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].flags = cachedFlags;
342
286
  _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].emitter.emit('flagsStateChange', cachedFlags);
343
287
  }
@@ -346,15 +290,17 @@ class LaunchDarklyAdapter {
346
290
  return _classPrivateFieldLooseBase(this, _getInitialFlags)[_getInitialFlags]({
347
291
  flags,
348
292
  throwOnInitializationFailure,
349
- cacheIdentifier: adapterArgs.cacheIdentifier
293
+ cacheIdentifier: adapterArgs.cacheIdentifier,
294
+ cacheMode: adapterArgs.cacheMode
350
295
  }).then(_ref9 => {
351
296
  let flagsFromSdk = _ref9.flagsFromSdk,
352
297
  initializationStatus = _ref9.initializationStatus;
353
- if (subscribeToFlagChanges && flagsFromSdk) {
298
+ if (flagsFromSdk) {
354
299
  _classPrivateFieldLooseBase(this, _setupFlagSubcription)[_setupFlagSubcription]({
355
300
  flagsFromSdk,
356
301
  flagsUpdateDelayMs,
357
- cacheIdentifier: adapterArgs.cacheIdentifier
302
+ cacheIdentifier: adapterArgs.cacheIdentifier,
303
+ cacheMode: adapterArgs.cacheMode
358
304
  });
359
305
  }
360
306
  return {
@@ -368,7 +314,7 @@ class LaunchDarklyAdapter {
368
314
  if (!isEqual(_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context, nextContext)) {
369
315
  if (adapterArgs.cacheIdentifier) {
370
316
  var _classPrivateFieldLoo3;
371
- const cache = await getCache(adapterArgs.cacheIdentifier, (_classPrivateFieldLoo3 = _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context) === null || _classPrivateFieldLoo3 === void 0 ? void 0 : _classPrivateFieldLoo3.key);
317
+ const cache = await getCache(adapterArgs.cacheIdentifier, adapterIdentifiers.launchdarkly, (_classPrivateFieldLoo3 = _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context) === null || _classPrivateFieldLoo3 === void 0 ? void 0 : _classPrivateFieldLoo3.key);
372
318
  cache.unset();
373
319
  }
374
320
  _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context = nextContext;
@@ -406,6 +352,6 @@ class LaunchDarklyAdapter {
406
352
  const adapter = new LaunchDarklyAdapter();
407
353
  exposeGlobally(adapter);
408
354
 
409
- const version = "13.5.2";
355
+ const version = "14.0.0";
410
356
 
411
- export { adapter as default, getCachedFlags, version };
357
+ export { adapter as default, version };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flopflip/launchdarkly-adapter",
3
- "version": "13.5.2",
3
+ "version": "14.0.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,11 @@
27
27
  },
28
28
  "dependencies": {
29
29
  "@babel/runtime": "7.24.4",
30
- "@flopflip/adapter-utilities": "13.5.2",
31
- "@flopflip/localstorage-cache": "13.5.2",
32
- "@flopflip/sessionstorage-cache": "13.5.2",
33
- "@flopflip/types": "13.5.2",
30
+ "@flopflip/adapter-utilities": "14.0.0",
31
+ "@flopflip/cache": "14.0.0",
32
+ "@flopflip/localstorage-cache": "14.0.0",
33
+ "@flopflip/sessionstorage-cache": "14.0.0",
34
+ "@flopflip/types": "14.0.0",
34
35
  "debounce-fn": "4.0.0",
35
36
  "launchdarkly-js-client-sdk": "3.2.0",
36
37
  "lodash": "4.17.21",
@@ -1,10 +0,0 @@
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): TFlags;
10
- export { CACHE_PREFIX, getCache, getCachedFlags };