@@ -68,9 +68,6 @@ export type FetchedFlag = {
6868
6969const FLAGS_UPDATED_EVENT = "flagsUpdated" ;
7070
71- /**
72- * @internal
73- */
7471export type FetchedFlags = Record < string , FetchedFlag | undefined > ;
7572
7673export type RawFlag = FetchedFlag & {
@@ -176,7 +173,7 @@ export interface CheckEvent {
176173 missingContextFields ?: string [ ] ;
177174}
178175
179- type context = {
176+ type Context = {
180177 user ?: Record < string , any > ;
181178 company ?: Record < string , any > ;
182179 other ?: Record < string , any > ;
@@ -207,8 +204,9 @@ function getOverridesCache(): OverridesFlags {
207204 * @internal
208205 */
209206export class FlagsClient {
207+ private initialized = false ;
210208 private cache : FlagCache ;
211- private fetchedFlags : FetchedFlags ;
209+ private fetchedFlags : FetchedFlags = { } ;
212210 private flagOverrides : OverridesFlags = { } ;
213211
214212 private flags : RawFlags = { } ;
@@ -222,9 +220,10 @@ export class FlagsClient {
222220
223221 constructor (
224222 private httpClient : HttpClient ,
225- private context : context ,
223+ private context : Context ,
226224 logger : Logger ,
227225 options ?: {
226+ flags ?: FetchedFlags ;
228227 fallbackFlags ?: Record < string , FallbackFlagOverride > | string [ ] ;
229228 timeoutMs ?: number ;
230229 staleTimeMs ?: number ;
@@ -234,7 +233,6 @@ export class FlagsClient {
234233 offline ?: boolean ;
235234 } ,
236235 ) {
237- this . fetchedFlags = { } ;
238236 this . logger = loggerWithPrefix ( logger , "[Flags]" ) ;
239237 this . cache = options ?. cache
240238 ? options . cache
@@ -280,14 +278,22 @@ export class FlagsClient {
280278 this . logger . warn ( "error getting flag overrides from cache" , e ) ;
281279 this . flagOverrides = { } ;
282280 }
281+
282+ if ( options ?. flags ) {
283+ this . initialized = true ;
284+ this . fetchedFlags = options . flags ;
285+ this . flags = this . mergeFlags ( this . fetchedFlags , this . flagOverrides ) ;
286+ }
283287 }
284288
285289 async initialize ( ) {
286- const flags = ( await this . maybeFetchFlags ( ) ) || { } ;
287- this . setFetchedFlags ( flags ) ;
290+ if ( ! this . initialized ) {
291+ this . initialized = true ;
292+ this . setFetchedFlags ( ( await this . maybeFetchFlags ( ) ) || { } ) ;
293+ }
288294 }
289295
290- async setContext ( context : context ) {
296+ async setContext ( context : Context ) {
291297 this . context = context ;
292298 await this . initialize ( ) ;
293299 }
@@ -397,21 +403,20 @@ export class FlagsClient {
397403 return checkEvent . value ;
398404 }
399405
400- private triggerFlagsUpdated ( ) {
406+ private mergeFlags ( fetchedFlags : FetchedFlags , overrides : OverridesFlags ) {
401407 const mergedFlags : RawFlags = { } ;
402-
403408 // merge fetched flags with overrides into `this.flags`
404- for ( const key in this . fetchedFlags ) {
405- const fetchedFlag = this . fetchedFlags [ key ] ;
409+ for ( const key in fetchedFlags ) {
410+ const fetchedFlag = fetchedFlags [ key ] ;
406411 if ( ! fetchedFlag ) continue ;
407- const isEnabledOverride = this . flagOverrides [ key ] ?? null ;
408- mergedFlags [ key ] = {
409- ...fetchedFlag ,
410- isEnabledOverride,
411- } ;
412+ const isEnabledOverride = overrides [ key ] ?? null ;
413+ mergedFlags [ key ] = { ...fetchedFlag , isEnabledOverride } ;
412414 }
415+ return mergedFlags ;
416+ }
413417
414- this . flags = mergedFlags ;
418+ private triggerFlagsUpdated ( ) {
419+ this . flags = this . mergeFlags ( this . fetchedFlags , this . flagOverrides ) ;
415420
416421 this . eventTarget . dispatchEvent ( new Event ( FLAGS_UPDATED_EVENT ) ) ;
417422 }
0 commit comments