Skip to content

Commit 044170a

Browse files
committed
feat: add FF_OVERRIDE env variable to locally override feature flags
1 parent d7ac2d0 commit 044170a

File tree

2 files changed

+22
-0
lines changed

2 files changed

+22
-0
lines changed

apps/browser-extension-wallet/.env.example

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,3 +120,6 @@ SESSION_TIMEOUT=300000
120120

121121
# mempool.space api
122122
MEMPOOLSPACE_URL=https://mempool.lw.iog.io
123+
124+
# Local feature flags override
125+
FF_OVERRIDE='{"notifications-center": false}'

apps/browser-extension-wallet/src/providers/PostHogClientProvider/client/PostHogClient.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ const isNetworkOfExpectedSchema = (n: string): n is NetworksEnumSchema => networ
4545

4646
const logger = contextLogger(commonLogger, 'PostHogClient');
4747

48+
const FALSY_VALUES = ['false', 'False', 'FALSE', 'f', 'F', '0', 0, false];
49+
const TRUTHY_VALUES = ['true', 'True', 'TRUE', 't', 'T', '1', 1, true];
50+
const VALID_VALUES = new Set([...FALSY_VALUES, ...TRUTHY_VALUES]);
51+
4852
/**
4953
* PostHog API reference:
5054
* https://posthog.com/docs/libraries/js
@@ -56,6 +60,7 @@ export class PostHogClient<Action extends string = string> {
5660
hasPostHogInitialized$ = new BehaviorSubject(false);
5761
featureFlagsByNetwork: FeatureFlagsByNetwork = featureFlagsByNetworkInitialValue;
5862
featureFlagPayloads: FeatureFlagPayloads = featureFlagPayloadsInitialValue;
63+
private ffOverride: Record<string, boolean> = {};
5964

6065
constructor(
6166
private chain: Wallet.Cardano.ChainId,
@@ -66,6 +71,18 @@ export class PostHogClient<Action extends string = string> {
6671
) {
6772
if (!this.postHogHost) throw new Error('POSTHOG_HOST url has not been provided');
6873
void this.initialize();
74+
75+
if (typeof process.env.FF_OVERRIDE === 'string')
76+
try {
77+
const ffOverride = JSON.parse(process.env.FF_OVERRIDE) as Record<string, string | number | boolean>;
78+
79+
for (const [key, value] of Object.entries(ffOverride)) {
80+
if (VALID_VALUES.has(value)) this.ffOverride[key] = TRUTHY_VALUES.includes(value);
81+
else commonLogger.error(`Invalid value for FF_OVERRIDE[${key}]: "${value}"`);
82+
}
83+
} catch (error) {
84+
commonLogger.error('While parsing FF_OVERRIDE', error);
85+
}
6986
}
7087

7188
private async initialize() {
@@ -224,6 +241,8 @@ export class PostHogClient<Action extends string = string> {
224241
}
225242

226243
isFeatureFlagEnabled(feature: FeatureFlag): boolean {
244+
if (feature in this.ffOverride) return this.ffOverride[feature];
245+
227246
const currentNetworkFeatureFlags =
228247
this.featureFlagsByNetwork[this.chain.networkMagic as Wallet.Cardano.NetworkMagics];
229248
return currentNetworkFeatureFlags[feature] || false;

0 commit comments

Comments
 (0)