diff --git a/Sources/AblyChat/ChatAPI.swift b/Sources/AblyChat/ChatAPI.swift index 2927f860..30c36808 100644 --- a/Sources/AblyChat/ChatAPI.swift +++ b/Sources/AblyChat/ChatAPI.swift @@ -68,7 +68,7 @@ internal final class ChatAPI: Sendable { // (CHA-M3a) When a message is sent successfully, the caller shall receive a struct representing the Message in response (as if it were received via Realtime event). internal func sendMessage(roomName: String, params: SendMessageParams) async throws(InternalError) -> Message { guard let clientId = realtime.clientId else { - throw ARTErrorInfo.create(withCode: 40000, message: "Ensure your Realtime instance is initialized with a clientId.").toInternalError() + throw ARTErrorInfo(chatError: .clientIdRequired).toInternalError() } let endpoint = "\(apiVersionV3)/rooms/\(roomName)/messages" @@ -106,7 +106,7 @@ internal final class ChatAPI: Sendable { // (CHA-M8a) A client may update a message via the Chat REST API by calling the update method. internal func updateMessage(roomName: String, with modifiedMessage: Message, description: String?, metadata: OperationMetadata?) async throws(InternalError) -> Message { guard let clientID = realtime.clientId else { - throw ARTErrorInfo.create(withCode: 40000, message: "Ensure your Realtime instance is initialized with a clientId.").toInternalError() + throw ARTErrorInfo(chatError: .clientIdRequired).toInternalError() } let endpoint = "\(apiVersionV3)/rooms/\(roomName)/messages/\(modifiedMessage.serial)" diff --git a/Sources/AblyChat/Errors.swift b/Sources/AblyChat/Errors.swift index 2ef198b9..042ded3d 100644 --- a/Sources/AblyChat/Errors.swift +++ b/Sources/AblyChat/Errors.swift @@ -63,6 +63,7 @@ public enum ErrorCode: Int { case cannotApplyEventForDifferentMessage case messageRejectedByBeforePublishRule case messageRejectedByModeration + case clientIdRequired internal var toNumericErrorCode: ErrorCode { switch self { @@ -86,6 +87,8 @@ public enum ErrorCode: Int { .messageRejectedByModeration case .messageRejectedByBeforePublishRule: .messageRejectedByBeforePublishRule + case .clientIdRequired: + .badRequest } } @@ -99,7 +102,8 @@ public enum ErrorCode: Int { .roomIsReleased, .roomReleasedBeforeOperationCompleted, .unableDeleteReactionWithoutName, - .cannotApplyEventForDifferentMessage: + .cannotApplyEventForDifferentMessage, + .clientIdRequired: 400 case .messageRejectedByModeration, .messageRejectedByBeforePublishRule: @@ -170,6 +174,7 @@ internal enum ChatError { case cannotApplyEventForDifferentMessage case messageRejectedByBeforePublishRule case messageRejectedByModeration + case clientIdRequired internal var codeAndStatusCode: ErrorCodeAndStatusCode { switch self { @@ -202,6 +207,8 @@ internal enum ChatError { .fixedStatusCode(.messageRejectedByBeforePublishRule) case .messageRejectedByModeration: .fixedStatusCode(.messageRejectedByModeration) + case .clientIdRequired: + .fixedStatusCode(.clientIdRequired) } } @@ -256,6 +263,8 @@ internal enum ChatError { "The message was rejected before publishing by a rule on the chat room." case .messageRejectedByModeration: "The message was rejected before publishing by a moderation rule on the chat room." + case .clientIdRequired: + "Ensure your Realtime instance is initialized with a clientId." } } @@ -276,7 +285,8 @@ internal enum ChatError { .cannotApplyEventForDifferentMessage, .unableDeleteReactionWithoutName, .messageRejectedByBeforePublishRule, - .messageRejectedByModeration: + .messageRejectedByModeration, + .clientIdRequired: nil } } diff --git a/Sources/AblyChat/Room.swift b/Sources/AblyChat/Room.swift index c67376ca..6ad40705 100644 --- a/Sources/AblyChat/Room.swift +++ b/Sources/AblyChat/Room.swift @@ -265,7 +265,7 @@ internal class DefaultRoom: InternalRoom { self.chatAPI = chatAPI guard let clientId = realtime.clientId else { - throw ARTErrorInfo.create(withCode: 40000, message: "Ensure your Realtime instance is initialized with a clientId.").toInternalError() + throw ARTErrorInfo(chatError: .clientIdRequired).toInternalError() } internalChannel = Self.createChannel(roomName: name, roomOptions: options, realtime: realtime)