@sneat/auth-core 0.27.2 → 0.27.3

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.
@@ -16,7 +16,13 @@ export var AuthStatuses;
16
16
  AuthStatuses["notAuthenticated"] = "notAuthenticated";
17
17
  })(AuthStatuses || (AuthStatuses = {}));
18
18
  const initialAuthStatus = AuthStatuses.authenticating;
19
- export const initialSneatAuthState = { status: initialAuthStatus };
19
+ export const initialSneatAuthState = {
20
+ status: initialAuthStatus,
21
+ loadingPhase: 'checking-session',
22
+ };
23
+ // The host must provide this from its authenticated route/session boundary.
24
+ // Keeping it out of the root injector is what allows public shells to render
25
+ // before Firebase Auth and Firestore are downloaded.
20
26
  export class SneatAuthStateService {
21
27
  // private readonly fbAuth: Auth;
22
28
  constructor() {
@@ -48,6 +54,11 @@ export class SneatAuthStateService {
48
54
  this.publishSignedOutState();
49
55
  return;
50
56
  }
57
+ this.authState$.next({
58
+ ...this.authState$.value,
59
+ status: AuthStatuses.authenticating,
60
+ loadingPhase: 'getting-token',
61
+ });
51
62
  if (this.authState$.value?.user?.uid !== firebaseUser?.uid) {
52
63
  this.analyticsService.identify(firebaseUser.uid);
53
64
  }
@@ -67,6 +78,7 @@ export class SneatAuthStateService {
67
78
  this.authState$.next({
68
79
  ...current,
69
80
  status,
81
+ loadingPhase: 'ready',
70
82
  token,
71
83
  user: authUser,
72
84
  });
@@ -80,6 +92,7 @@ export class SneatAuthStateService {
80
92
  const current = this.authState$.value || {};
81
93
  this.authState$.next({
82
94
  ...current,
95
+ loadingPhase: 'failed',
83
96
  err: `fbUser.getIdToken() failed: ${err}`,
84
97
  });
85
98
  this.errorLogger.logError(err, 'Failed in fbUser.getIdToken()');
@@ -89,6 +102,7 @@ export class SneatAuthStateService {
89
102
  const current = this.authState$.value || {};
90
103
  this.authState$.next({
91
104
  ...current,
105
+ loadingPhase: 'failed',
92
106
  err: `fbAuth.onIdTokenChanged() failed: ${err}`,
93
107
  });
94
108
  errorLogger.logError(err, 'failed in fbAuth.onIdTokenChanged');
@@ -117,6 +131,7 @@ export class SneatAuthStateService {
117
131
  : null,
118
132
  user: authUser,
119
133
  status,
134
+ loadingPhase: 'ready',
120
135
  });
121
136
  this.authStatus$.next(status);
122
137
  },
@@ -125,6 +140,7 @@ export class SneatAuthStateService {
125
140
  const current = this.authState$.value || {};
126
141
  this.authState$.next({
127
142
  ...current,
143
+ loadingPhase: 'failed',
128
144
  err: `fbAuth.onAuthStateChanged() failed: ${err}`,
129
145
  });
130
146
  },
@@ -136,6 +152,7 @@ export class SneatAuthStateService {
136
152
  this.authState$.next({
137
153
  ...this.authState$.value,
138
154
  status: AuthStatuses.notAuthenticated,
155
+ loadingPhase: 'ready',
139
156
  token: null,
140
157
  user: null,
141
158
  });
@@ -256,11 +273,10 @@ export class SneatAuthStateService {
256
273
  }
257
274
  }
258
275
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: SneatAuthStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
259
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: SneatAuthStateService, providedIn: 'root' }); }
276
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: SneatAuthStateService }); }
260
277
  }
261
278
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: SneatAuthStateService, decorators: [{
262
- type: Injectable,
263
- args: [{ providedIn: 'root' }]
279
+ type: Injectable
264
280
  }], ctorParameters: () => [] });
265
281
  function getAuthProvider(authProviderID) {
266
282
  switch (authProviderID) {
@@ -1 +1 @@
1
- {"version":3,"file":"sneat-auth-state-service.js","sourceRoot":"","sources":["../../../../../../libs/auth/core/src/lib/sneat-auth-state-service.ts"],"names":[],"mappings":"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","sourcesContent":["import { SignInWithOAuthOptions } from '@capacitor-firebase/authentication/dist/esm/definitions';\nimport { Capacitor } from '@capacitor/core';\nimport {\n FirebaseAuthentication,\n SignInResult,\n} from '@capacitor-firebase/authentication';\nimport {\n AnalyticsService,\n EnumAsUnionOfKeys,\n EnvConfigToken,\n IAnalyticsService,\n SNEAT_FIREBASE_AUTH,\n} from '@sneat/core';\nimport { BehaviorSubject, from, Observable } from 'rxjs';\nimport { Injectable, inject } from '@angular/core';\nimport { ErrorLogger, IErrorLogger } from '@sneat/core';\nimport { distinctUntilChanged, shareReplay } from 'rxjs/operators';\nimport {\n AuthProvider,\n getAuth,\n signInWithCredential,\n User,\n UserCredential,\n UserInfo,\n GoogleAuthProvider,\n OAuthProvider,\n GithubAuthProvider,\n FacebookAuthProvider,\n signInWithEmailLink,\n signInWithCustomToken,\n signInWithPopup,\n signInWithRedirect,\n linkWithPopup,\n unlink,\n} from 'firebase/auth';\n\n// TODO: fix & remove this eslint hint @nrwl/nx/enforce-module-boundaries\n\nimport { newRandomId } from '@sneat/random';\n\nexport enum AuthStatuses {\n authenticating = 'authenticating',\n authenticated = 'authenticated',\n notAuthenticated = 'notAuthenticated',\n}\n\nexport type AuthStatus = EnumAsUnionOfKeys<typeof AuthStatuses>;\n\nexport interface ISneatAuthUser extends UserInfo {\n readonly isAnonymous: boolean;\n readonly emailVerified: boolean;\n readonly providerData: readonly UserInfo[];\n}\n\nexport interface ISneatAuthState {\n readonly status: AuthStatus;\n readonly token?: string | null;\n readonly user?: ISneatAuthUser | null;\n readonly err?: unknown;\n}\n\nconst initialAuthStatus = AuthStatuses.authenticating;\nexport const initialSneatAuthState = { status: initialAuthStatus };\n\n@Injectable({ providedIn: 'root' })\nexport class SneatAuthStateService {\n private readonly errorLogger = inject<IErrorLogger>(ErrorLogger);\n private readonly analyticsService =\n inject<IAnalyticsService>(AnalyticsService);\n readonly fbAuth = inject(SNEAT_FIREBASE_AUTH);\n\n // Web OAuth sign-in strategy from the app's environment config (default popup).\n private readonly signInMethod =\n inject(EnvConfigToken, { optional: true })?.signInMethod ?? 'popup';\n\n private readonly id = newRandomId({ len: 5 });\n\n private readonly authStatus$ = new BehaviorSubject<AuthStatus>(\n initialAuthStatus,\n );\n public readonly authStatus = this.authStatus$\n .asObservable()\n .pipe(distinctUntilChanged());\n\n private readonly authUser$ = new BehaviorSubject<\n ISneatAuthUser | null | undefined\n >(undefined);\n public readonly authUser = this.authUser$.asObservable();\n\n private readonly authState$ = new BehaviorSubject<ISneatAuthState>(\n initialSneatAuthState,\n );\n public readonly authState = this.authState$.asObservable().pipe(\n // tap(v => console.log('SneatAuthStateService => SneatAuthState:', v)),\n shareReplay(1),\n );\n\n private tokenGeneration = 0;\n private tokenUserID?: string;\n\n // private readonly fbAuth: Auth;\n\n constructor() {\n const errorLogger = this.errorLogger;\n this.fbAuth.onIdTokenChanged({\n next: (firebaseUser) => {\n const tokenGeneration = ++this.tokenGeneration;\n const status: AuthStatus = firebaseUser\n ? AuthStatuses.authenticated\n : AuthStatuses.notAuthenticated;\n if (!firebaseUser) {\n this.publishSignedOutState();\n return;\n }\n if (\n this.authState$.value?.user?.uid !== firebaseUser?.uid\n ) {\n this.analyticsService.identify(firebaseUser.uid);\n }\n firebaseUser\n .getIdToken(false)\n .then((token) => {\n if (\n tokenGeneration !== this.tokenGeneration ||\n this.fbAuth.currentUser !== firebaseUser\n ) {\n return;\n }\n this.tokenUserID = firebaseUser.uid;\n const authUser = createSneatAuthUserFromFbUser(firebaseUser);\n if (this.authUser$.value?.uid !== authUser?.uid) {\n this.authUser$.next(authUser);\n }\n const current = this.authState$.value || {};\n this.authState$.next({\n ...current,\n status,\n token,\n user: authUser,\n });\n this.authStatus$.next(status); // Should be after authState$\n })\n .catch((err) => {\n if (\n tokenGeneration !== this.tokenGeneration ||\n this.fbAuth.currentUser !== firebaseUser\n ) {\n return;\n }\n const current = this.authState$.value || {};\n this.authState$.next({\n ...current,\n err: `fbUser.getIdToken() failed: ${err}`,\n });\n this.errorLogger.logError(err, 'Failed in fbUser.getIdToken()');\n });\n },\n error: (err) => {\n const current = this.authState$.value || {};\n this.authState$.next({\n ...current,\n err: `fbAuth.onIdTokenChanged() failed: ${err}`,\n });\n errorLogger.logError(err, 'failed in fbAuth.onIdTokenChanged');\n },\n complete: () => void 0,\n });\n this.fbAuth.onAuthStateChanged({\n complete: () => void 0,\n next: (fbUser) => {\n // console.log(\n // `SneatAuthStateService => authStatus: ${this.authStatus$.value}; fbUser`,\n // fbUser,\n // );\n const authUser = createSneatAuthUserFromFbUser(fbUser);\n if (!authUser) {\n ++this.tokenGeneration;\n this.publishSignedOutState();\n return;\n }\n const status = AuthStatuses.authenticated;\n this.authUser$.next(authUser);\n this.authState$.next({\n ...this.authState$.value,\n token:\n this.tokenUserID === authUser.uid\n ? this.authState$.value.token\n : null,\n user: authUser,\n status,\n });\n this.authStatus$.next(status);\n },\n error: (err) => {\n this.errorLogger.logError(\n err,\n 'failed to retrieve Firebase auth user information',\n );\n const current = this.authState$.value || {};\n this.authState$.next({\n ...current,\n err: `fbAuth.onAuthStateChanged() failed: ${err}`,\n });\n },\n });\n }\n\n private publishSignedOutState(): void {\n this.tokenUserID = undefined;\n this.authUser$.next(null);\n this.authState$.next({\n ...this.authState$.value,\n status: AuthStatuses.notAuthenticated,\n token: null,\n user: null,\n });\n this.authStatus$.next(AuthStatuses.notAuthenticated);\n }\n\n public signOut(): Promise<void> {\n return this.fbAuth.signOut();\n }\n\n public signInWithToken(token: string): Promise<UserCredential> {\n return signInWithCustomToken(this.fbAuth, token);\n }\n\n public signInWithEmailLink(email: string): Observable<UserCredential> {\n return from(signInWithEmailLink(this.fbAuth, email));\n }\n\n private isSigningInWith?: AuthProviderName;\n\n private async signInOnNativeLayer(\n authProviderID: AuthProviderID,\n ): Promise<UserCredential> {\n let signInResult: SignInResult | undefined;\n\n const o: SignInWithOAuthOptions = { skipNativeAuth: true };\n\n switch (authProviderID) {\n case 'google.com':\n signInResult = await FirebaseAuthentication.signInWithGoogle(o);\n break;\n case 'apple.com':\n signInResult = await FirebaseAuthentication.signInWithApple(o);\n break;\n case 'facebook.com':\n signInResult = await FirebaseAuthentication.signInWithFacebook(o);\n break;\n case 'microsoft.com':\n signInResult = await FirebaseAuthentication.signInWithMicrosoft(o);\n break;\n default:\n return Promise.reject('unsupported auth provider: ' + authProviderID);\n }\n // console.log(\n // `SneatAuthStateService.signInWith(${authProviderID}) => signed in on native layer, authenticating in webview...`,\n // signInResult,\n // );\n // we need to authenticate on webview layer using the id token and nonce from signInResult\n const userCredential = await this.authenticateOnWebviewLayer(\n authProviderID,\n signInResult,\n );\n\n return Promise.resolve(userCredential);\n }\n\n private async authenticateOnWebviewLayer(\n authProviderID: AuthProviderID,\n signInResult: SignInResult,\n ): Promise<UserCredential> {\n const oauthProvider = new OAuthProvider(authProviderID);\n const credential = oauthProvider.credential({\n idToken: signInResult.credential?.idToken,\n accessToken: signInResult.credential?.accessToken,\n rawNonce: signInResult.credential?.nonce,\n });\n const auth = getAuth();\n const userCredential = await signInWithCredential(auth, credential);\n\n // Get a valid Firebase ID token that has a 'kid' header\n const _firebaseIdToken = await userCredential.user.getIdToken();\n\n return Promise.resolve(userCredential);\n }\n\n private async signInWithWebSDK(\n authProviderID: AuthProviderID,\n ): Promise<UserCredential | undefined> {\n const authProvider = getAuthProvider(authProviderID);\n if (this.signInMethod === 'redirect') {\n // Full-page redirect; this navigates away and never resolves. The sign-in\n // is completed on return by BaseAppComponent's getRedirectResult() call.\n await signInWithRedirect(this.fbAuth, authProvider);\n return undefined;\n }\n const userCredential = await signInWithPopup(this.fbAuth, authProvider);\n return Promise.resolve(userCredential);\n }\n\n public async linkWith(\n authProviderID: AuthProviderID,\n ): Promise<UserCredential | undefined> {\n const authProvider = getAuthProvider(authProviderID);\n if (!this.fbAuth.currentUser) {\n return Promise.reject('no current user');\n }\n const userCredential = await linkWithPopup(\n this.fbAuth.currentUser,\n authProvider,\n );\n return Promise.resolve(userCredential);\n }\n\n public async unlinkAuthProvider(authProviderID: string): Promise<void> {\n const currentUser = this.fbAuth.currentUser;\n if (currentUser) {\n try {\n const updatedUser = await unlink(currentUser, authProviderID);\n const authUser = createSneatAuthUserFromFbUser(updatedUser);\n this.authUser$.next(authUser);\n return Promise.resolve();\n } catch (error) {\n return Promise.reject(\n `Failed to unlink ${authProviderID} account:` + error,\n );\n }\n } else {\n return Promise.reject('No user is currently signed in.');\n }\n }\n\n public async signInWith(\n authProviderID: AuthProviderID,\n ): Promise<UserCredential | undefined> {\n // console.log(\n // `SneatAuthStateService.signInWith(${authProviderID}), isSigningInWith=${this.isSigningInWith}, location.protocol=${location.protocol}`,\n // );\n this.analyticsService.logEvent('signingInWith', {\n provider: authProviderID,\n });\n try {\n if (this.isSigningInWith) {\n return Promise.reject(\n new Error(\n `a repeated call to SneatAuthStateService.signInWith(${authProviderID}) white previous sign in with ${this.isSigningInWith} is in progress`,\n ),\n );\n }\n\n let userCredential: UserCredential | undefined = undefined;\n\n if (Capacitor.isNativePlatform()) {\n userCredential = await this.signInOnNativeLayer(authProviderID);\n } else {\n userCredential = await this.signInWithWebSDK(authProviderID);\n }\n\n this.isSigningInWith = undefined;\n this.analyticsService.logEvent('signedInWith', {\n provider: authProviderID,\n });\n return Promise.resolve(userCredential);\n } catch (e) {\n this.isSigningInWith = undefined;\n return Promise.reject(e);\n }\n }\n}\n\nexport type AuthProviderID =\n | 'apple.com'\n | 'google.com'\n | 'microsoft.com'\n | 'facebook.com'\n | 'github.com'\n | 'phone';\n\nexport type AuthProviderName =\n | 'Google'\n | 'Apple'\n | 'Microsoft'\n | 'Facebook'\n | 'GitHub';\n\nfunction getAuthProvider(authProviderID: AuthProviderID): AuthProvider {\n switch (authProviderID) {\n case 'google.com':\n return new GoogleAuthProvider();\n case 'apple.com':\n return new OAuthProvider('apple.com');\n //\n // https://developer.apple.com/documentation/sign_in_with_apple/incorporating-sign-in-with-apple-into-other-platforms\n // (authProvider as OAuthProvider).setCustomParameters({\n // \t// \t// Localize the Apple authentication screen in current app locale.\n // \tlocale: 'en', // TODO: set locale\n // });\n case 'microsoft.com':\n return new OAuthProvider('microsoft.com');\n case 'facebook.com': {\n const facebookAuthProvider = new FacebookAuthProvider();\n facebookAuthProvider.addScope('email');\n return facebookAuthProvider;\n }\n case 'github.com': {\n const githubAuthProvider = new GithubAuthProvider();\n githubAuthProvider.addScope('read:user');\n githubAuthProvider.addScope('user:email');\n return githubAuthProvider;\n }\n default:\n throw new Error('unsupported auth provider: ' + authProviderID);\n }\n}\n\nfunction createSneatAuthUserFromFbUser(\n fbUser: User | null,\n): ISneatAuthUser | null {\n return (\n fbUser && {\n isAnonymous: fbUser.isAnonymous,\n emailVerified: fbUser.emailVerified,\n email: fbUser.email,\n uid: fbUser.uid,\n displayName: fbUser.displayName,\n phoneNumber: fbUser.phoneNumber,\n photoURL: fbUser.photoURL,\n providerId:\n fbUser.providerData?.length === 1 && fbUser.providerData[0]\n ? fbUser.providerData[0].providerId\n : fbUser.providerId,\n providerData: fbUser.providerData,\n }\n );\n}\n"]}
1
+ {"version":3,"file":"sneat-auth-state-service.js","sourceRoot":"","sources":["../../../../../../libs/auth/core/src/lib/sneat-auth-state-service.ts"],"names":[],"mappings":"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","sourcesContent":["import { SignInWithOAuthOptions } from '@capacitor-firebase/authentication/dist/esm/definitions';\nimport { Capacitor } from '@capacitor/core';\nimport {\n FirebaseAuthentication,\n SignInResult,\n} from '@capacitor-firebase/authentication';\nimport {\n AnalyticsService,\n EnumAsUnionOfKeys,\n EnvConfigToken,\n IAnalyticsService,\n SNEAT_FIREBASE_AUTH,\n} from '@sneat/core';\nimport { BehaviorSubject, from, Observable } from 'rxjs';\nimport { Injectable, inject } from '@angular/core';\nimport { ErrorLogger, IErrorLogger } from '@sneat/core';\nimport { distinctUntilChanged, shareReplay } from 'rxjs/operators';\nimport {\n AuthProvider,\n getAuth,\n signInWithCredential,\n User,\n UserCredential,\n UserInfo,\n GoogleAuthProvider,\n OAuthProvider,\n GithubAuthProvider,\n FacebookAuthProvider,\n signInWithEmailLink,\n signInWithCustomToken,\n signInWithPopup,\n signInWithRedirect,\n linkWithPopup,\n unlink,\n} from 'firebase/auth';\n\n// TODO: fix & remove this eslint hint @nrwl/nx/enforce-module-boundaries\n\nimport { newRandomId } from '@sneat/random';\n\nexport enum AuthStatuses {\n authenticating = 'authenticating',\n authenticated = 'authenticated',\n notAuthenticated = 'notAuthenticated',\n}\n\nexport type AuthStatus = EnumAsUnionOfKeys<typeof AuthStatuses>;\n\n/**\n * A user-visible, evidence-based session progress phase. The UI maps these to\n * friendly copy (for example “Checking your sign-in”), never SDK terminology.\n */\nexport type SneatAuthLoadingPhase =\n | 'checking-session'\n | 'getting-token'\n | 'ready'\n | 'failed';\n\nexport interface ISneatAuthUser extends UserInfo {\n readonly isAnonymous: boolean;\n readonly emailVerified: boolean;\n readonly providerData: readonly UserInfo[];\n}\n\nexport interface ISneatAuthState {\n readonly status: AuthStatus;\n readonly loadingPhase?: SneatAuthLoadingPhase;\n readonly token?: string | null;\n readonly user?: ISneatAuthUser | null;\n readonly err?: unknown;\n}\n\nconst initialAuthStatus = AuthStatuses.authenticating;\nexport const initialSneatAuthState = {\n status: initialAuthStatus,\n loadingPhase: 'checking-session' as const,\n};\n\n// The host must provide this from its authenticated route/session boundary.\n// Keeping it out of the root injector is what allows public shells to render\n// before Firebase Auth and Firestore are downloaded.\n@Injectable()\nexport class SneatAuthStateService {\n private readonly errorLogger = inject<IErrorLogger>(ErrorLogger);\n private readonly analyticsService =\n inject<IAnalyticsService>(AnalyticsService);\n readonly fbAuth = inject(SNEAT_FIREBASE_AUTH);\n\n // Web OAuth sign-in strategy from the app's environment config (default popup).\n private readonly signInMethod =\n inject(EnvConfigToken, { optional: true })?.signInMethod ?? 'popup';\n\n private readonly id = newRandomId({ len: 5 });\n\n private readonly authStatus$ = new BehaviorSubject<AuthStatus>(\n initialAuthStatus,\n );\n public readonly authStatus = this.authStatus$\n .asObservable()\n .pipe(distinctUntilChanged());\n\n private readonly authUser$ = new BehaviorSubject<\n ISneatAuthUser | null | undefined\n >(undefined);\n public readonly authUser = this.authUser$.asObservable();\n\n private readonly authState$ = new BehaviorSubject<ISneatAuthState>(\n initialSneatAuthState,\n );\n public readonly authState = this.authState$.asObservable().pipe(\n // tap(v => console.log('SneatAuthStateService => SneatAuthState:', v)),\n shareReplay(1),\n );\n\n private tokenGeneration = 0;\n private tokenUserID?: string;\n\n // private readonly fbAuth: Auth;\n\n constructor() {\n const errorLogger = this.errorLogger;\n this.fbAuth.onIdTokenChanged({\n next: (firebaseUser) => {\n const tokenGeneration = ++this.tokenGeneration;\n const status: AuthStatus = firebaseUser\n ? AuthStatuses.authenticated\n : AuthStatuses.notAuthenticated;\n if (!firebaseUser) {\n this.publishSignedOutState();\n return;\n }\n this.authState$.next({\n ...this.authState$.value,\n status: AuthStatuses.authenticating,\n loadingPhase: 'getting-token',\n });\n if (\n this.authState$.value?.user?.uid !== firebaseUser?.uid\n ) {\n this.analyticsService.identify(firebaseUser.uid);\n }\n firebaseUser\n .getIdToken(false)\n .then((token) => {\n if (\n tokenGeneration !== this.tokenGeneration ||\n this.fbAuth.currentUser !== firebaseUser\n ) {\n return;\n }\n this.tokenUserID = firebaseUser.uid;\n const authUser = createSneatAuthUserFromFbUser(firebaseUser);\n if (this.authUser$.value?.uid !== authUser?.uid) {\n this.authUser$.next(authUser);\n }\n const current = this.authState$.value || {};\n this.authState$.next({\n ...current,\n status,\n loadingPhase: 'ready',\n token,\n user: authUser,\n });\n this.authStatus$.next(status); // Should be after authState$\n })\n .catch((err) => {\n if (\n tokenGeneration !== this.tokenGeneration ||\n this.fbAuth.currentUser !== firebaseUser\n ) {\n return;\n }\n const current = this.authState$.value || {};\n this.authState$.next({\n ...current,\n loadingPhase: 'failed',\n err: `fbUser.getIdToken() failed: ${err}`,\n });\n this.errorLogger.logError(err, 'Failed in fbUser.getIdToken()');\n });\n },\n error: (err) => {\n const current = this.authState$.value || {};\n this.authState$.next({\n ...current,\n loadingPhase: 'failed',\n err: `fbAuth.onIdTokenChanged() failed: ${err}`,\n });\n errorLogger.logError(err, 'failed in fbAuth.onIdTokenChanged');\n },\n complete: () => void 0,\n });\n this.fbAuth.onAuthStateChanged({\n complete: () => void 0,\n next: (fbUser) => {\n // console.log(\n // `SneatAuthStateService => authStatus: ${this.authStatus$.value}; fbUser`,\n // fbUser,\n // );\n const authUser = createSneatAuthUserFromFbUser(fbUser);\n if (!authUser) {\n ++this.tokenGeneration;\n this.publishSignedOutState();\n return;\n }\n const status = AuthStatuses.authenticated;\n this.authUser$.next(authUser);\n this.authState$.next({\n ...this.authState$.value,\n token:\n this.tokenUserID === authUser.uid\n ? this.authState$.value.token\n : null,\n user: authUser,\n status,\n loadingPhase: 'ready',\n });\n this.authStatus$.next(status);\n },\n error: (err) => {\n this.errorLogger.logError(\n err,\n 'failed to retrieve Firebase auth user information',\n );\n const current = this.authState$.value || {};\n this.authState$.next({\n ...current,\n loadingPhase: 'failed',\n err: `fbAuth.onAuthStateChanged() failed: ${err}`,\n });\n },\n });\n }\n\n private publishSignedOutState(): void {\n this.tokenUserID = undefined;\n this.authUser$.next(null);\n this.authState$.next({\n ...this.authState$.value,\n status: AuthStatuses.notAuthenticated,\n loadingPhase: 'ready',\n token: null,\n user: null,\n });\n this.authStatus$.next(AuthStatuses.notAuthenticated);\n }\n\n public signOut(): Promise<void> {\n return this.fbAuth.signOut();\n }\n\n public signInWithToken(token: string): Promise<UserCredential> {\n return signInWithCustomToken(this.fbAuth, token);\n }\n\n public signInWithEmailLink(email: string): Observable<UserCredential> {\n return from(signInWithEmailLink(this.fbAuth, email));\n }\n\n private isSigningInWith?: AuthProviderName;\n\n private async signInOnNativeLayer(\n authProviderID: AuthProviderID,\n ): Promise<UserCredential> {\n let signInResult: SignInResult | undefined;\n\n const o: SignInWithOAuthOptions = { skipNativeAuth: true };\n\n switch (authProviderID) {\n case 'google.com':\n signInResult = await FirebaseAuthentication.signInWithGoogle(o);\n break;\n case 'apple.com':\n signInResult = await FirebaseAuthentication.signInWithApple(o);\n break;\n case 'facebook.com':\n signInResult = await FirebaseAuthentication.signInWithFacebook(o);\n break;\n case 'microsoft.com':\n signInResult = await FirebaseAuthentication.signInWithMicrosoft(o);\n break;\n default:\n return Promise.reject('unsupported auth provider: ' + authProviderID);\n }\n // console.log(\n // `SneatAuthStateService.signInWith(${authProviderID}) => signed in on native layer, authenticating in webview...`,\n // signInResult,\n // );\n // we need to authenticate on webview layer using the id token and nonce from signInResult\n const userCredential = await this.authenticateOnWebviewLayer(\n authProviderID,\n signInResult,\n );\n\n return Promise.resolve(userCredential);\n }\n\n private async authenticateOnWebviewLayer(\n authProviderID: AuthProviderID,\n signInResult: SignInResult,\n ): Promise<UserCredential> {\n const oauthProvider = new OAuthProvider(authProviderID);\n const credential = oauthProvider.credential({\n idToken: signInResult.credential?.idToken,\n accessToken: signInResult.credential?.accessToken,\n rawNonce: signInResult.credential?.nonce,\n });\n const auth = getAuth();\n const userCredential = await signInWithCredential(auth, credential);\n\n // Get a valid Firebase ID token that has a 'kid' header\n const _firebaseIdToken = await userCredential.user.getIdToken();\n\n return Promise.resolve(userCredential);\n }\n\n private async signInWithWebSDK(\n authProviderID: AuthProviderID,\n ): Promise<UserCredential | undefined> {\n const authProvider = getAuthProvider(authProviderID);\n if (this.signInMethod === 'redirect') {\n // Full-page redirect; this navigates away and never resolves. The sign-in\n // is completed on return by BaseAppComponent's getRedirectResult() call.\n await signInWithRedirect(this.fbAuth, authProvider);\n return undefined;\n }\n const userCredential = await signInWithPopup(this.fbAuth, authProvider);\n return Promise.resolve(userCredential);\n }\n\n public async linkWith(\n authProviderID: AuthProviderID,\n ): Promise<UserCredential | undefined> {\n const authProvider = getAuthProvider(authProviderID);\n if (!this.fbAuth.currentUser) {\n return Promise.reject('no current user');\n }\n const userCredential = await linkWithPopup(\n this.fbAuth.currentUser,\n authProvider,\n );\n return Promise.resolve(userCredential);\n }\n\n public async unlinkAuthProvider(authProviderID: string): Promise<void> {\n const currentUser = this.fbAuth.currentUser;\n if (currentUser) {\n try {\n const updatedUser = await unlink(currentUser, authProviderID);\n const authUser = createSneatAuthUserFromFbUser(updatedUser);\n this.authUser$.next(authUser);\n return Promise.resolve();\n } catch (error) {\n return Promise.reject(\n `Failed to unlink ${authProviderID} account:` + error,\n );\n }\n } else {\n return Promise.reject('No user is currently signed in.');\n }\n }\n\n public async signInWith(\n authProviderID: AuthProviderID,\n ): Promise<UserCredential | undefined> {\n // console.log(\n // `SneatAuthStateService.signInWith(${authProviderID}), isSigningInWith=${this.isSigningInWith}, location.protocol=${location.protocol}`,\n // );\n this.analyticsService.logEvent('signingInWith', {\n provider: authProviderID,\n });\n try {\n if (this.isSigningInWith) {\n return Promise.reject(\n new Error(\n `a repeated call to SneatAuthStateService.signInWith(${authProviderID}) white previous sign in with ${this.isSigningInWith} is in progress`,\n ),\n );\n }\n\n let userCredential: UserCredential | undefined = undefined;\n\n if (Capacitor.isNativePlatform()) {\n userCredential = await this.signInOnNativeLayer(authProviderID);\n } else {\n userCredential = await this.signInWithWebSDK(authProviderID);\n }\n\n this.isSigningInWith = undefined;\n this.analyticsService.logEvent('signedInWith', {\n provider: authProviderID,\n });\n return Promise.resolve(userCredential);\n } catch (e) {\n this.isSigningInWith = undefined;\n return Promise.reject(e);\n }\n }\n}\n\nexport type AuthProviderID =\n | 'apple.com'\n | 'google.com'\n | 'microsoft.com'\n | 'facebook.com'\n | 'github.com'\n | 'phone';\n\nexport type AuthProviderName =\n | 'Google'\n | 'Apple'\n | 'Microsoft'\n | 'Facebook'\n | 'GitHub';\n\nfunction getAuthProvider(authProviderID: AuthProviderID): AuthProvider {\n switch (authProviderID) {\n case 'google.com':\n return new GoogleAuthProvider();\n case 'apple.com':\n return new OAuthProvider('apple.com');\n //\n // https://developer.apple.com/documentation/sign_in_with_apple/incorporating-sign-in-with-apple-into-other-platforms\n // (authProvider as OAuthProvider).setCustomParameters({\n // \t// \t// Localize the Apple authentication screen in current app locale.\n // \tlocale: 'en', // TODO: set locale\n // });\n case 'microsoft.com':\n return new OAuthProvider('microsoft.com');\n case 'facebook.com': {\n const facebookAuthProvider = new FacebookAuthProvider();\n facebookAuthProvider.addScope('email');\n return facebookAuthProvider;\n }\n case 'github.com': {\n const githubAuthProvider = new GithubAuthProvider();\n githubAuthProvider.addScope('read:user');\n githubAuthProvider.addScope('user:email');\n return githubAuthProvider;\n }\n default:\n throw new Error('unsupported auth provider: ' + authProviderID);\n }\n}\n\nfunction createSneatAuthUserFromFbUser(\n fbUser: User | null,\n): ISneatAuthUser | null {\n return (\n fbUser && {\n isAnonymous: fbUser.isAnonymous,\n emailVerified: fbUser.emailVerified,\n email: fbUser.email,\n uid: fbUser.uid,\n displayName: fbUser.displayName,\n phoneNumber: fbUser.phoneNumber,\n photoURL: fbUser.photoURL,\n providerId:\n fbUser.providerData?.length === 1 && fbUser.providerData[0]\n ? fbUser.providerData[0].providerId\n : fbUser.providerId,\n providerData: fbUser.providerData,\n }\n );\n}\n"]}
@@ -8,6 +8,11 @@ export declare enum AuthStatuses {
8
8
  notAuthenticated = "notAuthenticated"
9
9
  }
10
10
  export type AuthStatus = EnumAsUnionOfKeys<typeof AuthStatuses>;
11
+ /**
12
+ * A user-visible, evidence-based session progress phase. The UI maps these to
13
+ * friendly copy (for example “Checking your sign-in”), never SDK terminology.
14
+ */
15
+ export type SneatAuthLoadingPhase = 'checking-session' | 'getting-token' | 'ready' | 'failed';
11
16
  export interface ISneatAuthUser extends UserInfo {
12
17
  readonly isAnonymous: boolean;
13
18
  readonly emailVerified: boolean;
@@ -15,12 +20,14 @@ export interface ISneatAuthUser extends UserInfo {
15
20
  }
16
21
  export interface ISneatAuthState {
17
22
  readonly status: AuthStatus;
23
+ readonly loadingPhase?: SneatAuthLoadingPhase;
18
24
  readonly token?: string | null;
19
25
  readonly user?: ISneatAuthUser | null;
20
26
  readonly err?: unknown;
21
27
  }
22
28
  export declare const initialSneatAuthState: {
23
29
  status: AuthStatuses;
30
+ loadingPhase: "checking-session";
24
31
  };
25
32
  export declare class SneatAuthStateService {
26
33
  private readonly errorLogger;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sneat/auth-core",
3
- "version": "0.27.2",
3
+ "version": "0.27.3",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },