// // Copyright Amazon.com Inc. or its affiliates. // All Rights Reserved. // // SPDX-License-Identifier: Apache-2.0 // import Foundation extension RealtimeConnectionProvider: MessageInterceptable { public func addInterceptor(_ interceptor: MessageInterceptor) { messageInterceptors.append(interceptor) } public func interceptMessage( _ message: AppSyncMessage, for endpoint: URL, completion: @escaping (AppSyncMessage) -> Void ) { chainInterceptors( iterator: messageInterceptors.makeIterator(), message: message, endpoint: endpoint, completion: completion ) } private func chainInterceptors<I: IteratorProtocol>( iterator: I, message: AppSyncMessage, endpoint: URL, completion: @escaping (AppSyncMessage) -> Void ) where I.Element == MessageInterceptor { var mutableIterator = iterator guard let interceptor = mutableIterator.next() else { completion(message) return } interceptor.interceptMessage(message, for: endpoint) { interceptedMessage in self.chainInterceptors( iterator: mutableIterator, message: interceptedMessage, endpoint: endpoint, completion: completion ) } } // MARK: Deprecated method public func interceptMessage(_ message: AppSyncMessage, for endpoint: URL) -> AppSyncMessage { // This is added here for backward compatibility let finalMessage = messageInterceptors.reduce(message) { $1.interceptMessage($0, for: endpoint) } return finalMessage } }