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:
@@ -1500,6 +1500,7 @@ const safeProviders: SafeProvider[] = [
|
||||
KdfConfigService,
|
||||
KeyService,
|
||||
StateProvider,
|
||||
ConfigService,
|
||||
],
|
||||
}),
|
||||
safeProvider({
|
||||
|
||||
@@ -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,
|
||||
);
|
||||
});
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user