nextcloud / nextcloud/talk-android
MCU call stuck on spinner forever when subscriber setup fails ("client_not_found"); requestoffer is never retried
Nobody has claimed this yet.
- Dominant language
- Kotlin
- Stars
- 739
- Forks
- 321
- Avg merge
- 14h 59m
- Merged PRs (30d)
- 151
Description
Steps to reproduce
Observed live on a real call (Android Talk v24.0.3, HPB + Janus, spreed 24.0.4):
- Participant A (Firefox) joins a call but its publisher on the MCU never comes up (e.g. getUserMedia never resolves, or a Janus-side failure)
- Participant B (Android) joins the call — its own publisher connects fine
- Android sends
requestofferto subscribe to A's stream
Expected behaviour
If subscribing fails, Android retries (with backoff) and/or shows an error state. When A's publisher appears later, B starts receiving the stream.
Actual behaviour
The HPB answers {"type":"error","error":{"code":"client_not_found","message":"No MCU client found to send message to."}} (after the 10 s mcuTimeout). The Android app logs the error and does nothing else: WebSocketInstance.processErrorMessage only handles no_such_session and hello_expected; every other error code is dropped. requestoffer is sent exactly once, when the subscriber PeerConnectionWrapper is constructed (PeerConnectionWrapper.java ctor, hasMCU && "video".equals(videoStreamType) branch) and is never retried. The call UI shows the connecting spinner forever.
The same silent-death happens if the requestoffer response is simply lost during a reconnect — no error is even received.
Device brand and model
Samsung Galaxy S25 Ultra
Android version
16
Nextcloud Talk app version
master
Nextcloud server version
34.0.3
Talk version
24.0.4
Custom Signaling server configured
Yes (specify version in Additional Information)
Custom TURN server configured
Yes
Custom STUN server configured
Yes
Android logs
Client (logcat, 11:32 phone time):
WebSocketInstance: Received error: {"type":"error","error":{"code":"client_not_found","message":"No MCU client found to send message to."}}
Server log
Server (HPB, 08:32 UTC — 10 s after join):
hub.go:2978: Could not create MCU subscriber for session k5l5… to send
{"type":"requestoffer","sid":"","roomType":"video","payload":null} to o8VN…: context deadline exceeded
The Android publisher itself was fully established (Janus: "DTLS handshake completed", "WebRTC media is now available") — only the subscriber setup failed, and nothing recovered it.
Additional information
No response
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with PeerConnectionWrapper.java's constructor and its hasMCU && "video".equals(videoStreamType) branch, then trace WebSocketInstance.processErrorMessage and the requestoffer flow. Define how failed or lost requestoffer responses are retried with backoff, and verify that the subscriber leaves the spinner and receives the stream when the publisher becomes available.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- android, kotlin
- Domain
- audio-video-rtc, mobile
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 55/100