diff --git a/.pubnub.yml b/.pubnub.yml
index b79284b81..b39d0151e 100644
--- a/.pubnub.yml
+++ b/.pubnub.yml
@@ -1,9 +1,9 @@
name: kotlin
-version: 10.5.3
+version: 10.5.4
schema: 1
scm: github.com/pubnub/kotlin
files:
- - build/libs/pubnub-kotlin-10.5.3-all.jar
+ - build/libs/pubnub-kotlin-10.5.4-all.jar
sdks:
-
type: library
@@ -23,8 +23,8 @@ sdks:
-
distribution-type: library
distribution-repository: maven
- package-name: pubnub-kotlin-10.5.3
- location: https://repo.maven.apache.org/maven2/com/pubnub/pubnub-kotlin/10.5.3/pubnub-kotlin-10.5.3.jar
+ package-name: pubnub-kotlin-10.5.4
+ location: https://repo.maven.apache.org/maven2/com/pubnub/pubnub-kotlin/10.5.4/pubnub-kotlin-10.5.4.jar
supported-platforms:
supported-operating-systems:
Android:
@@ -121,6 +121,11 @@ sdks:
license-url: https://www.apache.org/licenses/LICENSE-2.0.txt
is-required: Required
changelog:
+ - date: 2025-07-21
+ version: v10.5.4
+ changes:
+ - type: bug
+ text: "Internal change - expose reconnect and disconnect in KMP ."
- date: 2025-07-15
version: v10.5.3
changes:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 30c1ec4b4..ad2e2177c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,9 @@
+## v10.5.4
+July 21 2025
+
+#### Fixed
+- Internal change - expose reconnect and disconnect in KMP .
+
## v10.5.3
July 15 2025
diff --git a/README.md b/README.md
index 934c2ada6..96789f151 100644
--- a/README.md
+++ b/README.md
@@ -20,7 +20,7 @@ You will need the publish and subscribe keys to authenticate your app. Get your
com.pubnub
pubnub-kotlin
- 10.5.3
+ 10.5.4
```
diff --git a/gradle.properties b/gradle.properties
index c11d1e77a..507d92079 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -18,7 +18,7 @@ RELEASE_SIGNING_ENABLED=true
SONATYPE_HOST=DEFAULT
SONATYPE_AUTOMATIC_RELEASE=false
GROUP=com.pubnub
-VERSION_NAME=10.5.3
+VERSION_NAME=10.5.4
POM_PACKAGING=jar
POM_NAME=PubNub SDK
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 374b8144e..483130197 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -13,7 +13,7 @@ dokka = "2.0.0"
kotlinx_datetime = "0.6.2"
kotlinx_coroutines = "1.10.2"
pubnub_js = "8.6.0"
-pubnub_swift = "9.2.0"
+pubnub_swift = "9.2.2"
[libraries]
retrofit2 = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit2" }
diff --git a/pubnub-kotlin/pubnub-kotlin-api/config/ktlint/baseline.xml b/pubnub-kotlin/pubnub-kotlin-api/config/ktlint/baseline.xml
index fb3ecdb71..7f53a4281 100644
--- a/pubnub-kotlin/pubnub-kotlin-api/config/ktlint/baseline.xml
+++ b/pubnub-kotlin/pubnub-kotlin-api/config/ktlint/baseline.xml
@@ -8,34 +8,28 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
@@ -43,12 +37,11 @@
+
+
-
-
-
@@ -80,5 +73,10 @@
+
+
+
+
+
diff --git a/pubnub-kotlin/pubnub-kotlin-api/src/appleMain/kotlin/com/pubnub/api/PubNubImpl.kt b/pubnub-kotlin/pubnub-kotlin-api/src/appleMain/kotlin/com/pubnub/api/PubNubImpl.kt
index 36edaf577..7a3673e4e 100644
--- a/pubnub-kotlin/pubnub-kotlin-api/src/appleMain/kotlin/com/pubnub/api/PubNubImpl.kt
+++ b/pubnub-kotlin/pubnub-kotlin-api/src/appleMain/kotlin/com/pubnub/api/PubNubImpl.kt
@@ -10,6 +10,7 @@ import cocoapods.PubNubSwift.channelMetadataWith
import cocoapods.PubNubSwift.channelWith
import cocoapods.PubNubSwift.disconnect
import cocoapods.PubNubSwift.getToken
+import cocoapods.PubNubSwift.reconnectWithTimetoken
import cocoapods.PubNubSwift.removeAllListeners
import cocoapods.PubNubSwift.removeEventListenerWithListener
import cocoapods.PubNubSwift.removeStatusListenerWithListener
@@ -1061,4 +1062,12 @@ class PubNubImpl(private val pubNubObjC: KMPPubNub) : PubNub {
fileId = fileId
)
}
+
+ override fun disconnect() {
+ pubNubObjC.disconnect()
+ }
+
+ override fun reconnect(timetoken: Long) {
+ pubNubObjC.reconnectWithTimetoken(platform.Foundation.NSNumber(unsignedLongLong = timetoken.toULong()))
+ }
}
diff --git a/pubnub-kotlin/pubnub-kotlin-api/src/commonMain/kotlin/com/pubnub/api/PubNub.kt b/pubnub-kotlin/pubnub-kotlin-api/src/commonMain/kotlin/com/pubnub/api/PubNub.kt
index 2a0a6b351..ee388d74c 100644
--- a/pubnub-kotlin/pubnub-kotlin-api/src/commonMain/kotlin/com/pubnub/api/PubNub.kt
+++ b/pubnub-kotlin/pubnub-kotlin-api/src/commonMain/kotlin/com/pubnub/api/PubNub.kt
@@ -554,4 +554,8 @@ expect interface PubNub {
): SubscriptionSet
fun parseToken(token: String): PNToken
+
+ fun reconnect(timetoken: Long = 0L)
+
+ fun disconnect()
}
diff --git a/pubnub-kotlin/pubnub-kotlin-api/src/jsMain/kotlin/Pubnub.d.kt b/pubnub-kotlin/pubnub-kotlin-api/src/jsMain/kotlin/Pubnub.d.kt
index 4326ed99a..b31983b38 100644
--- a/pubnub-kotlin/pubnub-kotlin-api/src/jsMain/kotlin/Pubnub.d.kt
+++ b/pubnub-kotlin/pubnub-kotlin-api/src/jsMain/kotlin/Pubnub.d.kt
@@ -205,7 +205,9 @@ open external class PubNub(config: Any /* UUID | UserId */) {
open fun stop()
- open fun reconnect()
+ open fun reconnect(params: ReconnectParameters)
+
+ open fun disconnect()
open fun addListener(params: ListenerParameters)
@@ -745,6 +747,10 @@ open external class PubNub(config: Any /* UUID | UserId */) {
val objects: ((objectEvent: BaseObjectsEvent) -> Unit)?
}
+ interface ReconnectParameters {
+ var timetoken: String?
+ }
+
interface StatusListenerParameters {
val status: ((statusEvent: StatusEvent) -> Unit)?
}
diff --git a/pubnub-kotlin/pubnub-kotlin-api/src/jsMain/kotlin/com/pubnub/api/PubNubImpl.kt b/pubnub-kotlin/pubnub-kotlin-api/src/jsMain/kotlin/com/pubnub/api/PubNubImpl.kt
index 9c6e3bfe8..6fd8a1444 100644
--- a/pubnub-kotlin/pubnub-kotlin-api/src/jsMain/kotlin/com/pubnub/api/PubNubImpl.kt
+++ b/pubnub-kotlin/pubnub-kotlin-api/src/jsMain/kotlin/com/pubnub/api/PubNubImpl.kt
@@ -195,6 +195,14 @@ class PubNubImpl(val jsPubNub: PubNubJs) : PubNub {
)
}
+ override fun reconnect(timetoken: Long) {
+ jsPubNub.reconnect(createJsObject { this.timetoken = timetoken.toString() })
+ }
+
+ override fun disconnect() {
+ jsPubNub.disconnect()
+ }
+
override fun fire(channel: String, message: Any, meta: Any?, usePost: Boolean): Publish {
return FireImpl(
jsPubNub,
diff --git a/pubnub-kotlin/pubnub-kotlin-api/src/jvmMain/kotlin/com/pubnub/api/PubNub.kt b/pubnub-kotlin/pubnub-kotlin-api/src/jvmMain/kotlin/com/pubnub/api/PubNub.kt
index a32f830d9..e0fb0a88e 100644
--- a/pubnub-kotlin/pubnub-kotlin-api/src/jvmMain/kotlin/com/pubnub/api/PubNub.kt
+++ b/pubnub-kotlin/pubnub-kotlin-api/src/jvmMain/kotlin/com/pubnub/api/PubNub.kt
@@ -263,14 +263,14 @@ actual interface PubNub : StatusEmitter, EventEmitter {
*
* @param timetoken optional timetoken to use for the subscriptions on reconnection.
*/
- fun reconnect(timetoken: Long = 0L)
+ actual fun reconnect(timetoken: Long)
/**
* Cancel any subscribe and heartbeat loops or ongoing re-connections.
*
* Monitor the results in [SubscribeCallback.status]
*/
- fun disconnect()
+ actual fun disconnect()
/**
* Unsubscribe from all channels and all channel groups.
diff --git a/pubnub-kotlin/pubnub-kotlin-api/src/nonJvm/kotlin/com/pubnub/api/PubNub.nonJvm.kt b/pubnub-kotlin/pubnub-kotlin-api/src/nonJvm/kotlin/com/pubnub/api/PubNub.nonJvm.kt
index ade42391e..20dc62ab1 100644
--- a/pubnub-kotlin/pubnub-kotlin-api/src/nonJvm/kotlin/com/pubnub/api/PubNub.nonJvm.kt
+++ b/pubnub-kotlin/pubnub-kotlin-api/src/nonJvm/kotlin/com/pubnub/api/PubNub.nonJvm.kt
@@ -518,4 +518,8 @@ actual interface PubNub {
ttl: Int?,
customMessageType: String?
): Publish
+
+ actual fun reconnect(timetoken: Long)
+
+ actual fun disconnect()
}
diff --git a/pubnub-kotlin/pubnub-kotlin-impl/src/test/kotlin/com/pubnub/api/legacy/PubNubImplTest.kt b/pubnub-kotlin/pubnub-kotlin-impl/src/test/kotlin/com/pubnub/api/legacy/PubNubImplTest.kt
index e1aba787b..1a6da7c17 100644
--- a/pubnub-kotlin/pubnub-kotlin-impl/src/test/kotlin/com/pubnub/api/legacy/PubNubImplTest.kt
+++ b/pubnub-kotlin/pubnub-kotlin-impl/src/test/kotlin/com/pubnub/api/legacy/PubNubImplTest.kt
@@ -56,7 +56,7 @@ class PubNubImplTest : BaseTest() {
fun getVersionAndTimeStamp() {
val version = PubNubImpl.SDK_VERSION
val timeStamp = PubNubImpl.timestamp()
- assertEquals("10.5.3", version)
+ assertEquals("10.5.4", version)
assertTrue(timeStamp > 0)
}