diff --git a/chat-android/src/main/java/com/ably/chat/Messages.kt b/chat-android/src/main/java/com/ably/chat/Messages.kt index bd5c21d5..defd1199 100644 --- a/chat-android/src/main/java/com/ably/chat/Messages.kt +++ b/chat-android/src/main/java/com/ably/chat/Messages.kt @@ -220,13 +220,13 @@ internal class DefaultMessagesSubscription( internal class DefaultMessages( val room: DefaultRoom, -) : Messages, ContributesToRoomLifecycleImpl(room.roomLogger) { +) : Messages, ContributesToRoomLifecycleImpl(room.logger) { override val featureName: String = "messages" private var channelStateListener: ChannelStateListener - private val logger = room.roomLogger.withContext(tag = "Messages") + private val logger = room.logger.withContext(tag = "Messages") private val roomId = room.roomId diff --git a/chat-android/src/main/java/com/ably/chat/Occupancy.kt b/chat-android/src/main/java/com/ably/chat/Occupancy.kt index 7979fb56..a61d5f76 100644 --- a/chat-android/src/main/java/com/ably/chat/Occupancy.kt +++ b/chat-android/src/main/java/com/ably/chat/Occupancy.kt @@ -73,7 +73,7 @@ data class OccupancyEvent( internal class DefaultOccupancy( private val room: DefaultRoom, -) : Occupancy, ContributesToRoomLifecycleImpl(room.roomLogger) { +) : Occupancy, ContributesToRoomLifecycleImpl(room.logger) { override val featureName: String = "occupancy" @@ -81,7 +81,7 @@ internal class DefaultOccupancy( override val detachmentErrorCode: ErrorCode = ErrorCode.OccupancyDetachmentFailed - private val logger = room.roomLogger.withContext(tag = "Occupancy") + private val logger = room.logger.withContext(tag = "Occupancy") override val channel: Channel = room.messages.channel diff --git a/chat-android/src/main/java/com/ably/chat/Presence.kt b/chat-android/src/main/java/com/ably/chat/Presence.kt index 8e1060c4..ffb4e6a5 100644 --- a/chat-android/src/main/java/com/ably/chat/Presence.kt +++ b/chat-android/src/main/java/com/ably/chat/Presence.kt @@ -136,7 +136,7 @@ data class PresenceEvent( internal class DefaultPresence( private val room: DefaultRoom, -) : Presence, ContributesToRoomLifecycleImpl(room.roomLogger) { +) : Presence, ContributesToRoomLifecycleImpl(room.logger) { override val featureName = "presence" @@ -146,7 +146,7 @@ internal class DefaultPresence( override val channel: Channel = room.messages.channel - private val logger = room.roomLogger.withContext(tag = "Presence") + private val logger = room.logger.withContext(tag = "Presence") private val presence = channel.presence diff --git a/chat-android/src/main/java/com/ably/chat/Room.kt b/chat-android/src/main/java/com/ably/chat/Room.kt index 8e0d852f..774c6052 100644 --- a/chat-android/src/main/java/com/ably/chat/Room.kt +++ b/chat-android/src/main/java/com/ably/chat/Room.kt @@ -117,7 +117,7 @@ internal class DefaultRoom( internal val clientId: String, logger: Logger, ) : Room { - internal val roomLogger = logger.withContext("Room", mapOf("roomId" to roomId)) + private val logger = logger.withContext("Room", mapOf("roomId" to roomId)) /** * RoomScope is a crucial part of the Room lifecycle. It manages sequential and atomic operations. @@ -133,6 +133,7 @@ internal class DefaultRoom( override val presence: Presence get() { if (_presence == null) { // CHA-RC2b + logger.error("Presence access failed, it is not enabled") throw ablyException("Presence is not enabled for this room", ErrorCode.BadRequest) } return _presence as Presence @@ -142,6 +143,7 @@ internal class DefaultRoom( override val reactions: RoomReactions get() { if (_reactions == null) { // CHA-RC2b + logger.error("Reactions access failed, it is not enabled") throw ablyException("Reactions are not enabled for this room", ErrorCode.BadRequest) } return _reactions as RoomReactions @@ -151,6 +153,7 @@ internal class DefaultRoom( override val typing: Typing get() { if (_typing == null) { // CHA-RC2b + logger.error("Typing access failed, it is not enabled") throw ablyException("Typing is not enabled for this room", ErrorCode.BadRequest) } return _typing as Typing @@ -160,12 +163,13 @@ internal class DefaultRoom( override val occupancy: Occupancy get() { if (_occupancy == null) { // CHA-RC2b + logger.error("Occupancy access failed, it is not enabled") throw ablyException("Occupancy is not enabled for this room", ErrorCode.BadRequest) } return _occupancy as Occupancy } - private val statusLifecycle = DefaultRoomLifecycle(roomLogger) + private val statusLifecycle = DefaultRoomLifecycle(this.logger) override val status: RoomStatus get() = statusLifecycle.status @@ -176,7 +180,9 @@ internal class DefaultRoom( private var lifecycleManager: RoomLifecycleManager init { - options.validateRoomOptions() // CHA-RC2a + this.logger.debug("Initializing based on options: $options") + + options.validateRoomOptions(this.logger) // CHA-RC2a // CHA-RC2e - Add contributors/features as per the order of precedence val roomFeatures = mutableListOf(messages) @@ -205,7 +211,9 @@ internal class DefaultRoom( _occupancy = occupancyContributor } - lifecycleManager = RoomLifecycleManager(roomScope, statusLifecycle, roomFeatures, roomLogger) + lifecycleManager = RoomLifecycleManager(roomScope, statusLifecycle, roomFeatures, this.logger) + + this.logger.debug("Initialized with features: ${roomFeatures.joinToString { it.featureName }}") } override fun onStatusChange(listener: RoomLifecycle.Listener): Subscription = @@ -216,10 +224,12 @@ internal class DefaultRoom( } override suspend fun attach() { + logger.trace("attach;") lifecycleManager.attach() } override suspend fun detach() { + logger.trace("detach;") lifecycleManager.detach() } @@ -228,6 +238,7 @@ internal class DefaultRoom( * This is an internal method and only called from Rooms interface implementation. */ internal suspend fun release() { + logger.trace("release;") lifecycleManager.release() } diff --git a/chat-android/src/main/java/com/ably/chat/RoomOptions.kt b/chat-android/src/main/java/com/ably/chat/RoomOptions.kt index 03f20304..a9394d5a 100644 --- a/chat-android/src/main/java/com/ably/chat/RoomOptions.kt +++ b/chat-android/src/main/java/com/ably/chat/RoomOptions.kt @@ -104,9 +104,10 @@ class OccupancyOptions { * Throws AblyException for invalid room configuration. * Spec: CHA-RC2a */ -internal fun RoomOptions.validateRoomOptions() { +internal fun RoomOptions.validateRoomOptions(logger: Logger) { typing?.let { if (typing.timeoutMs <= 0) { + logger.error("Typing timeout must be greater than 0, found ${typing.timeoutMs}") throw ablyException("Typing timeout must be greater than 0", ErrorCode.InvalidRequestBody) } } diff --git a/chat-android/src/main/java/com/ably/chat/RoomReactions.kt b/chat-android/src/main/java/com/ably/chat/RoomReactions.kt index 2412200d..637efc85 100644 --- a/chat-android/src/main/java/com/ably/chat/RoomReactions.kt +++ b/chat-android/src/main/java/com/ably/chat/RoomReactions.kt @@ -106,7 +106,7 @@ data class SendReactionParams( internal class DefaultRoomReactions( private val room: DefaultRoom, -) : RoomReactions, ContributesToRoomLifecycleImpl(room.roomLogger) { +) : RoomReactions, ContributesToRoomLifecycleImpl(room.logger) { override val featureName = "reactions" @@ -118,7 +118,7 @@ internal class DefaultRoomReactions( override val detachmentErrorCode: ErrorCode = ErrorCode.ReactionsDetachmentFailed - private val logger = room.roomLogger.withContext(tag = "Reactions") + private val logger = room.logger.withContext(tag = "Reactions") // (CHA-ER3) Ephemeral room reactions are sent to Ably via the Realtime connection via a send method. // (CHA-ER3a) Reactions are sent on the channel using a message in a particular format - see spec for format. diff --git a/chat-android/src/main/java/com/ably/chat/Typing.kt b/chat-android/src/main/java/com/ably/chat/Typing.kt index 4b85fd16..89830922 100644 --- a/chat-android/src/main/java/com/ably/chat/Typing.kt +++ b/chat-android/src/main/java/com/ably/chat/Typing.kt @@ -94,7 +94,7 @@ data class TypingEvent(val currentlyTyping: Set) internal class DefaultTyping( private val room: DefaultRoom, dispatcher: CoroutineDispatcher = Dispatchers.Default, -) : Typing, ContributesToRoomLifecycleImpl(room.roomLogger) { +) : Typing, ContributesToRoomLifecycleImpl(room.logger) { private val typingIndicatorsChannelName = "${room.roomId}::\$chat::\$typingIndicators" override val featureName = "typing" @@ -103,7 +103,7 @@ internal class DefaultTyping( override val detachmentErrorCode: ErrorCode = ErrorCode.TypingDetachmentFailed - private val logger = room.roomLogger.withContext(tag = "Typing") + private val logger = room.logger.withContext(tag = "Typing") private val typingScope = CoroutineScope(dispatcher.limitedParallelism(1) + SupervisorJob())