nextcloud / nextcloud/talk-android

MCU call stuck on spinner forever when subscriber setup fails ("client_not_found"); requestoffer is never retried

Open
#6,548 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

0. Needs triage bug
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):

  1. 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)
  2. Participant B (Android) joins the call — its own publisher connects fine
  3. Android sends requestoffer to 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

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.