All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonMain.com.harmony.kotlin.data.datasource.RetryDataSource.kt Maven / Gradle / Ivy

package com.harmony.kotlin.data.datasource

import com.harmony.kotlin.common.logger.Logger
import com.harmony.kotlin.data.query.Query

class RetryDataSource(
  private val getDataSource: GetDataSource,
  private val putDataSource: PutDataSource,
  private val deleteDataSource: DeleteDataSource,
  private val maxAmountOfExecutions: Int = 2,
  private val retryIf: (Exception) -> Boolean = { true },
  private val logger: Logger? = null,
) : GetDataSource, PutDataSource, DeleteDataSource {

  init {
    check(maxAmountOfExecutions > 0)
  }

  override suspend fun get(query: Query): V =
    executeWithRetries(retryCount = maxAmountOfExecutions) {
      getDataSource.get(query)
    }

  @Deprecated("Use get instead")
  override suspend fun getAll(query: Query): List =
    executeWithRetries(retryCount = maxAmountOfExecutions) {
      getDataSource.getAll(query)
    }

  override suspend fun put(query: Query, value: V?): V =
    executeWithRetries(retryCount = maxAmountOfExecutions) {
      putDataSource.put(query, value)
    }

  @Deprecated("Use put instead")
  override suspend fun putAll(query: Query, value: List?): List =
    executeWithRetries(retryCount = maxAmountOfExecutions) {
      putDataSource.putAll(query, value)
    }

  override suspend fun delete(query: Query) =
    executeWithRetries(retryCount = maxAmountOfExecutions) {
      deleteDataSource.delete(query)
    }

  private suspend fun  executeWithRetries(retryCount: Int, functionToRetry: suspend () -> K): K =
    @Suppress("TooGenericExceptionCaught")
    try {
      functionToRetry()
    } catch (error: Exception) {
      logger?.d("RetryDataSource", "failed attempt ${this.maxAmountOfExecutions - retryCount + 1} of max retries ${this.maxAmountOfExecutions}:\n\t$error")
      if (retryCount > 1 && retryIf(error)) {
        executeWithRetries(retryCount - 1, functionToRetry)
      } else throw error
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy