small fix in client, more docs

This commit is contained in:
Sergey Chernov 2024-02-20 02:09:25 +03:00
parent 192f7e135f
commit 745eb9ccdf
7 changed files with 66 additions and 16 deletions

1
.idea/gradle.xml generated
View File

@ -5,6 +5,7 @@
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="17 (5)" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />

View File

@ -1,8 +1,32 @@
# Kiloparsec
_The protocol is under active development, early access stage. Please wait for alfa!_
The new generation of __PARanoid SECurity__ protocol, advanced, faster, more secure. It also allows connecting any "block device" transport to the same local interface. Out if the box it
provides the following transports:
The new generation of __PARanoid SECurity__ protocol, advanced, faster, more secure.
| name | JVM | JS | native |
|----------------|-----|----|--------|
| TCP/IP server | * | | |
| TCP/IP client | * | | |
| Websock server | * | | |
| Websock client | * | * | * |
## TCP/IP transport
It is the fastest. JVM implementation uses nio2 async sockets and optimizes TCP socket to play
well with blocks (smart NO_DELAY mode). It is multiplatform, nut lacks of async TCP/IP support
on natvic targetm this is where I need help having little time. I'd prefer to use something asyn like UV on native targets.
I know no existing way to implement it in KotlinJS for the modern browsers.
## Websock server
While it is much slower than pure TCP, it is still faster than any http-based transport. It uses binary frames based on the Ktor server framework to easily integrate with web services. We recommend using it instead of a classic HTTP API as it beats it in terms of speed and server load even with HTTP/2.
We recommend to create the `KiloInterface<S>` instance and connect it to the websock and tcp servers in real applications to get easy access from anywhere.
# Usage
# Details
It is not compatible with parsec family and no more based on an Universa crypto library. To better fit
the modern state of threats and rate of cyber crimes, KiloParsec uses more encryption and random key exchange on each
@ -10,9 +34,9 @@ and every connection (while parsec caches session keys to avoid time-consuming k
keys cryptography for session is shifted to use ed25519 curves which are supposed to provide agreeable strength with
enough speed to protect every connection with a unique new keys. Also, we completely get rid of SHA2.
Kiloparsec also uses a denser binary format (bipack, no more key-values)
Kiloparsec also uses a denser binary format [bipack](https://gitea.sergeych.net/SergeychWorks/mp_bintools), no more key-values,
which reveals much less on the inner data structure, providing advanced
typed RPC interfaces with kotlinx.serialization.
typed RPC interfaces with kotlinx.serialization. There is also Rust implementation [bipack_ru](https://gitea.sergeych.net/DiWAN/bipack_ru).
The architecture allows connecting same functional interfaces to several various type channels at once.
Also, the difference from parsecs is that there are no more unencrypted layer commands available to users.

View File

@ -1,13 +1,12 @@
import org.jetbrains.kotlin.gradle.plugin.KotlinJsCompilerType
plugins {
kotlin("multiplatform") version "1.9.20"
id("org.jetbrains.kotlin.plugin.serialization") version "1.9.20"
kotlin("multiplatform") version "1.9.21"
id("org.jetbrains.kotlin.plugin.serialization") version "1.9.21"
`maven-publish`
}
group = "net.sergeych"
version = "0.1.0-SNAPSHOT"
version = "0.1.2-SNAPSHOT"
repositories {
mavenCentral()
@ -26,7 +25,7 @@ kotlin {
}
}
}
js(KotlinJsCompilerType.IR) {
js(IR) {
browser {
// commonWebpackConfig {
// cssSupport {
@ -63,8 +62,8 @@ kotlin {
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1")
implementation("com.ionspin.kotlin:multiplatform-crypto-libsodium-bindings:0.9.0")
api("com.ionspin.kotlin:bignum:0.3.8")
implementation("io.ktor:ktor-client-core:$ktor_version")
api("com.ionspin.kotlin:bignum:0.3.9")
api("io.ktor:ktor-client-core:$ktor_version")
api("net.sergeych:mp_bintools:0.0.6-SNAPSHOT")
api("net.sergeych:mp_stools:1.4.1")
@ -84,7 +83,7 @@ kotlin {
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-cio:$ktor_version")
api("io.ktor:ktor-client-cio:$ktor_version")
}
}
val jvmTest by getting
@ -101,4 +100,22 @@ kotlin {
}
val nativeTest by getting
}
publishing {
val mavenToken by lazy {
File("${System.getProperty("user.home")}/.gitea_token").readText()
}
repositories {
maven {
credentials(HttpHeaderCredentials::class) {
name = "Authorization"
value = mavenToken
}
url = uri("https://gitea.sergeych.net/api/packages/SergeychWorks/maven")
authentication {
create("Authorization", HttpHeaderAuthentication::class)
}
}
}
}
}

View File

@ -48,7 +48,7 @@ class KiloClient<S>(
val client = KiloClientConnection(localInterface, kc,secretKey)
deferredClient.complete(client)
client.run {
_state.value = false
_state.value = it
}
debug { "client run finished" }
} catch (_: RemoteInterface.ClosedException) {

View File

@ -7,7 +7,13 @@ import net.sergeych.utools.unpack
private var L1IdCounter = 0
// todo: We don't need it deferred here
/**
* Represents a remote interface for interacting with a Kiloparsec service.
*
* @param S the scope type of the Kiloparsec service which will be used to call local functions remotely
* @property deferredParams a [CompletableDeferred] that resolves to the parameters required for making remote calls
* @property clientInterface a [LocalInterface] used to communicate with the local client
*/
class KiloRemoteInterface<S>(
private val deferredParams: CompletableDeferred<KiloParams<S>>,
private val clientInterface: LocalInterface<KiloScope<S>>,

View File

@ -79,8 +79,8 @@ fun <S>websocketClient(
}
val device = ProxyDevice(input,output) {
input.close()
// we need to explicitly close the coroutine job or it can hang active
// forever and leak resources:
// we need to explicitly close the coroutine job, or it can hang for a long time
// leaking resources.
job.cancel()
}
KiloConnectionData(device, sessionMaker())

View File

@ -12,6 +12,7 @@ import net.sergeych.mp_logger.Log
import java.net.InetAddress
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertTrue
class ClientTest {
@ -78,6 +79,7 @@ class ClientTest {
val client = websocketClient<Unit>("ws://localhost:8080/kp")
println(1)
assertEquals(true, client.call(cmdCheckConnected))
assertTrue { client.state.value }
println(2)
assertEquals("not set", client.call(cmdGetFoo))
println(3)