in rd-kt/rd-framework/src/main/kotlin/com/jetbrains/rd/framework/SocketWire.kt [230:283]
override fun read(): Int {
if (pos < pkg.size)
return pkg[pos++].toInt() and 0xff
while (true) {
val len = stream.readInt32() ?: return -1
if (len == ping_len) {
val receivedTimestamp = stream.readInt32() ?: return -1
val receivedCounterpartTimestamp = stream.readInt32() ?: return -1
counterpartTimestamp = receivedTimestamp
counterpartNotionTimestamp = receivedCounterpartTimestamp
if (connectionEstablished(currentTimeStamp, counterpartNotionTimestamp)) {
if (!heartbeatAlive.value) { // only on change
logger.trace {
"Connection is alive after receiving PING $id: " +
"receivedTimestamp: $receivedTimestamp, " +
"receivedCounterpartTimestamp: $receivedCounterpartTimestamp" +
"currentTimeStamp: $currentTimeStamp, " +
"counterpartTimestamp: $counterpartTimestamp, " +
"counterpartNotionTimestamp: $counterpartNotionTimestamp"
}
}
heartbeatAlive.value = true
}
continue
}
val seqn = stream.readInt64() ?: return -1
if (len == ack_msg_len) {
sendBuffer.acknowledge(seqn)
}
else {
require(len > 0) {"len > 0: $len"}
assertLength(len)
pkg = ByteArray(len)
pos = 0
if (!stream.readByteArray(pkg)) {
pkg = ByteArray(0)
return -1
}
if (seqn > maxReceivedSeqn) {
maxReceivedSeqn = seqn
return pkg[pos++].toInt() and 0xff
} else
sendAck(seqn)
}
}
}