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"
+ }
+}
+