Skip to content

Cannot get room list diffs #30

@skyrover7

Description

@skyrover7

@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.ts files, with no hand-written glue
  • We are not using a proxy (no Proxy() version)
  • Session is restored using client.restoreSession() after a first-time client.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.LIVE and see:
    • RoomListServiceState.Running
    • Sync 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 before start()
  • 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"}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions