Skip to content

Commit 0ea2acd

Browse files
algolia-botshortcutsmillotpFluf22
committed
feat(generators): allow per-spec timeouts [skip-bc] (generated)
algolia/api-clients-automation#4173 Co-authored-by: algolia-bot <[email protected]> Co-authored-by: Clément Vannicatte <[email protected]> Co-authored-by: Pierre Millot <[email protected]> Co-authored-by: Thomas Raffray <[email protected]>
1 parent 15cda49 commit 0ea2acd

10 files changed

+225
-16
lines changed

src/main/scala/algoliasearch/ApiClient.scala

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import algoliasearch.internal.interceptor.{AuthInterceptor, RetryStrategy, UserA
66
import algoliasearch.internal.{AlgoliaAgent, HttpRequester, StatefulHost}
77
import org.json4s.Formats
88

9+
import java.util.concurrent.TimeUnit
10+
import scala.concurrent.duration.Duration
911
import scala.util.Try
1012

1113
/** Base class for all API clients. It provides a mechanism for request serialization and deserialization. It also
@@ -19,6 +21,12 @@ import scala.util.Try
1921
* the name of the client
2022
* @param defaultHosts
2123
* the default hosts
24+
* @param defaultReadTimeout
25+
* the default read timeout
26+
* @param defaultConnectTimeout
27+
* the default connect timeout
28+
* @param defaultWriteTimeout
29+
* the default write timeout
2230
* @param formats
2331
* the JSON formats
2432
* @param options
@@ -29,6 +37,9 @@ abstract class ApiClient(
2937
apiKey: String,
3038
clientName: String,
3139
defaultHosts: Seq[Host],
40+
defaultReadTimeout: Duration,
41+
defaultConnectTimeout: Duration,
42+
defaultWriteTimeout: Duration,
3243
formats: Formats,
3344
options: ClientOptions = ClientOptions()
3445
) extends AutoCloseable {
@@ -45,32 +56,50 @@ abstract class ApiClient(
4556
private val requester = options.customRequester match {
4657
case Some(customRequester) => customRequester
4758
case None =>
48-
defaultRequester(appId, apiKey, clientName, options, defaultHosts)
59+
defaultRequester(
60+
appId,
61+
apiKey,
62+
clientName,
63+
options,
64+
defaultHosts,
65+
defaultReadTimeout,
66+
defaultConnectTimeout,
67+
defaultWriteTimeout
68+
)
4969
}
5070

5171
private def defaultRequester(
5272
appId: String,
5373
apiKey: String,
5474
clientName: String,
5575
options: ClientOptions,
56-
defaultHosts: Seq[Host]
76+
defaultHosts: Seq[Host],
77+
defaultReadTimeout: Duration,
78+
defaultConnectTimeout: Duration,
79+
defaultWriteTimeout: Duration
5780
): Requester = {
81+
val optionsWithDefaultTimeouts = options.copy(
82+
readTimeout = defaultReadTimeout,
83+
connectTimeout = defaultConnectTimeout,
84+
writeTimeout = defaultWriteTimeout
85+
)
86+
5887
val algoliaAgent = AlgoliaAgent(BuildInfo.version)
5988
.addSegment(AgentSegment(clientName, Some(BuildInfo.version)))
60-
.addSegments(options.agentSegments)
89+
.addSegments(optionsWithDefaultTimeouts.agentSegments)
6190

62-
val hosts = if (options.hosts.isEmpty) defaultHosts else options.hosts
91+
val hosts = if (optionsWithDefaultTimeouts.hosts.isEmpty) defaultHosts else optionsWithDefaultTimeouts.hosts
6392
val statefulHosts = hosts.map(host => StatefulHost(host)).toList
6493

6594
val builder = HttpRequester
66-
.builder(options.customFormats.getOrElse(formats))
95+
.builder(optionsWithDefaultTimeouts.customFormats.getOrElse(formats))
6796
.withInterceptor(authInterceptor)
6897
.withInterceptor(new UserAgentInterceptor(algoliaAgent))
6998
.withInterceptor(new RetryStrategy(statefulHosts))
7099

71-
options.requesterConfig.foreach(_(builder))
100+
optionsWithDefaultTimeouts.requesterConfig.foreach(_(builder))
72101

73-
builder.build(options)
102+
builder.build(optionsWithDefaultTimeouts)
74103
}
75104

76105
/** Executes the given request and returns the response.

src/main/scala/algoliasearch/api/AbtestingClient.scala

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,20 @@ import algoliasearch.abtesting.ScheduleABTestsRequest
1515
import algoliasearch.abtesting._
1616
import algoliasearch.ApiClient
1717
import algoliasearch.api.AbtestingClient.hosts
18+
import algoliasearch.api.AbtestingClient.readTimeout
19+
import algoliasearch.api.AbtestingClient.writeTimeout
20+
import algoliasearch.api.AbtestingClient.connectTimeout
1821
import algoliasearch.config._
1922
import algoliasearch.internal.util._
2023

24+
import java.util.concurrent.TimeUnit
25+
import scala.concurrent.duration.Duration
2126
import scala.concurrent.{ExecutionContext, Future}
2227
import scala.util.Random
2328

2429
object AbtestingClient {
2530

26-
/** Creates a new SearchApi instance using default hosts.
31+
/** Creates a new AbtestingClient instance using default hosts.
2732
*
2833
* @param appId
2934
* application ID
@@ -46,6 +51,18 @@ object AbtestingClient {
4651
clientOptions = clientOptions
4752
)
4853

54+
private def readTimeout(): Duration = {
55+
Duration(5, TimeUnit.SECONDS)
56+
}
57+
58+
private def connectTimeout(): Duration = {
59+
Duration(2, TimeUnit.SECONDS)
60+
}
61+
62+
private def writeTimeout(): Duration = {
63+
Duration(30, TimeUnit.SECONDS)
64+
}
65+
4966
private def hosts(region: Option[String] = None): Seq[Host] = {
5067
val allowedRegions = Seq("de", "us")
5168
if (region.isDefined && !allowedRegions.contains(region.get)) {
@@ -67,6 +84,9 @@ class AbtestingClient(
6784
apiKey = apiKey,
6885
clientName = "Abtesting",
6986
defaultHosts = hosts(region),
87+
defaultReadTimeout = readTimeout(),
88+
defaultWriteTimeout = writeTimeout(),
89+
defaultConnectTimeout = connectTimeout(),
7090
formats = JsonSupport.format,
7191
options = clientOptions
7292
) {

src/main/scala/algoliasearch/api/AnalyticsClient.scala

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,20 @@ import algoliasearch.analytics.OrderBy._
2929
import algoliasearch.analytics._
3030
import algoliasearch.ApiClient
3131
import algoliasearch.api.AnalyticsClient.hosts
32+
import algoliasearch.api.AnalyticsClient.readTimeout
33+
import algoliasearch.api.AnalyticsClient.writeTimeout
34+
import algoliasearch.api.AnalyticsClient.connectTimeout
3235
import algoliasearch.config._
3336
import algoliasearch.internal.util._
3437

38+
import java.util.concurrent.TimeUnit
39+
import scala.concurrent.duration.Duration
3540
import scala.concurrent.{ExecutionContext, Future}
3641
import scala.util.Random
3742

3843
object AnalyticsClient {
3944

40-
/** Creates a new SearchApi instance using default hosts.
45+
/** Creates a new AnalyticsClient instance using default hosts.
4146
*
4247
* @param appId
4348
* application ID
@@ -60,6 +65,18 @@ object AnalyticsClient {
6065
clientOptions = clientOptions
6166
)
6267

68+
private def readTimeout(): Duration = {
69+
Duration(5, TimeUnit.SECONDS)
70+
}
71+
72+
private def connectTimeout(): Duration = {
73+
Duration(2, TimeUnit.SECONDS)
74+
}
75+
76+
private def writeTimeout(): Duration = {
77+
Duration(30, TimeUnit.SECONDS)
78+
}
79+
6380
private def hosts(region: Option[String] = None): Seq[Host] = {
6481
val allowedRegions = Seq("de", "us")
6582
if (region.isDefined && !allowedRegions.contains(region.get)) {
@@ -81,6 +98,9 @@ class AnalyticsClient(
8198
apiKey = apiKey,
8299
clientName = "Analytics",
83100
defaultHosts = hosts(region),
101+
defaultReadTimeout = readTimeout(),
102+
defaultWriteTimeout = writeTimeout(),
103+
defaultConnectTimeout = connectTimeout(),
84104
formats = JsonSupport.format,
85105
options = clientOptions
86106
) {

src/main/scala/algoliasearch/api/IngestionClient.scala

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,15 +75,20 @@ import algoliasearch.ingestion.TriggerType._
7575
import algoliasearch.ingestion._
7676
import algoliasearch.ApiClient
7777
import algoliasearch.api.IngestionClient.hosts
78+
import algoliasearch.api.IngestionClient.readTimeout
79+
import algoliasearch.api.IngestionClient.writeTimeout
80+
import algoliasearch.api.IngestionClient.connectTimeout
7881
import algoliasearch.config._
7982
import algoliasearch.internal.util._
8083

84+
import java.util.concurrent.TimeUnit
85+
import scala.concurrent.duration.Duration
8186
import scala.concurrent.{ExecutionContext, Future}
8287
import scala.util.Random
8388

8489
object IngestionClient {
8590

86-
/** Creates a new SearchApi instance using default hosts.
91+
/** Creates a new IngestionClient instance using default hosts.
8792
*
8893
* @param appId
8994
* application ID
@@ -106,6 +111,18 @@ object IngestionClient {
106111
clientOptions = clientOptions
107112
)
108113

114+
private def readTimeout(): Duration = {
115+
Duration(25, TimeUnit.SECONDS)
116+
}
117+
118+
private def connectTimeout(): Duration = {
119+
Duration(25, TimeUnit.SECONDS)
120+
}
121+
122+
private def writeTimeout(): Duration = {
123+
Duration(25, TimeUnit.SECONDS)
124+
}
125+
109126
private def hosts(region: String): Seq[Host] = {
110127
val allowedRegions = Seq("eu", "us")
111128
if (!allowedRegions.contains(region)) {
@@ -128,6 +145,9 @@ class IngestionClient(
128145
apiKey = apiKey,
129146
clientName = "Ingestion",
130147
defaultHosts = hosts(region),
148+
defaultReadTimeout = readTimeout(),
149+
defaultWriteTimeout = writeTimeout(),
150+
defaultConnectTimeout = connectTimeout(),
131151
formats = JsonSupport.format,
132152
options = clientOptions
133153
) {

src/main/scala/algoliasearch/api/InsightsClient.scala

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,20 @@ import algoliasearch.insights.InsightsEvents
99
import algoliasearch.insights._
1010
import algoliasearch.ApiClient
1111
import algoliasearch.api.InsightsClient.hosts
12+
import algoliasearch.api.InsightsClient.readTimeout
13+
import algoliasearch.api.InsightsClient.writeTimeout
14+
import algoliasearch.api.InsightsClient.connectTimeout
1215
import algoliasearch.config._
1316
import algoliasearch.internal.util._
1417

18+
import java.util.concurrent.TimeUnit
19+
import scala.concurrent.duration.Duration
1520
import scala.concurrent.{ExecutionContext, Future}
1621
import scala.util.Random
1722

1823
object InsightsClient {
1924

20-
/** Creates a new SearchApi instance using default hosts.
25+
/** Creates a new InsightsClient instance using default hosts.
2126
*
2227
* @param appId
2328
* application ID
@@ -40,6 +45,18 @@ object InsightsClient {
4045
clientOptions = clientOptions
4146
)
4247

48+
private def readTimeout(): Duration = {
49+
Duration(5, TimeUnit.SECONDS)
50+
}
51+
52+
private def connectTimeout(): Duration = {
53+
Duration(2, TimeUnit.SECONDS)
54+
}
55+
56+
private def writeTimeout(): Duration = {
57+
Duration(30, TimeUnit.SECONDS)
58+
}
59+
4360
private def hosts(region: Option[String] = None): Seq[Host] = {
4461
val allowedRegions = Seq("de", "us")
4562
if (region.isDefined && !allowedRegions.contains(region.get)) {
@@ -61,6 +78,9 @@ class InsightsClient(
6178
apiKey = apiKey,
6279
clientName = "Insights",
6380
defaultHosts = hosts(region),
81+
defaultReadTimeout = readTimeout(),
82+
defaultWriteTimeout = writeTimeout(),
83+
defaultConnectTimeout = connectTimeout(),
6484
formats = JsonSupport.format,
6585
options = clientOptions
6686
) {

src/main/scala/algoliasearch/api/MonitoringClient.scala

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,20 @@ import algoliasearch.monitoring.Unauthorized
1818
import algoliasearch.monitoring._
1919
import algoliasearch.ApiClient
2020
import algoliasearch.api.MonitoringClient.hosts
21+
import algoliasearch.api.MonitoringClient.readTimeout
22+
import algoliasearch.api.MonitoringClient.writeTimeout
23+
import algoliasearch.api.MonitoringClient.connectTimeout
2124
import algoliasearch.config._
2225
import algoliasearch.internal.util._
2326

27+
import java.util.concurrent.TimeUnit
28+
import scala.concurrent.duration.Duration
2429
import scala.concurrent.{ExecutionContext, Future}
2530
import scala.util.Random
2631

2732
object MonitoringClient {
2833

29-
/** Creates a new SearchApi instance using default hosts.
34+
/** Creates a new MonitoringClient instance using default hosts.
3035
*
3136
* @param appId
3237
* application ID
@@ -46,6 +51,18 @@ object MonitoringClient {
4651
clientOptions = clientOptions
4752
)
4853

54+
private def readTimeout(): Duration = {
55+
Duration(5, TimeUnit.SECONDS)
56+
}
57+
58+
private def connectTimeout(): Duration = {
59+
Duration(2, TimeUnit.SECONDS)
60+
}
61+
62+
private def writeTimeout(): Duration = {
63+
Duration(30, TimeUnit.SECONDS)
64+
}
65+
4966
private def hosts(): Seq[Host] = {
5067
List(
5168
Host("status.algolia.com", Set(CallType.Read, CallType.Write))
@@ -62,6 +79,9 @@ class MonitoringClient(
6279
apiKey = apiKey,
6380
clientName = "Monitoring",
6481
defaultHosts = hosts(),
82+
defaultReadTimeout = readTimeout(),
83+
defaultWriteTimeout = writeTimeout(),
84+
defaultConnectTimeout = connectTimeout(),
6585
formats = JsonSupport.format,
6686
options = clientOptions
6787
) {

src/main/scala/algoliasearch/api/PersonalizationClient.scala

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,20 @@ import algoliasearch.personalization.SetPersonalizationStrategyResponse
1111
import algoliasearch.personalization._
1212
import algoliasearch.ApiClient
1313
import algoliasearch.api.PersonalizationClient.hosts
14+
import algoliasearch.api.PersonalizationClient.readTimeout
15+
import algoliasearch.api.PersonalizationClient.writeTimeout
16+
import algoliasearch.api.PersonalizationClient.connectTimeout
1417
import algoliasearch.config._
1518
import algoliasearch.internal.util._
1619

20+
import java.util.concurrent.TimeUnit
21+
import scala.concurrent.duration.Duration
1722
import scala.concurrent.{ExecutionContext, Future}
1823
import scala.util.Random
1924

2025
object PersonalizationClient {
2126

22-
/** Creates a new SearchApi instance using default hosts.
27+
/** Creates a new PersonalizationClient instance using default hosts.
2328
*
2429
* @param appId
2530
* application ID
@@ -42,6 +47,18 @@ object PersonalizationClient {
4247
clientOptions = clientOptions
4348
)
4449

50+
private def readTimeout(): Duration = {
51+
Duration(5, TimeUnit.SECONDS)
52+
}
53+
54+
private def connectTimeout(): Duration = {
55+
Duration(2, TimeUnit.SECONDS)
56+
}
57+
58+
private def writeTimeout(): Duration = {
59+
Duration(30, TimeUnit.SECONDS)
60+
}
61+
4562
private def hosts(region: String): Seq[Host] = {
4663
val allowedRegions = Seq("eu", "us")
4764
if (!allowedRegions.contains(region)) {
@@ -64,6 +81,9 @@ class PersonalizationClient(
6481
apiKey = apiKey,
6582
clientName = "Personalization",
6683
defaultHosts = hosts(region),
84+
defaultReadTimeout = readTimeout(),
85+
defaultWriteTimeout = writeTimeout(),
86+
defaultConnectTimeout = connectTimeout(),
6787
formats = JsonSupport.format,
6888
options = clientOptions
6989
) {

0 commit comments

Comments
 (0)