@@ -3,15 +3,17 @@ import LaunchDarkly
33
44@objc ( LaunchdarklyReactNativeClient)
55class LaunchdarklyReactNativeClient : RCTEventEmitter {
6- private var listenerKeys : [ String : LDObserverOwner ] = [ : ]
7-
86 private let FLAG_PREFIX = " LaunchDarkly-Flag- "
97 private let ALL_FLAGS_PREFIX = " LaunchDarkly-All-Flags- "
108 private let CONNECTION_MODE_PREFIX = " LaunchDarkly-Connection-Mode- "
119 private let ERROR_INIT = " E_INITIALIZE "
1210 private let ERROR_IDENTIFY = " E_IDENTIFY "
1311 private let ERROR_UNKNOWN = " E_UNKNOWN "
14-
12+
13+ private var flagListenerOwners : [ String : ObserverOwner ] = [ : ]
14+ private var allFlagsListenerOwners : [ String : ObserverOwner ] = [ : ]
15+ private var connectionModeListenerOwners : [ String : ObserverOwner ] = [ : ]
16+
1517 override func supportedEvents( ) -> [ String ] ! {
1618 return [ FLAG_PREFIX, ALL_FLAGS_PREFIX, CONNECTION_MODE_PREFIX]
1719 }
@@ -89,6 +91,7 @@ class LaunchdarklyReactNativeClient: RCTEventEmitter {
8991 configField ( & ldConfig. allUserAttributesPrivate, config [ " allUserAttributesPrivate " ] , id)
9092 configField ( & ldConfig. autoAliasingOptOut, config [ " autoAliasingOptOut " ] , id)
9193 configField ( & ldConfig. inlineUserInEvents, config [ " inlineUsersInEvents " ] , id)
94+ configField ( & ldConfig. privateUserAttributes, config [ " privateAttributeNames " ] , id)
9295
9396 if let val = config [ " secondaryMobileKeys " ] as? [ String : String ] {
9497 try ! ldConfig. setSecondaryMobileKeys ( val)
@@ -382,53 +385,56 @@ class LaunchdarklyReactNativeClient: RCTEventEmitter {
382385
383386 @objc func registerFeatureFlagListener( _ flagKey: String , environment: String ) -> Void {
384387 let multiListenerId = envConcat ( environment: environment, identifier: flagKey)
385- let flagChangeOwner = multiListenerId as LDObserverOwner
386- listenerKeys [ multiListenerId] = flagChangeOwner
387- LDClient . get ( environment: environment) !. observe ( key: flagKey, owner: flagChangeOwner , handler : { changedFlag in
388+ let owner = ObserverOwner ( )
389+ flagListenerOwners [ multiListenerId] = owner
390+ LDClient . get ( environment: environment) !. observe ( key: flagKey, owner: owner ) { changedFlag in
388391 if self . bridge != nil {
389392 self . sendEvent ( withName: self . FLAG_PREFIX, body: [ " flagKey " : changedFlag. key, " listenerId " : multiListenerId] )
390393 }
391- } )
392- }
393-
394- private func unregisterListener( _ key: String , _ environment: String ) -> Void {
395- let multiListenerId = envConcat ( environment: environment, identifier: key)
396- let owner = multiListenerId as LDObserverOwner
397- if listenerKeys. removeValue ( forKey: multiListenerId) != nil {
398- LDClient . get ( environment: environment) !. stopObserving ( owner: owner)
399394 }
400395 }
401396
402397 @objc func unregisterFeatureFlagListener( _ flagKey: String , environment: String ) -> Void {
403- unregisterListener ( flagKey, environment)
398+ let multiListenerId = envConcat ( environment: environment, identifier: flagKey)
399+ if let owner = flagListenerOwners. removeValue ( forKey: multiListenerId) {
400+ LDClient . get ( environment: environment) !. stopObserving ( owner: owner)
401+ }
404402 }
405403
406404 @objc func registerCurrentConnectionModeListener( _ listenerId: String , environment: String ) -> Void {
407405 let multiListenerId = envConcat ( environment: environment, identifier: listenerId)
408- let currentConnectionModeOwner = multiListenerId as LDObserverOwner
409- LDClient . get ( environment: environment) !. observeCurrentConnectionMode ( owner: currentConnectionModeOwner, handler: { connectionMode in
406+ let owner = ObserverOwner ( )
407+ connectionModeListenerOwners [ multiListenerId] = owner
408+ LDClient . get ( environment: environment) !. observeCurrentConnectionMode ( owner: owner) { connectionMode in
410409 if self . bridge != nil {
411410 self . sendEvent ( withName: self . CONNECTION_MODE_PREFIX, body: [ " connectionMode " : connectionMode, " listenerId " : multiListenerId] )
412411 }
413- } )
412+ }
414413 }
415414
416415 @objc func unregisterCurrentConnectionModeListener( _ listenerId: String , environment: String ) -> Void {
417- unregisterListener ( listenerId, environment)
416+ let multiListenerId = envConcat ( environment: environment, identifier: listenerId)
417+ if let owner = connectionModeListenerOwners. removeValue ( forKey: multiListenerId) {
418+ LDClient . get ( environment: environment) !. stopObserving ( owner: owner)
419+ }
418420 }
419421
420422 @objc func registerAllFlagsListener( _ listenerId: String , environment: String ) -> Void {
421423 let multiListenerId = envConcat ( environment: environment, identifier: listenerId)
422- let flagChangeOwner = multiListenerId as LDObserverOwner
423- LDClient . get ( environment: environment) !. observeAll ( owner: flagChangeOwner, handler: { changedFlags in
424+ let owner = ObserverOwner ( )
425+ allFlagsListenerOwners [ multiListenerId] = owner
426+ LDClient . get ( environment: environment) !. observeAll ( owner: owner) { changedFlags in
424427 if self . bridge != nil {
425428 self . sendEvent ( withName: self . ALL_FLAGS_PREFIX, body: [ " flagKeys " : Array ( changedFlags. keys) , " listenerId " : multiListenerId] )
426429 }
427- } )
430+ }
428431 }
429432
430433 @objc func unregisterAllFlagsListener( _ listenerId: String , environment: String ) -> Void {
431- unregisterListener ( listenerId, environment)
434+ let multiListenerId = envConcat ( environment: environment, identifier: listenerId)
435+ if let owner = allFlagsListenerOwners. removeValue ( forKey: multiListenerId) {
436+ LDClient . get ( environment: environment) !. stopObserving ( owner: owner)
437+ }
432438 }
433439
434440 @objc func isInitialized( _ environment: String , resolve: RCTPromiseResolveBlock , reject: RCTPromiseRejectBlock ) -> Void {
@@ -442,6 +448,8 @@ class LaunchdarklyReactNativeClient: RCTEventEmitter {
442448 }
443449}
444450
451+ class ObserverOwner { }
452+
445453extension NSDictionary {
446454 @objc var swiftDictionary : Dictionary < String , Any > {
447455 var swiftDictionary = Dictionary < String , Any > ( )
0 commit comments