Skip to content

Commit

Permalink
Make the ZiplineLoader's initializer suspending (#1379)
Browse files Browse the repository at this point in the history
This way it's possible to create bound services on other dispatchers
if that's necessary.
  • Loading branch information
squarejesse authored Jul 9, 2024
1 parent aab5f55 commit 1ee887b
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 9 deletions.
8 changes: 6 additions & 2 deletions zipline-loader/api/android/zipline-loader.api
Original file line number Diff line number Diff line change
Expand Up @@ -142,13 +142,17 @@ public final class app/cash/zipline/loader/ZiplineLoader {
public final fun download (Ljava/lang/String;Lokio/FileSystem;Lokio/Path;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public final synthetic fun download (Ljava/lang/String;Lokio/Path;Lokio/FileSystem;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public final fun getConcurrentDownloads ()I
public final fun load (Ljava/lang/String;Lapp/cash/zipline/loader/FreshnessChecker;Lkotlinx/coroutines/flow/Flow;Lkotlinx/serialization/modules/SerializersModule;Lkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/flow/Flow;
public final synthetic fun load (Ljava/lang/String;Lapp/cash/zipline/loader/FreshnessChecker;Lkotlinx/coroutines/flow/Flow;Lkotlinx/serialization/modules/SerializersModule;Lkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/flow/Flow;
public final fun load (Ljava/lang/String;Lapp/cash/zipline/loader/FreshnessChecker;Lkotlinx/coroutines/flow/Flow;Lkotlinx/serialization/modules/SerializersModule;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow;
public final fun load (Ljava/lang/String;Lkotlinx/coroutines/flow/Flow;Lkotlinx/serialization/modules/SerializersModule;Lkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/flow/Flow;
public static synthetic fun load$default (Lapp/cash/zipline/loader/ZiplineLoader;Ljava/lang/String;Lapp/cash/zipline/loader/FreshnessChecker;Lkotlinx/coroutines/flow/Flow;Lkotlinx/serialization/modules/SerializersModule;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow;
public static synthetic fun load$default (Lapp/cash/zipline/loader/ZiplineLoader;Ljava/lang/String;Lapp/cash/zipline/loader/FreshnessChecker;Lkotlinx/coroutines/flow/Flow;Lkotlinx/serialization/modules/SerializersModule;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow;
public static synthetic fun load$default (Lapp/cash/zipline/loader/ZiplineLoader;Ljava/lang/String;Lkotlinx/coroutines/flow/Flow;Lkotlinx/serialization/modules/SerializersModule;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow;
public final fun loadOnce (Ljava/lang/String;Lapp/cash/zipline/loader/FreshnessChecker;Ljava/lang/String;Lkotlinx/serialization/modules/SerializersModule;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public final synthetic fun loadOnce (Ljava/lang/String;Lapp/cash/zipline/loader/FreshnessChecker;Ljava/lang/String;Lkotlinx/serialization/modules/SerializersModule;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public final fun loadOnce (Ljava/lang/String;Lapp/cash/zipline/loader/FreshnessChecker;Ljava/lang/String;Lkotlinx/serialization/modules/SerializersModule;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public final fun loadOnce (Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/modules/SerializersModule;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public static synthetic fun loadOnce$default (Lapp/cash/zipline/loader/ZiplineLoader;Ljava/lang/String;Lapp/cash/zipline/loader/FreshnessChecker;Ljava/lang/String;Lkotlinx/serialization/modules/SerializersModule;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;
public static synthetic fun loadOnce$default (Lapp/cash/zipline/loader/ZiplineLoader;Ljava/lang/String;Lapp/cash/zipline/loader/FreshnessChecker;Ljava/lang/String;Lkotlinx/serialization/modules/SerializersModule;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;
public static synthetic fun loadOnce$default (Lapp/cash/zipline/loader/ZiplineLoader;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/modules/SerializersModule;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;
public final fun setConcurrentDownloads (I)V
public final fun withCache (Lapp/cash/zipline/loader/ZiplineCache;)Lapp/cash/zipline/loader/ZiplineLoader;
Expand Down
8 changes: 6 additions & 2 deletions zipline-loader/api/jvm/zipline-loader.api
Original file line number Diff line number Diff line change
Expand Up @@ -142,13 +142,17 @@ public final class app/cash/zipline/loader/ZiplineLoader {
public final fun download (Ljava/lang/String;Lokio/FileSystem;Lokio/Path;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public final synthetic fun download (Ljava/lang/String;Lokio/Path;Lokio/FileSystem;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public final fun getConcurrentDownloads ()I
public final fun load (Ljava/lang/String;Lapp/cash/zipline/loader/FreshnessChecker;Lkotlinx/coroutines/flow/Flow;Lkotlinx/serialization/modules/SerializersModule;Lkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/flow/Flow;
public final synthetic fun load (Ljava/lang/String;Lapp/cash/zipline/loader/FreshnessChecker;Lkotlinx/coroutines/flow/Flow;Lkotlinx/serialization/modules/SerializersModule;Lkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/flow/Flow;
public final fun load (Ljava/lang/String;Lapp/cash/zipline/loader/FreshnessChecker;Lkotlinx/coroutines/flow/Flow;Lkotlinx/serialization/modules/SerializersModule;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow;
public final fun load (Ljava/lang/String;Lkotlinx/coroutines/flow/Flow;Lkotlinx/serialization/modules/SerializersModule;Lkotlin/jvm/functions/Function1;)Lkotlinx/coroutines/flow/Flow;
public static synthetic fun load$default (Lapp/cash/zipline/loader/ZiplineLoader;Ljava/lang/String;Lapp/cash/zipline/loader/FreshnessChecker;Lkotlinx/coroutines/flow/Flow;Lkotlinx/serialization/modules/SerializersModule;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow;
public static synthetic fun load$default (Lapp/cash/zipline/loader/ZiplineLoader;Ljava/lang/String;Lapp/cash/zipline/loader/FreshnessChecker;Lkotlinx/coroutines/flow/Flow;Lkotlinx/serialization/modules/SerializersModule;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow;
public static synthetic fun load$default (Lapp/cash/zipline/loader/ZiplineLoader;Ljava/lang/String;Lkotlinx/coroutines/flow/Flow;Lkotlinx/serialization/modules/SerializersModule;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlinx/coroutines/flow/Flow;
public final fun loadOnce (Ljava/lang/String;Lapp/cash/zipline/loader/FreshnessChecker;Ljava/lang/String;Lkotlinx/serialization/modules/SerializersModule;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public final synthetic fun loadOnce (Ljava/lang/String;Lapp/cash/zipline/loader/FreshnessChecker;Ljava/lang/String;Lkotlinx/serialization/modules/SerializersModule;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public final fun loadOnce (Ljava/lang/String;Lapp/cash/zipline/loader/FreshnessChecker;Ljava/lang/String;Lkotlinx/serialization/modules/SerializersModule;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public final fun loadOnce (Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/modules/SerializersModule;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
public static synthetic fun loadOnce$default (Lapp/cash/zipline/loader/ZiplineLoader;Ljava/lang/String;Lapp/cash/zipline/loader/FreshnessChecker;Ljava/lang/String;Lkotlinx/serialization/modules/SerializersModule;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;
public static synthetic fun loadOnce$default (Lapp/cash/zipline/loader/ZiplineLoader;Ljava/lang/String;Lapp/cash/zipline/loader/FreshnessChecker;Ljava/lang/String;Lkotlinx/serialization/modules/SerializersModule;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;
public static synthetic fun loadOnce$default (Lapp/cash/zipline/loader/ZiplineLoader;Ljava/lang/String;Ljava/lang/String;Lkotlinx/serialization/modules/SerializersModule;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;
public final fun setConcurrentDownloads (I)V
public final fun withCache (Lapp/cash/zipline/loader/ZiplineCache;)Lapp/cash/zipline/loader/ZiplineLoader;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import app.cash.zipline.loader.internal.receiver.Receiver
import app.cash.zipline.loader.internal.receiver.ZiplineLoadReceiver
import app.cash.zipline.loader.internal.systemEpochMsClock
import kotlin.coroutines.cancellation.CancellationException
import kotlin.jvm.JvmName
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.Job
import kotlinx.coroutines.channels.ProducerScope
Expand Down Expand Up @@ -209,7 +210,7 @@ class ZiplineLoader internal constructor(
freshnessChecker: FreshnessChecker = DefaultFreshnessCheckerNotFresh,
manifestUrlFlow: Flow<String>,
serializersModule: SerializersModule = EmptySerializersModule(),
initializer: (Zipline) -> Unit = {},
initializer: suspend (Zipline) -> Unit = {},
): Flow<LoadResult> {
return channelFlow {
var previousManifest: ZiplineManifest? = null
Expand Down Expand Up @@ -243,6 +244,28 @@ class ZiplineLoader internal constructor(
}
}

@Deprecated(
message = "Deprecated, will be removed in 1.15",
level = DeprecationLevel.HIDDEN,
replaceWith = ReplaceWith("load with suspending initializer"),
)
@JvmName("load")
fun deprecatedLoad(
applicationName: String,
freshnessChecker: FreshnessChecker = DefaultFreshnessCheckerNotFresh,
manifestUrlFlow: Flow<String>,
serializersModule: SerializersModule = EmptySerializersModule(),
initializer: (Zipline) -> Unit = {},
): Flow<LoadResult> {
return load(
applicationName = applicationName,
freshnessChecker = freshnessChecker,
manifestUrlFlow = manifestUrlFlow,
serializersModule = serializersModule,
initializer = { zipline -> initializer(zipline) },
)
}

/**
* Downloads ZiplineManifest each time [manifestUrlFlow] emits and loads Zipline with the newly
* downloaded ZiplineManifest, skipping loads if the code to load is the same as what's already
Expand Down Expand Up @@ -284,7 +307,7 @@ class ZiplineLoader internal constructor(
applicationName: String,
manifestUrl: String,
serializersModule: SerializersModule,
initializer: (Zipline) -> Unit,
initializer: suspend (Zipline) -> Unit,
): ZiplineManifest? {
val eventListener = eventListenerFactory.create(applicationName, manifestUrl)

Expand Down Expand Up @@ -344,7 +367,7 @@ class ZiplineLoader internal constructor(
applicationName: String,
freshnessChecker: FreshnessChecker,
serializersModule: SerializersModule,
initializer: (Zipline) -> Unit,
initializer: suspend (Zipline) -> Unit,
): ZiplineManifest? {
val eventListener = eventListenerFactory.create(applicationName, null)

Expand Down Expand Up @@ -393,7 +416,7 @@ class ZiplineLoader internal constructor(
freshnessChecker: FreshnessChecker,
manifestUrl: String,
serializersModule: SerializersModule = EmptySerializersModule(),
initializer: (Zipline) -> Unit = {},
initializer: suspend (Zipline) -> Unit = {},
): LoadResult = load(
applicationName = applicationName,
freshnessChecker = freshnessChecker,
Expand All @@ -402,6 +425,26 @@ class ZiplineLoader internal constructor(
initializer = initializer,
).first()

@Deprecated(
message = "Deprecated, will be removed in 1.15",
level = DeprecationLevel.HIDDEN,
replaceWith = ReplaceWith("loadOnce with suspending initializer"),
)
@JvmName("loadOnce")
suspend fun deprecatedLoadOnce(
applicationName: String,
freshnessChecker: FreshnessChecker,
manifestUrl: String,
serializersModule: SerializersModule = EmptySerializersModule(),
initializer: (Zipline) -> Unit = {},
): LoadResult = loadOnce(
applicationName = applicationName,
freshnessChecker = freshnessChecker,
manifestUrl = manifestUrl,
serializersModule = serializersModule,
initializer = { zipline -> initializer(zipline) },
)

/** Always loads from the network, never from local. */
@Deprecated(
message = "Deprecated, will be removed in 1.9",
Expand Down Expand Up @@ -432,7 +475,7 @@ class ZiplineLoader internal constructor(
loadedManifest: LoadedManifest,
serializersModule: SerializersModule,
nowEpochMs: Long,
initializer: (Zipline) -> Unit,
initializer: suspend (Zipline) -> Unit,
): Zipline {
val zipline = Zipline.create(dispatcher, serializersModule, eventListener)
try {
Expand Down

0 comments on commit 1ee887b

Please sign in to comment.