Skip to content

Commit ea7fa10

Browse files
committed
Refactor auth
1 parent 21d2264 commit ea7fa10

File tree

6 files changed

+395
-298
lines changed

6 files changed

+395
-298
lines changed

firebase-auth/src/jsMain/kotlin/dev/gitlive/firebase/auth/auth.kt

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,21 @@
55
package dev.gitlive.firebase.auth
66

77
import dev.gitlive.firebase.*
8+
import dev.gitlive.firebase.FirebaseApp
9+
import dev.gitlive.firebase.externals.*
810
import kotlinx.coroutines.await
911
import kotlinx.coroutines.channels.awaitClose
1012
import kotlinx.coroutines.flow.callbackFlow
1113
import kotlin.js.json
14+
import dev.gitlive.firebase.externals.AuthResult as JsAuthResult
1215

1316
actual val Firebase.auth
14-
get() = rethrow { dev.gitlive.firebase.auth; FirebaseAuth(firebase.auth()) }
17+
get() = rethrow { FirebaseAuth(getAuth()) }
1518

1619
actual fun Firebase.auth(app: FirebaseApp) =
17-
rethrow { dev.gitlive.firebase.auth; FirebaseAuth(firebase.auth(app.js)) }
20+
rethrow { FirebaseAuth(getAuth(app.js)) }
1821

19-
actual class FirebaseAuth internal constructor(val js: firebase.auth.Auth) {
22+
actual class FirebaseAuth internal constructor(val js: Auth) {
2023

2124
actual val currentUser: FirebaseUser?
2225
get() = rethrow { js.currentUser?.let { FirebaseUser(it) } }
@@ -39,47 +42,51 @@ actual class FirebaseAuth internal constructor(val js: firebase.auth.Auth) {
3942
get() = js.languageCode ?: ""
4043
set(value) { js.languageCode = value }
4144

42-
actual suspend fun applyActionCode(code: String) = rethrow { js.applyActionCode(code).await() }
43-
actual suspend fun confirmPasswordReset(code: String, newPassword: String) = rethrow { js.confirmPasswordReset(code, newPassword).await() }
45+
actual suspend fun applyActionCode(code: String) = rethrow { applyActionCode(js, code).await() }
46+
actual suspend fun confirmPasswordReset(code: String, newPassword: String) = rethrow {
47+
confirmPasswordReset(js, code, newPassword).await()
48+
}
4449

4550
actual suspend fun createUserWithEmailAndPassword(email: String, password: String) =
46-
rethrow { AuthResult(js.createUserWithEmailAndPassword(email, password).await()) }
51+
rethrow { AuthResult(createUserWithEmailAndPassword(js, email, password).await()) }
4752

48-
actual suspend fun fetchSignInMethodsForEmail(email: String): List<String> = rethrow { js.fetchSignInMethodsForEmail(email).await().asList() }
53+
actual suspend fun fetchSignInMethodsForEmail(email: String): List<String> = rethrow {
54+
fetchSignInMethodsForEmail(js, email).await().asList()
55+
}
4956

5057
actual suspend fun sendPasswordResetEmail(email: String, actionCodeSettings: ActionCodeSettings?) =
51-
rethrow { js.sendPasswordResetEmail(email, actionCodeSettings?.toJson()).await() }
58+
rethrow { sendPasswordResetEmail(js, email, actionCodeSettings?.toJson()).await() }
5259

5360
actual suspend fun sendSignInLinkToEmail(email: String, actionCodeSettings: ActionCodeSettings) =
54-
rethrow { js.sendSignInLinkToEmail(email, actionCodeSettings.toJson()).await() }
61+
rethrow { sendSignInLinkToEmail(js, email, actionCodeSettings.toJson()).await() }
5562

56-
actual fun isSignInWithEmailLink(link: String) = rethrow { js.isSignInWithEmailLink(link) }
63+
actual fun isSignInWithEmailLink(link: String) = rethrow { isSignInWithEmailLink(js, link) }
5764

5865
actual suspend fun signInWithEmailAndPassword(email: String, password: String) =
59-
rethrow { AuthResult(js.signInWithEmailAndPassword(email, password).await()) }
66+
rethrow { AuthResult(signInWithEmailAndPassword(js, email, password).await()) }
6067

6168
actual suspend fun signInWithCustomToken(token: String) =
62-
rethrow { AuthResult(js.signInWithCustomToken(token).await()) }
69+
rethrow { AuthResult(signInWithCustomToken(js, token).await()) }
6370

6471
actual suspend fun signInAnonymously() =
65-
rethrow { AuthResult(js.signInAnonymously().await()) }
72+
rethrow { AuthResult(signInAnonymously(js).await()) }
6673

6774
actual suspend fun signInWithCredential(authCredential: AuthCredential) =
68-
rethrow { AuthResult(js.signInWithCredential(authCredential.js).await()) }
75+
rethrow { AuthResult(signInWithCredential(js, authCredential.js).await()) }
6976

7077
actual suspend fun signInWithEmailLink(email: String, link: String) =
71-
rethrow { AuthResult(js.signInWithEmailLink(email, link).await()) }
78+
rethrow { AuthResult(signInWithEmailLink(js, email, link).await()) }
7279

73-
actual suspend fun signOut() = rethrow { js.signOut().await() }
80+
actual suspend fun signOut() = rethrow { signOut(js).await() }
7481

7582
actual suspend fun updateCurrentUser(user: FirebaseUser) =
76-
rethrow { js.updateCurrentUser(user.js).await() }
83+
rethrow { updateCurrentUser(js, user.js).await() }
7784

7885
actual suspend fun verifyPasswordResetCode(code: String): String =
79-
rethrow { js.verifyPasswordResetCode(code).await() }
86+
rethrow { verifyPasswordResetCode(js, code).await() }
8087

8188
actual suspend fun <T : ActionCodeResult> checkActionCode(code: String): T = rethrow {
82-
val result = js.checkActionCode(code).await()
89+
val result = checkActionCode(js, code).await()
8390
@Suppress("UNCHECKED_CAST")
8491
return when(result.operation) {
8592
"EMAIL_SIGNIN" -> ActionCodeResult.SignInWithEmailLink
@@ -98,15 +105,17 @@ actual class FirebaseAuth internal constructor(val js: firebase.auth.Auth) {
98105
} as T
99106
}
100107

101-
actual fun useEmulator(host: String, port: Int) = rethrow { js.useEmulator("http://$host:$port") }
108+
actual fun useEmulator(host: String, port: Int) = rethrow {
109+
connectAuthEmulator(js, "http://$host:$port")
110+
}
102111
}
103112

104-
actual class AuthResult internal constructor(val js: firebase.auth.AuthResult) {
113+
actual class AuthResult internal constructor(val js: JsAuthResult) {
105114
actual val user: FirebaseUser?
106115
get() = rethrow { js.user?.let { FirebaseUser(it) } }
107116
}
108117

109-
actual class AuthTokenResult(val js: firebase.auth.IdTokenResult) {
118+
actual class AuthTokenResult(val js: IdTokenResult) {
110119
// actual val authTimestamp: Long
111120
// get() = js.authTime
112121
actual val claims: Map<String, Any>
Lines changed: 41 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,76 @@
11
package dev.gitlive.firebase.auth
22

3-
import dev.gitlive.firebase.firebase
3+
import dev.gitlive.firebase.externals.*
4+
import dev.gitlive.firebase.externals.EmailAuthProvider
5+
import dev.gitlive.firebase.externals.FacebookAuthProvider
6+
import dev.gitlive.firebase.externals.GithubAuthProvider
7+
import dev.gitlive.firebase.externals.GoogleAuthProvider
8+
import dev.gitlive.firebase.externals.PhoneAuthProvider
9+
import dev.gitlive.firebase.externals.TwitterAuthProvider
410
import kotlinx.coroutines.await
5-
import kotlin.js.Json
611
import kotlin.js.json
12+
import dev.gitlive.firebase.externals.AuthCredential as JsAuthCredential
13+
import dev.gitlive.firebase.externals.OAuthProvider as JsOAuthProvider
714

8-
actual open class AuthCredential(val js: firebase.auth.AuthCredential) {
15+
actual open class AuthCredential(val js: JsAuthCredential) {
916
actual val providerId: String
1017
get() = js.providerId
1118
}
1219

13-
actual class PhoneAuthCredential(js: firebase.auth.AuthCredential) : AuthCredential(js)
14-
actual class OAuthCredential(js: firebase.auth.AuthCredential) : AuthCredential(js)
20+
actual class PhoneAuthCredential(js: JsAuthCredential) : AuthCredential(js)
21+
actual class OAuthCredential(js: JsAuthCredential) : AuthCredential(js)
1522

1623
actual object EmailAuthProvider {
1724
actual fun credential(email: String, password: String): AuthCredential =
18-
AuthCredential(firebase.auth.EmailAuthProvider.credential(email, password))
25+
AuthCredential(EmailAuthProvider.credential(email, password))
1926

2027
actual fun credentialWithLink(
2128
email: String,
2229
emailLink: String
23-
): AuthCredential = AuthCredential(firebase.auth.EmailAuthProvider.credentialWithLink(email, emailLink))
30+
): AuthCredential = AuthCredential(EmailAuthProvider.credentialWithLink(email, emailLink))
2431
}
2532

2633
actual object FacebookAuthProvider {
2734
actual fun credential(accessToken: String): AuthCredential =
28-
AuthCredential(firebase.auth.FacebookAuthProvider.credential(accessToken))
35+
AuthCredential(FacebookAuthProvider.credential(accessToken))
2936
}
3037

3138
actual object GithubAuthProvider {
3239
actual fun credential(token: String): AuthCredential =
33-
AuthCredential(firebase.auth.GithubAuthProvider.credential(token))
40+
AuthCredential(GithubAuthProvider.credential(token))
3441
}
3542

3643
actual object GoogleAuthProvider {
3744
actual fun credential(idToken: String?, accessToken: String?): AuthCredential {
3845
require(idToken != null || accessToken != null) {
3946
"Both parameters are optional but at least one must be present."
4047
}
41-
return AuthCredential(firebase.auth.GoogleAuthProvider.credential(idToken, accessToken))
48+
return AuthCredential(GoogleAuthProvider.credential(idToken, accessToken))
4249
}
4350
}
4451

45-
actual class OAuthProvider(val js: firebase.auth.OAuthProvider) {
52+
actual class OAuthProvider(val js: JsOAuthProvider) {
4653

4754
actual constructor(
4855
provider: String,
4956
scopes: List<String>,
5057
customParameters: Map<String, String>,
5158
auth: FirebaseAuth
52-
) : this(firebase.auth.OAuthProvider(provider)) {
59+
) : this(JsOAuthProvider(provider)) {
5360
rethrow {
5461
scopes.forEach { js.addScope(it) }
5562
js.setCustomParameters(customParameters)
5663
}
5764
}
65+
5866
actual companion object {
59-
actual fun credential(providerId: String, accessToken: String?, idToken: String?, rawNonce: String?): OAuthCredential = rethrow {
60-
firebase.auth.OAuthProvider(providerId)
67+
actual fun credential(
68+
providerId: String,
69+
accessToken: String?,
70+
idToken: String?,
71+
rawNonce: String?
72+
): OAuthCredential = rethrow {
73+
JsOAuthProvider(providerId)
6174
.credential(
6275
json(
6376
"accessToken" to (accessToken ?: undefined),
@@ -71,23 +84,30 @@ actual class OAuthProvider(val js: firebase.auth.OAuthProvider) {
7184
}
7285
}
7386

74-
actual class PhoneAuthProvider(val js: firebase.auth.PhoneAuthProvider) {
87+
actual class PhoneAuthProvider(val js: PhoneAuthProvider) {
88+
89+
actual constructor(auth: FirebaseAuth) : this(PhoneAuthProvider(auth.js))
7590

76-
actual constructor(auth: FirebaseAuth) : this(firebase.auth.PhoneAuthProvider(auth.js))
91+
actual fun credential(verificationId: String, smsCode: String): PhoneAuthCredential =
92+
PhoneAuthCredential(PhoneAuthProvider.credential(verificationId, smsCode))
7793

78-
actual fun credential(verificationId: String, smsCode: String): PhoneAuthCredential = PhoneAuthCredential(firebase.auth.PhoneAuthProvider.credential(verificationId, smsCode))
79-
actual suspend fun verifyPhoneNumber(phoneNumber: String, verificationProvider: PhoneVerificationProvider): AuthCredential = rethrow {
80-
val verificationId = js.verifyPhoneNumber(phoneNumber, verificationProvider.verifier).await()
94+
actual suspend fun verifyPhoneNumber(
95+
phoneNumber: String,
96+
verificationProvider: PhoneVerificationProvider
97+
): AuthCredential = rethrow {
98+
val verificationId =
99+
js.verifyPhoneNumber(phoneNumber, verificationProvider.verifier).await()
81100
val verificationCode = verificationProvider.getVerificationCode(verificationId)
82101
credential(verificationId, verificationCode)
83102
}
84103
}
85104

86105
actual interface PhoneVerificationProvider {
87-
val verifier: firebase.auth.ApplicationVerifier
106+
val verifier: ApplicationVerifier
88107
suspend fun getVerificationCode(verificationId: String): String
89108
}
90109

91110
actual object TwitterAuthProvider {
92-
actual fun credential(token: String, secret: String): AuthCredential = AuthCredential(firebase.auth.TwitterAuthProvider.credential(token, secret))
111+
actual fun credential(token: String, secret: String): AuthCredential =
112+
AuthCredential(TwitterAuthProvider.credential(token, secret))
93113
}
Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,31 @@
11
package dev.gitlive.firebase.auth
22

3-
import dev.gitlive.firebase.firebase
3+
import dev.gitlive.firebase.externals.MultiFactorUser
44
import kotlinx.coroutines.await
55
import kotlin.js.Date
6+
import dev.gitlive.firebase.externals.MultiFactorAssertion as JsMultiFactorAssertion
7+
import dev.gitlive.firebase.externals.MultiFactorInfo as JsMultiFactorInfo
8+
import dev.gitlive.firebase.externals.MultiFactorResolver as JsMultiFactorResolver
9+
import dev.gitlive.firebase.externals.MultiFactorSession as JsMultiFactorSession
610

7-
actual class MultiFactor(val js: firebase.multifactor.MultiFactorUser) {
11+
actual class MultiFactor(val js: MultiFactorUser) {
812
actual val enrolledFactors: List<MultiFactorInfo>
913
get() = rethrow { js.enrolledFactors.map { MultiFactorInfo(it) } }
14+
1015
actual suspend fun enroll(multiFactorAssertion: MultiFactorAssertion, displayName: String?) =
1116
rethrow { js.enroll(multiFactorAssertion.js, displayName).await() }
17+
1218
actual suspend fun getSession(): MultiFactorSession =
1319
rethrow { MultiFactorSession(js.getSession().await()) }
20+
1421
actual suspend fun unenroll(multiFactorInfo: MultiFactorInfo) =
1522
rethrow { js.unenroll(multiFactorInfo.js).await() }
23+
1624
actual suspend fun unenroll(factorUid: String) =
1725
rethrow { js.unenroll(factorUid).await() }
1826
}
1927

20-
actual class MultiFactorInfo(val js: firebase.multifactor.MultiFactorInfo) {
28+
actual class MultiFactorInfo(val js: JsMultiFactorInfo) {
2129
actual val displayName: String?
2230
get() = rethrow { js.displayName }
2331
actual val enrollmentTime: Double
@@ -28,17 +36,19 @@ actual class MultiFactorInfo(val js: firebase.multifactor.MultiFactorInfo) {
2836
get() = rethrow { js.uid }
2937
}
3038

31-
actual class MultiFactorAssertion(val js: firebase.multifactor.MultiFactorAssertion) {
39+
actual class MultiFactorAssertion(val js: JsMultiFactorAssertion) {
3240
actual val factorId: String
3341
get() = rethrow { js.factorId }
3442
}
3543

36-
actual class MultiFactorSession(val js: firebase.multifactor.MultiFactorSession)
44+
actual class MultiFactorSession(val js: JsMultiFactorSession)
3745

38-
actual class MultiFactorResolver(val js: firebase.multifactor.MultifactorResolver) {
46+
actual class MultiFactorResolver(val js: JsMultiFactorResolver) {
3947
actual val auth: FirebaseAuth = rethrow { FirebaseAuth(js.auth) }
4048
actual val hints: List<MultiFactorInfo> = rethrow { js.hints.map { MultiFactorInfo(it) } }
4149
actual val session: MultiFactorSession = rethrow { MultiFactorSession(js.session) }
4250

43-
actual suspend fun resolveSignIn(assertion: MultiFactorAssertion): AuthResult = rethrow { AuthResult(js.resolveSignIn(assertion.js).await()) }
44-
}
51+
actual suspend fun resolveSignIn(assertion: MultiFactorAssertion): AuthResult = rethrow {
52+
AuthResult(js.resolveSignIn(assertion.js).await())
53+
}
54+
}

0 commit comments

Comments
 (0)