@react-native-firebase/storage 25.1.0 → 26.1.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.
Files changed (76) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/RNFBStorage.podspec +26 -7
  3. package/android/build.gradle +23 -0
  4. package/android/src/main/java/io/invertase/firebase/storage/{ReactNativeFirebaseStorageModule.java → NativeRNFBTurboStorage.java} +72 -131
  5. package/android/src/main/java/io/invertase/firebase/storage/ReactNativeFirebaseStoragePackage.java +1 -1
  6. package/android/src/main/java/io/invertase/firebase/storage/generated/java/com/facebook/fbreact/specs/NativeRNFBTurboStorageSpec.java +125 -0
  7. package/android/src/main/java/io/invertase/firebase/storage/generated/jni/CMakeLists.txt +36 -0
  8. package/android/src/main/java/io/invertase/firebase/storage/generated/jni/RNFBStorageTurboModules-generated.cpp +116 -0
  9. package/android/src/main/java/io/invertase/firebase/storage/generated/jni/RNFBStorageTurboModules.h +31 -0
  10. package/android/src/main/java/io/invertase/firebase/storage/generated/jni/react/renderer/components/RNFBStorageTurboModules/RNFBStorageTurboModulesJSI-generated.cpp +153 -0
  11. package/android/src/main/java/io/invertase/firebase/storage/generated/jni/react/renderer/components/RNFBStorageTurboModules/RNFBStorageTurboModulesJSI.h +246 -0
  12. package/dist/module/StorageReference.js +4 -7
  13. package/dist/module/StorageReference.js.map +1 -1
  14. package/dist/module/StorageTask.js.map +1 -1
  15. package/dist/module/index.js +384 -6
  16. package/dist/module/index.js.map +1 -1
  17. package/dist/module/types/storage.js +6 -2
  18. package/dist/module/types/storage.js.map +1 -1
  19. package/dist/module/version.js +1 -1
  20. package/dist/module/web/RNFBStorageModule.js +9 -11
  21. package/dist/module/web/RNFBStorageModule.js.map +1 -1
  22. package/dist/typescript/lib/StorageReference.d.ts.map +1 -1
  23. package/dist/typescript/lib/StorageTask.d.ts +7 -8
  24. package/dist/typescript/lib/StorageTask.d.ts.map +1 -1
  25. package/dist/typescript/lib/index.d.ts +150 -4
  26. package/dist/typescript/lib/index.d.ts.map +1 -1
  27. package/dist/typescript/lib/types/internal.d.ts +5 -5
  28. package/dist/typescript/lib/types/internal.d.ts.map +1 -1
  29. package/dist/typescript/lib/types/storage.d.ts +15 -10
  30. package/dist/typescript/lib/types/storage.d.ts.map +1 -1
  31. package/dist/typescript/lib/version.d.ts +1 -1
  32. package/dist/typescript/lib/web/RNFBStorageModule.d.ts +3 -3
  33. package/dist/typescript/lib/web/RNFBStorageModule.d.ts.map +1 -1
  34. package/ios/RNFBStorage/RNFBStorageCommon.m +11 -0
  35. package/ios/RNFBStorage/RNFBStorageHelper.h +113 -0
  36. package/ios/RNFBStorage/{RNFBStorageModule.m → RNFBStorageHelper.m} +227 -222
  37. package/ios/RNFBStorage/RNFBStorageModule.h +2 -2
  38. package/ios/RNFBStorage/RNFBStorageModule.mm +252 -0
  39. package/ios/RNFBStorage.xcodeproj/project.pbxproj +8 -8
  40. package/ios/generated/RCTAppDependencyProvider.h +25 -0
  41. package/ios/generated/RCTAppDependencyProvider.mm +55 -0
  42. package/ios/generated/RCTModulesConformingToProtocolsProvider.h +18 -0
  43. package/ios/generated/RCTModulesConformingToProtocolsProvider.mm +33 -0
  44. package/ios/generated/RCTThirdPartyComponentsProvider.h +16 -0
  45. package/ios/generated/RCTThirdPartyComponentsProvider.mm +23 -0
  46. package/ios/generated/RNFBStorageTurboModules/RNFBStorageTurboModules-generated.mm +142 -0
  47. package/ios/generated/RNFBStorageTurboModules/RNFBStorageTurboModules.h +198 -0
  48. package/ios/generated/RNFBStorageTurboModulesJSI-generated.cpp +153 -0
  49. package/ios/generated/RNFBStorageTurboModulesJSI.h +246 -0
  50. package/ios/generated/ReactAppDependencyProvider.podspec +34 -0
  51. package/lib/StorageReference.ts +3 -8
  52. package/lib/StorageTask.ts +13 -15
  53. package/lib/index.ts +501 -7
  54. package/lib/types/internal.ts +5 -5
  55. package/lib/types/storage.ts +17 -10
  56. package/lib/version.ts +1 -1
  57. package/lib/web/RNFBStorageModule.ts +10 -12
  58. package/package.json +22 -4
  59. package/react-native.config.js +10 -0
  60. package/specs/NativeRNFBTurboStorage.ts +46 -0
  61. package/typedoc.json +2 -3
  62. package/dist/module/modular.js +0 -270
  63. package/dist/module/modular.js.map +0 -1
  64. package/dist/module/namespaced.js +0 -192
  65. package/dist/module/namespaced.js.map +0 -1
  66. package/dist/module/types/namespaced.js +0 -64
  67. package/dist/module/types/namespaced.js.map +0 -1
  68. package/dist/typescript/lib/modular.d.ts +0 -154
  69. package/dist/typescript/lib/modular.d.ts.map +0 -1
  70. package/dist/typescript/lib/namespaced.d.ts +0 -12
  71. package/dist/typescript/lib/namespaced.d.ts.map +0 -1
  72. package/dist/typescript/lib/types/namespaced.d.ts +0 -1122
  73. package/dist/typescript/lib/types/namespaced.d.ts.map +0 -1
  74. package/lib/modular.ts +0 -401
  75. package/lib/namespaced.ts +0 -264
  76. package/lib/types/namespaced.ts +0 -1248
@@ -15,13 +15,19 @@
15
15
  *
16
16
  */
17
17
 
18
+ #if __has_include(<Firebase/Firebase.h>)
18
19
  #import <Firebase/Firebase.h>
20
+ #else
21
+ @import FirebaseCore;
22
+ @import FirebaseStorage;
23
+ #endif
19
24
  #import <React/RCTUtils.h>
20
25
 
26
+ #import "RNFBApp/RCTConvert+FIRApp.h"
27
+ #import "RNFBApp/RNFBSharedUtils.h"
21
28
  #import "RNFBRCTEventEmitter.h"
22
- #import "RNFBSharedUtils.h"
23
29
  #import "RNFBStorageCommon.h"
24
- #import "RNFBStorageModule.h"
30
+ #import "RNFBStorageHelper.h"
25
31
 
26
32
  static NSString *const RNFB_STORAGE_EVENT = @"storage_event";
27
33
  static NSString *const RNFB_STORAGE_STATE_CHANGED = @"state_changed";
@@ -40,35 +46,21 @@ static NSTimeInterval maxDownloadRetryTime = 600;
40
46
  static NSTimeInterval maxUploadRetryTime = 600;
41
47
  static NSTimeInterval maxOperationRetryTime = 120;
42
48
 
43
- @implementation RNFBStorageModule
44
- #pragma mark -
45
- #pragma mark Module Setup
46
-
47
- RCT_EXPORT_MODULE();
48
-
49
- + (BOOL)requiresMainQueueSetup {
50
- return YES;
51
- }
49
+ @implementation RNFBStorageHelper
52
50
 
53
- - (id)init {
54
- self = [super init];
51
+ #pragma mark -
52
+ #pragma mark Shared state
55
53
 
54
+ + (void)initializeSharedStateOnce {
56
55
  static dispatch_once_t onceToken;
57
56
  dispatch_once(&onceToken, ^{
58
57
  PENDING_TASKS = [[NSMutableDictionary alloc] init];
59
58
  emulatorConfigs = [[NSMutableDictionary alloc] init];
60
59
  });
61
-
62
- return self;
63
- }
64
-
65
- - (void)dealloc {
66
- for (NSString *key in [PENDING_TASKS allKeys]) {
67
- [PENDING_TASKS removeObjectForKey:key];
68
- }
69
60
  }
70
61
 
71
- - (void)invalidate {
62
+ + (void)invalidate {
63
+ [self initializeSharedStateOnce];
72
64
  for (NSString *key in [PENDING_TASKS allKeys]) {
73
65
  [PENDING_TASKS removeObjectForKey:key];
74
66
  }
@@ -80,11 +72,11 @@ RCT_EXPORT_MODULE();
80
72
  /**
81
73
  * @url https://firebase.google.com/docs/reference/js/firebase.storage.Reference#delete
82
74
  */
83
- RCT_EXPORT_METHOD(delete
84
- : (FIRApp *)firebaseApp
85
- : (NSString *)url
86
- : (RCTPromiseResolveBlock)resolve
87
- : (RCTPromiseRejectBlock)reject) {
75
+ + (void)deleteObject:(NSString *)appName
76
+ url:(NSString *)url
77
+ resolve:(RCTPromiseResolveBlock)resolve
78
+ reject:(RCTPromiseRejectBlock)reject {
79
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
88
80
  FIRStorageReference *storageReference = [self getReferenceFromUrl:url app:firebaseApp];
89
81
 
90
82
  [storageReference deleteWithCompletion:^(NSError *_Nullable error) {
@@ -99,11 +91,11 @@ RCT_EXPORT_METHOD(delete
99
91
  /**
100
92
  * @url https://firebase.google.com/docs/reference/js/firebase.storage.Reference#getDownloadURL
101
93
  */
102
- RCT_EXPORT_METHOD(getDownloadURL
103
- : (FIRApp *)firebaseApp
104
- : (NSString *)url
105
- : (RCTPromiseResolveBlock)resolve
106
- : (RCTPromiseRejectBlock)reject) {
94
+ + (void)getDownloadURL:(NSString *)appName
95
+ url:(NSString *)url
96
+ resolve:(RCTPromiseResolveBlock)resolve
97
+ reject:(RCTPromiseRejectBlock)reject {
98
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
107
99
  FIRStorageReference *storageReference = [self getReferenceFromUrl:url app:firebaseApp];
108
100
 
109
101
  [storageReference downloadURLWithCompletion:^(NSURL *_Nullable URL, NSError *_Nullable error) {
@@ -125,11 +117,11 @@ RCT_EXPORT_METHOD(getDownloadURL
125
117
  /**
126
118
  * @url https://firebase.google.com/docs/reference/js/firebase.storage.Reference#getMetadata
127
119
  */
128
- RCT_EXPORT_METHOD(getMetadata
129
- : (FIRApp *)firebaseApp
130
- : (NSString *)url
131
- : (RCTPromiseResolveBlock)resolve
132
- : (RCTPromiseRejectBlock)reject) {
120
+ + (void)getMetadata:(NSString *)appName
121
+ url:(NSString *)url
122
+ resolve:(RCTPromiseResolveBlock)resolve
123
+ reject:(RCTPromiseRejectBlock)reject {
124
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
133
125
  FIRStorageReference *storageReference = [self getReferenceFromUrl:url app:firebaseApp];
134
126
 
135
127
  [storageReference
@@ -145,13 +137,22 @@ RCT_EXPORT_METHOD(getMetadata
145
137
  /**
146
138
  * @url https://firebase.google.com/docs/reference/js/firebase.storage.Reference#updateMetadata
147
139
  */
148
- RCT_EXPORT_METHOD(updateMetadata
149
- : (FIRApp *)firebaseApp
150
- : (NSString *)url
151
- : (NSDictionary *)metadata
152
- : (RCTPromiseResolveBlock)resolve
153
- : (RCTPromiseRejectBlock)reject) {
140
+ + (NSDictionary *)decodedMetadataMap:(NSDictionary *_Nullable)metadata {
141
+ if (metadata == nil) {
142
+ return @{};
143
+ }
144
+
145
+ return [RNFBSharedUtils decodeNullSentinels:metadata];
146
+ }
147
+
148
+ + (void)updateMetadata:(NSString *)appName
149
+ url:(NSString *)url
150
+ metadata:(NSDictionary *_Nullable)metadata
151
+ resolve:(RCTPromiseResolveBlock)resolve
152
+ reject:(RCTPromiseRejectBlock)reject {
153
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
154
154
  FIRStorageReference *storageReference = [self getReferenceFromUrl:url app:firebaseApp];
155
+ NSDictionary *metadataMap = [self decodedMetadataMap:metadata];
155
156
 
156
157
  [storageReference metadataWithCompletion:^(FIRStorageMetadata *_Nullable fetchedMetadata,
157
158
  NSError *_Nullable error) {
@@ -159,7 +160,7 @@ RCT_EXPORT_METHOD(updateMetadata
159
160
  [self promiseRejectStorageException:reject error:error];
160
161
  } else {
161
162
  FIRStorageMetadata *storageMetadata =
162
- [RNFBStorageCommon buildMetadataFromMap:metadata
163
+ [RNFBStorageCommon buildMetadataFromMap:metadataMap
163
164
  existingMetadata:fetchedMetadata
164
165
  path:[storageReference fullPath]];
165
166
 
@@ -176,29 +177,25 @@ RCT_EXPORT_METHOD(updateMetadata
176
177
  }];
177
178
  }
178
179
 
179
- /**
180
- * @url https://firebase.google.com/docs/reference/js/firebase.storage.Reference#list
181
- */
182
- RCT_EXPORT_METHOD(list
183
- : (FIRApp *)firebaseApp
184
- : (NSString *)url
185
- : (NSDictionary *)listOptions
186
- : (RCTPromiseResolveBlock)resolve
187
- : (RCTPromiseRejectBlock)reject) {
180
+ // list
181
+ + (void)list:(NSString *)appName
182
+ url:(NSString *)url
183
+ maxResults:(long)maxResults
184
+ pageToken:(NSString *_Nullable)pageToken
185
+ resolve:(RCTPromiseResolveBlock)resolve
186
+ reject:(RCTPromiseRejectBlock)reject {
187
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
188
188
  FIRStorageReference *storageReference = [self getReferenceFromUrl:url app:firebaseApp];
189
- long maxResults = [listOptions[@"maxResults"] longValue];
190
189
 
191
190
  id completionBlock = ^(FIRStorageListResult *result, NSError *error) {
192
191
  if (error != nil) {
193
192
  [self promiseRejectStorageException:reject error:error];
194
193
  } else {
195
- NSDictionary *listResultDict = [RNFBStorageCommon listResultToDict:result];
196
- resolve(listResultDict);
194
+ resolve([RNFBStorageCommon listResultToDict:result]);
197
195
  }
198
196
  };
199
197
 
200
- if (listOptions[@"pageToken"]) {
201
- NSString *pageToken = listOptions[@"pageToken"];
198
+ if (pageToken != nil) {
202
199
  [storageReference listWithMaxResults:(int64_t)maxResults
203
200
  pageToken:pageToken
204
201
  completion:completionBlock];
@@ -207,14 +204,12 @@ RCT_EXPORT_METHOD(list
207
204
  }
208
205
  }
209
206
 
210
- /**
211
- * @url https://firebase.google.com/docs/reference/js/firebase.storage.Reference#listAll
212
- */
213
- RCT_EXPORT_METHOD(listAll
214
- : (FIRApp *)firebaseApp
215
- : (NSString *)url
216
- : (RCTPromiseResolveBlock)resolve
217
- : (RCTPromiseRejectBlock)reject) {
207
+ // listAll
208
+ + (void)listAll:(NSString *)appName
209
+ url:(NSString *)url
210
+ resolve:(RCTPromiseResolveBlock)resolve
211
+ reject:(RCTPromiseRejectBlock)reject {
212
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
218
213
  FIRStorageReference *storageReference = [self getReferenceFromUrl:url app:firebaseApp];
219
214
 
220
215
  __block bool alreadyCompleted = false;
@@ -222,7 +217,7 @@ RCT_EXPORT_METHOD(listAll
222
217
  id completionBlock = ^(FIRStorageListResult *result, NSError *error) {
223
218
  // This may be called multiple times if an error occurs
224
219
  // Make sure we won't try to resolve the promise twice in this case
225
- // TODO - remove pending resolution of https://github.com/firebase/firebase-ios-sdk/issues/7197
220
+ // TODO - remove pending resolution of firebase-ios-sdk issue 7197
226
221
  if (alreadyCompleted) {
227
222
  return;
228
223
  }
@@ -237,59 +232,49 @@ RCT_EXPORT_METHOD(listAll
237
232
  [storageReference listAllWithCompletion:completionBlock];
238
233
  }
239
234
 
240
- /**
241
- * @url
242
- * https://firebase.google.com/docs/reference/js/firebase.storage.Storage#setMaxDownloadRetryTime
243
- */
244
- RCT_EXPORT_METHOD(setMaxDownloadRetryTime
245
- : (FIRApp *)firebaseApp
246
- : (nonnull NSNumber *)milliseconds
247
- : (RCTPromiseResolveBlock)resolve
248
- : (RCTPromiseRejectBlock)reject) {
249
- maxDownloadRetryTime = [milliseconds doubleValue] / 1000;
250
- [[FIRStorage storageForApp:firebaseApp]
251
- setMaxDownloadRetryTime:[milliseconds doubleValue] / 1000];
235
+ // setMaxDownloadRetryTime
236
+ + (void)setMaxDownloadRetryTime:(NSString *)appName
237
+ milliseconds:(double)milliseconds
238
+ resolve:(RCTPromiseResolveBlock)resolve
239
+ reject:(RCTPromiseRejectBlock)reject {
240
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
241
+ maxDownloadRetryTime = milliseconds / 1000;
242
+ [[FIRStorage storageForApp:firebaseApp] setMaxDownloadRetryTime:milliseconds / 1000];
252
243
  resolve([NSNull null]);
253
244
  }
254
245
 
255
- /**
256
- * @url
257
- * https://firebase.google.com/docs/reference/js/firebase.storage.Storage#setMaxOperationRetryTime
258
- */
259
- RCT_EXPORT_METHOD(setMaxOperationRetryTime
260
- : (FIRApp *)firebaseApp
261
- : (nonnull NSNumber *)milliseconds
262
- : (RCTPromiseResolveBlock)resolve
263
- : (RCTPromiseRejectBlock)reject) {
264
- maxOperationRetryTime = [milliseconds doubleValue] / 1000;
265
- [[FIRStorage storageForApp:firebaseApp]
266
- setMaxOperationRetryTime:[milliseconds doubleValue] / 1000];
246
+ // setMaxOperationRetryTime
247
+ + (void)setMaxOperationRetryTime:(NSString *)appName
248
+ milliseconds:(double)milliseconds
249
+ resolve:(RCTPromiseResolveBlock)resolve
250
+ reject:(RCTPromiseRejectBlock)reject {
251
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
252
+ maxOperationRetryTime = milliseconds / 1000;
253
+ [[FIRStorage storageForApp:firebaseApp] setMaxOperationRetryTime:milliseconds / 1000];
267
254
  resolve([NSNull null]);
268
255
  }
269
256
 
270
- /**
271
- * @url https://firebase.google.com/docs/reference/js/firebase.storage.Storage#setMaxUploadRetryTime
272
- */
273
- RCT_EXPORT_METHOD(setMaxUploadRetryTime
274
- : (FIRApp *)firebaseApp
275
- : (nonnull NSNumber *)milliseconds
276
- : (RCTPromiseResolveBlock)resolve
277
- : (RCTPromiseRejectBlock)reject) {
278
- maxUploadRetryTime = [milliseconds doubleValue] / 1000;
279
- [[FIRStorage storageForApp:firebaseApp] setMaxUploadRetryTime:[milliseconds doubleValue] / 1000];
257
+ // setMaxUploadRetryTime
258
+ + (void)setMaxUploadRetryTime:(NSString *)appName
259
+ milliseconds:(double)milliseconds
260
+ resolve:(RCTPromiseResolveBlock)resolve
261
+ reject:(RCTPromiseRejectBlock)reject {
262
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
263
+ maxUploadRetryTime = milliseconds / 1000;
264
+ [[FIRStorage storageForApp:firebaseApp] setMaxUploadRetryTime:milliseconds / 1000];
280
265
  resolve([NSNull null]);
281
266
  }
282
267
 
283
- /**
284
- * @url https://firebase.google.com/docs/reference/js/firebase.storage.Reference#downloadFile
285
- */
286
- RCT_EXPORT_METHOD(writeToFile
287
- : (FIRApp *)firebaseApp
288
- : (NSString *)url
289
- : (NSString *)localFilePath
290
- : (nonnull NSNumber *)taskId
291
- : (RCTPromiseResolveBlock)resolve
292
- : (RCTPromiseRejectBlock)reject) {
268
+ // writeToFile
269
+ + (void)writeToFile:(NSString *)appName
270
+ url:(NSString *)url
271
+ localFilePath:(NSString *)localFilePath
272
+ taskId:(double)taskId
273
+ resolve:(RCTPromiseResolveBlock)resolve
274
+ reject:(RCTPromiseRejectBlock)reject {
275
+ [self initializeSharedStateOnce];
276
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
277
+ NSNumber *taskIdNumber = @(taskId);
293
278
  FIRStorageReference *storageReference = [self getReferenceFromUrl:url app:firebaseApp];
294
279
  NSURL *localFile = [NSURL fileURLWithPath:localFilePath];
295
280
 
@@ -298,9 +283,8 @@ RCT_EXPORT_METHOD(writeToFile
298
283
  downloadTask = [storageReference writeToFile:localFile];
299
284
  });
300
285
 
301
- PENDING_TASKS[taskId] = downloadTask;
286
+ PENDING_TASKS[taskIdNumber] = downloadTask;
302
287
 
303
- // download started or resumed
304
288
  [downloadTask
305
289
  observeStatus:FIRStorageTaskStatusResume
306
290
  handler:^(FIRStorageTaskSnapshot *snapshot) {
@@ -309,11 +293,10 @@ RCT_EXPORT_METHOD(writeToFile
309
293
  [RNFBStorageCommon getStorageEventDictionary:eventBody
310
294
  internalEventName:RNFB_STORAGE_STATE_CHANGED
311
295
  appName:firebaseApp.name
312
- taskId:taskId];
296
+ taskId:taskIdNumber];
313
297
  [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT body:event];
314
298
  }];
315
299
 
316
- // download paused
317
300
  [downloadTask
318
301
  observeStatus:FIRStorageTaskStatusPause
319
302
  handler:^(FIRStorageTaskSnapshot *snapshot) {
@@ -322,11 +305,10 @@ RCT_EXPORT_METHOD(writeToFile
322
305
  [RNFBStorageCommon getStorageEventDictionary:eventBody
323
306
  internalEventName:RNFB_STORAGE_STATE_CHANGED
324
307
  appName:firebaseApp.name
325
- taskId:taskId];
308
+ taskId:taskIdNumber];
326
309
  [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT body:event];
327
310
  }];
328
311
 
329
- // download reported progress
330
312
  [downloadTask
331
313
  observeStatus:FIRStorageTaskStatusProgress
332
314
  handler:^(FIRStorageTaskSnapshot *snapshot) {
@@ -335,56 +317,50 @@ RCT_EXPORT_METHOD(writeToFile
335
317
  [RNFBStorageCommon getStorageEventDictionary:eventBody
336
318
  internalEventName:RNFB_STORAGE_STATE_CHANGED
337
319
  appName:firebaseApp.name
338
- taskId:taskId];
320
+ taskId:taskIdNumber];
339
321
  [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT body:event];
340
322
  }];
341
323
 
342
- // download completed successfully
343
324
  [downloadTask
344
325
  observeStatus:FIRStorageTaskStatusSuccess
345
326
  handler:^(FIRStorageTaskSnapshot *snapshot) {
346
- [PENDING_TASKS removeObjectForKey:taskId];
327
+ [PENDING_TASKS removeObjectForKey:taskIdNumber];
347
328
 
348
- // state_changed
349
329
  NSDictionary *stateChangedEventBody =
350
330
  [RNFBStorageCommon getDownloadTaskAsDictionary:snapshot];
351
331
  NSDictionary *stateChangedEvent =
352
332
  [RNFBStorageCommon getStorageEventDictionary:stateChangedEventBody
353
333
  internalEventName:RNFB_STORAGE_STATE_CHANGED
354
334
  appName:firebaseApp.name
355
- taskId:taskId];
335
+ taskId:taskIdNumber];
356
336
  [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT
357
337
  body:stateChangedEvent];
358
338
 
359
- // download_success
360
339
  NSDictionary *eventBody = [RNFBStorageCommon getDownloadTaskAsDictionary:snapshot];
361
340
  NSDictionary *event =
362
341
  [RNFBStorageCommon getStorageEventDictionary:eventBody
363
342
  internalEventName:RNFB_STORAGE_DOWNLOAD_SUCCESS
364
343
  appName:firebaseApp.name
365
- taskId:taskId];
344
+ taskId:taskIdNumber];
366
345
  [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT body:event];
367
346
  resolve(eventBody);
368
347
  }];
369
348
 
370
- // download task failed
371
349
  [downloadTask
372
350
  observeStatus:FIRStorageTaskStatusFailure
373
351
  handler:^(FIRStorageTaskSnapshot *snapshot) {
374
- [PENDING_TASKS removeObjectForKey:taskId];
352
+ [PENDING_TASKS removeObjectForKey:taskIdNumber];
375
353
 
376
- // state_changed
377
354
  NSDictionary *stateChangedEventBody =
378
355
  [RNFBStorageCommon getDownloadTaskAsDictionary:snapshot];
379
356
  NSDictionary *stateChangedEvent =
380
357
  [RNFBStorageCommon getStorageEventDictionary:stateChangedEventBody
381
358
  internalEventName:RNFB_STORAGE_STATE_CHANGED
382
359
  appName:firebaseApp.name
383
- taskId:taskId];
360
+ taskId:taskIdNumber];
384
361
  [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT
385
362
  body:stateChangedEvent];
386
363
 
387
- // download_failed
388
364
  NSMutableDictionary *taskSnapshotDict =
389
365
  [RNFBStorageCommon getDownloadTaskAsDictionary:snapshot];
390
366
  NSDictionary *eventBody = [RNFBStorageCommon buildErrorSnapshotDict:snapshot.error
@@ -393,27 +369,27 @@ RCT_EXPORT_METHOD(writeToFile
393
369
  [RNFBStorageCommon getStorageEventDictionary:eventBody
394
370
  internalEventName:RNFB_STORAGE_DOWNLOAD_FAILURE
395
371
  appName:firebaseApp.name
396
- taskId:taskId];
372
+ taskId:taskIdNumber];
397
373
  [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT body:event];
398
374
 
399
375
  [self promiseRejectStorageException:reject error:snapshot.error];
400
376
  }];
401
377
  }
402
378
 
403
- /**
404
- * @url https://firebase.google.com/docs/reference/js/firebase.storage.Reference#putFile
405
- */
406
- RCT_EXPORT_METHOD(putFile
407
- : (FIRApp *)firebaseApp
408
- : (NSString *)url
409
- : (NSString *)localFilePath
410
- : (NSDictionary *)metadata
411
- : (nonnull NSNumber *)taskId
412
- : (RCTPromiseResolveBlock)resolve
413
- : (RCTPromiseRejectBlock)reject) {
379
+ // putFile
380
+ + (void)putFile:(NSString *)appName
381
+ url:(NSString *)url
382
+ localFilePath:(NSString *)localFilePath
383
+ metadata:(NSDictionary *_Nullable)metadata
384
+ taskId:(double)taskId
385
+ resolve:(RCTPromiseResolveBlock)resolve
386
+ reject:(RCTPromiseRejectBlock)reject {
387
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
388
+ NSNumber *taskIdNumber = @(taskId);
414
389
  FIRStorageReference *storageReference = [self getReferenceFromUrl:url app:firebaseApp];
390
+ NSDictionary *metadataMap = [self decodedMetadataMap:metadata];
415
391
  FIRStorageMetadata *storageMetadata =
416
- [RNFBStorageCommon buildMetadataFromMap:metadata
392
+ [RNFBStorageCommon buildMetadataFromMap:metadataMap
417
393
  existingMetadata:nil
418
394
  path:[storageReference fullPath]];
419
395
 
@@ -422,7 +398,6 @@ RCT_EXPORT_METHOD(putFile
422
398
  completion:^(NSArray *errorCodeMessageArray, NSURL *temporaryFileUrl,
423
399
  NSString *contentType) {
424
400
  if (errorCodeMessageArray != nil) {
425
- // state_changed
426
401
  NSMutableDictionary *taskSnapshotDict =
427
402
  [RNFBStorageCommon getUploadTaskAsDictionary:nil];
428
403
  NSDictionary *eventBody = [RNFBStorageCommon
@@ -432,16 +407,15 @@ RCT_EXPORT_METHOD(putFile
432
407
  getStorageEventDictionary:eventBody
433
408
  internalEventName:RNFB_STORAGE_STATE_CHANGED
434
409
  appName:[[[storageReference storage] app] name]
435
- taskId:taskId];
410
+ taskId:taskIdNumber];
436
411
  [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT
437
412
  body:stateChangedEvent];
438
413
 
439
- // upload_failed
440
414
  NSDictionary *event = [RNFBStorageCommon
441
415
  getStorageEventDictionary:eventBody
442
416
  internalEventName:RNFB_STORAGE_UPLOAD_FAILURE
443
417
  appName:[[[storageReference storage] app] name]
444
- taskId:taskId];
418
+ taskId:taskIdNumber];
445
419
  [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT body:event];
446
420
 
447
421
  [RNFBSharedUtils rejectPromiseWithUserInfo:reject
@@ -467,27 +441,27 @@ RCT_EXPORT_METHOD(putFile
467
441
 
468
442
  [self addUploadTaskObservers:uploadTask
469
443
  appDisplayName:[[[storageReference storage] app] name]
470
- taskId:taskId
444
+ taskId:taskIdNumber
471
445
  resolver:resolve
472
446
  rejecter:reject];
473
447
  }];
474
448
  }
475
449
 
476
- /**
477
- * @url https://firebase.google.com/docs/reference/js/firebase.storage.Reference#putFile
478
- */
479
- RCT_EXPORT_METHOD(putString
480
- : (FIRApp *)firebaseApp
481
- : (NSString *)url
482
- : (NSString *)string
483
- : (NSString *)format
484
- : (NSDictionary *)metadata
485
- : (nonnull NSNumber *)taskId
486
- : (RCTPromiseResolveBlock)resolve
487
- : (RCTPromiseRejectBlock)reject) {
450
+ // putString
451
+ + (void)putString:(NSString *)appName
452
+ url:(NSString *)url
453
+ string:(NSString *)string
454
+ format:(NSString *)format
455
+ metadata:(NSDictionary *_Nullable)metadata
456
+ taskId:(double)taskId
457
+ resolve:(RCTPromiseResolveBlock)resolve
458
+ reject:(RCTPromiseRejectBlock)reject {
459
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
460
+ NSNumber *taskIdNumber = @(taskId);
488
461
  FIRStorageReference *storageReference = [self getReferenceFromUrl:url app:firebaseApp];
462
+ NSDictionary *metadataMap = [self decodedMetadataMap:metadata];
489
463
  FIRStorageMetadata *storageMetadata =
490
- [RNFBStorageCommon buildMetadataFromMap:metadata
464
+ [RNFBStorageCommon buildMetadataFromMap:metadataMap
491
465
  existingMetadata:nil
492
466
  path:[storageReference fullPath]];
493
467
 
@@ -500,78 +474,129 @@ RCT_EXPORT_METHOD(putString
500
474
 
501
475
  [self addUploadTaskObservers:uploadTask
502
476
  appDisplayName:[[[storageReference storage] app] name]
503
- taskId:taskId
477
+ taskId:taskIdNumber
504
478
  resolver:resolve
505
479
  rejecter:reject];
506
480
  }
507
481
 
508
- /**
509
- * @url https://firebase.google.com/docs/reference/js/firebase.storage.Storage#useEmulator
510
- */
511
- RCT_EXPORT_METHOD(useEmulator
512
- : (FIRApp *)firebaseApp
513
- : (nonnull NSString *)host
514
- : (NSInteger)port
515
- : (NSString *)bucketUrl) {
482
+ // useEmulator
483
+ + (void)useEmulator:(NSString *)appName
484
+ host:(NSString *)host
485
+ port:(double)port
486
+ bucketUrl:(NSString *)bucketUrl {
487
+ [self initializeSharedStateOnce];
488
+ FIRApp *firebaseApp = [RCTConvert firAppFromString:appName];
516
489
  emulatorHost = host;
517
- emulatorPort = port;
490
+ emulatorPort = (NSInteger)port;
518
491
  NSString *key = [self createEmulatorKey:bucketUrl appName:firebaseApp.name];
519
492
 
520
493
  if (!emulatorConfigs[key]) {
521
- [[FIRStorage storageForApp:firebaseApp URL:bucketUrl] useEmulatorWithHost:host port:port];
494
+ [[FIRStorage storageForApp:firebaseApp URL:bucketUrl] useEmulatorWithHost:host
495
+ port:(NSInteger)port];
522
496
  emulatorConfigs[key] = @YES;
523
497
  }
524
498
  }
525
499
 
526
- /**
527
- * @url N/A - RNFB Specific
528
- */
529
- RCT_EXPORT_METHOD(setTaskStatus
530
- : (FIRApp *)firebaseApp
531
- : (nonnull NSNumber *)taskId
532
- : (nonnull NSNumber *)status
533
- : (RCTPromiseResolveBlock)resolve
534
- : (RCTPromiseRejectBlock)reject) {
535
- id task = PENDING_TASKS[taskId];
500
+ // setTaskStatus
501
+ + (NSNumber *)setTaskStatus:(NSString *)appName taskId:(double)taskId status:(double)status {
502
+ [self initializeSharedStateOnce];
503
+ NSNumber *taskIdNumber = @(taskId);
504
+ id task = PENDING_TASKS[taskIdNumber];
536
505
  if (task == nil) {
537
- resolve(@(NO));
538
- return;
506
+ return @NO;
507
+ }
508
+
509
+ FIRStorageTaskSnapshot *snapshot = nil;
510
+ if ([task isKindOfClass:[FIRStorageUploadTask class]]) {
511
+ snapshot = [(FIRStorageUploadTask *)task snapshot];
512
+ } else if ([task isKindOfClass:[FIRStorageDownloadTask class]]) {
513
+ snapshot = [(FIRStorageDownloadTask *)task snapshot];
514
+ } else {
515
+ return @NO;
539
516
  }
540
517
 
541
- switch ([status integerValue]) {
518
+ FIRStorageTaskStatus currentStatus = snapshot.status;
519
+
520
+ switch ((NSInteger)status) {
542
521
  case 0:
543
- [task pause];
544
- break;
522
+ if (currentStatus != FIRStorageTaskStatusPause &&
523
+ (currentStatus == FIRStorageTaskStatusResume ||
524
+ currentStatus == FIRStorageTaskStatusProgress)) {
525
+ if ([task isKindOfClass:[FIRStorageDownloadTask class]]) {
526
+ [(FIRStorageDownloadTask *)task pause];
527
+ } else {
528
+ [(FIRStorageUploadTask *)task pause];
529
+ }
530
+ return @YES;
531
+ }
532
+ return @NO;
545
533
  case 1:
546
- if ([task isKindOfClass:[FIRStorageDownloadTask class]]) {
547
- [(FIRStorageDownloadTask *)task resume];
548
- } else {
549
- [(FIRStorageUploadTask *)task resume];
534
+ if (currentStatus == FIRStorageTaskStatusPause) {
535
+ if ([task isKindOfClass:[FIRStorageDownloadTask class]]) {
536
+ [(FIRStorageDownloadTask *)task resume];
537
+ } else {
538
+ [(FIRStorageUploadTask *)task resume];
539
+ }
540
+ return @YES;
550
541
  }
551
- break;
542
+ return @NO;
552
543
  case 2:
553
- [task cancel];
554
- break;
544
+ if (currentStatus != FIRStorageTaskStatusSuccess &&
545
+ currentStatus != FIRStorageTaskStatusFailure &&
546
+ (currentStatus == FIRStorageTaskStatusResume ||
547
+ currentStatus == FIRStorageTaskStatusProgress ||
548
+ currentStatus == FIRStorageTaskStatusPause)) {
549
+ [PENDING_TASKS removeObjectForKey:taskIdNumber];
550
+ if ([task isKindOfClass:[FIRStorageDownloadTask class]]) {
551
+ [(FIRStorageDownloadTask *)task cancel];
552
+ } else {
553
+ [(FIRStorageUploadTask *)task cancel];
554
+ }
555
+ return @YES;
556
+ }
557
+ return @NO;
555
558
  default:
556
- break;
559
+ return @NO;
557
560
  }
558
561
  }
559
562
 
563
+ // storageConstantsDictionary
564
+ + (NSDictionary *)storageConstantsDictionary {
565
+ NSMutableDictionary *constants = [@{} mutableCopy];
566
+
567
+ if ([[[FIRApp allApps] allKeys] count] > 0) {
568
+ FIRStorage *storageInstance = [FIRStorage storage];
569
+ constants[@"maxDownloadRetryTime"] =
570
+ @((NSInteger)[storageInstance maxDownloadRetryTime] * 1000);
571
+ constants[@"maxOperationRetryTime"] =
572
+ @((NSInteger)[storageInstance maxOperationRetryTime] * 1000);
573
+ constants[@"maxUploadRetryTime"] = @((NSInteger)[storageInstance maxUploadRetryTime] * 1000);
574
+ } else {
575
+ constants[@"maxDownloadRetryTime"] = @0;
576
+ constants[@"maxOperationRetryTime"] = @0;
577
+ constants[@"maxUploadRetryTime"] = @0;
578
+ }
579
+
580
+ return constants;
581
+ }
582
+
560
583
  #pragma mark -
561
584
  #pragma mark Firebase Storage Internals
562
585
 
563
- - (NSString *)createEmulatorKey:(NSString *)bucketUrl appName:(NSString *)appName {
586
+ // createEmulatorKey
587
+ + (NSString *)createEmulatorKey:(NSString *)bucketUrl appName:(NSString *)appName {
564
588
  return [NSString stringWithFormat:@"%@-%@", appName, bucketUrl];
565
589
  }
566
590
 
567
- - (void)addUploadTaskObservers:(FIRStorageUploadTask *)uploadTask
591
+ // addUploadTaskObservers
592
+ + (void)addUploadTaskObservers:(FIRStorageUploadTask *)uploadTask
568
593
  appDisplayName:(NSString *)appDisplayName
569
594
  taskId:(NSNumber *)taskId
570
595
  resolver:(RCTPromiseResolveBlock)resolve
571
596
  rejecter:(RCTPromiseRejectBlock)reject {
597
+ [self initializeSharedStateOnce];
572
598
  PENDING_TASKS[taskId] = uploadTask;
573
599
 
574
- // upload started or resumed
575
600
  [uploadTask
576
601
  observeStatus:FIRStorageTaskStatusResume
577
602
  handler:^(FIRStorageTaskSnapshot *snapshot) {
@@ -584,7 +609,6 @@ RCT_EXPORT_METHOD(setTaskStatus
584
609
  [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT body:event];
585
610
  }];
586
611
 
587
- // upload paused
588
612
  [uploadTask
589
613
  observeStatus:FIRStorageTaskStatusPause
590
614
  handler:^(FIRStorageTaskSnapshot *snapshot) {
@@ -597,7 +621,6 @@ RCT_EXPORT_METHOD(setTaskStatus
597
621
  [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT body:event];
598
622
  }];
599
623
 
600
- // upload reported progress
601
624
  [uploadTask
602
625
  observeStatus:FIRStorageTaskStatusProgress
603
626
  handler:^(FIRStorageTaskSnapshot *snapshot) {
@@ -610,7 +633,6 @@ RCT_EXPORT_METHOD(setTaskStatus
610
633
  [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT body:event];
611
634
  }];
612
635
 
613
- // upload completed successfully
614
636
  [uploadTask observeStatus:FIRStorageTaskStatusSuccess
615
637
  handler:^(FIRStorageTaskSnapshot *snapshot) {
616
638
  [PENDING_TASKS removeObjectForKey:taskId];
@@ -618,7 +640,6 @@ RCT_EXPORT_METHOD(setTaskStatus
618
640
  NSDictionary *eventBody =
619
641
  [RNFBStorageCommon getUploadTaskAsDictionary:snapshot];
620
642
 
621
- // state_changed
622
643
  NSDictionary *stateChangeEvent =
623
644
  [RNFBStorageCommon getStorageEventDictionary:eventBody
624
645
  internalEventName:RNFB_STORAGE_STATE_CHANGED
@@ -627,7 +648,6 @@ RCT_EXPORT_METHOD(setTaskStatus
627
648
  [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT
628
649
  body:stateChangeEvent];
629
650
 
630
- // upload_success
631
651
  NSDictionary *uploadSuccessEvent =
632
652
  [RNFBStorageCommon getStorageEventDictionary:eventBody
633
653
  internalEventName:RNFB_STORAGE_UPLOAD_SUCCESS
@@ -643,7 +663,6 @@ RCT_EXPORT_METHOD(setTaskStatus
643
663
  handler:^(FIRStorageTaskSnapshot *snapshot) {
644
664
  [PENDING_TASKS removeObjectForKey:taskId];
645
665
 
646
- // state_changed
647
666
  NSMutableDictionary *taskSnapshotDict =
648
667
  [RNFBStorageCommon getUploadTaskAsDictionary:snapshot];
649
668
  NSDictionary *stateChangedEvtBody =
@@ -657,7 +676,6 @@ RCT_EXPORT_METHOD(setTaskStatus
657
676
  [[RNFBRCTEventEmitter shared] sendEventWithName:RNFB_STORAGE_EVENT
658
677
  body:stateChangedEvent];
659
678
 
660
- // upload_failed
661
679
  NSDictionary *eventBody = [RNFBStorageCommon buildErrorSnapshotDict:snapshot.error
662
680
  taskSnapshotDict:taskSnapshotDict];
663
681
  NSDictionary *event =
@@ -671,7 +689,9 @@ RCT_EXPORT_METHOD(setTaskStatus
671
689
  }];
672
690
  }
673
691
 
674
- - (FIRStorageReference *)getReferenceFromUrl:(NSString *)url app:(FIRApp *)firebaseApp {
692
+ // getReferenceFromUrl
693
+ + (FIRStorageReference *)getReferenceFromUrl:(NSString *)url app:(FIRApp *)firebaseApp {
694
+ [self initializeSharedStateOnce];
675
695
  FIRStorage *storage;
676
696
  NSString *pathWithBucketName = [url substringWithRange:NSMakeRange(5, [url length] - 5)];
677
697
  NSString *bucket = url;
@@ -681,7 +701,6 @@ RCT_EXPORT_METHOD(setTaskStatus
681
701
  }
682
702
  storage = [FIRStorage storageForApp:firebaseApp URL:bucket];
683
703
 
684
- NSLog(@"Setting emulator - host %@ port %ld", emulatorHost, (long)emulatorPort);
685
704
  NSString *key = [self createEmulatorKey:bucket appName:firebaseApp.name];
686
705
  if (![emulatorHost isEqual:[NSNull null]] && emulatorHost != nil && !emulatorConfigs[key]) {
687
706
  @try {
@@ -696,7 +715,8 @@ RCT_EXPORT_METHOD(setTaskStatus
696
715
  return [storage referenceForURL:url];
697
716
  }
698
717
 
699
- - (void)promiseRejectStorageException:(RCTPromiseRejectBlock)reject error:(NSError *)error {
718
+ // promiseRejectStorageException
719
+ + (void)promiseRejectStorageException:(RCTPromiseRejectBlock)reject error:(NSError *)error {
700
720
  NSArray *codeAndMessage = [RNFBStorageCommon getErrorCodeMessage:error];
701
721
  [RNFBSharedUtils rejectPromiseWithUserInfo:reject
702
722
  userInfo:(NSMutableDictionary *)@{
@@ -705,19 +725,4 @@ RCT_EXPORT_METHOD(setTaskStatus
705
725
  }];
706
726
  }
707
727
 
708
- - (NSDictionary *)constantsToExport {
709
- NSMutableDictionary *constants = [@{} mutableCopy];
710
-
711
- if ([[[FIRApp allApps] allKeys] count] > 0) {
712
- FIRStorage *storageInstance = [FIRStorage storage];
713
- constants[@"maxDownloadRetryTime"] =
714
- @((NSInteger)[storageInstance maxDownloadRetryTime] * 1000);
715
- constants[@"maxOperationRetryTime"] =
716
- @((NSInteger)[storageInstance maxOperationRetryTime] * 1000);
717
- constants[@"maxUploadRetryTime"] = @((NSInteger)[storageInstance maxUploadRetryTime] * 1000);
718
- }
719
-
720
- return constants;
721
- }
722
-
723
728
  @end