Skip to content
Merged
Show file tree
Hide file tree
Changes from 11 commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
ef99334
KRPC-209 kRPC: Implement backwards compatible backpressure
Mr3zee Aug 27, 2025
2d5b2c7
Update platforms table and ABI dump
Mr3zee Sep 2, 2025
f4908ff
Added stress tests
Mr3zee Sep 2, 2025
e713b37
Added lincheck tests template
Mr3zee Sep 3, 2025
aba3699
Fixed cancellation tests
Mr3zee Sep 4, 2025
1a3d2bf
Added backwards compatibility tests
Mr3zee Sep 4, 2025
92d67d2
Deleted old compat tests, made api dumps unversioned
Mr3zee Sep 4, 2025
af50273
Updated Api dump for 0.10.0
Mr3zee Sep 4, 2025
ab7bd83
abiDump
Mr3zee Sep 4, 2025
260ab7b
Fix detekt
Mr3zee Sep 4, 2025
f7b1ade
Fix regression
Mr3zee Sep 4, 2025
a687b21
Kover updates
Mr3zee Sep 5, 2025
f1b58e5
Added missing kDoc
Mr3zee Sep 5, 2025
5b44363
Fixed jvmTest for native only build
Mr3zee Sep 5, 2025
6210ad4
Some tests updates
Mr3zee Sep 5, 2025
7c54fee
Added perCallBufferSize validation
Mr3zee Sep 5, 2025
8523fb3
Added BackPressure tests and fixed client side streaming
Mr3zee Sep 5, 2025
b33c671
Extended timeouts
Mr3zee Sep 5, 2025
9a7022b
Fix test
Mr3zee Sep 10, 2025
bbb7d46
Updated tests to include proper coroutines debug management
Mr3zee Sep 15, 2025
6f01c0c
Small optimization for handlers with infinite timeout
Mr3zee Sep 15, 2025
d22358d
Added better debug logs, removed multiple client streams from several…
Mr3zee Sep 15, 2025
5736984
Increase stress test timeout
Mr3zee Sep 15, 2025
96be806
Fix logs for BackPressure test
Mr3zee Sep 15, 2025
411f6fb
Fix "Channel was closed" exceptions
Mr3zee Sep 15, 2025
a9d7b63
Increase timeout for RPC_should... test
Mr3zee Sep 15, 2025
db65a50
Made more rigorous wait counter for tests
Mr3zee Sep 16, 2025
db2ba73
More timeout for js tests and logging for stressActing
Mr3zee Sep 16, 2025
4242ead
Added stress test filter
Mr3zee Sep 16, 2025
6bce3db
More timeout for stressActing test
Mr3zee Sep 16, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ plugins {
alias(libs.plugins.serialization) apply false
alias(libs.plugins.kotlinx.rpc) apply false
alias(libs.plugins.atomicfu) apply false
alias(libs.plugins.conventions.kover)
// alias(libs.plugins.conventions.kover)
alias(libs.plugins.conventions.root)
}

Expand Down
4 changes: 2 additions & 2 deletions detekt/config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@ empty-blocks:
EmptyForBlock:
active: true
EmptyFunctionBlock:
active: true
active: false
ignoreOverridden: false
EmptyIfBlock:
active: true
Expand Down Expand Up @@ -288,7 +288,7 @@ exceptions:
ThrowingNewInstanceOfSameException:
active: true
TooGenericExceptionCaught:
active: true
active: false
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/iosTest/**']
exceptionNames:
- 'ArrayIndexOutOfBoundsException'
Expand Down
26 changes: 13 additions & 13 deletions docs/pages/kotlinx-rpc/topics/platforms.topic
Original file line number Diff line number Diff line change
Expand Up @@ -73,47 +73,47 @@
<td>core</td>
<td>jvm</td>
<td><list><li>browser</li><li>node</li></list></td>
<td><list><li>wasmJs<list><li>browser</li><li>d8</li><li>node</li></list></li><li>wasmWasi<list><li>node</li></list></li></list></td>
<td><list><li>wasmJs<list><li>browser</li><li>node</li></list></li><li>wasmWasi<list><li>node</li></list></li></list></td>
<td><list><li>apple<list><li>ios<list><li>iosArm64</li><li>iosSimulatorArm64</li><li>iosX64</li></list></li><li>macos<list><li>macosArm64</li><li>macosX64</li></list></li><li>watchos<list><li>watchosArm32</li><li>watchosArm64</li><li>watchosDeviceArm64</li><li>watchosSimulatorArm64</li><li>watchosX64</li></list></li><li>tvos<list><li>tvosArm64</li><li>tvosSimulatorArm64</li><li>tvosX64</li></list></li></list></li><li>linux<list><li>linuxArm64</li><li>linuxX64</li></list></li><li>windows<list><li>mingwX64</li></list></li></list></td>
</tr>

<tr>
<td>utils</td>
<td>jvm</td>
<td><list><li>browser</li><li>node</li></list></td>
<td><list><li>wasmJs<list><li>browser</li><li>d8</li><li>node</li></list></li><li>wasmWasi<list><li>node</li></list></li></list></td>
<td><list><li>wasmJs<list><li>browser</li><li>node</li></list></li><li>wasmWasi<list><li>node</li></list></li></list></td>
<td><list><li>apple<list><li>ios<list><li>iosArm64</li><li>iosSimulatorArm64</li><li>iosX64</li></list></li><li>macos<list><li>macosArm64</li><li>macosX64</li></list></li><li>watchos<list><li>watchosArm32</li><li>watchosArm64</li><li>watchosDeviceArm64</li><li>watchosSimulatorArm64</li><li>watchosX64</li></list></li><li>tvos<list><li>tvosArm64</li><li>tvosSimulatorArm64</li><li>tvosX64</li></list></li></list></li><li>linux<list><li>linuxArm64</li><li>linuxX64</li></list></li><li>windows<list><li>mingwX64</li></list></li></list></td>
</tr>

<tr>
<td>krpc-client</td>
<td>jvm</td>
<td><list><li>browser</li><li>node</li></list></td>
<td><list><li>wasmJs<list><li>browser</li><li>d8</li><li>node</li></list></li></list></td>
<td><list><li>wasmJs<list><li>browser</li><li>node</li></list></li></list></td>
<td><list><li>apple<list><li>ios<list><li>iosArm64</li><li>iosSimulatorArm64</li><li>iosX64</li></list></li><li>macos<list><li>macosArm64</li><li>macosX64</li></list></li><li>watchos<list><li>watchosArm64</li><li>watchosSimulatorArm64</li><li>watchosX64</li></list></li><li>tvos<list><li>tvosArm64</li><li>tvosSimulatorArm64</li><li>tvosX64</li></list></li></list></li><li>linux<list><li>linuxArm64</li><li>linuxX64</li></list></li><li>windows<list><li>mingwX64</li></list></li></list></td>
</tr>

<tr>
<td>krpc-core</td>
<td>jvm</td>
<td><list><li>browser</li><li>node</li></list></td>
<td><list><li>wasmJs<list><li>browser</li><li>d8</li><li>node</li></list></li></list></td>
<td><list><li>wasmJs<list><li>browser</li><li>node</li></list></li></list></td>
<td><list><li>apple<list><li>ios<list><li>iosArm64</li><li>iosSimulatorArm64</li><li>iosX64</li></list></li><li>macos<list><li>macosArm64</li><li>macosX64</li></list></li><li>watchos<list><li>watchosArm64</li><li>watchosSimulatorArm64</li><li>watchosX64</li></list></li><li>tvos<list><li>tvosArm64</li><li>tvosSimulatorArm64</li><li>tvosX64</li></list></li></list></li><li>linux<list><li>linuxArm64</li><li>linuxX64</li></list></li><li>windows<list><li>mingwX64</li></list></li></list></td>
</tr>

<tr>
<td>krpc-logging</td>
<td>jvm</td>
<td><list><li>browser</li><li>node</li></list></td>
<td><list><li>wasmJs<list><li>browser</li><li>d8</li><li>node</li></list></li></list></td>
<td><list><li>wasmJs<list><li>browser</li><li>node</li></list></li></list></td>
<td><list><li>apple<list><li>ios<list><li>iosArm64</li><li>iosSimulatorArm64</li><li>iosX64</li></list></li><li>macos<list><li>macosArm64</li><li>macosX64</li></list></li><li>watchos<list><li>watchosArm64</li><li>watchosSimulatorArm64</li><li>watchosX64</li></list></li><li>tvos<list><li>tvosArm64</li><li>tvosSimulatorArm64</li><li>tvosX64</li></list></li></list></li><li>linux<list><li>linuxArm64</li><li>linuxX64</li></list></li><li>windows<list><li>mingwX64</li></list></li></list></td>
</tr>

<tr>
<td>krpc-server</td>
<td>jvm</td>
<td><list><li>browser</li><li>node</li></list></td>
<td><list><li>wasmJs<list><li>browser</li><li>d8</li><li>node</li></list></li></list></td>
<td><list><li>wasmJs<list><li>browser</li><li>node</li></list></li></list></td>
<td><list><li>apple<list><li>ios<list><li>iosArm64</li><li>iosSimulatorArm64</li><li>iosX64</li></list></li><li>macos<list><li>macosArm64</li><li>macosX64</li></list></li><li>watchos<list><li>watchosArm64</li><li>watchosSimulatorArm64</li><li>watchosX64</li></list></li><li>tvos<list><li>tvosArm64</li><li>tvosSimulatorArm64</li><li>tvosX64</li></list></li></list></li><li>linux<list><li>linuxArm64</li><li>linuxX64</li></list></li><li>windows<list><li>mingwX64</li></list></li></list></td>
</tr>

Expand All @@ -129,55 +129,55 @@
<td>krpc-ktor-client</td>
<td>jvm</td>
<td><list><li>browser</li><li>node</li></list></td>
<td><list><li>wasmJs<list><li>browser</li><li>d8</li><li>node</li></list></li></list></td>
<td><list><li>wasmJs<list><li>browser</li><li>node</li></list></li></list></td>
<td><list><li>apple<list><li>ios<list><li>iosArm64</li><li>iosSimulatorArm64</li><li>iosX64</li></list></li><li>macos<list><li>macosArm64</li><li>macosX64</li></list></li><li>watchos<list><li>watchosArm64</li><li>watchosSimulatorArm64</li><li>watchosX64</li></list></li><li>tvos<list><li>tvosArm64</li><li>tvosSimulatorArm64</li><li>tvosX64</li></list></li></list></li><li>linux<list><li>linuxArm64</li><li>linuxX64</li></list></li><li>windows<list><li>mingwX64</li></list></li></list></td>
</tr>

<tr>
<td>krpc-ktor-core</td>
<td>jvm</td>
<td><list><li>browser</li><li>node</li></list></td>
<td><list><li>wasmJs<list><li>browser</li><li>d8</li><li>node</li></list></li></list></td>
<td><list><li>wasmJs<list><li>browser</li><li>node</li></list></li></list></td>
<td><list><li>apple<list><li>ios<list><li>iosArm64</li><li>iosSimulatorArm64</li><li>iosX64</li></list></li><li>macos<list><li>macosArm64</li><li>macosX64</li></list></li><li>watchos<list><li>watchosArm64</li><li>watchosSimulatorArm64</li><li>watchosX64</li></list></li><li>tvos<list><li>tvosArm64</li><li>tvosSimulatorArm64</li><li>tvosX64</li></list></li></list></li><li>linux<list><li>linuxArm64</li><li>linuxX64</li></list></li><li>windows<list><li>mingwX64</li></list></li></list></td>
</tr>

<tr>
<td>krpc-ktor-server</td>
<td>jvm</td>
<td><list><li>browser</li><li>node</li></list></td>
<td><list><li>wasmJs<list><li>browser</li><li>d8</li><li>node</li></list></li></list></td>
<td><list><li>wasmJs<list><li>browser</li><li>node</li></list></li></list></td>
<td><list><li>apple<list><li>ios<list><li>iosArm64</li><li>iosSimulatorArm64</li><li>iosX64</li></list></li><li>macos<list><li>macosArm64</li><li>macosX64</li></list></li><li>watchos<list><li>watchosArm64</li><li>watchosSimulatorArm64</li><li>watchosX64</li></list></li><li>tvos<list><li>tvosArm64</li><li>tvosSimulatorArm64</li><li>tvosX64</li></list></li></list></li><li>linux<list><li>linuxArm64</li><li>linuxX64</li></list></li><li>windows<list><li>mingwX64</li></list></li></list></td>
</tr>

<tr>
<td>krpc-serialization-cbor</td>
<td>jvm</td>
<td><list><li>browser</li><li>node</li></list></td>
<td><list><li>wasmJs<list><li>browser</li><li>d8</li><li>node</li></list></li></list></td>
<td><list><li>wasmJs<list><li>browser</li><li>node</li></list></li></list></td>
<td><list><li>apple<list><li>ios<list><li>iosArm64</li><li>iosSimulatorArm64</li><li>iosX64</li></list></li><li>macos<list><li>macosArm64</li><li>macosX64</li></list></li><li>watchos<list><li>watchosArm64</li><li>watchosSimulatorArm64</li><li>watchosX64</li></list></li><li>tvos<list><li>tvosArm64</li><li>tvosSimulatorArm64</li><li>tvosX64</li></list></li></list></li><li>linux<list><li>linuxArm64</li><li>linuxX64</li></list></li><li>windows<list><li>mingwX64</li></list></li></list></td>
</tr>

<tr>
<td>krpc-serialization-core</td>
<td>jvm</td>
<td><list><li>browser</li><li>node</li></list></td>
<td><list><li>wasmJs<list><li>browser</li><li>d8</li><li>node</li></list></li></list></td>
<td><list><li>wasmJs<list><li>browser</li><li>node</li></list></li></list></td>
<td><list><li>apple<list><li>ios<list><li>iosArm64</li><li>iosSimulatorArm64</li><li>iosX64</li></list></li><li>macos<list><li>macosArm64</li><li>macosX64</li></list></li><li>watchos<list><li>watchosArm64</li><li>watchosSimulatorArm64</li><li>watchosX64</li></list></li><li>tvos<list><li>tvosArm64</li><li>tvosSimulatorArm64</li><li>tvosX64</li></list></li></list></li><li>linux<list><li>linuxArm64</li><li>linuxX64</li></list></li><li>windows<list><li>mingwX64</li></list></li></list></td>
</tr>

<tr>
<td>krpc-serialization-json</td>
<td>jvm</td>
<td><list><li>browser</li><li>node</li></list></td>
<td><list><li>wasmJs<list><li>browser</li><li>d8</li><li>node</li></list></li></list></td>
<td><list><li>wasmJs<list><li>browser</li><li>node</li></list></li></list></td>
<td><list><li>apple<list><li>ios<list><li>iosArm64</li><li>iosSimulatorArm64</li><li>iosX64</li></list></li><li>macos<list><li>macosArm64</li><li>macosX64</li></list></li><li>watchos<list><li>watchosArm64</li><li>watchosSimulatorArm64</li><li>watchosX64</li></list></li><li>tvos<list><li>tvosArm64</li><li>tvosSimulatorArm64</li><li>tvosX64</li></list></li></list></li><li>linux<list><li>linuxArm64</li><li>linuxX64</li></list></li><li>windows<list><li>mingwX64</li></list></li></list></td>
</tr>

<tr>
<td>krpc-serialization-protobuf</td>
<td>jvm</td>
<td><list><li>browser</li><li>node</li></list></td>
<td><list><li>wasmJs<list><li>browser</li><li>d8</li><li>node</li></list></li></list></td>
<td><list><li>wasmJs<list><li>browser</li><li>node</li></list></li></list></td>
<td><list><li>apple<list><li>ios<list><li>iosArm64</li><li>iosSimulatorArm64</li><li>iosX64</li></list></li><li>macos<list><li>macosArm64</li><li>macosX64</li></list></li><li>watchos<list><li>watchosArm64</li><li>watchosSimulatorArm64</li><li>watchosX64</li></list></li><li>tvos<list><li>tvosArm64</li><li>tvosSimulatorArm64</li><li>tvosX64</li></list></li></list></li><li>linux<list><li>linuxArm64</li><li>linuxX64</li></list></li><li>windows<list><li>mingwX64</li></list></li></list></td>
</tr>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,10 @@ afterEvaluate {
}
}

apply(plugin = "org.jetbrains.kotlinx.kover")
//apply(plugin = "org.jetbrains.kotlinx.kover")

val thisProject = project

rootProject.configurations.matching { it.name == "kover" }.all {
rootProject.dependencies.add("kover", thisProject)
}
//rootProject.configurations.matching { it.name == "kover" }.all {
// rootProject.dependencies.add("kover", thisProject)
//}
52 changes: 26 additions & 26 deletions gradle-conventions/src/main/kotlin/conventions-kover.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -7,31 +7,31 @@ import kotlinx.kover.gradle.plugin.dsl.CoverageUnit
import kotlinx.kover.gradle.plugin.dsl.GroupingEntityType

plugins {
id("org.jetbrains.kotlinx.kover")
// id("org.jetbrains.kotlinx.kover")
}

kover {
reports {
total {
html {
onCheck.set(false)
charset.set("UTF-8")
htmlDir.set(rootDir.resolve("kover"))
}

verify {
onCheck.set(false)

rule {
groupBy.set(GroupingEntityType.APPLICATION)

bound {
coverageUnits.set(CoverageUnit.LINE)
aggregationForGroup.set(AggregationType.COVERED_PERCENTAGE)
minValue.set(70)
}
}
}
}
}
}
//kover {
// reports {
// total {
// html {
// onCheck.set(false)
// charset.set("UTF-8")
// htmlDir.set(rootDir.resolve("kover"))
// }
//
// verify {
// onCheck.set(false)
//
// rule {
// groupBy.set(GroupingEntityType.APPLICATION)
//
// bound {
// coverageUnits.set(CoverageUnit.LINE)
// aggregationForGroup.set(AggregationType.COVERED_PERCENTAGE)
// minValue.set(70)
// }
// }
// }
// }
// }
//}
1 change: 1 addition & 0 deletions gradle-conventions/src/main/kotlin/util/apiValidation.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.gradle.dsl.abi.ExperimentalAbiValidation
private val excludedProjects = setOf(
"krpc-test",
"krpc-compatibility-tests",
"krpc-protocol-compatibility-tests",
"compiler-plugin-tests",
)

Expand Down
3 changes: 2 additions & 1 deletion gradle-conventions/src/main/kotlin/util/targets/wasm.kt
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ fun KmpConfig.configureWasm() {
browser()
nodejs()
if (wasmJsD8) {
d8()
// this platform needs some care KRPC-210
// d8()
}

binaries.library()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,27 @@
package kotlinx.rpc.krpc.client

import kotlinx.atomicfu.atomic
import kotlinx.coroutines.*
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.CoroutineName
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.InternalCoroutinesApi
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.cancel
import kotlinx.coroutines.cancelAndJoin
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.currentCoroutineContext
import kotlinx.coroutines.ensureActive
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.FlowCollector
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.job
import kotlinx.coroutines.launch
import kotlinx.coroutines.supervisorScope
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import kotlinx.rpc.RpcCall
Expand All @@ -21,7 +36,8 @@ import kotlinx.rpc.descriptor.RpcInvokator
import kotlinx.rpc.internal.utils.InternalRpcApi
import kotlinx.rpc.internal.utils.getOrNull
import kotlinx.rpc.internal.utils.map.RpcInternalConcurrentHashMap
import kotlinx.rpc.krpc.*
import kotlinx.rpc.krpc.KrpcConfig
import kotlinx.rpc.krpc.KrpcTransport
import kotlinx.rpc.krpc.client.internal.ClientStreamContext
import kotlinx.rpc.krpc.client.internal.ClientStreamSerializer
import kotlinx.rpc.krpc.client.internal.KrpcClientConnector
Expand All @@ -35,7 +51,6 @@ import kotlinx.serialization.StringFormat
import kotlinx.serialization.modules.SerializersModule
import kotlin.collections.first
import kotlin.concurrent.Volatile
import kotlin.coroutines.cancellation.CancellationException
import kotlin.properties.Delegates

/**
Expand Down Expand Up @@ -157,7 +172,7 @@ public abstract class KrpcClient : RpcClient, KrpcEndpoint {
private val connector by lazy {
checkTransportReadiness()

KrpcClientConnector(config.serialFormatInitializer.build(), transport, config.waitForServices)
KrpcClientConnector(config.serialFormatInitializer.build(), transport, config.connector)
}

private var connectionId: Long? = null
Expand Down Expand Up @@ -221,9 +236,11 @@ public abstract class KrpcClient : RpcClient, KrpcEndpoint {
message.errorMessage
}

serverSupportedPlugins.completeExceptionally(
IllegalStateException("Server failed to process protocol message: ${message.failedMessage}")
)
if (!serverSupportedPlugins.isCompleted) {
serverSupportedPlugins.completeExceptionally(
IllegalStateException("Server failed to process protocol message: ${message.failedMessage}")
)
}
}
}
}
Expand Down Expand Up @@ -295,15 +312,15 @@ public abstract class KrpcClient : RpcClient, KrpcEndpoint {

sendCancellation(CancellationType.REQUEST, call.descriptor.fqName, callId)

connector.unsubscribeFromMessages(call.descriptor.fqName, callId) {
cancellingRequests.remove(callId)
}
connector.unsubscribeFromMessages(call.descriptor.fqName, callId)
cancellingRequests.remove(callId)
}

throw e
} finally {
channel.close()
requestChannels.remove(callId)
connector.unsubscribeFromMessages(call.descriptor.fqName, callId)
}
}
}
Expand Down Expand Up @@ -341,17 +358,8 @@ public abstract class KrpcClient : RpcClient, KrpcEndpoint {
}

is KrpcCallMessage.CallException -> {
val cause = runCatching {
message.cause.deserialize()
}

val result = if (cause.isFailure) {
cause.exceptionOrNull()!!
} else {
cause.getOrNull()!!
}

channel.close(result)
val cause = message.cause.deserialize()
channel.close(cause)
}

is KrpcCallMessage.CallSuccess, is KrpcCallMessage.StreamMessage -> {
Expand Down Expand Up @@ -456,8 +464,23 @@ public abstract class KrpcClient : RpcClient, KrpcEndpoint {
serviceTypeString = serviceTypeString,
)
} catch (e: CancellationException) {
currentCoroutineContext().ensureActive()

val wrapped = ManualCancellationException(e)
val serializedReason = serializeException(wrapped)
val message = KrpcCallMessage.StreamCancel(
callId = outgoingStream.callId,
serviceType = serviceTypeString,
streamId = outgoingStream.streamId,
cause = serializedReason,
connectionId = outgoingStream.connectionId,
serviceId = outgoingStream.serviceId,
)
sender.sendMessage(message)

// stop the flow and its coroutine, other flows are not affected
throw e
} catch (@Suppress("detekt.TooGenericExceptionCaught") cause: Throwable) {
} catch (cause: Throwable) {
val serializedReason = serializeException(cause)
val message = KrpcCallMessage.StreamCancel(
callId = outgoingStream.callId,
Expand Down
Loading