Skip to content

Commit

Permalink
[JS] Preserve custom message payload
Browse files Browse the repository at this point in the history
  • Loading branch information
wkal-pubnub committed Jan 30, 2025
1 parent ec6f3b5 commit 2750880
Show file tree
Hide file tree
Showing 9 changed files with 56 additions and 15 deletions.
2 changes: 2 additions & 0 deletions js-chat/tests/message.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1377,6 +1377,7 @@ describe("Send message test", () => {
text: messageParams.message.body.message.content.text,
type: messageParams.message.messageType,
files: messageParams.message.body.files,
customKey: "customValue"
}
},
},
Expand All @@ -1392,6 +1393,7 @@ describe("Send message test", () => {

const historyObject = await someChannel.getHistory({ count: 1 })
expect(historyObject.messages[0].text).toBe("Hello world!")
expect(historyObject.messages[0].content.customKey).toBe("customValue")
})

test("should send a message with custom body and crash if getMessageResponseBody is incorrect", async () => {
Expand Down
3 changes: 2 additions & 1 deletion pubnub-chat-api/api/pubnub-chat-api.api
Original file line number Diff line number Diff line change
Expand Up @@ -551,9 +551,10 @@ public final class com/pubnub/chat/types/EmitEventMethod : java/lang/Enum {

public abstract class com/pubnub/chat/types/EventContent {
public static final field Companion Lcom/pubnub/chat/types/EventContent$Companion;
public fun <init> ()V
public synthetic fun <init> (ILkotlinx/serialization/internal/SerializationConstructorMarker;)V
public fun <init> (Ljava/lang/String;)V
public synthetic fun <init> (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public synthetic fun <init> (Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun getCustomMessageType ()Ljava/lang/String;
public static final synthetic fun write$Self (Lcom/pubnub/chat/types/EventContent;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ class File(
* [com.pubnub.api.PubNub.publish] or [com.pubnub.api.PubNub.signal] when sending this event.
*/
@Serializable
sealed class EventContent(
abstract class EventContent(
@Transient val customMessageType: String? = null
) {
/**
Expand Down
2 changes: 1 addition & 1 deletion pubnub-chat-impl/config/ktlint/baseline.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<baseline version="1.0">
<file name="src/jsMain/kotlin/converters.kt">
<error line="146" column="14" source="standard:function-naming" />
<error line="156" column="14" source="standard:function-naming" />
</file>
</baseline>
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.descriptors.StructureKind
import kotlinx.serialization.encoding.CompositeDecoder
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.modules.EmptySerializersModule
import kotlinx.serialization.modules.SerializersModule

class JsonElementDecoder(
Expand All @@ -30,7 +29,7 @@ class JsonElementDecoder(
// }
private var counter = 0

override val serializersModule: SerializersModule = EmptySerializersModule()
override val serializersModule: SerializersModule = module

override fun decodeBooleanElement(descriptor: SerialDescriptor, index: Int): Boolean {
return (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
package com.pubnub.chat.internal.serialization

import com.pubnub.api.JsonElement
import com.pubnub.chat.types.EventContent
import kotlinx.serialization.DeserializationStrategy
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.SerializationStrategy
Expand All @@ -11,14 +12,27 @@ import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.descriptors.StructureKind
import kotlinx.serialization.encoding.CompositeEncoder
import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.modules.EmptySerializersModule
import kotlinx.serialization.modules.SerializersModule
import kotlinx.serialization.modules.polymorphic
import kotlinx.serialization.modules.subclass
import kotlinx.serialization.serializer

val module = SerializersModule {
polymorphic(EventContent::class) {
subclass(EventContent.Typing::class)
subclass(EventContent.Report::class)
subclass(EventContent.Receipt::class)
subclass(EventContent.Mention::class)
subclass(EventContent.Moderation::class)
subclass(EventContent.TextMessageContent::class)
subclass(EventContent.Invite::class)
}
}

class AnyEncoder : Encoder, CompositeEncoder {
var returnValue: Any? = null
private var nextSerialNameValue: Pair<String, String>? = null
override val serializersModule: SerializersModule = EmptySerializersModule()
override val serializersModule: SerializersModule = module

override fun encodeBooleanElement(descriptor: SerialDescriptor, index: Int, value: Boolean) {
returnValue = value
Expand Down Expand Up @@ -186,7 +200,7 @@ class MapEncoder(polymorphicType: Pair<String, String>? = null) : CompositeEncod
put(polymorphicType.first, polymorphicType.second)
}
}
override val serializersModule: SerializersModule = EmptySerializersModule()
override val serializersModule: SerializersModule = module

override fun encodeBooleanElement(descriptor: SerialDescriptor, index: Int, value: Boolean) {
encodeValue(descriptor, index, value)
Expand Down Expand Up @@ -272,7 +286,7 @@ class MapEncoder(polymorphicType: Pair<String, String>? = null) : CompositeEncod

class ListEncoder : CompositeEncoder {
val list: MutableList<Any?> = mutableListOf()
override val serializersModule: SerializersModule = EmptySerializersModule()
override val serializersModule: SerializersModule = module

override fun encodeBooleanElement(descriptor: SerialDescriptor, index: Int, value: Boolean) {
list.add(value)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.pubnub.internal

import com.pubnub.chat.internal.serialization.PNDataEncoder
import com.pubnub.chat.types.EventContent
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlin.test.Test
Expand Down Expand Up @@ -167,4 +168,10 @@ class AnyEncoderTest {
encodedMap
)
}

@Test
fun testEncodeTextMessageContent() {
val map = PNDataEncoder.encode(EventContent.TextMessageContent("abc", null) as EventContent) as Map<String, Any?>
assertEquals("abc", map["text"])
}
}
6 changes: 4 additions & 2 deletions pubnub-chat-impl/src/jsMain/kotlin/MessageJs.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import com.pubnub.api.adjustCollectionTypes
import com.pubnub.chat.Message
import com.pubnub.chat.internal.MessageDraftImpl
import com.pubnub.chat.internal.message.BaseMessage
import com.pubnub.chat.types.EventContent
import com.pubnub.chat.types.MessageMentionedUser
import com.pubnub.chat.types.MessageReferencedChannel
import com.pubnub.kmp.JsMap
Expand All @@ -22,7 +21,10 @@ import kotlin.js.json
open class MessageJs internal constructor(internal val message: Message, internal val chatJs: ChatJs) {
val hasThread by message::hasThread
val timetoken: String get() = message.timetoken.toString()
val content get() = (message.content as EventContent).toJsObject()
val content: JsMap<Any?>
get() {
return message.content.toJsTextMessage()
}
val channelId by message::channelId
val userId by message::userId
val actions get() = message.actions?.mapValues {
Expand Down
24 changes: 20 additions & 4 deletions pubnub-chat-impl/src/jsMain/kotlin/converters.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import com.pubnub.chat.restrictions.GetRestrictionsResponse
import com.pubnub.chat.restrictions.Restriction
import com.pubnub.chat.types.ChannelType
import com.pubnub.chat.types.EventContent
import com.pubnub.chat.types.File
import com.pubnub.chat.types.QuotedMessage
import com.pubnub.kmp.JsMap
import com.pubnub.kmp.PNFuture
Expand Down Expand Up @@ -81,6 +82,13 @@ internal inline fun Map<String, Any?>.toJsObject(): JsMap<Any?> {
return createJsonElement(this).value.unsafeCast<JsMap<Any?>>()
}

internal class TextMessageContentWithCustom(text: String, files: List<File>?, internal val customData: Any) : EventContent.TextMessageContent(
text,
files
)

internal fun EventContent.TextMessageContent.withJsObject(customData: Any) = TextMessageContentWithCustom(text, files, customData)

internal fun CustomPayloadsJs?.toKmp(): CustomPayloads {
if (this == null) {
return CustomPayloads()
Expand All @@ -92,7 +100,7 @@ internal fun CustomPayloadsJs?.toKmp(): CustomPayloads {
channelId: String,
defaultMessagePublishBody: (m: EventContent.TextMessageContent) -> Map<String, Any?> ->
mpb(
(m as EventContent).toJsObject(),
m.toJsTextMessage(),
channelId
).unsafeCast<JsMap<Any>>().toMap()
}
Expand All @@ -103,11 +111,13 @@ internal fun CustomPayloadsJs?.toKmp(): CustomPayloads {
channelId: String,
defaultMessageResponseBody: (JsonElement) -> EventContent.TextMessageContent?
): EventContent.TextMessageContent? {
val jsM = m.value.unsafeCast<JsMap<Any?>>()
val jsMap = m.value.unsafeCast<JsMap<Any?>>()
val messageDTOparams = Any().asDynamic()
messageDTOparams.channel = channelId
messageDTOparams.message = jsM
return PNDataEncoder.decode(createJsonElement(mrb(messageDTOparams)))
messageDTOparams.message = jsMap
val resultingMessage = mrb(messageDTOparams)
val textMessageContent = PNDataEncoder.decode<EventContent.TextMessageContent?>(createJsonElement(resultingMessage))
return textMessageContent?.withJsObject(resultingMessage)
}
},
editMessageActionName = editMessageActionName,
Expand Down Expand Up @@ -183,3 +193,9 @@ private fun RateLimitPerChannelJs?.toKmp(): Map<ChannelType, Duration> {
}
return resultingMap
}

internal fun EventContent.TextMessageContent.toJsTextMessage(): JsMap<Any?> =
(
(this as? TextMessageContentWithCustom)?.customData?.unsafeCast<JsMap<Any?>>()
?: (this as EventContent).toJsObject()
)

0 comments on commit 2750880

Please sign in to comment.