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

commonMain.com.apollographql.apollo.network.NetworkMonitor.kt Maven / Gradle / Ivy

@file:JvmMultifileClass
@file:JvmName("NetworkMonitorKt")

package com.apollographql.apollo.network

import com.apollographql.apollo.annotations.ApolloExperimental
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.mapNotNull
import kotlinx.coroutines.flow.takeWhile
import okio.Closeable
import kotlin.js.JsName
import kotlin.jvm.JvmMultifileClass
import kotlin.jvm.JvmName

/**
 * Monitors the network state.
 * A [NetworkMonitor] is used to retry requests when network is available.
 */
@ApolloExperimental
interface NetworkMonitor : Closeable {
  /**
   * Emits the current network state. May emit null during initialization
   * when the current state is not known yet.
   */
  val isOnline: StateFlow
}

internal suspend fun NetworkMonitor.waitForNetwork() {
  isOnline.takeWhile { it != true }.collect()
}

/**
 * @param networkObserverFactory a factory for a [NetworkObserver]. [networkObserverFactory] is called from a
 * background thread.
 */
internal class DefaultNetworkMonitor(private val networkObserverFactory: () -> NetworkObserver) : NetworkMonitor, NetworkObserver.Listener {
  private val _isOnline: MutableStateFlow = MutableStateFlow(null)

  override val isOnline: StateFlow
    get() {
      networkObserver
      return _isOnline.asStateFlow()
    }

  private val networkObserver by lazy {
    networkObserverFactory().also {
      it.setListener(this)
    }
  }

  override fun close() {
    networkObserver.close()
  }

  override fun networkChanged(isOnline: Boolean) {
    this._isOnline.value = isOnline
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy