in http/client/src/commonMain/kotlin/org/jetbrains/packagesearch/api/v3/http/PackageSearchApiClient.kt [440:492]
public suspend fun refreshPackagesInfo(
request: RefreshPackagesInfoRequest,
requestBuilder: (HttpRequestBuilder.() -> Unit)? = null,
): List<ApiPackage> {
//gather results from cache
val packagesCache = packagesCacheCollection.await()
val cachedResults = request.packages
.associate { it.packageIdHash to it.latestKnownVersion }
.mapKeys { packagesCache.find(PackageCacheEntry::key.name, it).firstOrNull() }
.filterKeys { it != null }.mapKeys { it.key!! }
.map { (cacheEntry, versionName) ->
when {
versionName == null -> cacheEntry // no version specified so any version is fine
cacheEntry.value == null -> cacheEntry // We don't know this package at all, so the cached result is ok
NormalizedVersion.from(versionName) < cacheEntry.value.versions.latest.normalized ->
cacheEntry //we know that the version is outdated, so we need to refresh it
NormalizedVersion.from(versionName) > cacheEntry.value.versions.latest.normalized ->
PackageCacheEntry(cacheEntry.key, null)//we know that there are no other new versions,
// so we can omit this package for online request
else -> null
}
}.filterNotNull()
val cachedIdHashes = cachedResults.map { it.key }
val notFoundPackages = request.packages.filter { it.packageIdHash !in cachedIdHashes }
if (isOffline || notFoundPackages.isEmpty()) {
return cachedResults.mapNotNull { it.value }
}
val onlineResults =
defaultRequest<_, List<ApiPackage>>(
method = HttpMethod.Post,
url = endpoints.refreshPackagesInfo,
body = RefreshPackagesInfoRequest(notFoundPackages),
requestBuilder = requestBuilder,
)
onlineResults.forEach {
packagesCache.updateWhere(
fieldSelector = PackageCacheEntry::key.name,
fieldValue = it.idHash,
upsert = true,
update = PackageCacheEntry(it.idHash, it)
)
}
return cachedResults.mapNotNull { it.value } + onlineResults
}