Skip to content

Commit 4804ab9

Browse files
committed
chore: update functions based on API Doc modification
1 parent 66be89b commit 4804ab9

File tree

8 files changed

+29
-86
lines changed

8 files changed

+29
-86
lines changed

Diff for: packages/cloud_functions/cloud_functions/android/src/main/java/io/flutter/plugins/firebase/functions/FirebaseFunctionsStreamHandler.java

-4
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,4 @@ private void httpsStreamCall(Map<String, Object> arguments, EventChannel.EventSi
6262
events.error("firebase_functions", e.getMessage(), null);
6363
}
6464
}
65-
66-
public Object getResult() {
67-
return subscriber.getResult();
68-
}
6965
}

Diff for: packages/cloud_functions/cloud_functions/android/src/main/java/io/flutter/plugins/firebase/functions/FlutterFirebaseFunctionsPlugin.java

+1-17
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,6 @@ public class FlutterFirebaseFunctionsPlugin
3838
private MethodChannel channel;
3939
private FlutterPluginBinding pluginBinding;
4040

41-
private FirebaseFunctionsStreamHandler streamHandler;
42-
4341
/**
4442
* Default Constructor.
4543
*
@@ -66,7 +64,7 @@ private void registerEventChannel(Map<String, Object> arguments) {
6664
final EventChannel eventChannel =
6765
new EventChannel(pluginBinding.getBinaryMessenger(), eventChannelName);
6866
FirebaseFunctions functions = getFunctions(arguments);
69-
streamHandler = new FirebaseFunctionsStreamHandler(functions);
67+
FirebaseFunctionsStreamHandler streamHandler = new FirebaseFunctionsStreamHandler(functions);
7068
eventChannel.setStreamHandler(streamHandler);
7169
}
7270

@@ -129,25 +127,11 @@ private Task<Object> httpsFunctionCall(Map<String, Object> arguments) {
129127
return taskCompletionSource.getTask();
130128
}
131129

132-
private void getCompleteResult(Result result) {
133-
cachedThreadPool.execute(
134-
() -> {
135-
try {
136-
Object completeResult = streamHandler.getResult();
137-
result.success(completeResult);
138-
} catch (Exception e) {
139-
result.error("firebase_functions", e.getMessage(), getExceptionDetails(e));
140-
}
141-
});
142-
}
143-
144130
@Override
145131
public void onMethodCall(MethodCall call, @NonNull final Result result) {
146132
if (call.method.equals("FirebaseFunctions#registerEventChannel")) {
147133
registerEventChannel(call.arguments());
148134
result.success(null);
149-
} else if (call.method.equals("FirebaseFunctions#getCompleteResult")) {
150-
getCompleteResult(result);
151135
} else if (call.method.equals("FirebaseFunctions#call")) {
152136
httpsFunctionCall(call.arguments())
153137
.addOnCompleteListener(

Diff for: packages/cloud_functions/cloud_functions/android/src/main/java/io/flutter/plugins/firebase/functions/StreamResponseSubscriber.java

+8-19
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
import android.os.Looper;
99
import com.google.firebase.functions.StreamResponse;
1010
import io.flutter.plugin.common.EventChannel;
11-
import java.util.concurrent.CountDownLatch;
11+
import java.util.HashMap;
12+
import java.util.Map;
1213
import org.reactivestreams.Subscriber;
1314
import org.reactivestreams.Subscription;
1415

@@ -18,10 +19,6 @@ public class StreamResponseSubscriber implements Subscriber<StreamResponse> {
1819

1920
private final Handler mainThreadHandler = new Handler(Looper.getMainLooper());
2021

21-
private CountDownLatch latch = new CountDownLatch(1);
22-
23-
private Object result;
24-
2522
public StreamResponseSubscriber(EventChannel.EventSink eventSink) {
2623
this.eventSink = eventSink;
2724
}
@@ -34,20 +31,22 @@ public void onSubscribe(Subscription s) {
3431

3532
@Override
3633
public void onNext(StreamResponse streamResponse) {
34+
Map<String, Object> messageMap = new HashMap<>();
3735
if (streamResponse instanceof StreamResponse.Message) {
3836
Object message = ((StreamResponse.Message) streamResponse).getMessage().getData();
39-
mainThreadHandler.post(() -> eventSink.success(message));
37+
messageMap.put("message", message);
38+
mainThreadHandler.post(() -> eventSink.success(messageMap));
4039
} else {
41-
this.result = ((StreamResponse.Result) streamResponse).getResult().getData();
42-
latch.countDown();
40+
Object result = ((StreamResponse.Result) streamResponse).getResult().getData();
41+
messageMap.put("result", result);
42+
mainThreadHandler.post(() -> eventSink.success(messageMap));
4343
}
4444
}
4545

4646
@Override
4747
public void onError(Throwable t) {
4848
if (eventSink != null) {
4949
eventSink.error("firebase_functions", t.getMessage(), null);
50-
latch.countDown();
5150
}
5251
}
5352

@@ -61,16 +60,6 @@ public void onComplete() {
6160
public void cancel() {
6261
if (subscription != null) {
6362
subscription.cancel();
64-
latch.countDown();
65-
}
66-
}
67-
68-
public Object getResult() {
69-
try {
70-
latch.await();
71-
return this.result;
72-
} catch (Exception e) {
73-
throw new RuntimeException(e);
7463
}
7564
}
7665
}

Diff for: packages/cloud_functions/cloud_functions/ios/cloud_functions/Sources/cloud_functions/FirebaseFunctionsPlugin.swift

+1-14
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ let kFLTFirebaseFunctionsChannelName = "plugins.flutter.io/firebase_functions"
1919

2020
public class FirebaseFunctionsPlugin: NSObject, FLTFirebasePluginProtocol, FlutterPlugin {
2121
private let binaryMessenger: FlutterBinaryMessenger
22-
private var streamHandler: FunctionsStreamHandler?
2322

2423
init(binaryMessenger: FlutterBinaryMessenger) {
2524
self.binaryMessenger = binaryMessenger
@@ -66,18 +65,11 @@ public class FirebaseFunctionsPlugin: NSObject, FLTFirebasePluginProtocol, Flutt
6665
let eventChannelName = "\(kFLTFirebaseFunctionsChannelName)/\(eventChannelId)"
6766
let eventChannel = FlutterEventChannel(name: eventChannelName, binaryMessenger: binaryMessenger)
6867
let functions = getFunctions(arguments: arguments)
69-
streamHandler = FunctionsStreamHandler(functions: functions)
68+
let streamHandler = FunctionsStreamHandler(functions: functions)
7069
eventChannel.setStreamHandler(streamHandler)
7170
}
7271

7372
public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
74-
if call.method == "FirebaseFunctions#getCompleteResult" {
75-
Task {
76-
await getCompleteResult(result: result)
77-
}
78-
return
79-
}
80-
8173
guard let arguments = call.arguments as? [String: Any] else {
8274
result(FlutterError(code: "invalid_arguments",
8375
message: "Invalid arguments",
@@ -157,11 +149,6 @@ public class FirebaseFunctionsPlugin: NSObject, FLTFirebasePluginProtocol, Flutt
157149
}
158150
}
159151

160-
private func getCompleteResult(result: @escaping FlutterResult) async {
161-
let value = await streamHandler?.getResult()
162-
result(value)
163-
}
164-
165152
private func getFunctions(arguments: [String: Any]) -> Functions {
166153
let appName = arguments["appName"] as? String ?? ""
167154
let region = arguments["region"] as? String

Diff for: packages/cloud_functions/cloud_functions/ios/cloud_functions/Sources/cloud_functions/FunctionsStreamHandler.swift

+4-20
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,9 @@ import FirebaseFunctions
1313
class FunctionsStreamHandler: NSObject, FlutterStreamHandler {
1414
var functions: Functions
1515
private var streamTask: Task<Void, Never>?
16-
@MainActor private var streamResult: Any?
17-
private let continuation: AsyncStream<Any?>.Continuation
18-
private let stream: AsyncStream<Any?>
1916

2017
init(functions: Functions) {
2118
self.functions = functions
22-
(stream, continuation) = AsyncStream.makeStream(of: Any?.self)
2319
super.init()
2420
}
2521

@@ -33,7 +29,6 @@ class FunctionsStreamHandler: NSObject, FlutterStreamHandler {
3329

3430
func onCancel(withArguments arguments: Any?) -> FlutterError? {
3531
streamTask?.cancel()
36-
continuation.finish()
3732
return nil
3833
}
3934

@@ -84,10 +79,11 @@ class FunctionsStreamHandler: NSObject, FlutterStreamHandler {
8479
await MainActor.run {
8580
switch response {
8681
case let .message(message):
87-
events(message.value)
82+
var wrappedMessage: [String: Any?] = ["message": message.value]
83+
events(wrappedMessage)
8884
case let .result(result):
89-
self.streamResult = result.value
90-
continuation.yield(result.value)
85+
var wrappedResult: [String: Any?] = ["result": result.value]
86+
events(wrappedResult)
9187
}
9288
}
9389
}
@@ -96,26 +92,14 @@ class FunctionsStreamHandler: NSObject, FlutterStreamHandler {
9692
events(FlutterError(code: "unknown",
9793
message: error.localizedDescription,
9894
details: ["code": "unknown", "message": error.localizedDescription]))
99-
continuation.yield(nil)
100-
continuation.finish()
10195
}
10296
}
10397
} else {
10498
await MainActor.run {
10599
events(FlutterError(code: "unknown",
106100
message: "Streaming requires iOS 15+",
107101
details: nil))
108-
continuation.yield(nil)
109102
}
110-
continuation.finish()
111103
}
112104
}
113-
114-
@MainActor
115-
func getResult() async -> Any? {
116-
for await result in stream {
117-
return result
118-
}
119-
return nil
120-
}
121105
}

Diff for: packages/cloud_functions/cloud_functions/lib/cloud_functions.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import 'dart:async';
88
// ignore: unnecessary_import
99
import 'dart:typed_data';
1010

11-
import 'package:cloud_functions/src/https_callable_stream_result.dart';
1211
import 'package:cloud_functions_platform_interface/cloud_functions_platform_interface.dart';
1312
import 'package:firebase_core/firebase_core.dart';
1413
import 'package:firebase_core_platform_interface/firebase_core_platform_interface.dart'
@@ -22,3 +21,4 @@ part 'src/firebase_functions.dart';
2221
part 'src/https_callable.dart';
2322
part 'src/https_callable_result.dart';
2423
part 'src/https_callable_stream.dart';
24+
part 'src/https_callable_stream_result.dart';

Diff for: packages/cloud_functions/cloud_functions/lib/src/https_callable_stream.dart

+9-6
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,23 @@
55

66
part of '../cloud_functions.dart';
77

8-
class HttpsCallableStream<R> {
8+
class HttpsCallableStream {
99
HttpsCallableStream._(this.delegate);
1010

1111
/// Returns the underlying [HttpsCallableStream] delegate for this
1212
/// [HttpsCallableStreamsPlatform] instance. This is useful for testing purposes only.
1313
@visibleForTesting
1414
final HttpsCallableStreamsPlatform delegate;
1515

16-
Stream<Chunk<T>> stream<T>([Object? input]) async* {
16+
Stream<StreamResponse> stream<T, R>([Object? input]) async* {
1717
await for (final value in delegate.stream(input)) {
18-
yield Chunk<T>(value);
18+
if (value is Map) {
19+
if (value.containsKey('message')) {
20+
yield Chunk<T>(value['message'] as T);
21+
} else if (value.containsKey('result')) {
22+
yield Result<R>(HttpsCallableResult._(value['result'] as R));
23+
}
24+
}
1925
}
2026
}
21-
22-
Future<Result<R>> get data async =>
23-
Result<R>(HttpsCallableResult<R>._(await delegate.data));
2427
}

Diff for: packages/cloud_functions/cloud_functions/lib/src/https_callable_stream_result.dart

+5-5
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,19 @@
33
// for details. All rights reserved. Use of this source code is governed by a
44
// BSD-style license that can be found in the LICENSE file.
55

6-
import 'package:cloud_functions/cloud_functions.dart';
6+
part of '../cloud_functions.dart';
77

88
/// Represents a response from a Server-Sent Event (SSE) stream.
9-
sealed class StreamResponse<T> {}
9+
sealed class StreamResponse {}
1010

1111
/// A chunk received during the stream.
12-
class Chunk<T> extends StreamResponse<T> {
12+
class Chunk<T> extends StreamResponse {
1313
final T partialData;
1414
Chunk(this.partialData);
1515
}
1616

1717
/// The final result of the computation, marking the end of the stream.
18-
class Result<T> extends StreamResponse<T> {
19-
final HttpsCallableResult<T> result;
18+
class Result<R> extends StreamResponse {
19+
final HttpsCallableResult<R> result;
2020
Result(this.result);
2121
}

0 commit comments

Comments
 (0)