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