Skip to content

Commit e938824

Browse files
committed
fix(storage, android): correctly catch native exceptions for Promise.reject
Previously if you sent undefined in as a URL, or a URL that was unparseable, the native android code would throw IllegalArgumentException, which would crash the app with a native exception. Now those exceptions are caught and bubbled up to the javascript layer correctly as a promise rejection Fixes #4097
1 parent 7a4f78e commit e938824

File tree

1 file changed

+120
-85
lines changed

1 file changed

+120
-85
lines changed

packages/storage/android/src/main/java/io/invertase/firebase/storage/ReactNativeFirebaseStorageModule.java

Lines changed: 120 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -61,81 +61,101 @@ public void onCatalystInstanceDestroy() {
6161
*/
6262
@ReactMethod
6363
public void delete(String appName, String url, final Promise promise) {
64-
StorageReference reference = getReferenceFromUrl(url, appName);
65-
reference.delete().addOnCompleteListener(task -> {
66-
if (task.isSuccessful()) {
67-
promise.resolve(null);
68-
} else {
69-
promiseRejectStorageException(promise, Objects.requireNonNull(task.getException()));
70-
}
71-
});
64+
try {
65+
StorageReference reference = getReferenceFromUrl(url, appName);
66+
reference.delete().addOnCompleteListener(task -> {
67+
if (task.isSuccessful()) {
68+
promise.resolve(null);
69+
} else {
70+
promiseRejectStorageException(promise, Objects.requireNonNull(task.getException()));
71+
}
72+
});
73+
} catch (Exception e) {
74+
promiseRejectStorageException(promise, e);
75+
}
7276
}
7377

7478
/**
7579
* @url https://firebase.google.com/docs/reference/js/firebase.storage.Reference#getDownloadURL
7680
*/
7781
@ReactMethod
7882
public void getDownloadURL(String appName, final String url, final Promise promise) {
79-
StorageReference reference = getReferenceFromUrl(url, appName);
80-
Task<Uri> downloadTask = reference.getDownloadUrl();
81-
82-
downloadTask.addOnCompleteListener(task -> {
83-
if (task.isSuccessful()) {
84-
promise.resolve(task.getResult() != null ? task.getResult().toString() : null);
85-
} else {
86-
promiseRejectStorageException(promise, task.getException());
87-
}
88-
});
83+
try {
84+
StorageReference reference = getReferenceFromUrl(url, appName);
85+
Task<Uri> downloadTask = reference.getDownloadUrl();
86+
87+
downloadTask.addOnCompleteListener(task -> {
88+
if (task.isSuccessful()) {
89+
promise.resolve(task.getResult() != null ? task.getResult().toString() : null);
90+
} else {
91+
promiseRejectStorageException(promise, task.getException());
92+
}
93+
});
94+
} catch (Exception e) {
95+
promiseRejectStorageException(promise, e);
96+
}
8997
}
9098

9199
/**
92100
* @url https://firebase.google.com/docs/reference/js/firebase.storage.Reference#getMetadata
93101
*/
94102
@ReactMethod
95103
public void getMetadata(String appName, String url, Promise promise) {
96-
StorageReference reference = getReferenceFromUrl(url, appName);
97-
reference.getMetadata().addOnCompleteListener(getExecutor(), task -> {
98-
if (task.isSuccessful()) {
99-
promise.resolve(getMetadataAsMap(task.getResult()));
100-
} else {
101-
promiseRejectStorageException(promise, task.getException());
102-
}
103-
});
104+
try {
105+
StorageReference reference = getReferenceFromUrl(url, appName);
106+
reference.getMetadata().addOnCompleteListener(getExecutor(), task -> {
107+
if (task.isSuccessful()) {
108+
promise.resolve(getMetadataAsMap(task.getResult()));
109+
} else {
110+
promiseRejectStorageException(promise, task.getException());
111+
}
112+
});
113+
} catch (Exception e) {
114+
promiseRejectStorageException(promise, e);
115+
}
104116
}
105117

106118
@ReactMethod
107119
public void list(String appName, String url, ReadableMap listOptions, Promise promise) {
108-
StorageReference reference = getReferenceFromUrl(url, appName);
109-
Task<ListResult> list;
120+
try {
121+
StorageReference reference = getReferenceFromUrl(url, appName);
122+
Task<ListResult> list;
110123

111-
int maxResults = listOptions.getInt("maxResults");
112-
113-
if (listOptions.hasKey("pageToken")) {
114-
String pageToken = listOptions.getString("pageToken");
115-
list = reference.list(maxResults, Objects.requireNonNull(pageToken));
116-
} else {
117-
list = reference.list(maxResults);
118-
}
124+
int maxResults = listOptions.getInt("maxResults");
119125

120-
list.addOnCompleteListener(getExecutor(), task -> {
121-
if (task.isSuccessful()) {
122-
promise.resolve(getListResultAsMap(task.getResult()));
126+
if (listOptions.hasKey("pageToken")) {
127+
String pageToken = listOptions.getString("pageToken");
128+
list = reference.list(maxResults, Objects.requireNonNull(pageToken));
123129
} else {
124-
promiseRejectStorageException(promise, task.getException());
130+
list = reference.list(maxResults);
125131
}
126-
});
132+
133+
list.addOnCompleteListener(getExecutor(), task -> {
134+
if (task.isSuccessful()) {
135+
promise.resolve(getListResultAsMap(task.getResult()));
136+
} else {
137+
promiseRejectStorageException(promise, task.getException());
138+
}
139+
});
140+
} catch (Exception e) {
141+
promiseRejectStorageException(promise, e);
142+
}
127143
}
128144

129145
@ReactMethod
130146
public void listAll(String appName, String url, Promise promise) {
131-
StorageReference reference = getReferenceFromUrl(url, appName);
132-
reference.listAll().addOnCompleteListener(getExecutor(), task -> {
133-
if (task.isSuccessful()) {
134-
promise.resolve(getListResultAsMap(task.getResult()));
135-
} else {
136-
promiseRejectStorageException(promise, task.getException());
137-
}
138-
});
147+
try {
148+
StorageReference reference = getReferenceFromUrl(url, appName);
149+
reference.listAll().addOnCompleteListener(getExecutor(), task -> {
150+
if (task.isSuccessful()) {
151+
promise.resolve(getListResultAsMap(task.getResult()));
152+
} else {
153+
promiseRejectStorageException(promise, task.getException());
154+
}
155+
});
156+
} catch (Exception e) {
157+
promiseRejectStorageException(promise, e);
158+
}
139159
}
140160

141161
/**
@@ -148,16 +168,20 @@ public void updateMetadata(
148168
ReadableMap metadataMap,
149169
final Promise promise
150170
) {
151-
StorageReference reference = getReferenceFromUrl(url, appName);
152-
StorageMetadata metadata = buildMetadataFromMap(metadataMap, null);
153-
154-
reference.updateMetadata(metadata).addOnCompleteListener(getExecutor(), task -> {
155-
if (task.isSuccessful()) {
156-
promise.resolve(getMetadataAsMap(task.getResult()));
157-
} else {
158-
promiseRejectStorageException(promise, task.getException());
159-
}
160-
});
171+
try {
172+
StorageReference reference = getReferenceFromUrl(url, appName);
173+
StorageMetadata metadata = buildMetadataFromMap(metadataMap, null);
174+
175+
reference.updateMetadata(metadata).addOnCompleteListener(getExecutor(), task -> {
176+
if (task.isSuccessful()) {
177+
promise.resolve(getMetadataAsMap(task.getResult()));
178+
} else {
179+
promiseRejectStorageException(promise, task.getException());
180+
}
181+
});
182+
} catch (Exception e) {
183+
promiseRejectStorageException(promise, e);
184+
}
161185
}
162186

163187
/**
@@ -214,15 +238,18 @@ public void writeToFile(
214238
);
215239
return;
216240
}
217-
218-
StorageReference reference = getReferenceFromUrl(url, appName);
219-
ReactNativeFirebaseStorageDownloadTask storageTask = new ReactNativeFirebaseStorageDownloadTask(
220-
taskId,
221-
reference,
222-
appName
223-
);
224-
storageTask.begin(getTransactionalExecutor(), localFilePath);
225-
storageTask.addOnCompleteListener(getTransactionalExecutor(), promise);
241+
try {
242+
StorageReference reference = getReferenceFromUrl(url, appName);
243+
ReactNativeFirebaseStorageDownloadTask storageTask = new ReactNativeFirebaseStorageDownloadTask(
244+
taskId,
245+
reference,
246+
appName
247+
);
248+
storageTask.begin(getTransactionalExecutor(), localFilePath);
249+
storageTask.addOnCompleteListener(getTransactionalExecutor(), promise);
250+
} catch (Exception e) {
251+
promiseRejectStorageException(promise, e);
252+
}
226253
}
227254

228255
/**
@@ -238,14 +265,18 @@ public void putString(
238265
int taskId,
239266
Promise promise
240267
) {
241-
StorageReference reference = getReferenceFromUrl(url, appName);
242-
ReactNativeFirebaseStorageUploadTask storageTask = new ReactNativeFirebaseStorageUploadTask(
243-
taskId,
244-
reference,
245-
appName
246-
);
247-
storageTask.begin(getTransactionalExecutor(), string, format, metadataMap);
248-
storageTask.addOnCompleteListener(getTransactionalExecutor(),promise);
268+
try {
269+
StorageReference reference = getReferenceFromUrl(url, appName);
270+
ReactNativeFirebaseStorageUploadTask storageTask = new ReactNativeFirebaseStorageUploadTask(
271+
taskId,
272+
reference,
273+
appName
274+
);
275+
storageTask.begin(getTransactionalExecutor(), string, format, metadataMap);
276+
storageTask.addOnCompleteListener(getTransactionalExecutor(),promise);
277+
} catch (Exception e) {
278+
promiseRejectStorageException(promise, e);
279+
}
249280
}
250281

251282
/**
@@ -260,14 +291,18 @@ public void putFile(
260291
int taskId,
261292
Promise promise
262293
) {
263-
StorageReference reference = getReferenceFromUrl(url, appName);
264-
ReactNativeFirebaseStorageUploadTask storageTask = new ReactNativeFirebaseStorageUploadTask(
265-
taskId,
266-
reference,
267-
appName
268-
);
269-
storageTask.begin(getTransactionalExecutor(),localFilePath, metadata);
270-
storageTask.addOnCompleteListener(getTransactionalExecutor(), promise);
294+
try {
295+
StorageReference reference = getReferenceFromUrl(url, appName);
296+
ReactNativeFirebaseStorageUploadTask storageTask = new ReactNativeFirebaseStorageUploadTask(
297+
taskId,
298+
reference,
299+
appName
300+
);
301+
storageTask.begin(getTransactionalExecutor(),localFilePath, metadata);
302+
storageTask.addOnCompleteListener(getTransactionalExecutor(), promise);
303+
} catch (Exception e) {
304+
promiseRejectStorageException(promise, e);
305+
}
271306
}
272307

273308
@ReactMethod
@@ -290,7 +325,7 @@ private String getBucketFromUrl(String url) {
290325
return url.substring(0, pathWithBucketName.indexOf("/") + 5);
291326
}
292327

293-
private StorageReference getReferenceFromUrl(String url, String appName) {
328+
private StorageReference getReferenceFromUrl(String url, String appName) throws IllegalArgumentException {
294329
FirebaseApp firebaseApp = FirebaseApp.getInstance(appName);
295330
FirebaseStorage firebaseStorage = FirebaseStorage.getInstance(
296331
firebaseApp,

0 commit comments

Comments
 (0)