From f0c0be0dd26d61958629742fd1413578268b623c Mon Sep 17 00:00:00 2001 From: Cilly Leang Date: Tue, 27 Jan 2026 16:35:50 +1100 Subject: [PATCH] refactor(gateway): extract serialisation utils into one spot --- .../core/api/gateway/EventPolySerializer.kt | 27 ------------ .../moe/lava/neon/core/api/gateway/Gateway.kt | 12 +++--- .../lava/neon/core/api/gateway/Payloads.kt | 10 ----- .../core/api/gateway/SerializingExtensions.kt | 41 +++++++++++++++++++ 4 files changed, 47 insertions(+), 43 deletions(-) delete mode 100644 core/src/commonMain/kotlin/moe/lava/neon/core/api/gateway/EventPolySerializer.kt create mode 100644 core/src/commonMain/kotlin/moe/lava/neon/core/api/gateway/SerializingExtensions.kt diff --git a/core/src/commonMain/kotlin/moe/lava/neon/core/api/gateway/EventPolySerializer.kt b/core/src/commonMain/kotlin/moe/lava/neon/core/api/gateway/EventPolySerializer.kt deleted file mode 100644 index f2dac8d..0000000 --- a/core/src/commonMain/kotlin/moe/lava/neon/core/api/gateway/EventPolySerializer.kt +++ /dev/null @@ -1,27 +0,0 @@ -package moe.lava.neon.core.api.gateway - -import kotlinx.serialization.DeserializationStrategy -import kotlinx.serialization.json.JsonContentPolymorphicSerializer -import kotlinx.serialization.json.JsonElement -import kotlinx.serialization.json.int -import kotlinx.serialization.json.jsonObject -import kotlinx.serialization.json.jsonPrimitive - -object EventPolySerializer : JsonContentPolymorphicSerializer(Event.WithSequence::class) { - override fun selectDeserializer(element: JsonElement): DeserializationStrategy { - val op = element.jsonObject["op"]!!.jsonPrimitive.int - if (op == 0) { - val name = element.jsonObject["t"]?.jsonPrimitive?.content - return when (name) { - "READY" -> Event.Incoming.serializer(Payload.Ready.serializer()) - else -> Event.Unknown.serializer() - } - } - return when (op) { - 1 -> Event.Incoming.serializer(Payload.Heartbeat.serializer()) - 10 -> Event.Incoming.serializer(Payload.Hello.serializer()) - 11 -> Event.Incoming.serializer(Payload.HeartbeatAck.serializer()) - else -> Event.Unknown.serializer() - } - } -} diff --git a/core/src/commonMain/kotlin/moe/lava/neon/core/api/gateway/Gateway.kt b/core/src/commonMain/kotlin/moe/lava/neon/core/api/gateway/Gateway.kt index c57455f..5d4c8b4 100644 --- a/core/src/commonMain/kotlin/moe/lava/neon/core/api/gateway/Gateway.kt +++ b/core/src/commonMain/kotlin/moe/lava/neon/core/api/gateway/Gateway.kt @@ -73,16 +73,16 @@ class Gateway( logger.d { "Received event ${frame.readText()}" } - val msg = json.decodeFromString(EventPolySerializer, frame.readText()) + val raw = json.decodeFromString(frame.readText()) val seq = this.seq ?: 0 - if (seq + 1 == msg.s) { - this.seq = msg.s - } else if (msg.s != null) { - resume(ResumeReason.SkippedSequence(msg.s!!)) + if (seq + 1 == raw.s) { + this.seq = raw.s + } else if (raw.s != null) { + resume(ResumeReason.SkippedSequence(raw.s)) return@onEach } - when (msg) { + when (val msg = raw.asIncoming()) { is Event.Incoming<*> -> scope.launch { handleEvent(msg) } is Event.Unknown -> scope.launch { handleUnknownEvent(msg) } } diff --git a/core/src/commonMain/kotlin/moe/lava/neon/core/api/gateway/Payloads.kt b/core/src/commonMain/kotlin/moe/lava/neon/core/api/gateway/Payloads.kt index ba0ddf8..c8dbb83 100644 --- a/core/src/commonMain/kotlin/moe/lava/neon/core/api/gateway/Payloads.kt +++ b/core/src/commonMain/kotlin/moe/lava/neon/core/api/gateway/Payloads.kt @@ -99,13 +99,3 @@ sealed interface Payload { // val application: Application, ) : Dispatch() } - -fun T.pack(): Event.Outgoing { - val opcode: Int = when (this) { - is Payload.Heartbeat -> 1 - is Payload.QoSHeartbeat -> 40 - is Payload.HeartbeatAck -> 11 - is Payload.Identify -> 2 - } - return Event.Outgoing(op = opcode, d = this) -} diff --git a/core/src/commonMain/kotlin/moe/lava/neon/core/api/gateway/SerializingExtensions.kt b/core/src/commonMain/kotlin/moe/lava/neon/core/api/gateway/SerializingExtensions.kt new file mode 100644 index 0000000..15dc08d --- /dev/null +++ b/core/src/commonMain/kotlin/moe/lava/neon/core/api/gateway/SerializingExtensions.kt @@ -0,0 +1,41 @@ +package moe.lava.neon.core.api.gateway + +import kotlinx.serialization.KSerializer +import kotlinx.serialization.json.decodeFromJsonElement +import moe.lava.neon.core.api.ApiConstants + +private val json = ApiConstants.json + +fun T.pack(): Event.Outgoing { + val opcode: Int = when (this) { + is Payload.Heartbeat -> 1 + is Payload.Identify -> 2 + is Payload.HeartbeatAck -> 11 + is Payload.QoSHeartbeat -> 40 + } + return Event.Outgoing(op = opcode, d = this) +} + +fun Event.Unknown.asIncoming() : Event.WithSequence { + return when (op) { + 0 -> when (t) { + "READY" -> decode() + else -> this + } + 1 -> decode() + 10 -> decode() + 11 -> decode() + else -> this + } +} + +private inline fun Event.Unknown.decode(): Event.Incoming = + Event.Incoming( + op = op, + d = json.decodeFromJsonElement(d!!), + s = s, + t = t, + ) + +private inline fun KSerializer.wrap(): KSerializer> = + Event.Incoming.serializer(this)