@@ -16,7 +16,6 @@ import {
1616 LDHeaders ,
1717 LDIdentifyResult ,
1818 LDPluginEnvironmentMetadata ,
19- LDTimeoutError ,
2019 Platform ,
2120} from '@launchdarkly/js-client-sdk-common' ;
2221
@@ -26,16 +25,23 @@ import { BrowserIdentifyOptions as LDIdentifyOptions } from './BrowserIdentifyOp
2625import { registerStateDetection } from './BrowserStateDetector' ;
2726import GoalManager from './goals/GoalManager' ;
2827import { Goal , isClick } from './goals/Goals' ;
29- import { LDClient } from './LDClient' ;
28+ import {
29+ LDClient ,
30+ LDWaitForInitializationComplete ,
31+ LDWaitForInitializationFailed ,
32+ LDWaitForInitializationOptions ,
33+ LDWaitForInitializationResult ,
34+ LDWaitForInitializationTimeout ,
35+ } from './LDClient' ;
3036import { LDPlugin } from './LDPlugin' ;
3137import validateBrowserOptions , { BrowserOptions , filterToBaseOptionsWithDefaults } from './options' ;
3238import BrowserPlatform from './platform/BrowserPlatform' ;
3339
3440class BrowserClientImpl extends LDClientImpl {
3541 private readonly _goalManager ?: GoalManager ;
3642 private readonly _plugins ?: LDPlugin [ ] ;
37- private _initializedPromise ?: Promise < void > ;
38- private _initResolve ?: ( ) => void ;
43+ private _initializedPromise ?: Promise < LDWaitForInitializationResult > ;
44+ private _initResolve ?: ( result : LDWaitForInitializationResult ) => void ;
3945 private _isInitialized : boolean = false ;
4046
4147 constructor (
@@ -219,13 +225,17 @@ class BrowserClientImpl extends LDClientImpl {
219225 const res = await super . identifyResult ( context , identifyOptionsWithUpdatedDefaults ) ;
220226 if ( res . status === 'completed' ) {
221227 this . _isInitialized = true ;
222- this . _initResolve ?.( ) ;
228+ this . _initResolve ?.( { status : 'complete' } ) ;
223229 }
224230 this . _goalManager ?. startTracking ( ) ;
225231 return res ;
226232 }
227233
228- waitForInitialization ( timeout : number = 5 ) : Promise < void > {
234+ waitForInitialization (
235+ options ?: LDWaitForInitializationOptions ,
236+ ) : Promise < LDWaitForInitializationResult > {
237+ const timeout = options ?. timeout ?? 5 ;
238+
229239 // An initialization promise is only created if someone is going to use that promise.
230240 // If we always created an initialization promise, and there was no call waitForInitialization
231241 // by the time the promise was rejected, then that would result in an unhandled promise
@@ -238,7 +248,9 @@ class BrowserClientImpl extends LDClientImpl {
238248 }
239249
240250 if ( this . _isInitialized ) {
241- return Promise . resolve ( ) ;
251+ return Promise . resolve ( {
252+ status : 'complete' ,
253+ } ) ;
242254 }
243255
244256 if ( ! this . _initializedPromise ) {
@@ -258,16 +270,25 @@ class BrowserClientImpl extends LDClientImpl {
258270 * @param logger A logger to log when the timeout expires.
259271 * @returns
260272 */
261- private _promiseWithTimeout ( basePromise : Promise < void > , timeout : number ) : Promise < void > {
273+ private _promiseWithTimeout (
274+ basePromise : Promise < LDWaitForInitializationResult > ,
275+ timeout : number ,
276+ ) : Promise < LDWaitForInitializationResult > {
262277 const cancelableTimeout = cancelableTimedPromise ( timeout , 'waitForInitialization' ) ;
263278 return Promise . race ( [
264- basePromise . then ( ( ) => cancelableTimeout . cancel ( ) ) ,
265- cancelableTimeout . promise ,
279+ basePromise . then ( ( res : LDWaitForInitializationResult ) => {
280+ cancelableTimeout . cancel ( ) ;
281+ return res ;
282+ } ) ,
283+ cancelableTimeout . promise
284+ // If the promise resolves without error, then the initialization completed successfully.
285+ // NOTE: this should never return as the resolution would only be triggered by the basePromise
286+ // being resolved.
287+ . then ( ( ) => ( { status : 'complete' } ) as LDWaitForInitializationComplete )
288+ . catch ( ( ) => ( { status : 'timeout' } ) as LDWaitForInitializationTimeout ) ,
266289 ] ) . catch ( ( reason ) => {
267- if ( reason instanceof LDTimeoutError ) {
268- this . logger ?. error ( reason . message ) ;
269- }
270- throw reason ;
290+ this . logger ?. error ( reason . message ) ;
291+ return { status : 'failed' , error : reason as Error } as LDWaitForInitializationFailed ;
271292 } ) ;
272293 }
273294
@@ -337,7 +358,8 @@ export function makeClient(
337358 close : ( ) => impl . close ( ) ,
338359 allFlags : ( ) => impl . allFlags ( ) ,
339360 addHook : ( hook : Hook ) => impl . addHook ( hook ) ,
340- waitForInitialization : ( timeout : number ) => impl . waitForInitialization ( timeout ) ,
361+ waitForInitialization : ( waitOptions ?: LDWaitForInitializationOptions ) =>
362+ impl . waitForInitialization ( waitOptions ) ,
341363 logger : impl . logger ,
342364 } ;
343365
0 commit comments