From 497fea23d3e91d06d17c88517d403e31f7c9da07 Mon Sep 17 00:00:00 2001 From: Yakov Manshin Date: Mon, 11 Nov 2024 22:51:03 +0100 Subject: [PATCH 1/2] Switched `HTTPSCallable` to Async Method MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * On all officially supported platform versions (iOS 13, Catalyst 13, macOS 10.15, tvOS 13, watchOS 7), `HTTPSCallable` always uses the async / await implementation of `Functions`’s `callFunction` to prevent any potential discrepancies in behavior * Older versions (which aren’t supported officially but can technically be used via SPM) continue calling the old (completion handler-based) method --- FirebaseFunctions/Sources/HTTPSCallable.swift | 38 ++++++++++++------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/FirebaseFunctions/Sources/HTTPSCallable.swift b/FirebaseFunctions/Sources/HTTPSCallable.swift index 2c772bc8c78..c2281e54866 100644 --- a/FirebaseFunctions/Sources/HTTPSCallable.swift +++ b/FirebaseFunctions/Sources/HTTPSCallable.swift @@ -78,22 +78,32 @@ open class HTTPSCallable: NSObject { @objc(callWithObject:completion:) open func call(_ data: Any? = nil, completion: @escaping (HTTPSCallableResult?, Error?) -> Void) { - let callback: ((Result) -> Void) = { result in - switch result { - case let .success(callableResult): - completion(callableResult, nil) - case let .failure(error): - completion(nil, error) + if #available(iOS 13, macCatalyst 13, macOS 10.15, tvOS 13, watchOS 7, *) { + Task { + do { + let result = try await call(data) + completion(result, nil) + } catch { + completion(nil, error) + } + } + } else { + // This isn’t expected to ever be called because Functions + // doesn’t officially support the older platforms. + functions.callFunction( + at: url, + withObject: data, + options: options, + timeout: timeoutInterval + ) { result in + switch result { + case let .success(callableResult): + completion(callableResult, nil) + case let .failure(error): + completion(nil, error) + } } } - - functions.callFunction( - at: url, - withObject: data, - options: options, - timeout: timeoutInterval, - completion: callback - ) } /// Executes this Callable HTTPS trigger asynchronously. This API should only be used from From 91de6cd7dda2640c87028be9aa30098b64ec5b48 Mon Sep 17 00:00:00 2001 From: Yakov Manshin Date: Tue, 12 Nov 2024 09:08:43 +0100 Subject: [PATCH 2/2] Fixed `HTTPSCallableTests` * Added a missing override to `MockFunctions` --- .../Tests/CombineUnit/HTTPSCallableTests.swift | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/FirebaseFunctions/Tests/CombineUnit/HTTPSCallableTests.swift b/FirebaseFunctions/Tests/CombineUnit/HTTPSCallableTests.swift index 8ed63c344b7..3c1399ad522 100644 --- a/FirebaseFunctions/Tests/CombineUnit/HTTPSCallableTests.swift +++ b/FirebaseFunctions/Tests/CombineUnit/HTTPSCallableTests.swift @@ -31,6 +31,15 @@ private let expectationTimeout: TimeInterval = 2 class MockFunctions: Functions { let mockCallFunction: () throws -> HTTPSCallableResult var verifyParameters: ((_ url: URL, _ data: Any?, _ timeout: TimeInterval) throws -> Void)? + + override func callFunction(at url: URL, + withObject data: Any?, + options: HTTPSCallableOptions?, + timeout: TimeInterval) async throws -> HTTPSCallableResult { + try verifyParameters?(url, data, timeout) + return try mockCallFunction() + } + override func callFunction(at url: URL, withObject data: Any?, options: HTTPSCallableOptions?,