From d2e936696d2261dc9dba6515a3f06c4c2bad5cb3 Mon Sep 17 00:00:00 2001 From: Harshdeep Singh <6162866+harsh62@users.noreply.github.com> Date: Wed, 11 Jun 2025 23:56:11 -0400 Subject: [PATCH 1/3] initial commit --- .../ASF/ASFDeviceInfo.swift | 52 +++++++++++++------ .../ASF/AdvancedSecurityBehavior.swift | 22 ++++---- .../ASF/CognitoUserPoolASF+KeyChain.swift | 2 +- .../ASF/CognitoUserPoolASF.swift | 24 ++++----- .../CustomSignIn/InitiateCustomAuth.swift | 6 +-- .../Actions/SignUp/ConfirmSignUp.swift | 2 +- .../Actions/SignUp/InitiateSignUp.swift | 2 +- .../Models/AWSAuthCognitoSession.swift | 5 -- .../Operations/AuthConfigureOperation.swift | 2 +- .../SRP/SRPSignInState+Resolver.swift | 2 +- .../HostedUIASWebAuthenticationSession.swift | 2 +- .../Task/Helpers/AWSAuthTaskHelper.swift | 10 +--- .../WebSocket/WebSocketClient.swift | 2 +- 13 files changed, 72 insertions(+), 61 deletions(-) diff --git a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/ASF/ASFDeviceInfo.swift b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/ASF/ASFDeviceInfo.swift index ddb5d61259..84de8d7ff9 100644 --- a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/ASF/ASFDeviceInfo.swift +++ b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/ASF/ASFDeviceInfo.swift @@ -8,7 +8,6 @@ import Foundation import Amplify -@MainActor struct ASFDeviceInfo: ASFDeviceBehavior { let id: String @@ -18,46 +17,69 @@ struct ASFDeviceInfo: ASFDeviceBehavior { } var model: String { - DeviceInfo.current.model + get async { + await MainActor.run { DeviceInfo.current.model } + } } var name: String { - DeviceInfo.current.name + get async { + await MainActor.run { DeviceInfo.current.name } + } } var type: String { - var systemInfo = utsname() - uname(&systemInfo) - return String(bytes: Data(bytes: &systemInfo.machine, - count: Int(_SYS_NAMELEN)), - encoding: .utf8) ?? DeviceInfo.current.hostName + get async { + await MainActor.run { + var systemInfo = utsname() + uname(&systemInfo) + return String(bytes: Data(bytes: &systemInfo.machine, + count: Int(_SYS_NAMELEN)), + encoding: .utf8) ?? DeviceInfo.current.hostName + } + } } var platform: String { - DeviceInfo.current.operatingSystem.name + get async { + await MainActor.run { DeviceInfo.current.operatingSystem.name } + } } var version: String { - DeviceInfo.current.operatingSystem.version + get async { + await MainActor.run { DeviceInfo.current.operatingSystem.version } + } } var thirdPartyId: String? { - DeviceInfo.current.identifierForVendor?.uuidString + get async { + await MainActor.run { DeviceInfo.current.identifierForVendor?.uuidString } + } } var height: String { - String(format: "%.0f", DeviceInfo.current.screenBounds.height) + get async { + await MainActor.run { String(format: "%.0f", DeviceInfo.current.screenBounds.height) } + } } var width: String { - String(format: "%.0f", DeviceInfo.current.screenBounds.width) + get async { + await MainActor.run { String(format: "%.0f", DeviceInfo.current.screenBounds.width) } + } } var locale: String { - return Locale.preferredLanguages[0] + get async { + await MainActor.run { Locale.preferredLanguages[0] } + } } - func deviceInfo() -> String { + func deviceInfo() async -> String { + let model = await self.model + let type = await self.type + let version = await self.version var build = "release" #if DEBUG build = "debug" diff --git a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/ASF/AdvancedSecurityBehavior.swift b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/ASF/AdvancedSecurityBehavior.swift index c5c688972b..c230cad0cb 100644 --- a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/ASF/AdvancedSecurityBehavior.swift +++ b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/ASF/AdvancedSecurityBehavior.swift @@ -12,32 +12,32 @@ protocol AdvancedSecurityBehavior { func userContextData(for username: String, deviceInfo: ASFDeviceBehavior, appInfo: ASFAppInfoBehavior, - configuration: UserPoolConfigurationData) throws -> String + configuration: UserPoolConfigurationData) async throws -> String } protocol ASFDeviceBehavior: Sendable { var id: String { get } - var model: String { get } + var model: String { get async } - var name: String { get } + var name: String { get async } - var platform: String { get } + var platform: String { get async } - var version: String { get } + var version: String { get async } - var thirdPartyId: String? { get } + var thirdPartyId: String? { get async } - var height: String { get } + var height: String { get async } - var width: String { get } + var width: String { get async } - var locale: String { get } + var locale: String { get async } - var type: String { get } + var type: String { get async } - func deviceInfo() -> String + func deviceInfo() async -> String } protocol ASFAppInfoBehavior { diff --git a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/ASF/CognitoUserPoolASF+KeyChain.swift b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/ASF/CognitoUserPoolASF+KeyChain.swift index 8949aee102..0bf4d3caac 100644 --- a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/ASF/CognitoUserPoolASF+KeyChain.swift +++ b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/ASF/CognitoUserPoolASF+KeyChain.swift @@ -37,7 +37,7 @@ extension CognitoUserPoolASF { let appInfo: ASFAppInfoBehavior = ASFAppInfo() do { - return try asfClient.userContextData( + return try await asfClient.userContextData( for: username, deviceInfo: deviceInfo, appInfo: appInfo, diff --git a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/ASF/CognitoUserPoolASF.swift b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/ASF/CognitoUserPoolASF.swift index 4d9568f270..a76c6a78d1 100644 --- a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/ASF/CognitoUserPoolASF.swift +++ b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/ASF/CognitoUserPoolASF.swift @@ -30,9 +30,9 @@ struct CognitoUserPoolASF: AdvancedSecurityBehavior { func userContextData(for username: String = "unknown", deviceInfo: ASFDeviceBehavior, appInfo: ASFAppInfoBehavior, - configuration: UserPoolConfigurationData) throws -> String { + configuration: UserPoolConfigurationData) async throws -> String { - let contextData = prepareUserContextData(deviceInfo: deviceInfo, appInfo: appInfo) + let contextData = await prepareUserContextData(deviceInfo: deviceInfo, appInfo: appInfo) let payload = try prepareJsonPayload(username: username, contextData: contextData, userPoolId: configuration.poolId) @@ -43,31 +43,31 @@ struct CognitoUserPoolASF: AdvancedSecurityBehavior { } func prepareUserContextData(deviceInfo: ASFDeviceBehavior, - appInfo: ASFAppInfoBehavior) -> [String: String] { + appInfo: ASFAppInfoBehavior) async -> [String: String] { var build = "release" #if DEBUG build = "debug" #endif - let fingerPrint = deviceInfo.deviceInfo() + let fingerPrint = await deviceInfo.deviceInfo() var contextData: [String: String] = [ Self.targetSDKKey: appInfo.targetSDK, Self.appVersionKey: appInfo.version, - Self.deviceNameKey: deviceInfo.name, - Self.phoneTypeKey: deviceInfo.type, + Self.deviceNameKey: await deviceInfo.name, + Self.phoneTypeKey: await deviceInfo.type, Self.deviceIdKey: deviceInfo.id, - Self.releaseVersionKey: deviceInfo.version, - Self.platformKey: deviceInfo.platform, + Self.releaseVersionKey: await deviceInfo.version, + Self.platformKey: await deviceInfo.platform, Self.buildTypeKey: build, Self.timezoneKey: timeZoneOffet(), - Self.deviceHeightKey: deviceInfo.height, - Self.deviceWidthKey: deviceInfo.width, - Self.deviceLanguageKey: deviceInfo.locale, + Self.deviceHeightKey: await deviceInfo.height, + Self.deviceWidthKey: await deviceInfo.width, + Self.deviceLanguageKey: await deviceInfo.locale, Self.deviceFingerPrintKey: fingerPrint ] if let appName = appInfo.name { contextData[Self.appNameKey] = appName } - if let thirdPartyDeviceIdKey = deviceInfo.thirdPartyId { + if let thirdPartyDeviceIdKey = await deviceInfo.thirdPartyId { contextData[Self.thirdPartyDeviceIdKey] = thirdPartyDeviceIdKey } return contextData diff --git a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Actions/SignIn/CustomSignIn/InitiateCustomAuth.swift b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Actions/SignIn/CustomSignIn/InitiateCustomAuth.swift index ff1c572f06..411a09499a 100644 --- a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Actions/SignIn/CustomSignIn/InitiateCustomAuth.swift +++ b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Actions/SignIn/CustomSignIn/InitiateCustomAuth.swift @@ -67,9 +67,9 @@ struct InitiateCustomAuth: Action { logVerbose("\(#fileID) Starting execution", environment: environment) let response = try await cognitoClient.initiateAuth(input: request) - return try UserPoolSignInHelper.parseResponse(response, - for: username, - signInMethod: .apiBased(.customWithoutSRP)) + return UserPoolSignInHelper.parseResponse(response, + for: username, + signInMethod: .apiBased(.customWithoutSRP)) } } diff --git a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Actions/SignUp/ConfirmSignUp.swift b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Actions/SignUp/ConfirmSignUp.swift index 44d289bce6..09afbdf606 100644 --- a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Actions/SignUp/ConfirmSignUp.swift +++ b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Actions/SignUp/ConfirmSignUp.swift @@ -66,7 +66,7 @@ extension ConfirmSignUp: CustomDebugDictionaryConvertible { "identifier": identifier, "signUpEventData": data.debugDictionary, "confirmationCode": confirmationCode.masked(), - "forceAliasCreation": forceAliasCreation + "forceAliasCreation": forceAliasCreation as Any ] } } diff --git a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Actions/SignUp/InitiateSignUp.swift b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Actions/SignUp/InitiateSignUp.swift index 67693df60f..96a404929b 100644 --- a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Actions/SignUp/InitiateSignUp.swift +++ b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Actions/SignUp/InitiateSignUp.swift @@ -82,7 +82,7 @@ extension InitiateSignUp: CustomDebugDictionaryConvertible { [ "identifier": identifier, "signUpEventData": data.debugDictionary, - "attributes": attributes + "attributes": attributes as Any ] } } diff --git a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/AWSAuthCognitoSession.swift b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/AWSAuthCognitoSession.swift index 59d799e963..489d32b574 100644 --- a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/AWSAuthCognitoSession.swift +++ b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/AWSAuthCognitoSession.swift @@ -64,12 +64,7 @@ public struct AWSAuthCognitoSession: AuthSession, return .failure(AuthError.signedOut( AuthPluginErrorConstants.userSubSignOutError.errorDescription, AuthPluginErrorConstants.userSubSignOutError.recoverySuggestion)) - } catch let error as AuthError { - return .failure(error) } catch { - let error = AuthError.unknown(""" - Could not retreive user sub from the fetched Cognito tokens. - """) return .failure(error) } } diff --git a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Operations/AuthConfigureOperation.swift b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Operations/AuthConfigureOperation.swift index 376ffefc4c..ef65d55c48 100644 --- a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Operations/AuthConfigureOperation.swift +++ b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Operations/AuthConfigureOperation.swift @@ -16,7 +16,7 @@ typealias ConfigureOperation = AmplifyOperation< Void, AuthError> -class AuthConfigureOperation: ConfigureOperation { +class AuthConfigureOperation: ConfigureOperation, @unchecked Sendable { let authConfiguration: AuthConfiguration let authStateMachine: AuthStateMachine diff --git a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/StateMachine/Resolvers/SRP/SRPSignInState+Resolver.swift b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/StateMachine/Resolvers/SRP/SRPSignInState+Resolver.swift index 2a37225a59..6c3e9d3de6 100644 --- a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/StateMachine/Resolvers/SRP/SRPSignInState+Resolver.swift +++ b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/StateMachine/Resolvers/SRP/SRPSignInState+Resolver.swift @@ -32,7 +32,7 @@ extension SRPSignInState { switch oldState { case .notStarted: return resolveNotStarted(byApplying: srpSignInEvent) - case .initiatingSRPA(let signInEventData): + case .initiatingSRPA(_): return resolveInitiatingSRPA( byApplying: srpSignInEvent, from: oldState) diff --git a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Support/HostedUI/HostedUIASWebAuthenticationSession.swift b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Support/HostedUI/HostedUIASWebAuthenticationSession.swift index 4e42a50c99..5c00dfc06f 100644 --- a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Support/HostedUI/HostedUIASWebAuthenticationSession.swift +++ b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Support/HostedUI/HostedUIASWebAuthenticationSession.swift @@ -8,7 +8,7 @@ import Foundation import Amplify #if os(iOS) || os(macOS) || os(visionOS) -import AuthenticationServices +@preconcurrency import AuthenticationServices #endif class HostedUIASWebAuthenticationSession: NSObject, HostedUISessionBehavior { diff --git a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Task/Helpers/AWSAuthTaskHelper.swift b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Task/Helpers/AWSAuthTaskHelper.swift index ba2e34c8a3..0b31d5b768 100644 --- a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Task/Helpers/AWSAuthTaskHelper.swift +++ b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Task/Helpers/AWSAuthTaskHelper.swift @@ -72,14 +72,8 @@ class AWSAuthTaskHelper: DefaultLogger { throw AuthError.unknown("Unable to fetch auth session", nil) } - do { - let tokens = try cognitoTokenProvider.getCognitoTokens().get() - return tokens.accessToken - } catch let error as AuthError { - throw error - } catch { - throw AuthError.unknown("Unable to fetch auth session", error) - } + let tokens = try cognitoTokenProvider.getCognitoTokens().get() + return tokens.accessToken } func getCurrentUser() async throws -> AuthUser { diff --git a/AmplifyPlugins/Core/AWSPluginsCore/WebSocket/WebSocketClient.swift b/AmplifyPlugins/Core/AWSPluginsCore/WebSocket/WebSocketClient.swift index 2267ea6cb5..40120ff4df 100644 --- a/AmplifyPlugins/Core/AWSPluginsCore/WebSocket/WebSocketClient.swift +++ b/AmplifyPlugins/Core/AWSPluginsCore/WebSocket/WebSocketClient.swift @@ -28,7 +28,7 @@ public final actor WebSocketClient: NSObject { /// Interceptor for appending additional info before makeing the connection private var interceptor: WebSocketInterceptor? /// Internal wriable WebSocketEvent data stream - private let subject = PassthroughSubject() + nonisolated private let subject = PassthroughSubject() private let retryWithJitter = RetryWithJitter() From af86a3c00c0f6b287ea6631e5e1c2dbe898edebe Mon Sep 17 00:00:00 2001 From: Harshdeep Singh <6162866+harsh62@users.noreply.github.com> Date: Thu, 12 Jun 2025 01:01:14 -0400 Subject: [PATCH 2/3] another commit --- Amplify/Amplify.swift | 65 +++++++++++++++---- .../Auth/AuthCategory+UserBehavior.swift | 5 +- .../Auth/AuthCategoryUserBehavior.swift | 5 +- .../Auth/Models/AuthCodeDeliveryDetails.swift | 2 + .../Categories/Auth/Models/AuthDevice.swift | 2 +- .../Auth/Models/AuthFactorType.swift | 2 + .../Categories/Auth/Models/AuthSession.swift | 2 +- .../Auth/Models/AuthSignInStep.swift | 2 + .../Auth/Models/AuthSignUpStep.swift | 2 + .../Auth/Models/AuthUpdateAttributeStep.swift | 2 + Amplify/Categories/Auth/Models/AuthUser.swift | 2 +- .../Auth/Models/AuthUserAttribute.swift | 4 ++ .../Auth/Models/AuthWebAuthnCredential.swift | 4 +- .../Auth/Models/DeliveryDestination.swift | 2 + Amplify/Categories/Auth/Models/MFAType.swift | 2 + .../Auth/Models/TOTPSetupDetails.swift | 2 + ...thAssociateWebAuthnCredentialRequest.swift | 2 + ...tributeResendConfirmationCodeRequest.swift | 2 + ...AttributeSendVerificationCodeRequest.swift | 2 + .../Auth/Request/AuthAutoSignInRequest.swift | 2 + .../Request/AuthChangePasswordRequest.swift | 2 + .../AuthConfirmResetPasswordRequest.swift | 2 + .../Request/AuthConfirmSignInRequest.swift | 2 + .../Request/AuthConfirmSignUpRequest.swift | 2 + .../AuthConfirmUserAttributeRequest.swift | 2 + .../AuthDeleteWebAuthnCredentialRequest.swift | 2 + .../Request/AuthFetchDevicesRequest.swift | 2 + .../Request/AuthFetchSessionRequest.swift | 2 + .../AuthFetchUserAttributesRequest.swift | 2 + .../Request/AuthForgetDeviceRequest.swift | 2 + .../AuthListWebAuthnCredentialsRequest.swift | 2 + .../Request/AuthRememberDeviceRequest.swift | 2 + .../Request/AuthResendSignUpCodeRequest.swift | 2 + .../Request/AuthResetPasswordRequest.swift | 2 + .../Auth/Request/AuthSignInRequest.swift | 2 + .../Auth/Request/AuthSignOutRequest.swift | 2 + .../Auth/Request/AuthSignUpRequest.swift | 2 + .../AuthUpdateUserAttributeRequest.swift | 2 + .../AuthUpdateUserAttributesRequest.swift | 2 + .../Auth/Request/AuthWebUISignInRequest.swift | 2 + .../Auth/Request/VerifyTOTPSetupRequest.swift | 2 + .../Auth/Result/AuthResetPasswordResult.swift | 4 ++ .../Auth/Result/AuthSignInResult.swift | 2 + .../Auth/Result/AuthSignOutResult.swift | 2 +- .../Auth/Result/AuthSignUpResult.swift | 2 + .../Result/AuthUpdateAttributeResult.swift | 2 + .../Request/StorageDownloadDataRequest.swift | 2 + .../Request/StorageDownloadFileRequest.swift | 2 + .../Request/StorageGetURLRequest.swift | 2 + .../Request/StorageListRequest.swift | 3 + .../Request/StorageRemoveRequest.swift | 2 + .../Request/StorageUploadDataRequest.swift | 2 + .../Request/StorageUploadFileRequest.swift | 2 + .../Storage/Result/StorageListResult.swift | 4 ++ .../AmplifyTask+OperationTaskAdapters.swift | 4 +- Amplify/Core/Support/AtomicValue.swift | 2 +- .../AWSCognitoAuthPlugin+UserBehavior.swift | 2 +- .../Models/AWSAuthCognitoSession.swift | 2 + .../Models/AWSAuthDevice.swift | 2 + .../Models/AWSAuthUser.swift | 2 + .../Models/AWSCognitoSignOutResult.swift | 8 +++ .../Models/AWSCognitoWebAuthnCredential.swift | 2 + .../Models/AuthFlowType.swift | 2 + .../Models/FederateToIdentityPoolResult.swift | 2 + .../Models/MFAPreference.swift | 2 + .../Models/UserMFAPreference.swift | 2 + .../Task/Helpers/AWSAuthTaskHelper.swift | 2 +- .../Task/SetUpTOTPTask.swift | 2 +- .../Mocks/MockAuthCategoryPlugin.swift | 2 +- 69 files changed, 196 insertions(+), 28 deletions(-) diff --git a/Amplify/Amplify.swift b/Amplify/Amplify.swift index fdc88954a3..0f2b8dc7da 100644 --- a/Amplify/Amplify.swift +++ b/Amplify/Amplify.swift @@ -20,44 +20,83 @@ import Foundation /// available at initialization. /// /// - Tag: Amplify -public class Amplify { +public class Amplify: @unchecked Sendable { /// If `true`, `configure()` has already been invoked, and subsequent calls to `configure` will throw a /// ConfigurationError.amplifyAlreadyConfigured error. /// /// - Tag: Amplify.isConfigured - static var isConfigured = false + private static let isConfiguredAtomic = AtomicValue(initialValue: false) + static var isConfigured: Bool { + get { isConfiguredAtomic.get() } + set { isConfiguredAtomic.set(newValue) } + } // Storage for the categories themselves, which will be instantiated during configuration, and cleared during reset. - // It is not supported to mutate these category properties. They are `var` to support the `reset()` method for - // ease of testing. + // All category properties are protected with AtomicValue for thread safety. /// - Tag: Amplify.Analytics - public static internal(set) var Analytics = AnalyticsCategory() + private static let analyticsAtomic = AtomicValue(initialValue: AnalyticsCategory()) + public static internal(set) var Analytics: AnalyticsCategory { + get { analyticsAtomic.get() } + set { analyticsAtomic.set(newValue) } + } /// - Tag: Amplify.API - public static internal(set) var API: APICategory = APICategory() + private static let apiAtomic = AtomicValue(initialValue: APICategory()) + public static internal(set) var API: APICategory { + get { apiAtomic.get() } + set { apiAtomic.set(newValue) } + } /// - Tag: Amplify.Auth - public static internal(set) var Auth = AuthCategory() + private static let authAtomic = AtomicValue(initialValue: AuthCategory()) + public static internal(set) var Auth: AuthCategory { + get { authAtomic.get() } + set { authAtomic.set(newValue) } + } /// - Tag: Amplify.DataStore - public static internal(set) var DataStore = DataStoreCategory() + private static let dataStoreAtomic = AtomicValue(initialValue: DataStoreCategory()) + public static internal(set) var DataStore: DataStoreCategory { + get { dataStoreAtomic.get() } + set { dataStoreAtomic.set(newValue) } + } /// - Tag: Amplify.Geo - public static internal(set) var Geo = GeoCategory() + private static let geoAtomic = AtomicValue(initialValue: GeoCategory()) + public static internal(set) var Geo: GeoCategory { + get { geoAtomic.get() } + set { geoAtomic.set(newValue) } + } /// - Tag: Amplify.Hub - public static internal(set) var Hub = HubCategory() + private static let hubAtomic = AtomicValue(initialValue: HubCategory()) + public static internal(set) var Hub: HubCategory { + get { hubAtomic.get() } + set { hubAtomic.set(newValue) } + } /// - Tag: Amplify.Notifications - public static internal(set) var Notifications = NotificationsCategory() + private static let notificationsAtomic = AtomicValue(initialValue: NotificationsCategory()) + public static internal(set) var Notifications: NotificationsCategory { + get { notificationsAtomic.get() } + set { notificationsAtomic.set(newValue) } + } /// - Tag: Amplify.Predictions - public static internal(set) var Predictions = PredictionsCategory() + private static let predictionsAtomic = AtomicValue(initialValue: PredictionsCategory()) + public static internal(set) var Predictions: PredictionsCategory { + get { predictionsAtomic.get() } + set { predictionsAtomic.set(newValue) } + } /// - Tag: Amplify.Storage - public static internal(set) var Storage = StorageCategory() + private static let storageAtomic = AtomicValue(initialValue: StorageCategory()) + public static internal(set) var Storage: StorageCategory { + get { storageAtomic.get() } + set { storageAtomic.set(newValue) } + } /// Special case category. We protect this with an AtomicValue because it is used by reset() /// methods during setup & teardown of tests diff --git a/Amplify/Categories/Auth/AuthCategory+UserBehavior.swift b/Amplify/Categories/Auth/AuthCategory+UserBehavior.swift index 6589e03083..ab51dcd49a 100644 --- a/Amplify/Categories/Auth/AuthCategory+UserBehavior.swift +++ b/Amplify/Categories/Auth/AuthCategory+UserBehavior.swift @@ -9,7 +9,10 @@ import Foundation extension AuthCategory: AuthCategoryUserBehavior { - public func getCurrentUser() async throws -> AuthUser { + /// Retrieve the current logged in user + /// + /// - Returns: Current logged in user + public func getCurrentUser() async throws -> any AuthUser { try await plugin.getCurrentUser() } diff --git a/Amplify/Categories/Auth/AuthCategoryUserBehavior.swift b/Amplify/Categories/Auth/AuthCategoryUserBehavior.swift index ad9d106eaf..04d3337d42 100644 --- a/Amplify/Categories/Auth/AuthCategoryUserBehavior.swift +++ b/Amplify/Categories/Auth/AuthCategoryUserBehavior.swift @@ -9,9 +9,10 @@ import Foundation public protocol AuthCategoryUserBehavior: AnyObject { - /// Returns the currently logged in user. + /// Retrieve the current logged in user /// - func getCurrentUser() async throws -> AuthUser + /// - Returns: Current logged in user + func getCurrentUser() async throws -> any AuthUser /// Fetch user attributes for the current user. /// diff --git a/Amplify/Categories/Auth/Models/AuthCodeDeliveryDetails.swift b/Amplify/Categories/Auth/Models/AuthCodeDeliveryDetails.swift index 1f73a5ec0e..b595b63eba 100644 --- a/Amplify/Categories/Auth/Models/AuthCodeDeliveryDetails.swift +++ b/Amplify/Categories/Auth/Models/AuthCodeDeliveryDetails.swift @@ -26,3 +26,5 @@ public struct AuthCodeDeliveryDetails { } extension AuthCodeDeliveryDetails: Equatable {} + +extension AuthCodeDeliveryDetails: Sendable {} diff --git a/Amplify/Categories/Auth/Models/AuthDevice.swift b/Amplify/Categories/Auth/Models/AuthDevice.swift index 269455efef..8b32dbe11f 100644 --- a/Amplify/Categories/Auth/Models/AuthDevice.swift +++ b/Amplify/Categories/Auth/Models/AuthDevice.swift @@ -8,7 +8,7 @@ import Foundation /// Device used by the user to sign in -public protocol AuthDevice { +public protocol AuthDevice: Sendable { /// Device id var id: String { get } diff --git a/Amplify/Categories/Auth/Models/AuthFactorType.swift b/Amplify/Categories/Auth/Models/AuthFactorType.swift index 9dce5a8bfc..e1aec8c345 100644 --- a/Amplify/Categories/Auth/Models/AuthFactorType.swift +++ b/Amplify/Categories/Auth/Models/AuthFactorType.swift @@ -25,3 +25,5 @@ public enum AuthFactorType: String { case webAuthn #endif } + +extension AuthFactorType: Sendable { } diff --git a/Amplify/Categories/Auth/Models/AuthSession.swift b/Amplify/Categories/Auth/Models/AuthSession.swift index b5f7c3c4c8..d7b44fe84d 100644 --- a/Amplify/Categories/Auth/Models/AuthSession.swift +++ b/Amplify/Categories/Auth/Models/AuthSession.swift @@ -8,7 +8,7 @@ import Foundation /// Defines the auth session behavior -public protocol AuthSession { +public protocol AuthSession: Sendable { /// True if the current user has signed in /// diff --git a/Amplify/Categories/Auth/Models/AuthSignInStep.swift b/Amplify/Categories/Auth/Models/AuthSignInStep.swift index bf7f75101a..ddf583773f 100644 --- a/Amplify/Categories/Auth/Models/AuthSignInStep.swift +++ b/Amplify/Categories/Auth/Models/AuthSignInStep.swift @@ -77,3 +77,5 @@ public enum AuthSignInStep { } extension AuthSignInStep: Equatable { } + +extension AuthSignInStep: Sendable { } diff --git a/Amplify/Categories/Auth/Models/AuthSignUpStep.swift b/Amplify/Categories/Auth/Models/AuthSignUpStep.swift index 861f6840cf..8c0afeb183 100644 --- a/Amplify/Categories/Auth/Models/AuthSignUpStep.swift +++ b/Amplify/Categories/Auth/Models/AuthSignUpStep.swift @@ -24,3 +24,5 @@ public enum AuthSignUpStep { /// Sign up is complete case done } + +extension AuthSignUpStep: Sendable { } diff --git a/Amplify/Categories/Auth/Models/AuthUpdateAttributeStep.swift b/Amplify/Categories/Auth/Models/AuthUpdateAttributeStep.swift index eb289e7eb7..a3af991702 100644 --- a/Amplify/Categories/Auth/Models/AuthUpdateAttributeStep.swift +++ b/Amplify/Categories/Auth/Models/AuthUpdateAttributeStep.swift @@ -18,3 +18,5 @@ public enum AuthUpdateAttributeStep { /// Update Attribute step is `done` when the update attribute flow is complete. case done } + +extension AuthUpdateAttributeStep: Sendable { } diff --git a/Amplify/Categories/Auth/Models/AuthUser.swift b/Amplify/Categories/Auth/Models/AuthUser.swift index c583cda7e6..da8d4eda27 100644 --- a/Amplify/Categories/Auth/Models/AuthUser.swift +++ b/Amplify/Categories/Auth/Models/AuthUser.swift @@ -6,7 +6,7 @@ // /// Defines the protocol for an auth user -public protocol AuthUser { +public protocol AuthUser: Sendable { /// User name of the auth user var username: String { get } diff --git a/Amplify/Categories/Auth/Models/AuthUserAttribute.swift b/Amplify/Categories/Auth/Models/AuthUserAttribute.swift index 7990ffe276..bdd7952395 100644 --- a/Amplify/Categories/Auth/Models/AuthUserAttribute.swift +++ b/Amplify/Categories/Auth/Models/AuthUserAttribute.swift @@ -90,3 +90,7 @@ public enum AuthUserAttributeKey { extension AuthUserAttributeKey: Hashable {} extension AuthUserAttributeKey: Equatable {} + +extension AuthUserAttributeKey: Sendable {} + +extension AuthUserAttribute: Sendable {} diff --git a/Amplify/Categories/Auth/Models/AuthWebAuthnCredential.swift b/Amplify/Categories/Auth/Models/AuthWebAuthnCredential.swift index f99be622d6..cf68f2e44d 100644 --- a/Amplify/Categories/Auth/Models/AuthWebAuthnCredential.swift +++ b/Amplify/Categories/Auth/Models/AuthWebAuthnCredential.swift @@ -35,9 +35,11 @@ public struct AuthListWebAuthnCredentialsResult { } } +extension AuthListWebAuthnCredentialsResult: Sendable { } + /// Defines a WebAuthn credential /// - Tag: AuthWebAuthnCredential -public protocol AuthWebAuthnCredential { +public protocol AuthWebAuthnCredential: Sendable { /// The credential's ID var credentialId: String { get } diff --git a/Amplify/Categories/Auth/Models/DeliveryDestination.swift b/Amplify/Categories/Auth/Models/DeliveryDestination.swift index 17a417d8ec..f45bdcc622 100644 --- a/Amplify/Categories/Auth/Models/DeliveryDestination.swift +++ b/Amplify/Categories/Auth/Models/DeliveryDestination.swift @@ -24,3 +24,5 @@ public enum DeliveryDestination { } extension DeliveryDestination: Equatable { } + +extension DeliveryDestination: Sendable { } diff --git a/Amplify/Categories/Auth/Models/MFAType.swift b/Amplify/Categories/Auth/Models/MFAType.swift index 4fa23c8a38..ce8b378a20 100644 --- a/Amplify/Categories/Auth/Models/MFAType.swift +++ b/Amplify/Categories/Auth/Models/MFAType.swift @@ -16,3 +16,5 @@ public enum MFAType: String { /// Email Service linked with an email case email } + +extension MFAType: Sendable { } diff --git a/Amplify/Categories/Auth/Models/TOTPSetupDetails.swift b/Amplify/Categories/Auth/Models/TOTPSetupDetails.swift index 7f84610180..165912706d 100644 --- a/Amplify/Categories/Auth/Models/TOTPSetupDetails.swift +++ b/Amplify/Categories/Auth/Models/TOTPSetupDetails.swift @@ -42,3 +42,5 @@ public struct TOTPSetupDetails { } extension TOTPSetupDetails: Equatable { } + +extension TOTPSetupDetails: Sendable { } diff --git a/Amplify/Categories/Auth/Request/AuthAssociateWebAuthnCredentialRequest.swift b/Amplify/Categories/Auth/Request/AuthAssociateWebAuthnCredentialRequest.swift index de2f4e547b..b410b8546c 100644 --- a/Amplify/Categories/Auth/Request/AuthAssociateWebAuthnCredentialRequest.swift +++ b/Amplify/Categories/Auth/Request/AuthAssociateWebAuthnCredentialRequest.swift @@ -37,4 +37,6 @@ public extension AuthAssociateWebAuthnCredentialRequest { } } } + +extension AuthAssociateWebAuthnCredentialRequest.Options: @unchecked Sendable { } #endif diff --git a/Amplify/Categories/Auth/Request/AuthAttributeResendConfirmationCodeRequest.swift b/Amplify/Categories/Auth/Request/AuthAttributeResendConfirmationCodeRequest.swift index 4c514c97fb..2718847043 100644 --- a/Amplify/Categories/Auth/Request/AuthAttributeResendConfirmationCodeRequest.swift +++ b/Amplify/Categories/Auth/Request/AuthAttributeResendConfirmationCodeRequest.swift @@ -39,3 +39,5 @@ public extension AuthAttributeResendConfirmationCodeRequest { } } } + +extension AuthAttributeResendConfirmationCodeRequest.Options: @unchecked Sendable { } diff --git a/Amplify/Categories/Auth/Request/AuthAttributeSendVerificationCodeRequest.swift b/Amplify/Categories/Auth/Request/AuthAttributeSendVerificationCodeRequest.swift index ec5f0a4683..4af430c68d 100644 --- a/Amplify/Categories/Auth/Request/AuthAttributeSendVerificationCodeRequest.swift +++ b/Amplify/Categories/Auth/Request/AuthAttributeSendVerificationCodeRequest.swift @@ -39,3 +39,5 @@ public extension AuthSendUserAttributeVerificationCodeRequest { } } } + +extension AuthSendUserAttributeVerificationCodeRequest.Options: @unchecked Sendable { } diff --git a/Amplify/Categories/Auth/Request/AuthAutoSignInRequest.swift b/Amplify/Categories/Auth/Request/AuthAutoSignInRequest.swift index c7cd21ef40..cbd5a312a9 100644 --- a/Amplify/Categories/Auth/Request/AuthAutoSignInRequest.swift +++ b/Amplify/Categories/Auth/Request/AuthAutoSignInRequest.swift @@ -32,3 +32,5 @@ public extension AuthAutoSignInRequest { } } } + +extension AuthAutoSignInRequest.Options: @unchecked Sendable { } diff --git a/Amplify/Categories/Auth/Request/AuthChangePasswordRequest.swift b/Amplify/Categories/Auth/Request/AuthChangePasswordRequest.swift index d385b95d52..cc507f85fe 100644 --- a/Amplify/Categories/Auth/Request/AuthChangePasswordRequest.swift +++ b/Amplify/Categories/Auth/Request/AuthChangePasswordRequest.swift @@ -42,3 +42,5 @@ public extension AuthChangePasswordRequest { } } } + +extension AuthChangePasswordRequest.Options: @unchecked Sendable { } diff --git a/Amplify/Categories/Auth/Request/AuthConfirmResetPasswordRequest.swift b/Amplify/Categories/Auth/Request/AuthConfirmResetPasswordRequest.swift index c4e0be2e19..ad74cd8992 100644 --- a/Amplify/Categories/Auth/Request/AuthConfirmResetPasswordRequest.swift +++ b/Amplify/Categories/Auth/Request/AuthConfirmResetPasswordRequest.swift @@ -47,3 +47,5 @@ public extension AuthConfirmResetPasswordRequest { } } } + +extension AuthConfirmResetPasswordRequest.Options: @unchecked Sendable { } diff --git a/Amplify/Categories/Auth/Request/AuthConfirmSignInRequest.swift b/Amplify/Categories/Auth/Request/AuthConfirmSignInRequest.swift index cff8e863dc..72d0316d99 100644 --- a/Amplify/Categories/Auth/Request/AuthConfirmSignInRequest.swift +++ b/Amplify/Categories/Auth/Request/AuthConfirmSignInRequest.swift @@ -52,3 +52,5 @@ public extension AuthConfirmSignInRequest { #endif } } + +extension AuthConfirmSignInRequest.Options: @unchecked Sendable { } diff --git a/Amplify/Categories/Auth/Request/AuthConfirmSignUpRequest.swift b/Amplify/Categories/Auth/Request/AuthConfirmSignUpRequest.swift index 464afab0da..de15a90445 100644 --- a/Amplify/Categories/Auth/Request/AuthConfirmSignUpRequest.swift +++ b/Amplify/Categories/Auth/Request/AuthConfirmSignUpRequest.swift @@ -40,3 +40,5 @@ public extension AuthConfirmSignUpRequest { } } } + +extension AuthConfirmSignUpRequest.Options: @unchecked Sendable { } diff --git a/Amplify/Categories/Auth/Request/AuthConfirmUserAttributeRequest.swift b/Amplify/Categories/Auth/Request/AuthConfirmUserAttributeRequest.swift index 57650da6cb..de40900ff8 100644 --- a/Amplify/Categories/Auth/Request/AuthConfirmUserAttributeRequest.swift +++ b/Amplify/Categories/Auth/Request/AuthConfirmUserAttributeRequest.swift @@ -42,3 +42,5 @@ public extension AuthConfirmUserAttributeRequest { } } } + +extension AuthConfirmUserAttributeRequest.Options: @unchecked Sendable { } diff --git a/Amplify/Categories/Auth/Request/AuthDeleteWebAuthnCredentialRequest.swift b/Amplify/Categories/Auth/Request/AuthDeleteWebAuthnCredentialRequest.swift index edbe68105d..a15d755ff3 100644 --- a/Amplify/Categories/Auth/Request/AuthDeleteWebAuthnCredentialRequest.swift +++ b/Amplify/Categories/Auth/Request/AuthDeleteWebAuthnCredentialRequest.swift @@ -36,3 +36,5 @@ public extension AuthDeleteWebAuthnCredentialRequest { } } } + +extension AuthDeleteWebAuthnCredentialRequest.Options: @unchecked Sendable { } diff --git a/Amplify/Categories/Auth/Request/AuthFetchDevicesRequest.swift b/Amplify/Categories/Auth/Request/AuthFetchDevicesRequest.swift index 65a9aaa3f7..eb7369a61f 100644 --- a/Amplify/Categories/Auth/Request/AuthFetchDevicesRequest.swift +++ b/Amplify/Categories/Auth/Request/AuthFetchDevicesRequest.swift @@ -32,3 +32,5 @@ public extension AuthFetchDevicesRequest { } } } + +extension AuthFetchDevicesRequest.Options: @unchecked Sendable { } diff --git a/Amplify/Categories/Auth/Request/AuthFetchSessionRequest.swift b/Amplify/Categories/Auth/Request/AuthFetchSessionRequest.swift index debdb449e4..5f02a7c14d 100644 --- a/Amplify/Categories/Auth/Request/AuthFetchSessionRequest.swift +++ b/Amplify/Categories/Auth/Request/AuthFetchSessionRequest.swift @@ -42,6 +42,8 @@ public extension AuthFetchSessionRequest { } } +extension AuthFetchSessionRequest.Options: @unchecked Sendable { } + extension AuthFetchSessionRequest.Options { public static func forceRefresh() -> AuthFetchSessionRequest.Options { return AuthFetchSessionRequest.Options(forceRefresh: true) diff --git a/Amplify/Categories/Auth/Request/AuthFetchUserAttributesRequest.swift b/Amplify/Categories/Auth/Request/AuthFetchUserAttributesRequest.swift index 12cb54a3b5..ea1131759f 100644 --- a/Amplify/Categories/Auth/Request/AuthFetchUserAttributesRequest.swift +++ b/Amplify/Categories/Auth/Request/AuthFetchUserAttributesRequest.swift @@ -32,3 +32,5 @@ public extension AuthFetchUserAttributesRequest { } } } + +extension AuthFetchUserAttributesRequest.Options: @unchecked Sendable { } diff --git a/Amplify/Categories/Auth/Request/AuthForgetDeviceRequest.swift b/Amplify/Categories/Auth/Request/AuthForgetDeviceRequest.swift index 530c0e1f4b..ab1c6f5eb5 100644 --- a/Amplify/Categories/Auth/Request/AuthForgetDeviceRequest.swift +++ b/Amplify/Categories/Auth/Request/AuthForgetDeviceRequest.swift @@ -39,3 +39,5 @@ public extension AuthForgetDeviceRequest { } } } + +extension AuthForgetDeviceRequest.Options: @unchecked Sendable { } diff --git a/Amplify/Categories/Auth/Request/AuthListWebAuthnCredentialsRequest.swift b/Amplify/Categories/Auth/Request/AuthListWebAuthnCredentialsRequest.swift index 4d97431782..b0f4ea0126 100644 --- a/Amplify/Categories/Auth/Request/AuthListWebAuthnCredentialsRequest.swift +++ b/Amplify/Categories/Auth/Request/AuthListWebAuthnCredentialsRequest.swift @@ -60,3 +60,5 @@ public extension AuthListWebAuthnCredentialsRequest { } } } + +extension AuthListWebAuthnCredentialsRequest.Options: @unchecked Sendable { } diff --git a/Amplify/Categories/Auth/Request/AuthRememberDeviceRequest.swift b/Amplify/Categories/Auth/Request/AuthRememberDeviceRequest.swift index 3da839d0d9..4c3001b2ed 100644 --- a/Amplify/Categories/Auth/Request/AuthRememberDeviceRequest.swift +++ b/Amplify/Categories/Auth/Request/AuthRememberDeviceRequest.swift @@ -32,3 +32,5 @@ public extension AuthRememberDeviceRequest { } } } + +extension AuthRememberDeviceRequest.Options: @unchecked Sendable { } diff --git a/Amplify/Categories/Auth/Request/AuthResendSignUpCodeRequest.swift b/Amplify/Categories/Auth/Request/AuthResendSignUpCodeRequest.swift index ff9af6eb6b..eb44c71cfd 100644 --- a/Amplify/Categories/Auth/Request/AuthResendSignUpCodeRequest.swift +++ b/Amplify/Categories/Auth/Request/AuthResendSignUpCodeRequest.swift @@ -36,3 +36,5 @@ public extension AuthResendSignUpCodeRequest { } } } + +extension AuthResendSignUpCodeRequest.Options: @unchecked Sendable { } diff --git a/Amplify/Categories/Auth/Request/AuthResetPasswordRequest.swift b/Amplify/Categories/Auth/Request/AuthResetPasswordRequest.swift index 79038d6406..c21f260a3f 100644 --- a/Amplify/Categories/Auth/Request/AuthResetPasswordRequest.swift +++ b/Amplify/Categories/Auth/Request/AuthResetPasswordRequest.swift @@ -36,3 +36,5 @@ public extension AuthResetPasswordRequest { } } } + +extension AuthResetPasswordRequest.Options: @unchecked Sendable { } diff --git a/Amplify/Categories/Auth/Request/AuthSignInRequest.swift b/Amplify/Categories/Auth/Request/AuthSignInRequest.swift index 057babd76d..1e8fa58f74 100644 --- a/Amplify/Categories/Auth/Request/AuthSignInRequest.swift +++ b/Amplify/Categories/Auth/Request/AuthSignInRequest.swift @@ -54,3 +54,5 @@ public extension AuthSignInRequest { #endif } } + +extension AuthSignInRequest.Options: @unchecked Sendable { } diff --git a/Amplify/Categories/Auth/Request/AuthSignOutRequest.swift b/Amplify/Categories/Auth/Request/AuthSignOutRequest.swift index fd3343e750..59aa316f1d 100644 --- a/Amplify/Categories/Auth/Request/AuthSignOutRequest.swift +++ b/Amplify/Categories/Auth/Request/AuthSignOutRequest.swift @@ -54,6 +54,8 @@ public extension AuthSignOutRequest { } +extension AuthSignOutRequest.Options: @unchecked Sendable { } + #if os(iOS) || os(macOS) || os(visionOS) extension AuthSignOutRequest.Options { public static func presentationAnchor(_ anchor: AuthUIPresentationAnchor) -> AuthSignOutRequest.Options { diff --git a/Amplify/Categories/Auth/Request/AuthSignUpRequest.swift b/Amplify/Categories/Auth/Request/AuthSignUpRequest.swift index e8145e454f..a145a4abea 100644 --- a/Amplify/Categories/Auth/Request/AuthSignUpRequest.swift +++ b/Amplify/Categories/Auth/Request/AuthSignUpRequest.swift @@ -45,3 +45,5 @@ public extension AuthSignUpRequest { } } } + +extension AuthSignUpRequest.Options: @unchecked Sendable { } diff --git a/Amplify/Categories/Auth/Request/AuthUpdateUserAttributeRequest.swift b/Amplify/Categories/Auth/Request/AuthUpdateUserAttributeRequest.swift index be3b978526..dce07808af 100644 --- a/Amplify/Categories/Auth/Request/AuthUpdateUserAttributeRequest.swift +++ b/Amplify/Categories/Auth/Request/AuthUpdateUserAttributeRequest.swift @@ -37,3 +37,5 @@ public extension AuthUpdateUserAttributeRequest { } } } + +extension AuthUpdateUserAttributeRequest.Options: @unchecked Sendable { } diff --git a/Amplify/Categories/Auth/Request/AuthUpdateUserAttributesRequest.swift b/Amplify/Categories/Auth/Request/AuthUpdateUserAttributesRequest.swift index 32a87a794d..459e3aeac2 100644 --- a/Amplify/Categories/Auth/Request/AuthUpdateUserAttributesRequest.swift +++ b/Amplify/Categories/Auth/Request/AuthUpdateUserAttributesRequest.swift @@ -37,3 +37,5 @@ public extension AuthUpdateUserAttributesRequest { } } } + +extension AuthUpdateUserAttributesRequest.Options: @unchecked Sendable { } diff --git a/Amplify/Categories/Auth/Request/AuthWebUISignInRequest.swift b/Amplify/Categories/Auth/Request/AuthWebUISignInRequest.swift index 1946770d02..767ceb8212 100644 --- a/Amplify/Categories/Auth/Request/AuthWebUISignInRequest.swift +++ b/Amplify/Categories/Auth/Request/AuthWebUISignInRequest.swift @@ -50,4 +50,6 @@ public extension AuthWebUISignInRequest { } } } + +extension AuthWebUISignInRequest.Options: @unchecked Sendable { } #endif diff --git a/Amplify/Categories/Auth/Request/VerifyTOTPSetupRequest.swift b/Amplify/Categories/Auth/Request/VerifyTOTPSetupRequest.swift index 4a03d3ff21..b4dcb31f10 100644 --- a/Amplify/Categories/Auth/Request/VerifyTOTPSetupRequest.swift +++ b/Amplify/Categories/Auth/Request/VerifyTOTPSetupRequest.swift @@ -38,3 +38,5 @@ public extension VerifyTOTPSetupRequest { } } } + +extension VerifyTOTPSetupRequest.Options: @unchecked Sendable { } diff --git a/Amplify/Categories/Auth/Result/AuthResetPasswordResult.swift b/Amplify/Categories/Auth/Result/AuthResetPasswordResult.swift index e8550776d5..0c4ab4de2f 100644 --- a/Amplify/Categories/Auth/Result/AuthResetPasswordResult.swift +++ b/Amplify/Categories/Auth/Result/AuthResetPasswordResult.swift @@ -26,6 +26,8 @@ public struct AuthResetPasswordResult { extension AuthResetPasswordResult: Equatable {} +extension AuthResetPasswordResult: Sendable {} + /// The next step in Auth.resetPassword api public enum AuthResetPasswordStep { @@ -42,3 +44,5 @@ public enum AuthResetPasswordStep { } extension AuthResetPasswordStep: Equatable {} + +extension AuthResetPasswordStep: Sendable {} diff --git a/Amplify/Categories/Auth/Result/AuthSignInResult.swift b/Amplify/Categories/Auth/Result/AuthSignInResult.swift index 836c7fbd6f..2bd5f59bc5 100644 --- a/Amplify/Categories/Auth/Result/AuthSignInResult.swift +++ b/Amplify/Categories/Auth/Result/AuthSignInResult.swift @@ -30,3 +30,5 @@ public struct AuthSignInResult { self.nextStep = nextStep } } + +extension AuthSignInResult: Sendable { } diff --git a/Amplify/Categories/Auth/Result/AuthSignOutResult.swift b/Amplify/Categories/Auth/Result/AuthSignOutResult.swift index d5d467653a..31e0ca8e64 100644 --- a/Amplify/Categories/Auth/Result/AuthSignOutResult.swift +++ b/Amplify/Categories/Auth/Result/AuthSignOutResult.swift @@ -7,6 +7,6 @@ import Foundation -public protocol AuthSignOutResult { +public protocol AuthSignOutResult: Sendable { } diff --git a/Amplify/Categories/Auth/Result/AuthSignUpResult.swift b/Amplify/Categories/Auth/Result/AuthSignUpResult.swift index b63154dda9..86050a8bf3 100644 --- a/Amplify/Categories/Auth/Result/AuthSignUpResult.swift +++ b/Amplify/Categories/Auth/Result/AuthSignUpResult.swift @@ -33,3 +33,5 @@ public struct AuthSignUpResult { self.userID = userID } } + +extension AuthSignUpResult: Sendable { } diff --git a/Amplify/Categories/Auth/Result/AuthUpdateAttributeResult.swift b/Amplify/Categories/Auth/Result/AuthUpdateAttributeResult.swift index 26338ac62c..fd049a7922 100644 --- a/Amplify/Categories/Auth/Result/AuthUpdateAttributeResult.swift +++ b/Amplify/Categories/Auth/Result/AuthUpdateAttributeResult.swift @@ -22,3 +22,5 @@ public struct AuthUpdateAttributeResult { self.nextStep = nextStep } } + +extension AuthUpdateAttributeResult: Sendable { } diff --git a/Amplify/Categories/Storage/Operation/Request/StorageDownloadDataRequest.swift b/Amplify/Categories/Storage/Operation/Request/StorageDownloadDataRequest.swift index 73cf9f57fc..dae3a36812 100644 --- a/Amplify/Categories/Storage/Operation/Request/StorageDownloadDataRequest.swift +++ b/Amplify/Categories/Storage/Operation/Request/StorageDownloadDataRequest.swift @@ -128,3 +128,5 @@ public extension StorageDownloadDataRequest { } } } + +extension StorageDownloadDataRequest.Options: @unchecked Sendable { } diff --git a/Amplify/Categories/Storage/Operation/Request/StorageDownloadFileRequest.swift b/Amplify/Categories/Storage/Operation/Request/StorageDownloadFileRequest.swift index cc68d539bd..3bc76e85c7 100644 --- a/Amplify/Categories/Storage/Operation/Request/StorageDownloadFileRequest.swift +++ b/Amplify/Categories/Storage/Operation/Request/StorageDownloadFileRequest.swift @@ -116,3 +116,5 @@ public extension StorageDownloadFileRequest { } } } + +extension StorageDownloadFileRequest.Options: @unchecked Sendable { } diff --git a/Amplify/Categories/Storage/Operation/Request/StorageGetURLRequest.swift b/Amplify/Categories/Storage/Operation/Request/StorageGetURLRequest.swift index c86db0b4ba..0cd51ae9f6 100644 --- a/Amplify/Categories/Storage/Operation/Request/StorageGetURLRequest.swift +++ b/Amplify/Categories/Storage/Operation/Request/StorageGetURLRequest.swift @@ -128,3 +128,5 @@ public extension StorageGetURLRequest { } } } + +extension StorageGetURLRequest.Options: @unchecked Sendable { } diff --git a/Amplify/Categories/Storage/Operation/Request/StorageListRequest.swift b/Amplify/Categories/Storage/Operation/Request/StorageListRequest.swift index 0c66976aeb..469ad71d8f 100644 --- a/Amplify/Categories/Storage/Operation/Request/StorageListRequest.swift +++ b/Amplify/Categories/Storage/Operation/Request/StorageListRequest.swift @@ -169,3 +169,6 @@ public extension StorageListRequest.Options { } } } + +extension StorageListRequest.Options: @unchecked Sendable { } +extension StorageListRequest.Options.SubpathStrategy: Sendable { } diff --git a/Amplify/Categories/Storage/Operation/Request/StorageRemoveRequest.swift b/Amplify/Categories/Storage/Operation/Request/StorageRemoveRequest.swift index 39b10e099d..33724d2148 100644 --- a/Amplify/Categories/Storage/Operation/Request/StorageRemoveRequest.swift +++ b/Amplify/Categories/Storage/Operation/Request/StorageRemoveRequest.swift @@ -89,3 +89,5 @@ public extension StorageRemoveRequest { } } } + +extension StorageRemoveRequest.Options: @unchecked Sendable { } diff --git a/Amplify/Categories/Storage/Operation/Request/StorageUploadDataRequest.swift b/Amplify/Categories/Storage/Operation/Request/StorageUploadDataRequest.swift index 174aa06fc9..2fdc352c61 100644 --- a/Amplify/Categories/Storage/Operation/Request/StorageUploadDataRequest.swift +++ b/Amplify/Categories/Storage/Operation/Request/StorageUploadDataRequest.swift @@ -139,3 +139,5 @@ public extension StorageUploadDataRequest { } } } + +extension StorageUploadDataRequest.Options: @unchecked Sendable { } diff --git a/Amplify/Categories/Storage/Operation/Request/StorageUploadFileRequest.swift b/Amplify/Categories/Storage/Operation/Request/StorageUploadFileRequest.swift index b7c2e73830..88ab15da89 100644 --- a/Amplify/Categories/Storage/Operation/Request/StorageUploadFileRequest.swift +++ b/Amplify/Categories/Storage/Operation/Request/StorageUploadFileRequest.swift @@ -136,3 +136,5 @@ public extension StorageUploadFileRequest { } } } + +extension StorageUploadFileRequest.Options: @unchecked Sendable { } diff --git a/Amplify/Categories/Storage/Result/StorageListResult.swift b/Amplify/Categories/Storage/Result/StorageListResult.swift index 1adee4ea08..31b82903c8 100644 --- a/Amplify/Categories/Storage/Result/StorageListResult.swift +++ b/Amplify/Categories/Storage/Result/StorageListResult.swift @@ -49,6 +49,8 @@ public struct StorageListResult { public let nextToken: String? } +extension StorageListResult: Sendable { } + extension StorageListResult { /// - Tag: StorageListResultItem @@ -122,3 +124,5 @@ extension StorageListResult { } } } + +extension StorageListResult.Item: Sendable { } diff --git a/Amplify/Core/Support/AmplifyTask+OperationTaskAdapters.swift b/Amplify/Core/Support/AmplifyTask+OperationTaskAdapters.swift index 50e505bce9..2aa29e544f 100644 --- a/Amplify/Core/Support/AmplifyTask+OperationTaskAdapters.swift +++ b/Amplify/Core/Support/AmplifyTask+OperationTaskAdapters.swift @@ -12,7 +12,7 @@ import Combine public class AmplifyOperationTaskAdapter: AmplifyTask { + Failure: AmplifyError>: AmplifyTask, @unchecked Sendable { let operation: AmplifyOperation let childTask: ChildTask var resultToken: UnsubscribeToken? @@ -67,7 +67,7 @@ public class AmplifyOperationTaskAdapter: AmplifyTask, AmplifyInProcessReportingTask { + Failure: AmplifyError>: AmplifyTask, AmplifyInProcessReportingTask, @unchecked Sendable { let operation: AmplifyInProcessReportingOperation let childTask: ChildTask var resultToken: UnsubscribeToken? diff --git a/Amplify/Core/Support/AtomicValue.swift b/Amplify/Core/Support/AtomicValue.swift index 3664b17377..5b78b22d16 100644 --- a/Amplify/Core/Support/AtomicValue.swift +++ b/Amplify/Core/Support/AtomicValue.swift @@ -8,7 +8,7 @@ import Foundation /// A class that wraps access to its underlying value with an NSLocking instance. -public final class AtomicValue { +public final class AtomicValue: @unchecked Sendable { let lock: NSLocking var value: Value diff --git a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/ClientBehavior/AWSCognitoAuthPlugin+UserBehavior.swift b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/ClientBehavior/AWSCognitoAuthPlugin+UserBehavior.swift index 21df88d96b..a41a0432d2 100644 --- a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/ClientBehavior/AWSCognitoAuthPlugin+UserBehavior.swift +++ b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/ClientBehavior/AWSCognitoAuthPlugin+UserBehavior.swift @@ -98,7 +98,7 @@ public extension AWSCognitoAuthPlugin { } } - func getCurrentUser() async throws -> AuthUser { + func getCurrentUser() async throws -> any AuthUser { let taskHelper = AWSAuthTaskHelper(authStateMachine: authStateMachine) return try await taskHelper.getCurrentUser() } diff --git a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/AWSAuthCognitoSession.swift b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/AWSAuthCognitoSession.swift index 489d32b574..1156a4e650 100644 --- a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/AWSAuthCognitoSession.swift +++ b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/AWSAuthCognitoSession.swift @@ -165,3 +165,5 @@ extension AWSAuthCognitoSession: CustomDebugStringConvertible { (debugDictionary as AnyObject).description } } + +extension AWSAuthCognitoSession: Sendable { } diff --git a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/AWSAuthDevice.swift b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/AWSAuthDevice.swift index b2ad2fbedd..bef6e3862d 100644 --- a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/AWSAuthDevice.swift +++ b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/AWSAuthDevice.swift @@ -42,3 +42,5 @@ public struct AWSAuthDevice: AuthDevice { self.lastModifiedDate = lastModifiedDate } } + +extension AWSAuthDevice: Sendable { } diff --git a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/AWSAuthUser.swift b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/AWSAuthUser.swift index 07172c8da2..b1968c2748 100644 --- a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/AWSAuthUser.swift +++ b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/AWSAuthUser.swift @@ -20,3 +20,5 @@ public struct AWSAuthUser: AuthUser { public var userId: String } + +extension AWSAuthUser: Sendable { } diff --git a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/AWSCognitoSignOutResult.swift b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/AWSCognitoSignOutResult.swift index f8786e6353..a78bee9271 100644 --- a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/AWSCognitoSignOutResult.swift +++ b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/AWSCognitoSignOutResult.swift @@ -26,16 +26,24 @@ public enum AWSCognitoSignOutResult: AuthSignOutResult { case failed(AuthError) } +extension AWSCognitoSignOutResult: Sendable { } + public struct AWSCognitoRevokeTokenError { public let refreshToken: String public let error: AuthError } +extension AWSCognitoRevokeTokenError: Sendable { } + public struct AWSCognitoGlobalSignOutError { public let accessToken: String public let error: AuthError } +extension AWSCognitoGlobalSignOutError: Sendable { } + public struct AWSCognitoHostedUIError { public let error: AuthError } + +extension AWSCognitoHostedUIError: Sendable { } diff --git a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/AWSCognitoWebAuthnCredential.swift b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/AWSCognitoWebAuthnCredential.swift index ac328f45c4..a8f52b8d7a 100644 --- a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/AWSCognitoWebAuthnCredential.swift +++ b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/AWSCognitoWebAuthnCredential.swift @@ -26,3 +26,5 @@ public struct AWSCognitoWebAuthnCredential: AuthWebAuthnCredential { self.relyingPartyId = relyingPartyId } } + +extension AWSCognitoWebAuthnCredential: Sendable { } diff --git a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/AuthFlowType.swift b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/AuthFlowType.swift index b352e873c5..088c24307d 100644 --- a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/AuthFlowType.swift +++ b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/AuthFlowType.swift @@ -197,3 +197,5 @@ extension AuthFlowType { } } } + +extension AuthFlowType: Sendable { } diff --git a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/FederateToIdentityPoolResult.swift b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/FederateToIdentityPoolResult.swift index 63cca69272..d72fae0ef7 100644 --- a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/FederateToIdentityPoolResult.swift +++ b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/FederateToIdentityPoolResult.swift @@ -15,3 +15,5 @@ public struct FederateToIdentityPoolResult { public let identityId: String } + +extension FederateToIdentityPoolResult: Sendable { } diff --git a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/MFAPreference.swift b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/MFAPreference.swift index d2edb58d0f..04298e732b 100644 --- a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/MFAPreference.swift +++ b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/MFAPreference.swift @@ -25,6 +25,8 @@ public enum MFAPreference { } +extension MFAPreference: Sendable { } + extension MFAPreference { func smsSetting(isCurrentlyPreferred: Bool = false) -> CognitoIdentityProviderClientTypes.SMSMfaSettingsType { diff --git a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/UserMFAPreference.swift b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/UserMFAPreference.swift index a3724c25aa..27cf403f0a 100644 --- a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/UserMFAPreference.swift +++ b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Models/UserMFAPreference.swift @@ -17,3 +17,5 @@ public struct UserMFAPreference { public let preferred: MFAType? } + +extension UserMFAPreference: Sendable { } diff --git a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Task/Helpers/AWSAuthTaskHelper.swift b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Task/Helpers/AWSAuthTaskHelper.swift index 0b31d5b768..1e0d481e3c 100644 --- a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Task/Helpers/AWSAuthTaskHelper.swift +++ b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Task/Helpers/AWSAuthTaskHelper.swift @@ -76,7 +76,7 @@ class AWSAuthTaskHelper: DefaultLogger { return tokens.accessToken } - func getCurrentUser() async throws -> AuthUser { + func getCurrentUser() async throws -> any AuthUser { await didStateMachineConfigured() let authState = await authStateMachine.currentState diff --git a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Task/SetUpTOTPTask.swift b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Task/SetUpTOTPTask.swift index 96c59dc9f3..f775d48ae3 100644 --- a/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Task/SetUpTOTPTask.swift +++ b/AmplifyPlugins/Auth/Sources/AWSCognitoAuthPlugin/Task/SetUpTOTPTask.swift @@ -52,7 +52,7 @@ class SetUpTOTPTask: AuthSetUpTOTPTask, DefaultLogger { } // Get the current user for passing in the result, so that TOTP URI could constructed - let authUser: AuthUser + let authUser: any AuthUser let currentState = await authStateMachine.currentState if case .configured(let authNState, _, _) = currentState, diff --git a/AmplifyTestCommon/Mocks/MockAuthCategoryPlugin.swift b/AmplifyTestCommon/Mocks/MockAuthCategoryPlugin.swift index 195c88178a..5c1fcf0ac1 100644 --- a/AmplifyTestCommon/Mocks/MockAuthCategoryPlugin.swift +++ b/AmplifyTestCommon/Mocks/MockAuthCategoryPlugin.swift @@ -10,7 +10,7 @@ import Amplify class MockAuthCategoryPlugin: MessageReporter, AuthCategoryPlugin { - public func getCurrentUser() async throws -> AuthUser { + public func getCurrentUser() async throws -> any AuthUser { fatalError() } From d68babe1aac182296246c9b04b6f5670741daf5d Mon Sep 17 00:00:00 2001 From: Harshdeep Singh <6162866+harsh62@users.noreply.github.com> Date: Thu, 12 Jun 2025 01:50:16 -0400 Subject: [PATCH 3/3] unit test fix --- .../CognitoASFTests/CognitoUserPoolASFTests.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AmplifyPlugins/Auth/Tests/AWSCognitoAuthPluginUnitTests/CognitoASFTests/CognitoUserPoolASFTests.swift b/AmplifyPlugins/Auth/Tests/AWSCognitoAuthPluginUnitTests/CognitoASFTests/CognitoUserPoolASFTests.swift index b5dbf122cf..8374f857d4 100644 --- a/AmplifyPlugins/Auth/Tests/AWSCognitoAuthPluginUnitTests/CognitoASFTests/CognitoUserPoolASFTests.swift +++ b/AmplifyPlugins/Auth/Tests/AWSCognitoAuthPluginUnitTests/CognitoASFTests/CognitoUserPoolASFTests.swift @@ -24,7 +24,7 @@ class CognitoUserPoolASFTests: XCTestCase { /// Then: A non-empty string is returned func testUserContextData_shouldReturnData() async throws { let deviceInfo = await ASFDeviceInfo(id: "mockedDevice") - let result = try userPool.userContextData( + let result = try await userPool.userContextData( for: "TestUser", deviceInfo: deviceInfo, appInfo: ASFAppInfo(),