diff --git a/.idea/libraries/package_search_api_client.xml b/.idea/libraries/package_search_api_client.xml index cd8796b9d03b..44b586352c5a 100644 --- a/.idea/libraries/package_search_api_client.xml +++ b/.idea/libraries/package_search_api_client.xml @@ -1,22 +1,34 @@ - + - - 15cf65b66dc121308517db68e82d8930d7e227257bdb862ca07f1328515eea6b + + d7e293f78f1be85cec7a1ad3dfec5b5a868074b00a90a8be2438c25660526019 - - d8eeccae53547378ea2d1aaab6efa94d65c4693e3bcdefed13c44b8ce8a52df9 + + 0318b967115de0c7c8fbd93bc6e3d279c82de2954f90794146962921de45972d - - eac34c241019a23d3b0a07b4e04888b110aa4c06a826f80de19d2457f6be4b81 + + a16f54c2126f9289610438d4f5592cd386113110cb8180ccfbe6999f5b1a3dbf - - ec7192861556914e6edb5ce0b901848431b03a327a3ca4045c332ab5b3b24ff8 + + 956a4c7faad66e3471861adaa278d9486f3a050ac25fb6a99ca90809d379adfe + + + 4c86546693efaeb889e02d043521cda15da5f10853b0471095b7db80dc0540e7 0fe8dcdf54b13b5ec56fdb5f63c057364264bb2f51b7f7bc3c271d5b1ba68dcb + + 7e638082b4a14e3a96ca90f3f5db70ac65591e0b6c6670629e849d22ec34455f + + + f43dd81cf3c7f87abdc80100607b3892a5eb13d87b4d1ceccb7dfb53a68fa4ca + + + 9b462754c2a574cb7720b16ef1129e6ea76d360d7c84c58684fcab77b17f844d + @@ -38,22 +50,33 @@ + + + - - - - + + + + + + + + - - - - + + + + + + + + \ No newline at end of file diff --git a/plugins/repository-search/intellij.repository.search.iml b/plugins/repository-search/intellij.repository.search.iml index 78093cfdbe20..ee00f23b9cba 100644 --- a/plugins/repository-search/intellij.repository.search.iml +++ b/plugins/repository-search/intellij.repository.search.iml @@ -50,5 +50,6 @@ + \ No newline at end of file diff --git a/plugins/repository-search/plugin-content.yaml b/plugins/repository-search/plugin-content.yaml index 1b090ceb99cf..5c1af5ec97f4 100644 --- a/plugins/repository-search/plugin-content.yaml +++ b/plugins/repository-search/plugin-content.yaml @@ -9,8 +9,12 @@ - name: $MAVEN_REPOSITORY$/org/jetbrains/packagesearch/packagesearch-api-client-jvm/3/packagesearch-api-client-jvm-3.jar - name: $MAVEN_REPOSITORY$/org/jetbrains/packagesearch/packagesearch-http-models-jvm/3/packagesearch-http-models-jvm-3.jar - name: $MAVEN_REPOSITORY$/org/jetbrains/packagesearch/packagesearch-api-models-jvm/3/packagesearch-api-models-jvm-3.jar + - name: $MAVEN_REPOSITORY$/com/github/lamba92/kotlinx-document-store-mvstore/0/kotlinx-document-store-mvstore-0.jar - name: $MAVEN_REPOSITORY$/org/jetbrains/packagesearch/packagesearch-version-utils-jvm/3/packagesearch-version-utils-jvm-3.jar - name: $MAVEN_REPOSITORY$/com/soywiz/korlibs/krypto/krypto-jvm/4/krypto-jvm-4.jar + - name: $MAVEN_REPOSITORY$/com/github/lamba92/kotlinx-document-store-core-jvm/0/kotlinx-document-store-core-jvm-0.jar + - name: $MAVEN_REPOSITORY$/org/jetbrains/kotlinx/kotlinx-io-core-jvm/0/kotlinx-io-core-jvm-0.jar + - name: $MAVEN_REPOSITORY$/org/jetbrains/kotlinx/kotlinx-io-bytestring-jvm/0/kotlinx-io-bytestring-jvm-0.jar reason: <- intellij.repository.search modules: - name: intellij.repository.search \ No newline at end of file diff --git a/plugins/repository-search/src/main/kotlin/org/jetbrains/idea/packagesearch/api/PackageSearchApiClientService.kt b/plugins/repository-search/src/main/kotlin/org/jetbrains/idea/packagesearch/api/PackageSearchApiClientService.kt index 12bdf470809b..78ad874be979 100644 --- a/plugins/repository-search/src/main/kotlin/org/jetbrains/idea/packagesearch/api/PackageSearchApiClientService.kt +++ b/plugins/repository-search/src/main/kotlin/org/jetbrains/idea/packagesearch/api/PackageSearchApiClientService.kt @@ -2,15 +2,26 @@ package org.jetbrains.idea.packagesearch.api import com.intellij.openapi.Disposable import com.intellij.openapi.application.ApplicationInfo +import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.application.ApplicationNamesInfo +import com.intellij.openapi.application.appSystemDir import com.intellij.openapi.components.Service +import com.intellij.util.io.createParentDirectories import io.ktor.client.engine.java.Java import io.ktor.client.plugins.DefaultRequest +import io.ktor.client.plugins.HttpRequestRetry import io.ktor.client.plugins.HttpTimeout import io.ktor.client.plugins.UserAgent +import io.ktor.client.plugins.compression.ContentEncoding import io.ktor.client.plugins.logging.LogLevel import io.ktor.client.plugins.logging.Logger import io.ktor.client.plugins.logging.Logging import io.ktor.client.request.headers +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.document.database.DataStore +import kotlinx.document.database.mvstore.MVDataStore import org.jetbrains.annotations.ApiStatus.ScheduledForRemoval import org.jetbrains.idea.maven.onlinecompletion.model.MavenDependencyCompletionItem import org.jetbrains.idea.maven.onlinecompletion.model.MavenRepositoryArtifactInfo @@ -18,16 +29,21 @@ import org.jetbrains.idea.reposearch.DependencySearchProvider import org.jetbrains.idea.reposearch.PluginEnvironment import org.jetbrains.idea.reposearch.RepositoryArtifactData import org.jetbrains.idea.reposearch.logTrace +import org.jetbrains.packagesearch.api.PackageSearchApiClientObject import org.jetbrains.packagesearch.api.v3.ApiMavenPackage import org.jetbrains.packagesearch.api.v3.http.PackageSearchApiClient import org.jetbrains.packagesearch.api.v3.http.PackageSearchApiClient.Companion.defaultHttpClient import org.jetbrains.packagesearch.api.v3.http.PackageSearchEndpoints import org.jetbrains.packagesearch.api.v3.http.searchPackages import org.jetbrains.packagesearch.api.v3.search.jvmMavenPackages +import java.nio.file.Path +import kotlin.io.path.absolutePathString +import kotlin.io.path.div +import kotlin.io.path.exists import kotlin.time.Duration.Companion.seconds @Service(Service.Level.APP) -class PackageSearchApiClientService : Disposable, DependencySearchProvider { +class PackageSearchApiClientService(val coroutineScope: CoroutineScope) : Disposable, DependencySearchProvider { private val httpClient = defaultHttpClient(engine = Java, protobuf = false) { install(UserAgent) { @@ -35,7 +51,7 @@ class PackageSearchApiClientService : Disposable, DependencySearchProvider { } install(DefaultRequest) { headers { - append("Api-Version", "3.1.1") + append("Api-Version", PackageSearchApiClientObject.version) append("JB-IDE-Version", PluginEnvironment.ideVersion) } } @@ -48,18 +64,48 @@ class PackageSearchApiClientService : Disposable, DependencySearchProvider { } } } + install(ContentEncoding) { + deflate() + gzip() + } + install(HttpRequestRetry) { + maxRetries = 5 + retryOnException(retryOnTimeout = true) + } install(HttpTimeout) { requestTimeoutMillis = 10.seconds.inWholeMilliseconds + socketTimeoutMillis = 3.seconds.inWholeMilliseconds + connectTimeoutMillis = 3.seconds.inWholeMilliseconds + } + install(UserAgent) { + agent = intelliJ() } } + private val cacheFilePath + get() = appSystemDir / "caches" / "packagesearch" / "${PackageSearchApiClientObject.version}.db" + + + private val mvDataStore = MVDataStore.open( + getCacheFile(), + DataStore.CommitStrategy.Periodic(5.seconds)) + val client = PackageSearchApiClient( + dataStore = mvDataStore, endpoints = PackageSearchEndpoints.PROD, httpClient = httpClient ) + private fun getCacheFile(): Path { + if (!cacheFilePath.exists()) cacheFilePath.createParentDirectories().absolutePathString() + return cacheFilePath + } + override fun dispose() { httpClient.close() + coroutineScope.launch(Dispatchers.IO) { + mvDataStore.close() + } } @Deprecated("Use directly the client instead") @@ -126,3 +172,16 @@ private fun ApiMavenPackage.repositoryArtifactData(): MavenRepositoryArtifactInf /* version = */ versions.toTypedArray() ) } + +private fun UserAgent.Config.intelliJ(): String { + val app = ApplicationManager.getApplication() + if (app != null && !app.isDisposed) { + val productName = ApplicationNamesInfo.getInstance().fullProductName + val version = ApplicationInfo.getInstance().build.asStringWithoutProductCode() + return "$productName/$version" + } + else { + return "IntelliJ" + } +} +