session-android/libsignal/src/main/java/org/session/libsignal/utilities/PromiseUtilities.kt

61 lines
1.7 KiB
Kotlin
Raw Normal View History

2020-12-10 05:29:19 +01:00
@file:JvmName("PromiseUtilities")
2021-02-01 02:10:48 +01:00
package org.session.libsignal.utilities
2020-12-10 05:29:19 +01:00
import nl.komponents.kovenant.Promise
import nl.komponents.kovenant.deferred
2023-06-16 03:08:33 +02:00
import nl.komponents.kovenant.task
2020-12-10 05:29:19 +01:00
import java.util.concurrent.TimeoutException
2023-06-16 03:08:33 +02:00
fun emptyPromise() = EMPTY_PROMISE
private val EMPTY_PROMISE: Promise<*, java.lang.Exception> = task {}
2021-01-27 00:54:25 +01:00
fun <V, E : Throwable> Promise<V, E>.get(defaultValue: V): V {
return try {
get()
} catch (e: Exception) {
defaultValue
}
}
fun <V, E : Throwable> Promise<V, E>.recover(callback: (exception: E) -> V): Promise<V, E> {
val deferred = deferred<V, E>()
success {
deferred.resolve(it)
}.fail {
try {
val value = callback(it)
deferred.resolve(value)
} catch (e: Throwable) {
deferred.reject(it)
}
}
return deferred.promise
}
2020-12-10 05:29:19 +01:00
fun <V, E> Promise<V, E>.successBackground(callback: (value: V) -> Unit): Promise<V, E> {
2021-01-31 23:39:14 +01:00
ThreadUtils.queue {
2020-12-10 05:29:19 +01:00
try {
callback(get())
} catch (e: Exception) {
Log.d("Loki", "Failed to execute task in background: ${e.message}.")
}
2021-01-31 23:39:14 +01:00
}
2020-12-10 05:29:19 +01:00
return this
}
fun <V> Promise<V, Exception>.timeout(millis: Long): Promise<V, Exception> {
if (this.isDone()) { return this; }
val deferred = deferred<V, Exception>()
2021-01-31 23:39:14 +01:00
ThreadUtils.queue {
2020-12-10 05:29:19 +01:00
Thread.sleep(millis)
if (!deferred.promise.isDone()) {
deferred.reject(TimeoutException("Promise timed out."))
}
2021-01-31 23:39:14 +01:00
}
2020-12-10 05:29:19 +01:00
this.success {
if (!deferred.promise.isDone()) { deferred.resolve(it) }
}.fail {
if (!deferred.promise.isDone()) { deferred.reject(it) }
}
return deferred.promise
}