Skip to content

Commit 08dabd4

Browse files
kikkiaduncte123
andauthored
Add http timeout configuration for nodes (#22)
* Add http timeout configuration for nodes * add param in comment for httpTimeout * Update src/main/kotlin/dev/arbjerg/lavalink/client/LavalinkNode.kt Co-authored-by: Duncan Sterken <[email protected]> * add LavalinkNodeOptions * remove some unused imports in LavalinkClient * update nodeOptions constructor to private, update example JDA bot to use new NodeOptions builder * update builder to set naming --------- Co-authored-by: Duncan Sterken <[email protected]>
1 parent 6c9bdc9 commit 08dabd4

File tree

5 files changed

+94
-28
lines changed

5 files changed

+94
-28
lines changed

src/main/kotlin/dev/arbjerg/lavalink/client/LavalinkClient.kt

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,24 @@ class LavalinkClient(val userId: Long) : Closeable, Disposable {
6262
* @param regionFilter (not currently used) Allows you to limit your node to a specific discord voice region
6363
*/
6464
@JvmOverloads
65+
@Deprecated("Use NodeOptions instead",
66+
ReplaceWith("addNode(NodeOptions.Builder()...build())")
67+
)
6568
fun addNode(name: String, address: URI, password: String, regionFilter: IRegionFilter? = null): LavalinkNode {
66-
if (nodes.any { it.name == name }) {
67-
throw IllegalStateException("Node with name '$name' already exists")
69+
return addNode(NodeOptions.Builder().setName(name).setServerUri(address).setPassword(password).setRegionFilter(regionFilter).build())
70+
}
71+
72+
/**
73+
* Add a node to the client.
74+
*
75+
* @param nodeOptions a populated NodeOptionsObject
76+
*/
77+
fun addNode(nodeOptions: NodeOptions): LavalinkNode {
78+
if (nodes.any { it.name == nodeOptions.name }) {
79+
throw IllegalStateException("Node with name '${nodeOptions.name}' already exists")
6880
}
6981

70-
val node = LavalinkNode(name, address, password, regionFilter, this)
82+
val node = LavalinkNode(nodeOptions, this)
7183
internalNodes.add(node)
7284

7385
listenForNodeEvent(node)

src/main/kotlin/dev/arbjerg/lavalink/client/LavalinkNode.kt

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
11
package dev.arbjerg.lavalink.client
22

33
import dev.arbjerg.lavalink.client.http.HttpBuilder
4-
import dev.arbjerg.lavalink.client.loadbalancing.IRegionFilter
54
import dev.arbjerg.lavalink.client.protocol.LavalinkLoadResult
65
import dev.arbjerg.lavalink.client.protocol.Track
76
import dev.arbjerg.lavalink.client.protocol.toCustom
87
import dev.arbjerg.lavalink.client.protocol.toLavalinkLoadResult
9-
import dev.arbjerg.lavalink.internal.LavalinkRestClient
10-
import dev.arbjerg.lavalink.internal.LavalinkSocket
8+
import dev.arbjerg.lavalink.internal.*
119
import dev.arbjerg.lavalink.internal.error.RestException
12-
import dev.arbjerg.lavalink.internal.fromRawJson
1310
import dev.arbjerg.lavalink.internal.loadbalancing.Penalties
1411
import dev.arbjerg.lavalink.internal.toLavalinkPlayer
1512
import dev.arbjerg.lavalink.protocol.v4.*
@@ -28,28 +25,29 @@ import reactor.core.publisher.Sinks.Many
2825
import reactor.kotlin.core.publisher.toMono
2926
import java.io.Closeable
3027
import java.io.IOException
31-
import java.net.URI
3228
import java.util.concurrent.ConcurrentHashMap
29+
import java.util.concurrent.TimeUnit
3330
import java.util.function.Consumer
3431
import java.util.function.UnaryOperator
3532

3633
/**
3734
* The Node is a physical instance of the lavalink server software.
3835
*/
3936
class LavalinkNode(
40-
val name: String,
41-
serverUri: URI,
42-
val password: String,
43-
val regionFilter: IRegionFilter?,
37+
private val nodeOptions: NodeOptions,
4438
val lavalink: LavalinkClient
4539
) : Disposable, Closeable {
4640
// "safe" uri with all paths removed
47-
val baseUri = "${serverUri.scheme}://${serverUri.host}:${serverUri.port}"
41+
val baseUri = "${nodeOptions.serverUri.scheme}://${nodeOptions.serverUri.host}:${nodeOptions.serverUri.port}"
42+
43+
val name = nodeOptions.name
44+
val regionFilter = nodeOptions.regionFilter
45+
val password = nodeOptions.password
4846

4947
var sessionId: String? = null
5048
internal set
5149

52-
internal val httpClient = OkHttpClient()
50+
internal val httpClient = OkHttpClient.Builder().callTimeout(nodeOptions.httpTimeout, TimeUnit.MILLISECONDS).build()
5351

5452
internal val sink: Many<ClientEvent<*>> = Sinks.many().multicast().onBackpressureBuffer()
5553
val flux: Flux<ClientEvent<*>> = sink.asFlux()
@@ -420,19 +418,13 @@ class LavalinkNode(
420418

421419
other as LavalinkNode
422420

423-
if (name != other.name) return false
424-
if (password != other.password) return false
425-
if (regionFilter != other.regionFilter) return false
426-
if (baseUri != other.baseUri) return false
421+
if (nodeOptions != other.nodeOptions) return false
427422
if (sessionId != other.sessionId) return false
428423
return available == other.available
429424
}
430425

431426
override fun hashCode(): Int {
432-
var result = name.hashCode()
433-
result = 31 * result + password.hashCode()
434-
result = 31 * result + regionFilter.hashCode()
435-
result = 31 * result + baseUri.hashCode()
427+
var result = nodeOptions.hashCode()
436428
result = 31 * result + sessionId.hashCode()
437429
result = 31 * result + available.hashCode()
438430
return result
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package dev.arbjerg.lavalink.client
2+
3+
import dev.arbjerg.lavalink.client.loadbalancing.IRegionFilter
4+
import dev.arbjerg.lavalink.internal.TIMEOUT_MS
5+
import java.net.URI
6+
7+
data class NodeOptions private constructor(val name: String,
8+
val serverUri: URI,
9+
val password: String,
10+
val regionFilter: IRegionFilter?,
11+
val httpTimeout: Long) {
12+
data class Builder(
13+
private var name: String? = null,
14+
private var serverUri: URI? = null,
15+
private var password: String? = null,
16+
private var regionFilter: IRegionFilter? = null,
17+
private var httpTimeout: Long = TIMEOUT_MS,
18+
) {
19+
fun setName(name: String) = apply { this.name = name }
20+
21+
/**
22+
* Sets the server URI of the Lavalink Node.
23+
* @param serverUriString - String representation of server uri
24+
*/
25+
fun setServerUri(serverUriString: String) = apply { this.serverUri = URI(serverUriString) }
26+
/**
27+
* Sets the server URI of the Lavalink Node.
28+
* @param serverUri - Server uri
29+
*/
30+
fun setServerUri(serverUri: URI) = apply { this.serverUri = serverUri }
31+
/**
32+
* Sets the password to access the node.
33+
* @param password - Server password
34+
*/
35+
fun setPassword(password: String) = apply { this.password = password }
36+
37+
/**
38+
* Sets a region filter on the node for regional load balancing (Default: none)
39+
*/
40+
fun setRegionFilter(regionFilter: IRegionFilter?) = apply { this.regionFilter = regionFilter }
41+
42+
/**
43+
* Sets the http total call timeout. (Default: 10000ms)
44+
* @param httpTimeout - timeout in ms
45+
*/
46+
fun setHttpTimeout(httpTimeout: Long) = apply { this.httpTimeout = httpTimeout }
47+
48+
fun build(): NodeOptions {
49+
requireNotNull(name) { "name is required" }
50+
requireNotNull(serverUri) { "serverUri is required" }
51+
requireNotNull(password) { "password is required" }
52+
53+
return NodeOptions(
54+
name!!,
55+
serverUri!!,
56+
password!!,
57+
regionFilter,
58+
httpTimeout)
59+
}
60+
}
61+
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
package dev.arbjerg.lavalink.internal
22

3-
internal const val TIMEOUT_MS = 5000
3+
internal const val TIMEOUT_MS = 10000L
44
internal const val METRIC_MAX_HISTORY = 100

src/test/java/JavaJDAExample.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,12 @@ private void registerLavalinkNodes() {
5656
RegionGroup.EUROPE
5757
),*/
5858

59-
client.addNode(
60-
"Mac-mini",
61-
URI.create("ws://mac-mini.local.duncte123.lgbt:2333/bepis"),
62-
"youshallnotpass",
63-
RegionGroup.US
59+
client.addNode(new NodeOptions.Builder().setName("Mac-mini")
60+
.setServerUri(URI.create("ws://mac-mini.local.duncte123.lgbt:2333/bepis"))
61+
.setPassword("youshallnotpass")
62+
.setRegionFilter(RegionGroup.US)
63+
.setHttpTimeout(5000L)
64+
.build()
6465
)
6566
).forEach((node) -> {
6667
node.on(TrackStartEvent.class).subscribe((event) -> {

0 commit comments

Comments
 (0)