
commonMain.com.apollographql.apollo.network.ws.ApolloGraphQLServerMessage.kt Maven / Gradle / Ivy
package com.apollographql.apollo.network.ws
import com.apollographql.apollo.ApolloWebSocketException
import com.apollographql.apollo.api.internal.json.BufferedSourceJsonReader
import com.apollographql.apollo.api.internal.json.ResponseJsonStreamReader
import okio.Buffer
import okio.ByteString
sealed class ApolloGraphQLServerMessage {
class ConnectionError(val rawMessage: String?) : ApolloGraphQLServerMessage() {
companion object {
const val TYPE = "connection_error"
}
}
object ConnectionAcknowledge : ApolloGraphQLServerMessage() {
const val TYPE = "connection_ack"
}
class Data(val id: String, val payload: Map) : ApolloGraphQLServerMessage() {
companion object {
const val TYPE = "data"
}
}
class Error(val id: String, val payload: Map) : ApolloGraphQLServerMessage() {
companion object {
const val TYPE = "error"
}
}
class Complete(val id: String) : ApolloGraphQLServerMessage() {
companion object {
const val TYPE = "complete"
}
}
object ConnectionKeepAlive : ApolloGraphQLServerMessage() {
const val TYPE = "ka"
}
class Unsupported(val rawMessage: String) : ApolloGraphQLServerMessage()
companion object {
fun ByteString.parse(): ApolloGraphQLServerMessage {
val message = try {
val jsonReader = BufferedSourceJsonReader(Buffer().write(this))
val responseJsonReader = ResponseJsonStreamReader(jsonReader)
val messageData = responseJsonReader.toMap() ?: emptyMap()
object {
val id = messageData["id"] as String?
val type = messageData["type"] as String?
val payload = messageData["payload"]
}
} catch (e: Exception) {
throw ApolloWebSocketException(
message = "Failed to parse server message",
cause = e
)
}
return try {
when (message.type) {
ConnectionError.TYPE -> ConnectionError(message.payload?.toString())
ConnectionAcknowledge.TYPE -> ConnectionAcknowledge
Data.TYPE -> Data(message.id!!, message.payload as Map?
?: emptyMap())
Error.TYPE -> Error(message.id!!, message.payload as Map?
?: emptyMap())
Complete.TYPE -> Complete(message.id!!)
ConnectionKeepAlive.TYPE -> ConnectionKeepAlive
else -> Unsupported(utf8())
}
} catch (e: Exception) {
throw ApolloWebSocketException(
message = "Failed to parse server message",
cause = e
)
}
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy