Skip to content

Commit 2a1d19e

Browse files
committed
fix js appmessage ack/nack events/callbacks
1 parent 5ba70dd commit 2a1d19e

File tree

3 files changed

+19
-10
lines changed

3 files changed

+19
-10
lines changed

android/shared/src/androidMain/kotlin/io/rebble/cobble/shared/js/WebViewPrivatePKJSInterface.kt

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@ import io.rebble.cobble.shared.data.js.fromDevice
99
import io.rebble.cobble.shared.database.dao.LockerDao
1010
import io.rebble.cobble.shared.domain.state.ConnectionStateManager
1111
import io.rebble.cobble.shared.domain.state.watchOrNull
12-
import kotlinx.coroutines.CoroutineScope
12+
import kotlinx.coroutines.*
1313
import kotlinx.coroutines.flow.MutableSharedFlow
14-
import kotlinx.coroutines.launch
1514
import kotlinx.serialization.encodeToString
1615
import kotlinx.serialization.json.Json
1716
import org.koin.core.component.KoinComponent
1817
import org.koin.core.component.inject
18+
import kotlin.time.Duration.Companion.seconds
1919

20-
class WebViewPrivatePKJSInterface(private val jsRunner: WebViewJsRunner, private val scope: CoroutineScope, private val outgoingAppMessages: MutableSharedFlow<String>): PrivatePKJSInterface, KoinComponent {
20+
class WebViewPrivatePKJSInterface(private val jsRunner: WebViewJsRunner, private val scope: CoroutineScope, private val outgoingAppMessages: MutableSharedFlow<Pair<CompletableDeferred<UByte>, String>>): PrivatePKJSInterface, KoinComponent {
2121
private val lockerDao: LockerDao by inject()
2222

2323
@JavascriptInterface
@@ -118,10 +118,17 @@ class WebViewPrivatePKJSInterface(private val jsRunner: WebViewJsRunner, private
118118
}
119119

120120
@JavascriptInterface
121-
fun sendAppMessageString(jsonAppMessage: String) {
121+
fun sendAppMessageString(jsonAppMessage: String): Int {
122122
Logging.v("sendAppMessageString")
123-
if (!outgoingAppMessages.tryEmit(jsonAppMessage)) {
123+
val completable = CompletableDeferred<UByte>()
124+
if (!outgoingAppMessages.tryEmit(Pair(completable, jsonAppMessage))) {
124125
Logging.e("Failed to emit outgoing AppMessage")
126+
error("Failed to emit outgoing AppMessage")
127+
}
128+
return runBlocking {
129+
withTimeout(10.seconds) {
130+
completable.await().toInt()
131+
}
125132
}
126133
}
127134

android/shared/src/commonMain/kotlin/io/rebble/cobble/shared/js/JsRunner.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package io.rebble.cobble.shared.js
22

33
import io.rebble.cobble.shared.domain.common.PebbleDevice
44
import io.rebble.libpebblecommon.metadata.pbw.appinfo.PbwAppInfo
5+
import kotlinx.coroutines.CompletableDeferred
56
import kotlinx.coroutines.flow.MutableSharedFlow
67
import kotlinx.coroutines.flow.asSharedFlow
78

@@ -13,6 +14,6 @@ abstract class JsRunner(val appInfo: PbwAppInfo, val jsPath: String, val device:
1314
abstract suspend fun signalAppMessageAck(data: String?): Boolean
1415
abstract suspend fun signalAppMessageNack(data: String?): Boolean
1516

16-
protected val _outgoingAppMessages = MutableSharedFlow<String>(extraBufferCapacity = 1)
17+
protected val _outgoingAppMessages = MutableSharedFlow<Pair<CompletableDeferred<UByte>, String>>(extraBufferCapacity = 1)
1718
val outgoingAppMessages = _outgoingAppMessages.asSharedFlow()
1819
}

android/shared/src/commonMain/kotlin/io/rebble/cobble/shared/js/PKJSApp.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class PKJSApp(val uuid: Uuid): KoinComponent {
4747
Logging.v("Ignoring app message for different app: ${it.uuid.get()} != $uuid")
4848
return@onEach
4949
}
50-
Logging.d("Received app message: $it")
50+
Logging.d("Received app message: ${it::class.simpleName} ${it.transactionId}")
5151
withTimeout(1000) {
5252
device.outgoingAppMessages.emit(OutgoingMessage.Ack(AppMessage.AppMessageACK(it.transactionId.get())))
5353
}
@@ -59,11 +59,12 @@ class PKJSApp(val uuid: Uuid): KoinComponent {
5959
}.catch {
6060
Logging.e("Error receiving app message", it)
6161
}.launchIn(scope)
62-
jsRunner?.outgoingAppMessages?.onEach {
63-
Logging.d("Sending app message: $it")
64-
val appMessage = AppMessage.fromJSDataString(it, appInfo)
62+
jsRunner?.outgoingAppMessages?.onEach { (tIDDeferred, data) ->
63+
Logging.d("Sending app message: $data")
64+
val appMessage = AppMessage.fromJSDataString(data, appInfo)
6565
val tID = device.appMessageTransactionSequence.next()
6666
appMessage.transactionId.set(tID)
67+
tIDDeferred.complete(tID)
6768
device.appMessageService.send(appMessage)
6869
}?.catch {
6970
Logging.e("Error sending app message", it)

0 commit comments

Comments
 (0)