Browse Source

Fix room member infinite loop

pull/1376/head
ganfra 1 year ago
parent
commit
0bd6ba0984
  1. 24
      libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt

24
libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt

@ -44,8 +44,8 @@ import io.element.android.libraries.matrix.api.timeline.item.event.EventType @@ -44,8 +44,8 @@ import io.element.android.libraries.matrix.api.timeline.item.event.EventType
import io.element.android.libraries.matrix.impl.core.toProgressWatcher
import io.element.android.libraries.matrix.impl.media.MediaUploadHandlerImpl
import io.element.android.libraries.matrix.impl.media.map
import io.element.android.libraries.matrix.impl.poll.toInner
import io.element.android.libraries.matrix.impl.notificationsettings.RustNotificationSettingsService
import io.element.android.libraries.matrix.impl.poll.toInner
import io.element.android.libraries.matrix.impl.room.location.toInner
import io.element.android.libraries.matrix.impl.timeline.RustMatrixTimeline
import io.element.android.libraries.matrix.impl.util.destroyAll
@ -187,21 +187,25 @@ class RustMatrixRoom( @@ -187,21 +187,25 @@ class RustMatrixRoom(
_membersStateFlow.value = MatrixRoomMembersState.Pending(prevRoomMembers = currentMembers)
var rustMembers: List<RoomMember>? = null
try {
rustMembers = buildList {
while (true) {
// Loading the whole iterator as a stop-gap measure.
// We should probably implement some sort of paging in the future.
addAll(innerRoom.members().nextChunk(1000u) ?: break)
rustMembers = innerRoom.members().use { membersIterator ->
buildList {
while (true) {
// Loading the whole membersIterator as a stop-gap measure.
// We should probably implement some sort of paging in the future.
addAll(membersIterator.nextChunk(1000u) ?: break)
}
}
}
val mappedMembers = rustMembers.parallelMap(RoomMemberMapper::map)
_membersStateFlow.value = MatrixRoomMembersState.Ready(mappedMembers)
Result.success(Unit)
} catch (cancellationException: CancellationException) {
throw cancellationException
} catch (exception: Exception) {
_membersStateFlow.value = MatrixRoomMembersState.Error(prevRoomMembers = currentMembers, failure = exception)
Result.failure(exception)
if (exception is CancellationException) {
throw exception
} else {
Result.failure(exception)
}
} finally {
rustMembers?.destroyAll()
}
@ -466,7 +470,7 @@ class RustMatrixRoom( @@ -466,7 +470,7 @@ class RustMatrixRoom(
}
private fun messageEventContentFromParts(body: String, htmlBody: String?): RoomMessageEventContentWithoutRelation =
if(htmlBody != null) {
if (htmlBody != null) {
messageEventContentFromHtml(body, htmlBody)
} else {
messageEventContentFromMarkdown(body)

Loading…
Cancel
Save