Update dependencies
This commit is contained in:
parent
2e7eefeba9
commit
3d0b888c11
@ -2,9 +2,9 @@ plugins {
|
|||||||
id("ru.mipt.npm.gradle.project")
|
id("ru.mipt.npm.gradle.project")
|
||||||
}
|
}
|
||||||
|
|
||||||
val dataforgeVersion: String by extra("0.5.1")
|
val dataforgeVersion: String by extra("0.5.2")
|
||||||
val ktorVersion: String by extra(ru.mipt.npm.gradle.KScienceVersions.ktorVersion)
|
val ktorVersion: String by extra(ru.mipt.npm.gradle.KScienceVersions.ktorVersion)
|
||||||
val rsocketVersion by extra("0.13.1")
|
val rsocketVersion by extra("0.15.4")
|
||||||
|
|
||||||
allprojects {
|
allprojects {
|
||||||
group = "ru.mipt.npm"
|
group = "ru.mipt.npm"
|
||||||
|
@ -39,8 +39,8 @@ public suspend inline fun <reified T: Any> MiloDevice.readOpcWithTime(
|
|||||||
val time = data.serverTime ?: error("No server time provided")
|
val time = data.serverTime ?: error("No server time provided")
|
||||||
val meta: Meta = when (val content = data.value.value) {
|
val meta: Meta = when (val content = data.value.value) {
|
||||||
is T -> return content to time
|
is T -> return content to time
|
||||||
content is Meta -> content as Meta
|
is Meta -> content
|
||||||
content is ExtensionObject -> (content as ExtensionObject).decode(client.dynamicSerializationContext) as Meta
|
is ExtensionObject -> content.decode(client.dynamicSerializationContext) as Meta
|
||||||
else -> error("Incompatible OPC property value $content")
|
else -> error("Incompatible OPC property value $content")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,7 +15,9 @@ dependencies {
|
|||||||
implementation(project(":controls-tcp"))
|
implementation(project(":controls-tcp"))
|
||||||
implementation(projects.magix.magixServer)
|
implementation(projects.magix.magixServer)
|
||||||
implementation("io.ktor:ktor-server-cio:$ktorVersion")
|
implementation("io.ktor:ktor-server-cio:$ktorVersion")
|
||||||
implementation("io.ktor:ktor-websockets:$ktorVersion")
|
implementation("io.ktor:ktor-server-websockets:$ktorVersion")
|
||||||
implementation("io.ktor:ktor-serialization:$ktorVersion")
|
implementation("io.ktor:ktor-server-content-negotiation:$ktorVersion")
|
||||||
implementation("io.ktor:ktor-html-builder:$ktorVersion")
|
implementation("io.ktor:ktor-serialization-kotlinx-json:$ktorVersion")
|
||||||
|
implementation("io.ktor:ktor-server-html-builder:$ktorVersion")
|
||||||
|
implementation("io.ktor:ktor-server-status-pages:$ktorVersion")
|
||||||
}
|
}
|
@ -1,24 +1,23 @@
|
|||||||
package ru.mipt.npm.controls.server
|
package ru.mipt.npm.controls.server
|
||||||
|
|
||||||
|
|
||||||
import io.ktor.application.*
|
|
||||||
import io.ktor.features.CORS
|
|
||||||
import io.ktor.features.StatusPages
|
|
||||||
import io.ktor.html.respondHtml
|
|
||||||
import io.ktor.http.HttpStatusCode
|
import io.ktor.http.HttpStatusCode
|
||||||
import io.ktor.request.receiveText
|
import io.ktor.server.application.*
|
||||||
import io.ktor.response.respond
|
|
||||||
import io.ktor.response.respondRedirect
|
|
||||||
import io.ktor.response.respondText
|
|
||||||
import io.ktor.routing.get
|
|
||||||
import io.ktor.routing.post
|
|
||||||
import io.ktor.routing.route
|
|
||||||
import io.ktor.routing.routing
|
|
||||||
import io.ktor.server.cio.CIO
|
import io.ktor.server.cio.CIO
|
||||||
import io.ktor.server.engine.ApplicationEngine
|
import io.ktor.server.engine.ApplicationEngine
|
||||||
import io.ktor.server.engine.embeddedServer
|
import io.ktor.server.engine.embeddedServer
|
||||||
import io.ktor.util.getValue
|
import io.ktor.server.html.respondHtml
|
||||||
import io.ktor.websocket.WebSockets
|
import io.ktor.server.plugins.statuspages.StatusPages
|
||||||
|
import io.ktor.server.request.receiveText
|
||||||
|
import io.ktor.server.response.respond
|
||||||
|
import io.ktor.server.response.respondRedirect
|
||||||
|
import io.ktor.server.response.respondText
|
||||||
|
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 io.ktor.server.util.getValue
|
||||||
|
import io.ktor.server.websocket.WebSockets
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.flow.MutableSharedFlow
|
import kotlinx.coroutines.flow.MutableSharedFlow
|
||||||
import kotlinx.html.*
|
import kotlinx.html.*
|
||||||
@ -52,11 +51,11 @@ public fun CoroutineScope.startDeviceServer(
|
|||||||
|
|
||||||
return this.embeddedServer(CIO, port, host) {
|
return this.embeddedServer(CIO, port, host) {
|
||||||
install(WebSockets)
|
install(WebSockets)
|
||||||
install(CORS) {
|
// install(CORS) {
|
||||||
anyHost()
|
// anyHost()
|
||||||
}
|
// }
|
||||||
install(StatusPages) {
|
install(StatusPages) {
|
||||||
exception<IllegalArgumentException> { cause ->
|
exception<IllegalArgumentException> { call, cause ->
|
||||||
call.respond(HttpStatusCode.BadRequest, cause.message ?: "")
|
call.respond(HttpStatusCode.BadRequest, cause.message ?: "")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -83,15 +82,15 @@ public fun Application.deviceManagerModule(
|
|||||||
rawSocketPort: Int = MagixEndpoint.DEFAULT_MAGIX_RAW_PORT,
|
rawSocketPort: Int = MagixEndpoint.DEFAULT_MAGIX_RAW_PORT,
|
||||||
buffer: Int = 100,
|
buffer: Int = 100,
|
||||||
) {
|
) {
|
||||||
if (featureOrNull(WebSockets) == null) {
|
if (pluginOrNull(WebSockets) == null) {
|
||||||
install(WebSockets)
|
install(WebSockets)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (featureOrNull(CORS) == null) {
|
// if (pluginOrNull(CORS) == null) {
|
||||||
install(CORS) {
|
// install(CORS) {
|
||||||
anyHost()
|
// anyHost()
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
routing {
|
routing {
|
||||||
route(route) {
|
route(route) {
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
package ru.mipt.npm.controls.server
|
package ru.mipt.npm.controls.server
|
||||||
|
|
||||||
import io.ktor.application.ApplicationCall
|
|
||||||
import io.ktor.http.ContentType
|
import io.ktor.http.ContentType
|
||||||
import io.ktor.response.respondText
|
import io.ktor.server.application.ApplicationCall
|
||||||
|
import io.ktor.server.response.respondText
|
||||||
import kotlinx.serialization.json.JsonObjectBuilder
|
import kotlinx.serialization.json.JsonObjectBuilder
|
||||||
import kotlinx.serialization.json.buildJsonObject
|
import kotlinx.serialization.json.buildJsonObject
|
||||||
import ru.mipt.npm.controls.api.DeviceMessage
|
import ru.mipt.npm.controls.api.DeviceMessage
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
package ru.mipt.npm.controls.storage
|
package ru.mipt.npm.controls.storage
|
||||||
|
|
||||||
import io.ktor.application.Application
|
import io.ktor.server.application.Application
|
||||||
import kotlinx.coroutines.InternalCoroutinesApi
|
import kotlinx.coroutines.InternalCoroutinesApi
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
import kotlinx.coroutines.flow.MutableSharedFlow
|
import kotlinx.coroutines.flow.MutableSharedFlow
|
||||||
|
@ -1,17 +1,10 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id("ru.mipt.npm.gradle.mpp")
|
id("ru.mipt.npm.gradle.jvm")
|
||||||
}
|
}
|
||||||
|
|
||||||
val ktorVersion: String by rootProject.extra
|
val ktorVersion: String by rootProject.extra
|
||||||
|
|
||||||
kotlin {
|
|
||||||
sourceSets {
|
|
||||||
commonMain {
|
|
||||||
dependencies {
|
dependencies {
|
||||||
api(project(":controls-core"))
|
api(project(":controls-core"))
|
||||||
api("io.ktor:ktor-network:$ktorVersion")
|
api("io.ktor:ktor-network:$ktorVersion")
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
@ -16,7 +16,6 @@ import space.kscience.dataforge.meta.Meta
|
|||||||
import space.kscience.dataforge.meta.get
|
import space.kscience.dataforge.meta.get
|
||||||
import space.kscience.dataforge.meta.int
|
import space.kscience.dataforge.meta.int
|
||||||
import space.kscience.dataforge.meta.string
|
import space.kscience.dataforge.meta.string
|
||||||
import java.net.InetSocketAddress
|
|
||||||
import kotlin.coroutines.CoroutineContext
|
import kotlin.coroutines.CoroutineContext
|
||||||
|
|
||||||
public class KtorTcpPort internal constructor(
|
public class KtorTcpPort internal constructor(
|
||||||
@ -29,7 +28,7 @@ public class KtorTcpPort internal constructor(
|
|||||||
override fun toString(): String = "port[tcp:$host:$port]"
|
override fun toString(): String = "port[tcp:$host:$port]"
|
||||||
|
|
||||||
private val futureSocket = scope.async {
|
private val futureSocket = scope.async {
|
||||||
aSocket(ActorSelectorManager(Dispatchers.IO)).tcp().connect(InetSocketAddress(host, port))
|
aSocket(ActorSelectorManager(Dispatchers.IO)).tcp().connect(host, port)
|
||||||
}
|
}
|
||||||
|
|
||||||
private val writeChannel = scope.async {
|
private val writeChannel = scope.async {
|
@ -1,15 +1,13 @@
|
|||||||
plugins {
|
plugins {
|
||||||
kotlin("jvm")
|
kotlin("jvm")
|
||||||
id("org.openjfx.javafxplugin") version "0.0.9"
|
id("org.openjfx.javafxplugin") version "0.0.10"
|
||||||
application
|
application
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
jcenter()
|
|
||||||
maven("https://repo.kotlin.link")
|
maven("https://repo.kotlin.link")
|
||||||
maven("https://kotlin.bintray.com/kotlinx")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
val ktorVersion: String by rootProject.extra
|
val ktorVersion: String by rootProject.extra
|
||||||
@ -26,9 +24,9 @@ dependencies {
|
|||||||
|
|
||||||
implementation("io.ktor:ktor-client-cio:$ktorVersion")
|
implementation("io.ktor:ktor-client-cio:$ktorVersion")
|
||||||
implementation("no.tornado:tornadofx:1.7.20")
|
implementation("no.tornado:tornadofx:1.7.20")
|
||||||
implementation("space.kscience:plotlykt-server:0.5.0-dev-1")
|
implementation("space.kscience:plotlykt-server:0.5.2-dev-2")
|
||||||
implementation("com.github.Ricky12Awesome:json-schema-serialization:0.6.6")
|
// implementation("com.github.Ricky12Awesome:json-schema-serialization:0.6.6")
|
||||||
implementation("ch.qos.logback:logback-classic:1.2.3")
|
implementation("ch.qos.logback:logback-classic:1.2.11")
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().configureEach {
|
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().configureEach {
|
||||||
|
@ -26,8 +26,8 @@ dependencies {
|
|||||||
implementation("io.ktor:ktor-client-cio:$ktorVersion")
|
implementation("io.ktor:ktor-client-cio:$ktorVersion")
|
||||||
implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.3.1")
|
implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.3.1")
|
||||||
implementation("no.tornado:tornadofx:1.7.20")
|
implementation("no.tornado:tornadofx:1.7.20")
|
||||||
implementation("space.kscience:plotlykt-server:0.5.0-dev-1")
|
implementation("space.kscience:plotlykt-server:0.5.0")
|
||||||
implementation("ch.qos.logback:logback-classic:1.2.3")
|
implementation("ch.qos.logback:logback-classic:1.2.11")
|
||||||
implementation("org.jetbrains.xodus:xodus-entity-store:1.3.232")
|
implementation("org.jetbrains.xodus:xodus-entity-store:1.3.232")
|
||||||
implementation("org.jetbrains.xodus:xodus-environment:1.3.232")
|
implementation("org.jetbrains.xodus:xodus-environment:1.3.232")
|
||||||
implementation("org.jetbrains.xodus:xodus-vfs:1.3.232")
|
implementation("org.jetbrains.xodus:xodus-vfs:1.3.232")
|
||||||
@ -46,6 +46,6 @@ javafx {
|
|||||||
modules("javafx.controls")
|
modules("javafx.controls")
|
||||||
}
|
}
|
||||||
|
|
||||||
//application {
|
application {
|
||||||
// mainClass.set("ru.mipt.npm.controls.demo.DemoControllerViewKt")
|
mainClass.set("ru.mipt.npm.controls.demo.car.VirtualCarControllerKt")
|
||||||
//}
|
}
|
@ -1,12 +1,12 @@
|
|||||||
package ru.mipt.npm.controls.demo
|
package ru.mipt.npm.controls.demo
|
||||||
|
|
||||||
import io.ktor.application.install
|
import io.ktor.server.application.install
|
||||||
import io.ktor.features.CORS
|
|
||||||
import io.ktor.server.cio.CIO
|
import io.ktor.server.cio.CIO
|
||||||
import io.ktor.server.engine.ApplicationEngine
|
import io.ktor.server.engine.ApplicationEngine
|
||||||
import io.ktor.server.engine.embeddedServer
|
import io.ktor.server.engine.embeddedServer
|
||||||
import io.ktor.websocket.WebSockets
|
import io.ktor.server.plugins.cors.routing.CORS
|
||||||
import io.rsocket.kotlin.transport.ktor.server.RSocketSupport
|
import io.ktor.server.websocket.WebSockets
|
||||||
|
import io.rsocket.kotlin.ktor.server.RSocketSupport
|
||||||
import kotlinx.coroutines.flow.*
|
import kotlinx.coroutines.flow.*
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.html.div
|
import kotlinx.html.div
|
||||||
@ -54,8 +54,7 @@ suspend fun Trace.updateXYFrom(flow: Flow<Iterable<Pair<Double, Double>>>) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
suspend fun MagixEndpoint<DeviceMessage>.startDemoDeviceServer(): ApplicationEngine =
|
suspend fun MagixEndpoint<DeviceMessage>.startDemoDeviceServer(): ApplicationEngine = embeddedServer(CIO, 9090) {
|
||||||
embeddedServer(CIO, 9090) {
|
|
||||||
install(WebSockets)
|
install(WebSockets)
|
||||||
install(RSocketSupport)
|
install(RSocketSupport)
|
||||||
|
|
||||||
@ -77,10 +76,10 @@ suspend fun MagixEndpoint<DeviceMessage>.startDemoDeviceServer(): ApplicationEng
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
plotlyModule().apply {
|
plotlyModule{
|
||||||
updateMode = PlotlyUpdateMode.PUSH
|
updateMode = PlotlyUpdateMode.PUSH
|
||||||
updateInterval = 50
|
updateInterval = 50
|
||||||
}.page { container ->
|
page { container ->
|
||||||
val sinCosFlow = sinFlow.zip(cosFlow) { sin, cos ->
|
val sinCosFlow = sinFlow.zip(cosFlow) { sin, cos ->
|
||||||
sin.double!! to cos.double!!
|
sin.double!! to cos.double!!
|
||||||
}
|
}
|
||||||
@ -140,6 +139,8 @@ suspend fun MagixEndpoint<DeviceMessage>.startDemoDeviceServer(): ApplicationEng
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}.apply { start() }
|
}.apply { start() }
|
||||||
|
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
package ru.mipt.npm.controls.demo
|
package ru.mipt.npm.controls.demo
|
||||||
|
|
||||||
import com.github.ricky12awesome.jss.encodeToSchema
|
//import com.github.ricky12awesome.jss.encodeToSchema
|
||||||
import com.github.ricky12awesome.jss.globalJson
|
//import com.github.ricky12awesome.jss.globalJson
|
||||||
import ru.mipt.npm.controls.api.DeviceMessage
|
//import ru.mipt.npm.controls.api.DeviceMessage
|
||||||
|
|
||||||
fun main() {
|
//fun main() {
|
||||||
val schema = globalJson.encodeToSchema(DeviceMessage.serializer(), generateDefinitions = false)
|
// val schema = globalJson.encodeToSchema(DeviceMessage.serializer(), generateDefinitions = false)
|
||||||
println(schema)
|
// println(schema)
|
||||||
}
|
//}
|
@ -3,10 +3,9 @@ kotlin.mpp.stability.nowarn=true
|
|||||||
|
|
||||||
kotlin.jupyter.add.scanner=false
|
kotlin.jupyter.add.scanner=false
|
||||||
|
|
||||||
org.gradle.jvmargs=-XX:MaxMetaspaceSize=1G
|
|
||||||
org.gradle.parallel=true
|
org.gradle.parallel=true
|
||||||
|
|
||||||
publishing.github=false
|
publishing.github=false
|
||||||
publishing.sonatype=false
|
publishing.sonatype=false
|
||||||
|
|
||||||
toolsVersion=0.10.9-kotlin-1.6.10
|
toolsVersion=0.11.5-kotlin-1.6.21
|
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@ -1,5 +1,5 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
|
@ -8,3 +8,8 @@ dependencies {
|
|||||||
implementation(project(":magix:magix-rsocket"))
|
implementation(project(":magix:magix-rsocket"))
|
||||||
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-jdk9:${ru.mipt.npm.gradle.KScienceVersions.coroutinesVersion}")
|
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-jdk9:${ru.mipt.npm.gradle.KScienceVersions.coroutinesVersion}")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
java {
|
||||||
|
sourceCompatibility = JavaVersion.VERSION_11
|
||||||
|
targetCompatibility = JavaVersion.VERSION_11
|
||||||
|
}
|
||||||
|
@ -22,7 +22,13 @@ kotlin {
|
|||||||
dependencies {
|
dependencies {
|
||||||
api(projects.magix.magixApi)
|
api(projects.magix.magixApi)
|
||||||
implementation("io.ktor:ktor-client-core:$ktorVersion")
|
implementation("io.ktor:ktor-client-core:$ktorVersion")
|
||||||
implementation("io.rsocket.kotlin:rsocket-transport-ktor-client:$rsocketVersion")
|
implementation("io.rsocket.kotlin:rsocket-ktor-client:$rsocketVersion")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
jvmMain{
|
||||||
|
dependencies{
|
||||||
|
implementation("io.ktor:ktor-network:$ktorVersion")
|
||||||
|
implementation("io.rsocket.kotlin:rsocket-transport-ktor-tcp:$rsocketVersion")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,16 +1,17 @@
|
|||||||
package ru.mipt.npm.magix.rsocket
|
package ru.mipt.npm.magix.rsocket
|
||||||
|
|
||||||
import io.ktor.client.HttpClient
|
import io.ktor.client.HttpClient
|
||||||
import io.ktor.client.features.websocket.WebSockets
|
import io.ktor.client.plugins.websocket.WebSockets
|
||||||
import io.rsocket.kotlin.RSocket
|
import io.rsocket.kotlin.RSocket
|
||||||
import io.rsocket.kotlin.core.RSocketConnector
|
import io.rsocket.kotlin.core.RSocketConnector
|
||||||
import io.rsocket.kotlin.core.RSocketConnectorBuilder
|
import io.rsocket.kotlin.core.RSocketConnectorBuilder
|
||||||
|
import io.rsocket.kotlin.ktor.client.RSocketSupport
|
||||||
|
import io.rsocket.kotlin.ktor.client.rSocket
|
||||||
import io.rsocket.kotlin.payload.buildPayload
|
import io.rsocket.kotlin.payload.buildPayload
|
||||||
import io.rsocket.kotlin.payload.data
|
import io.rsocket.kotlin.payload.data
|
||||||
import io.rsocket.kotlin.transport.ktor.client.RSocketSupport
|
|
||||||
import io.rsocket.kotlin.transport.ktor.client.rSocket
|
|
||||||
import kotlinx.coroutines.CoroutineDispatcher
|
import kotlinx.coroutines.CoroutineDispatcher
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.Job
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
import kotlinx.coroutines.flow.flowOn
|
import kotlinx.coroutines.flow.flowOn
|
||||||
import kotlinx.coroutines.flow.map
|
import kotlinx.coroutines.flow.map
|
||||||
@ -79,7 +80,7 @@ public suspend fun <T> MagixEndpoint.Companion.rSocketWithWebSockets(
|
|||||||
val rSocket = client.rSocket(host, port, path)
|
val rSocket = client.rSocket(host, port, path)
|
||||||
|
|
||||||
//Ensure client is closed after rSocket if finished
|
//Ensure client is closed after rSocket if finished
|
||||||
rSocket.job.invokeOnCompletion {
|
rSocket.coroutineContext[Job]?.invokeOnCompletion {
|
||||||
client.close()
|
client.close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,11 +1,9 @@
|
|||||||
package ru.mipt.npm.magix.rsocket
|
package ru.mipt.npm.magix.rsocket
|
||||||
|
|
||||||
import io.ktor.network.selector.ActorSelectorManager
|
|
||||||
import io.ktor.network.sockets.SocketOptions
|
import io.ktor.network.sockets.SocketOptions
|
||||||
import io.ktor.util.InternalAPI
|
import io.ktor.util.InternalAPI
|
||||||
import io.rsocket.kotlin.core.RSocketConnectorBuilder
|
import io.rsocket.kotlin.core.RSocketConnectorBuilder
|
||||||
import io.rsocket.kotlin.transport.ktor.TcpClientTransport
|
import io.rsocket.kotlin.transport.ktor.tcp.TcpClientTransport
|
||||||
import kotlinx.coroutines.Dispatchers
|
|
||||||
import kotlinx.serialization.KSerializer
|
import kotlinx.serialization.KSerializer
|
||||||
import ru.mipt.npm.magix.api.MagixEndpoint
|
import ru.mipt.npm.magix.api.MagixEndpoint
|
||||||
import kotlin.coroutines.coroutineContext
|
import kotlin.coroutines.coroutineContext
|
||||||
@ -23,7 +21,6 @@ public suspend fun <T> MagixEndpoint.Companion.rSocketWithTcp(
|
|||||||
rSocketConfig: RSocketConnectorBuilder.ConnectionConfigBuilder.() -> Unit = {},
|
rSocketConfig: RSocketConnectorBuilder.ConnectionConfigBuilder.() -> Unit = {},
|
||||||
): RSocketMagixEndpoint<T> {
|
): RSocketMagixEndpoint<T> {
|
||||||
val transport = TcpClientTransport(
|
val transport = TcpClientTransport(
|
||||||
ActorSelectorManager(Dispatchers.IO),
|
|
||||||
hostname = host,
|
hostname = host,
|
||||||
port = port,
|
port = port,
|
||||||
configure = tcpConfig
|
configure = tcpConfig
|
||||||
|
@ -21,12 +21,13 @@ val ktorVersion: String = ru.mipt.npm.gradle.KScienceVersions.ktorVersion
|
|||||||
dependencies{
|
dependencies{
|
||||||
api(project(":magix:magix-api"))
|
api(project(":magix:magix-api"))
|
||||||
api("io.ktor:ktor-server-cio:$ktorVersion")
|
api("io.ktor:ktor-server-cio:$ktorVersion")
|
||||||
api("io.ktor:ktor-websockets:$ktorVersion")
|
api("io.ktor:ktor-server-websockets:$ktorVersion")
|
||||||
api("io.ktor:ktor-serialization:$ktorVersion")
|
api("io.ktor:ktor-server-content-negotiation:$ktorVersion")
|
||||||
api("io.ktor:ktor-html-builder:$ktorVersion")
|
api("io.ktor:ktor-serialization-kotlinx-json:$ktorVersion")
|
||||||
|
api("io.ktor:ktor-server-html-builder:$ktorVersion")
|
||||||
|
|
||||||
api("io.rsocket.kotlin:rsocket-core:$rsocketVersion")
|
api("io.rsocket.kotlin:rsocket-ktor-server:$rsocketVersion")
|
||||||
api("io.rsocket.kotlin:rsocket-transport-ktor-server:$rsocketVersion")
|
api("io.rsocket.kotlin:rsocket-transport-ktor-tcp:$rsocketVersion")
|
||||||
|
|
||||||
api("org.zeromq:jeromq:0.5.2")
|
api("org.zeromq:jeromq:0.5.2")
|
||||||
}
|
}
|
@ -1,24 +1,23 @@
|
|||||||
package ru.mipt.npm.magix.server
|
package ru.mipt.npm.magix.server
|
||||||
|
|
||||||
import io.ktor.application.*
|
import io.ktor.serialization.kotlinx.json.json
|
||||||
import io.ktor.features.CORS
|
import io.ktor.server.application.*
|
||||||
import io.ktor.features.ContentNegotiation
|
import io.ktor.server.html.respondHtml
|
||||||
import io.ktor.html.respondHtml
|
import io.ktor.server.plugins.contentnegotiation.ContentNegotiation
|
||||||
import io.ktor.request.receive
|
import io.ktor.server.request.receive
|
||||||
import io.ktor.routing.get
|
import io.ktor.server.routing.get
|
||||||
import io.ktor.routing.post
|
import io.ktor.server.routing.post
|
||||||
import io.ktor.routing.route
|
import io.ktor.server.routing.route
|
||||||
import io.ktor.routing.routing
|
import io.ktor.server.routing.routing
|
||||||
import io.ktor.serialization.json
|
import io.ktor.server.util.getValue
|
||||||
import io.ktor.util.getValue
|
import io.ktor.server.websocket.WebSockets
|
||||||
import io.ktor.websocket.WebSockets
|
|
||||||
import io.rsocket.kotlin.ConnectionAcceptor
|
import io.rsocket.kotlin.ConnectionAcceptor
|
||||||
import io.rsocket.kotlin.RSocketRequestHandler
|
import io.rsocket.kotlin.RSocketRequestHandler
|
||||||
|
import io.rsocket.kotlin.ktor.server.RSocketSupport
|
||||||
|
import io.rsocket.kotlin.ktor.server.rSocket
|
||||||
import io.rsocket.kotlin.payload.Payload
|
import io.rsocket.kotlin.payload.Payload
|
||||||
import io.rsocket.kotlin.payload.buildPayload
|
import io.rsocket.kotlin.payload.buildPayload
|
||||||
import io.rsocket.kotlin.payload.data
|
import io.rsocket.kotlin.payload.data
|
||||||
import io.rsocket.kotlin.transport.ktor.server.RSocketSupport
|
|
||||||
import io.rsocket.kotlin.transport.ktor.server.rSocket
|
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.flow.*
|
import kotlinx.coroutines.flow.*
|
||||||
import kotlinx.html.*
|
import kotlinx.html.*
|
||||||
@ -88,23 +87,23 @@ private fun ApplicationCall.buildFilter(): MagixMessageFilter {
|
|||||||
* Attache magix http/sse and websocket-based rsocket event loop + statistics page to existing [MutableSharedFlow]
|
* Attache magix http/sse and websocket-based rsocket event loop + statistics page to existing [MutableSharedFlow]
|
||||||
*/
|
*/
|
||||||
public fun Application.magixModule(magixFlow: MutableSharedFlow<GenericMagixMessage>, route: String = "/") {
|
public fun Application.magixModule(magixFlow: MutableSharedFlow<GenericMagixMessage>, route: String = "/") {
|
||||||
if (featureOrNull(WebSockets) == null) {
|
if (pluginOrNull(WebSockets) == null) {
|
||||||
install(WebSockets)
|
install(WebSockets)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (featureOrNull(CORS) == null) {
|
// if (pluginOrNull(CORS) == null) {
|
||||||
install(CORS) {
|
// install(CORS) {
|
||||||
//TODO consider more safe policy
|
// //TODO consider more safe policy
|
||||||
anyHost()
|
// anyHost()
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
if (featureOrNull(ContentNegotiation) == null) {
|
if (pluginOrNull(ContentNegotiation) == null) {
|
||||||
install(ContentNegotiation) {
|
install(ContentNegotiation) {
|
||||||
json()
|
json()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (featureOrNull(RSocketSupport) == null) {
|
if (pluginOrNull(RSocketSupport) == null) {
|
||||||
install(RSocketSupport)
|
install(RSocketSupport)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -150,7 +149,7 @@ public fun Application.magixModule(magixFlow: MutableSharedFlow<GenericMagixMess
|
|||||||
magixFlow.emit(message)
|
magixFlow.emit(message)
|
||||||
}
|
}
|
||||||
//rSocket server. Filter from Payload
|
//rSocket server. Filter from Payload
|
||||||
rSocket("rsocket", acceptor = magixAcceptor(magixFlow))
|
rSocket("rsocket", acceptor = this@magixModule.magixAcceptor(magixFlow))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,15 +1,13 @@
|
|||||||
package ru.mipt.npm.magix.server
|
package ru.mipt.npm.magix.server
|
||||||
|
|
||||||
import io.ktor.application.Application
|
import io.ktor.server.application.Application
|
||||||
import io.ktor.network.selector.ActorSelectorManager
|
|
||||||
import io.ktor.server.cio.CIO
|
import io.ktor.server.cio.CIO
|
||||||
import io.ktor.server.engine.ApplicationEngine
|
import io.ktor.server.engine.ApplicationEngine
|
||||||
import io.ktor.server.engine.embeddedServer
|
import io.ktor.server.engine.embeddedServer
|
||||||
import io.ktor.util.InternalAPI
|
|
||||||
import io.rsocket.kotlin.core.RSocketServer
|
import io.rsocket.kotlin.core.RSocketServer
|
||||||
import io.rsocket.kotlin.transport.ktor.TcpServerTransport
|
import io.rsocket.kotlin.transport.ktor.tcp.TcpServer
|
||||||
|
import io.rsocket.kotlin.transport.ktor.tcp.TcpServerTransport
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
|
||||||
import kotlinx.coroutines.Job
|
import kotlinx.coroutines.Job
|
||||||
import kotlinx.coroutines.flow.MutableSharedFlow
|
import kotlinx.coroutines.flow.MutableSharedFlow
|
||||||
import org.slf4j.LoggerFactory
|
import org.slf4j.LoggerFactory
|
||||||
@ -20,16 +18,17 @@ import ru.mipt.npm.magix.api.MagixEndpoint.Companion.DEFAULT_MAGIX_RAW_PORT
|
|||||||
/**
|
/**
|
||||||
* Raw TCP magix server
|
* Raw TCP magix server
|
||||||
*/
|
*/
|
||||||
@OptIn(InternalAPI::class)
|
|
||||||
public fun CoroutineScope.launchMagixServerRawRSocket(
|
public fun CoroutineScope.launchMagixServerRawRSocket(
|
||||||
magixFlow: MutableSharedFlow<GenericMagixMessage>,
|
magixFlow: MutableSharedFlow<GenericMagixMessage>,
|
||||||
rawSocketPort: Int = DEFAULT_MAGIX_RAW_PORT
|
rawSocketPort: Int = DEFAULT_MAGIX_RAW_PORT,
|
||||||
): Job {
|
): TcpServer {
|
||||||
val tcpTransport = TcpServerTransport(ActorSelectorManager(Dispatchers.IO), port = rawSocketPort)
|
val tcpTransport = TcpServerTransport(port = rawSocketPort)
|
||||||
val rSocketJob = RSocketServer().bind(tcpTransport, magixAcceptor(magixFlow))
|
val rSocketJob: TcpServer = RSocketServer().bindIn(this, tcpTransport, magixAcceptor(magixFlow))
|
||||||
|
|
||||||
coroutineContext[Job]?.invokeOnCompletion {
|
coroutineContext[Job]?.invokeOnCompletion {
|
||||||
rSocketJob.cancel()
|
rSocketJob.handlerJob.cancel()
|
||||||
}
|
}
|
||||||
|
|
||||||
return rSocketJob;
|
return rSocketJob;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -42,7 +41,7 @@ public fun CoroutineScope.startMagixServer(
|
|||||||
buffer: Int = 100,
|
buffer: Int = 100,
|
||||||
enableRawRSocket: Boolean = true,
|
enableRawRSocket: Boolean = true,
|
||||||
enableZmq: Boolean = true,
|
enableZmq: Boolean = true,
|
||||||
applicationConfiguration: Application.(MutableSharedFlow<GenericMagixMessage>) -> Unit = {}
|
applicationConfiguration: Application.(MutableSharedFlow<GenericMagixMessage>) -> Unit = {},
|
||||||
): ApplicationEngine {
|
): ApplicationEngine {
|
||||||
val logger = LoggerFactory.getLogger("magix-server")
|
val logger = LoggerFactory.getLogger("magix-server")
|
||||||
val magixFlow = MutableSharedFlow<GenericMagixMessage>(
|
val magixFlow = MutableSharedFlow<GenericMagixMessage>(
|
||||||
|
@ -1,14 +1,13 @@
|
|||||||
package ru.mipt.npm.magix.server
|
package ru.mipt.npm.magix.server
|
||||||
|
|
||||||
import io.ktor.application.ApplicationCall
|
|
||||||
import io.ktor.http.CacheControl
|
import io.ktor.http.CacheControl
|
||||||
import io.ktor.http.ContentType
|
import io.ktor.http.ContentType
|
||||||
import io.ktor.response.cacheControl
|
import io.ktor.server.application.ApplicationCall
|
||||||
import io.ktor.response.respondBytesWriter
|
import io.ktor.server.response.cacheControl
|
||||||
|
import io.ktor.server.response.respondBytesWriter
|
||||||
import io.ktor.utils.io.ByteWriteChannel
|
import io.ktor.utils.io.ByteWriteChannel
|
||||||
import io.ktor.utils.io.writeStringUtf8
|
import io.ktor.utils.io.writeStringUtf8
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
import kotlinx.coroutines.flow.collect
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The data class representing a SSE Event that will be sent to the client.
|
* The data class representing a SSE Event that will be sent to the client.
|
||||||
|
@ -8,10 +8,8 @@ import io.ktor.util.InternalAPI
|
|||||||
import io.ktor.util.moveToByteArray
|
import io.ktor.util.moveToByteArray
|
||||||
import io.ktor.utils.io.writeAvailable
|
import io.ktor.utils.io.writeAvailable
|
||||||
import kotlinx.coroutines.*
|
import kotlinx.coroutines.*
|
||||||
import kotlinx.coroutines.flow.collect
|
|
||||||
import space.kscience.dataforge.context.Context
|
import space.kscience.dataforge.context.Context
|
||||||
import space.kscience.dataforge.context.Global
|
import space.kscience.dataforge.context.Global
|
||||||
import java.net.InetSocketAddress
|
|
||||||
|
|
||||||
val exceptionHandler = CoroutineExceptionHandler { _, throwable ->
|
val exceptionHandler = CoroutineExceptionHandler { _, throwable ->
|
||||||
throwable.printStackTrace()
|
throwable.printStackTrace()
|
||||||
@ -20,7 +18,7 @@ val exceptionHandler = CoroutineExceptionHandler { _, throwable ->
|
|||||||
@OptIn(InternalAPI::class)
|
@OptIn(InternalAPI::class)
|
||||||
fun Context.launchPiDebugServer(port: Int, axes: List<String>): Job = launch(exceptionHandler) {
|
fun Context.launchPiDebugServer(port: Int, axes: List<String>): Job = launch(exceptionHandler) {
|
||||||
val virtualDevice = PiMotionMasterVirtualDevice(this@launchPiDebugServer, axes)
|
val virtualDevice = PiMotionMasterVirtualDevice(this@launchPiDebugServer, axes)
|
||||||
val server = aSocket(ActorSelectorManager(Dispatchers.IO)).tcp().bind(InetSocketAddress("localhost", port))
|
val server = aSocket(ActorSelectorManager(Dispatchers.IO)).tcp().bind("localhost", port)
|
||||||
println("Started virtual port server at ${server.localAddress}")
|
println("Started virtual port server at ${server.localAddress}")
|
||||||
|
|
||||||
while (isActive) {
|
while (isActive) {
|
||||||
|
@ -8,9 +8,9 @@ pluginManagement {
|
|||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
mavenLocal()
|
mavenLocal()
|
||||||
maven("https://repo.kotlin.link")
|
|
||||||
mavenCentral()
|
|
||||||
gradlePluginPortal()
|
gradlePluginPortal()
|
||||||
|
mavenCentral()
|
||||||
|
maven("https://repo.kotlin.link")
|
||||||
}
|
}
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
@ -27,8 +27,8 @@ dependencyResolutionManagement {
|
|||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
mavenLocal()
|
mavenLocal()
|
||||||
maven("https://repo.kotlin.link")
|
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
|
maven("https://repo.kotlin.link")
|
||||||
}
|
}
|
||||||
|
|
||||||
versionCatalogs {
|
versionCatalogs {
|
||||||
@ -45,7 +45,7 @@ include(
|
|||||||
":controls-server",
|
":controls-server",
|
||||||
":controls-opcua",
|
":controls-opcua",
|
||||||
":demo",
|
":demo",
|
||||||
":demo:car",
|
// ":demo:car",
|
||||||
":magix",
|
":magix",
|
||||||
":magix:magix-api",
|
":magix:magix-api",
|
||||||
":magix:magix-server",
|
":magix:magix-server",
|
||||||
|
Loading…
Reference in New Issue
Block a user