Skip to content

Commit

Permalink
fix(condo): DOMA-10091 growthbook features keeping (#5204)
Browse files Browse the repository at this point in the history
* fix(condo): DOMA-10091 removed growthBook features ttl, returning features from cache if had error loading new

* fix(condo): DOMA-10091 extended /features refetch interval

* fix(condo): DOMA-10091 try/catching json.parse

* style(condo): DOMA-10091 rename const
  • Loading branch information
YEgorLu authored Sep 10, 2024
1 parent 25e9b97 commit a3a979a
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 8 deletions.
4 changes: 2 additions & 2 deletions packages/featureflags/FeatureFlagsContext.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ const {
} = getConfig()

const growthbook = new GrowthBook()
const FEATURES_RE_FETCH_INTERVAL = 10 * 1000
const FEATURES_RE_FETCH_INTERVAL_IN_MS = 60 * 1000 // 1 min

type UseFlagValueType = <T>(name: string) => T | null

Expand Down Expand Up @@ -85,7 +85,7 @@ const FeatureFlagsProviderWrapper = ({ children, initFeatures = null }) => {
}

fetchFeatures()
const handler = setInterval(() => fetchFeatures(), FEATURES_RE_FETCH_INTERVAL)
const handler = setInterval(() => fetchFeatures(), FEATURES_RE_FETCH_INTERVAL_IN_MS)

return () => {
clearInterval(handler)
Expand Down
31 changes: 25 additions & 6 deletions packages/featureflags/featureToggleManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ const logger = getLogger('featureToggleManager')
const FEATURE_TOGGLE_CONFIG = (conf.FEATURE_TOGGLE_CONFIG) ? JSON.parse(conf.FEATURE_TOGGLE_CONFIG) : {}

const REDIS_FEATURES_KEY = 'features'
const REDIS_UPDATE_FEATURES_KEY = 'features-update'
const FEATURES_EXPIRED_IN_SECONDS = 60

class FeatureToggleManager {
Expand All @@ -34,29 +35,34 @@ class FeatureToggleManager {
logger.warn('No FEATURE_TOGGLE_CONFIG! Every features and values will be false!')
}
this._redisKey = REDIS_FEATURES_KEY
this._redisUpdateKey = REDIS_UPDATE_FEATURES_KEY
this._redisExpires = FEATURES_EXPIRED_IN_SECONDS
}

async fetchFeatures () {
try {
if (this._url) {
const cachedFeatureFlags = await this.redis.get(this._redisKey)
if (cachedFeatureFlags) return JSON.parse(cachedFeatureFlags)

const wasUpdatedRecently = await this.redis.get(this._redisUpdateKey)
if (wasUpdatedRecently) {
return this._getFeaturesFromCache()
}
const result = await fetch(this._url)
const parsedResult = await result.json()
const features = parsedResult.features

await this.redis.set(this._redisKey, JSON.stringify(features), 'EX', this._redisExpires)

await this.redis.set(this._redisKey, JSON.stringify(features))
await this.redis.set(this._redisUpdateKey, 'true', 'EX', this._redisExpires)
return features

} else if (this._static) {
return JSON.parse(JSON.stringify(this._static))
}

throw new Error('FeatureToggleManager config error!')
} catch (err) {
logger.error({ msg: 'fetchFeatures error', err })
if (this._url) {
return this._getFeaturesFromCache()
}
return {}
}
}
Expand Down Expand Up @@ -101,6 +107,19 @@ class FeatureToggleManager {
const growthbook = await this._getGrowthBookInstance(keystoneContext, featuresContext)
return growthbook.getFeatureValue(featureName, defaultValue)
}

async _getFeaturesFromCache () {
const cachedFeatureFlags = await this.redis.get(this._redisKey)
if (cachedFeatureFlags) {
try {
return JSON.parse(cachedFeatureFlags)
} catch (err) {
logger.error({ msg: '_getFeaturesFromCache json.parse error', err })
return {}
}
}
return {}
}
}

const featureToggleManager = new FeatureToggleManager()
Expand Down

0 comments on commit a3a979a

Please sign in to comment.