removed nullable array from transport device, as channels close() is more than enough
This commit is contained in:
parent
e7abbe6d1d
commit
e619b45485
@ -37,6 +37,7 @@ kotlin {
|
|||||||
val hostOs = System.getProperty("os.name")
|
val hostOs = System.getProperty("os.name")
|
||||||
val isArm64 = System.getProperty("os.arch") == "aarch64"
|
val isArm64 = System.getProperty("os.arch") == "aarch64"
|
||||||
val isMingwX64 = hostOs.startsWith("Windows")
|
val isMingwX64 = hostOs.startsWith("Windows")
|
||||||
|
@Suppress("UNUSED_VARIABLE")
|
||||||
val nativeTarget = when {
|
val nativeTarget = when {
|
||||||
hostOs == "Mac OS X" && isArm64 -> macosArm64("native")
|
hostOs == "Mac OS X" && isArm64 -> macosArm64("native")
|
||||||
hostOs == "Mac OS X" && !isArm64 -> macosX64("native")
|
hostOs == "Mac OS X" && !isArm64 -> macosX64("native")
|
||||||
@ -46,6 +47,7 @@ kotlin {
|
|||||||
else -> throw GradleException("Host OS is not supported in Kotlin/Native.")
|
else -> throw GradleException("Host OS is not supported in Kotlin/Native.")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val ktor_version = "2.3.6"
|
||||||
|
|
||||||
sourceSets {
|
sourceSets {
|
||||||
all {
|
all {
|
||||||
@ -61,6 +63,7 @@ kotlin {
|
|||||||
|
|
||||||
implementation("com.ionspin.kotlin:multiplatform-crypto-libsodium-bindings:0.9.0")
|
implementation("com.ionspin.kotlin:multiplatform-crypto-libsodium-bindings:0.9.0")
|
||||||
api("com.ionspin.kotlin:bignum:0.3.8")
|
api("com.ionspin.kotlin:bignum:0.3.8")
|
||||||
|
implementation("io.ktor:ktor-client-core:$ktor_version")
|
||||||
|
|
||||||
api("net.sergeych:mp_bintools:0.0.6-SNAPSHOT")
|
api("net.sergeych:mp_bintools:0.0.6-SNAPSHOT")
|
||||||
api("net.sergeych:mp_stools:1.4.1")
|
api("net.sergeych:mp_stools:1.4.1")
|
||||||
@ -73,11 +76,27 @@ kotlin {
|
|||||||
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.7.3")
|
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.7.3")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
val jvmMain by getting
|
val jvmMain by getting {
|
||||||
|
dependencies {
|
||||||
|
implementation("io.ktor:ktor-server-core:$ktor_version")
|
||||||
|
implementation("io.ktor:ktor-server-core-jvm:$ktor_version")
|
||||||
|
implementation("io.ktor:ktor-server-websockets-jvm:$ktor_version")
|
||||||
|
implementation("io.ktor:ktor-server-netty:$ktor_version")
|
||||||
|
implementation("io.ktor:ktor-client-netty:$ktor_version")
|
||||||
|
}
|
||||||
|
}
|
||||||
val jvmTest by getting
|
val jvmTest by getting
|
||||||
val jsMain by getting
|
val jsMain by getting {
|
||||||
|
dependencies {
|
||||||
|
implementation("io.ktor:ktor-client-js:$ktor_version")
|
||||||
|
}
|
||||||
|
}
|
||||||
val jsTest by getting
|
val jsTest by getting
|
||||||
val nativeMain by getting
|
val nativeMain by getting {
|
||||||
|
dependencies {
|
||||||
|
implementation("io.ktor:ktor-client-cio:$ktor_version")
|
||||||
|
}
|
||||||
|
}
|
||||||
val nativeTest by getting
|
val nativeTest by getting
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -41,7 +41,7 @@ class Transport<S>(
|
|||||||
* Input blocks. When the device is disconnected, it should send one null to this channel
|
* Input blocks. When the device is disconnected, it should send one null to this channel
|
||||||
* to notify the owner. When [close] is called, the channel should be closed.
|
* to notify the owner. When [close] is called, the channel should be closed.
|
||||||
*/
|
*/
|
||||||
val input: ReceiveChannel<UByteArray?>
|
val input: ReceiveChannel<UByteArray>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send a binary block to a remote party where it should be received and put into [input]
|
* Send a binary block to a remote party where it should be received and put into [input]
|
||||||
@ -139,7 +139,7 @@ class Transport<S>(
|
|||||||
debug { "awaiting incoming blocks" }
|
debug { "awaiting incoming blocks" }
|
||||||
while (isActive && !isClosed) {
|
while (isActive && !isClosed) {
|
||||||
try {
|
try {
|
||||||
device.input.receive()?.let { packed ->
|
device.input.receive().let { packed ->
|
||||||
debug { "<<<\n${packed.toDump()}" }
|
debug { "<<<\n${packed.toDump()}" }
|
||||||
val b = unpack<Block>(packed)
|
val b = unpack<Block>(packed)
|
||||||
debug { "<<$ $b" }
|
debug { "<<$ $b" }
|
||||||
@ -181,9 +181,6 @@ class Transport<S>(
|
|||||||
.also { debug { "command executed: ${b.name}" } }
|
.also { debug { "command executed: ${b.name}" } }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} ?: run {
|
|
||||||
debug { "remote channel close received" }
|
|
||||||
isClosed = true
|
|
||||||
}
|
}
|
||||||
} catch (_: CancellationException) {
|
} catch (_: CancellationException) {
|
||||||
info { "loop is cancelled" }
|
info { "loop is cancelled" }
|
||||||
|
@ -7,7 +7,7 @@ import kotlinx.coroutines.channels.Channel
|
|||||||
*/
|
*/
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
class InetTransportDevice(
|
class InetTransportDevice(
|
||||||
inputChannel: Channel<UByteArray?>,
|
inputChannel: Channel<UByteArray>,
|
||||||
outputChannel: Channel<UByteArray>,
|
outputChannel: Channel<UByteArray>,
|
||||||
val remoteAddress: NetworkAddress,
|
val remoteAddress: NetworkAddress,
|
||||||
val flush: suspend ()->Unit = {},
|
val flush: suspend ()->Unit = {},
|
||||||
|
@ -6,11 +6,11 @@ import kotlinx.coroutines.channels.SendChannel
|
|||||||
import net.sergeych.kiloparsec.Transport
|
import net.sergeych.kiloparsec.Transport
|
||||||
|
|
||||||
open class ProxyDevice(
|
open class ProxyDevice(
|
||||||
inputChannel: Channel<UByteArray?>,
|
inputChannel: Channel<UByteArray>,
|
||||||
outputChannel: Channel<UByteArray>,
|
outputChannel: Channel<UByteArray>,
|
||||||
private val onClose: suspend ()->Unit = {}): Transport.Device {
|
private val onClose: suspend ()->Unit = {}): Transport.Device {
|
||||||
|
|
||||||
override val input: ReceiveChannel<UByteArray?> = inputChannel
|
override val input: ReceiveChannel<UByteArray> = inputChannel
|
||||||
override val output: SendChannel<UByteArray> = outputChannel
|
override val output: SendChannel<UByteArray> = outputChannel
|
||||||
override suspend fun close() {
|
override suspend fun close() {
|
||||||
onClose()
|
onClose()
|
||||||
|
@ -6,7 +6,6 @@ import kotlinx.coroutines.channels.SendChannel
|
|||||||
import kotlinx.coroutines.test.runTest
|
import kotlinx.coroutines.test.runTest
|
||||||
import net.sergeych.crypto.Key
|
import net.sergeych.crypto.Key
|
||||||
import net.sergeych.crypto.initCrypto
|
import net.sergeych.crypto.initCrypto
|
||||||
import net.sergeych.kiloparsec.command
|
|
||||||
import net.sergeych.kiloparsec.*
|
import net.sergeych.kiloparsec.*
|
||||||
import net.sergeych.mp_logger.Log
|
import net.sergeych.mp_logger.Log
|
||||||
import kotlin.test.*
|
import kotlin.test.*
|
||||||
@ -17,7 +16,7 @@ fun createTestDevice(): Pair<Transport.Device, Transport.Device> {
|
|||||||
val p2 = Channel<UByteArray>(256)
|
val p2 = Channel<UByteArray>(256)
|
||||||
val id = ++dcnt
|
val id = ++dcnt
|
||||||
val d1 = object : Transport.Device {
|
val d1 = object : Transport.Device {
|
||||||
override val input: ReceiveChannel<UByteArray?> = p1
|
override val input: ReceiveChannel<UByteArray> = p1
|
||||||
override val output: SendChannel<UByteArray> = p2
|
override val output: SendChannel<UByteArray> = p2
|
||||||
override suspend fun close() {
|
override suspend fun close() {
|
||||||
p2.close()
|
p2.close()
|
||||||
@ -28,7 +27,7 @@ fun createTestDevice(): Pair<Transport.Device, Transport.Device> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
val d2 = object : Transport.Device {
|
val d2 = object : Transport.Device {
|
||||||
override val input: ReceiveChannel<UByteArray?> = p2
|
override val input: ReceiveChannel<UByteArray> = p2
|
||||||
override val output: SendChannel<UByteArray> = p1
|
override val output: SendChannel<UByteArray> = p1
|
||||||
override suspend fun close() {
|
override suspend fun close() {
|
||||||
p1.close()
|
p1.close()
|
||||||
|
@ -98,7 +98,7 @@ suspend fun asyncSocketToDevice(socket: AsynchronousSocketChannel): InetTranspor
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// transport device copes with blocks:
|
// transport device copes with blocks:
|
||||||
val inputBlocks = Channel<UByteArray?>()
|
val inputBlocks = Channel<UByteArray>()
|
||||||
// decode blocks from a byte channel read from the socket:
|
// decode blocks from a byte channel read from the socket:
|
||||||
launch {
|
launch {
|
||||||
try {
|
try {
|
||||||
@ -116,9 +116,7 @@ suspend fun asyncSocketToDevice(socket: AsynchronousSocketChannel): InetTranspor
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (_: CancellationException) {
|
} catch (_: CancellationException) {
|
||||||
inputBlocks.send(null)
|
|
||||||
} catch (_: ClosedReceiveChannelException) {
|
} catch (_: ClosedReceiveChannelException) {
|
||||||
inputBlocks.send(null)
|
|
||||||
stop()
|
stop()
|
||||||
}
|
}
|
||||||
receiving.value = false
|
receiving.value = false
|
||||||
|
Loading…
x
Reference in New Issue
Block a user