Skip to content

Commit 04aab6e

Browse files
authored
Add a ping option to colibri2 connect. (#1269)
* Add a ping option to colibri2 connect. * Update jicoco. * chore: Update deps. * Adjust default ping interval, enable by default.
1 parent d8333e9 commit 04aab6e

5 files changed

Lines changed: 141 additions & 5 deletions

File tree

jicofo-selector/src/main/kotlin/org/jitsi/jicofo/TranscriptionConfig.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,11 @@ package org.jitsi.jicofo
1919

2020
import com.typesafe.config.ConfigObject
2121
import org.jitsi.config.JitsiConfig
22+
import org.jitsi.metaconfig.config
2223
import org.jitsi.metaconfig.optionalconfig
2324
import org.jitsi.utils.TemplatedUrl
2425
import org.jitsi.utils.logging2.createLogger
26+
import java.time.Duration
2527

2628
class TranscriptionConfig private constructor() {
2729
val logger = createLogger()
@@ -47,6 +49,18 @@ class TranscriptionConfig private constructor() {
4749
val httpHeaders: Map<String, String>
4850
get() = httpHeadersProp ?: emptyMap()
4951

52+
val pingEnabled: Boolean by config {
53+
"jicofo.transcription.ping.enabled".from(JitsiConfig.newConfig)
54+
}
55+
56+
val pingInterval: Duration by config {
57+
"jicofo.transcription.ping.interval".from(JitsiConfig.newConfig)
58+
}
59+
60+
val pingTimeout: Duration by config {
61+
"jicofo.transcription.ping.timeout".from(JitsiConfig.newConfig)
62+
}
63+
5064
fun getUrl(meetingId: String): TemplatedUrl? = urlTemplate?.let {
5165
TemplatedUrl(it, requiredKeys = setOf(REGION_TEMPLATE)).apply {
5266
set(MEETING_ID_TEMPLATE, meetingId)

jicofo-selector/src/main/kotlin/org/jitsi/jicofo/bridge/colibri/Colibri2Session.kt

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,15 @@ class Colibri2Session(
202202
transcriberUrl?.let {
203203
val url = resolveTranscriberUrl(it)
204204
logger.info("Adding connect for transcriber, url=$url")
205-
addConnect(createConnect(url, TranscriptionConfig.config.httpHeaders))
205+
addConnect(
206+
createConnect(
207+
url,
208+
TranscriptionConfig.config.httpHeaders,
209+
TranscriptionConfig.config.pingEnabled,
210+
TranscriptionConfig.config.pingInterval.toMillis().toInt(),
211+
TranscriptionConfig.config.pingTimeout.toMillis().toInt()
212+
)
213+
)
206214
}
207215
}
208216
}
@@ -218,7 +226,15 @@ class Colibri2Session(
218226
if (urlTemplate != null) {
219227
val url = resolveTranscriberUrl(urlTemplate)
220228
logger.info("Adding connect, url=$url")
221-
request.addConnect(createConnect(url, TranscriptionConfig.config.httpHeaders))
229+
request.addConnect(
230+
createConnect(
231+
url,
232+
TranscriptionConfig.config.httpHeaders,
233+
TranscriptionConfig.config.pingEnabled,
234+
TranscriptionConfig.config.pingInterval.toMillis().toInt(),
235+
TranscriptionConfig.config.pingTimeout.toMillis().toInt()
236+
)
237+
)
222238
} else {
223239
logger.info("Removing connects")
224240
request.setEmptyConnects()
@@ -581,7 +597,13 @@ private fun ConferenceModifyIQ.Builder.addExpire(endpointId: String) = addEndpoi
581597
}.build()
582598
)
583599

584-
private fun createConnect(url: URI, httpHeaders: Map<String, String> = emptyMap()) = Connect(
600+
private fun createConnect(
601+
url: URI,
602+
httpHeaders: Map<String, String> = emptyMap(),
603+
pingEnabled: Boolean = false,
604+
pingInterval: Int = 0,
605+
pingTimeout: Int = 0
606+
) = Connect(
585607
url = url,
586608
type = Connect.Types.TRANSCRIBER,
587609
protocol = Connect.Protocols.MEDIAJSON,
@@ -590,4 +612,7 @@ private fun createConnect(url: URI, httpHeaders: Map<String, String> = emptyMap(
590612
httpHeaders.forEach { (name, value) ->
591613
addHttpHeader(name, value)
592614
}
615+
if (pingEnabled) {
616+
setPing(pingInterval, pingTimeout)
617+
}
593618
}

jicofo-selector/src/main/resources/reference.conf

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -446,6 +446,16 @@ jicofo {
446446
// "Authorization" = "Bearer your-api-key"
447447
// "Sec-Websocket-Protocol" = "my proto"
448448
}
449+
450+
# Ping configuration for the transcription service connection
451+
ping {
452+
# Whether to enable ping messages
453+
enabled = true
454+
# Interval between ping messages
455+
interval = 10 seconds
456+
# Timeout for ping responses
457+
timeout = 3 seconds
458+
}
449459
}
450460

451461
xmpp {

jicofo-selector/src/test/kotlin/org/jitsi/jicofo/TranscriptionConfigTest.kt

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ package org.jitsi.jicofo
2020
import io.kotest.core.spec.style.ShouldSpec
2121
import io.kotest.matchers.shouldBe
2222
import org.jitsi.config.withNewConfig
23+
import java.time.Duration
2324

2425
class TranscriptionConfigTest : ShouldSpec() {
2526
init {
@@ -103,5 +104,91 @@ class TranscriptionConfigTest : ShouldSpec() {
103104
}
104105
}
105106
}
107+
108+
context("ping") {
109+
context("With default values") {
110+
withNewConfig(
111+
"""
112+
jicofo.transcription.ping {
113+
enabled = false
114+
interval = 5 seconds
115+
timeout = 3 seconds
116+
}
117+
""".trimIndent()
118+
) {
119+
val config = TranscriptionConfig.config
120+
config.pingEnabled shouldBe false
121+
config.pingInterval shouldBe Duration.ofSeconds(5)
122+
config.pingTimeout shouldBe Duration.ofSeconds(3)
123+
}
124+
}
125+
126+
context("With ping enabled") {
127+
withNewConfig(
128+
"""
129+
jicofo.transcription.ping {
130+
enabled = true
131+
interval = 10 seconds
132+
timeout = 5 seconds
133+
}
134+
""".trimIndent()
135+
) {
136+
val config = TranscriptionConfig.config
137+
config.pingEnabled shouldBe true
138+
config.pingInterval shouldBe Duration.ofSeconds(10)
139+
config.pingTimeout shouldBe Duration.ofSeconds(5)
140+
}
141+
}
142+
143+
context("With ping in milliseconds") {
144+
withNewConfig(
145+
"""
146+
jicofo.transcription.ping {
147+
enabled = true
148+
interval = 1500 milliseconds
149+
timeout = 500 milliseconds
150+
}
151+
""".trimIndent()
152+
) {
153+
val config = TranscriptionConfig.config
154+
config.pingEnabled shouldBe true
155+
config.pingInterval shouldBe Duration.ofMillis(1500)
156+
config.pingTimeout shouldBe Duration.ofMillis(500)
157+
}
158+
}
159+
160+
context("Complete configuration with URL, headers and ping") {
161+
withNewConfig(
162+
"""
163+
jicofo.transcription {
164+
url-template = "wss://{{REGION}}.example.com/recorder/{{MEETING_ID}}"
165+
http-headers {
166+
"Authorization" = "Bearer api-token"
167+
}
168+
ping {
169+
enabled = true
170+
interval = 30 seconds
171+
timeout = 10 seconds
172+
}
173+
}
174+
""".trimIndent()
175+
) {
176+
val config = TranscriptionConfig.config
177+
178+
// Test URL
179+
val url = config.getUrl("test-meeting-123")
180+
url?.resolve("REGION", "us-west")?.toString() shouldBe
181+
"wss://us-west.example.com/recorder/test-meeting-123"
182+
183+
// Test headers
184+
config.httpHeaders shouldBe mapOf("Authorization" to "Bearer api-token")
185+
186+
// Test ping
187+
config.pingEnabled shouldBe true
188+
config.pingInterval shouldBe Duration.ofSeconds(30)
189+
config.pingTimeout shouldBe Duration.ofSeconds(10)
190+
}
191+
}
192+
}
106193
}
107194
}

pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
<slf4j.version>1.7.32</slf4j.version>
4545
<jackson.version>2.19.0</jackson.version>
4646
<jitsi.utils.version>1.0-147-g12d0b20</jitsi.utils.version>
47-
<jicoco.version>1.1-160-g4ad2288</jicoco.version>
47+
<jicoco.version>1.1-166-gd76c6ed</jicoco.version>
4848
<ktlint-maven-plugin.version>3.0.0</ktlint-maven-plugin.version>
4949
<spotbugs.version>4.8.6</spotbugs.version>
5050
<spotbugs-maven-plugin.version>4.8.6.6</spotbugs-maven-plugin.version>
@@ -176,7 +176,7 @@
176176
<dependency>
177177
<groupId>${project.groupId}</groupId>
178178
<artifactId>jitsi-xmpp-extensions</artifactId>
179-
<version>1.0-101-g2c9a6d6</version>
179+
<version>1.0-105-g07af8a9</version>
180180
</dependency>
181181
<dependency>
182182
<groupId>org.slf4j</groupId>

0 commit comments

Comments
 (0)