@react-native-firebase/storage 26.0.0 → 26.2.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.
@@ -15,33 +15,17 @@
15
15
  *
16
16
  */
17
17
 
18
- #import <Firebase/Firebase.h>
19
- #import <React/RCTUtils.h>
20
-
21
- #import "RNFBApp/RCTConvert+FIRApp.h"
22
- #import "RNFBApp/RNFBSharedUtils.h"
23
- #import "RNFBRCTEventEmitter.h"
24
- #import "RNFBStorageCommon.h"
18
+ // This module intentionally has no Firebase imports. FirebaseStorage is a
19
+ // pure-Swift SPM product with no importable ObjC header, so `@import
20
+ // FirebaseStorage` cannot be used from an Objective-C++ (.mm) TurboModule
21
+ // (see docs/ios-spm.mdx and okf-bundle/ios-spm-native-imports.md). Every
22
+ // Firebase Storage SDK call is routed through the plain Objective-C
23
+ // RNFBStorageHelper class instead, which can safely `@import
24
+ // FirebaseStorage` because it compiles as ObjC, not ObjC++.
25
25
  #import "RNFBStorageModule.h"
26
+ #import "RNFBStorageHelper.h"
26
27
  #import "RNFBStorageTurboModules.h"
27
28
 
28
- static NSString *const RNFB_STORAGE_EVENT = @"storage_event";
29
- static NSString *const RNFB_STORAGE_STATE_CHANGED = @"state_changed";
30
- static NSString *const RNFB_STORAGE_UPLOAD_SUCCESS = @"upload_success";
31
- static NSString *const RNFB_STORAGE_UPLOAD_FAILURE = @"upload_failure";
32
- static NSString *const RNFB_STORAGE_DOWNLOAD_SUCCESS = @"download_success";
33
- static NSString *const RNFB_STORAGE_DOWNLOAD_FAILURE = @"download_failure";
34
-
35
- static NSMutableDictionary *PENDING_TASKS;
36
-
37
- // The iOS SDK has a short memory on settings, store these globally and set them in each time
38
- static NSString *emulatorHost = nil;
39
- static NSInteger emulatorPort = 0;
40
- static NSMutableDictionary *emulatorConfigs;
41
- static NSTimeInterval maxDownloadRetryTime = 600;
42
- static NSTimeInterval maxUploadRetryTime = 600;
43
- static NSTimeInterval maxOperationRetryTime = 120;
44
-
45
29
  @implementation RNFBStorageModule
46
30
  #pragma mark -
47
31
  #pragma mark Module Setup
@@ -57,28 +41,8 @@ RCT_EXPORT_MODULE(NativeRNFBTurboStorage);
57
41
  return std::make_shared<facebook::react::NativeRNFBTurboStorageSpecJSI>(params);
58
42
  }
59
43
 
60
- - (id)init {
61
- self = [super init];
62
-
63
- static dispatch_once_t onceToken;
64
- dispatch_once(&onceToken, ^{
65
- PENDING_TASKS = [[NSMutableDictionary alloc] init];
66
- emulatorConfigs = [[NSMutableDictionary alloc] init];
67
- });
68
-
69
- return self;
70
- }
71
-
72
- - (void)dealloc {
73
- for (NSString *key in [PENDING_TASKS allKeys]) {
74
- [PENDING_TASKS removeObjectForKey:key];
75
- }
76
- }
77
-
78
44
  - (void)invalidate {
79
- for (NSString *key in [PENDING_TASKS allKeys]) {
80
- [PENDING_TASKS removeObjectForKey:key];
81
- }
45
+ [RNFBStorageHelper invalidate];
82
46
  }
83
47
 
84
48
  #pragma mark -
@@ -91,16 +55,7 @@ RCT_EXPORT_MODULE(NativeRNFBTurboStorage);
91
55
  url:(NSString *)url
92
56
  resolve:(RCTPromiseResolveBlock)resolve
93
57
  reject:(RCTPromiseRejectBlock)reject {
94
- FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
95
- FIRStorageReference *storageReference = [self getReferenceFromUrl:url app:firebaseApp];
96
-
97
- [storageReference deleteWithCompletion:^(NSError *_Nullable error) {
98
- if (error != nil) {
99
- [self promiseRejectStorageException:reject error:error];
100
- } else {
101
- resolve([NSNull null]);
102
- }
103
- }];
58
+ [RNFBStorageHelper deleteObject:appName url:url resolve:resolve reject:reject];
104
59
  }
105
60
 
106
61
  /**
@@ -110,23 +65,7 @@ RCT_EXPORT_MODULE(NativeRNFBTurboStorage);
110
65
  url:(NSString *)url
111
66
  resolve:(RCTPromiseResolveBlock)resolve
112
67
  reject:(RCTPromiseRejectBlock)reject {
113
- FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
114
- FIRStorageReference *storageReference = [self getReferenceFromUrl:url app:firebaseApp];
115
-
116
- [storageReference downloadURLWithCompletion:^(NSURL *_Nullable URL, NSError *_Nullable error) {
117
- if (error != nil) {
118
- [self promiseRejectStorageException:reject error:error];
119
- } else {
120
- NSString *url = URL.absoluteString;
121
-
122
- if ([url rangeOfString:@":443"].location != NSNotFound) {
123
- NSRange replaceRange = [url rangeOfString:@":443"];
124
- url = [url stringByReplacingCharactersInRange:replaceRange withString:@""];
125
- }
126
-
127
- resolve(url);
128
- }
129
- }];
68
+ [RNFBStorageHelper getDownloadURL:appName url:url resolve:resolve reject:reject];
130
69
  }
131
70
 
132
71
  /**
@@ -136,60 +75,22 @@ RCT_EXPORT_MODULE(NativeRNFBTurboStorage);
136
75
  url:(NSString *)url
137
76
  resolve:(RCTPromiseResolveBlock)resolve
138
77
  reject:(RCTPromiseRejectBlock)reject {
139
- FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
140
- FIRStorageReference *storageReference = [self getReferenceFromUrl:url app:firebaseApp];
141
-
142
- [storageReference
143
- metadataWithCompletion:^(FIRStorageMetadata *_Nullable metadata, NSError *_Nullable error) {
144
- if (error != nil) {
145
- [self promiseRejectStorageException:reject error:error];
146
- } else {
147
- resolve([RNFBStorageCommon metadataToDict:metadata]);
148
- }
149
- }];
78
+ [RNFBStorageHelper getMetadata:appName url:url resolve:resolve reject:reject];
150
79
  }
151
80
 
152
81
  /**
153
82
  * @url https://firebase.google.com/docs/reference/js/firebase.storage.Reference#updateMetadata
154
83
  */
155
- - (NSDictionary *)decodedMetadataMap:(NSDictionary *_Nullable)metadata {
156
- if (metadata == nil) {
157
- return @{};
158
- }
159
-
160
- return [RNFBSharedUtils decodeNullSentinels:metadata];
161
- }
162
-
163
84
  - (void)updateMetadata:(NSString *)appName
164
85
  url:(NSString *)url
165
86
  metadata:(NSDictionary *_Nullable)metadata
166
87
  resolve:(RCTPromiseResolveBlock)resolve
167
88
  reject:(RCTPromiseRejectBlock)reject {
168
- FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
169
- FIRStorageReference *storageReference = [self getReferenceFromUrl:url app:firebaseApp];
170
- NSDictionary *metadataMap = [self decodedMetadataMap:metadata];
171
-
172
- [storageReference metadataWithCompletion:^(FIRStorageMetadata *_Nullable fetchedMetadata,
173
- NSError *_Nullable error) {
174
- if (error != nil) {
175
- [self promiseRejectStorageException:reject error:error];
176
- } else {
177
- FIRStorageMetadata *storageMetadata =
178
- [RNFBStorageCommon buildMetadataFromMap:metadataMap
179
- existingMetadata:fetchedMetadata
180
- path:[storageReference fullPath]];
181
-
182
- [storageReference updateMetadata:storageMetadata
183
- completion:^(FIRStorageMetadata *_Nullable updatedMetadata,
184
- NSError *_Nullable error) {
185
- if (error != nil) {
186
- [self promiseRejectStorageException:reject error:error];
187
- } else {
188
- resolve([RNFBStorageCommon metadataToDict:updatedMetadata]);
189
- }
190
- }];
191
- }
192
- }];
89
+ [RNFBStorageHelper updateMetadata:appName
90
+ url:url
91
+ metadata:metadata
92
+ resolve:resolve
93
+ reject:reject];
193
94
  }
194
95
 
195
96
  /**
@@ -200,27 +101,14 @@ RCT_EXPORT_MODULE(NativeRNFBTurboStorage);
200
101
  listOptions:(JS::NativeRNFBTurboStorage::StorageListOptions &)listOptions
201
102
  resolve:(RCTPromiseResolveBlock)resolve
202
103
  reject:(RCTPromiseRejectBlock)reject {
203
- FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
204
- FIRStorageReference *storageReference = [self getReferenceFromUrl:url app:firebaseApp];
205
104
  long maxResults = (long)listOptions.maxResults();
206
-
207
- id completionBlock = ^(FIRStorageListResult *result, NSError *error) {
208
- if (error != nil) {
209
- [self promiseRejectStorageException:reject error:error];
210
- } else {
211
- NSDictionary *listResultDict = [RNFBStorageCommon listResultToDict:result];
212
- resolve(listResultDict);
213
- }
214
- };
215
-
216
105
  NSString *pageToken = listOptions.pageToken();
217
- if (pageToken != nil) {
218
- [storageReference listWithMaxResults:(int64_t)maxResults
219
- pageToken:pageToken
220
- completion:completionBlock];
221
- } else {
222
- [storageReference listWithMaxResults:(int64_t)maxResults completion:completionBlock];
223
- }
106
+ [RNFBStorageHelper list:appName
107
+ url:url
108
+ maxResults:maxResults
109
+ pageToken:pageToken
110
+ resolve:resolve
111
+ reject:reject];
224
112
  }
225
113
 
226
114
  /**
@@ -230,27 +118,7 @@ RCT_EXPORT_MODULE(NativeRNFBTurboStorage);
230
118
  url:(NSString *)url
231
119
  resolve:(RCTPromiseResolveBlock)resolve
232
120
  reject:(RCTPromiseRejectBlock)reject {
233
- FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
234
- FIRStorageReference *storageReference = [self getReferenceFromUrl:url app:firebaseApp];
235
-
236
- __block bool alreadyCompleted = false;
237
-
238
- id completionBlock = ^(FIRStorageListResult *result, NSError *error) {
239
- // This may be called multiple times if an error occurs
240
- // Make sure we won't try to resolve the promise twice in this case
241
- // TODO - remove pending resolution of https://github.com/firebase/firebase-ios-sdk/issues/7197
242
- if (alreadyCompleted) {
243
- return;
244
- }
245
- alreadyCompleted = true;
246
- if (error != nil) {
247
- [self promiseRejectStorageException:reject error:error];
248
- } else {
249
- resolve([RNFBStorageCommon listResultToDict:result]);
250
- }
251
- };
252
-
253
- [storageReference listAllWithCompletion:completionBlock];
121
+ [RNFBStorageHelper listAll:appName url:url resolve:resolve reject:reject];
254
122
  }
255
123
 
256
124
  /**
@@ -261,10 +129,10 @@ RCT_EXPORT_MODULE(NativeRNFBTurboStorage);
261
129
  milliseconds:(double)milliseconds
262
130
  resolve:(RCTPromiseResolveBlock)resolve
263
131
  reject:(RCTPromiseRejectBlock)reject {
264
- FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
265
- maxDownloadRetryTime = milliseconds / 1000;
266
- [[FIRStorage storageForApp:firebaseApp] setMaxDownloadRetryTime:milliseconds / 1000];
267
- resolve([NSNull null]);
132
+ [RNFBStorageHelper setMaxDownloadRetryTime:appName
133
+ milliseconds:milliseconds
134
+ resolve:resolve
135
+ reject:reject];
268
136
  }
269
137
 
270
138
  /**
@@ -275,10 +143,10 @@ RCT_EXPORT_MODULE(NativeRNFBTurboStorage);
275
143
  milliseconds:(double)milliseconds
276
144
  resolve:(RCTPromiseResolveBlock)resolve
277
145
  reject:(RCTPromiseRejectBlock)reject {
278
- FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
279
- maxOperationRetryTime = milliseconds / 1000;
280
- [[FIRStorage storageForApp:firebaseApp] setMaxOperationRetryTime:milliseconds / 1000];
281
- resolve([NSNull null]);
146
+ [RNFBStorageHelper setMaxOperationRetryTime:appName
147
+ milliseconds:milliseconds
148
+ resolve:resolve
149
+ reject:reject];
282
150
  }
283
151
 
284
152
  /**
@@ -288,10 +156,10 @@ RCT_EXPORT_MODULE(NativeRNFBTurboStorage);
288
156
  milliseconds:(double)milliseconds
289
157
  resolve:(RCTPromiseResolveBlock)resolve
290
158
  reject:(RCTPromiseRejectBlock)reject {
291
- FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
292
- maxUploadRetryTime = milliseconds / 1000;
293
- [[FIRStorage storageForApp:firebaseApp] setMaxUploadRetryTime:milliseconds / 1000];
294
- resolve([NSNull null]);
159
+ [RNFBStorageHelper setMaxUploadRetryTime:appName
160
+ milliseconds:milliseconds
161
+ resolve:resolve
162
+ reject:reject];
295
163
  }
296
164
 
297
165
  /**
@@ -303,116 +171,12 @@ RCT_EXPORT_MODULE(NativeRNFBTurboStorage);
303
171
  taskId:(double)taskId
304
172
  resolve:(RCTPromiseResolveBlock)resolve
305
173
  reject:(RCTPromiseRejectBlock)reject {
306
- FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
307
- NSNumber *taskIdNumber = @(taskId);
308
- FIRStorageReference *storageReference = [self getReferenceFromUrl:url app:firebaseApp];
309
- NSURL *localFile = [NSURL fileURLWithPath:localFilePath];
310
-
311
- __block FIRStorageDownloadTask *downloadTask;
312
- RCTUnsafeExecuteOnMainQueueSync(^{
313
- downloadTask = [storageReference writeToFile:localFile];
314
- });
315
-
316
- PENDING_TASKS[taskIdNumber] = downloadTask;
317
-
318
- // download started or resumed
319
- [downloadTask
320
- observeStatus:FIRStorageTaskStatusResume
321
- handler:^(FIRStorageTaskSnapshot *snapshot) {
322
- NSDictionary *eventBody = [RNFBStorageCommon getDownloadTaskAsDictionary:snapshot];
323
- NSDictionary *event =
324
- [RNFBStorageCommon getStorageEventDictionary:eventBody
325
- internalEventName:RNFB_STORAGE_STATE_CHANGED
326
- appName:firebaseApp.name
327
- taskId:taskIdNumber];
328
- [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT body:event];
329
- }];
330
-
331
- // download paused
332
- [downloadTask
333
- observeStatus:FIRStorageTaskStatusPause
334
- handler:^(FIRStorageTaskSnapshot *snapshot) {
335
- NSDictionary *eventBody = [RNFBStorageCommon getDownloadTaskAsDictionary:snapshot];
336
- NSDictionary *event =
337
- [RNFBStorageCommon getStorageEventDictionary:eventBody
338
- internalEventName:RNFB_STORAGE_STATE_CHANGED
339
- appName:firebaseApp.name
340
- taskId:taskIdNumber];
341
- [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT body:event];
342
- }];
343
-
344
- // download reported progress
345
- [downloadTask
346
- observeStatus:FIRStorageTaskStatusProgress
347
- handler:^(FIRStorageTaskSnapshot *snapshot) {
348
- NSDictionary *eventBody = [RNFBStorageCommon getDownloadTaskAsDictionary:snapshot];
349
- NSDictionary *event =
350
- [RNFBStorageCommon getStorageEventDictionary:eventBody
351
- internalEventName:RNFB_STORAGE_STATE_CHANGED
352
- appName:firebaseApp.name
353
- taskId:taskIdNumber];
354
- [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT body:event];
355
- }];
356
-
357
- // download completed successfully
358
- [downloadTask
359
- observeStatus:FIRStorageTaskStatusSuccess
360
- handler:^(FIRStorageTaskSnapshot *snapshot) {
361
- [PENDING_TASKS removeObjectForKey:taskIdNumber];
362
-
363
- // state_changed
364
- NSDictionary *stateChangedEventBody =
365
- [RNFBStorageCommon getDownloadTaskAsDictionary:snapshot];
366
- NSDictionary *stateChangedEvent =
367
- [RNFBStorageCommon getStorageEventDictionary:stateChangedEventBody
368
- internalEventName:RNFB_STORAGE_STATE_CHANGED
369
- appName:firebaseApp.name
370
- taskId:taskIdNumber];
371
- [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT
372
- body:stateChangedEvent];
373
-
374
- // download_success
375
- NSDictionary *eventBody = [RNFBStorageCommon getDownloadTaskAsDictionary:snapshot];
376
- NSDictionary *event =
377
- [RNFBStorageCommon getStorageEventDictionary:eventBody
378
- internalEventName:RNFB_STORAGE_DOWNLOAD_SUCCESS
379
- appName:firebaseApp.name
380
- taskId:taskIdNumber];
381
- [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT body:event];
382
- resolve(eventBody);
383
- }];
384
-
385
- // download task failed
386
- [downloadTask
387
- observeStatus:FIRStorageTaskStatusFailure
388
- handler:^(FIRStorageTaskSnapshot *snapshot) {
389
- [PENDING_TASKS removeObjectForKey:taskIdNumber];
390
-
391
- // state_changed
392
- NSDictionary *stateChangedEventBody =
393
- [RNFBStorageCommon getDownloadTaskAsDictionary:snapshot];
394
- NSDictionary *stateChangedEvent =
395
- [RNFBStorageCommon getStorageEventDictionary:stateChangedEventBody
396
- internalEventName:RNFB_STORAGE_STATE_CHANGED
397
- appName:firebaseApp.name
398
- taskId:taskIdNumber];
399
- [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT
400
- body:stateChangedEvent];
401
-
402
- // download_failed
403
- NSMutableDictionary *taskSnapshotDict =
404
- [RNFBStorageCommon getDownloadTaskAsDictionary:snapshot];
405
- NSDictionary *eventBody = [RNFBStorageCommon buildErrorSnapshotDict:snapshot.error
406
- taskSnapshotDict:taskSnapshotDict];
407
- NSDictionary *event =
408
- [RNFBStorageCommon getStorageEventDictionary:eventBody
409
- internalEventName:RNFB_STORAGE_DOWNLOAD_FAILURE
410
- appName:firebaseApp.name
411
- taskId:taskIdNumber];
412
- [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT body:event];
413
-
414
- [self promiseRejectStorageException:reject error:snapshot.error];
415
- }];
174
+ [RNFBStorageHelper writeToFile:appName
175
+ url:url
176
+ localFilePath:localFilePath
177
+ taskId:taskId
178
+ resolve:resolve
179
+ reject:reject];
416
180
  }
417
181
 
418
182
  /**
@@ -425,69 +189,13 @@ RCT_EXPORT_MODULE(NativeRNFBTurboStorage);
425
189
  taskId:(double)taskId
426
190
  resolve:(RCTPromiseResolveBlock)resolve
427
191
  reject:(RCTPromiseRejectBlock)reject {
428
- FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
429
- NSNumber *taskIdNumber = @(taskId);
430
- FIRStorageReference *storageReference = [self getReferenceFromUrl:url app:firebaseApp];
431
- NSDictionary *metadataMap = [self decodedMetadataMap:metadata];
432
- FIRStorageMetadata *storageMetadata =
433
- [RNFBStorageCommon buildMetadataFromMap:metadataMap
434
- existingMetadata:nil
435
- path:[storageReference fullPath]];
436
-
437
- [RNFBStorageCommon
438
- NSURLForLocalFilePath:localFilePath
439
- completion:^(NSArray *errorCodeMessageArray, NSURL *temporaryFileUrl,
440
- NSString *contentType) {
441
- if (errorCodeMessageArray != nil) {
442
- // state_changed
443
- NSMutableDictionary *taskSnapshotDict =
444
- [RNFBStorageCommon getUploadTaskAsDictionary:nil];
445
- NSDictionary *eventBody = [RNFBStorageCommon
446
- buildErrorSnapshotDictFromCodeAndMessage:errorCodeMessageArray
447
- taskSnapshotDict:taskSnapshotDict];
448
- NSDictionary *stateChangedEvent = [RNFBStorageCommon
449
- getStorageEventDictionary:eventBody
450
- internalEventName:RNFB_STORAGE_STATE_CHANGED
451
- appName:[[[storageReference storage] app] name]
452
- taskId:taskIdNumber];
453
- [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT
454
- body:stateChangedEvent];
455
-
456
- // upload_failed
457
- NSDictionary *event = [RNFBStorageCommon
458
- getStorageEventDictionary:eventBody
459
- internalEventName:RNFB_STORAGE_UPLOAD_FAILURE
460
- appName:[[[storageReference storage] app] name]
461
- taskId:taskIdNumber];
462
- [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT body:event];
463
-
464
- [RNFBSharedUtils rejectPromiseWithUserInfo:reject
465
- userInfo:(NSMutableDictionary *)@{
466
- @"code" : errorCodeMessageArray[0],
467
- @"message" : errorCodeMessageArray[1],
468
- }];
469
- return;
470
- }
471
-
472
- storageMetadata.contentType = contentType;
473
-
474
- if ([storageMetadata valueForKey:@"contentType"] == nil) {
475
- storageMetadata.contentType =
476
- [RNFBStorageCommon mimeTypeForPath:localFilePath];
477
- }
478
-
479
- __block FIRStorageUploadTask *uploadTask;
480
- RCTUnsafeExecuteOnMainQueueSync(^{
481
- uploadTask = [storageReference putFile:temporaryFileUrl
482
- metadata:storageMetadata];
483
- });
484
-
485
- [self addUploadTaskObservers:uploadTask
486
- appDisplayName:[[[storageReference storage] app] name]
487
- taskId:taskIdNumber
488
- resolver:resolve
489
- rejecter:reject];
490
- }];
192
+ [RNFBStorageHelper putFile:appName
193
+ url:url
194
+ localFilePath:localFilePath
195
+ metadata:metadata
196
+ taskId:taskId
197
+ resolve:resolve
198
+ reject:reject];
491
199
  }
492
200
 
493
201
  /**
@@ -501,27 +209,14 @@ RCT_EXPORT_MODULE(NativeRNFBTurboStorage);
501
209
  taskId:(double)taskId
502
210
  resolve:(RCTPromiseResolveBlock)resolve
503
211
  reject:(RCTPromiseRejectBlock)reject {
504
- FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
505
- NSNumber *taskIdNumber = @(taskId);
506
- FIRStorageReference *storageReference = [self getReferenceFromUrl:url app:firebaseApp];
507
- NSDictionary *metadataMap = [self decodedMetadataMap:metadata];
508
- FIRStorageMetadata *storageMetadata =
509
- [RNFBStorageCommon buildMetadataFromMap:metadataMap
510
- existingMetadata:nil
511
- path:[storageReference fullPath]];
512
-
513
- __block FIRStorageUploadTask *uploadTask;
514
- RCTUnsafeExecuteOnMainQueueSync(^{
515
- uploadTask = [storageReference putData:[RNFBStorageCommon NSDataFromUploadString:string
516
- format:format]
517
- metadata:storageMetadata];
518
- });
519
-
520
- [self addUploadTaskObservers:uploadTask
521
- appDisplayName:[[[storageReference storage] app] name]
522
- taskId:taskIdNumber
523
- resolver:resolve
524
- rejecter:reject];
212
+ [RNFBStorageHelper putString:appName
213
+ url:url
214
+ string:string
215
+ format:format
216
+ metadata:metadata
217
+ taskId:taskId
218
+ resolve:resolve
219
+ reject:reject];
525
220
  }
526
221
 
527
222
  /**
@@ -531,252 +226,23 @@ RCT_EXPORT_MODULE(NativeRNFBTurboStorage);
531
226
  host:(NSString *)host
532
227
  port:(double)port
533
228
  bucketUrl:(NSString *)bucketUrl {
534
- FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
535
- emulatorHost = host;
536
- emulatorPort = (NSInteger)port;
537
- NSString *key = [self createEmulatorKey:bucketUrl appName:firebaseApp.name];
538
-
539
- if (!emulatorConfigs[key]) {
540
- [[FIRStorage storageForApp:firebaseApp URL:bucketUrl] useEmulatorWithHost:host
541
- port:(NSInteger)port];
542
- emulatorConfigs[key] = @YES;
543
- }
229
+ [RNFBStorageHelper useEmulator:appName host:host port:port bucketUrl:bucketUrl];
544
230
  }
545
231
 
546
232
  /**
547
233
  * @url N/A - RNFB Specific
548
234
  */
549
235
  - (NSNumber *)setTaskStatus:(NSString *)appName taskId:(double)taskId status:(double)status {
550
- NSNumber *taskIdNumber = @(taskId);
551
- id task = PENDING_TASKS[taskIdNumber];
552
- if (task == nil) {
553
- return @NO;
554
- }
555
-
556
- FIRStorageTaskSnapshot *snapshot = nil;
557
- if ([task isKindOfClass:[FIRStorageUploadTask class]]) {
558
- snapshot = [(FIRStorageUploadTask *)task snapshot];
559
- } else if ([task isKindOfClass:[FIRStorageDownloadTask class]]) {
560
- snapshot = [(FIRStorageDownloadTask *)task snapshot];
561
- } else {
562
- return @NO;
563
- }
564
-
565
- FIRStorageTaskStatus currentStatus = snapshot.status;
566
-
567
- switch ((NSInteger)status) {
568
- case 0:
569
- if (currentStatus != FIRStorageTaskStatusPause &&
570
- (currentStatus == FIRStorageTaskStatusResume ||
571
- currentStatus == FIRStorageTaskStatusProgress)) {
572
- if ([task isKindOfClass:[FIRStorageDownloadTask class]]) {
573
- [(FIRStorageDownloadTask *)task pause];
574
- } else {
575
- [(FIRStorageUploadTask *)task pause];
576
- }
577
- return @YES;
578
- }
579
- return @NO;
580
- case 1:
581
- if (currentStatus == FIRStorageTaskStatusPause) {
582
- if ([task isKindOfClass:[FIRStorageDownloadTask class]]) {
583
- [(FIRStorageDownloadTask *)task resume];
584
- } else {
585
- [(FIRStorageUploadTask *)task resume];
586
- }
587
- return @YES;
588
- }
589
- return @NO;
590
- case 2:
591
- if (currentStatus != FIRStorageTaskStatusSuccess &&
592
- currentStatus != FIRStorageTaskStatusFailure &&
593
- (currentStatus == FIRStorageTaskStatusResume ||
594
- currentStatus == FIRStorageTaskStatusProgress ||
595
- currentStatus == FIRStorageTaskStatusPause)) {
596
- [PENDING_TASKS removeObjectForKey:taskIdNumber];
597
- if ([task isKindOfClass:[FIRStorageDownloadTask class]]) {
598
- [(FIRStorageDownloadTask *)task cancel];
599
- } else {
600
- [(FIRStorageUploadTask *)task cancel];
601
- }
602
- return @YES;
603
- }
604
- return @NO;
605
- default:
606
- return @NO;
607
- }
236
+ return [RNFBStorageHelper setTaskStatus:appName taskId:taskId status:status];
608
237
  }
609
238
 
610
239
  #pragma mark -
611
- #pragma mark Firebase Storage Internals
612
-
613
- - (NSString *)createEmulatorKey:(NSString *)bucketUrl appName:(NSString *)appName {
614
- return [NSString stringWithFormat:@"%@-%@", appName, bucketUrl];
615
- }
616
-
617
- - (void)addUploadTaskObservers:(FIRStorageUploadTask *)uploadTask
618
- appDisplayName:(NSString *)appDisplayName
619
- taskId:(NSNumber *)taskId
620
- resolver:(RCTPromiseResolveBlock)resolve
621
- rejecter:(RCTPromiseRejectBlock)reject {
622
- PENDING_TASKS[taskId] = uploadTask;
623
-
624
- // upload started or resumed
625
- [uploadTask
626
- observeStatus:FIRStorageTaskStatusResume
627
- handler:^(FIRStorageTaskSnapshot *snapshot) {
628
- NSDictionary *eventBody = [RNFBStorageCommon getUploadTaskAsDictionary:snapshot];
629
- NSDictionary *event =
630
- [RNFBStorageCommon getStorageEventDictionary:eventBody
631
- internalEventName:RNFB_STORAGE_STATE_CHANGED
632
- appName:appDisplayName
633
- taskId:taskId];
634
- [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT body:event];
635
- }];
636
-
637
- // upload paused
638
- [uploadTask
639
- observeStatus:FIRStorageTaskStatusPause
640
- handler:^(FIRStorageTaskSnapshot *snapshot) {
641
- NSDictionary *eventBody = [RNFBStorageCommon getUploadTaskAsDictionary:snapshot];
642
- NSDictionary *event =
643
- [RNFBStorageCommon getStorageEventDictionary:eventBody
644
- internalEventName:RNFB_STORAGE_STATE_CHANGED
645
- appName:appDisplayName
646
- taskId:taskId];
647
- [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT body:event];
648
- }];
649
-
650
- // upload reported progress
651
- [uploadTask
652
- observeStatus:FIRStorageTaskStatusProgress
653
- handler:^(FIRStorageTaskSnapshot *snapshot) {
654
- NSDictionary *eventBody = [RNFBStorageCommon getUploadTaskAsDictionary:snapshot];
655
- NSDictionary *event =
656
- [RNFBStorageCommon getStorageEventDictionary:eventBody
657
- internalEventName:RNFB_STORAGE_STATE_CHANGED
658
- appName:appDisplayName
659
- taskId:taskId];
660
- [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT body:event];
661
- }];
662
-
663
- // upload completed successfully
664
- [uploadTask observeStatus:FIRStorageTaskStatusSuccess
665
- handler:^(FIRStorageTaskSnapshot *snapshot) {
666
- [PENDING_TASKS removeObjectForKey:taskId];
667
-
668
- NSDictionary *eventBody =
669
- [RNFBStorageCommon getUploadTaskAsDictionary:snapshot];
670
-
671
- // state_changed
672
- NSDictionary *stateChangeEvent =
673
- [RNFBStorageCommon getStorageEventDictionary:eventBody
674
- internalEventName:RNFB_STORAGE_STATE_CHANGED
675
- appName:appDisplayName
676
- taskId:taskId];
677
- [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT
678
- body:stateChangeEvent];
679
-
680
- // upload_success
681
- NSDictionary *uploadSuccessEvent =
682
- [RNFBStorageCommon getStorageEventDictionary:eventBody
683
- internalEventName:RNFB_STORAGE_UPLOAD_SUCCESS
684
- appName:appDisplayName
685
- taskId:taskId];
686
- [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT
687
- body:uploadSuccessEvent];
688
- resolve(eventBody);
689
- }];
690
-
691
- [uploadTask
692
- observeStatus:FIRStorageTaskStatusFailure
693
- handler:^(FIRStorageTaskSnapshot *snapshot) {
694
- [PENDING_TASKS removeObjectForKey:taskId];
695
-
696
- // state_changed
697
- NSMutableDictionary *taskSnapshotDict =
698
- [RNFBStorageCommon getUploadTaskAsDictionary:snapshot];
699
- NSDictionary *stateChangedEvtBody =
700
- [RNFBStorageCommon buildErrorSnapshotDict:snapshot.error
701
- taskSnapshotDict:taskSnapshotDict];
702
- NSDictionary *stateChangedEvent =
703
- [RNFBStorageCommon getStorageEventDictionary:stateChangedEvtBody
704
- internalEventName:RNFB_STORAGE_STATE_CHANGED
705
- appName:appDisplayName
706
- taskId:taskId];
707
- [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT
708
- body:stateChangedEvent];
709
-
710
- // upload_failed
711
- NSDictionary *eventBody = [RNFBStorageCommon buildErrorSnapshotDict:snapshot.error
712
- taskSnapshotDict:taskSnapshotDict];
713
- NSDictionary *event =
714
- [RNFBStorageCommon getStorageEventDictionary:eventBody
715
- internalEventName:RNFB_STORAGE_UPLOAD_FAILURE
716
- appName:appDisplayName
717
- taskId:taskId];
718
- [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT body:event];
719
-
720
- [self promiseRejectStorageException:reject error:snapshot.error];
721
- }];
722
- }
723
-
724
- - (FIRStorageReference *)getReferenceFromUrl:(NSString *)url app:(FIRApp *)firebaseApp {
725
- FIRStorage *storage;
726
- NSString *pathWithBucketName = [url substringWithRange:NSMakeRange(5, [url length] - 5)];
727
- NSString *bucket = url;
728
- NSRange rangeOfSlash = [pathWithBucketName rangeOfString:@"/"];
729
- if (rangeOfSlash.location != NSNotFound) {
730
- bucket = [url substringWithRange:NSMakeRange(0, rangeOfSlash.location + 5)];
731
- }
732
- storage = [FIRStorage storageForApp:firebaseApp URL:bucket];
733
-
734
- NSLog(@"Setting emulator - host %@ port %ld", emulatorHost, (long)emulatorPort);
735
- NSString *key = [self createEmulatorKey:bucket appName:firebaseApp.name];
736
- if (![emulatorHost isEqual:[NSNull null]] && emulatorHost != nil && !emulatorConfigs[key]) {
737
- @try {
738
- [storage useEmulatorWithHost:emulatorHost port:emulatorPort];
739
- emulatorConfigs[key] = @YES;
740
- } @catch (NSException *e) {
741
- NSLog(@"WARNING: Unable to set the Firebase Storage emulator settings. These must be set "
742
- @"before any usages of Firebase Storage. If you see this log after a hot "
743
- @"reload/restart you can safely ignore it.");
744
- }
745
- }
746
- return [storage referenceForURL:url];
747
- }
748
-
749
- - (void)promiseRejectStorageException:(RCTPromiseRejectBlock)reject error:(NSError *)error {
750
- NSArray *codeAndMessage = [RNFBStorageCommon getErrorCodeMessage:error];
751
- [RNFBSharedUtils rejectPromiseWithUserInfo:reject
752
- userInfo:(NSMutableDictionary *)@{
753
- @"code" : (NSString *)codeAndMessage[0],
754
- @"message" : (NSString *)codeAndMessage[1],
755
- }];
756
- }
757
-
758
- - (NSDictionary *)storageConstantsDictionary {
759
- NSMutableDictionary *constants = [@{} mutableCopy];
760
-
761
- if ([[[FIRApp allApps] allKeys] count] > 0) {
762
- FIRStorage *storageInstance = [FIRStorage storage];
763
- constants[@"maxDownloadRetryTime"] =
764
- @((NSInteger)[storageInstance maxDownloadRetryTime] * 1000);
765
- constants[@"maxOperationRetryTime"] =
766
- @((NSInteger)[storageInstance maxOperationRetryTime] * 1000);
767
- constants[@"maxUploadRetryTime"] = @((NSInteger)[storageInstance maxUploadRetryTime] * 1000);
768
- } else {
769
- constants[@"maxDownloadRetryTime"] = @0;
770
- constants[@"maxOperationRetryTime"] = @0;
771
- constants[@"maxUploadRetryTime"] = @0;
772
- }
773
-
774
- return constants;
775
- }
240
+ #pragma mark Constants
776
241
 
777
242
  - (facebook::react::ModuleConstants<JS::NativeRNFBTurboStorage::Constants::Builder>)
778
243
  constantsToExport {
779
- return [_RCTTypedModuleConstants newWithUnsafeDictionary:[self storageConstantsDictionary]];
244
+ return [_RCTTypedModuleConstants
245
+ newWithUnsafeDictionary:[RNFBStorageHelper storageConstantsDictionary]];
780
246
  }
781
247
 
782
248
  - (facebook::react::ModuleConstants<JS::NativeRNFBTurboStorage::Constants::Builder>)getConstants {