@react-native-firebase/storage 25.0.1 → 26.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/RNFBStorage.podspec +17 -6
  3. package/android/build.gradle +23 -0
  4. package/android/src/main/java/io/invertase/firebase/storage/{ReactNativeFirebaseStorageModule.java → NativeRNFBTurboStorage.java} +72 -131
  5. package/android/src/main/java/io/invertase/firebase/storage/ReactNativeFirebaseStoragePackage.java +1 -1
  6. package/android/src/main/java/io/invertase/firebase/storage/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboStorageSpec.java +125 -0
  7. package/android/src/main/java/io/invertase/firebase/storage/generated/jni/CMakeLists.txt +36 -0
  8. package/android/src/main/java/io/invertase/firebase/storage/generated/jni/RNFBStorageTurboModules-generated.cpp +116 -0
  9. package/android/src/main/java/io/invertase/firebase/storage/generated/jni/RNFBStorageTurboModules.h +31 -0
  10. package/android/src/main/java/io/invertase/firebase/storage/generated/jni/react/renderer/components/RNFBStorageTurboModules/RNFBStorageTurboModulesJSI-generated.cpp +153 -0
  11. package/android/src/main/java/io/invertase/firebase/storage/generated/jni/react/renderer/components/RNFBStorageTurboModules/RNFBStorageTurboModulesJSI.h +246 -0
  12. package/dist/module/StorageReference.js +4 -7
  13. package/dist/module/StorageReference.js.map +1 -1
  14. package/dist/module/StorageTask.js.map +1 -1
  15. package/dist/module/index.js +384 -6
  16. package/dist/module/index.js.map +1 -1
  17. package/dist/module/types/storage.js +6 -2
  18. package/dist/module/types/storage.js.map +1 -1
  19. package/dist/module/version.js +1 -1
  20. package/dist/module/web/RNFBStorageModule.js +9 -11
  21. package/dist/module/web/RNFBStorageModule.js.map +1 -1
  22. package/dist/typescript/lib/StorageReference.d.ts.map +1 -1
  23. package/dist/typescript/lib/StorageTask.d.ts +7 -8
  24. package/dist/typescript/lib/StorageTask.d.ts.map +1 -1
  25. package/dist/typescript/lib/index.d.ts +150 -4
  26. package/dist/typescript/lib/index.d.ts.map +1 -1
  27. package/dist/typescript/lib/types/internal.d.ts +5 -5
  28. package/dist/typescript/lib/types/internal.d.ts.map +1 -1
  29. package/dist/typescript/lib/types/storage.d.ts +15 -10
  30. package/dist/typescript/lib/types/storage.d.ts.map +1 -1
  31. package/dist/typescript/lib/version.d.ts +1 -1
  32. package/dist/typescript/lib/web/RNFBStorageModule.d.ts +3 -3
  33. package/dist/typescript/lib/web/RNFBStorageModule.d.ts.map +1 -1
  34. package/ios/RNFBStorage/RNFBStorageModule.h +2 -2
  35. package/ios/RNFBStorage/{RNFBStorageModule.m → RNFBStorageModule.mm} +193 -130
  36. package/ios/RNFBStorage.xcodeproj/project.pbxproj +8 -8
  37. package/ios/generated/RCTAppDependencyProvider.h +25 -0
  38. package/ios/generated/RCTAppDependencyProvider.mm +55 -0
  39. package/ios/generated/RCTModulesConformingToProtocolsProvider.h +18 -0
  40. package/ios/generated/RCTModulesConformingToProtocolsProvider.mm +33 -0
  41. package/ios/generated/RCTThirdPartyComponentsProvider.h +16 -0
  42. package/ios/generated/RCTThirdPartyComponentsProvider.mm +23 -0
  43. package/ios/generated/RNFBStorageTurboModules/RNFBStorageTurboModules-generated.mm +142 -0
  44. package/ios/generated/RNFBStorageTurboModules/RNFBStorageTurboModules.h +198 -0
  45. package/ios/generated/RNFBStorageTurboModulesJSI-generated.cpp +153 -0
  46. package/ios/generated/RNFBStorageTurboModulesJSI.h +246 -0
  47. package/ios/generated/ReactAppDependencyProvider.podspec +34 -0
  48. package/lib/StorageReference.ts +3 -8
  49. package/lib/StorageTask.ts +13 -15
  50. package/lib/index.ts +501 -7
  51. package/lib/types/internal.ts +5 -5
  52. package/lib/types/storage.ts +17 -10
  53. package/lib/version.ts +1 -1
  54. package/lib/web/RNFBStorageModule.ts +10 -12
  55. package/package.json +22 -4
  56. package/react-native.config.js +10 -0
  57. package/specs/NativeRNFBTurboStorage.ts +46 -0
  58. package/typedoc.json +2 -3
  59. package/dist/module/modular.js +0 -270
  60. package/dist/module/modular.js.map +0 -1
  61. package/dist/module/namespaced.js +0 -192
  62. package/dist/module/namespaced.js.map +0 -1
  63. package/dist/module/types/namespaced.js +0 -64
  64. package/dist/module/types/namespaced.js.map +0 -1
  65. package/dist/typescript/lib/modular.d.ts +0 -154
  66. package/dist/typescript/lib/modular.d.ts.map +0 -1
  67. package/dist/typescript/lib/namespaced.d.ts +0 -12
  68. package/dist/typescript/lib/namespaced.d.ts.map +0 -1
  69. package/dist/typescript/lib/types/namespaced.d.ts +0 -1122
  70. package/dist/typescript/lib/types/namespaced.d.ts.map +0 -1
  71. package/lib/modular.ts +0 -401
  72. package/lib/namespaced.ts +0 -264
  73. package/lib/types/namespaced.ts +0 -1248
package/CHANGELOG.md CHANGED
@@ -3,6 +3,31 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [26.0.0](https://github.com/invertase/react-native-firebase/compare/v25.1.0...v26.0.0) (2026-07-29)
7
+
8
+ ### ⚠ BREAKING CHANGES
9
+
10
+ - **storage:** migrate storage to TurboModules
11
+
12
+ ### Features
13
+
14
+ - **storage:** migrate storage to TurboModules ([691dcc1](https://github.com/invertase/react-native-firebase/commit/691dcc1edd3264f4c3866c5e927f17864a603b00))
15
+
16
+ ### Bug Fixes
17
+
18
+ - add codegen verify and spec-native parity tests ([49d9f1b](https://github.com/invertase/react-native-firebase/commit/49d9f1baba4fc83c1dd4983f582bbd7352d78809))
19
+ - add ResultT codegen type alias ([ff2d68f](https://github.com/invertase/react-native-firebase/commit/ff2d68ff8f73092f8ba3c75e007049dd31be822f))
20
+ - **firestore:** deep testing/refactoring pass ([24b3b67](https://github.com/invertase/react-native-firebase/commit/24b3b679d21c8b21f603e8add5a544a978138436))
21
+ - **firestore:** validate TransactionOptions maxAttempts ([316e7d0](https://github.com/invertase/react-native-firebase/commit/316e7d09c4ffd731af244ddb2d8b63f733cfceee))
22
+ - **ios:** private codegen headers and bridging-safe AppCheck module ([266d7e1](https://github.com/invertase/react-native-firebase/commit/266d7e10020662bfd357d1795bc5f6cfde54f7b7))
23
+ - **ios:** set IPHONEOS_DEPLOYMENT_TARGET to 15.0, update platform support docs/conditionals ([#9108](https://github.com/invertase/react-native-firebase/issues/9108)) ([99d0899](https://github.com/invertase/react-native-firebase/commit/99d089908e3eec6155d73ecf05ff7274ad33c46e)), closes [#8882](https://github.com/invertase/react-native-firebase/issues/8882)
24
+ - **storage, ios:** preserve RN framework HEADER_SEARCH_PATHS in podspec ([122ae3d](https://github.com/invertase/react-native-firebase/commit/122ae3dfb2dec425e91ec9a742492ae6b3ec29fc))
25
+ - **types:** align compare-types modular API with firebase-js-sdk ([5376e75](https://github.com/invertase/react-native-firebase/commit/5376e757f7dd7f7cffc9907c652d873d2403e23f))
26
+
27
+ ## [25.1.0](https://github.com/invertase/react-native-firebase/compare/v25.0.1...v25.1.0) (2026-06-25)
28
+
29
+ **Note:** Version bump only for package @react-native-firebase/storage
30
+
6
31
  ## [25.0.1](https://github.com/invertase/react-native-firebase/compare/v25.0.0...v25.0.1) (2026-06-23)
7
32
 
8
33
  **Note:** Version bump only for package @react-native-firebase/storage
@@ -27,15 +27,26 @@ Pod::Spec.new do |s|
27
27
  s.ios.deployment_target = firebase_ios_target
28
28
  s.macos.deployment_target = firebase_macos_target
29
29
  s.tvos.deployment_target = firebase_tvos_target
30
- s.source_files = 'ios/**/*.{h,m}'
30
+ s.source_files = 'ios/**/*.{h,m,mm,cpp}'
31
+ s.private_header_files = [
32
+ 'ios/RNFBStorage/*.h',
33
+ 'ios/generated/**/*.h',
34
+ ]
35
+ s.exclude_files = 'ios/generated/RCTThirdPartyComponentsProvider.*', 'ios/generated/RCTAppDependencyProvider.*', 'ios/generated/RCTModuleProviders.*', 'ios/generated/RCTModulesConformingToProtocolsProvider.*', 'ios/generated/RCTUnstableModulesRequiringMainQueueSetupProvider.*'
36
+
37
+ # Must be set before install_modules_dependencies so RN can append use_frameworks
38
+ # HEADER_SEARCH_PATHS (React-debug etc.). Assigning after overwrites those paths
39
+ # and breaks from-source builds: react/timing/primitives.h → react/debug/flags.h.
40
+ s.pod_target_xcconfig = {
41
+ 'HEADER_SEARCH_PATHS' => '"$(PODS_TARGET_SRCROOT)/ios/generated/RNFBStorageTurboModules" "$(PODS_TARGET_SRCROOT)/ios/generated"'
42
+ }
31
43
 
32
44
  s.dependency 'RNFBApp'
33
45
 
34
- # React Native dependencies
35
- if defined?(install_modules_dependencies()) != nil
36
- install_modules_dependencies(s);
37
- else
38
- s.dependency "React-Core"
46
+ install_modules_dependencies(s);
47
+
48
+ if defined?(ENV["RCT_NEW_ARCH_ENABLED"]) != nil && (ENV["RCT_NEW_ARCH_ENABLED"] == '0')
49
+ raise "#{s.name} requires New Architecture. Enable New Architecture to use this module"
39
50
  end
40
51
 
41
52
  if defined?($FirebaseSDKVersion)
@@ -77,6 +77,11 @@ android {
77
77
  targetCompatibility = JavaVersion.VERSION_11
78
78
  }
79
79
  }
80
+ sourceSets {
81
+ main {
82
+ java.excludes = ['**/generated/jni/**']
83
+ }
84
+ }
80
85
  }
81
86
 
82
87
  repositories {
@@ -94,3 +99,21 @@ ReactNative.shared.applyPackageVersion()
94
99
  ReactNative.shared.applyDefaultExcludes()
95
100
  ReactNative.module.applyAndroidVersions()
96
101
  ReactNative.module.applyReactNativeDependency("api")
102
+
103
+ def isNewArchitectureDisabled() {
104
+ return project.hasProperty("newArchEnabled") && project.newArchEnabled != "true"
105
+ }
106
+
107
+ if (isNewArchitectureDisabled()) {
108
+ def ANSI_RED = "\u001B[31m";
109
+ def ANSI_RESET = "\u001B[0m";
110
+
111
+ println("\n\n\n")
112
+ println(ANSI_RED + "**************************************************************************************************************")
113
+ println("\n\n\n")
114
+ println("New Architecture support is required for @react-native-firebase/storage")
115
+ println("\n\n\n")
116
+ println("**************************************************************************************************************" + ANSI_RESET)
117
+ println("\n\n\n")
118
+ System.exit(1)
119
+ }
@@ -17,6 +17,7 @@ package io.invertase.firebase.storage;
17
17
  *
18
18
  */
19
19
 
20
+ import static io.invertase.firebase.common.ReactNativeFirebaseModule.rejectPromiseWithCodeAndMessage;
20
21
  import static io.invertase.firebase.storage.ReactNativeFirebaseStorageCommon.buildMetadataFromMap;
21
22
  import static io.invertase.firebase.storage.ReactNativeFirebaseStorageCommon.getListResultAsMap;
22
23
  import static io.invertase.firebase.storage.ReactNativeFirebaseStorageCommon.getMetadataAsMap;
@@ -25,9 +26,9 @@ import static io.invertase.firebase.storage.ReactNativeFirebaseStorageCommon.pro
25
26
 
26
27
  import android.content.Context;
27
28
  import android.net.Uri;
29
+ import com.facebook.fbreact.specs.NativeRNFBTurboStorageSpec;
28
30
  import com.facebook.react.bridge.Promise;
29
31
  import com.facebook.react.bridge.ReactApplicationContext;
30
- import com.facebook.react.bridge.ReactMethod;
31
32
  import com.facebook.react.bridge.ReadableMap;
32
33
  import com.google.android.gms.tasks.Task;
33
34
  import com.google.firebase.FirebaseApp;
@@ -35,19 +36,22 @@ import com.google.firebase.storage.FirebaseStorage;
35
36
  import com.google.firebase.storage.ListResult;
36
37
  import com.google.firebase.storage.StorageMetadata;
37
38
  import com.google.firebase.storage.StorageReference;
38
- import io.invertase.firebase.common.ReactNativeFirebaseModule;
39
+ import io.invertase.firebase.common.TaskExecutorService;
39
40
  import java.util.HashMap;
40
41
  import java.util.List;
41
42
  import java.util.Map;
42
43
  import java.util.Objects;
44
+ import java.util.concurrent.ExecutorService;
45
+ import javax.annotation.Nullable;
43
46
 
44
- public class ReactNativeFirebaseStorageModule extends ReactNativeFirebaseModule {
45
- private static final String TAG = "Storage";
46
-
47
+ public class NativeRNFBTurboStorage extends NativeRNFBTurboStorageSpec {
47
48
  private static HashMap<String, String> emulatorConfigs = new HashMap<>();
48
49
 
49
- ReactNativeFirebaseStorageModule(ReactApplicationContext reactContext) {
50
- super(reactContext, TAG);
50
+ private final TaskExecutorService executorService;
51
+
52
+ public NativeRNFBTurboStorage(ReactApplicationContext reactContext) {
53
+ super(reactContext);
54
+ executorService = new TaskExecutorService("RNFBStorageModule");
51
55
  }
52
56
 
53
57
  @Override
@@ -56,11 +60,27 @@ public class ReactNativeFirebaseStorageModule extends ReactNativeFirebaseModule
56
60
  super.invalidate();
57
61
  }
58
62
 
59
- /**
60
- * @link https://firebase.google.com/docs/reference/js/firebase.storage.Reference#delete
61
- */
62
- @ReactMethod
63
- public void delete(String appName, String url, final Promise promise) {
63
+ @Override
64
+ protected Map<String, Object> getTypedExportedConstants() {
65
+ Map<String, Object> constants = new HashMap<>();
66
+ Context context = getReactApplicationContext();
67
+ List<FirebaseApp> apps = FirebaseApp.getApps(context);
68
+ if (apps.size() > 0) {
69
+ FirebaseStorage defaultStorageInstance = FirebaseStorage.getInstance();
70
+ constants.put("maxDownloadRetryTime", defaultStorageInstance.getMaxDownloadRetryTimeMillis());
71
+ constants.put(
72
+ "maxOperationRetryTime", defaultStorageInstance.getMaxOperationRetryTimeMillis());
73
+ constants.put("maxUploadRetryTime", defaultStorageInstance.getMaxUploadRetryTimeMillis());
74
+ } else {
75
+ constants.put("maxDownloadRetryTime", 0);
76
+ constants.put("maxOperationRetryTime", 0);
77
+ constants.put("maxUploadRetryTime", 0);
78
+ }
79
+ return constants;
80
+ }
81
+
82
+ @Override
83
+ public void deleteObject(String appName, String url, final Promise promise) {
64
84
  try {
65
85
  StorageReference reference = getReferenceFromUrl(url, appName);
66
86
  reference
@@ -79,10 +99,7 @@ public class ReactNativeFirebaseStorageModule extends ReactNativeFirebaseModule
79
99
  }
80
100
  }
81
101
 
82
- /**
83
- * @link https://firebase.google.com/docs/reference/js/firebase.storage.Reference#getDownloadURL
84
- */
85
- @ReactMethod
102
+ @Override
86
103
  public void getDownloadURL(String appName, final String url, final Promise promise) {
87
104
  try {
88
105
  StorageReference reference = getReferenceFromUrl(url, appName);
@@ -101,10 +118,7 @@ public class ReactNativeFirebaseStorageModule extends ReactNativeFirebaseModule
101
118
  }
102
119
  }
103
120
 
104
- /**
105
- * @link https://firebase.google.com/docs/reference/js/firebase.storage.Reference#getMetadata
106
- */
107
- @ReactMethod
121
+ @Override
108
122
  public void getMetadata(String appName, String url, Promise promise) {
109
123
  try {
110
124
  StorageReference reference = getReferenceFromUrl(url, appName);
@@ -124,10 +138,7 @@ public class ReactNativeFirebaseStorageModule extends ReactNativeFirebaseModule
124
138
  }
125
139
  }
126
140
 
127
- /**
128
- * @link https://firebase.google.com/docs/reference/js/firebase.storage.Reference#list
129
- */
130
- @ReactMethod
141
+ @Override
131
142
  public void list(String appName, String url, ReadableMap listOptions, Promise promise) {
132
143
  try {
133
144
  StorageReference reference = getReferenceFromUrl(url, appName);
@@ -135,7 +146,7 @@ public class ReactNativeFirebaseStorageModule extends ReactNativeFirebaseModule
135
146
 
136
147
  int maxResults = listOptions.getInt("maxResults");
137
148
 
138
- if (listOptions.hasKey("pageToken")) {
149
+ if (listOptions.hasKey("pageToken") && !listOptions.isNull("pageToken")) {
139
150
  String pageToken = listOptions.getString("pageToken");
140
151
  list = reference.list(maxResults, Objects.requireNonNull(pageToken));
141
152
  } else {
@@ -156,10 +167,7 @@ public class ReactNativeFirebaseStorageModule extends ReactNativeFirebaseModule
156
167
  }
157
168
  }
158
169
 
159
- /**
160
- * @link https://firebase.google.com/docs/reference/js/firebase.storage.Reference#listAll
161
- */
162
- @ReactMethod
170
+ @Override
163
171
  public void listAll(String appName, String url, Promise promise) {
164
172
  try {
165
173
  StorageReference reference = getReferenceFromUrl(url, appName);
@@ -179,30 +187,9 @@ public class ReactNativeFirebaseStorageModule extends ReactNativeFirebaseModule
179
187
  }
180
188
  }
181
189
 
182
- // Useful for development / debugging
183
- private void dumpMetadata(StorageMetadata metadata) {
184
- System.err.println("STORAGE dumping metadata contents");
185
- System.err.println("STORAGE - cacheControl " + metadata.getCacheControl());
186
- System.err.println("STORAGE - contentDisposition " + metadata.getContentDisposition());
187
- System.err.println("STORAGE - contentEncoding " + metadata.getContentEncoding());
188
- System.err.println("STORAGE - contentLanguage " + metadata.getContentLanguage());
189
- System.err.println("STORAGE - contentType " + metadata.getContentType());
190
- for (String customKey : metadata.getCustomMetadataKeys()) {
191
- System.err.println(
192
- "STORAGE - customMetadata: '"
193
- + customKey
194
- + "' / '"
195
- + metadata.getCustomMetadata(customKey)
196
- + "'");
197
- }
198
- }
199
-
200
- /**
201
- * @link https://firebase.google.com/docs/reference/js/firebase.storage.Reference#updateMetadata
202
- */
203
- @ReactMethod
190
+ @Override
204
191
  public void updateMetadata(
205
- String appName, String url, ReadableMap metadataMap, final Promise promise) {
192
+ String appName, String url, @Nullable ReadableMap metadataMap, final Promise promise) {
206
193
  try {
207
194
  StorageReference reference = getReferenceFromUrl(url, appName);
208
195
 
@@ -212,11 +199,8 @@ public class ReactNativeFirebaseStorageModule extends ReactNativeFirebaseModule
212
199
  getExecutor(),
213
200
  getTask -> {
214
201
  if (getTask.isSuccessful()) {
215
-
216
- // dumpMetadata(getTask.getResult());
217
202
  StorageMetadata metadata =
218
203
  buildMetadataFromMap(metadataMap, null, getTask.getResult());
219
- // dumpMetadata(metadata);
220
204
 
221
205
  reference
222
206
  .updateMetadata(metadata)
@@ -224,10 +208,8 @@ public class ReactNativeFirebaseStorageModule extends ReactNativeFirebaseModule
224
208
  getExecutor(),
225
209
  updateTask -> {
226
210
  if (updateTask.isSuccessful()) {
227
- // dumpMetadata(updateTask.getResult());
228
211
  promise.resolve(getMetadataAsMap(updateTask.getResult()));
229
212
  } else {
230
- updateTask.getException().printStackTrace();
231
213
  promiseRejectStorageException(promise, updateTask.getException());
232
214
  }
233
215
  });
@@ -241,11 +223,7 @@ public class ReactNativeFirebaseStorageModule extends ReactNativeFirebaseModule
241
223
  }
242
224
  }
243
225
 
244
- /**
245
- * @link
246
- * https://firebase.google.com/docs/reference/js/firebase.storage.Storage#setMaxDownloadRetryTime
247
- */
248
- @ReactMethod
226
+ @Override
249
227
  public void setMaxDownloadRetryTime(String appName, double milliseconds, Promise promise) {
250
228
  FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
251
229
  FirebaseStorage firebaseStorage = FirebaseStorage.getInstance(firebaseApp);
@@ -253,11 +231,7 @@ public class ReactNativeFirebaseStorageModule extends ReactNativeFirebaseModule
253
231
  promise.resolve(null);
254
232
  }
255
233
 
256
- /**
257
- * @link
258
- * https://firebase.google.com/docs/reference/js/firebase.storage.Storage#setMaxOperationRetryTime
259
- */
260
- @ReactMethod
234
+ @Override
261
235
  public void setMaxOperationRetryTime(String appName, double milliseconds, Promise promise) {
262
236
  FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
263
237
  FirebaseStorage firebaseStorage = FirebaseStorage.getInstance(firebaseApp);
@@ -265,11 +239,7 @@ public class ReactNativeFirebaseStorageModule extends ReactNativeFirebaseModule
265
239
  promise.resolve(null);
266
240
  }
267
241
 
268
- /**
269
- * @link
270
- * https://firebase.google.com/docs/reference/js/firebase.storage.Storage#setMaxUploadRetryTime
271
- */
272
- @ReactMethod
242
+ @Override
273
243
  public void setMaxUploadRetryTime(String appName, double milliseconds, Promise promise) {
274
244
  FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
275
245
  FirebaseStorage firebaseStorage = FirebaseStorage.getInstance(firebaseApp);
@@ -277,33 +247,22 @@ public class ReactNativeFirebaseStorageModule extends ReactNativeFirebaseModule
277
247
  promise.resolve(null);
278
248
  }
279
249
 
280
- /**
281
- * @link https://firebase.google.com/docs/reference/js/firebase.storage.Storage#useEmulator
282
- */
283
- @ReactMethod
284
- public void useEmulator(
285
- String appName, String host, int port, String bucketUrl, Promise promise) {
250
+ @Override
251
+ public void useEmulator(String appName, String host, double port, String bucketUrl) {
286
252
  FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
287
-
288
253
  FirebaseStorage firebaseStorage = FirebaseStorage.getInstance(firebaseApp, bucketUrl);
289
254
  String emulatorKey = appName + ":" + bucketUrl;
290
255
 
291
256
  if (emulatorConfigs.get(emulatorKey) == null) {
292
- firebaseStorage.useEmulator(host, port);
257
+ firebaseStorage.useEmulator(host, (int) port);
293
258
  emulatorConfigs.put(emulatorKey, "true");
294
259
  }
295
- promise.resolve(null);
296
260
  }
297
261
 
298
- /**
299
- * @link https://firebase.google.com/docs/reference/js/firebase.storage.Reference#writeToFile
300
- */
301
- @ReactMethod
262
+ @Override
302
263
  public void writeToFile(
303
- String appName, String url, String localFilePath, int taskId, Promise promise) {
304
- // TODO(salakar) only need to check this if using external storage?
264
+ String appName, String url, String localFilePath, double taskId, Promise promise) {
305
265
  if (!isExternalStorageWritable()) {
306
- // TODO(salakar) send failure event
307
266
  rejectPromiseWithCodeAndMessage(
308
267
  promise,
309
268
  "invalid-device-file-path",
@@ -313,7 +272,7 @@ public class ReactNativeFirebaseStorageModule extends ReactNativeFirebaseModule
313
272
  try {
314
273
  StorageReference reference = getReferenceFromUrl(url, appName);
315
274
  ReactNativeFirebaseStorageDownloadTask storageTask =
316
- new ReactNativeFirebaseStorageDownloadTask(taskId, reference, appName);
275
+ new ReactNativeFirebaseStorageDownloadTask((int) taskId, reference, appName);
317
276
  storageTask.begin(getTransactionalExecutor(), localFilePath);
318
277
  storageTask.addOnCompleteListener(getTransactionalExecutor(), promise);
319
278
  } catch (Exception e) {
@@ -321,22 +280,19 @@ public class ReactNativeFirebaseStorageModule extends ReactNativeFirebaseModule
321
280
  }
322
281
  }
323
282
 
324
- /**
325
- * @link https://firebase.google.com/docs/reference/js/firebase.storage.Reference#putString
326
- */
327
- @ReactMethod
283
+ @Override
328
284
  public void putString(
329
285
  String appName,
330
286
  String url,
331
287
  String string,
332
288
  String format,
333
- ReadableMap metadataMap,
334
- int taskId,
289
+ @Nullable ReadableMap metadataMap,
290
+ double taskId,
335
291
  Promise promise) {
336
292
  try {
337
293
  StorageReference reference = getReferenceFromUrl(url, appName);
338
294
  ReactNativeFirebaseStorageUploadTask storageTask =
339
- new ReactNativeFirebaseStorageUploadTask(taskId, reference, appName);
295
+ new ReactNativeFirebaseStorageUploadTask((int) taskId, reference, appName);
340
296
  storageTask.begin(getTransactionalExecutor(), string, format, metadataMap);
341
297
  storageTask.addOnCompleteListener(getTransactionalExecutor(), promise);
342
298
  } catch (Exception e) {
@@ -344,21 +300,18 @@ public class ReactNativeFirebaseStorageModule extends ReactNativeFirebaseModule
344
300
  }
345
301
  }
346
302
 
347
- /**
348
- * @link https://firebase.google.com/docs/reference/js/firebase.storage.Reference#putFile
349
- */
350
- @ReactMethod
303
+ @Override
351
304
  public void putFile(
352
305
  String appName,
353
306
  String url,
354
307
  String localFilePath,
355
- ReadableMap metadata,
356
- int taskId,
308
+ @Nullable ReadableMap metadata,
309
+ double taskId,
357
310
  Promise promise) {
358
311
  try {
359
312
  StorageReference reference = getReferenceFromUrl(url, appName);
360
313
  ReactNativeFirebaseStorageUploadTask storageTask =
361
- new ReactNativeFirebaseStorageUploadTask(taskId, reference, appName);
314
+ new ReactNativeFirebaseStorageUploadTask((int) taskId, reference, appName);
362
315
  storageTask.begin(getTransactionalExecutor(), localFilePath, metadata);
363
316
  storageTask.addOnCompleteListener(getTransactionalExecutor(), promise);
364
317
  } catch (Exception e) {
@@ -366,21 +319,28 @@ public class ReactNativeFirebaseStorageModule extends ReactNativeFirebaseModule
366
319
  }
367
320
  }
368
321
 
369
- @ReactMethod
370
- public void setTaskStatus(String appName, int taskId, int status, Promise promise) {
371
- switch (status) {
322
+ @Override
323
+ public boolean setTaskStatus(String appName, double taskId, double status) {
324
+ switch ((int) status) {
372
325
  case 0:
373
- promise.resolve(ReactNativeFirebaseStorageTask.pauseTaskById(taskId));
374
- break;
326
+ return ReactNativeFirebaseStorageTask.pauseTaskById((int) taskId);
375
327
  case 1:
376
- promise.resolve(ReactNativeFirebaseStorageTask.resumeTaskById(taskId));
377
- break;
328
+ return ReactNativeFirebaseStorageTask.resumeTaskById((int) taskId);
378
329
  case 2:
379
- promise.resolve(ReactNativeFirebaseStorageTask.cancelTaskById(taskId));
380
- break;
330
+ return ReactNativeFirebaseStorageTask.cancelTaskById((int) taskId);
331
+ default:
332
+ return false;
381
333
  }
382
334
  }
383
335
 
336
+ private ExecutorService getExecutor() {
337
+ return executorService.getExecutor();
338
+ }
339
+
340
+ private ExecutorService getTransactionalExecutor() {
341
+ return executorService.getTransactionalExecutor();
342
+ }
343
+
384
344
  private String getBucketFromUrl(String url) {
385
345
  String pathWithBucketName = url.substring(5);
386
346
  return url.substring(0, pathWithBucketName.indexOf("/") + 5);
@@ -393,23 +353,4 @@ public class ReactNativeFirebaseStorageModule extends ReactNativeFirebaseModule
393
353
  FirebaseStorage.getInstance(firebaseApp, getBucketFromUrl(url));
394
354
  return firebaseStorage.getReferenceFromUrl(url);
395
355
  }
396
-
397
- @Override
398
- public Map<String, Object> getConstants() {
399
- Map<String, Object> constants = new HashMap<>();
400
-
401
- Context context = getReactApplicationContext();
402
-
403
- // a 'safe' way of checking if any apps have been initialized
404
- List<FirebaseApp> apps = FirebaseApp.getApps(context);
405
- if (apps.size() > 0) {
406
- FirebaseStorage defaultStorageInstance = FirebaseStorage.getInstance();
407
- constants.put("maxDownloadRetryTime", defaultStorageInstance.getMaxDownloadRetryTimeMillis());
408
- constants.put(
409
- "maxOperationRetryTime", defaultStorageInstance.getMaxOperationRetryTimeMillis());
410
- constants.put("maxUploadRetryTime", defaultStorageInstance.getMaxUploadRetryTimeMillis());
411
- }
412
-
413
- return constants;
414
- }
415
356
  }
@@ -32,7 +32,7 @@ public class ReactNativeFirebaseStoragePackage implements ReactPackage {
32
32
  @Override
33
33
  public List<NativeModule> createNativeModules(@Nonnull ReactApplicationContext reactContext) {
34
34
  List<NativeModule> modules = new ArrayList<>();
35
- modules.add(new ReactNativeFirebaseStorageModule(reactContext));
35
+ modules.add(new NativeRNFBTurboStorage(reactContext));
36
36
  return modules;
37
37
  }
38
38
 
@@ -0,0 +1,125 @@
1
+
2
+ /**
3
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
4
+ *
5
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
6
+ * once the code is regenerated.
7
+ *
8
+ * @generated by codegen project: GenerateModuleJavaSpec.js
9
+ *
10
+ * @nolint
11
+ */
12
+
13
+ package com.facebook.fbreact.specs;
14
+
15
+ import com.facebook.proguard.annotations.DoNotStrip;
16
+ import com.facebook.react.bridge.Promise;
17
+ import com.facebook.react.bridge.ReactApplicationContext;
18
+ import com.facebook.react.bridge.ReactContextBaseJavaModule;
19
+ import com.facebook.react.bridge.ReactMethod;
20
+ import com.facebook.react.bridge.ReadableMap;
21
+ import com.facebook.react.common.build.ReactBuildConfig;
22
+ import com.facebook.react.turbomodule.core.interfaces.TurboModule;
23
+ import java.util.Arrays;
24
+ import java.util.HashSet;
25
+ import java.util.Map;
26
+ import java.util.Set;
27
+ import javax.annotation.Nonnull;
28
+ import javax.annotation.Nullable;
29
+
30
+ public abstract class NativeRNFBTurboStorageSpec extends ReactContextBaseJavaModule implements TurboModule {
31
+ public static final String NAME = "NativeRNFBTurboStorage";
32
+
33
+ public NativeRNFBTurboStorageSpec(ReactApplicationContext reactContext) {
34
+ super(reactContext);
35
+ }
36
+
37
+ @Override
38
+ public @Nonnull String getName() {
39
+ return NAME;
40
+ }
41
+
42
+ protected abstract Map<String, Object> getTypedExportedConstants();
43
+
44
+ @Override
45
+ @DoNotStrip
46
+ public final @Nullable Map<String, Object> getConstants() {
47
+ Map<String, Object> constants = getTypedExportedConstants();
48
+ if (ReactBuildConfig.DEBUG || ReactBuildConfig.IS_INTERNAL_BUILD) {
49
+ Set<String> obligatoryFlowConstants = new HashSet<>(Arrays.asList(
50
+ "maxDownloadRetryTime",
51
+ "maxOperationRetryTime",
52
+ "maxUploadRetryTime"
53
+ ));
54
+ Set<String> optionalFlowConstants = new HashSet<>();
55
+ Set<String> undeclaredConstants = new HashSet<>(constants.keySet());
56
+ undeclaredConstants.removeAll(obligatoryFlowConstants);
57
+ undeclaredConstants.removeAll(optionalFlowConstants);
58
+ if (!undeclaredConstants.isEmpty()) {
59
+ throw new IllegalStateException(String.format("Native Module Flow doesn't declare constants: %s", undeclaredConstants));
60
+ }
61
+ undeclaredConstants = obligatoryFlowConstants;
62
+ undeclaredConstants.removeAll(constants.keySet());
63
+ if (!undeclaredConstants.isEmpty()) {
64
+ throw new IllegalStateException(String.format("Native Module doesn't fill in constants: %s", undeclaredConstants));
65
+ }
66
+ }
67
+ return constants;
68
+ }
69
+
70
+ @ReactMethod
71
+ @DoNotStrip
72
+ public abstract void deleteObject(String appName, String url, Promise promise);
73
+
74
+ @ReactMethod
75
+ @DoNotStrip
76
+ public abstract void getDownloadURL(String appName, String url, Promise promise);
77
+
78
+ @ReactMethod
79
+ @DoNotStrip
80
+ public abstract void getMetadata(String appName, String url, Promise promise);
81
+
82
+ @ReactMethod
83
+ @DoNotStrip
84
+ public abstract void updateMetadata(String appName, String url, @Nullable ReadableMap metadata, Promise promise);
85
+
86
+ @ReactMethod
87
+ @DoNotStrip
88
+ public abstract void list(String appName, String url, ReadableMap listOptions, Promise promise);
89
+
90
+ @ReactMethod
91
+ @DoNotStrip
92
+ public abstract void listAll(String appName, String url, Promise promise);
93
+
94
+ @ReactMethod
95
+ @DoNotStrip
96
+ public abstract void setMaxDownloadRetryTime(String appName, double milliseconds, Promise promise);
97
+
98
+ @ReactMethod
99
+ @DoNotStrip
100
+ public abstract void setMaxOperationRetryTime(String appName, double milliseconds, Promise promise);
101
+
102
+ @ReactMethod
103
+ @DoNotStrip
104
+ public abstract void setMaxUploadRetryTime(String appName, double milliseconds, Promise promise);
105
+
106
+ @ReactMethod
107
+ @DoNotStrip
108
+ public abstract void useEmulator(String appName, String host, double port, String bucketUrl);
109
+
110
+ @ReactMethod
111
+ @DoNotStrip
112
+ public abstract void writeToFile(String appName, String url, String localFilePath, double taskId, Promise promise);
113
+
114
+ @ReactMethod
115
+ @DoNotStrip
116
+ public abstract void putFile(String appName, String url, String localFilePath, @Nullable ReadableMap metadata, double taskId, Promise promise);
117
+
118
+ @ReactMethod
119
+ @DoNotStrip
120
+ public abstract void putString(String appName, String url, String string, String format, @Nullable ReadableMap metadata, double taskId, Promise promise);
121
+
122
+ @ReactMethod(isBlockingSynchronousMethod = true)
123
+ @DoNotStrip
124
+ public abstract boolean setTaskStatus(String appName, double taskId, double status);
125
+ }
@@ -0,0 +1,36 @@
1
+ # Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ #
3
+ # This source code is licensed under the MIT license found in the
4
+ # LICENSE file in the root directory of this source tree.
5
+
6
+ cmake_minimum_required(VERSION 3.13)
7
+ set(CMAKE_VERBOSE_MAKEFILE on)
8
+
9
+ file(GLOB react_codegen_SRCS CONFIGURE_DEPENDS *.cpp react/renderer/components/RNFBStorageTurboModules/*.cpp)
10
+
11
+ add_library(
12
+ react_codegen_RNFBStorageTurboModules
13
+ OBJECT
14
+ ${react_codegen_SRCS}
15
+ )
16
+
17
+ target_include_directories(react_codegen_RNFBStorageTurboModules PUBLIC . react/renderer/components/RNFBStorageTurboModules)
18
+
19
+ target_link_libraries(
20
+ react_codegen_RNFBStorageTurboModules
21
+ fbjni
22
+ jsi
23
+ # We need to link different libraries based on whether we are building rncore or not, that's necessary
24
+ # because we want to break a circular dependency between react_codegen_rncore and reactnative
25
+ reactnative
26
+ )
27
+
28
+ target_compile_options(
29
+ react_codegen_RNFBStorageTurboModules
30
+ PRIVATE
31
+ -DLOG_TAG=\"ReactNative\"
32
+ -fexceptions
33
+ -frtti
34
+ -std=c++20
35
+ -Wall
36
+ )