Skip to content

Commit cd9ae55

Browse files
committed
Fixed issue with new message parser
1 parent dbf5a6a commit cd9ae55

File tree

2 files changed

+26
-15
lines changed

2 files changed

+26
-15
lines changed

src/main/kotlin/org/phoenixframework/Defaults.kt

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@ import com.google.gson.JsonObject
2929
import com.google.gson.JsonParser
3030
import com.google.gson.reflect.TypeToken
3131
import okhttp3.HttpUrl
32+
import org.phoenixframework.Defaults.gson
3233
import java.net.URL
34+
import javax.swing.text.html.HTML.Tag.P
3335

3436
object Defaults {
3537

@@ -68,41 +70,50 @@ object Defaults {
6870
@Suppress("UNCHECKED_CAST")
6971
val decode: DecodeClosure = { rawMessage ->
7072

73+
val parseValue: (String) -> String? = { value ->
74+
when(value) {
75+
"null" -> null
76+
else -> value.replace("\"", "")
77+
}
78+
}
79+
7180
var message = rawMessage
7281
message = message.removeRange(0, 1) // remove '['
7382

74-
val joinRef = message.takeWhile { it != ',' } // take join ref, 'null' or '5'
83+
val joinRef = message.takeWhile { it != ',' } // take "join ref", "null" or "\"5\""
7584
message = message.removeRange(0, joinRef.length) // remove join ref
7685
message = message.removeRange(0, 1) // remove ','
7786

78-
val ref = message.takeWhile { it != ',' } // take ref, 'null' or '5'
87+
val ref = message.takeWhile { it != ',' } // take ref, "null" or "\"5\""
7988
message = message.removeRange(0, ref.length) // remove ref
80-
message = message.removeRange(0, 2) // remove ',"'
89+
message = message.removeRange(0, 1) // remove ','
8190

82-
val topic = message.takeWhile { it != '"' }
91+
val topic = message.takeWhile { it != ',' } // take topic, "\"topic\""
8392
message = message.removeRange(0, topic.length)
84-
message = message.removeRange(0, 3) // remove '","'
93+
message = message.removeRange(0, 1) // remove ','
8594

86-
val event = message.takeWhile { it != '"' }
95+
val event = message.takeWhile { it != ',' } // take event, "\"phx_reply\""
8796
message = message.removeRange(0, event.length)
88-
message = message.removeRange(0, 2) // remove '",'
97+
message = message.removeRange(0, 1) // remove ','
8998

90-
val remaining = message.removeRange(message.length - 1, message.length)
99+
var remaining = message.removeRange(message.length - 1, message.length) // remove ']'
91100

101+
// Payload should now just be "{"message":"hello","from":"user_1"}" or
102+
// "{"response": {"message":"hello","from":"user_1"}},"status":"ok"}", flatten.
92103
val jsonObj = gson.fromJson(remaining, JsonObject::class.java)
93104
val response = jsonObj.get("response")
94-
val payload = response?.let { gson.toJson(response) } ?: remaining
105+
val payload = response?.let { gson.toJson(response) } ?: remaining
95106

96107
val anyType = object : TypeToken<Map<String, Any>>() {}.type
97108
val result = gson.fromJson<Map<String, Any>>(remaining, anyType)
98109

99110
// vsn=2.0.0 message structure
100111
// [join_ref, ref, topic, event, payload]
101112
Message(
102-
joinRef = joinRef.toIntOrNull()?.toString(),
103-
ref = ref.toIntOrNull()?.toString() ?: "",
104-
topic = topic,
105-
event = event,
113+
joinRef = parseValue(joinRef),
114+
ref = parseValue(ref) ?: "",
115+
topic = parseValue(topic) ?: "",
116+
event = parseValue(event) ?: "",
106117
rawPayload = result,
107118
payloadJson = payload
108119
)

src/test/kotlin/org/phoenixframework/DefaultsTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ internal class DefaultsTest {
6060
@Test
6161
internal fun `decoder provides raw json payload`() {
6262
val v2Json = """
63-
[1,2,"room:lobby","shout",{"message":"Hi","name":"Tester","count":15,"ratio":0.2}]
63+
["1","2","room:lobby","shout",{"message":"Hi","name":"Tester","count":15,"ratio":0.2}]
6464
""".trimIndent()
6565

6666
val message = Defaults.decode(v2Json)
@@ -80,7 +80,7 @@ internal class DefaultsTest {
8080
@Test
8181
internal fun `decoder decodes a status`() {
8282
val v2Json = """
83-
[1,2,"room:lobby","phx_reply",{"response":{"message":"Hi","name":"Tester","count":15,"ratio":0.2},"status":"ok"}]
83+
["1","2","room:lobby","phx_reply",{"response":{"message":"Hi","name":"Tester","count":15,"ratio":0.2},"status":"ok"}]
8484
""".trimIndent()
8585

8686
val message = Defaults.decode(v2Json)

0 commit comments

Comments
 (0)