diff --git a/packages/analytics/amplify_analytics_pinpoint_dart/lib/src/impl/analytics_client/endpoint_client/endpoint_client.dart b/packages/analytics/amplify_analytics_pinpoint_dart/lib/src/impl/analytics_client/endpoint_client/endpoint_client.dart index 8f32f79946..b2201bfda1 100644 --- a/packages/analytics/amplify_analytics_pinpoint_dart/lib/src/impl/analytics_client/endpoint_client/endpoint_client.dart +++ b/packages/analytics/amplify_analytics_pinpoint_dart/lib/src/impl/analytics_client/endpoint_client/endpoint_client.dart @@ -149,18 +149,33 @@ class EndpointClient { /// Send local Endpoint instance to AWS Pinpoint. Future updateEndpoint() async { + Future update({bool throwSessionExpired = false}) async { + try { + await _pinpointClient + .updateEndpoint( + UpdateEndpointRequest( + applicationId: _pinpointAppId, + endpointId: _fixedEndpointId, + endpointRequest: _endpointToRequest(getPublicEndpoint()), + ), + ) + .result; + } on SessionExpiredException catch (e) { + // rethrow SessionExpiredException so that it can be retried. + if (throwSessionExpired) rethrow; + throw fromPinpointException(e); + } on Exception catch (e) { + throw fromPinpointException(e); + } + } + try { - await _pinpointClient - .updateEndpoint( - UpdateEndpointRequest( - applicationId: _pinpointAppId, - endpointId: _fixedEndpointId, - endpointRequest: _endpointToRequest(getPublicEndpoint()), - ), - ) - .result; - } on Exception catch (e) { - throw fromPinpointException(e); + await update(throwSessionExpired: true); + } on SessionExpiredException { + // When SessionExpiredException is thrown, the local credential store + // is cleared. At this point the operation should be retired with guest + // credentials. + await update(); } }