@react-native-firebase/storage 25.1.0 → 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.
- package/CHANGELOG.md +21 -0
- package/RNFBStorage.podspec +17 -6
- package/android/build.gradle +23 -0
- package/android/src/main/java/io/invertase/firebase/storage/{ReactNativeFirebaseStorageModule.java → NativeRNFBTurboStorage.java} +72 -131
- package/android/src/main/java/io/invertase/firebase/storage/ReactNativeFirebaseStoragePackage.java +1 -1
- package/android/src/main/java/io/invertase/firebase/storage/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboStorageSpec.java +125 -0
- package/android/src/main/java/io/invertase/firebase/storage/generated/jni/CMakeLists.txt +36 -0
- package/android/src/main/java/io/invertase/firebase/storage/generated/jni/RNFBStorageTurboModules-generated.cpp +116 -0
- package/android/src/main/java/io/invertase/firebase/storage/generated/jni/RNFBStorageTurboModules.h +31 -0
- package/android/src/main/java/io/invertase/firebase/storage/generated/jni/react/renderer/components/RNFBStorageTurboModules/RNFBStorageTurboModulesJSI-generated.cpp +153 -0
- package/android/src/main/java/io/invertase/firebase/storage/generated/jni/react/renderer/components/RNFBStorageTurboModules/RNFBStorageTurboModulesJSI.h +246 -0
- package/dist/module/StorageReference.js +4 -7
- package/dist/module/StorageReference.js.map +1 -1
- package/dist/module/StorageTask.js.map +1 -1
- package/dist/module/index.js +384 -6
- package/dist/module/index.js.map +1 -1
- package/dist/module/types/storage.js +6 -2
- package/dist/module/types/storage.js.map +1 -1
- package/dist/module/version.js +1 -1
- package/dist/module/web/RNFBStorageModule.js +9 -11
- package/dist/module/web/RNFBStorageModule.js.map +1 -1
- package/dist/typescript/lib/StorageReference.d.ts.map +1 -1
- package/dist/typescript/lib/StorageTask.d.ts +7 -8
- package/dist/typescript/lib/StorageTask.d.ts.map +1 -1
- package/dist/typescript/lib/index.d.ts +150 -4
- package/dist/typescript/lib/index.d.ts.map +1 -1
- package/dist/typescript/lib/types/internal.d.ts +5 -5
- package/dist/typescript/lib/types/internal.d.ts.map +1 -1
- package/dist/typescript/lib/types/storage.d.ts +15 -10
- package/dist/typescript/lib/types/storage.d.ts.map +1 -1
- package/dist/typescript/lib/version.d.ts +1 -1
- package/dist/typescript/lib/web/RNFBStorageModule.d.ts +3 -3
- package/dist/typescript/lib/web/RNFBStorageModule.d.ts.map +1 -1
- package/ios/RNFBStorage/RNFBStorageModule.h +2 -2
- package/ios/RNFBStorage/{RNFBStorageModule.m → RNFBStorageModule.mm} +193 -130
- package/ios/RNFBStorage.xcodeproj/project.pbxproj +8 -8
- package/ios/generated/RCTAppDependencyProvider.h +25 -0
- package/ios/generated/RCTAppDependencyProvider.mm +55 -0
- package/ios/generated/RCTModulesConformingToProtocolsProvider.h +18 -0
- package/ios/generated/RCTModulesConformingToProtocolsProvider.mm +33 -0
- package/ios/generated/RCTThirdPartyComponentsProvider.h +16 -0
- package/ios/generated/RCTThirdPartyComponentsProvider.mm +23 -0
- package/ios/generated/RNFBStorageTurboModules/RNFBStorageTurboModules-generated.mm +142 -0
- package/ios/generated/RNFBStorageTurboModules/RNFBStorageTurboModules.h +198 -0
- package/ios/generated/RNFBStorageTurboModulesJSI-generated.cpp +153 -0
- package/ios/generated/RNFBStorageTurboModulesJSI.h +246 -0
- package/ios/generated/ReactAppDependencyProvider.podspec +34 -0
- package/lib/StorageReference.ts +3 -8
- package/lib/StorageTask.ts +13 -15
- package/lib/index.ts +501 -7
- package/lib/types/internal.ts +5 -5
- package/lib/types/storage.ts +17 -10
- package/lib/version.ts +1 -1
- package/lib/web/RNFBStorageModule.ts +10 -12
- package/package.json +22 -4
- package/react-native.config.js +10 -0
- package/specs/NativeRNFBTurboStorage.ts +46 -0
- package/typedoc.json +2 -3
- package/dist/module/modular.js +0 -270
- package/dist/module/modular.js.map +0 -1
- package/dist/module/namespaced.js +0 -192
- package/dist/module/namespaced.js.map +0 -1
- package/dist/module/types/namespaced.js +0 -64
- package/dist/module/types/namespaced.js.map +0 -1
- package/dist/typescript/lib/modular.d.ts +0 -154
- package/dist/typescript/lib/modular.d.ts.map +0 -1
- package/dist/typescript/lib/namespaced.d.ts +0 -12
- package/dist/typescript/lib/namespaced.d.ts.map +0 -1
- package/dist/typescript/lib/types/namespaced.d.ts +0 -1122
- package/dist/typescript/lib/types/namespaced.d.ts.map +0 -1
- package/lib/modular.ts +0 -401
- package/lib/namespaced.ts +0 -264
- package/lib/types/namespaced.ts +0 -1248
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,27 @@
|
|
|
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
|
+
|
|
6
27
|
## [25.1.0](https://github.com/invertase/react-native-firebase/compare/v25.0.1...v25.1.0) (2026-06-25)
|
|
7
28
|
|
|
8
29
|
**Note:** Version bump only for package @react-native-firebase/storage
|
package/RNFBStorage.podspec
CHANGED
|
@@ -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
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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)
|
package/android/build.gradle
CHANGED
|
@@ -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.
|
|
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
|
|
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
|
-
|
|
50
|
-
|
|
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
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
@
|
|
370
|
-
public
|
|
371
|
-
switch (status) {
|
|
322
|
+
@Override
|
|
323
|
+
public boolean setTaskStatus(String appName, double taskId, double status) {
|
|
324
|
+
switch ((int) status) {
|
|
372
325
|
case 0:
|
|
373
|
-
|
|
374
|
-
break;
|
|
326
|
+
return ReactNativeFirebaseStorageTask.pauseTaskById((int) taskId);
|
|
375
327
|
case 1:
|
|
376
|
-
|
|
377
|
-
break;
|
|
328
|
+
return ReactNativeFirebaseStorageTask.resumeTaskById((int) taskId);
|
|
378
329
|
case 2:
|
|
379
|
-
|
|
380
|
-
|
|
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
|
}
|
package/android/src/main/java/io/invertase/firebase/storage/ReactNativeFirebaseStoragePackage.java
CHANGED
|
@@ -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
|
|
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
|
+
)
|