@react-native-firebase/storage 20.4.0 → 20.5.0

Sign up to get free protection for your applications and to get access to all the features.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,10 @@
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
+ ## [20.5.0](https://github.com/invertase/react-native-firebase/compare/v20.4.0...v20.5.0) (2024-09-11)
7
+
8
+ **Note:** Version bump only for package @react-native-firebase/storage
9
+
6
10
  ## [20.4.0](https://github.com/invertase/react-native-firebase/compare/v20.3.0...v20.4.0) (2024-08-13)
7
11
 
8
12
  ### Features
package/lib/version.js CHANGED
@@ -1,2 +1,2 @@
1
1
  // Generated by genversion.
2
- module.exports = '20.4.0';
2
+ module.exports = '20.5.0';
@@ -120,32 +120,48 @@ const storageInstances = {};
120
120
  const tasks = {};
121
121
 
122
122
  function getBucketFromUrl(url) {
123
- const pathWithBucketName = url.substring(5);
124
- const bucket = url.substring(0, pathWithBucketName.indexOf('/') + 5);
125
- return bucket;
123
+ // Check if the URL starts with "gs://"
124
+ if (url.startsWith('gs://')) {
125
+ // Return the bucket name by extracting everything up to the first slash after "gs://"
126
+ // and removing the "gs://" prefix
127
+ return url.substring(5).split('/')[0];
128
+ } else {
129
+ // Assume the URL is a path format, strip the leading slash if it exists and extract the bucket name
130
+ const strippedUrl = url.startsWith('/') ? url.substring(1) : url;
131
+ // Extract the bucket from the path, assuming it ends at the first slash after the domain
132
+ return strippedUrl.split('/')[0];
133
+ }
126
134
  }
127
135
 
128
136
  function getCachedAppInstance(appName) {
129
137
  return (appInstances[appName] ??= getApp(appName));
130
138
  }
131
139
 
140
+ function emulatorKey(appName, url) {
141
+ const bucket = getBucketFromUrl(url);
142
+ return `${appName}|${bucket}`;
143
+ }
144
+
132
145
  // Returns a cached Storage instance.
133
146
  function getCachedStorageInstance(appName, url) {
134
147
  let instance;
148
+ const bucket = url ? getBucketFromUrl(url) : getCachedAppInstance(appName).options.storageBucket;
149
+
135
150
  if (!url) {
136
151
  instance = getCachedStorageInstance(
137
152
  appName,
138
153
  getCachedAppInstance(appName).options.storageBucket,
139
154
  );
140
155
  } else {
141
- const bucket = getBucketFromUrl(url);
142
156
  instance = storageInstances[`${appName}|${bucket}`] ??= getStorage(
143
157
  getCachedAppInstance(appName),
144
158
  bucket,
145
159
  );
146
160
  }
147
- if (emulatorForApp[appName]) {
148
- connectStorageEmulator(instance, emulatorForApp[appName].host, emulatorForApp[appName].port);
161
+
162
+ const key = emulatorKey(appName, bucket);
163
+ if (emulatorForApp[key]) {
164
+ connectStorageEmulator(instance, emulatorForApp[key].host, emulatorForApp[key].port);
149
165
  }
150
166
  return instance;
151
167
  }
@@ -296,11 +312,12 @@ export default {
296
312
  * @param {number} port - The emulator port.
297
313
  * @return {Promise<void>}
298
314
  */
299
- useEmulator(appName, host, port) {
315
+ useEmulator(appName, host, port, url) {
300
316
  return guard(async () => {
301
- const instance = getCachedStorageInstance(appName);
317
+ const instance = getCachedStorageInstance(appName, url);
302
318
  connectStorageEmulator(instance, host, port);
303
- emulatorForApp[appName] = { host, port };
319
+ const key = emulatorKey(appName, url);
320
+ emulatorForApp[key] = { host, port };
304
321
  });
305
322
  },
306
323
 
@@ -324,28 +341,23 @@ export default {
324
341
  putString(appName, url, string, format, metadata = {}, taskId) {
325
342
  return guard(async () => {
326
343
  const ref = getReferenceFromUrl(appName, url);
344
+ let decodedString = null;
327
345
 
328
- let base64String = null;
329
-
346
+ // This is always either base64 or base64url
330
347
  switch (format) {
331
348
  case 'base64':
332
- base64String = Base64.atob(string);
349
+ decodedString = Base64.atob(string);
333
350
  break;
334
351
  case 'base64url':
335
- base64String = Base64.atob(string.replace(/_/g, '/').replace(/-/g, '+'));
352
+ decodedString = Base64.atob(string.replace(/_/g, '/').replace(/-/g, '+'));
336
353
  break;
337
354
  }
338
355
 
339
- const byteArray = new Uint8Array(base64String ? base64String.length : 0);
356
+ const encoder = new TextEncoder();
340
357
 
341
- if (base64String) {
342
- for (let i = 0; i < base64String.length; i++) {
343
- byteArray[i] = base64String.charCodeAt(i);
344
- }
345
- }
358
+ const arrayBuffer = encoder.encode(decodedString).buffer;
346
359
 
347
- // Start a resumable upload task.
348
- const task = uploadBytesResumable(ref, byteArray, {
360
+ const task = uploadBytesResumable(ref, arrayBuffer, {
349
361
  ...makeSettableMetadata(metadata),
350
362
  md5Hash: metadata.md5Hash,
351
363
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-native-firebase/storage",
3
- "version": "20.4.0",
3
+ "version": "20.5.0",
4
4
  "author": "Invertase <oss@invertase.io> (http://invertase.io)",
5
5
  "description": "React Native Firebase - React Native Firebase provides native integration with Cloud Storage, providing support to upload and download files directly from your device and from your Firebase Cloud Storage bucket.",
6
6
  "main": "lib/index.js",
@@ -29,10 +29,10 @@
29
29
  "download"
30
30
  ],
31
31
  "peerDependencies": {
32
- "@react-native-firebase/app": "20.4.0"
32
+ "@react-native-firebase/app": "20.5.0"
33
33
  },
34
34
  "publishConfig": {
35
35
  "access": "public"
36
36
  },
37
- "gitHead": "3ac3e9623674a8db52c111b4aa0a85a883260116"
37
+ "gitHead": "daf2bc9086c14bbb0e1b02a4d4274b7060263eb1"
38
38
  }