From b1121d61cb9e8832ed3e2cb25a23424182c620ee Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Mon, 5 Feb 2024 14:08:15 +0300 Subject: [PATCH] Allow controls magix endpoint to receive broadcast. --- .../kscience/controls/client/controlsMagix.kt | 4 ++- .../space/kscience/magix/api/MagixFormat.kt | 2 +- .../kscience/magix/api/MagixMessageFilter.kt | 2 +- .../magix/storage/xodus/XodusMagixStorage.kt | 28 ++++++++++--------- 4 files changed, 20 insertions(+), 16 deletions(-) diff --git a/controls-magix/src/commonMain/kotlin/space/kscience/controls/client/controlsMagix.kt b/controls-magix/src/commonMain/kotlin/space/kscience/controls/client/controlsMagix.kt index 5e7f4fb..2257c74 100644 --- a/controls-magix/src/commonMain/kotlin/space/kscience/controls/client/controlsMagix.kt +++ b/controls-magix/src/commonMain/kotlin/space/kscience/controls/client/controlsMagix.kt @@ -32,12 +32,14 @@ internal fun generateId(request: MagixMessage): String = if (request.id != null) /** * Communicate with server in [Magix format](https://github.com/waltz-controls/rfc/tree/master/1) + * + * Accepts messages with target that equals [endpointID] or null (broadcast messages) */ public fun DeviceManager.launchMagixService( endpoint: MagixEndpoint, endpointID: String = controlsMagixFormat.defaultFormat, ): Job = context.launch { - endpoint.subscribe(controlsMagixFormat, targetFilter = listOf(endpointID)).onEach { (request, payload) -> + endpoint.subscribe(controlsMagixFormat, targetFilter = listOf(endpointID, null)).onEach { (request, payload) -> val responsePayload = respondHubMessage(payload) responsePayload.forEach { endpoint.send( diff --git a/magix/magix-api/src/commonMain/kotlin/space/kscience/magix/api/MagixFormat.kt b/magix/magix-api/src/commonMain/kotlin/space/kscience/magix/api/MagixFormat.kt index 115fcff..42d55b7 100644 --- a/magix/magix-api/src/commonMain/kotlin/space/kscience/magix/api/MagixFormat.kt +++ b/magix/magix-api/src/commonMain/kotlin/space/kscience/magix/api/MagixFormat.kt @@ -26,7 +26,7 @@ public data class MagixFormat( public fun MagixEndpoint.subscribe( format: MagixFormat, originFilter: Collection? = null, - targetFilter: Collection? = null, + targetFilter: Collection? = null, ): Flow> = subscribe( MagixMessageFilter(format = format.formats, source = originFilter, target = targetFilter) ).map { diff --git a/magix/magix-api/src/commonMain/kotlin/space/kscience/magix/api/MagixMessageFilter.kt b/magix/magix-api/src/commonMain/kotlin/space/kscience/magix/api/MagixMessageFilter.kt index 4bd4746..72c7f7f 100644 --- a/magix/magix-api/src/commonMain/kotlin/space/kscience/magix/api/MagixMessageFilter.kt +++ b/magix/magix-api/src/commonMain/kotlin/space/kscience/magix/api/MagixMessageFilter.kt @@ -11,7 +11,7 @@ import kotlinx.serialization.Serializable public data class MagixMessageFilter( val format: Collection? = null, val source: Collection? = null, - val target: Collection? = null, + val target: Collection? = null, ) { public fun accepts(message: MagixMessage): Boolean = diff --git a/magix/magix-storage/magix-storage-xodus/src/main/kotlin/space/kscience/magix/storage/xodus/XodusMagixStorage.kt b/magix/magix-storage/magix-storage-xodus/src/main/kotlin/space/kscience/magix/storage/xodus/XodusMagixStorage.kt index 4a3efa3..8d0d852 100644 --- a/magix/magix-storage/magix-storage-xodus/src/main/kotlin/space/kscience/magix/storage/xodus/XodusMagixStorage.kt +++ b/magix/magix-storage/magix-storage-xodus/src/main/kotlin/space/kscience/magix/storage/xodus/XodusMagixStorage.kt @@ -39,9 +39,8 @@ public class XodusMagixHistory(private val store: PersistentEntityStore) : Write setBlobString(MagixMessage::payload.name, magixJson.encodeToString(message.payload)) - message.targetEndpoint?.let { - setProperty(MagixMessage::targetEndpoint.name, it) - } + setProperty(MagixMessage::targetEndpoint.name, (message.targetEndpoint ?: "")) + message.id?.let { setProperty(MagixMessage::id.name, it) } @@ -68,14 +67,14 @@ public class XodusMagixHistory(private val store: PersistentEntityStore) : Write ): Unit = store.executeInReadonlyTransaction { transaction -> val all = transaction.getAll(XodusMagixStorage.MAGIC_MESSAGE_ENTITY_TYPE) - fun StoreTransaction.findAllIn( + fun findAllIn( entityType: String, field: String, - values: Collection?, + values: Collection?, ): EntityIterable? { var union: EntityIterable? = null values?.forEach { - val filter = transaction.find(entityType, field, it) + val filter = transaction.find(entityType, field, it ?: "") union = union?.union(filter) ?: filter } return union @@ -84,21 +83,24 @@ public class XodusMagixHistory(private val store: PersistentEntityStore) : Write // filter by magix filter val filteredByMagix: EntityIterable = magixFilter?.let { mf -> var res = all - transaction.findAllIn(XodusMagixStorage.MAGIC_MESSAGE_ENTITY_TYPE, MagixMessage::format.name, mf.format) - ?.let { - res = res.intersect(it) - } - transaction.findAllIn( + findAllIn( + XodusMagixStorage.MAGIC_MESSAGE_ENTITY_TYPE, + MagixMessage::format.name, + mf.format + )?.let { + res = res.intersect(it) + } + findAllIn( XodusMagixStorage.MAGIC_MESSAGE_ENTITY_TYPE, MagixMessage::sourceEndpoint.name, mf.source )?.let { res = res.intersect(it) } - transaction.findAllIn( + findAllIn( XodusMagixStorage.MAGIC_MESSAGE_ENTITY_TYPE, MagixMessage::targetEndpoint.name, - mf.target + mf.target?.filterNotNull() )?.let { res = res.intersect(it) }