1
0
mirror of https://github.com/bitwarden/browser synced 2025-12-18 17:23:37 +00:00

[PM-11661]Add New Reseed - Fill Buffer Behind Feature Flag (#10905)

* Add New Reseed - Fill Buffer Behind Feature Flag

* Add Tests

* Lint
This commit is contained in:
Justin Baur
2024-09-06 09:48:27 -04:00
committed by GitHub
parent 03b3345bf6
commit 92e71d9252
8 changed files with 151 additions and 14 deletions

View File

@@ -16,6 +16,7 @@ import {
import { subscribeTo } from "../../../../spec/observable-tracker";
import { AuthService } from "../../../auth/abstractions/auth.service";
import { AuthenticationStatus } from "../../../auth/enums/authentication-status";
import { FeatureFlag } from "../../../enums/feature-flag.enum";
import { UserId } from "../../../types/guid";
import { ConfigApiServiceAbstraction } from "../../abstractions/config/config-api.service.abstraction";
import { ServerConfig } from "../../abstractions/config/server-config";
@@ -277,6 +278,48 @@ describe("ConfigService", () => {
});
});
describe("userCachedFeatureFlag$", () => {
it("maps saved user config to a feature flag", async () => {
const updateFeature = (value: boolean) => {
return new ServerConfig(
new ServerConfigData({
featureStates: {
"test-feature": value,
},
}),
);
};
const configService = new DefaultConfigService(
configApiService,
environmentService,
logService,
stateProvider,
authService,
);
userState.nextState(null);
const promise = firstValueFrom(
configService
.userCachedFeatureFlag$("test-feature" as FeatureFlag, userId)
.pipe(bufferCount(3)),
);
userState.nextState(updateFeature(true));
userState.nextState(updateFeature(false));
const values = await promise;
// We wouldn't normally expect this to be undefined, the logic
// should normally return the feature flags default value but since
// we are faking a feature flag key, undefined is expected
expect(values[0]).toBe(undefined);
expect(values[1]).toBe(true);
expect(values[2]).toBe(false);
});
});
describe("slow configuration", () => {
const environmentSubject = new BehaviorSubject<Environment>(null);

View File

@@ -115,16 +115,27 @@ export class DefaultConfigService implements ConfigService {
getFeatureFlag$<Flag extends FeatureFlag>(key: Flag) {
return this.serverConfig$.pipe(
map((serverConfig) => {
if (serverConfig?.featureStates == null || serverConfig.featureStates[key] == null) {
return DefaultFeatureFlagValue[key];
}
return serverConfig.featureStates[key] as FeatureFlagValueType<Flag>;
}),
map((serverConfig) => this.getFeatureFlagValue(serverConfig, key)),
);
}
private getFeatureFlagValue<Flag extends FeatureFlag>(
serverConfig: ServerConfig | null,
flag: Flag,
) {
if (serverConfig?.featureStates == null || serverConfig.featureStates[flag] == null) {
return DefaultFeatureFlagValue[flag];
}
return serverConfig.featureStates[flag] as FeatureFlagValueType<Flag>;
}
userCachedFeatureFlag$<Flag extends FeatureFlag>(key: Flag, userId: UserId) {
return this.stateProvider
.getUser(userId, USER_SERVER_CONFIG)
.state$.pipe(map((config) => this.getFeatureFlagValue(config, key)));
}
async getFeatureFlag<Flag extends FeatureFlag>(key: Flag) {
return await firstValueFrom(this.getFeatureFlag$(key));
}