All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonMain.io.github.tim06.xrayConfiguration.serializer.InboundsSerializer.kt Maven / Gradle / Ivy

package io.github.tim06.xrayConfiguration.serializer

import io.github.tim06.xrayConfiguration.Protocol
import io.github.tim06.xrayConfiguration.inbounds.Inbound
import io.github.tim06.xrayConfiguration.inbounds.Sniffing
import io.github.tim06.xrayConfiguration.inbounds.settings.DokoDemoInboundConfigurationObject
import io.github.tim06.xrayConfiguration.inbounds.settings.HttpInboundConfigurationObject
import io.github.tim06.xrayConfiguration.inbounds.settings.ShadowsocksInboundConfigurationObject
import io.github.tim06.xrayConfiguration.inbounds.settings.SocksInboundConfigurationObject
import io.github.tim06.xrayConfiguration.inbounds.settings.TrojanInboundConfigurationObject
import kotlinx.serialization.KSerializer
import kotlinx.serialization.Serializable
import kotlinx.serialization.SerializationException
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.descriptors.buildClassSerialDescriptor
import kotlinx.serialization.descriptors.element
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.json.JsonDecoder
import kotlinx.serialization.json.JsonEncoder
import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.buildJsonObject
import kotlinx.serialization.json.decodeFromJsonElement
import kotlinx.serialization.json.encodeToJsonElement
import kotlinx.serialization.json.jsonObject
import kotlinx.serialization.json.put

// Кастомный десериализатор для InboundObject
object InboundObjectSerializer : KSerializer {
    override val descriptor: SerialDescriptor = buildClassSerialDescriptor("InboundObject") {
        element("listen")
        element("port")
        element("protocol")
        element("settings")
        element("sniffing")
        element("tag")
    }

    override fun serialize(encoder: Encoder, value: Inbound) {
        val jsonEncoder = encoder as? JsonEncoder ?: throw SerializationException("This class can be saved only by JSON")
        val jsonObject = buildJsonObject {
            put("listen", value.listen)
            put("port", value.port)
            put("protocol", jsonEncoder.json.encodeToJsonElement(value.protocol))
            put("settings", jsonEncoder.json.encodeToJsonElement(value.settings))
            put("sniffing", jsonEncoder.json.encodeToJsonElement(value.sniffing))
            put("tag", value.tag)
        }
        jsonEncoder.encodeJsonElement(jsonObject)
    }

    override fun deserialize(decoder: Decoder): Inbound {
        val jsonDecoder = decoder as? JsonDecoder ?: throw SerializationException("This class can be loaded only by JSON")
        val jsonObject = jsonDecoder.decodeJsonElement().jsonObject
        val intermediate = jsonDecoder.json.decodeFromJsonElement(jsonObject)

        val settings = intermediate.settings?.let { settings ->
            when (intermediate.protocol) {
                Protocol.SOCKS -> jsonDecoder.json.decodeFromJsonElement(settings)
                Protocol.HTTP -> jsonDecoder.json.decodeFromJsonElement(settings)
                Protocol.TROJAN -> jsonDecoder.json.decodeFromJsonElement(settings)
                Protocol.SHADOWSOCKS -> jsonDecoder.json.decodeFromJsonElement(settings)
                Protocol.DOKODEMO -> jsonDecoder.json.decodeFromJsonElement(settings)
                else -> throw SerializationException("Unknown protocol type: ${intermediate.protocol}")
            }
        }

        return Inbound(
            listen = intermediate.listen,
            port = intermediate.port,
            protocol = intermediate.protocol,
            settings = settings,
            sniffing = intermediate.sniffing,
            tag = intermediate.tag
        )
    }
}

@Serializable
private data class InboundObjectIntermediate(
    val listen: String? = null,
    val port: Int? = null,
    val protocol: Protocol? = null,
    val settings: JsonObject? = null,
    val sniffing: Sniffing? = null,
    val tag: String
)




© 2015 - 2025 Weber Informatics LLC | Privacy Policy