@flopflip/launchdarkly-adapter 13.2.1 → 13.2.3

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.
@@ -17,17 +17,37 @@ var tsDeepmerge = require('ts-deepmerge');
17
17
 
18
18
  function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }
19
19
 
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
+
20
38
  var debounce__default = /*#__PURE__*/_interopDefault(debounce);
21
39
  var isEqual__default = /*#__PURE__*/_interopDefault(isEqual);
22
40
  var mitt__default = /*#__PURE__*/_interopDefault(mitt);
23
41
  var warning__default = /*#__PURE__*/_interopDefault(warning);
24
42
 
43
+ const STORAGE_SLICE = '@flopflip/launchdarkly-adapter';
25
44
  var _adapterState = /*#__PURE__*/_classPrivateFieldLooseKey("adapterState");
26
45
  var _updateFlagsInAdapterState = /*#__PURE__*/_classPrivateFieldLooseKey("updateFlagsInAdapterState");
27
46
  var _getIsAdapterUnsubscribed = /*#__PURE__*/_classPrivateFieldLooseKey("getIsAdapterUnsubscribed");
28
47
  var _getIsFlagUnsubcribed = /*#__PURE__*/_classPrivateFieldLooseKey("getIsFlagUnsubcribed");
29
48
  var _getIsFlagLocked = /*#__PURE__*/_classPrivateFieldLooseKey("getIsFlagLocked");
30
49
  var _withoutUnsubscribedOrLockedFlags = /*#__PURE__*/_classPrivateFieldLooseKey("withoutUnsubscribedOrLockedFlags");
50
+ var _getCache = /*#__PURE__*/_classPrivateFieldLooseKey("getCache");
31
51
  var _getIsAnonymousContext = /*#__PURE__*/_classPrivateFieldLooseKey("getIsAnonymousContext");
32
52
  var _ensureContext = /*#__PURE__*/_classPrivateFieldLooseKey("ensureContext");
33
53
  var _initializeClient = /*#__PURE__*/_classPrivateFieldLooseKey("initializeClient");
@@ -84,6 +104,40 @@ class LaunchDarklyAdapter {
84
104
  return !_classPrivateFieldLooseBase(this, _getIsFlagUnsubcribed)[_getIsFlagUnsubcribed](flagName) && !_classPrivateFieldLooseBase(this, _getIsFlagLocked)[_getIsFlagLocked](flagName);
85
105
  }))
86
106
  });
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
+ });
87
141
  Object.defineProperty(this, _getIsAnonymousContext, {
88
142
  writable: true,
89
143
  value: context => !(context !== null && context !== void 0 && context.key)
@@ -115,7 +169,8 @@ class LaunchDarklyAdapter {
115
169
  writable: true,
116
170
  value: async _ref5 => {
117
171
  let flags = _ref5.flags,
118
- throwOnInitializationFailure = _ref5.throwOnInitializationFailure;
172
+ throwOnInitializationFailure = _ref5.throwOnInitializationFailure,
173
+ cacheIdentifier = _ref5.cacheIdentifier;
119
174
  if (_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].client) {
120
175
  return _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].client.waitForInitialization().then(async () => {
121
176
  let flagsFromSdk;
@@ -133,6 +188,11 @@ class LaunchDarklyAdapter {
133
188
  }
134
189
  if (flagsFromSdk) {
135
190
  const normalizedFlags = adapterUtilities.normalizeFlags(flagsFromSdk);
191
+ if (cacheIdentifier) {
192
+ var _classPrivateFieldLoo2;
193
+ const cache = await _classPrivateFieldLooseBase(this, _getCache)[_getCache](cacheIdentifier, (_classPrivateFieldLoo2 = _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context) === null || _classPrivateFieldLoo2 === void 0 ? void 0 : _classPrivateFieldLoo2.key);
194
+ cache.set(normalizedFlags);
195
+ }
136
196
  const flags = _classPrivateFieldLooseBase(this, _withoutUnsubscribedOrLockedFlags)[_withoutUnsubscribedOrLockedFlags](normalizedFlags);
137
197
  this.updateFlags(flags);
138
198
  }
@@ -261,18 +321,30 @@ class LaunchDarklyAdapter {
261
321
  _adapterArgs$throwOnI = adapterArgs.throwOnInitializationFailure,
262
322
  throwOnInitializationFailure = _adapterArgs$throwOnI === void 0 ? false : _adapterArgs$throwOnI,
263
323
  flagsUpdateDelayMs = adapterArgs.flagsUpdateDelayMs;
324
+ let cachedFlags;
264
325
  _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context = _classPrivateFieldLooseBase(this, _ensureContext)[_ensureContext](context);
326
+ if (adapterArgs.cacheIdentifier) {
327
+ const cache = await _classPrivateFieldLooseBase(this, _getCache)[_getCache](adapterArgs.cacheIdentifier, context.key);
328
+ cachedFlags = cache.get();
329
+ if (cachedFlags) {
330
+ _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].flags = cachedFlags;
331
+ _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].emitter.emit('flagsStateChange', cachedFlags);
332
+ }
333
+ }
265
334
  _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].client = _classPrivateFieldLooseBase(this, _initializeClient)[_initializeClient](sdk.clientSideId, _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context, (_sdk$clientOptions = sdk.clientOptions) !== null && _sdk$clientOptions !== void 0 ? _sdk$clientOptions : {});
266
335
  return _classPrivateFieldLooseBase(this, _getInitialFlags)[_getInitialFlags]({
267
336
  flags,
268
- throwOnInitializationFailure
337
+ throwOnInitializationFailure,
338
+ cacheIdentifier: adapterArgs.cacheIdentifier
269
339
  }).then(_ref9 => {
270
340
  let flagsFromSdk = _ref9.flagsFromSdk,
271
341
  initializationStatus = _ref9.initializationStatus;
272
- if (subscribeToFlagChanges && flagsFromSdk) _classPrivateFieldLooseBase(this, _setupFlagSubcription)[_setupFlagSubcription]({
273
- flagsFromSdk,
274
- flagsUpdateDelayMs
275
- });
342
+ if (subscribeToFlagChanges && flagsFromSdk) {
343
+ _classPrivateFieldLooseBase(this, _setupFlagSubcription)[_setupFlagSubcription]({
344
+ flagsFromSdk,
345
+ flagsUpdateDelayMs
346
+ });
347
+ }
276
348
  return {
277
349
  initializationStatus
278
350
  };
@@ -280,9 +352,14 @@ class LaunchDarklyAdapter {
280
352
  }
281
353
  async reconfigure(adapterArgs, _adapterEventHandlers) {
282
354
  if (!this.getIsConfigurationStatus(types.AdapterConfigurationStatus.Configured)) return Promise.reject(new Error('@flopflip/launchdarkly-adapter: please configure adapter before reconfiguring.'));
283
- const nextContext = adapterArgs.context;
355
+ const nextContext = _classPrivateFieldLooseBase(this, _ensureContext)[_ensureContext](adapterArgs.context);
284
356
  if (!isEqual__default["default"](_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context, nextContext)) {
285
- _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context = _classPrivateFieldLooseBase(this, _ensureContext)[_ensureContext](nextContext);
357
+ if (adapterArgs.cacheIdentifier) {
358
+ var _classPrivateFieldLoo3;
359
+ const cache = await _classPrivateFieldLooseBase(this, _getCache)[_getCache](adapterArgs.cacheIdentifier, (_classPrivateFieldLoo3 = _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context) === null || _classPrivateFieldLoo3 === void 0 ? void 0 : _classPrivateFieldLoo3.key);
360
+ cache.unset();
361
+ }
362
+ _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context = nextContext;
286
363
  await _classPrivateFieldLooseBase(this, _changeClientContext)[_changeClientContext](_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context);
287
364
  return Promise.resolve({
288
365
  initializationStatus: types.AdapterInitializationStatus.Succeeded
@@ -317,7 +394,7 @@ class LaunchDarklyAdapter {
317
394
  const adapter = new LaunchDarklyAdapter();
318
395
  adapterUtilities.exposeGlobally(adapter);
319
396
 
320
- const version = "13.2.1";
397
+ const version = "13.2.3";
321
398
 
322
399
  exports["default"] = adapter;
323
400
  exports.version = version;
@@ -17,17 +17,37 @@ var tsDeepmerge = require('ts-deepmerge');
17
17
 
18
18
  function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }
19
19
 
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
+
20
38
  var debounce__default = /*#__PURE__*/_interopDefault(debounce);
21
39
  var isEqual__default = /*#__PURE__*/_interopDefault(isEqual);
22
40
  var mitt__default = /*#__PURE__*/_interopDefault(mitt);
23
41
  var warning__default = /*#__PURE__*/_interopDefault(warning);
24
42
 
43
+ const STORAGE_SLICE = '@flopflip/launchdarkly-adapter';
25
44
  var _adapterState = /*#__PURE__*/_classPrivateFieldLooseKey("adapterState");
26
45
  var _updateFlagsInAdapterState = /*#__PURE__*/_classPrivateFieldLooseKey("updateFlagsInAdapterState");
27
46
  var _getIsAdapterUnsubscribed = /*#__PURE__*/_classPrivateFieldLooseKey("getIsAdapterUnsubscribed");
28
47
  var _getIsFlagUnsubcribed = /*#__PURE__*/_classPrivateFieldLooseKey("getIsFlagUnsubcribed");
29
48
  var _getIsFlagLocked = /*#__PURE__*/_classPrivateFieldLooseKey("getIsFlagLocked");
30
49
  var _withoutUnsubscribedOrLockedFlags = /*#__PURE__*/_classPrivateFieldLooseKey("withoutUnsubscribedOrLockedFlags");
50
+ var _getCache = /*#__PURE__*/_classPrivateFieldLooseKey("getCache");
31
51
  var _getIsAnonymousContext = /*#__PURE__*/_classPrivateFieldLooseKey("getIsAnonymousContext");
32
52
  var _ensureContext = /*#__PURE__*/_classPrivateFieldLooseKey("ensureContext");
33
53
  var _initializeClient = /*#__PURE__*/_classPrivateFieldLooseKey("initializeClient");
@@ -84,6 +104,40 @@ class LaunchDarklyAdapter {
84
104
  return !_classPrivateFieldLooseBase(this, _getIsFlagUnsubcribed)[_getIsFlagUnsubcribed](flagName) && !_classPrivateFieldLooseBase(this, _getIsFlagLocked)[_getIsFlagLocked](flagName);
85
105
  }))
86
106
  });
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
+ });
87
141
  Object.defineProperty(this, _getIsAnonymousContext, {
88
142
  writable: true,
89
143
  value: context => !(context !== null && context !== void 0 && context.key)
@@ -115,7 +169,8 @@ class LaunchDarklyAdapter {
115
169
  writable: true,
116
170
  value: async _ref5 => {
117
171
  let flags = _ref5.flags,
118
- throwOnInitializationFailure = _ref5.throwOnInitializationFailure;
172
+ throwOnInitializationFailure = _ref5.throwOnInitializationFailure,
173
+ cacheIdentifier = _ref5.cacheIdentifier;
119
174
  if (_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].client) {
120
175
  return _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].client.waitForInitialization().then(async () => {
121
176
  let flagsFromSdk;
@@ -133,6 +188,11 @@ class LaunchDarklyAdapter {
133
188
  }
134
189
  if (flagsFromSdk) {
135
190
  const normalizedFlags = adapterUtilities.normalizeFlags(flagsFromSdk);
191
+ if (cacheIdentifier) {
192
+ var _classPrivateFieldLoo2;
193
+ const cache = await _classPrivateFieldLooseBase(this, _getCache)[_getCache](cacheIdentifier, (_classPrivateFieldLoo2 = _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context) === null || _classPrivateFieldLoo2 === void 0 ? void 0 : _classPrivateFieldLoo2.key);
194
+ cache.set(normalizedFlags);
195
+ }
136
196
  const flags = _classPrivateFieldLooseBase(this, _withoutUnsubscribedOrLockedFlags)[_withoutUnsubscribedOrLockedFlags](normalizedFlags);
137
197
  this.updateFlags(flags);
138
198
  }
@@ -261,18 +321,30 @@ class LaunchDarklyAdapter {
261
321
  _adapterArgs$throwOnI = adapterArgs.throwOnInitializationFailure,
262
322
  throwOnInitializationFailure = _adapterArgs$throwOnI === void 0 ? false : _adapterArgs$throwOnI,
263
323
  flagsUpdateDelayMs = adapterArgs.flagsUpdateDelayMs;
324
+ let cachedFlags;
264
325
  _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context = _classPrivateFieldLooseBase(this, _ensureContext)[_ensureContext](context);
326
+ if (adapterArgs.cacheIdentifier) {
327
+ const cache = await _classPrivateFieldLooseBase(this, _getCache)[_getCache](adapterArgs.cacheIdentifier, context.key);
328
+ cachedFlags = cache.get();
329
+ if (cachedFlags) {
330
+ _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].flags = cachedFlags;
331
+ _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].emitter.emit('flagsStateChange', cachedFlags);
332
+ }
333
+ }
265
334
  _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].client = _classPrivateFieldLooseBase(this, _initializeClient)[_initializeClient](sdk.clientSideId, _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context, (_sdk$clientOptions = sdk.clientOptions) !== null && _sdk$clientOptions !== void 0 ? _sdk$clientOptions : {});
266
335
  return _classPrivateFieldLooseBase(this, _getInitialFlags)[_getInitialFlags]({
267
336
  flags,
268
- throwOnInitializationFailure
337
+ throwOnInitializationFailure,
338
+ cacheIdentifier: adapterArgs.cacheIdentifier
269
339
  }).then(_ref9 => {
270
340
  let flagsFromSdk = _ref9.flagsFromSdk,
271
341
  initializationStatus = _ref9.initializationStatus;
272
- if (subscribeToFlagChanges && flagsFromSdk) _classPrivateFieldLooseBase(this, _setupFlagSubcription)[_setupFlagSubcription]({
273
- flagsFromSdk,
274
- flagsUpdateDelayMs
275
- });
342
+ if (subscribeToFlagChanges && flagsFromSdk) {
343
+ _classPrivateFieldLooseBase(this, _setupFlagSubcription)[_setupFlagSubcription]({
344
+ flagsFromSdk,
345
+ flagsUpdateDelayMs
346
+ });
347
+ }
276
348
  return {
277
349
  initializationStatus
278
350
  };
@@ -280,9 +352,14 @@ class LaunchDarklyAdapter {
280
352
  }
281
353
  async reconfigure(adapterArgs, _adapterEventHandlers) {
282
354
  if (!this.getIsConfigurationStatus(types.AdapterConfigurationStatus.Configured)) return Promise.reject(new Error('@flopflip/launchdarkly-adapter: please configure adapter before reconfiguring.'));
283
- const nextContext = adapterArgs.context;
355
+ const nextContext = _classPrivateFieldLooseBase(this, _ensureContext)[_ensureContext](adapterArgs.context);
284
356
  if (!isEqual__default["default"](_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context, nextContext)) {
285
- _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context = _classPrivateFieldLooseBase(this, _ensureContext)[_ensureContext](nextContext);
357
+ if (adapterArgs.cacheIdentifier) {
358
+ var _classPrivateFieldLoo3;
359
+ const cache = await _classPrivateFieldLooseBase(this, _getCache)[_getCache](adapterArgs.cacheIdentifier, (_classPrivateFieldLoo3 = _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context) === null || _classPrivateFieldLoo3 === void 0 ? void 0 : _classPrivateFieldLoo3.key);
360
+ cache.unset();
361
+ }
362
+ _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context = nextContext;
286
363
  await _classPrivateFieldLooseBase(this, _changeClientContext)[_changeClientContext](_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context);
287
364
  return Promise.resolve({
288
365
  initializationStatus: types.AdapterInitializationStatus.Succeeded
@@ -317,7 +394,7 @@ class LaunchDarklyAdapter {
317
394
  const adapter = new LaunchDarklyAdapter();
318
395
  adapterUtilities.exposeGlobally(adapter);
319
396
 
320
- const version = "13.2.1";
397
+ const version = "13.2.3";
321
398
 
322
399
  exports["default"] = adapter;
323
400
  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 { AdapterSubscriptionStatus, AdapterConfigurationStatus, AdapterInitializationStatus, adapterIdentifiers } from '@flopflip/types';
6
+ import { AdapterSubscriptionStatus, cacheIdentifiers, 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,12 +11,14 @@ import mitt from 'mitt';
11
11
  import warning from 'tiny-warning';
12
12
  import { merge } from 'ts-deepmerge';
13
13
 
14
+ const STORAGE_SLICE = '@flopflip/launchdarkly-adapter';
14
15
  var _adapterState = /*#__PURE__*/_classPrivateFieldLooseKey("adapterState");
15
16
  var _updateFlagsInAdapterState = /*#__PURE__*/_classPrivateFieldLooseKey("updateFlagsInAdapterState");
16
17
  var _getIsAdapterUnsubscribed = /*#__PURE__*/_classPrivateFieldLooseKey("getIsAdapterUnsubscribed");
17
18
  var _getIsFlagUnsubcribed = /*#__PURE__*/_classPrivateFieldLooseKey("getIsFlagUnsubcribed");
18
19
  var _getIsFlagLocked = /*#__PURE__*/_classPrivateFieldLooseKey("getIsFlagLocked");
19
20
  var _withoutUnsubscribedOrLockedFlags = /*#__PURE__*/_classPrivateFieldLooseKey("withoutUnsubscribedOrLockedFlags");
21
+ var _getCache = /*#__PURE__*/_classPrivateFieldLooseKey("getCache");
20
22
  var _getIsAnonymousContext = /*#__PURE__*/_classPrivateFieldLooseKey("getIsAnonymousContext");
21
23
  var _ensureContext = /*#__PURE__*/_classPrivateFieldLooseKey("ensureContext");
22
24
  var _initializeClient = /*#__PURE__*/_classPrivateFieldLooseKey("initializeClient");
@@ -73,6 +75,40 @@ class LaunchDarklyAdapter {
73
75
  return !_classPrivateFieldLooseBase(this, _getIsFlagUnsubcribed)[_getIsFlagUnsubcribed](flagName) && !_classPrivateFieldLooseBase(this, _getIsFlagLocked)[_getIsFlagLocked](flagName);
74
76
  }))
75
77
  });
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
+ });
76
112
  Object.defineProperty(this, _getIsAnonymousContext, {
77
113
  writable: true,
78
114
  value: context => !(context !== null && context !== void 0 && context.key)
@@ -104,7 +140,8 @@ class LaunchDarklyAdapter {
104
140
  writable: true,
105
141
  value: async _ref5 => {
106
142
  let flags = _ref5.flags,
107
- throwOnInitializationFailure = _ref5.throwOnInitializationFailure;
143
+ throwOnInitializationFailure = _ref5.throwOnInitializationFailure,
144
+ cacheIdentifier = _ref5.cacheIdentifier;
108
145
  if (_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].client) {
109
146
  return _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].client.waitForInitialization().then(async () => {
110
147
  let flagsFromSdk;
@@ -122,6 +159,11 @@ class LaunchDarklyAdapter {
122
159
  }
123
160
  if (flagsFromSdk) {
124
161
  const normalizedFlags = normalizeFlags(flagsFromSdk);
162
+ if (cacheIdentifier) {
163
+ var _classPrivateFieldLoo2;
164
+ const cache = await _classPrivateFieldLooseBase(this, _getCache)[_getCache](cacheIdentifier, (_classPrivateFieldLoo2 = _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context) === null || _classPrivateFieldLoo2 === void 0 ? void 0 : _classPrivateFieldLoo2.key);
165
+ cache.set(normalizedFlags);
166
+ }
125
167
  const flags = _classPrivateFieldLooseBase(this, _withoutUnsubscribedOrLockedFlags)[_withoutUnsubscribedOrLockedFlags](normalizedFlags);
126
168
  this.updateFlags(flags);
127
169
  }
@@ -250,18 +292,30 @@ class LaunchDarklyAdapter {
250
292
  _adapterArgs$throwOnI = adapterArgs.throwOnInitializationFailure,
251
293
  throwOnInitializationFailure = _adapterArgs$throwOnI === void 0 ? false : _adapterArgs$throwOnI,
252
294
  flagsUpdateDelayMs = adapterArgs.flagsUpdateDelayMs;
295
+ let cachedFlags;
253
296
  _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context = _classPrivateFieldLooseBase(this, _ensureContext)[_ensureContext](context);
297
+ if (adapterArgs.cacheIdentifier) {
298
+ const cache = await _classPrivateFieldLooseBase(this, _getCache)[_getCache](adapterArgs.cacheIdentifier, context.key);
299
+ cachedFlags = cache.get();
300
+ if (cachedFlags) {
301
+ _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].flags = cachedFlags;
302
+ _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].emitter.emit('flagsStateChange', cachedFlags);
303
+ }
304
+ }
254
305
  _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].client = _classPrivateFieldLooseBase(this, _initializeClient)[_initializeClient](sdk.clientSideId, _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context, (_sdk$clientOptions = sdk.clientOptions) !== null && _sdk$clientOptions !== void 0 ? _sdk$clientOptions : {});
255
306
  return _classPrivateFieldLooseBase(this, _getInitialFlags)[_getInitialFlags]({
256
307
  flags,
257
- throwOnInitializationFailure
308
+ throwOnInitializationFailure,
309
+ cacheIdentifier: adapterArgs.cacheIdentifier
258
310
  }).then(_ref9 => {
259
311
  let flagsFromSdk = _ref9.flagsFromSdk,
260
312
  initializationStatus = _ref9.initializationStatus;
261
- if (subscribeToFlagChanges && flagsFromSdk) _classPrivateFieldLooseBase(this, _setupFlagSubcription)[_setupFlagSubcription]({
262
- flagsFromSdk,
263
- flagsUpdateDelayMs
264
- });
313
+ if (subscribeToFlagChanges && flagsFromSdk) {
314
+ _classPrivateFieldLooseBase(this, _setupFlagSubcription)[_setupFlagSubcription]({
315
+ flagsFromSdk,
316
+ flagsUpdateDelayMs
317
+ });
318
+ }
265
319
  return {
266
320
  initializationStatus
267
321
  };
@@ -269,9 +323,14 @@ class LaunchDarklyAdapter {
269
323
  }
270
324
  async reconfigure(adapterArgs, _adapterEventHandlers) {
271
325
  if (!this.getIsConfigurationStatus(AdapterConfigurationStatus.Configured)) return Promise.reject(new Error('@flopflip/launchdarkly-adapter: please configure adapter before reconfiguring.'));
272
- const nextContext = adapterArgs.context;
326
+ const nextContext = _classPrivateFieldLooseBase(this, _ensureContext)[_ensureContext](adapterArgs.context);
273
327
  if (!isEqual(_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context, nextContext)) {
274
- _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context = _classPrivateFieldLooseBase(this, _ensureContext)[_ensureContext](nextContext);
328
+ if (adapterArgs.cacheIdentifier) {
329
+ var _classPrivateFieldLoo3;
330
+ const cache = await _classPrivateFieldLooseBase(this, _getCache)[_getCache](adapterArgs.cacheIdentifier, (_classPrivateFieldLoo3 = _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context) === null || _classPrivateFieldLoo3 === void 0 ? void 0 : _classPrivateFieldLoo3.key);
331
+ cache.unset();
332
+ }
333
+ _classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context = nextContext;
275
334
  await _classPrivateFieldLooseBase(this, _changeClientContext)[_changeClientContext](_classPrivateFieldLooseBase(this, _adapterState)[_adapterState].context);
276
335
  return Promise.resolve({
277
336
  initializationStatus: AdapterInitializationStatus.Succeeded
@@ -306,6 +365,6 @@ class LaunchDarklyAdapter {
306
365
  const adapter = new LaunchDarklyAdapter();
307
366
  exposeGlobally(adapter);
308
367
 
309
- const version = "13.2.1";
368
+ const version = "13.2.3";
310
369
 
311
370
  export { adapter as default, version };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flopflip/launchdarkly-adapter",
3
- "version": "13.2.1",
3
+ "version": "13.2.3",
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",
@@ -26,9 +26,11 @@
26
26
  "globalthis": "1.0.3"
27
27
  },
28
28
  "dependencies": {
29
- "@babel/runtime": "7.23.9",
30
- "@flopflip/adapter-utilities": "13.2.1",
31
- "@flopflip/types": "13.2.1",
29
+ "@babel/runtime": "7.24.0",
30
+ "@flopflip/adapter-utilities": "13.2.3",
31
+ "@flopflip/localstorage-cache": "13.2.3",
32
+ "@flopflip/sessionstorage-cache": "13.2.3",
33
+ "@flopflip/types": "13.2.3",
32
34
  "debounce-fn": "4.0.0",
33
35
  "launchdarkly-js-client-sdk": "3.1.4",
34
36
  "lodash": "4.17.21",