diff --git a/libs/common/src/platform/abstractions/config/config.service.ts b/libs/common/src/platform/abstractions/config/config.service.ts index 04f150838e4..6158f16d764 100644 --- a/libs/common/src/platform/abstractions/config/config.service.ts +++ b/libs/common/src/platform/abstractions/config/config.service.ts @@ -1,6 +1,6 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -import { Observable } from "rxjs"; +import { Observable, Subscription } from "rxjs"; import { SemVer } from "semver"; import { FeatureFlag, FeatureFlagValueType } from "../../../enums/feature-flag.enum"; @@ -10,6 +10,8 @@ import { Region } from "../environment.service"; import { ServerConfig } from "./server-config"; +export type ConfigCallback = (serverConfig: ServerConfig) => void; + export abstract class ConfigService { /** The server config of the currently active user */ serverConfig$: Observable; @@ -54,4 +56,10 @@ export abstract class ConfigService { * Triggers a check that the config for the currently active user is up-to-date. If it is not, it will be fetched from the server and stored. */ abstract ensureConfigFetched(): Promise; + + abstract broadcastConfigChangesTo(...listeners: OnServerConfigChange[]): Subscription; +} + +export interface OnServerConfigChange { + onServerConfigChange(newConfig: ServerConfig): void; } diff --git a/libs/common/src/platform/services/config/default-config.service.ts b/libs/common/src/platform/services/config/default-config.service.ts index 33f86d30885..8bca4cc6d3d 100644 --- a/libs/common/src/platform/services/config/default-config.service.ts +++ b/libs/common/src/platform/services/config/default-config.service.ts @@ -10,6 +10,7 @@ import { of, shareReplay, Subject, + Subscription, switchMap, tap, } from "rxjs"; @@ -20,7 +21,11 @@ import { AuthenticationStatus } from "../../../auth/enums/authentication-status" import { FeatureFlag, getFeatureFlagValue } from "../../../enums/feature-flag.enum"; import { UserId } from "../../../types/guid"; import { ConfigApiServiceAbstraction } from "../../abstractions/config/config-api.service.abstraction"; -import { ConfigService } from "../../abstractions/config/config.service"; +import { + ConfigCallback, + ConfigService, + OnServerConfigChange, +} from "../../abstractions/config/config.service"; import { ServerConfig } from "../../abstractions/config/server-config"; import { Environment, EnvironmentService, Region } from "../../abstractions/environment.service"; import { LogService } from "../../abstractions/log.service"; @@ -53,6 +58,7 @@ export const GLOBAL_SERVER_CONFIGURATIONS = KeyDefinition.record(); + private callbacks: ConfigCallback[] = []; serverConfig$: Observable; @@ -149,6 +155,12 @@ export class DefaultConfigService implements ConfigService { await firstValueFrom(this.serverConfig$); } + broadcastConfigChangesTo(...listeners: OnServerConfigChange[]): Subscription { + return this.serverConfig$.subscribe((config) => + listeners.forEach((listener) => listener.onServerConfigChange(config)), + ); + } + private olderThanRetrievalInterval(date: Date) { return new Date().getTime() - date.getTime() > RETRIEVAL_INTERVAL; }