@react-native-firebase/storage 20.4.0 → 20.5.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 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
  }