@@ -25,6 +25,8 @@ package org.phoenixframework
25
25
import com.google.gson.FieldNamingPolicy
26
26
import com.google.gson.Gson
27
27
import com.google.gson.GsonBuilder
28
+ import com.google.gson.JsonObject
29
+ import com.google.gson.JsonParser
28
30
import com.google.gson.reflect.TypeToken
29
31
import okhttp3.HttpUrl
30
32
import java.net.URL
@@ -65,18 +67,44 @@ object Defaults {
65
67
*/
66
68
@Suppress(" UNCHECKED_CAST" )
67
69
val decode: DecodeClosure = { rawMessage ->
68
- val anyType = object : TypeToken <List <Any >>() {}.type
69
- val result = gson.fromJson<List <Any >>(rawMessage, anyType)
70
70
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)
71
98
72
99
// vsn=2.0.0 message structure
73
100
// [join_ref, ref, topic, event, payload]
74
101
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
80
108
)
81
109
}
82
110
0 commit comments