Как мне получить сообщение от прослушивателя websocket в другой класс?

#kotlin #webrtc #kotlin-coroutines

Вопрос:

В настоящее время я пытаюсь открыть канал связи WebRTC между Raspberry Pi и мобильным устройством. Приложение разрабатывается в Котлине на основе существующей демо-версии: https://github.com/shepeliev/webrtc-kmp-demo.

Для сервера сигнализации я использовал код из следующего примера: https://kotlinlang.org/docs/mobile/connect-to-platform-specific-apis.html#example-send-and-receive-messages-from-a-websocket

Это та часть кода, с которой у меня возникли проблемы:

                 appSocket.messageListener = {
                    Log.d(tag,"Mensagem recebida: $it")
                    msg = Json.decodeFromString(it)

                    when(msg.what){
                        "offer" -> {
                            val description = SessionDescription(SessionDescriptionType.Offer, msg.data)

                            localPeerConnection?.setRemoteDescription(description)
                            val answer = localPeerConnection?.createAnswer(OfferAnswerOptions())
                            Log.d(tag, "Answer to raspPi is: $answer")
                            appSocket.send(Json.encodeToString(answer))
                            localPeerConnection?.setLocalDescription(answer!!)

                        }
                    }
                }
 

Каждый раз, когда я получаю сообщение, мне нужны эти функции в операторе when, но они взяты из другого контекста и могут вызываться только внутри области сопрограммы. Я получаю ошибку: Suspension functions can be called only within coroutine body . Тело сопрограммы находится за пределами appSocket.messageListener .

Я должен добавить, чтобы уточнить, что localPeerConnection?.setRemoteDescription(description) localPeerConnection?.createAnswer(OfferAnswerOptions()) и localPeerConnection?.setLocalDescription(answer!!) являются рассматриваемыми функциями приостановки. Если я напишу код так:

                 appSocket.messageListener = {
                    Log.d(tag,"Mensagem recebida: $it")
                    msg = Json.decodeFromString(it)

                }
                when(msg.what){
                    "offer" -> {
                        val description = SessionDescription(SessionDescriptionType.Offer, msg.data)

                        localPeerConnection?.setRemoteDescription(description)
                        val answer = localPeerConnection?.createAnswer(OfferAnswerOptions())
                        Log.d(tag, "Answer to raspPi is: $answer")
                        appSocket.send(Json.encodeToString(answer))
                        localPeerConnection?.setLocalDescription(answer!!)

                        }
                    }
 

функции приостановки вызываются правильно, но не выполняют работу, когда я получаю сообщение websocket. Есть ли какой-нибудь способ, которым я могу прослушивать каждый раз appSocket.messagelistener , когда получаю сообщение, и when активировать инструкцию? Или я могу каким-то образом унаследовать контекст сопрограммы внутри appSocket.messagelistener и иметь when там оператор?

Спасибо вам за вашу помощь.

Комментарии:

1. Я не знаю, какая функция приостановлена в вашем примере, но вам нужно запустить ее в сопрограмме, в зависимости от функции это должна быть ваша сетевая или веб-сокетная сопрограмма или что-то еще.