package org.mercury_im.messenger.core.connection import org.mercury_im.messenger.entity.message.Message as MercuryMessage; import org.jivesoftware.smack.packet.Message as SmackMessage; import java.util.UUID import io.reactivex.Completable import io.reactivex.Single import org.mercury_im.messenger.core.util.AppendCompletableToSingle import org.mercury_im.messenger.entity.chat.Chat class MessageCenter(private val composer: Composer, private val persister: Persister, private val encryptor: Encryptor, private val sender: Sender) { fun sendSingleTextMessage(chat: Chat, body: String): Single { val messageEntity = composer.createChatMessage(chat, body) val messageId = persister.persistPendingMessage(messageEntity) val smackMessage = encryptor.encrypt(messageEntity) val sendCompletable = sender.send(smackMessage); return messageId.compose(AppendCompletableToSingle(sendCompletable)); } interface Composer { fun createChatMessage(chat: Chat, body: String): MercuryMessage } interface Persister { fun persistPendingMessage(message: MercuryMessage): Single } interface Encryptor { fun encrypt(message: MercuryMessage): SmackMessage } interface Sender { fun send(message: SmackMessage): Completable } }