// // Copyright Amazon.com Inc. or its affiliates. // All Rights Reserved. // // SPDX-License-Identifier: Apache-2.0 // import Foundation // MARK: - Result/Value - public protocol InternalTaskResult { associatedtype Success associatedtype Failure: AmplifyError typealias TaskResult = Result var result: TaskResult { get async } } public protocol InternalTaskValue { associatedtype Success associatedtype Failure: AmplifyError var value: Success { get async throws } } // MARK: - Sequences - public protocol InternalTaskInProcess { associatedtype InProcess: Sendable var inProcess: AmplifyAsyncSequence { get async } } public struct InternalTaskAsyncSequenceContext { public let bufferingPolicy: AsyncStream.Continuation.BufferingPolicy public var weakSequenceRef: WeakAmplifyAsyncSequenceRef public var task: Task? public var sequence: AmplifyAsyncSequence? { get { weakSequenceRef.value } set { weakSequenceRef.value = newValue } } public init(bufferingPolicy: AsyncStream.Continuation.BufferingPolicy = .unbounded) { self.bufferingPolicy = bufferingPolicy self.weakSequenceRef = WeakAmplifyAsyncSequenceRef(nil) } } public protocol InternalTaskAsyncSequence: AnyObject { associatedtype InProcess: Sendable var context: InternalTaskAsyncSequenceContext { get set } var sequence: AmplifyAsyncSequence { get } } public struct InternalTaskAsyncThrowingSequenceContext { public let bufferingPolicy: AsyncThrowingStream.Continuation.BufferingPolicy public var weakSequenceRef: WeakAmplifyAsyncThrowingSequenceRef public var task: Task? public var sequence: AmplifyAsyncThrowingSequence? { get { weakSequenceRef.value } set { weakSequenceRef.value = newValue } } public init(bufferingPolicy: AsyncThrowingStream.Continuation.BufferingPolicy = .unbounded) { self.bufferingPolicy = bufferingPolicy self.weakSequenceRef = WeakAmplifyAsyncThrowingSequenceRef(nil) } } public protocol InternalTaskAsyncThrowingSequence: AnyObject { associatedtype InProcess: Sendable var context: InternalTaskAsyncThrowingSequenceContext { get set } var sequence: AmplifyAsyncThrowingSequence { get } } public protocol InternalTaskChannel { associatedtype InProcess: Sendable /// Sends element to sequence /// - Parameter element: element func send(_ element: InProcess) /// Terminates sequence func finish() } public protocol InternalTaskThrowingChannel { associatedtype InProcess: Sendable /// Sends element to sequence /// - Parameter element: element func send(_ element: InProcess) /// Fails sequence /// - Parameter error: error func fail(_ error: Error) /// Terminates sequence func finish() } // MARK: - Control - public protocol InternalTaskRunner: AnyObject, AmplifyCancellable { associatedtype Request: AmplifyOperationRequest var request: Request { get } /// Run task func run() async throws } public protocol InternalTaskController { func pause() func resume() func cancel() } // MARK: - Hub Support - public protocol InternalTaskIdentifiable { associatedtype Request: AmplifyOperationRequest var id: UUID { get } var request: Request { get } var categoryType: CategoryType { get } var eventName: HubPayloadEventName { get } } public protocol InternalTaskHubResult { associatedtype Request: AmplifyOperationRequest associatedtype Success associatedtype Failure: AmplifyError typealias OperationResult = Result typealias ResultListener = (OperationResult) -> Void /// Subscribe for result /// - Parameter resultListener: result listener /// - Returns: unsubscribe token func subscribe(resultListener: @escaping ResultListener) -> UnsubscribeToken /// Unsubscribe from Hub channel /// - Parameter token: unsubscribe token func unsubscribe(_ token: UnsubscribeToken) /// Dispatch result to Hub channel /// - Parameter result: result func dispatch(result: OperationResult) } public protocol InternalTaskHubInProcess { associatedtype Request: AmplifyOperationRequest associatedtype InProcess: Sendable typealias InProcessListener = (InProcess) -> Void /// Subscribe for result /// - Parameter resultListener: result listener /// - Returns: unsubscribe token func subscribe(inProcessListener: @escaping InProcessListener) -> UnsubscribeToken /// Unsubscribe from Hub channel /// - Parameter token: unsubscribe token func unsubscribe(_ token: UnsubscribeToken) /// Dispatch value to sequence /// - Parameter inProcess: InProcess value func dispatch(inProcess: InProcess) }