Skip to content

MISSING_MATRIX_RTC_TRANSPORT due to CORS preflight failure for /sfu/get #5387

Description

@CyberWarr

Steps to reproduce

  1. Configure a self-hosted Matrix homeserver with LiveKit and lk-jwt-service according to the official Element Call documentation. The .well-known/matrix/client file is correctly configured with org.matrix.msc4143.rtc_foci pointing to the JWT service.
  2. Install Element X for iOS (version 26.04.0) from the App Store and log in to the self-hosted server.
  3. Open an existing room or create a new one (tested with both 1:1 DM rooms and group rooms with 3+ participants).
  4. Press the "Call" button in the room header.
  5. Observe that call notifications are delivered to other participants' devices (both iOS and Android), confirming that the call signaling event is successfully sent through the homeserver.

Outcome

What did you expect?

A successful call should be established. The client should fetch an OpenID token, then request a JWT from the JWT service (/sfu/get), and finally connect to the LiveKit SFU.

What happened instead?

The call immediately fails with a red error banner displaying: MISSING_MATRIX_RTC_TRANSPORT ("The server is not configured to work with Element Call").

What did you expect?
A successful call should be established. The client should fetch an OpenID token, then request a JWT from the JWT service (/sfu/get), and finally connect to the LiveKit SFU.

What happened instead?
The call immediately fails with a red error banner displaying: MISSING_MATRIX_RTC_TRANSPORT ("The server is not configured to work with Element Call").

ERROR elementx: Failed toggling call microphone with error: Error Domain=com.apple.CallKit.error.requesttransaction Code=4 "(null)"

Analysis and Evidence
Crucially, the server-side configuration is fully functional for other clients:

✅ Element Web (tested in Chrome/Edge) works perfectly.

✅ Element X for Android (version 26.04.2) works perfectly.

This definitively proves the issue is isolated to the Element X iOS client.

Key evidence from Nginx access logs for the JWT service:

Android Client (working):

text
IP_ANDROID - - [DATE] "OPTIONS /sfu/get HTTP/2.0" 204 0
IP_ANDROID - - [DATE] "POST /sfu/get HTTP/2.0" 200 464
iOS Client (failing):

text
IP_IOS - - [DATE] "OPTIONS /sfu/get HTTP/2.0" 204 0
IP_IOS - - [DATE] "OPTIONS /sfu/get HTTP/2.0" 204 0
// NO POST REQUEST IS EVER MADE
Key evidence from the latest iOS client log (console.2026-04-12-17.log):

The client successfully fetches an OpenID token:
DEBUG matrix_sdk::http_client: Got response ... POST /_matrix/client/v3/user/*/openid/request_token ... 200

It logs the intent to get a JWT:
INFO elementx: [ElementCall]: [LocalTransport] Trying to get JWT for focus https://call.my-domain/...

No network request to call.my-domain/sfu/get is logged or visible on the server.

The error occurs immediately after:
ERROR elementx: [ElementCall]: {"code":"MISSING_MATRIX_RTC_TRANSPORT"...}

Developer Mode Information (from iOS app):

Element Call version: embedded-v0.17.0

MatrixRTC mode: Active (Legacy: state events & oldest membership SFU)

Your phone model

simulator iphones and real iphone 14-15-16-17-17pro

Operating system version

18.77 - 26.4.1

Application version

26.04.0 (223) - 26.04.1 (1190)

Homeserver

1.151.0

Will you send logs?

Yes

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions