Skip to content

Commit 436188c

Browse files
committedSep 28, 2023
add code to FirebaseFunctionsException
1 parent f7c65b3 commit 436188c

File tree

4 files changed

+136
-13
lines changed
  • firebase-functions/src

4 files changed

+136
-13
lines changed
 

‎firebase-functions/src/androidMain/kotlin/dev/gitlive/firebase/functions/functions.kt

+5
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,8 @@ actual class HttpsCallableResult constructor(val android: com.google.firebase.fu
5252
}
5353

5454
actual typealias FirebaseFunctionsException = com.google.firebase.functions.FirebaseFunctionsException
55+
56+
actual val FirebaseFunctionsException.code: FunctionsExceptionCode get() = code
57+
58+
actual typealias FunctionsExceptionCode = com.google.firebase.functions.FirebaseFunctionsException.Code
59+

‎firebase-functions/src/commonMain/kotlin/dev/gitlive/firebase/functions/functions.kt

+23
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,26 @@ expect fun Firebase.functions(app: FirebaseApp): FirebaseFunctions
3939
expect fun Firebase.functions(app: FirebaseApp, region: String): FirebaseFunctions
4040

4141
expect class FirebaseFunctionsException: FirebaseException
42+
43+
@Suppress("EXTENSION_SHADOWED_BY_MEMBER")
44+
expect val FirebaseFunctionsException.code: FunctionsExceptionCode
45+
46+
expect enum class FunctionsExceptionCode {
47+
OK,
48+
CANCELLED,
49+
UNKNOWN,
50+
INVALID_ARGUMENT,
51+
DEADLINE_EXCEEDED,
52+
NOT_FOUND,
53+
ALREADY_EXISTS,
54+
PERMISSION_DENIED,
55+
RESOURCE_EXHAUSTED,
56+
FAILED_PRECONDITION,
57+
ABORTED,
58+
OUT_OF_RANGE,
59+
UNIMPLEMENTED,
60+
INTERNAL,
61+
UNAVAILABLE,
62+
DATA_LOSS,
63+
UNAUTHENTICATED
64+
}

‎firebase-functions/src/iosMain/kotlin/dev/gitlive/firebase/functions/functions.kt

+55-10
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,14 @@
44

55
package dev.gitlive.firebase.functions
66

7-
import cocoapods.FirebaseFunctions.*
8-
import dev.gitlive.firebase.Firebase
9-
import dev.gitlive.firebase.FirebaseApp
10-
import dev.gitlive.firebase.FirebaseException
11-
import dev.gitlive.firebase.decode
12-
import dev.gitlive.firebase.encode
7+
import cocoapods.FirebaseFunctions.FIRFunctions
8+
import cocoapods.FirebaseFunctions.FIRHTTPSCallable
9+
import cocoapods.FirebaseFunctions.FIRHTTPSCallableResult
10+
import dev.gitlive.firebase.*
1311
import kotlinx.coroutines.CompletableDeferred
1412
import kotlinx.serialization.DeserializationStrategy
1513
import kotlinx.serialization.SerializationStrategy
16-
import platform.Foundation.*
14+
import platform.Foundation.NSError
1715

1816
actual val Firebase.functions
1917
get() = FirebaseFunctions(FIRFunctions.functions())
@@ -58,15 +56,62 @@ actual class HttpsCallableResult constructor(val ios: FIRHTTPSCallableResult) {
5856
decode(strategy, ios.data())
5957
}
6058

61-
actual class FirebaseFunctionsException(message: String): FirebaseException(message)
59+
actual class FirebaseFunctionsException(message: String, val code: FunctionsExceptionCode) : FirebaseException(message)
60+
61+
@Suppress("EXTENSION_SHADOWED_BY_MEMBER")
62+
actual val FirebaseFunctionsException.code: FunctionsExceptionCode get() = code
63+
64+
actual enum class FunctionsExceptionCode {
65+
OK,
66+
CANCELLED,
67+
UNKNOWN,
68+
INVALID_ARGUMENT,
69+
DEADLINE_EXCEEDED,
70+
NOT_FOUND,
71+
ALREADY_EXISTS,
72+
PERMISSION_DENIED,
73+
RESOURCE_EXHAUSTED,
74+
FAILED_PRECONDITION,
75+
ABORTED,
76+
OUT_OF_RANGE,
77+
UNIMPLEMENTED,
78+
INTERNAL,
79+
UNAVAILABLE,
80+
DATA_LOSS,
81+
UNAUTHENTICATED
82+
}
83+
//todo uncomment once https://github.com/firebase/firebase-ios-sdk/issues/11862 fixed
84+
fun NSError.toException() = when(domain) {
85+
// FIRFunctionsErrorDomain -> when(code) {
86+
// FIRFunctionsErrorCodeOK -> FunctionsExceptionCode.OK
87+
// FIRFunctionsErrorCodeCancelled -> FunctionsExceptionCode.CANCELLED
88+
// FIRFunctionsErrorCodeUnknown -> FunctionsExceptionCode.UNKNOWN
89+
// FIRFunctionsErrorCodeInvalidArgument -> FunctionsExceptionCode.INVALID_ARGUMENT
90+
// FIRFunctionsErrorCodeDeadlineExceeded -> FunctionsExceptionCode.DEADLINE_EXCEEDED
91+
// FIRFunctionsErrorCodeNotFound -> FunctionsExceptionCode.NOT_FOUND
92+
// FIRFunctionsErrorCodeAlreadyExists -> FunctionsExceptionCode.ALREADY_EXISTS
93+
// FIRFunctionsErrorCodePermissionDenied -> FunctionsExceptionCode.PERMISSION_DENIED
94+
// FIRFunctionsErrorCodeResourceExhausted -> FunctionsExceptionCode.RESOURCE_EXHAUSTED
95+
// FIRFunctionsErrorCodeFailedPrecondition -> FunctionsExceptionCode.FAILED_PRECONDITION
96+
// FIRFunctionsErrorCodeAborted -> FunctionsExceptionCode.ABORTED
97+
// FIRFunctionsErrorCodeOutOfRange -> FunctionsExceptionCode.OUT_OF_RANGE
98+
// FIRFunctionsErrorCodeUnimplemented -> FunctionsExceptionCode.UNIMPLEMENTED
99+
// FIRFunctionsErrorCodeInternal -> FunctionsExceptionCode.INTERNAL
100+
// FIRFunctionsErrorCodeUnavailable -> FunctionsExceptionCode.UNAVAILABLE
101+
// FIRFunctionsErrorCodeDataLoss -> FunctionsExceptionCode.DATA_LOSS
102+
// FIRFunctionsErrorCodeUnauthenticated -> FunctionsExceptionCode.UNAUTHENTICATED
103+
// else -> FunctionsExceptionCode.UNKNOWN
104+
// }
105+
else -> FunctionsExceptionCode.UNKNOWN
106+
}.let { FirebaseFunctionsException(description!!, it) }
62107

63108
suspend inline fun <T> T.await(function: T.(callback: (NSError?) -> Unit) -> Unit) {
64109
val job = CompletableDeferred<Unit>()
65110
function { error ->
66111
if(error == null) {
67112
job.complete(Unit)
68113
} else {
69-
job.completeExceptionally(FirebaseFunctionsException(error.localizedDescription))
114+
job.completeExceptionally(error.toException())
70115
}
71116
}
72117
job.await()
@@ -78,7 +123,7 @@ suspend inline fun <T, reified R> T.awaitResult(function: T.(callback: (R?, NSEr
78123
if(error == null) {
79124
job.complete(result)
80125
} else {
81-
job.completeExceptionally(FirebaseFunctionsException(error.localizedDescription))
126+
job.completeExceptionally(error.toException())
82127
}
83128
}
84129
return job.await() as R

‎firebase-functions/src/jsMain/kotlin/dev/gitlive/firebase/functions/functions.kt

+53-3
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import dev.gitlive.firebase.functions.externals.*
99
import kotlinx.coroutines.await
1010
import kotlinx.serialization.DeserializationStrategy
1111
import kotlinx.serialization.SerializationStrategy
12-
import org.w3c.dom.url.URL
1312
import kotlin.js.json
1413
import dev.gitlive.firebase.functions.externals.HttpsCallableResult as JsHttpsCallableResult
1514

@@ -55,7 +54,30 @@ actual class HttpsCallableResult constructor(val js: JsHttpsCallableResult) {
5554

5655
}
5756

58-
actual open class FirebaseFunctionsException(code: String?, cause: Throwable): FirebaseException(code, cause)
57+
actual class FirebaseFunctionsException(cause: Throwable, val code: FunctionsExceptionCode) : FirebaseException(code.toString(), cause)
58+
59+
@Suppress("EXTENSION_SHADOWED_BY_MEMBER")
60+
actual val FirebaseFunctionsException.code: FunctionsExceptionCode get() = code
61+
62+
actual enum class FunctionsExceptionCode {
63+
OK,
64+
CANCELLED,
65+
UNKNOWN,
66+
INVALID_ARGUMENT,
67+
DEADLINE_EXCEEDED,
68+
NOT_FOUND,
69+
ALREADY_EXISTS,
70+
PERMISSION_DENIED,
71+
RESOURCE_EXHAUSTED,
72+
FAILED_PRECONDITION,
73+
ABORTED,
74+
OUT_OF_RANGE,
75+
UNIMPLEMENTED,
76+
INTERNAL,
77+
UNAVAILABLE,
78+
DATA_LOSS,
79+
UNAUTHENTICATED
80+
}
5981

6082
inline fun <T, R> T.rethrow(function: T.() -> R): R = dev.gitlive.firebase.functions.rethrow { function() }
6183

@@ -65,6 +87,34 @@ inline fun <R> rethrow(function: () -> R): R {
6587
} catch (e: Exception) {
6688
throw e
6789
} catch(e: dynamic) {
68-
throw FirebaseFunctionsException(e.code as String?, e)
90+
throw errorToException(e)
6991
}
7092
}
93+
94+
fun errorToException(e: dynamic) = (e?.code ?: e?.message ?: "")
95+
.toString()
96+
.lowercase()
97+
.let {
98+
when {
99+
"cancelled" in it -> FirebaseFunctionsException(e, FunctionsExceptionCode.CANCELLED)
100+
"invalid-argument" in it -> FirebaseFunctionsException(e, FunctionsExceptionCode.INVALID_ARGUMENT)
101+
"deadline-exceeded" in it -> FirebaseFunctionsException(e, FunctionsExceptionCode.DEADLINE_EXCEEDED)
102+
"not-found" in it -> FirebaseFunctionsException(e, FunctionsExceptionCode.NOT_FOUND)
103+
"already-exists" in it -> FirebaseFunctionsException(e, FunctionsExceptionCode.ALREADY_EXISTS)
104+
"permission-denied" in it -> FirebaseFunctionsException(e, FunctionsExceptionCode.PERMISSION_DENIED)
105+
"resource-exhausted" in it -> FirebaseFunctionsException(e, FunctionsExceptionCode.RESOURCE_EXHAUSTED)
106+
"failed-precondition" in it -> FirebaseFunctionsException(e, FunctionsExceptionCode.FAILED_PRECONDITION)
107+
"aborted" in it -> FirebaseFunctionsException(e, FunctionsExceptionCode.ABORTED)
108+
"out-of-range" in it -> FirebaseFunctionsException(e, FunctionsExceptionCode.OUT_OF_RANGE)
109+
"unimplemented" in it -> FirebaseFunctionsException(e, FunctionsExceptionCode.UNIMPLEMENTED)
110+
"internal" in it -> FirebaseFunctionsException(e, FunctionsExceptionCode.INTERNAL)
111+
"unavailable" in it -> FirebaseFunctionsException(e, FunctionsExceptionCode.UNAVAILABLE)
112+
"data-loss" in it -> FirebaseFunctionsException(e, FunctionsExceptionCode.DATA_LOSS)
113+
"unauthenticated" in it -> FirebaseFunctionsException(e, FunctionsExceptionCode.UNAUTHENTICATED)
114+
"unknown" in it -> FirebaseFunctionsException(e, FunctionsExceptionCode.UNKNOWN)
115+
else -> {
116+
println("Unknown error code in ${JSON.stringify(e)}")
117+
FirebaseFunctionsException(e, FunctionsExceptionCode.UNKNOWN)
118+
}
119+
}
120+
}

0 commit comments

Comments
 (0)
Failed to load comments.