mirror of
https://github.com/bitwarden/browser
synced 2025-12-11 13:53:34 +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:
@@ -786,6 +786,7 @@ export default class MainBackground {
|
|||||||
this.kdfConfigService,
|
this.kdfConfigService,
|
||||||
this.keyService,
|
this.keyService,
|
||||||
this.stateProvider,
|
this.stateProvider,
|
||||||
|
this.configService,
|
||||||
);
|
);
|
||||||
|
|
||||||
this.passwordStrengthService = new PasswordStrengthService();
|
this.passwordStrengthService = new PasswordStrengthService();
|
||||||
|
|||||||
@@ -602,6 +602,7 @@ export class ServiceContainer {
|
|||||||
this.kdfConfigService,
|
this.kdfConfigService,
|
||||||
this.keyService,
|
this.keyService,
|
||||||
this.stateProvider,
|
this.stateProvider,
|
||||||
|
this.configService,
|
||||||
customUserAgent,
|
customUserAgent,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -1500,6 +1500,7 @@ const safeProviders: SafeProvider[] = [
|
|||||||
KdfConfigService,
|
KdfConfigService,
|
||||||
KeyService,
|
KeyService,
|
||||||
StateProvider,
|
StateProvider,
|
||||||
|
ConfigService,
|
||||||
],
|
],
|
||||||
}),
|
}),
|
||||||
safeProvider({
|
safeProvider({
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { mock, MockProxy } from "jest-mock-extended";
|
import { mock, MockProxy } from "jest-mock-extended";
|
||||||
import { BehaviorSubject, firstValueFrom, of } from "rxjs";
|
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.
|
// 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
|
// eslint-disable-next-line no-restricted-imports
|
||||||
import { KdfConfigService, KeyService, PBKDF2KdfConfig } from "@bitwarden/key-management";
|
import { KdfConfigService, KeyService, PBKDF2KdfConfig } from "@bitwarden/key-management";
|
||||||
@@ -41,6 +42,7 @@ describe("DefaultSdkService", () => {
|
|||||||
let platformUtilsService!: MockProxy<PlatformUtilsService>;
|
let platformUtilsService!: MockProxy<PlatformUtilsService>;
|
||||||
let kdfConfigService!: MockProxy<KdfConfigService>;
|
let kdfConfigService!: MockProxy<KdfConfigService>;
|
||||||
let keyService!: MockProxy<KeyService>;
|
let keyService!: MockProxy<KeyService>;
|
||||||
|
let configService!: MockProxy<ConfigService>;
|
||||||
let service!: DefaultSdkService;
|
let service!: DefaultSdkService;
|
||||||
let accountService!: FakeAccountService;
|
let accountService!: FakeAccountService;
|
||||||
let fakeStateProvider!: FakeStateProvider;
|
let fakeStateProvider!: FakeStateProvider;
|
||||||
@@ -56,6 +58,9 @@ describe("DefaultSdkService", () => {
|
|||||||
const mockUserId = Utils.newGuid() as UserId;
|
const mockUserId = Utils.newGuid() as UserId;
|
||||||
accountService = mockAccountServiceWith(mockUserId);
|
accountService = mockAccountServiceWith(mockUserId);
|
||||||
fakeStateProvider = new FakeStateProvider(accountService);
|
fakeStateProvider = new FakeStateProvider(accountService);
|
||||||
|
configService = mock<ConfigService>();
|
||||||
|
|
||||||
|
configService.serverConfig$ = new BehaviorSubject(null);
|
||||||
|
|
||||||
// Can't use `of(mock<Environment>())` for some reason
|
// Can't use `of(mock<Environment>())` for some reason
|
||||||
environmentService.environment$ = new BehaviorSubject(mock<Environment>());
|
environmentService.environment$ = new BehaviorSubject(mock<Environment>());
|
||||||
@@ -68,6 +73,7 @@ describe("DefaultSdkService", () => {
|
|||||||
kdfConfigService,
|
kdfConfigService,
|
||||||
keyService,
|
keyService,
|
||||||
fakeStateProvider,
|
fakeStateProvider,
|
||||||
|
configService,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -12,8 +12,10 @@ import {
|
|||||||
of,
|
of,
|
||||||
takeWhile,
|
takeWhile,
|
||||||
throwIfEmpty,
|
throwIfEmpty,
|
||||||
|
firstValueFrom,
|
||||||
} from "rxjs";
|
} 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.
|
// 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
|
// eslint-disable-next-line no-restricted-imports
|
||||||
import { KeyService, KdfConfigService, KdfConfig, KdfType } from "@bitwarden/key-management";
|
import { KeyService, KdfConfigService, KdfConfig, KdfType } from "@bitwarden/key-management";
|
||||||
@@ -67,7 +69,9 @@ export class DefaultSdkService implements SdkService {
|
|||||||
concatMap(async (env) => {
|
concatMap(async (env) => {
|
||||||
await SdkLoadService.Ready;
|
await SdkLoadService.Ready;
|
||||||
const settings = this.toSettings(env);
|
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 }),
|
shareReplay({ refCount: true, bufferSize: 1 }),
|
||||||
);
|
);
|
||||||
@@ -85,6 +89,7 @@ export class DefaultSdkService implements SdkService {
|
|||||||
private kdfConfigService: KdfConfigService,
|
private kdfConfigService: KdfConfigService,
|
||||||
private keyService: KeyService,
|
private keyService: KeyService,
|
||||||
private stateProvider: StateProvider,
|
private stateProvider: StateProvider,
|
||||||
|
private configService: ConfigService,
|
||||||
private userAgent: string | null = null,
|
private userAgent: string | null = null,
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
@@ -248,6 +253,20 @@ export class DefaultSdkService implements SdkService {
|
|||||||
|
|
||||||
// Initialize the SDK managed database and the client managed repositories.
|
// Initialize the SDK managed database and the client managed repositories.
|
||||||
await initializeState(userId, client.platform().state(), this.stateProvider);
|
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 {
|
private toSettings(env: Environment): ClientSettings {
|
||||||
|
|||||||
Reference in New Issue
Block a user