@@ -25,6 +25,8 @@ package org.phoenixframework
2525import com.google.gson.FieldNamingPolicy
2626import com.google.gson.Gson
2727import com.google.gson.GsonBuilder
28+ import com.google.gson.JsonObject
29+ import com.google.gson.JsonParser
2830import com.google.gson.reflect.TypeToken
2931import okhttp3.HttpUrl
3032import java.net.URL
@@ -65,18 +67,44 @@ object Defaults {
6567 */
6668 @Suppress(" UNCHECKED_CAST" )
6769 val decode: DecodeClosure = { rawMessage ->
68- val anyType = object : TypeToken <List <Any >>() {}.type
69- val result = gson.fromJson<List <Any >>(rawMessage, anyType)
7070
71+ var message = rawMessage
72+ message = message.removeRange(0 , 1 ) // remove '['
73+
74+ val joinRef = message.takeWhile { it != ' ,' } // take join ref, 'null' or '5'
75+ message = message.removeRange(0 , joinRef.length) // remove join ref
76+ message = message.removeRange(0 , 1 ) // remove ','
77+
78+ val ref = message.takeWhile { it != ' ,' } // take ref, 'null' or '5'
79+ message = message.removeRange(0 , ref.length) // remove ref
80+ message = message.removeRange(0 , 2 ) // remove ',"'
81+
82+ val topic = message.takeWhile { it != ' "' }
83+ message = message.removeRange(0 , topic.length)
84+ message = message.removeRange(0 , 3 ) // remove '","'
85+
86+ val event = message.takeWhile { it != ' "' }
87+ message = message.removeRange(0 , event.length)
88+ message = message.removeRange(0 , 2 ) // remove '",'
89+
90+ val remaining = message.removeRange(message.length - 1 , message.length)
91+
92+ val jsonObj = gson.fromJson(remaining, JsonObject ::class .java)
93+ val response = jsonObj.get(" response" )
94+ val payload = response?.let { gson.toJson(response) } ? : remaining
95+
96+ val anyType = object : TypeToken <Map <String , Any >>() {}.type
97+ val result = gson.fromJson<Map <String , Any >>(remaining, anyType)
7198
7299 // vsn=2.0.0 message structure
73100 // [join_ref, ref, topic, event, payload]
74101 Message (
75- joinRef = result[0 ] as ? String? ,
76- ref = result[1 ] as ? String ? : " " ,
77- topic = result[2 ] as ? String ? : " " ,
78- event = result[3 ] as ? String ? : " " ,
79- rawPayload = result[4 ] as ? Payload ? : mapOf ()
102+ joinRef = joinRef.toIntOrNull()?.toString(),
103+ ref = ref.toIntOrNull()?.toString() ? : " " ,
104+ topic = topic,
105+ event = event,
106+ rawPayload = result,
107+ payloadJson = payload
80108 )
81109 }
82110
0 commit comments