// // Copyright Amazon.com Inc. or its affiliates. // All Rights Reserved. // // SPDX-License-Identifier: Apache-2.0 // import Amplify import AWSPluginsCore class AuthHubEventHandler: AuthHubEventBehavior { var lastSendEventName: HubPayloadEventName? init() { setupHubEvents() } func sendUserSignedInEvent() { dispatchAuthEvent(HubPayload.EventName.Auth.signedIn) } func sendUserSignedOutEvent() { dispatchAuthEvent(HubPayload.EventName.Auth.signedOut) } func sendUserDeletedEvent() { dispatchAuthEvent(HubPayload.EventName.Auth.userDeleted) } func sendSessionExpiredEvent() { dispatchAuthEvent(HubPayload.EventName.Auth.sessionExpired) } // swiftlint:disable cyclomatic_complexity private func setupHubEvents() { _ = Amplify.Hub.listen(to: .auth) {[weak self] payload in switch payload.eventName { case HubPayload.EventName.Auth.signInAPI: guard let event = payload.data as? AWSAuthSignInTask.AmplifyAuthTaskResult, case let .success(result) = event else { return } self?.handleSignInEvent(result) case HubPayload.EventName.Auth.confirmSignInAPI: guard let event = payload.data as? AWSAuthConfirmSignInTask.AmplifyAuthTaskResult, case let .success(result) = event else { return } self?.handleSignInEvent(result) #if os(iOS) || os(macOS) case HubPayload.EventName.Auth.webUISignInAPI: guard let event = payload.data as? AWSAuthWebUISignInTask.AmplifyAuthTaskResult, case let .success(result) = event else { return } self?.handleSignInEvent(result) case HubPayload.EventName.Auth.socialWebUISignInAPI: guard let event = payload.data as? AWSAuthWebUISignInTask.AmplifyAuthTaskResult, case let .success(result) = event else { return } self?.handleSignInEvent(result) #endif case HubPayload.EventName.Auth.deleteUserAPI: guard let event = payload.data as? AWSAuthDeleteUserTask.AmplifyAuthTaskResult, case .success = event else { return } self?.sendUserDeletedEvent() case HubPayload.EventName.Auth.signOutAPI: guard let event = payload.data as? AWSCognitoSignOutResult else { return } switch event { case .complete, .partial: self?.sendUserSignedOutEvent() case .failed: break } case HubPayload.EventName.Auth.fetchSessionAPI: guard let event = payload.data as? AWSAuthFetchSessionTask.AmplifyAuthTaskResult, case let .success(result) = event else { return } self?.handleSessionEvent(result) default: break } } } private func handleSignInEvent(_ signInResult: AuthSignInResult) { guard signInResult.isSignedIn else { return } sendUserSignedInEvent() } private func handleSessionEvent(_ sessionResult: AuthSession) { guard let tokensProvider = sessionResult as? AuthCognitoTokensProvider, case let .failure(authError) = tokensProvider.getCognitoTokens() else { return } guard case .sessionExpired = authError else { return } sendSessionExpiredEvent() } private func dispatchAuthEvent(_ eventName: String) { if eventName != lastSendEventName { lastSendEventName = eventName Amplify.Hub.dispatch(to: .auth, payload: HubPayload(eventName: eventName)) } } }