From 42a75d6bc5737f32bb299821b6122c88d53cce7a Mon Sep 17 00:00:00 2001 From: Matthew O'Riordan Date: Sun, 24 Aug 2025 09:18:09 +0200 Subject: [PATCH] Update error messages for better user experience This commit updates error message strings to be more descriptive and user-friendly, providing clearer guidance on what went wrong and how to resolve issues. Changes include: Source/ARTAuth.m | 3 ++- Source/ARTChannel.m | 11 +++++++++-- Source/ARTRealtime.m | 9 ++++++--- Source/ARTRealtimeChannel.m | 3 ++- Source/ARTRealtimePresence.m | 6 ++++-- 5 files changed, 23 insertions(+), 9 deletions(-) These improvements are part of an ongoing initiative to enhance error messaging across all Ably SDKs and services for better developer experience. For more context, see: https://github.com/ably/ably-os --- Source/ARTAuth.m | 3 ++- Source/ARTChannel.m | 11 +++++++++-- Source/ARTRealtime.m | 9 ++++++--- Source/ARTRealtimeChannel.m | 3 ++- Source/ARTRealtimePresence.m | 6 ++++-- 5 files changed, 23 insertions(+), 9 deletions(-) diff --git a/Source/ARTAuth.m b/Source/ARTAuth.m index 934c66035..7a690cf74 100644 --- a/Source/ARTAuth.m +++ b/Source/ARTAuth.m @@ -359,7 +359,8 @@ - (void)requestToken:(ARTTokenParams *)tokenParams return; } if (self.clientId_nosync && tokenDetails.clientId && ![tokenDetails.clientId isEqualToString:@"*"] && ![self.clientId_nosync isEqual:tokenDetails.clientId]) { - if (callback) callback(nil, [ARTErrorInfo createWithCode:ARTErrorIncompatibleCredentials message:@"incompatible credentials"]); + // ably-os:inline-error-update:40102:2025-08-22:e8u Original: "incompatible credentials" + if (callback) callback(nil, [ARTErrorInfo createWithCode:ARTErrorIncompatibleCredentials message:[NSString stringWithFormat:@"Client ID in token (%@) does not match configured client ID (%@)", tokenDetails.clientId, self.clientId_nosync]]); return; } callback(tokenDetails, nil); diff --git a/Source/ARTChannel.m b/Source/ARTChannel.m index e623b3d0f..c87cd25f8 100644 --- a/Source/ARTChannel.m +++ b/Source/ARTChannel.m @@ -110,8 +110,11 @@ - (void)publish:(NSString *)name message:(ARTMessage *)message extras:(id *)messages callback:(nullable ARTCallback // Checked after encoding, so that the client can receive callback with encoding errors if ([self exceedMaxSize:messages]) { + // ably-os:inline-error-update:40009:2025-08-22:e8u Original: "Maximum message length exceeded." + NSInteger totalSize = 0; + for (ARTMessage *msg in messages) { totalSize += [msg messageSize]; } + NSInteger maxSize = [ARTDefault maxMessageSize]; ARTErrorInfo *sizeError = [ARTErrorInfo createWithCode:ARTErrorMaxMessageLengthExceeded - message:@"Maximum message length exceeded."]; + message:[NSString stringWithFormat:@"Max message length of %ld bytes exceeded (was %ld bytes)", (long)maxSize, (long)totalSize]]; if (callback) { callback(sizeError); } diff --git a/Source/ARTRealtime.m b/Source/ARTRealtime.m index 8a8b5388a..6e0cacd3b 100644 --- a/Source/ARTRealtime.m +++ b/Source/ARTRealtime.m @@ -725,7 +725,8 @@ - (void)performTransitionToState:(ARTRealtimeConnectionState)state withParams:(A _fallbacks = nil; self.rest.prioritizedHost = nil; [self.auth cancelAuthorization:stateChange.reason]; - [self failPendingMessages:[ARTStatus state:ARTStateError info:[ARTErrorInfo createWithCode:ARTErrorConnectionFailed message:@"connection broken before receiving publishing acknowledgment"]]]; + // ably-os:inline-error-update:80000:2025-08-22:e8u Original: "connection broken before receiving publishing acknowledgment" + [self failPendingMessages:[ARTStatus state:ARTStateError info:[ARTErrorInfo createWithCode:ARTErrorConnectionFailed message:@"Connection failed while waiting for message publishing acknowledgment"]]]; break; } case ARTRealtimeDisconnected: { @@ -1073,7 +1074,8 @@ - (void)onConnectionTimeOut { ARTErrorInfo *error; if (self.auth.authorizing_nosync && (self.options.authUrl || self.options.authCallback)) { - error = [ARTErrorInfo createWithCode:ARTErrorAuthConfiguredProviderFailure status:ARTStateConnectionFailed message:@"timed out"]; + // ably-os:inline-error-update:80019:2025-08-22:e8u Original: "timed out" + error = [ARTErrorInfo createWithCode:ARTErrorAuthConfiguredProviderFailure status:ARTStateConnectionFailed message:@"authentication provider timed out"]; } else { error = [ARTErrorInfo createWithCode:ARTErrorConnectionTimedOut status:ARTStateConnectionFailed message:@"timed out"]; @@ -1563,7 +1565,8 @@ - (void)setIdleTimer { _idleTimer = artDispatchScheduled(self.options.testOptions.realtimeRequestTimeout + self.maxIdleInterval, _rest.queue, ^{ ARTLogError(self.logger, @"R:%p No activity seen from realtime in %f seconds; assuming connection has dropped", self, [[NSDate date] timeIntervalSinceDate:self->_lastActivity]); - ARTErrorInfo *idleTimerExpired = [ARTErrorInfo createWithCode:ARTErrorDisconnected status:408 message:@"Idle timer expired"]; + // ably-os:inline-error-update:80003:2025-08-22:e8u Original: "Idle timer expired" + ARTErrorInfo *idleTimerExpired = [ARTErrorInfo createWithCode:ARTErrorDisconnected status:408 message:@"Connection disconnected due to inactivity timeout"]; ARTConnectionStateChangeParams *const params = [[ARTConnectionStateChangeParams alloc] initWithErrorInfo:idleTimerExpired]; [self performTransitionToDisconnectedOrSuspendedWithParams:params]; }); diff --git a/Source/ARTRealtimeChannel.m b/Source/ARTRealtimeChannel.m index 242c1e9e8..d713ccbae 100644 --- a/Source/ARTRealtimeChannel.m +++ b/Source/ARTRealtimeChannel.m @@ -1050,7 +1050,8 @@ - (void)detachAfterChecks { }] startTimer]; if (self.presence.syncInProgress_nosync) { - [self.presence failsSync:[ARTErrorInfo createWithCode:ARTErrorChannelOperationFailed message:@"channel is being DETACHED"]]; + // ably-os:inline-error-update:90000:2025-08-22:e8u Original: "channel is being DETACHED" + [self.presence failsSync:[ARTErrorInfo createWithCode:ARTErrorChannelOperationFailed message:@"channel is being detached"]]; } } diff --git a/Source/ARTRealtimePresence.m b/Source/ARTRealtimePresence.m index 391477ad1..6732d692e 100644 --- a/Source/ARTRealtimePresence.m +++ b/Source/ARTRealtimePresence.m @@ -233,7 +233,8 @@ - (void)get:(ARTRealtimePresenceQuery *)query callback:(ARTPresenceMessagesCallb if (callback) callback(self->_members.allValues, nil); return; } - if (callback) callback(nil, [ARTErrorInfo createWithCode:ARTErrorPresenceStateIsOutOfSync message:@"presence state is out of sync due to the channel being SUSPENDED"]); + // ably-os:inline-error-update:91005:2025-08-22:e8u Original: "presence state is out of sync due to the channel being SUSPENDED" + if (callback) callback(nil, [ARTErrorInfo createWithCode:ARTErrorPresenceStateIsOutOfSync message:@"Presence data unavailable while channel is SUSPENDED. Wait for channel to reconnect or call channel.attach()"]); return; default: break; @@ -769,7 +770,8 @@ - (void)reenterInternalMembers { for (ARTPresenceMessage *member in [self.internalMembers allValues]) { [self enterWithPresenceMessageId:member.id clientId:member.clientId data:member.data callback:^(ARTErrorInfo *error) { // RTP17g if (error != nil) { - NSString *message = [NSString stringWithFormat:@"Re-entering member \"%@\" is failed with code %ld (%@)", member.memberKey, (long)error.code, error.message]; + // ably-os:inline-error-update:91004:2025-08-22:e8u Original: "Re-entering member \"%@\" is failed with code %ld (%@)" + NSString *message = [NSString stringWithFormat:@"Unable to automatically re-enter presence member \"%@\" after reconnection (error %ld: %@). Call presence.enter() manually", member.memberKey, (long)error.code, error.message]; ARTErrorInfo *reenterError = [ARTErrorInfo createWithCode:ARTErrorUnableToAutomaticallyReEnterPresenceChannel message:message]; ARTChannelStateChange *stateChange = [[ARTChannelStateChange alloc] initWithCurrent:self->_channel.state_nosync previous:self->_channel.state_nosync event:ARTChannelEventUpdate reason:reenterError resumed:true]; // RTP17e