From 1151263bd42629d80b862d87af6285a235d9ce5d Mon Sep 17 00:00:00 2001 From: Alessio Emireni Date: Mon, 10 Jul 2023 15:11:59 +0200 Subject: [PATCH] fix(phone-as-device): app-478 app-479 fix NPE client is non connected --- README.md | 8 ++++++ .../reactnative/mqtt/RNMqttClient.kt | 25 +++++++++++++++++++ ios/MqttClient.m | 2 ++ ios/MqttClient.swift | 25 ++++++++++++++++++- package.json | 2 +- src/index.tsx | 13 ++++++++++ 6 files changed, 73 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index de14d5a..4a44060 100644 --- a/README.md +++ b/README.md @@ -128,6 +128,14 @@ To handle messages in the subscribed topic, you have to handle a [`receive-messa MqttClient.disconnect(); ``` +### Check if client is connected to an MQTT Broker + +`MqttClient.isConnected` checks if client is connected to an MQTT Broker. + +```js +MqttClient.isConnected(); +``` + ### Loading an identity An identity stored in a device specific key store by `MqttClient.setIdentity` may be loaded by `MqttClient.loadIdentity`. diff --git a/android/src/main/java/com/github/emotokcak/reactnative/mqtt/RNMqttClient.kt b/android/src/main/java/com/github/emotokcak/reactnative/mqtt/RNMqttClient.kt index 527586a..0e33f50 100644 --- a/android/src/main/java/com/github/emotokcak/reactnative/mqtt/RNMqttClient.kt +++ b/android/src/main/java/com/github/emotokcak/reactnative/mqtt/RNMqttClient.kt @@ -537,6 +537,31 @@ class RNMqttClient(reactContext: ReactApplicationContext) } } + /** + * Determines if this client is currently connected to the server. + * Returns: true if connected, false otherwise. + * + * @param promise + * + * Resolved when check connection has done. + */ + @ReactMethod + fun isConnected(promise: Promise) { + val client = this.client + if (client == null) { + promise.resolve(false) + return + } + try { + val isClientConnected = client.isConnected + promise.resolve(isClientConnected) + } catch (e: Exception) { + Log.e(NAME, "failed to check connection", e) + promise.reject("ERROR_CHECK_CONNECTION", e) + return + } + } + // Notifies a `got-error` event. private fun notifyError(code: String, cause: Throwable?) { val params = Arguments.createMap() diff --git a/ios/MqttClient.m b/ios/MqttClient.m index d3e8d93..3876ecf 100644 --- a/ios/MqttClient.m +++ b/ios/MqttClient.m @@ -12,6 +12,8 @@ @interface RCT_EXTERN_MODULE(MqttClient, NSObject) RCT_EXTERN_METHOD(connect:(NSDictionary*)params resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) +RCT_EXTERN_METHOD(isConnected:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) + RCT_EXTERN_METHOD(disconnect) RCT_EXTERN_METHOD(publish:(NSString*)topic payload:(NSArray*)payload resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) diff --git a/ios/MqttClient.swift b/ios/MqttClient.swift index 6493a86..9354a39 100644 --- a/ios/MqttClient.swift +++ b/ios/MqttClient.swift @@ -324,7 +324,30 @@ class MqttClient : RCTEventEmitter { _ = self.client!.connect() resolve(nil) } - + + @objc(isConnected:reject:) + func isConnected(resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) -> Void + { + os_log("MqttClient: isConnected") + guard let client = self.client else { + resolve(false) + return + } + var isConnected: Bool + let connectionState = client.connState + switch connectionState { + case .connected: + isConnected = true + case .connecting: + isConnected = false + case .disconnected: + isConnected = false + default: + isConnected = false + } + resolve(isConnected) + } + @objc(disconnect) func disconnect() -> Void { os_log("MqttClient: disconnecting") diff --git a/package.json b/package.json index b908970..a8c764a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-mqtt-client", - "version": "0.2.0", + "version": "0.2.1", "description": "MQTT client for React Native", "main": "lib/commonjs/index", "module": "lib/module/index", diff --git a/src/index.tsx b/src/index.tsx index 8f3077f..9f0f470 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -182,6 +182,19 @@ export class MqttClient { return MqttClientImpl.subscribe(topic); } + /** + * Determines if this client is currently connected to the server + * + * @function isConnected + * + * @return {Promise} + * + * Resolved when check connection has done. + */ + isConnected(): Promise { + return MqttClientImpl.isConnected(); + } + /** * Listens for a given event from this client. *