1
0
mirror of https://github.com/bitwarden/browser synced 2025-12-10 21:33:27 +00:00

[PM-24243] Load config service feature flag into SDK client (#15855)

* [PM-24243] Load config service feature flag into SDK client during initialization

* [PM-24243] Bump sdk version

* [PM-24243] Update load_flags to use generic Map instead of strongly typed object

* [PM-24243] Pass entire feature states object into SDK

* [PM-24243] Bump SDK version

* [PM-24243] Fix failing test
This commit is contained in:
Shane Melton
2025-09-03 10:56:55 -07:00
committed by GitHub
parent 2de321d6e8
commit b6ef7716da
5 changed files with 29 additions and 1 deletions

View File

@@ -1500,6 +1500,7 @@ const safeProviders: SafeProvider[] = [
KdfConfigService,
KeyService,
StateProvider,
ConfigService,
],
}),
safeProvider({

View File

@@ -1,6 +1,7 @@
import { mock, MockProxy } from "jest-mock-extended";
import { BehaviorSubject, firstValueFrom, of } from "rxjs";
import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service";
// This import has been flagged as unallowed for this class. It may be involved in a circular dependency loop.
// eslint-disable-next-line no-restricted-imports
import { KdfConfigService, KeyService, PBKDF2KdfConfig } from "@bitwarden/key-management";
@@ -41,6 +42,7 @@ describe("DefaultSdkService", () => {
let platformUtilsService!: MockProxy<PlatformUtilsService>;
let kdfConfigService!: MockProxy<KdfConfigService>;
let keyService!: MockProxy<KeyService>;
let configService!: MockProxy<ConfigService>;
let service!: DefaultSdkService;
let accountService!: FakeAccountService;
let fakeStateProvider!: FakeStateProvider;
@@ -56,6 +58,9 @@ describe("DefaultSdkService", () => {
const mockUserId = Utils.newGuid() as UserId;
accountService = mockAccountServiceWith(mockUserId);
fakeStateProvider = new FakeStateProvider(accountService);
configService = mock<ConfigService>();
configService.serverConfig$ = new BehaviorSubject(null);
// Can't use `of(mock<Environment>())` for some reason
environmentService.environment$ = new BehaviorSubject(mock<Environment>());
@@ -68,6 +73,7 @@ describe("DefaultSdkService", () => {
kdfConfigService,
keyService,
fakeStateProvider,
configService,
);
});

View File

@@ -12,8 +12,10 @@ import {
of,
takeWhile,
throwIfEmpty,
firstValueFrom,
} from "rxjs";
import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service";
// This import has been flagged as unallowed for this class. It may be involved in a circular dependency loop.
// eslint-disable-next-line no-restricted-imports
import { KeyService, KdfConfigService, KdfConfig, KdfType } from "@bitwarden/key-management";
@@ -67,7 +69,9 @@ export class DefaultSdkService implements SdkService {
concatMap(async (env) => {
await SdkLoadService.Ready;
const settings = this.toSettings(env);
return await this.sdkClientFactory.createSdkClient(new JsTokenProvider(), settings);
const client = await this.sdkClientFactory.createSdkClient(new JsTokenProvider(), settings);
await this.loadFeatureFlags(client);
return client;
}),
shareReplay({ refCount: true, bufferSize: 1 }),
);
@@ -85,6 +89,7 @@ export class DefaultSdkService implements SdkService {
private kdfConfigService: KdfConfigService,
private keyService: KeyService,
private stateProvider: StateProvider,
private configService: ConfigService,
private userAgent: string | null = null,
) {}
@@ -248,6 +253,20 @@ export class DefaultSdkService implements SdkService {
// Initialize the SDK managed database and the client managed repositories.
await initializeState(userId, client.platform().state(), this.stateProvider);
await this.loadFeatureFlags(client);
}
private async loadFeatureFlags(client: BitwardenClient) {
const serverConfig = await firstValueFrom(this.configService.serverConfig$);
const featureFlagMap = new Map(
Object.entries(serverConfig?.featureStates ?? {})
.filter(([, value]) => typeof value === "boolean") // The SDK only supports boolean feature flags at this time
.map(([key, value]) => [key, value] as [string, boolean]),
);
client.platform().load_flags(featureFlagMap);
}
private toSettings(env: Environment): ClientSettings {