diff --git a/.editorconfig b/.editorconfig
index be159f48c..fbe6d50b3 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -1,9 +1,9 @@
[*.{kt,kts}]
-# Comma-separated list of rules to disable (Since 0.34.0)
-# Note that rules in any ruleset other than the standard ruleset will need to be prefixed
-# by the ruleset identifier.
-# intellij currently has no setting to set sort order, and its
-# default behavior directly contradicts what this rule wants. see
-# https://youtrack.jetbrains.com/issue/KT-10974
-disabled_rules=import-ordering
max_line_length=120
+
+# I find trailing commas annoying
+ktlint_standard_trailing-comma-on-call-site = disabled
+ktlint_standard_trailing-comma-on-declaration-site = disabled
+
+# This forbids underscores in package names, which we use
+ktlint_standard_package-name = disabled
diff --git a/pom.xml b/pom.xml
index d6c63c43c..73612df98 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,19 +10,19 @@
3.12.0
- 1.6.21
+ 1.9.10
org.jitsi.jibri.MainKt
1.8
1.8
11
2.9.5
- 5.8.2
- 5.3.0
- 1.10.0
- 2.0.2-jitsi
+ 5.10.0
+ 5.7.2
+ 1.13.8
+ 2.3.4
0.11.5
- 1.1-113-g4e7ea8b
- 1.0-119-ga7b23ff
+ 1.1-127-gf49982f
+ 1.0-127-g6c65524
@@ -140,7 +140,7 @@
io.ktor
- ktor-server-jetty11-jvm
+ ktor-server-jetty-jakarta-jvm
${ktor.version}
@@ -201,13 +201,7 @@
org.jitsi
jicoco-test-kotlin
- 1.1-79-g6099be5
-
-
- org.jetbrains.kotlin
- kotlin-stdlib-jdk8
-
-
+ ${jicoco.version}
io.kotest
@@ -235,7 +229,7 @@
io.mockk
- mockk
+ mockk-jvm
${mockk.version}
test
@@ -259,7 +253,7 @@
io.ktor
- ktor-client-jetty11-jvm
+ ktor-client-jetty-jakarta-jvm
${ktor.version}
test
@@ -411,7 +405,7 @@
com.github.gantsign.maven
ktlint-maven-plugin
- 1.13.1
+ 2.0.0
${project.basedir}/src/main/kotlin
diff --git a/src/main/kotlin/org/jitsi/jibri/JibriManager.kt b/src/main/kotlin/org/jitsi/jibri/JibriManager.kt
index 6e3c5f72b..8c3f907ca 100644
--- a/src/main/kotlin/org/jitsi/jibri/JibriManager.kt
+++ b/src/main/kotlin/org/jitsi/jibri/JibriManager.kt
@@ -85,11 +85,13 @@ data class FileRecordingRequestParams(
class JibriManager : StatusPublisher() {
private val logger = createLogger()
private var currentActiveService: JibriService? = null
+
/**
* Store some arbitrary context optionally sent in the start service request so that we can report it in our
* status
*/
var currentEnvironmentContext: EnvironmentContext? = null
+
/**
* A function which will be executed the next time this Jibri is idle. This can be used to schedule work that
* can't be run while a Jibri session is active
diff --git a/src/main/kotlin/org/jitsi/jibri/Main.kt b/src/main/kotlin/org/jitsi/jibri/Main.kt
index dc64ee56f..94894745e 100644
--- a/src/main/kotlin/org/jitsi/jibri/Main.kt
+++ b/src/main/kotlin/org/jitsi/jibri/Main.kt
@@ -18,7 +18,7 @@
package org.jitsi.jibri
import io.ktor.server.engine.embeddedServer
-import io.ktor.server.jetty11.Jetty
+import io.ktor.server.jetty.jakarta.Jetty
import kotlinx.coroutines.CancellationException
import net.sourceforge.argparse4j.ArgumentParsers
import org.jitsi.jibri.api.http.HttpApi
diff --git a/src/main/kotlin/org/jitsi/jibri/api/http/HttpApi.kt b/src/main/kotlin/org/jitsi/jibri/api/http/HttpApi.kt
index 936e12f41..d59cc0cd1 100644
--- a/src/main/kotlin/org/jitsi/jibri/api/http/HttpApi.kt
+++ b/src/main/kotlin/org/jitsi/jibri/api/http/HttpApi.kt
@@ -16,18 +16,19 @@
package org.jitsi.jibri.api.http
+import io.ktor.http.HttpStatusCode
+import io.ktor.serialization.jackson.jackson
import io.ktor.server.application.Application
import io.ktor.server.application.call
import io.ktor.server.application.install
import io.ktor.server.plugins.contentnegotiation.ContentNegotiation
-import io.ktor.http.HttpStatusCode
-import io.ktor.serialization.jackson.jackson
import io.ktor.server.request.receive
import io.ktor.server.response.respond
import io.ktor.server.routing.get
import io.ktor.server.routing.post
import io.ktor.server.routing.route
import io.ktor.server.routing.routing
+import jakarta.ws.rs.core.Response
import org.jitsi.jibri.FileRecordingRequestParams
import org.jitsi.jibri.JibriBusyException
import org.jitsi.jibri.JibriManager
@@ -41,15 +42,14 @@ import org.jitsi.jibri.service.ServiceParams
import org.jitsi.jibri.service.impl.SipGatewayServiceParams
import org.jitsi.jibri.service.impl.StreamingParams
import org.jitsi.jibri.sipgateway.SipClientParams
-import org.jitsi.jibri.status.JibriSessionStatus
import org.jitsi.jibri.status.ComponentState
import org.jitsi.jibri.status.JibriFailure
+import org.jitsi.jibri.status.JibriSessionStatus
import org.jitsi.jibri.status.JibriStatusManager
import org.jitsi.jibri.webhooks.v1.WebhookClient
import org.jitsi.metaconfig.config
import org.jitsi.utils.logging2.createLogger
import org.jitsi.xmpp.extensions.jibri.JibriIq
-import jakarta.ws.rs.core.Response
// TODO: this needs to include usageTimeout
data class StartServiceParams(
@@ -145,7 +145,8 @@ class HttpApi(
serviceState.error
)
val componentSessionStatus = JibriSessionStatus(
- serviceParams.sessionId, JibriIq.Status.OFF,
+ serviceParams.sessionId,
+ JibriIq.Status.OFF,
serviceParams.sipClientParams?.sipAddress,
failure,
serviceState.error.shouldRetry()
@@ -158,7 +159,8 @@ class HttpApi(
}
is ComponentState.Finished -> {
val componentSessionStatus = JibriSessionStatus(
- serviceParams.sessionId, JibriIq.Status.OFF,
+ serviceParams.sessionId,
+ JibriIq.Status.OFF,
serviceParams.sipClientParams?.sipAddress
)
logger.info("Current service finished, sending status off $componentSessionStatus")
@@ -166,7 +168,8 @@ class HttpApi(
}
is ComponentState.Running -> {
val componentSessionStatus = JibriSessionStatus(
- serviceParams.sessionId, JibriIq.Status.ON,
+ serviceParams.sessionId,
+ JibriIq.Status.ON,
serviceParams.sipClientParams?.sipAddress
)
logger.info("Current service started up successfully, sending status on $componentSessionStatus")
diff --git a/src/main/kotlin/org/jitsi/jibri/api/http/internal/InternalHttpApi.kt b/src/main/kotlin/org/jitsi/jibri/api/http/internal/InternalHttpApi.kt
index 74f5e8e93..7906f9024 100644
--- a/src/main/kotlin/org/jitsi/jibri/api/http/internal/InternalHttpApi.kt
+++ b/src/main/kotlin/org/jitsi/jibri/api/http/internal/InternalHttpApi.kt
@@ -16,13 +16,13 @@
package org.jitsi.jibri.api.http.internal
+import io.ktor.http.HttpStatusCode
+import io.ktor.serialization.jackson.jackson
import io.ktor.server.application.Application
import io.ktor.server.application.ApplicationCall
import io.ktor.server.application.call
import io.ktor.server.application.install
import io.ktor.server.plugins.contentnegotiation.ContentNegotiation
-import io.ktor.http.HttpStatusCode
-import io.ktor.serialization.jackson.jackson
import io.ktor.server.response.respond
import io.ktor.server.routing.post
import io.ktor.server.routing.route
diff --git a/src/main/kotlin/org/jitsi/jibri/api/xmpp/JibriStatusExts.kt b/src/main/kotlin/org/jitsi/jibri/api/xmpp/JibriStatusExts.kt
index b554319ed..4c31e490f 100644
--- a/src/main/kotlin/org/jitsi/jibri/api/xmpp/JibriStatusExts.kt
+++ b/src/main/kotlin/org/jitsi/jibri/api/xmpp/JibriStatusExts.kt
@@ -16,12 +16,12 @@
*/
package org.jitsi.jibri.api.xmpp
-import org.jitsi.xmpp.extensions.health.HealthStatusPacketExt
-import org.jitsi.xmpp.extensions.jibri.JibriBusyStatusPacketExt
-import org.jitsi.xmpp.extensions.jibri.JibriStatusPacketExt
import org.jitsi.jibri.status.ComponentBusyStatus
import org.jitsi.jibri.status.ComponentHealthStatus
import org.jitsi.jibri.status.JibriStatus
+import org.jitsi.xmpp.extensions.health.HealthStatusPacketExt
+import org.jitsi.xmpp.extensions.jibri.JibriBusyStatusPacketExt
+import org.jitsi.xmpp.extensions.jibri.JibriStatusPacketExt
import java.lang.RuntimeException
/**
diff --git a/src/main/kotlin/org/jitsi/jibri/api/xmpp/XmppApi.kt b/src/main/kotlin/org/jitsi/jibri/api/xmpp/XmppApi.kt
index ebf5c4c9b..fb52bd3d2 100644
--- a/src/main/kotlin/org/jitsi/jibri/api/xmpp/XmppApi.kt
+++ b/src/main/kotlin/org/jitsi/jibri/api/xmpp/XmppApi.kt
@@ -141,7 +141,9 @@ class XmppApi(
PingManager.setDefaultPingInterval(30)
JibriStatusPacketExt.registerExtensionProvider()
ProviderManager.addIQProvider(
- JibriIq.ELEMENT, JibriIq.NAMESPACE, JibriIqProvider()
+ JibriIq.ELEMENT,
+ JibriIq.NAMESPACE,
+ JibriIqProvider()
)
updatePresence(jibriStatusManager.overallStatus)
jibriStatusManager.addStatusHandler(::updatePresence)
diff --git a/src/main/kotlin/org/jitsi/jibri/capture/ffmpeg/FfmpegStatusStateMachine.kt b/src/main/kotlin/org/jitsi/jibri/capture/ffmpeg/FfmpegStatusStateMachine.kt
index acbfef341..eed4d72d7 100644
--- a/src/main/kotlin/org/jitsi/jibri/capture/ffmpeg/FfmpegStatusStateMachine.kt
+++ b/src/main/kotlin/org/jitsi/jibri/capture/ffmpeg/FfmpegStatusStateMachine.kt
@@ -26,6 +26,7 @@ sealed class FfmpegEvent(val outputLine: String) {
class ErrorLine(val error: JibriError) : FfmpegEvent(error.detail)
class FinishLine(outputLine: String) : FfmpegEvent(outputLine)
class OtherLine(outputLine: String) : FfmpegEvent(outputLine)
+
/**
* Used any time Ffmpeg has exited, regardless of what [outputLine] contains. However,
* [error] will be set if [outputLine] contains an error, so that we may describe the
diff --git a/src/main/kotlin/org/jitsi/jibri/capture/ffmpeg/OutputParser.kt b/src/main/kotlin/org/jitsi/jibri/capture/ffmpeg/OutputParser.kt
index 5d7812b1c..1a366ba02 100644
--- a/src/main/kotlin/org/jitsi/jibri/capture/ffmpeg/OutputParser.kt
+++ b/src/main/kotlin/org/jitsi/jibri/capture/ffmpeg/OutputParser.kt
@@ -41,6 +41,7 @@ open class FfmpegOutputStatus(val lineType: OutputLineClassification, val detail
* Represents a line of ffmpeg output that indicated there was a warning.
*/
open class FfmpegErrorStatus(val error: JibriError) : FfmpegOutputStatus(OutputLineClassification.ERROR, error.detail)
+
/**
* Represents a line of ffmpeg output that indicated a bad RTMP URL
*/
diff --git a/src/main/kotlin/org/jitsi/jibri/config/JibriConfig.kt b/src/main/kotlin/org/jitsi/jibri/config/JibriConfig.kt
index d0f4e3e5f..03b3689f4 100644
--- a/src/main/kotlin/org/jitsi/jibri/config/JibriConfig.kt
+++ b/src/main/kotlin/org/jitsi/jibri/config/JibriConfig.kt
@@ -141,19 +141,25 @@ fun com.typesafe.config.Config.toXmppEnvironment(): XmppEnvironmentConfig =
xmppDomain = getString("xmpp-domain"),
baseUrl = if (hasPath("base-url")) {
getString("base-url")
- } else null,
+ } else {
+ null
+ },
controlLogin = getConfig("control-login").toXmppCredentials(),
controlMuc = getConfig("control-muc").toXmppMuc(),
sipControlMuc = if (hasPath("sip-control-muc")) {
getConfig("sip-control-muc").toXmppMuc()
- } else null,
+ } else {
+ null
+ },
callLogin = getConfig("call-login").toXmppCredentials(),
stripFromRoomDomain = getString("strip-from-room-domain"),
usageTimeoutMins = getDuration("usage-timeout").toMinutes().toInt(),
trustAllXmppCerts = getBoolean("trust-all-xmpp-certs"),
securityMode = if (hasPath("security-mode")) {
getEnum(ConnectionConfiguration.SecurityMode::class.java, "security-mode")
- } else null
+ } else {
+ null
+ }
)
data class JibriConfig(
diff --git a/src/main/kotlin/org/jitsi/jibri/selenium/status_checks/EmptyCallStatusCheck.kt b/src/main/kotlin/org/jitsi/jibri/selenium/status_checks/EmptyCallStatusCheck.kt
index bd8b762a4..dc8ffc15d 100644
--- a/src/main/kotlin/org/jitsi/jibri/selenium/status_checks/EmptyCallStatusCheck.kt
+++ b/src/main/kotlin/org/jitsi/jibri/selenium/status_checks/EmptyCallStatusCheck.kt
@@ -25,6 +25,7 @@ class EmptyCallStatusCheck(
init {
logger.info("Starting empty call check with a timeout of $callEmptyTimeout")
}
+
// The timestamp at which we last saw the call transition from
// non-empty to empty
private val callWentEmptyTime = StateTransitionTimeTracker(clock)
diff --git a/src/main/kotlin/org/jitsi/jibri/selenium/status_checks/IceConnectionStatusCheck.kt b/src/main/kotlin/org/jitsi/jibri/selenium/status_checks/IceConnectionStatusCheck.kt
index 06d249ed6..47efa4805 100644
--- a/src/main/kotlin/org/jitsi/jibri/selenium/status_checks/IceConnectionStatusCheck.kt
+++ b/src/main/kotlin/org/jitsi/jibri/selenium/status_checks/IceConnectionStatusCheck.kt
@@ -18,6 +18,7 @@ class IceConnectionStatusCheck(
private val clock: Clock = Clock.systemDefaultZone()
) : CallStatusCheck {
private val logger = createChildLogger(parentLogger)
+
// The last timestamp when ICE was connected. Initialized to give the same timeout for the initial connection.
private var timeOfLastSuccess = clock.instant()
diff --git a/src/main/kotlin/org/jitsi/jibri/selenium/status_checks/MediaReceivedStatusCheck.kt b/src/main/kotlin/org/jitsi/jibri/selenium/status_checks/MediaReceivedStatusCheck.kt
index a2e9692ad..50f62ef4d 100644
--- a/src/main/kotlin/org/jitsi/jibri/selenium/status_checks/MediaReceivedStatusCheck.kt
+++ b/src/main/kotlin/org/jitsi/jibri/selenium/status_checks/MediaReceivedStatusCheck.kt
@@ -24,9 +24,11 @@ class MediaReceivedStatusCheck(
private val clock: Clock = Clock.systemDefaultZone()
) : CallStatusCheck {
private val logger = createChildLogger(parentLogger)
+
// The last timestamp where we saw non-zero media. We default with the
// assumption we're receiving media.
private var timeOfLastMedia = clock.instant()
+
// The timestamp at which we last saw that all clients transitioned to muted
private val clientsAllMutedTransitionTime = StateTransitionTimeTracker(clock)
@@ -76,6 +78,7 @@ class MediaReceivedStatusCheck(
val noMediaTimeout: Duration by config {
"jibri.call-status-checks.no-media-timeout".from(Config.configSource)
}
+
/**
* How long we'll stay in the call if all participants are muted
*/
diff --git a/src/main/kotlin/org/jitsi/jibri/service/Errors.kt b/src/main/kotlin/org/jitsi/jibri/service/Errors.kt
index 772e281b5..1579b492c 100644
--- a/src/main/kotlin/org/jitsi/jibri/service/Errors.kt
+++ b/src/main/kotlin/org/jitsi/jibri/service/Errors.kt
@@ -1,4 +1,4 @@
-// ktlint-disable filename
+
/*
* Copyright @ 2018 - present 8x8, Inc.
@@ -16,6 +16,8 @@
* limitations under the License.
*/
+@file:Suppress("ktlint:standard:filename")
+
package org.jitsi.jibri.service
import org.jitsi.jibri.error.JibriError
diff --git a/src/main/kotlin/org/jitsi/jibri/service/impl/StreamingJibriService.kt b/src/main/kotlin/org/jitsi/jibri/service/impl/StreamingJibriService.kt
index 04ef5e7e7..1f53a6451 100644
--- a/src/main/kotlin/org/jitsi/jibri/service/impl/StreamingJibriService.kt
+++ b/src/main/kotlin/org/jitsi/jibri/service/impl/StreamingJibriService.kt
@@ -17,7 +17,6 @@
package org.jitsi.jibri.service.impl
-import org.jitsi.xmpp.extensions.jibri.JibriIq
import org.jitsi.jibri.capture.ffmpeg.FfmpegCapturer
import org.jitsi.jibri.config.Config
import org.jitsi.jibri.config.XmppCredentials
@@ -33,6 +32,7 @@ import org.jitsi.jibri.status.ComponentState
import org.jitsi.jibri.status.ErrorScope
import org.jitsi.jibri.util.whenever
import org.jitsi.metaconfig.config
+import org.jitsi.xmpp.extensions.jibri.JibriIq
import java.util.regex.Pattern
const val YOUTUBE_URL = "rtmp://a.rtmp.youtube.com/live2"
diff --git a/src/main/kotlin/org/jitsi/jibri/sink/impl/FileSink.kt b/src/main/kotlin/org/jitsi/jibri/sink/impl/FileSink.kt
index 15d867653..0b2f13851 100644
--- a/src/main/kotlin/org/jitsi/jibri/sink/impl/FileSink.kt
+++ b/src/main/kotlin/org/jitsi/jibri/sink/impl/FileSink.kt
@@ -39,8 +39,10 @@ class FileSink(recordingsDirectory: Path, callName: String, extension: String =
override val path: String = file.toString()
override val format: String = extension
override val options: Array = arrayOf(
- "-profile:v", "main",
- "-level", "3.1"
+ "-profile:v",
+ "main",
+ "-level",
+ "3.1"
)
companion object {
diff --git a/src/main/kotlin/org/jitsi/jibri/sink/impl/StreamSink.kt b/src/main/kotlin/org/jitsi/jibri/sink/impl/StreamSink.kt
index 6b295e41b..144b907d9 100644
--- a/src/main/kotlin/org/jitsi/jibri/sink/impl/StreamSink.kt
+++ b/src/main/kotlin/org/jitsi/jibri/sink/impl/StreamSink.kt
@@ -26,7 +26,9 @@ class StreamSink(val url: String, val streamingMaxBitrate: Int, val streamingBuf
override val path: String = url
override val format: String = "flv"
override val options: Array = arrayOf(
- "-maxrate", "${streamingMaxBitrate}k",
- "-bufsize", "${streamingBufSize}k"
+ "-maxrate",
+ "${streamingMaxBitrate}k",
+ "-bufsize",
+ "${streamingBufSize}k"
)
}
diff --git a/src/main/kotlin/org/jitsi/jibri/sipgateway/pjsua/PjsuaClient.kt b/src/main/kotlin/org/jitsi/jibri/sipgateway/pjsua/PjsuaClient.kt
index dd31cc6d4..fdb4d8257 100644
--- a/src/main/kotlin/org/jitsi/jibri/sipgateway/pjsua/PjsuaClient.kt
+++ b/src/main/kotlin/org/jitsi/jibri/sipgateway/pjsua/PjsuaClient.kt
@@ -90,7 +90,7 @@ class PjsuaClient(
)
command.add(
"--registrar=$sipScheme:${
- pjsuaClientParams.sipClientParams.userName.substringAfter('@')
+ pjsuaClientParams.sipClientParams.userName.substringAfter('@')
}"
)
command.add("--realm=*")
diff --git a/src/main/kotlin/org/jitsi/jibri/statsd/StatsDEvents.kt b/src/main/kotlin/org/jitsi/jibri/statsd/StatsDEvents.kt
index 1791e78fa..0dd85726b 100644
--- a/src/main/kotlin/org/jitsi/jibri/statsd/StatsDEvents.kt
+++ b/src/main/kotlin/org/jitsi/jibri/statsd/StatsDEvents.kt
@@ -27,6 +27,7 @@ const val XMPP_RECONNECTION_FAILED = "xmpp-reconnection-failed"
const val XMPP_PING_FAILED = "xmpp-ping-failed"
const val XMPP_CLOSED = "xmpp-closed"
const val XMPP_CLOSED_ON_ERROR = "xmpp-closed-on-error"
+
// A recording session was stopped because XMPP disconnected.
const val STOPPED_ON_XMPP_CLOSED = "stopped-on-xmpp-closed"
diff --git a/src/main/kotlin/org/jitsi/jibri/status/ComponentBusyStatus.kt b/src/main/kotlin/org/jitsi/jibri/status/ComponentBusyStatus.kt
index 5ede90370..1e29352d7 100644
--- a/src/main/kotlin/org/jitsi/jibri/status/ComponentBusyStatus.kt
+++ b/src/main/kotlin/org/jitsi/jibri/status/ComponentBusyStatus.kt
@@ -19,6 +19,7 @@ package org.jitsi.jibri.status
enum class ComponentBusyStatus {
BUSY,
IDLE,
+
/**
* This Jibri has exhausted its 'use' and needs action
* (e.g. a restart) before it can be used again
diff --git a/src/main/kotlin/org/jitsi/jibri/status/ComponentStates.kt b/src/main/kotlin/org/jitsi/jibri/status/ComponentStates.kt
index 1585efede..84bd47dc1 100644
--- a/src/main/kotlin/org/jitsi/jibri/status/ComponentStates.kt
+++ b/src/main/kotlin/org/jitsi/jibri/status/ComponentStates.kt
@@ -39,6 +39,7 @@ enum class ErrorScope {
* whole 'healthy'
*/
SESSION,
+
/**
* [SYSTEM] errors are unrecoverable, and will put Jibri in an unhealthy state
*/
diff --git a/src/main/kotlin/org/jitsi/jibri/status/JibriStatusManager.kt b/src/main/kotlin/org/jitsi/jibri/status/JibriStatusManager.kt
index 597271b61..9d87fcc53 100644
--- a/src/main/kotlin/org/jitsi/jibri/status/JibriStatusManager.kt
+++ b/src/main/kotlin/org/jitsi/jibri/status/JibriStatusManager.kt
@@ -70,6 +70,7 @@ data class JibriSessionStatus(
class JibriStatusManager : StatusPublisher() {
private val logger = Logger.getLogger(this::class.qualifiedName)
private val subComponentHealth: MutableMap = ConcurrentHashMap()
+
/**
* The overall [ComponentHealthStatus] for the entire Jibri, calculated by aggregating all sub-component
* health status
diff --git a/src/main/kotlin/org/jitsi/jibri/util/ProcessState.kt b/src/main/kotlin/org/jitsi/jibri/util/ProcessState.kt
index 1b663901d..79b6d05a2 100644
--- a/src/main/kotlin/org/jitsi/jibri/util/ProcessState.kt
+++ b/src/main/kotlin/org/jitsi/jibri/util/ProcessState.kt
@@ -52,10 +52,12 @@ enum class RunningStatus {
* state could be [Status.FINISHED] and it's now ready to be shutdown cleanly.
*/
RUNNING,
+
/**
* The process has exited
*/
EXITED,
+
/**
* The process failed to start
*/
diff --git a/src/main/kotlin/org/jitsi/jibri/util/ProcessWrapper.kt b/src/main/kotlin/org/jitsi/jibri/util/ProcessWrapper.kt
index 880903716..323c84622 100644
--- a/src/main/kotlin/org/jitsi/jibri/util/ProcessWrapper.kt
+++ b/src/main/kotlin/org/jitsi/jibri/util/ProcessWrapper.kt
@@ -40,6 +40,7 @@ class ProcessWrapper(
private val runtime: Runtime = Runtime.getRuntime()
) {
private val logger = createChildLogger(parentLogger)
+
/**
* The actual underlying [Process] this wrapper
* wraps
diff --git a/src/main/kotlin/org/jitsi/jibri/util/RefreshingProperty.kt b/src/main/kotlin/org/jitsi/jibri/util/RefreshingProperty.kt
index a33d5518f..3413555df 100644
--- a/src/main/kotlin/org/jitsi/jibri/util/RefreshingProperty.kt
+++ b/src/main/kotlin/org/jitsi/jibri/util/RefreshingProperty.kt
@@ -16,13 +16,12 @@
package org.jitsi.jibri.util
+import org.jitsi.utils.logging2.createLogger
import java.time.Clock
import java.time.Duration
import java.time.Instant
import kotlin.reflect.KProperty
-import org.jitsi.utils.logging2.createLogger
-
/**
* A property delegate which recreates a value when it's accessed after having been
* 'alive' for more than [timeout] via the given [creationFunc]
diff --git a/src/main/kotlin/org/jitsi/jibri/util/RegexUtils.kt b/src/main/kotlin/org/jitsi/jibri/util/RegexUtils.kt
index e62d026d9..ec6fc57f4 100644
--- a/src/main/kotlin/org/jitsi/jibri/util/RegexUtils.kt
+++ b/src/main/kotlin/org/jitsi/jibri/util/RegexUtils.kt
@@ -20,6 +20,7 @@ package org.jitsi.jibri.util
// Regex definitions for parsing an ffmpeg output line
const val digit = """\d"""
const val oneOrMoreDigits = "$digit+"
+
// "1" is treated as a valid decimal (the decimal point and any trailing numbers are not required)
const val decimal = """$oneOrMoreDigits(\.$oneOrMoreDigits)?"""
const val string = """[a-zA-Z]+"""
diff --git a/src/main/kotlin/org/jitsi/jibri/util/StateUtils.kt b/src/main/kotlin/org/jitsi/jibri/util/StateUtils.kt
index 2bacc7e2f..83224a8d1 100644
--- a/src/main/kotlin/org/jitsi/jibri/util/StateUtils.kt
+++ b/src/main/kotlin/org/jitsi/jibri/util/StateUtils.kt
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+@file:Suppress("ktlint:standard:filename")
package org.jitsi.jibri.util
diff --git a/src/main/kotlin/org/jitsi/jibri/util/StatusPublisher.kt b/src/main/kotlin/org/jitsi/jibri/util/StatusPublisher.kt
index 99d0e5f14..c3812ef3e 100644
--- a/src/main/kotlin/org/jitsi/jibri/util/StatusPublisher.kt
+++ b/src/main/kotlin/org/jitsi/jibri/util/StatusPublisher.kt
@@ -28,6 +28,7 @@ import java.util.concurrent.CopyOnWriteArrayList
*/
open class StatusPublisher {
private val handlers: MutableList<(T) -> Boolean> = CopyOnWriteArrayList()
+
/**
* Add a status handler for this [StatusPublisher]. Handlers
* will be notified synchronously in the order they were added.
diff --git a/src/main/kotlin/org/jitsi/jibri/util/Tail.kt b/src/main/kotlin/org/jitsi/jibri/util/Tail.kt
index 698601ff9..66af1a1b6 100644
--- a/src/main/kotlin/org/jitsi/jibri/util/Tail.kt
+++ b/src/main/kotlin/org/jitsi/jibri/util/Tail.kt
@@ -30,6 +30,7 @@ import java.util.concurrent.Future
*/
class TailLogic(inputStream: InputStream) {
private val reader = BufferedReader(InputStreamReader(inputStream))
+
@Volatile var mostRecentLine: String = ""
fun readLine() {
diff --git a/src/main/kotlin/org/jitsi/jibri/webhooks/v1/Events.kt b/src/main/kotlin/org/jitsi/jibri/webhooks/v1/Events.kt
index 68b29057a..6d49c7fd4 100644
--- a/src/main/kotlin/org/jitsi/jibri/webhooks/v1/Events.kt
+++ b/src/main/kotlin/org/jitsi/jibri/webhooks/v1/Events.kt
@@ -1,4 +1,4 @@
-// ktlint-disable filename
+
/*
* Copyright @ 2018 - present 8x8, Inc.
@@ -16,6 +16,8 @@
* limitations under the License.
*/
+@file:Suppress("ktlint:standard:filename")
+
package org.jitsi.jibri.webhooks.v1
import org.jitsi.jibri.status.JibriSessionStatus
diff --git a/src/main/kotlin/org/jitsi/jibri/webhooks/v1/WebhookClient.kt b/src/main/kotlin/org/jitsi/jibri/webhooks/v1/WebhookClient.kt
index 26589c64f..2a429b2a4 100644
--- a/src/main/kotlin/org/jitsi/jibri/webhooks/v1/WebhookClient.kt
+++ b/src/main/kotlin/org/jitsi/jibri/webhooks/v1/WebhookClient.kt
@@ -23,8 +23,8 @@ import io.ktor.client.HttpClient
import io.ktor.client.engine.apache.Apache
import io.ktor.client.plugins.HttpRequestTimeoutException
import io.ktor.client.plugins.HttpTimeout
-import io.ktor.client.plugins.defaultRequest
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
+import io.ktor.client.plugins.defaultRequest
import io.ktor.client.request.HttpRequestBuilder
import io.ktor.client.request.bearerAuth
import io.ktor.client.request.post
diff --git a/src/test/kotlin/org/jitsi/jibri/capture/ffmpeg/executor/OutputParserTest.kt b/src/test/kotlin/org/jitsi/jibri/capture/ffmpeg/executor/OutputParserTest.kt
index a4e0bba8d..680d1e025 100644
--- a/src/test/kotlin/org/jitsi/jibri/capture/ffmpeg/executor/OutputParserTest.kt
+++ b/src/test/kotlin/org/jitsi/jibri/capture/ffmpeg/executor/OutputParserTest.kt
@@ -19,13 +19,13 @@ package org.jitsi.jibri.capture.ffmpeg.executor
import io.kotest.core.spec.IsolationMode
import io.kotest.core.spec.style.ShouldSpec
-import io.kotest.matchers.types.beInstanceOf
import io.kotest.matchers.should
import io.kotest.matchers.shouldBe
-import org.jitsi.jibri.status.ErrorScope
+import io.kotest.matchers.types.beInstanceOf
import org.jitsi.jibri.capture.ffmpeg.FfmpegErrorStatus
import org.jitsi.jibri.capture.ffmpeg.OutputLineClassification
import org.jitsi.jibri.capture.ffmpeg.OutputParser
+import org.jitsi.jibri.status.ErrorScope
internal class OutputParserTest : ShouldSpec() {
override fun isolationMode(): IsolationMode? = IsolationMode.InstancePerLeaf
diff --git a/src/test/kotlin/org/jitsi/jibri/helpers/SeleniumMockHelper.kt b/src/test/kotlin/org/jitsi/jibri/helpers/SeleniumMockHelper.kt
index 5a8b3da58..82fbef97e 100644
--- a/src/test/kotlin/org/jitsi/jibri/helpers/SeleniumMockHelper.kt
+++ b/src/test/kotlin/org/jitsi/jibri/helpers/SeleniumMockHelper.kt
@@ -1,9 +1,9 @@
package org.jitsi.jibri.helpers
+import io.mockk.Runs
import io.mockk.every
import io.mockk.just
import io.mockk.mockk
-import io.mockk.Runs
import org.jitsi.jibri.error.JibriError
import org.jitsi.jibri.selenium.JibriSelenium
import org.jitsi.jibri.status.ComponentState
diff --git a/src/test/kotlin/org/jitsi/jibri/selenium/SeleniumStateMachineTest.kt b/src/test/kotlin/org/jitsi/jibri/selenium/SeleniumStateMachineTest.kt
index ad4898408..613b9cd4e 100644
--- a/src/test/kotlin/org/jitsi/jibri/selenium/SeleniumStateMachineTest.kt
+++ b/src/test/kotlin/org/jitsi/jibri/selenium/SeleniumStateMachineTest.kt
@@ -19,10 +19,10 @@ package org.jitsi.jibri.selenium
import io.kotest.assertions.throwables.shouldThrow
import io.kotest.core.spec.IsolationMode
import io.kotest.core.spec.style.ShouldSpec
-import io.kotest.matchers.types.beInstanceOf
import io.kotest.matchers.collections.haveSize
import io.kotest.matchers.should
import io.kotest.matchers.shouldBe
+import io.kotest.matchers.types.beInstanceOf
import org.jitsi.jibri.status.ComponentState
internal class SeleniumStateMachineTest : ShouldSpec() {
diff --git a/src/test/kotlin/org/jitsi/jibri/selenium/status_checks/EmptyCallStatusCheckTest.kt b/src/test/kotlin/org/jitsi/jibri/selenium/status_checks/EmptyCallStatusCheckTest.kt
index 82c5247da..43e329b01 100644
--- a/src/test/kotlin/org/jitsi/jibri/selenium/status_checks/EmptyCallStatusCheckTest.kt
+++ b/src/test/kotlin/org/jitsi/jibri/selenium/status_checks/EmptyCallStatusCheckTest.kt
@@ -22,12 +22,12 @@ import io.kotest.matchers.shouldBe
import io.mockk.every
import io.mockk.mockk
import io.mockk.spyk
-import org.jitsi.utils.time.FakeClock
import org.jitsi.jibri.helpers.minutes
import org.jitsi.jibri.helpers.seconds
import org.jitsi.jibri.selenium.SeleniumEvent
import org.jitsi.jibri.selenium.pageobjects.CallPage
import org.jitsi.utils.logging2.Logger
+import org.jitsi.utils.time.FakeClock
import java.time.Duration
internal class EmptyCallStatusCheckTest : ShouldSpec() {
diff --git a/src/test/kotlin/org/jitsi/jibri/service/impl/SipGatewayJibriServiceTest.kt b/src/test/kotlin/org/jitsi/jibri/service/impl/SipGatewayJibriServiceTest.kt
index bc5733cb8..5cb1accca 100644
--- a/src/test/kotlin/org/jitsi/jibri/service/impl/SipGatewayJibriServiceTest.kt
+++ b/src/test/kotlin/org/jitsi/jibri/service/impl/SipGatewayJibriServiceTest.kt
@@ -21,10 +21,10 @@ import io.kotest.core.spec.style.ShouldSpec
import io.kotest.matchers.collections.shouldHaveSize
import io.kotest.matchers.shouldBe
import io.kotest.matchers.types.shouldBeInstanceOf
+import io.mockk.Runs
import io.mockk.every
import io.mockk.just
import io.mockk.mockk
-import io.mockk.Runs
import io.mockk.verify
import org.jitsi.jibri.CallUrlInfo
import org.jitsi.jibri.config.XmppCredentials
diff --git a/src/test/kotlin/org/jitsi/jibri/util/JibriSubprocessTest.kt b/src/test/kotlin/org/jitsi/jibri/util/JibriSubprocessTest.kt
index 473828a96..4d44b8ec3 100644
--- a/src/test/kotlin/org/jitsi/jibri/util/JibriSubprocessTest.kt
+++ b/src/test/kotlin/org/jitsi/jibri/util/JibriSubprocessTest.kt
@@ -39,6 +39,7 @@ internal class JibriSubprocessTest : ShouldSpec() {
private val processWrapper: ProcessWrapper = mockk(relaxed = true)
private val processStatePublisher: ProcessStatePublisher = mockk(relaxed = true)
private val parentLogger: Logger = mockk(relaxed = true)
+
@Suppress("MoveLambdaOutsideParentheses")
private val subprocess = JibriSubprocess(parentLogger, "name", mockk(), processFactory, { processStatePublisher })
private val processStateHandler = slot<(ProcessState) -> Unit>()
diff --git a/src/test/kotlin/org/jitsi/jibri/util/TeeLogicTest.kt b/src/test/kotlin/org/jitsi/jibri/util/TeeLogicTest.kt
index db96b05b6..b129003b1 100644
--- a/src/test/kotlin/org/jitsi/jibri/util/TeeLogicTest.kt
+++ b/src/test/kotlin/org/jitsi/jibri/util/TeeLogicTest.kt
@@ -25,8 +25,8 @@ import java.io.BufferedReader
import java.io.InputStreamReader
import java.io.PipedInputStream
import java.io.PipedOutputStream
-import kotlin.time.ExperimentalTime
import kotlin.time.Duration.Companion.seconds
+import kotlin.time.ExperimentalTime
internal class TeeLogicTest : ShouldSpec() {
override fun isolationMode(): IsolationMode? = IsolationMode.InstancePerLeaf