Skip to content
This repository was archived by the owner on Oct 29, 2024. It is now read-only.

Commit

Permalink
Fix ownership handling for all flags and connection mode listeners on…
Browse files Browse the repository at this point in the history
… iOS. (#113)
  • Loading branch information
gwhelanLD authored Feb 25, 2022
1 parent a7b7f7f commit 5873f90
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 25 deletions.
2 changes: 1 addition & 1 deletion ManualTestApp/README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
## Manual testing application

Add your mobile key in `App.js`, `npx pod-install`, `yarn run <android|ios>`.
Add your mobile key in `App.js`, `npx yarn install`, `npx pod-install`, `npx yarn run <android|ios>`.
2 changes: 1 addition & 1 deletion ManualTestApp/yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -3137,7 +3137,7 @@ kleur@^3.0.3:
integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==

"launchdarkly-react-native-client-sdk@file:..":
version "5.1.1"
version "6.0.0"

leven@^3.1.0:
version "3.1.0"
Expand Down
53 changes: 30 additions & 23 deletions ios/LaunchdarklyReactNativeClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,17 @@ import LaunchDarkly

@objc(LaunchdarklyReactNativeClient)
class LaunchdarklyReactNativeClient: RCTEventEmitter {
private var listenerKeys: [String:LDObserverOwner] = [:]

private let FLAG_PREFIX = "LaunchDarkly-Flag-"
private let ALL_FLAGS_PREFIX = "LaunchDarkly-All-Flags-"
private let CONNECTION_MODE_PREFIX = "LaunchDarkly-Connection-Mode-"
private let ERROR_INIT = "E_INITIALIZE"
private let ERROR_IDENTIFY = "E_IDENTIFY"
private let ERROR_UNKNOWN = "E_UNKNOWN"


private var flagListenerOwners: [String: ObserverOwner] = [:]
private var allFlagsListenerOwners: [String: ObserverOwner] = [:]
private var connectionModeListenerOwners: [String: ObserverOwner] = [:]

override func supportedEvents() -> [String]! {
return [FLAG_PREFIX, ALL_FLAGS_PREFIX, CONNECTION_MODE_PREFIX]
}
Expand Down Expand Up @@ -383,53 +385,56 @@ class LaunchdarklyReactNativeClient: RCTEventEmitter {

@objc func registerFeatureFlagListener(_ flagKey: String, environment: String) -> Void {
let multiListenerId = envConcat(environment: environment, identifier: flagKey)
let flagChangeOwner = multiListenerId as LDObserverOwner
listenerKeys[multiListenerId] = flagChangeOwner
LDClient.get(environment: environment)!.observe(key: flagKey, owner: flagChangeOwner, handler: { changedFlag in
let owner = ObserverOwner()
flagListenerOwners[multiListenerId] = owner
LDClient.get(environment: environment)!.observe(key: flagKey, owner: owner) { changedFlag in
if self.bridge != nil {
self.sendEvent(withName: self.FLAG_PREFIX, body: ["flagKey": changedFlag.key, "listenerId": multiListenerId])
}
})
}

private func unregisterListener(_ key: String, _ environment: String) -> Void {
let multiListenerId = envConcat(environment: environment, identifier: key)
let owner = multiListenerId as LDObserverOwner
if listenerKeys.removeValue(forKey: multiListenerId) != nil {
LDClient.get(environment: environment)!.stopObserving(owner: owner)
}
}

@objc func unregisterFeatureFlagListener(_ flagKey: String, environment: String) -> Void {
unregisterListener(flagKey, environment)
let multiListenerId = envConcat(environment: environment, identifier: flagKey)
if let owner = flagListenerOwners.removeValue(forKey: multiListenerId) {
LDClient.get(environment: environment)!.stopObserving(owner: owner)
}
}

@objc func registerCurrentConnectionModeListener(_ listenerId: String, environment: String) -> Void {
let multiListenerId = envConcat(environment: environment, identifier: listenerId)
let currentConnectionModeOwner = multiListenerId as LDObserverOwner
LDClient.get(environment: environment)!.observeCurrentConnectionMode(owner: currentConnectionModeOwner, handler: { connectionMode in
let owner = ObserverOwner()
connectionModeListenerOwners[multiListenerId] = owner
LDClient.get(environment: environment)!.observeCurrentConnectionMode(owner: owner) { connectionMode in
if self.bridge != nil {
self.sendEvent(withName: self.CONNECTION_MODE_PREFIX, body: ["connectionMode": connectionMode, "listenerId": multiListenerId])
}
})
}
}

@objc func unregisterCurrentConnectionModeListener(_ listenerId: String, environment: String) -> Void {
unregisterListener(listenerId, environment)
let multiListenerId = envConcat(environment: environment, identifier: listenerId)
if let owner = connectionModeListenerOwners.removeValue(forKey: multiListenerId) {
LDClient.get(environment: environment)!.stopObserving(owner: owner)
}
}

@objc func registerAllFlagsListener(_ listenerId: String, environment: String) -> Void {
let multiListenerId = envConcat(environment: environment, identifier: listenerId)
let flagChangeOwner = multiListenerId as LDObserverOwner
LDClient.get(environment: environment)!.observeAll(owner: flagChangeOwner, handler: { changedFlags in
let owner = ObserverOwner()
allFlagsListenerOwners[multiListenerId] = owner
LDClient.get(environment: environment)!.observeAll(owner: owner) { changedFlags in
if self.bridge != nil {
self.sendEvent(withName: self.ALL_FLAGS_PREFIX, body: ["flagKeys": Array(changedFlags.keys), "listenerId": multiListenerId])
}
})
}
}

@objc func unregisterAllFlagsListener(_ listenerId: String, environment: String) -> Void {
unregisterListener(listenerId, environment)
let multiListenerId = envConcat(environment: environment, identifier: listenerId)
if let owner = allFlagsListenerOwners.removeValue(forKey: multiListenerId) {
LDClient.get(environment: environment)!.stopObserving(owner: owner)
}
}

@objc func isInitialized(_ environment: String, resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) -> Void {
Expand All @@ -443,6 +448,8 @@ class LaunchdarklyReactNativeClient: RCTEventEmitter {
}
}

class ObserverOwner{}

extension NSDictionary {
@objc var swiftDictionary: Dictionary<String, Any> {
var swiftDictionary = Dictionary<String, Any>()
Expand Down

0 comments on commit 5873f90

Please sign in to comment.