@@ -46,8 +46,6 @@ export default class LDClientImpl implements LDClient {
4646 private eventFactoryWithReasons = new EventFactory ( true ) ;
4747 private emitter : LDEmitter ;
4848 private flags : Flags = { } ;
49- private identifyChangeListener ?: ( c : LDContext , changedKeys : string [ ] ) => void ;
50- private identifyErrorListener ?: ( c : LDContext , err : any ) => void ;
5149
5250 private readonly clientContext : ClientContext ;
5351
@@ -81,6 +79,12 @@ export default class LDClientImpl implements LDClient {
8179 ! this . isOffline ( ) ,
8280 ) ;
8381 this . emitter = new LDEmitter ( ) ;
82+ this . emitter . on ( 'change' , ( c : LDContext , changedKeys : string [ ] ) => {
83+ this . logger . debug ( `change: context: ${ JSON . stringify ( c ) } , flags: ${ changedKeys } ` ) ;
84+ } ) ;
85+ this . emitter . on ( 'error' , ( c : LDContext , err : any ) => {
86+ this . logger . error ( `error: ${ err } , context: ${ JSON . stringify ( c ) } ` ) ;
87+ } ) ;
8488 }
8589
8690 /**
@@ -244,32 +248,22 @@ export default class LDClientImpl implements LDClient {
244248
245249 private createIdentifyPromise ( timeout : number ) {
246250 let res : any ;
251+ let rej : any ;
252+
247253 const slow = new Promise < void > ( ( resolve , reject ) => {
248254 res = resolve ;
255+ rej = reject ;
256+ } ) ;
249257
250- if ( this . identifyChangeListener ) {
251- this . emitter . off ( 'change' , this . identifyChangeListener ) ;
252- }
253- if ( this . identifyErrorListener ) {
254- this . emitter . off ( 'error' , this . identifyErrorListener ) ;
258+ const timed = timedPromise ( timeout , 'identify' ) ;
259+ const raced = Promise . race ( [ timed , slow ] ) . catch ( ( e ) => {
260+ if ( e . message . includes ( 'timed out' ) ) {
261+ this . logger . error ( `identify error: ${ e } ` ) ;
255262 }
256-
257- this . identifyChangeListener = ( c : LDContext , changedKeys : string [ ] ) => {
258- this . logger . debug ( `change: context: ${ JSON . stringify ( c ) } , flags: ${ changedKeys } ` ) ;
259- } ;
260- this . identifyErrorListener = ( c : LDContext , err : Error ) => {
261- this . logger . debug ( `error: ${ err } , context: ${ JSON . stringify ( c ) } ` ) ;
262- reject ( err ) ;
263- } ;
264-
265- this . emitter . on ( 'change' , this . identifyChangeListener ) ;
266- this . emitter . on ( 'error' , this . identifyErrorListener ) ;
263+ throw e ;
267264 } ) ;
268265
269- const timed = timedPromise ( timeout , 'identify' , this . logger ) ;
270- const raced = Promise . race ( [ timed , slow ] ) ;
271-
272- return { identifyPromise : raced , identifyResolve : res } ;
266+ return { identifyPromise : raced , identifyResolve : res , identifyReject : rej } ;
273267 }
274268
275269 private async getFlagsFromStorage ( canonicalKey : string ) : Promise < Flags | undefined > {
@@ -282,8 +276,15 @@ export default class LDClientImpl implements LDClient {
282276 *
283277 * @param pristineContext The LDContext object to be identified.
284278 * @param identifyOptions Optional configuration. See {@link LDIdentifyOptions}.
279+ * @returns A Promise which resolves when the flag values for the specified
280+ * context are available. It rejects when:
281+ *
282+ * 1. The context is unspecified or has no key.
285283 *
286- * @returns {Promise<void> }.
284+ * 2. The identify timeout is exceeded. In client SDKs this defaults to 5s.
285+ * You can customize this timeout with {@link LDIdentifyOptions | identifyOptions}.
286+ *
287+ * 3. A network error is encountered during initialization.
287288 */
288289 async identify ( pristineContext : LDContext , identifyOptions ?: LDIdentifyOptions ) : Promise < void > {
289290 if ( identifyOptions ?. timeout ) {
@@ -303,13 +304,14 @@ export default class LDClientImpl implements LDClient {
303304 const checkedContext = Context . fromLDContext ( context ) ;
304305 if ( ! checkedContext . valid ) {
305306 const error = new Error ( 'Context was unspecified or had no key' ) ;
306- this . logger . error ( error ) ;
307307 this . emitter . emit ( 'error' , context , error ) ;
308308 return Promise . reject ( error ) ;
309309 }
310310
311311 this . eventProcessor ?. sendEvent ( this . eventFactoryDefault . identifyEvent ( checkedContext ) ) ;
312- const { identifyPromise, identifyResolve } = this . createIdentifyPromise ( this . identifyTimeout ) ;
312+ const { identifyPromise, identifyResolve, identifyReject } = this . createIdentifyPromise (
313+ this . identifyTimeout ,
314+ ) ;
313315 this . logger . debug ( `Identifying ${ JSON . stringify ( context ) } ` ) ;
314316
315317 const flagsStorage = await this . getFlagsFromStorage ( checkedContext . canonicalKey ) ;
@@ -340,7 +342,7 @@ export default class LDClientImpl implements LDClient {
340342 this . createStreamListeners ( context , checkedContext . canonicalKey , identifyResolve ) ,
341343 this . diagnosticsManager ,
342344 ( e ) => {
343- this . logger . error ( e ) ;
345+ identifyReject ( e ) ;
344346 this . emitter . emit ( 'error' , context , e ) ;
345347 } ,
346348 ) ;
@@ -387,12 +389,12 @@ export default class LDClientImpl implements LDClient {
387389
388390 track ( key : string , data ?: any , metricValue ?: number ) : void {
389391 if ( ! this . context ) {
390- this . logger ? .warn ( ClientMessages . missingContextKeyNoEvent ) ;
392+ this . logger . warn ( ClientMessages . missingContextKeyNoEvent ) ;
391393 return ;
392394 }
393395 const checkedContext = Context . fromLDContext ( this . context ) ;
394396 if ( ! checkedContext . valid ) {
395- this . logger ? .warn ( ClientMessages . missingContextKeyNoEvent ) ;
397+ this . logger . warn ( ClientMessages . missingContextKeyNoEvent ) ;
396398 return ;
397399 }
398400
@@ -408,7 +410,7 @@ export default class LDClientImpl implements LDClient {
408410 typeChecker ?: ( value : any ) => [ boolean , string ] ,
409411 ) : LDFlagValue {
410412 if ( ! this . context ) {
411- this . logger ? .debug ( ClientMessages . missingContextKeyNoEvent ) ;
413+ this . logger . debug ( ClientMessages . missingContextKeyNoEvent ) ;
412414 return createErrorEvaluationDetail ( ErrorKinds . UserNotSpecified , defaultValue ) ;
413415 }
414416
@@ -420,7 +422,6 @@ export default class LDClientImpl implements LDClient {
420422 const error = new LDClientError (
421423 `Unknown feature flag "${ flagKey } "; returning default value ${ defVal } .` ,
422424 ) ;
423- this . logger . error ( error ) ;
424425 this . emitter . emit ( 'error' , this . context , error ) ;
425426 this . eventProcessor ?. sendEvent (
426427 this . eventFactoryDefault . unknownFlagEvent ( flagKey , defVal , evalContext ) ,
@@ -446,7 +447,6 @@ export default class LDClientImpl implements LDClient {
446447 const error = new LDClientError (
447448 `Wrong type "${ type } " for feature flag "${ flagKey } "; returning default value` ,
448449 ) ;
449- this . logger . error ( error ) ;
450450 this . emitter . emit ( 'error' , this . context , error ) ;
451451 return createErrorEvaluationDetail ( ErrorKinds . WrongType , defaultValue ) ;
452452 }
0 commit comments