Update dependencies

This commit is contained in:
Alexander Nozik 2022-05-23 23:30:38 +03:00
parent 2e7eefeba9
commit 3d0b888c11
No known key found for this signature in database
GPG Key ID: F7FCF2DD25C71357
24 changed files with 152 additions and 156 deletions

View File

@ -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"

View File

@ -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")
} }

View File

@ -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")
} }

View File

@ -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) {

View File

@ -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

View File

@ -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

View File

@ -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 { dependencies {
sourceSets { api(project(":controls-core"))
commonMain { api("io.ktor:ktor-network:$ktorVersion")
dependencies { }
api(project(":controls-core"))
api("io.ktor:ktor-network:$ktorVersion")
}
}
}
}

View File

@ -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 {

View File

@ -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 {

View File

@ -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")
//} }

View File

@ -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,33 +54,32 @@ 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)
install(CORS) { install(CORS) {
anyHost() anyHost()
} }
val sinFlow = MutableSharedFlow<Meta?>()// = device.sin.flow() val sinFlow = MutableSharedFlow<Meta?>()// = device.sin.flow()
val cosFlow = MutableSharedFlow<Meta?>()// = device.cos.flow() val cosFlow = MutableSharedFlow<Meta?>()// = device.cos.flow()
launch { launch {
subscribe().collect { magix -> subscribe().collect { magix ->
(magix.payload as? PropertyChangedMessage)?.let { message -> (magix.payload as? PropertyChangedMessage)?.let { message ->
when (message.property) { when (message.property) {
"sin" -> sinFlow.emit(message.value) "sin" -> sinFlow.emit(message.value)
"cos" -> cosFlow.emit(message.value) "cos" -> cosFlow.emit(message.value)
}
} }
} }
} }
}
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() }

View File

@ -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)
} //}

View File

@ -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

View File

@ -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

View File

@ -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
}

View File

@ -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")
} }
} }
} }

View File

@ -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()
} }

View File

@ -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

View File

@ -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")
} }

View File

@ -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))
} }
} }
} }

View File

@ -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>(

View File

@ -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.

View File

@ -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) {

View File

@ -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",