to do an API call with timeout I would race it wit...
# arrow
s
to do an API call with timeout I would race it with `IO.sleep`:
Copy code
val callWithTimeout: IO<Model> = IO.raceN(
            IO.effect { service.getModel() },
            IO.sleep(2.seconds)
        )
right?
2
s
+
s
Yes, there is an out of the box operator for that as well.
waitFor
takes a nullable
default
value which defaults to
IO.raiseError(TimeOut)
❤️ 1
s
However there is resilience4j works very well both with timeout and as circuit breaker
however resilience4j works very nicely both as circuit breaker and timeout
Copy code
object ExtApiCommand {

    private const val executionTimeoutMillis = 7000L
    private const val commandKey = "ExtApi"

    val circuitBreaker: CircuitBreaker = circuitBreakerRegistry.circuitBreaker(commandKey)

    private val timeLimiterConfig: TimeLimiterConfig = TimeLimiterConfig
        .custom()
        .timeoutDuration(Duration.ofMillis(executionTimeoutMillis))
        .build()
    private val timeLimiter: TimeLimiter = timeLimiterRegistry.timeLimiter(commandKey, timeLimiterConfig)

    private val backendCall: suspend (HttpClient, HttpRequestBuilder) -> String =
        { client, requestData ->
            circuitBreaker.executeSuspendFunction {
                timeLimiter.executeSuspendFunction { client.request<String>(requestData) }
            }
        }

    fun execute(httpClient: HttpClient, request: HttpRequestBuilder): IO<String> {
        return IO
            .effect(httpClient.coroutineContext + MDCContext()) { backendCall(httpClient, request) }
    }
}
Sorry for mess. Did it via phone