@@ -56,7 +56,17 @@ @implementation RNFBFunctionsModule
56
56
callable.timeoutInterval = [options[@" timeout" ] doubleValue ];
57
57
}
58
58
59
- [callable callWithObject: [wrapper valueForKey: @" data" ]
59
+ // In reality, this value is always null, because we always call it with null data
60
+ // on the javascript side for some reason. Check for that case (which should be 100% of the time)
61
+ // and set it to an `NSNull` (versus the `Optional<Any>` Swift will see from `valueForKey` so that
62
+ // FirebaseFunctions serializer won't have a validation failure for an unknown type.
63
+ id data = [wrapper valueForKey: @" data" ];
64
+ NSLog (@" RNFBFUNCTIONS pulled data from 'wrapper', has type %@ " , [data class ]);
65
+ if (data == nil ) {
66
+ data = [NSNull null ];
67
+ }
68
+
69
+ [callable callWithObject: data
60
70
completion: ^(FIRHTTPSCallableResult *_Nullable result, NSError *_Nullable error) {
61
71
if (error) {
62
72
NSObject *details = [NSNull null ];
@@ -108,7 +118,16 @@ @implementation RNFBFunctionsModule
108
118
callable.timeoutInterval = [options[@" timeout" ] doubleValue ];
109
119
}
110
120
111
- [callable callWithObject: [wrapper valueForKey: @" data" ]
121
+ // In reality, this value is always null, because we always call it with null data
122
+ // on the javascript side for some reason. Check for that case (which should be 100% of the time)
123
+ // and set it to an `NSNull` (versus the `Optional<Any>` Swift will see from `valueForKey` so that
124
+ // FirebaseFunctions serializer won't have a validation failure for an unknown type.
125
+ id data = [wrapper valueForKey: @" data" ];
126
+ if (data == nil ) {
127
+ data = [NSNull null ];
128
+ }
129
+
130
+ [callable callWithObject: data
112
131
completion: ^(FIRHTTPSCallableResult *_Nullable result, NSError *_Nullable error) {
113
132
if (error) {
114
133
NSObject *details = [NSNull null ];
@@ -134,60 +153,72 @@ @implementation RNFBFunctionsModule
134
153
135
154
- (NSString *)getErrorCodeName : (NSError *)error {
136
155
NSString *code = @" UNKNOWN" ;
137
- switch (error.code ) {
138
- case FIRFunctionsErrorCodeOK:
139
- code = @" OK" ;
140
- break ;
141
- case FIRFunctionsErrorCodeCancelled:
142
- code = @" CANCELLED" ;
143
- break ;
144
- case FIRFunctionsErrorCodeUnknown:
145
- code = @" UNKNOWN" ;
146
- break ;
147
- case FIRFunctionsErrorCodeInvalidArgument:
148
- code = @" INVALID_ARGUMENT" ;
149
- break ;
150
- case FIRFunctionsErrorCodeDeadlineExceeded:
151
- code = @" DEADLINE_EXCEEDED" ;
152
- break ;
153
- case FIRFunctionsErrorCodeNotFound:
154
- code = @" NOT_FOUND" ;
155
- break ;
156
- case FIRFunctionsErrorCodeAlreadyExists:
157
- code = @" ALREADY_EXISTS" ;
158
- break ;
159
- case FIRFunctionsErrorCodePermissionDenied:
160
- code = @" PERMISSION_DENIED" ;
161
- break ;
162
- case FIRFunctionsErrorCodeResourceExhausted:
163
- code = @" RESOURCE_EXHAUSTED" ;
164
- break ;
165
- case FIRFunctionsErrorCodeFailedPrecondition:
166
- code = @" FAILED_PRECONDITION" ;
167
- break ;
168
- case FIRFunctionsErrorCodeAborted:
169
- code = @" ABORTED" ;
170
- break ;
171
- case FIRFunctionsErrorCodeOutOfRange:
172
- code = @" OUT_OF_RANGE" ;
173
- break ;
174
- case FIRFunctionsErrorCodeUnimplemented:
175
- code = @" UNIMPLEMENTED" ;
176
- break ;
177
- case FIRFunctionsErrorCodeInternal:
178
- code = @" INTERNAL" ;
179
- break ;
180
- case FIRFunctionsErrorCodeUnavailable:
181
- code = @" UNAVAILABLE" ;
182
- break ;
183
- case FIRFunctionsErrorCodeDataLoss:
184
- code = @" DATA_LOSS" ;
185
- break ;
186
- case FIRFunctionsErrorCodeUnauthenticated:
187
- code = @" UNAUTHENTICATED" ;
188
- break ;
189
- default :
190
- break ;
156
+
157
+ if ([error.domain isEqual: @" com.firebase.functions" ]) {
158
+ switch (error.code ) {
159
+ case FIRFunctionsErrorCodeOK:
160
+ code = @" OK" ;
161
+ break ;
162
+ case FIRFunctionsErrorCodeCancelled:
163
+ code = @" CANCELLED" ;
164
+ break ;
165
+ case FIRFunctionsErrorCodeUnknown:
166
+ code = @" UNKNOWN" ;
167
+ break ;
168
+ case FIRFunctionsErrorCodeInvalidArgument:
169
+ code = @" INVALID_ARGUMENT" ;
170
+ break ;
171
+ case FIRFunctionsErrorCodeDeadlineExceeded:
172
+ code = @" DEADLINE_EXCEEDED" ;
173
+ break ;
174
+ case FIRFunctionsErrorCodeNotFound:
175
+ code = @" NOT_FOUND" ;
176
+ break ;
177
+ case FIRFunctionsErrorCodeAlreadyExists:
178
+ code = @" ALREADY_EXISTS" ;
179
+ break ;
180
+ case FIRFunctionsErrorCodePermissionDenied:
181
+ code = @" PERMISSION_DENIED" ;
182
+ break ;
183
+ case FIRFunctionsErrorCodeResourceExhausted:
184
+ code = @" RESOURCE_EXHAUSTED" ;
185
+ break ;
186
+ case FIRFunctionsErrorCodeFailedPrecondition:
187
+ code = @" FAILED_PRECONDITION" ;
188
+ break ;
189
+ case FIRFunctionsErrorCodeAborted:
190
+ code = @" ABORTED" ;
191
+ break ;
192
+ case FIRFunctionsErrorCodeOutOfRange:
193
+ code = @" OUT_OF_RANGE" ;
194
+ break ;
195
+ case FIRFunctionsErrorCodeUnimplemented:
196
+ code = @" UNIMPLEMENTED" ;
197
+ break ;
198
+ case FIRFunctionsErrorCodeInternal:
199
+ code = @" INTERNAL" ;
200
+ break ;
201
+ case FIRFunctionsErrorCodeUnavailable:
202
+ code = @" UNAVAILABLE" ;
203
+ break ;
204
+ case FIRFunctionsErrorCodeDataLoss:
205
+ code = @" DATA_LOSS" ;
206
+ break ;
207
+ case FIRFunctionsErrorCodeUnauthenticated:
208
+ code = @" UNAUTHENTICATED" ;
209
+ break ;
210
+ default :
211
+ break ;
212
+ }
213
+ }
214
+ if ([error.domain isEqual: @" FirebaseFunctions.FunctionsSerializer.Error" ]) {
215
+ NSLog (@" RNFBFUNCTIONS error description: %@ " , error.description );
216
+ if ([error.description containsString: @" unsupportedType" ]) {
217
+ code = @" UNSUPPORTED_TYPE" ;
218
+ }
219
+ if ([error.description containsString: @" failedToParseWrappedNumber" ]) {
220
+ code = @" FAILED_TO_PARSE_WRAPPED_NUMBER" ;
221
+ }
191
222
}
192
223
193
224
return code;
0 commit comments