From 73510c6e27a93723992d6ef9efb0ba597bb3a797 Mon Sep 17 00:00:00 2001 From: Brian Quinlan Date: Thu, 5 Mar 2026 14:59:07 -0800 Subject: [PATCH 1/9] Make server work with google_cloud_storage --- .../example_server_app/bin/server.dart | 14 ++++++++--- .../example_server_app/pubspec.yaml | 13 +++++++---- .../lib/src/storage/storage.dart | 23 +++++++++---------- packages/dart_firebase_admin/pubspec.yaml | 3 +++ 4 files changed, 34 insertions(+), 19 deletions(-) diff --git a/packages/dart_firebase_admin/example_server_app/bin/server.dart b/packages/dart_firebase_admin/example_server_app/bin/server.dart index 739a3e29..81cc5e16 100644 --- a/packages/dart_firebase_admin/example_server_app/bin/server.dart +++ b/packages/dart_firebase_admin/example_server_app/bin/server.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'dart:io'; +// import 'package:google_cloud_storage/google_cloud_storage.dart'; import 'package:dart_firebase_admin/dart_firebase_admin.dart'; import 'package:dart_firebase_admin/messaging.dart'; import 'package:shelf/shelf.dart'; @@ -17,6 +18,7 @@ void main() async { print('Firebase Admin SDK initialized'); final router = Router() + ..get('/storage', (Request req) => storageHandler(req, app)) ..get('/health', healthHandler) ..post('/send-message', (Request req) => sendMessageHandler(req, app)) ..post( @@ -33,6 +35,12 @@ void main() async { print('Server running on port ${server.port}'); } +Future storageHandler(Request req, FirebaseApp app) async { + final bucket = app.storage().bucket('test'); + await bucket.object('test').upload(utf8.encode('Hello World')); + return Response.ok('done'); +} + Response healthHandler(Request req) => Response.ok( jsonEncode({ 'status': 'healthy', @@ -58,7 +66,7 @@ Future sendMessageHandler(Request request, FirebaseApp app) async { ); } - final messageId = await app.messaging.send( + final messageId = await app.messaging().send( TokenMessage( token: token, notification: Notification(title: title, body: bodyText), @@ -97,7 +105,7 @@ Future subscribeToTopicHandler( ); } - final response = await app.messaging.subscribeToTopic(tokens, topic); + final response = await app.messaging().subscribeToTopic(tokens, topic); return Response.ok( jsonEncode({ @@ -132,7 +140,7 @@ Future verifyTokenHandler(Request request, FirebaseApp app) async { ); } - final decodedToken = await app.auth.verifyIdToken(idToken); + final decodedToken = await app.auth().verifyIdToken(idToken); return Response.ok( jsonEncode({ diff --git a/packages/dart_firebase_admin/example_server_app/pubspec.yaml b/packages/dart_firebase_admin/example_server_app/pubspec.yaml index 77bb9815..668a6d4b 100644 --- a/packages/dart_firebase_admin/example_server_app/pubspec.yaml +++ b/packages/dart_firebase_admin/example_server_app/pubspec.yaml @@ -6,13 +6,18 @@ environment: dependencies: dart_firebase_admin: - git: - url: https://github.com/invertase/dart_firebase_admin.git - path: packages/dart_firebase_admin - ref: next + path: ../ shelf: ^1.4.2 + google_cloud_storage: + path: /Users/bquinlan/dart/google-cloud-dart/packages/google_cloud_storage shelf_router: ^1.1.2 +dependency_overrides: + google_cloud_firestore: + path: ../../google_cloud_firestore + googleapis_storage: + path: ../../googleapis_storage + dev_dependencies: http: ^1.2.2 lints: ^6.0.0 diff --git a/packages/dart_firebase_admin/lib/src/storage/storage.dart b/packages/dart_firebase_admin/lib/src/storage/storage.dart index 606f9365..5fccde81 100644 --- a/packages/dart_firebase_admin/lib/src/storage/storage.dart +++ b/packages/dart_firebase_admin/lib/src/storage/storage.dart @@ -1,5 +1,5 @@ -import 'package:googleapis_storage/googleapis_storage.dart' - as googleapis_storage; +import 'package:google_cloud_storage/google_cloud_storage.dart' + as google_cloud_storage; import 'package:meta/meta.dart'; import '../app.dart'; @@ -8,9 +8,10 @@ class Storage implements FirebaseService { Storage._(this.app) { String? apiEndpoint; final isEmulator = Environment.isStorageEmulatorEnabled(); - + print('isEmulator: $isEmulator'); if (isEmulator) { final emulatorHost = Environment.getStorageEmulatorHost()!; + print('emulatorHost: $emulatorHost'); if (RegExp('https?://').hasMatch(emulatorHost)) { throw FirebaseAppException( @@ -21,12 +22,10 @@ class Storage implements FirebaseService { apiEndpoint = 'http://$emulatorHost'; } - _delegate = googleapis_storage.Storage( - googleapis_storage.StorageOptions( - authClient: isEmulator ? null : app.client, - apiEndpoint: apiEndpoint, - useAuthWithCustomEndpoint: false, - ), + _delegate = google_cloud_storage.Storage( + client: isEmulator ? null : app.client, + apiEndpoint: apiEndpoint, + useAuthWithCustomEndpoint: false, ); } @@ -39,9 +38,9 @@ class Storage implements FirebaseService { @override final FirebaseApp app; - late final googleapis_storage.Storage _delegate; + late final google_cloud_storage.Storage _delegate; - googleapis_storage.Bucket bucket(String? name) { + google_cloud_storage.Bucket bucket([String? name]) { final bucketName = name ?? app.options.storageBucket; if (bucketName == null || bucketName.isEmpty) { throw FirebaseAppException( @@ -57,6 +56,6 @@ class Storage implements FirebaseService { @override Future delete() async { - await _delegate.terminate(); + _delegate.close(); } } diff --git a/packages/dart_firebase_admin/pubspec.yaml b/packages/dart_firebase_admin/pubspec.yaml index 4a75f3b0..0ef033a7 100644 --- a/packages/dart_firebase_admin/pubspec.yaml +++ b/packages/dart_firebase_admin/pubspec.yaml @@ -15,6 +15,9 @@ dependencies: dart_jsonwebtoken: ^3.0.0 equatable: ^2.0.7 google_cloud: ^0.3.0 +# google_cloud_storage: any + google_cloud_storage: + path: /Users/bquinlan/dart/google-cloud-dart/packages/google_cloud_storage google_cloud_firestore: ^0.1.0 googleapis: ^15.0.0 googleapis_auth: ^2.1.0 From fb66998265a4cae7940cc0e6dfc1720e294188eb Mon Sep 17 00:00:00 2001 From: Brian Quinlan Date: Thu, 5 Mar 2026 16:16:15 -0800 Subject: [PATCH 2/9] Use pub version --- packages/dart_firebase_admin/example_server_app/pubspec.yaml | 3 +-- packages/dart_firebase_admin/pubspec.yaml | 4 +--- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/dart_firebase_admin/example_server_app/pubspec.yaml b/packages/dart_firebase_admin/example_server_app/pubspec.yaml index 668a6d4b..d32527ad 100644 --- a/packages/dart_firebase_admin/example_server_app/pubspec.yaml +++ b/packages/dart_firebase_admin/example_server_app/pubspec.yaml @@ -8,8 +8,7 @@ dependencies: dart_firebase_admin: path: ../ shelf: ^1.4.2 - google_cloud_storage: - path: /Users/bquinlan/dart/google-cloud-dart/packages/google_cloud_storage + google_cloud_storage: ^0.5.1 shelf_router: ^1.1.2 dependency_overrides: diff --git a/packages/dart_firebase_admin/pubspec.yaml b/packages/dart_firebase_admin/pubspec.yaml index 0ef033a7..8361e8bf 100644 --- a/packages/dart_firebase_admin/pubspec.yaml +++ b/packages/dart_firebase_admin/pubspec.yaml @@ -15,10 +15,8 @@ dependencies: dart_jsonwebtoken: ^3.0.0 equatable: ^2.0.7 google_cloud: ^0.3.0 -# google_cloud_storage: any - google_cloud_storage: - path: /Users/bquinlan/dart/google-cloud-dart/packages/google_cloud_storage google_cloud_firestore: ^0.1.0 + google_cloud_storage: ">=0.5.1" googleapis: ^15.0.0 googleapis_auth: ^2.1.0 googleapis_beta: ^9.0.0 From a4bb4246da702e7bb19c99064797e3b5dedc447d Mon Sep 17 00:00:00 2001 From: Brian Quinlan Date: Thu, 5 Mar 2026 16:19:27 -0800 Subject: [PATCH 3/9] Update storage.dart --- packages/dart_firebase_admin/lib/src/storage/storage.dart | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/dart_firebase_admin/lib/src/storage/storage.dart b/packages/dart_firebase_admin/lib/src/storage/storage.dart index 5fccde81..e1db0fd3 100644 --- a/packages/dart_firebase_admin/lib/src/storage/storage.dart +++ b/packages/dart_firebase_admin/lib/src/storage/storage.dart @@ -8,10 +8,8 @@ class Storage implements FirebaseService { Storage._(this.app) { String? apiEndpoint; final isEmulator = Environment.isStorageEmulatorEnabled(); - print('isEmulator: $isEmulator'); if (isEmulator) { final emulatorHost = Environment.getStorageEmulatorHost()!; - print('emulatorHost: $emulatorHost'); if (RegExp('https?://').hasMatch(emulatorHost)) { throw FirebaseAppException( From 5390e35b92bd98fdeb23160cf544345423f9db7e Mon Sep 17 00:00:00 2001 From: Brian Quinlan Date: Tue, 10 Mar 2026 11:21:54 -0700 Subject: [PATCH 4/9] Env var --- .../lib/src/storage/storage.dart | 8 ++-- .../lib/src/utils/native_environment.dart | 46 +++++++++++++++++++ packages/dart_firebase_admin/pubspec.yaml | 1 + 3 files changed, 50 insertions(+), 5 deletions(-) create mode 100644 packages/dart_firebase_admin/lib/src/utils/native_environment.dart diff --git a/packages/dart_firebase_admin/lib/src/storage/storage.dart b/packages/dart_firebase_admin/lib/src/storage/storage.dart index e1db0fd3..6b925c38 100644 --- a/packages/dart_firebase_admin/lib/src/storage/storage.dart +++ b/packages/dart_firebase_admin/lib/src/storage/storage.dart @@ -2,6 +2,7 @@ import 'package:google_cloud_storage/google_cloud_storage.dart' as google_cloud_storage; import 'package:meta/meta.dart'; import '../app.dart'; +import '../utils/native_environment.dart'; class Storage implements FirebaseService { /// Internal constructor @@ -18,13 +19,10 @@ class Storage implements FirebaseService { ); } apiEndpoint = 'http://$emulatorHost'; + setNativeEnvironmentVariable('STORAGE_EMULATOR_HOST', emulatorHost); } - _delegate = google_cloud_storage.Storage( - client: isEmulator ? null : app.client, - apiEndpoint: apiEndpoint, - useAuthWithCustomEndpoint: false, - ); + _delegate = google_cloud_storage.Storage(); } /// Factory constructor that ensures singleton per app. diff --git a/packages/dart_firebase_admin/lib/src/utils/native_environment.dart b/packages/dart_firebase_admin/lib/src/utils/native_environment.dart new file mode 100644 index 00000000..2e123298 --- /dev/null +++ b/packages/dart_firebase_admin/lib/src/utils/native_environment.dart @@ -0,0 +1,46 @@ +import 'dart:ffi'; +import 'dart:io'; + +import 'package:ffi/ffi.dart'; +import 'package:meta/meta.dart'; + +import '../../dart_firebase_admin.dart'; + +final int Function(Pointer, Pointer, int) _setenv = + DynamicLibrary.process().lookupFunction< + Int32 Function(Pointer, Pointer, Int32), + int Function(Pointer, Pointer, int) + >('setenv'); + +final int Function(Pointer, Pointer) _setEnvironmentVariableW = + DynamicLibrary.open('kernel32.dll').lookupFunction< + Int32 Function(Pointer, Pointer), + int Function(Pointer, Pointer) + >('SetEnvironmentVariableW'); + +@internal +void setNativeEnvironmentVariable(String name, String value) { + if (Platform.isWindows) { + using((arena) { + final namePtr = name.toNativeUtf16(allocator: arena); + final valuePtr = value.toNativeUtf16(allocator: arena); + if (_setEnvironmentVariableW(namePtr, valuePtr) == 0) { + throw FirebaseAppException( + AppErrorCode.internalError, + 'Failed to set native environment variable: $name', + ); + } + }); + } else { + using((arena) { + final namePtr = name.toNativeUtf8(allocator: arena); + final valuePtr = value.toNativeUtf8(allocator: arena); + if (_setenv(namePtr, valuePtr, 1) == -1) { + throw FirebaseAppException( + AppErrorCode.internalError, + 'Failed to set native environment variable: $name', + ); + } + }); + } +} diff --git a/packages/dart_firebase_admin/pubspec.yaml b/packages/dart_firebase_admin/pubspec.yaml index 8361e8bf..3bfd8e38 100644 --- a/packages/dart_firebase_admin/pubspec.yaml +++ b/packages/dart_firebase_admin/pubspec.yaml @@ -14,6 +14,7 @@ dependencies: collection: ^1.18.0 dart_jsonwebtoken: ^3.0.0 equatable: ^2.0.7 + ffi: ^2.1.2 google_cloud: ^0.3.0 google_cloud_firestore: ^0.1.0 google_cloud_storage: ">=0.5.1" From 279d5cb82e98da4e3f5b4918a72509c601b979ac Mon Sep 17 00:00:00 2001 From: Brian Quinlan Date: Tue, 10 Mar 2026 11:23:14 -0700 Subject: [PATCH 5/9] Reverts --- .../example_server_app/bin/server.dart | 14 +++----------- .../example_server_app/pubspec.yaml | 12 ++++-------- 2 files changed, 7 insertions(+), 19 deletions(-) diff --git a/packages/dart_firebase_admin/example_server_app/bin/server.dart b/packages/dart_firebase_admin/example_server_app/bin/server.dart index 81cc5e16..739a3e29 100644 --- a/packages/dart_firebase_admin/example_server_app/bin/server.dart +++ b/packages/dart_firebase_admin/example_server_app/bin/server.dart @@ -1,7 +1,6 @@ import 'dart:convert'; import 'dart:io'; -// import 'package:google_cloud_storage/google_cloud_storage.dart'; import 'package:dart_firebase_admin/dart_firebase_admin.dart'; import 'package:dart_firebase_admin/messaging.dart'; import 'package:shelf/shelf.dart'; @@ -18,7 +17,6 @@ void main() async { print('Firebase Admin SDK initialized'); final router = Router() - ..get('/storage', (Request req) => storageHandler(req, app)) ..get('/health', healthHandler) ..post('/send-message', (Request req) => sendMessageHandler(req, app)) ..post( @@ -35,12 +33,6 @@ void main() async { print('Server running on port ${server.port}'); } -Future storageHandler(Request req, FirebaseApp app) async { - final bucket = app.storage().bucket('test'); - await bucket.object('test').upload(utf8.encode('Hello World')); - return Response.ok('done'); -} - Response healthHandler(Request req) => Response.ok( jsonEncode({ 'status': 'healthy', @@ -66,7 +58,7 @@ Future sendMessageHandler(Request request, FirebaseApp app) async { ); } - final messageId = await app.messaging().send( + final messageId = await app.messaging.send( TokenMessage( token: token, notification: Notification(title: title, body: bodyText), @@ -105,7 +97,7 @@ Future subscribeToTopicHandler( ); } - final response = await app.messaging().subscribeToTopic(tokens, topic); + final response = await app.messaging.subscribeToTopic(tokens, topic); return Response.ok( jsonEncode({ @@ -140,7 +132,7 @@ Future verifyTokenHandler(Request request, FirebaseApp app) async { ); } - final decodedToken = await app.auth().verifyIdToken(idToken); + final decodedToken = await app.auth.verifyIdToken(idToken); return Response.ok( jsonEncode({ diff --git a/packages/dart_firebase_admin/example_server_app/pubspec.yaml b/packages/dart_firebase_admin/example_server_app/pubspec.yaml index d32527ad..77bb9815 100644 --- a/packages/dart_firebase_admin/example_server_app/pubspec.yaml +++ b/packages/dart_firebase_admin/example_server_app/pubspec.yaml @@ -6,17 +6,13 @@ environment: dependencies: dart_firebase_admin: - path: ../ + git: + url: https://github.com/invertase/dart_firebase_admin.git + path: packages/dart_firebase_admin + ref: next shelf: ^1.4.2 - google_cloud_storage: ^0.5.1 shelf_router: ^1.1.2 -dependency_overrides: - google_cloud_firestore: - path: ../../google_cloud_firestore - googleapis_storage: - path: ../../googleapis_storage - dev_dependencies: http: ^1.2.2 lints: ^6.0.0 From f666755246840b56d333f76b46b4ce32d3644382 Mon Sep 17 00:00:00 2001 From: Brian Quinlan Date: Tue, 10 Mar 2026 11:27:10 -0700 Subject: [PATCH 6/9] Update storage.dart --- packages/dart_firebase_admin/lib/src/storage/storage.dart | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/dart_firebase_admin/lib/src/storage/storage.dart b/packages/dart_firebase_admin/lib/src/storage/storage.dart index 6b925c38..93e070ae 100644 --- a/packages/dart_firebase_admin/lib/src/storage/storage.dart +++ b/packages/dart_firebase_admin/lib/src/storage/storage.dart @@ -7,7 +7,6 @@ import '../utils/native_environment.dart'; class Storage implements FirebaseService { /// Internal constructor Storage._(this.app) { - String? apiEndpoint; final isEmulator = Environment.isStorageEmulatorEnabled(); if (isEmulator) { final emulatorHost = Environment.getStorageEmulatorHost()!; @@ -18,7 +17,6 @@ class Storage implements FirebaseService { 'FIREBASE_STORAGE_EMULATOR_HOST should not contain a protocol (http or https).', ); } - apiEndpoint = 'http://$emulatorHost'; setNativeEnvironmentVariable('STORAGE_EMULATOR_HOST', emulatorHost); } From 1e300d2e6c21a93ef427b6473a04d5e9a9589ed5 Mon Sep 17 00:00:00 2001 From: Brian Quinlan Date: Thu, 12 Mar 2026 17:25:09 -0700 Subject: [PATCH 7/9] Update storage.dart --- .../lib/src/storage/storage.dart | 59 +++++++++++++++++-- 1 file changed, 53 insertions(+), 6 deletions(-) diff --git a/packages/dart_firebase_admin/lib/src/storage/storage.dart b/packages/dart_firebase_admin/lib/src/storage/storage.dart index 93e070ae..4dfe8410 100644 --- a/packages/dart_firebase_admin/lib/src/storage/storage.dart +++ b/packages/dart_firebase_admin/lib/src/storage/storage.dart @@ -1,9 +1,12 @@ -import 'package:google_cloud_storage/google_cloud_storage.dart' - as google_cloud_storage; +import 'dart:convert'; + +import 'package:google_cloud_storage/google_cloud_storage.dart' as gcs; import 'package:meta/meta.dart'; import '../app.dart'; import '../utils/native_environment.dart'; +part 'storage_exception.dart'; + class Storage implements FirebaseService { /// Internal constructor Storage._(this.app) { @@ -19,8 +22,7 @@ class Storage implements FirebaseService { } setNativeEnvironmentVariable('STORAGE_EMULATOR_HOST', emulatorHost); } - - _delegate = google_cloud_storage.Storage(); + _delegate = gcs.Storage(); } /// Factory constructor that ensures singleton per app. @@ -32,9 +34,9 @@ class Storage implements FirebaseService { @override final FirebaseApp app; - late final google_cloud_storage.Storage _delegate; + late final gcs.Storage _delegate; - google_cloud_storage.Bucket bucket([String? name]) { + gcs.Bucket bucket([String? name]) { final bucketName = name ?? app.options.storageBucket; if (bucketName == null || bucketName.isEmpty) { throw FirebaseAppException( @@ -48,6 +50,51 @@ class Storage implements FirebaseService { return _delegate.bucket(bucketName); } + /// Returns a long-lived download URL for the given object. + /// + /// The URL is signed with a download token from the Firebase Storage REST + /// API, making it suitable for sharing with end-users. The token must exist + /// on the object — if none is present, create one in the Firebase Console or + /// via the Firebase Storage REST API first. + /// + /// Example: + /// ```dart + /// final storage = app.storage(); + /// final bucket = storage.bucket('my-bucket.appspot.com'); + /// final url = await storage.getDownloadURL(bucket, 'images/photo.jpg'); + /// ``` + Future getDownloadURL(gcs.Bucket bucket, String objectName) async { + final emulatorHost = Environment.getStorageEmulatorHost(); + final endpoint = emulatorHost != null + ? 'http://$emulatorHost/v0' + : 'https://firebasestorage.googleapis.com/v0'; + + final encodedName = Uri.encodeComponent(objectName); + final uri = Uri.parse('$endpoint/b/${bucket.name}/o/$encodedName'); + + final client = await app.client; + final response = await client.get(uri); + + if (response.statusCode != 200) { + throw FirebaseStorageAdminException( + StorageClientErrorCode.internalError, + 'Failed to retrieve object metadata. Status: ${response.statusCode}.', + ); + } + + final json = jsonDecode(response.body) as Map; + final downloadTokens = json['downloadTokens'] as String?; + + if (downloadTokens == null || downloadTokens.isEmpty) { + throw FirebaseStorageAdminException( + StorageClientErrorCode.noDownloadToken, + ); + } + + final token = downloadTokens.split(',').first; + return '$endpoint/b/${bucket.name}/o/$encodedName?alt=media&token=$token'; + } + @override Future delete() async { _delegate.close(); From 168b235b3b7cb3a61761e8a9a3c2ab504063f21e Mon Sep 17 00:00:00 2001 From: Brian Quinlan Date: Thu, 12 Mar 2026 17:27:30 -0700 Subject: [PATCH 8/9] Fix diff a bit --- packages/dart_firebase_admin/lib/src/storage/storage.dart | 3 +-- packages/dart_firebase_admin/pubspec.yaml | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/dart_firebase_admin/lib/src/storage/storage.dart b/packages/dart_firebase_admin/lib/src/storage/storage.dart index 4dfe8410..e558eca0 100644 --- a/packages/dart_firebase_admin/lib/src/storage/storage.dart +++ b/packages/dart_firebase_admin/lib/src/storage/storage.dart @@ -8,9 +8,9 @@ import '../utils/native_environment.dart'; part 'storage_exception.dart'; class Storage implements FirebaseService { - /// Internal constructor Storage._(this.app) { final isEmulator = Environment.isStorageEmulatorEnabled(); + if (isEmulator) { final emulatorHost = Environment.getStorageEmulatorHost()!; @@ -25,7 +25,6 @@ class Storage implements FirebaseService { _delegate = gcs.Storage(); } - /// Factory constructor that ensures singleton per app. @internal factory Storage.internal(FirebaseApp app) { return app.getOrInitService(FirebaseServiceType.storage.name, Storage._); diff --git a/packages/dart_firebase_admin/pubspec.yaml b/packages/dart_firebase_admin/pubspec.yaml index 3bfd8e38..74b0397d 100644 --- a/packages/dart_firebase_admin/pubspec.yaml +++ b/packages/dart_firebase_admin/pubspec.yaml @@ -19,9 +19,8 @@ dependencies: google_cloud_firestore: ^0.1.0 google_cloud_storage: ">=0.5.1" googleapis: ^15.0.0 - googleapis_auth: ^2.1.0 + googleapis_auth: ^2.2.0 googleapis_beta: ^9.0.0 - googleapis_storage: ^0.1.0 http: ^1.0.0 intl: ^0.20.0 jose: ^0.3.4 From 7051748812af13fb9c615f5b8dd3aa35e364a651 Mon Sep 17 00:00:00 2001 From: Brian Quinlan Date: Thu, 12 Mar 2026 17:30:07 -0700 Subject: [PATCH 9/9] Update pubspec.yaml --- packages/dart_firebase_admin/pubspec.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/dart_firebase_admin/pubspec.yaml b/packages/dart_firebase_admin/pubspec.yaml index 74b0397d..fed17bbf 100644 --- a/packages/dart_firebase_admin/pubspec.yaml +++ b/packages/dart_firebase_admin/pubspec.yaml @@ -17,6 +17,8 @@ dependencies: ffi: ^2.1.2 google_cloud: ^0.3.0 google_cloud_firestore: ^0.1.0 + # `google_cloud_storage` will not change the surface used by + # `dart_firebase_admin`. google_cloud_storage: ">=0.5.1" googleapis: ^15.0.0 googleapis_auth: ^2.2.0