-
Notifications
You must be signed in to change notification settings - Fork 12
Description
@Johennes im having a hard time getting room list diffs to show up through my sync. While everything appears to be setup correctly, sync state goes live, i can get a room list from client.rooms, for whatever reason i can't seem to get any diffs to come through. i am using app.element.io to login on the desktop with my test user from the app, and I create new rooms, join rooms, and yet no diffs. I have tried so many different approaches I thought it would be worth reaching out to see if there is something I am missing. Details below
✅ The setup
- We’re using
SlidingSyncVersion.Native()with a supported Synapse 1.114+ homeserver - All bindings come from the generated Uniffi
.d.tsfiles, with no hand-written glue - We are not using a proxy (no
Proxy()version) - Session is restored using
client.restoreSession()after a first-timeclient.login()or admin-API login - Sync is started via:
const builder = client.syncService().withCrossProcessLock();
const syncService = await builder.finish();
await syncService.start();- Room list stream is attached before
syncService.start():
const result = list.entriesWithDynamicAdapters(100, listener);
result.controller().setVisibleRange(0, 99);
const stream = result.entriesStream();🧭 Observed behavior
- We successfully reach
SyncServiceState.LIVEand see:RoomListServiceState.RunningSync indicator: HIDE
- Joined rooms are visible from
client.rooms() - The controller pointer is valid
- But
RoomListEntriesListener.onUpdate()never fires
Even after:
- Joining rooms from another client (Synapse reflects this)
- Sending messages to trigger reorder / activity
- Valid session lifecycle (saved after sync loop ran)
I'm confident the listener is registered and retained. The pointer values of all involved FFI structs (stream, controller, task handle) are valid and stable.
🔍 What we’ve tried
- Re-attaching stream after join
- Polling
client.rooms()to confirm room visibility - Ensuring
.setVisibleRange(...)is called beforestart() - Manually restarting sync after error
🛠️ What we’re looking for
I'm not sure if I'm missing a setup step, or if the Sliding Sync list needs to be explicitly created in a way the current bindings don't expose (e.g., .addList()).
📖 Logs
Not sure if anything in here is helpful. These logs show a user login, sync timeout (happens intermittenly), refresh and then full sync completion. Often times that first timeout doesnt happen, so i dont believe it is related to that. I'll also note that sometimes when I create a room on the web client, ill see the app show an error and SDK sync state move to 3.
(NOBRIDGE) LOG [MatrixServiceV2] initClient called
(NOBRIDGE) LOG [MatrixServiceV2] Found saved session, attempting to restore
(NOBRIDGE) LOG [MatrixServiceV2] Building client...
(NOBRIDGE) LOG [MatrixServiceV2] Restoring session...
(NOBRIDGE) LOG [MatrixServiceV2] Session restored successfully
(NOBRIDGE) LOG [SyncServiceManager] Initializing sync service builder...
(NOBRIDGE) LOG [SyncServiceManager] Configuring UTD hook...
(NOBRIDGE) LOG [AppNavigator] Rendering with states: {"initialLoading": false, "isNewAccount": false, "isRecoveryMode": false, "loading": false, "otpVerified": true, "syncState": "IDLE", "syncTimeout": false, "user": "7a152836-cea3-48e9-b7d1-052b7ec885e1"}
(NOBRIDGE) LOG [SyncServiceManager] Finishing sync service setup...
(NOBRIDGE) LOG [SyncServiceManager] Setting up state listener…
(NOBRIDGE) LOG [SyncServiceManager] Starting sync service...
(NOBRIDGE) LOG SS version: Native
(NOBRIDGE) LOG [SyncServiceManager] Setting up room list sync indicator...
(NOBRIDGE) LOG [SyncServiceManager] Sync service started successfully
(NOBRIDGE) LOG [SyncServiceManager] Joined rooms: ["!fhHppWMhhnVlJJGZWI:commune-server.ahmr.it", "!mqbrXiNCyhENpySlUK:commune-server.ahmr.it", "!seoHqUTDtbBqufueqv:commune-server.ahmr.it", "!xaWcRDqpxXsRajHShw:commune-server.ahmr.it"]
(NOBRIDGE) LOG [SyncServiceManager] SDK SyncServiceState changed: 1
(NOBRIDGE) LOG [SyncServiceManager] SDK SyncServiceState received: 1
(NOBRIDGE) LOG [SyncServiceManager] App sync state changing: IDLE -> PREPARING
(NOBRIDGE) LOG [AppNavigator] Rendering with states: {"initialLoading": false, "isNewAccount": false, "isRecoveryMode": false, "loading": false, "otpVerified": true, "syncState": "PREPARING", "syncTimeout": false, "user": "7a152836-cea3-48e9-b7d1-052b7ec885e1"}
(NOBRIDGE) LOG [RoomsProvider] Result object {Symbol(pointer): 12970367463256896160n, Symbol(destructor): {}, Symbol(typeName): "RoomListEntriesWithDynamicAdaptersResult"}
(NOBRIDGE) LOG [RoomsProvider] result.entriesStream: [Function entriesStream]
(NOBRIDGE) LOG [RoomsProvider] entriesStream() returned: {Symbol(pointer): 12970367465941423392n, Symbol(destructor): {}, Symbol(typeName): "TaskHandle"}
(NOBRIDGE) LOG [SYNC-heartbeat] 1
(NOBRIDGE) LOG [SYNC-heartbeat] 1
(NOBRIDGE) LOG [AppNavigator] Sync timeout reached, proceeding anyway
(NOBRIDGE) LOG [AppNavigator] Rendering with states: {"initialLoading": false, "isNewAccount": false, "isRecoveryMode": false, "loading": false, "otpVerified": true, "syncState": "PREPARING", "syncTimeout": true, "user": "7a152836-cea3-48e9-b7d1-052b7ec885e1"}
(NOBRIDGE) LOG [SYNC-heartbeat] 1
(NOBRIDGE) LOG [SYNC-heartbeat] 1
(NOBRIDGE) LOG [AppNavigator] Rendering with states: {"initialLoading": false, "isNewAccount": false, "isRecoveryMode": false, "loading": false, "otpVerified": true, "syncState": "PREPARING", "syncTimeout": false, "user": "7a152836-cea3-48e9-b7d1-052b7ec885e1"}
(NOBRIDGE) LOG [AuthProviderV2] Unmounting. Unsubscribing auth listener.
(NOBRIDGE) LOG [MatrixServiceV2] initClient called
(NOBRIDGE) LOG [AuthProviderV2] Mounting. Setting initialLoading to true.
(NOBRIDGE) LOG Initializing app dependencies...
(NOBRIDGE) LOG [AuthProviderV2] onAuthStateChange: Event: INITIAL_SESSION, New Session User: 7a152836-cea3-48e9-b7d1-052b7ec885e1
(NOBRIDGE) LOG [AuthProviderV2] Initial session fetched: User 7a152836-cea3-48e9-b7d1-052b7ec885e1 (14243526473)
(NOBRIDGE) LOG [RoomsProvider] Result object {Symbol(pointer): 12970367463257019680n, Symbol(destructor): {}, Symbol(typeName): "RoomListEntriesWithDynamicAdaptersResult"}
(NOBRIDGE) LOG [RoomsProvider] result.entriesStream: [Function entriesStream]
(NOBRIDGE) LOG [RoomsProvider] entriesStream() returned: {Symbol(pointer): 12970367465941498512n, Symbol(destructor): {}, Symbol(typeName): "TaskHandle"}
(NOBRIDGE) LOG [AppNavigator] Rendering with states: {"initialLoading": false, "isNewAccount": false, "isRecoveryMode": false, "loading": false, "otpVerified": true, "syncState": "PREPARING", "syncTimeout": false, "user": "7a152836-cea3-48e9-b7d1-052b7ec885e1"}
(NOBRIDGE) LOG [MatrixServiceV2] Found saved session, attempting to restore
(NOBRIDGE) LOG [MatrixServiceV2] Building client...
(NOBRIDGE) LOG App dependencies initialized successfully.
(NOBRIDGE) LOG [MatrixServiceV2] Restoring session...
(NOBRIDGE) LOG [MatrixServiceV2] Session restored successfully
(NOBRIDGE) LOG [SyncServiceManager] Initializing sync service builder...
(NOBRIDGE) LOG [SyncServiceManager] Configuring UTD hook...
(NOBRIDGE) LOG [AppNavigator] Rendering with states: {"initialLoading": false, "isNewAccount": false, "isRecoveryMode": false, "loading": false, "otpVerified": true, "syncState": "IDLE", "syncTimeout": false, "user": "7a152836-cea3-48e9-b7d1-052b7ec885e1"}
(NOBRIDGE) LOG [SyncServiceManager] Finishing sync service setup...
(NOBRIDGE) LOG [SyncServiceManager] Setting up state listener…
(NOBRIDGE) LOG [SyncServiceManager] Starting sync service...
(NOBRIDGE) LOG SS version: Native
(NOBRIDGE) LOG [SyncServiceManager] Setting up room list sync indicator...
(NOBRIDGE) LOG [SyncServiceManager] Sync service started successfully
(NOBRIDGE) LOG [SyncServiceManager] Joined rooms: ["!fhHppWMhhnVlJJGZWI:commune-server.ahmr.it", "!mqbrXiNCyhENpySlUK:commune-server.ahmr.it", "!seoHqUTDtbBqufueqv:commune-server.ahmr.it", "!xaWcRDqpxXsRajHShw:commune-server.ahmr.it"]
(NOBRIDGE) LOG [SyncServiceManager] SDK SyncServiceState changed: 1
(NOBRIDGE) LOG [SyncServiceManager] SDK SyncServiceState received: 1
(NOBRIDGE) LOG [SyncServiceManager] App sync state changing: IDLE -> PREPARING
(NOBRIDGE) LOG [AppNavigator] Rendering with states: {"initialLoading": false, "isNewAccount": false, "isRecoveryMode": false, "loading": false, "otpVerified": true, "syncState": "PREPARING", "syncTimeout": false, "user": "7a152836-cea3-48e9-b7d1-052b7ec885e1"}
(NOBRIDGE) LOG [RoomsProvider] Result object {Symbol(pointer): 12970367463256974240n, Symbol(destructor): {}, Symbol(typeName): "RoomListEntriesWithDynamicAdaptersResult"}
(NOBRIDGE) LOG [RoomsProvider] result.entriesStream: [Function entriesStream]
(NOBRIDGE) LOG [RoomsProvider] entriesStream() returned: {Symbol(pointer): 12970367465941555104n, Symbol(destructor): {}, Symbol(typeName): "TaskHandle"}
(NOBRIDGE) LOG [SyncServiceManager] Room list sync indicator: SHOW
(NOBRIDGE) LOG [SyncServiceManager] Room list service state updated: SettingUp
(NOBRIDGE) LOG [SyncServiceManager] Room list sync indicator: HIDE
(NOBRIDGE) LOG [SyncServiceManager] Sync indicator shows sync complete, promoting to LIVE
(NOBRIDGE) LOG [SyncServiceManager] App sync state changing: PREPARING -> LIVE
(NOBRIDGE) LOG [AppNavigator] Rendering with states: {"initialLoading": false, "isNewAccount": false, "isRecoveryMode": false, "loading": false, "otpVerified": true, "syncState": "LIVE", "syncTimeout": false, "user": "7a152836-cea3-48e9-b7d1-052b7ec885e1"}
(NOBRIDGE) LOG [MatrixServiceV2] self-DM lookup for @7a152836-cea3-48e9-b7d1-052b7ec885e1:commune-server.ahmr.it
(NOBRIDGE) LOG [MatrixServiceV2] found existing self-DM: !fhHppWMhhnVlJJGZWI:commune-server.ahmr.it
(NOBRIDGE) LOG [AppNavigator] Rendering with states: {"initialLoading": false, "isNewAccount": false, "isRecoveryMode": false, "loading": false, "otpVerified": true, "syncState": "LIVE", "syncTimeout": false, "user": "7a152836-cea3-48e9-b7d1-052b7ec885e1"}
(NOBRIDGE) LOG [RoomsProvider] Result object {Symbol(pointer): 12970367463257045408n, Symbol(destructor): {}, Symbol(typeName): "RoomListEntriesWithDynamicAdaptersResult"}
(NOBRIDGE) LOG [RoomsProvider] result.entriesStream: [Function entriesStream]
(NOBRIDGE) LOG [RoomsProvider] entriesStream() returned: {Symbol(pointer): 12970367465941548864n, Symbol(destructor): {}, Symbol(typeName): "TaskHandle"}
(NOBRIDGE) LOG [AppNavigator] Rendering with states: {"initialLoading": false, "isNewAccount": false, "isRecoveryMode": false, "loading": false, "otpVerified": true, "syncState": "LIVE", "syncTimeout": false, "user": "7a152836-cea3-48e9-b7d1-052b7ec885e1"}