diff --git a/README.md b/README.md index 098569b..9535868 100644 --- a/README.md +++ b/README.md @@ -53,11 +53,6 @@ Example view of a demo: > - [deviceHub](controls-core/src/commonMain/kotlin/space/kscience/controls/api/DeviceHub.kt) : Grouping of devices into local tree-like hubs. -### [controls-ktor-tcp](controls-ktor-tcp) -> -> -> **Maturity**: EXPERIMENTAL - ### [controls-magix-client](controls-magix-client) > > @@ -73,6 +68,16 @@ Example view of a demo: > > **Maturity**: EXPERIMENTAL +### [controls-pi](controls-pi) +> +> +> **Maturity**: EXPERIMENTAL + +### [controls-ports-ktor](controls-ports-ktor) +> +> +> **Maturity**: EXPERIMENTAL + ### [controls-serial](controls-serial) > > diff --git a/controls-magix-client/README.md b/controls-magix-client/README.md index 9e3187b..eec6dc1 100644 --- a/controls-magix-client/README.md +++ b/controls-magix-client/README.md @@ -6,7 +6,7 @@ Magix service for binding controls devices (both as RPC client and server ## Artifact: -The Maven coordinates of this project are `space.kscience:controls-magix-client:0.1.1-SNAPSHOT`. +The Maven coordinates of this project are `space.kscience:controls-magix-client:0.2.0-dev-2`. **Gradle Groovy:** ```groovy @@ -16,7 +16,7 @@ repositories { } dependencies { - implementation 'space.kscience:controls-magix-client:0.1.1-SNAPSHOT' + implementation 'space.kscience:controls-magix-client:0.2.0-dev-2' } ``` **Gradle Kotlin DSL:** @@ -27,6 +27,6 @@ repositories { } dependencies { - implementation("space.kscience:controls-magix-client:0.1.1-SNAPSHOT") + implementation("space.kscience:controls-magix-client:0.2.0-dev-2") } ``` diff --git a/controls-modbus/README.md b/controls-modbus/README.md index f6d2335..1e9a395 100644 --- a/controls-modbus/README.md +++ b/controls-modbus/README.md @@ -2,3 +2,31 @@ A plugin for Controls-kt device server on top of modbus-rtu/modbus-tcp protocols +## Usage + +## Artifact: + +The Maven coordinates of this project are `space.kscience:controls-modbus:0.2.0-dev-2`. + +**Gradle Groovy:** +```groovy +repositories { + maven { url 'https://repo.kotlin.link' } + mavenCentral() +} + +dependencies { + implementation 'space.kscience:controls-modbus:0.2.0-dev-2' +} +``` +**Gradle Kotlin DSL:** +```kotlin +repositories { + maven("https://repo.kotlin.link") + mavenCentral() +} + +dependencies { + implementation("space.kscience:controls-modbus:0.2.0-dev-2") +} +``` diff --git a/controls-opcua/README.md b/controls-opcua/README.md index 3accf5b..a365cb2 100644 --- a/controls-opcua/README.md +++ b/controls-opcua/README.md @@ -2,3 +2,31 @@ +## Usage + +## Artifact: + +The Maven coordinates of this project are `space.kscience:controls-opcua:0.2.0-dev-2`. + +**Gradle Groovy:** +```groovy +repositories { + maven { url 'https://repo.kotlin.link' } + mavenCentral() +} + +dependencies { + implementation 'space.kscience:controls-opcua:0.2.0-dev-2' +} +``` +**Gradle Kotlin DSL:** +```kotlin +repositories { + maven("https://repo.kotlin.link") + mavenCentral() +} + +dependencies { + implementation("space.kscience:controls-opcua:0.2.0-dev-2") +} +``` diff --git a/controls-ports-ktor/README.md b/controls-ports-ktor/README.md index 94deb3b..b43e48c 100644 --- a/controls-ports-ktor/README.md +++ b/controls-ports-ktor/README.md @@ -1,4 +1,32 @@ -# Module controls-ktor-tcp +# Module controls-ports-ktor +## Usage + +## Artifact: + +The Maven coordinates of this project are `space.kscience:controls-ports-ktor:0.2.0-dev-2`. + +**Gradle Groovy:** +```groovy +repositories { + maven { url 'https://repo.kotlin.link' } + mavenCentral() +} + +dependencies { + implementation 'space.kscience:controls-ports-ktor:0.2.0-dev-2' +} +``` +**Gradle Kotlin DSL:** +```kotlin +repositories { + maven("https://repo.kotlin.link") + mavenCentral() +} + +dependencies { + implementation("space.kscience:controls-ports-ktor:0.2.0-dev-2") +} +``` diff --git a/controls-serial/README.md b/controls-serial/README.md index eb214ba..bb2405a 100644 --- a/controls-serial/README.md +++ b/controls-serial/README.md @@ -6,7 +6,7 @@ ## Artifact: -The Maven coordinates of this project are `space.kscience:controls-serial:0.1.1-SNAPSHOT`. +The Maven coordinates of this project are `space.kscience:controls-serial:0.2.0-dev-2`. **Gradle Groovy:** ```groovy @@ -16,7 +16,7 @@ repositories { } dependencies { - implementation 'space.kscience:controls-serial:0.1.1-SNAPSHOT' + implementation 'space.kscience:controls-serial:0.2.0-dev-2' } ``` **Gradle Kotlin DSL:** @@ -27,6 +27,6 @@ repositories { } dependencies { - implementation("space.kscience:controls-serial:0.1.1-SNAPSHOT") + implementation("space.kscience:controls-serial:0.2.0-dev-2") } ``` diff --git a/controls-server/README.md b/controls-server/README.md index 561a815..e2218a0 100644 --- a/controls-server/README.md +++ b/controls-server/README.md @@ -6,7 +6,7 @@ A magix event loop server with web server for visualization. ## Artifact: -The Maven coordinates of this project are `space.kscience:controls-server:0.1.1-SNAPSHOT`. +The Maven coordinates of this project are `space.kscience:controls-server:0.2.0-dev-2`. **Gradle Groovy:** ```groovy @@ -16,7 +16,7 @@ repositories { } dependencies { - implementation 'space.kscience:controls-server:0.1.1-SNAPSHOT' + implementation 'space.kscience:controls-server:0.2.0-dev-2' } ``` **Gradle Kotlin DSL:** @@ -27,6 +27,6 @@ repositories { } dependencies { - implementation("space.kscience:controls-server:0.1.1-SNAPSHOT") + implementation("space.kscience:controls-server:0.2.0-dev-2") } ``` diff --git a/controls-storage/README.md b/controls-storage/README.md index 650dd53..a70b2e2 100644 --- a/controls-storage/README.md +++ b/controls-storage/README.md @@ -6,7 +6,7 @@ ## Artifact: -The Maven coordinates of this project are `space.kscience:controls-storage:0.1.1-SNAPSHOT`. +The Maven coordinates of this project are `space.kscience:controls-storage:0.2.0-dev-2`. **Gradle Groovy:** ```groovy @@ -16,7 +16,7 @@ repositories { } dependencies { - implementation 'space.kscience:controls-storage:0.1.1-SNAPSHOT' + implementation 'space.kscience:controls-storage:0.2.0-dev-2' } ``` **Gradle Kotlin DSL:** @@ -27,6 +27,6 @@ repositories { } dependencies { - implementation("space.kscience:controls-storage:0.1.1-SNAPSHOT") + implementation("space.kscience:controls-storage:0.2.0-dev-2") } ``` diff --git a/controls-storage/controls-xodus/README.md b/controls-storage/controls-xodus/README.md index a25650e..cb7b761 100644 --- a/controls-storage/controls-xodus/README.md +++ b/controls-storage/controls-xodus/README.md @@ -6,7 +6,7 @@ ## Artifact: -The Maven coordinates of this project are `space.kscience:controls-xodus:0.1.1-SNAPSHOT`. +The Maven coordinates of this project are `space.kscience:controls-xodus:0.2.0-dev-2`. **Gradle Groovy:** ```groovy @@ -16,7 +16,7 @@ repositories { } dependencies { - implementation 'space.kscience:controls-xodus:0.1.1-SNAPSHOT' + implementation 'space.kscience:controls-xodus:0.2.0-dev-2' } ``` **Gradle Kotlin DSL:** @@ -27,6 +27,6 @@ repositories { } dependencies { - implementation("space.kscience:controls-xodus:0.1.1-SNAPSHOT") + implementation("space.kscience:controls-xodus:0.2.0-dev-2") } ``` diff --git a/magix/magix-api/README.md b/magix/magix-api/README.md index 0226fc6..e1207ab 100644 --- a/magix/magix-api/README.md +++ b/magix/magix-api/README.md @@ -6,7 +6,7 @@ ## Artifact: -The Maven coordinates of this project are `space.kscience:magix-api:0.1.1-SNAPSHOT`. +The Maven coordinates of this project are `space.kscience:magix-api:0.2.0-dev-2`. **Gradle Groovy:** ```groovy @@ -16,7 +16,7 @@ repositories { } dependencies { - implementation 'space.kscience:magix-api:0.1.1-SNAPSHOT' + implementation 'space.kscience:magix-api:0.2.0-dev-2' } ``` **Gradle Kotlin DSL:** @@ -27,6 +27,6 @@ repositories { } dependencies { - implementation("space.kscience:magix-api:0.1.1-SNAPSHOT") + implementation("space.kscience:magix-api:0.2.0-dev-2") } ``` diff --git a/magix/magix-api/src/commonMain/kotlin/space/kscience/magix/api/MagixEndpoint.kt b/magix/magix-api/src/commonMain/kotlin/space/kscience/magix/api/MagixEndpoint.kt index 35cb8e5..e1ccc23 100644 --- a/magix/magix-api/src/commonMain/kotlin/space/kscience/magix/api/MagixEndpoint.kt +++ b/magix/magix-api/src/commonMain/kotlin/space/kscience/magix/api/MagixEndpoint.kt @@ -53,4 +53,9 @@ public interface MagixEndpoint { encodeDefaults = false } } -} \ No newline at end of file +} + +/** + * An alias for [MagixEndpoint.broadcast] + */ +public suspend fun MagixEndpoint.send(message: MagixMessage): Unit = broadcast(message) \ No newline at end of file diff --git a/magix/magix-api/src/commonMain/kotlin/space/kscience/magix/api/MagixRegistry.kt b/magix/magix-api/src/commonMain/kotlin/space/kscience/magix/api/MagixRegistry.kt deleted file mode 100644 index 7b3b111..0000000 --- a/magix/magix-api/src/commonMain/kotlin/space/kscience/magix/api/MagixRegistry.kt +++ /dev/null @@ -1,17 +0,0 @@ -package space.kscience.magix.api - -import kotlinx.serialization.json.JsonElement - -/** - * An interface to access distributed Magix property registry - */ -public interface MagixRegistry { - /** - * Request a property with name [propertyName] and user authentication data [user]. - * - * Return a property value in its generic form or null if it is not present. - * - * Throw an exception if property is present but access is denied. - */ - public suspend fun request(propertyName: String, user: JsonElement? = null): JsonElement? -} diff --git a/magix/magix-api/src/commonMain/kotlin/space/kscience/magix/api/converters.kt b/magix/magix-api/src/commonMain/kotlin/space/kscience/magix/api/converters.kt deleted file mode 100644 index beed930..0000000 --- a/magix/magix-api/src/commonMain/kotlin/space/kscience/magix/api/converters.kt +++ /dev/null @@ -1,30 +0,0 @@ -package space.kscience.magix.api - -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Job -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach -import kotlinx.serialization.json.JsonElement - -/** - * Launch magix message converter service - */ -public fun CoroutineScope.launchMagixConverter( - endpoint: MagixEndpoint, - filter: MagixMessageFilter, - outputFormat: String, - newOrigin: String? = null, - transformer: suspend (JsonElement) -> JsonElement, -): Job = endpoint.subscribe(filter).onEach { message-> - val newPayload = transformer(message.payload) - val transformed: MagixMessage = MagixMessage( - outputFormat, - newPayload, - newOrigin ?: message.sourceEndpoint, - message.targetEndpoint, - message.id, - message.parentId, - message.user - ) - endpoint.broadcast(transformed) -}.launchIn(this) diff --git a/magix/magix-api/src/commonMain/kotlin/space/kscience/magix/services/MagixRegistry.kt b/magix/magix-api/src/commonMain/kotlin/space/kscience/magix/services/MagixRegistry.kt new file mode 100644 index 0000000..993d246 --- /dev/null +++ b/magix/magix-api/src/commonMain/kotlin/space/kscience/magix/services/MagixRegistry.kt @@ -0,0 +1,81 @@ +package space.kscience.magix.services + +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Job +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.JsonNull +import space.kscience.magix.api.MagixEndpoint +import space.kscience.magix.api.MagixFormat +import space.kscience.magix.api.broadcast +import space.kscience.magix.api.subscribe + +/** + * An interface to access distributed Magix property registry + */ +public interface MagixRegistry { + /** + * Request a property with name [propertyName] and user authentication data [user]. + * + * Return a property value in its generic form or null if it is not present. + * + * Throw exception access is denied, or request failed. + */ + public suspend fun request(propertyName: String, user: JsonElement? = null): JsonElement? +} + +@Serializable +public sealed class MagixRegistryMessage { + public abstract val propertyName: String + + public companion object { + public val format: MagixFormat = MagixFormat(serializer(), setOf("magix.registry")) + } +} + +@Serializable +@SerialName("registry.request") +public class MagixRegistryRequestMessage( + override val propertyName: String, +) : MagixRegistryMessage() + +@Serializable +@SerialName("registry.value") +public class MagixRegistryValueMessage( + override val propertyName: String, + public val value: JsonElement, +) : MagixRegistryMessage() + +@Serializable +@SerialName("registry.error") +public class MagixRegistryErrorMessage( + override val propertyName: String, + public val errorType: String?, + public val errorMessage: String? = null, +) : MagixRegistryMessage() + +public fun CoroutineScope.launchMagixRegistry( + endpoint: MagixEndpoint, + registry: MagixRegistry, + originFilter: Collection? = null, + targetFilter: Collection? = null, +): Job = endpoint.subscribe(MagixRegistryMessage.format, originFilter, targetFilter) + .onEach { (magixMessage, payload) -> + if (payload is MagixRegistryRequestMessage) { + try { + val value = registry.request(payload.propertyName, magixMessage.user) + endpoint.broadcast( + MagixRegistryMessage.format, + MagixRegistryValueMessage(payload.propertyName, value ?: JsonNull) + ) + } catch (ex: Exception){ + endpoint.broadcast( + MagixRegistryMessage.format, + MagixRegistryErrorMessage(payload.propertyName, ex::class.simpleName, ex.message) + ) + } + } + }.launchIn(this) \ No newline at end of file diff --git a/magix/magix-api/src/commonMain/kotlin/space/kscience/magix/services/converters.kt b/magix/magix-api/src/commonMain/kotlin/space/kscience/magix/services/converters.kt new file mode 100644 index 0000000..ac6e6e2 --- /dev/null +++ b/magix/magix-api/src/commonMain/kotlin/space/kscience/magix/services/converters.kt @@ -0,0 +1,41 @@ +package space.kscience.magix.services + +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Job +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import kotlinx.serialization.json.JsonElement +import space.kscience.magix.api.MagixEndpoint +import space.kscience.magix.api.MagixMessage +import space.kscience.magix.api.MagixMessageFilter + +/** + * Launch magix message converter service. + * + * The service converts a payload from one format into another. + * + * @param endpoint The endpoint this converter is attached to + * @param filter a filter for messages to be converted. + * @param outputFormat a new value for [MagixMessage.format] field + * @param newSource a new value of [MagixMessage.sourceEndpoint]. By default uses the original message value + * @param transformer a function to transform the payload. + */ +public fun CoroutineScope.launchMagixConverter( + endpoint: MagixEndpoint, + filter: MagixMessageFilter, + outputFormat: String, + newSource: String? = null, + transformer: suspend (JsonElement) -> JsonElement, +): Job = endpoint.subscribe(filter).onEach { message-> + val newPayload = transformer(message.payload) + val transformed: MagixMessage = MagixMessage( + outputFormat, + newPayload, + newSource ?: message.sourceEndpoint, + message.targetEndpoint, + message.id, + message.parentId, + message.user + ) + endpoint.broadcast(transformed) +}.launchIn(this) diff --git a/magix/magix-java-client/README.md b/magix/magix-java-client/README.md index 375d6df..a81787e 100644 --- a/magix/magix-java-client/README.md +++ b/magix/magix-java-client/README.md @@ -6,7 +6,7 @@ ## Artifact: -The Maven coordinates of this project are `space.kscience:magix-java-client:0.1.1-SNAPSHOT`. +The Maven coordinates of this project are `space.kscience:magix-java-client:0.2.0-dev-2`. **Gradle Groovy:** ```groovy @@ -16,7 +16,7 @@ repositories { } dependencies { - implementation 'space.kscience:magix-java-client:0.1.1-SNAPSHOT' + implementation 'space.kscience:magix-java-client:0.2.0-dev-2' } ``` **Gradle Kotlin DSL:** @@ -27,6 +27,6 @@ repositories { } dependencies { - implementation("space.kscience:magix-java-client:0.1.1-SNAPSHOT") + implementation("space.kscience:magix-java-client:0.2.0-dev-2") } ``` diff --git a/magix/magix-mqtt/README.md b/magix/magix-mqtt/README.md index d8b9da6..061803e 100644 --- a/magix/magix-mqtt/README.md +++ b/magix/magix-mqtt/README.md @@ -6,7 +6,7 @@ MQTT client magix endpoint ## Artifact: -The Maven coordinates of this project are `space.kscience:magix-mqtt:0.1.1-SNAPSHOT`. +The Maven coordinates of this project are `space.kscience:magix-mqtt:0.2.0-dev-2`. **Gradle Groovy:** ```groovy @@ -16,7 +16,7 @@ repositories { } dependencies { - implementation 'space.kscience:magix-mqtt:0.1.1-SNAPSHOT' + implementation 'space.kscience:magix-mqtt:0.2.0-dev-2' } ``` **Gradle Kotlin DSL:** @@ -27,6 +27,6 @@ repositories { } dependencies { - implementation("space.kscience:magix-mqtt:0.1.1-SNAPSHOT") + implementation("space.kscience:magix-mqtt:0.2.0-dev-2") } ``` diff --git a/magix/magix-rabbit/README.md b/magix/magix-rabbit/README.md index 7c60864..79b0af1 100644 --- a/magix/magix-rabbit/README.md +++ b/magix/magix-rabbit/README.md @@ -6,7 +6,7 @@ RabbitMQ client magix endpoint ## Artifact: -The Maven coordinates of this project are `space.kscience:magix-rabbit:0.1.1-SNAPSHOT`. +The Maven coordinates of this project are `space.kscience:magix-rabbit:0.2.0-dev-2`. **Gradle Groovy:** ```groovy @@ -16,7 +16,7 @@ repositories { } dependencies { - implementation 'space.kscience:magix-rabbit:0.1.1-SNAPSHOT' + implementation 'space.kscience:magix-rabbit:0.2.0-dev-2' } ``` **Gradle Kotlin DSL:** @@ -27,6 +27,6 @@ repositories { } dependencies { - implementation("space.kscience:magix-rabbit:0.1.1-SNAPSHOT") + implementation("space.kscience:magix-rabbit:0.2.0-dev-2") } ``` diff --git a/magix/magix-rsocket/README.md b/magix/magix-rsocket/README.md index 0d5c9e6..1307fbe 100644 --- a/magix/magix-rsocket/README.md +++ b/magix/magix-rsocket/README.md @@ -6,7 +6,7 @@ Magix endpoint (client) based on RSocket ## Artifact: -The Maven coordinates of this project are `space.kscience:magix-rsocket:0.1.1-SNAPSHOT`. +The Maven coordinates of this project are `space.kscience:magix-rsocket:0.2.0-dev-2`. **Gradle Groovy:** ```groovy @@ -16,7 +16,7 @@ repositories { } dependencies { - implementation 'space.kscience:magix-rsocket:0.1.1-SNAPSHOT' + implementation 'space.kscience:magix-rsocket:0.2.0-dev-2' } ``` **Gradle Kotlin DSL:** @@ -27,6 +27,6 @@ repositories { } dependencies { - implementation("space.kscience:magix-rsocket:0.1.1-SNAPSHOT") + implementation("space.kscience:magix-rsocket:0.2.0-dev-2") } ``` diff --git a/magix/magix-server/README.md b/magix/magix-server/README.md index f5a83e3..0ce680b 100644 --- a/magix/magix-server/README.md +++ b/magix/magix-server/README.md @@ -6,7 +6,7 @@ A magix event loop implementation in Kotlin. Includes HTTP/SSE and RSocket route ## Artifact: -The Maven coordinates of this project are `space.kscience:magix-server:0.1.1-SNAPSHOT`. +The Maven coordinates of this project are `space.kscience:magix-server:0.2.0-dev-2`. **Gradle Groovy:** ```groovy @@ -16,7 +16,7 @@ repositories { } dependencies { - implementation 'space.kscience:magix-server:0.1.1-SNAPSHOT' + implementation 'space.kscience:magix-server:0.2.0-dev-2' } ``` **Gradle Kotlin DSL:** @@ -27,6 +27,6 @@ repositories { } dependencies { - implementation("space.kscience:magix-server:0.1.1-SNAPSHOT") + implementation("space.kscience:magix-server:0.2.0-dev-2") } ``` diff --git a/magix/magix-storage/README.md b/magix/magix-storage/README.md index 7ebafae..fd9822f 100644 --- a/magix/magix-storage/README.md +++ b/magix/magix-storage/README.md @@ -1,4 +1,32 @@ # Module magix-storage +Magix history database API +## Usage +## Artifact: + +The Maven coordinates of this project are `space.kscience:magix-storage:0.2.0-dev-2`. + +**Gradle Groovy:** +```groovy +repositories { + maven { url 'https://repo.kotlin.link' } + mavenCentral() +} + +dependencies { + implementation 'space.kscience:magix-storage:0.2.0-dev-2' +} +``` +**Gradle Kotlin DSL:** +```kotlin +repositories { + maven("https://repo.kotlin.link") + mavenCentral() +} + +dependencies { + implementation("space.kscience:magix-storage:0.2.0-dev-2") +} +``` diff --git a/magix/magix-storage/magix-storage-xodus/README.md b/magix/magix-storage/magix-storage-xodus/README.md index 57107c5..bcc8a6e 100644 --- a/magix/magix-storage/magix-storage-xodus/README.md +++ b/magix/magix-storage/magix-storage-xodus/README.md @@ -6,7 +6,7 @@ ## Artifact: -The Maven coordinates of this project are `space.kscience:magix-storage-xodus:0.1.1-SNAPSHOT`. +The Maven coordinates of this project are `space.kscience:magix-storage-xodus:0.2.0-dev-2`. **Gradle Groovy:** ```groovy @@ -16,7 +16,7 @@ repositories { } dependencies { - implementation 'space.kscience:magix-storage-xodus:0.1.1-SNAPSHOT' + implementation 'space.kscience:magix-storage-xodus:0.2.0-dev-2' } ``` **Gradle Kotlin DSL:** @@ -27,6 +27,6 @@ repositories { } dependencies { - implementation("space.kscience:magix-storage-xodus:0.1.1-SNAPSHOT") + implementation("space.kscience:magix-storage-xodus:0.2.0-dev-2") } ``` diff --git a/magix/magix-zmq/README.md b/magix/magix-zmq/README.md index cf150fe..65c4892 100644 --- a/magix/magix-zmq/README.md +++ b/magix/magix-zmq/README.md @@ -6,7 +6,7 @@ ZMQ client endpoint for Magix ## Artifact: -The Maven coordinates of this project are `space.kscience:magix-zmq:0.1.1-SNAPSHOT`. +The Maven coordinates of this project are `space.kscience:magix-zmq:0.2.0-dev-2`. **Gradle Groovy:** ```groovy @@ -16,7 +16,7 @@ repositories { } dependencies { - implementation 'space.kscience:magix-zmq:0.1.1-SNAPSHOT' + implementation 'space.kscience:magix-zmq:0.2.0-dev-2' } ``` **Gradle Kotlin DSL:** @@ -27,6 +27,6 @@ repositories { } dependencies { - implementation("space.kscience:magix-zmq:0.1.1-SNAPSHOT") + implementation("space.kscience:magix-zmq:0.2.0-dev-2") } ```