@react-native-firebase/storage 26.0.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.
- package/CHANGELOG.md +6 -0
- package/RNFBStorage.podspec +9 -1
- package/dist/module/version.js +1 -1
- package/dist/typescript/lib/index.d.ts +1 -1
- package/dist/typescript/lib/version.d.ts +1 -1
- package/ios/RNFBStorage/RNFBStorageCommon.m +11 -0
- package/ios/RNFBStorage/RNFBStorageHelper.h +113 -0
- package/ios/RNFBStorage/RNFBStorageHelper.m +728 -0
- package/ios/RNFBStorage/RNFBStorageModule.mm +62 -596
- package/lib/version.ts +1 -1
- package/package.json +4 -4
|
@@ -15,33 +15,17 @@
|
|
|
15
15
|
*
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
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
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
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
|
-
|
|
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
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
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
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
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
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
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
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
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
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
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
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
244
|
+
return [_RCTTypedModuleConstants
|
|
245
|
+
newWithUnsafeDictionary:[RNFBStorageHelper storageConstantsDictionary]];
|
|
780
246
|
}
|
|
781
247
|
|
|
782
248
|
- (facebook::react::ModuleConstants<JS::NativeRNFBTurboStorage::Constants::Builder>)getConstants {
|