@sneat/auth-core 0.1.3 → 0.1.6

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.
Files changed (59) hide show
  1. package/esm2022/index.js +8 -0
  2. package/esm2022/index.js.map +1 -0
  3. package/esm2022/lib/login-required-service.service.js +20 -0
  4. package/esm2022/lib/login-required-service.service.js.map +1 -0
  5. package/esm2022/lib/private-token-store.service.js +36 -0
  6. package/esm2022/lib/private-token-store.service.js.map +1 -0
  7. package/esm2022/lib/sneat-auth-guard.js +79 -0
  8. package/esm2022/lib/sneat-auth-guard.js.map +1 -0
  9. package/esm2022/lib/sneat-auth-state-service.js +267 -0
  10. package/esm2022/lib/sneat-auth-state-service.js.map +1 -0
  11. package/{src/lib/sneat-auth.interface.ts → esm2022/lib/sneat-auth.interface.js} +1 -5
  12. package/esm2022/lib/sneat-auth.interface.js.map +1 -0
  13. package/esm2022/lib/telegram-auth.service.js +39 -0
  14. package/esm2022/lib/telegram-auth.service.js.map +1 -0
  15. package/esm2022/lib/user/index.js +3 -0
  16. package/esm2022/lib/user/index.js.map +1 -0
  17. package/esm2022/lib/user/sneat-user.service.js +171 -0
  18. package/esm2022/lib/user/sneat-user.service.js.map +1 -0
  19. package/esm2022/lib/user/user-record.service.js +30 -0
  20. package/esm2022/lib/user/user-record.service.js.map +1 -0
  21. package/esm2022/sneat-auth-core.js +5 -0
  22. package/esm2022/sneat-auth-core.js.map +1 -0
  23. package/lib/login-required-service.service.d.ts +6 -0
  24. package/lib/private-token-store.service.d.ts +8 -0
  25. package/lib/sneat-auth-guard.d.ts +26 -0
  26. package/lib/sneat-auth-state-service.d.ts +51 -0
  27. package/lib/sneat-auth.interface.d.ts +5 -0
  28. package/lib/telegram-auth.service.d.ts +9 -0
  29. package/lib/user/sneat-user.service.d.ts +34 -0
  30. package/lib/user/user-record.service.d.ts +25 -0
  31. package/package.json +14 -2
  32. package/sneat-auth-core.d.ts +5 -0
  33. package/tsconfig.lib.prod.tsbuildinfo +1 -0
  34. package/eslint.config.js +0 -7
  35. package/ng-package.json +0 -7
  36. package/project.json +0 -38
  37. package/src/lib/login-required-service.service.spec.ts +0 -39
  38. package/src/lib/login-required-service.service.ts +0 -14
  39. package/src/lib/private-token-store.service.spec.ts +0 -75
  40. package/src/lib/private-token-store.service.ts +0 -36
  41. package/src/lib/sneat-auth-guard.spec.ts +0 -124
  42. package/src/lib/sneat-auth-guard.ts +0 -107
  43. package/src/lib/sneat-auth-state-service.spec.ts +0 -332
  44. package/src/lib/sneat-auth-state-service.ts +0 -387
  45. package/src/lib/sneat-auth.interface.spec.ts +0 -39
  46. package/src/lib/telegram-auth.service.spec.ts +0 -186
  47. package/src/lib/telegram-auth.service.ts +0 -49
  48. package/src/lib/user/sneat-user.service.spec.ts +0 -151
  49. package/src/lib/user/sneat-user.service.ts +0 -266
  50. package/src/lib/user/user-record.service.spec.ts +0 -145
  51. package/src/lib/user/user-record.service.ts +0 -38
  52. package/src/test-setup.ts +0 -3
  53. package/tsconfig.json +0 -13
  54. package/tsconfig.lib.json +0 -19
  55. package/tsconfig.lib.prod.json +0 -7
  56. package/tsconfig.spec.json +0 -31
  57. package/vite.config.mts +0 -10
  58. /package/{src/index.ts → index.d.ts} +0 -0
  59. /package/{src/lib/user/index.ts → lib/user/index.d.ts} +0 -0
@@ -0,0 +1,8 @@
1
+ export * from './lib/login-required-service.service';
2
+ export * from './lib/private-token-store.service';
3
+ export * from './lib/sneat-auth.interface';
4
+ export * from './lib/sneat-auth-guard';
5
+ export * from './lib/sneat-auth-state-service';
6
+ export * from './lib/telegram-auth.service';
7
+ export * from './lib/user';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../libs/auth/core/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,sCAAsC,CAAC;AACrD,cAAc,mCAAmC,CAAC;AAClD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,YAAY,CAAC","sourcesContent":["export * from './lib/login-required-service.service';\nexport * from './lib/private-token-store.service';\nexport * from './lib/sneat-auth.interface';\nexport * from './lib/sneat-auth-guard';\nexport * from './lib/sneat-auth-state-service';\nexport * from './lib/telegram-auth.service';\nexport * from './lib/user';\n"]}
@@ -0,0 +1,20 @@
1
+ import { Injectable, inject } from '@angular/core';
2
+ import { SneatAuthStateService } from './sneat-auth-state-service';
3
+ import * as i0 from "@angular/core";
4
+ export class LoginRequiredServiceService {
5
+ constructor() {
6
+ const authState = inject(SneatAuthStateService);
7
+ authState.authState.subscribe(() => {
8
+ // Intentionally empty - just subscribing to trigger the observable
9
+ });
10
+ }
11
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: LoginRequiredServiceService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
12
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: LoginRequiredServiceService, providedIn: 'root' }); }
13
+ }
14
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: LoginRequiredServiceService, decorators: [{
15
+ type: Injectable,
16
+ args: [{
17
+ providedIn: 'root',
18
+ }]
19
+ }], ctorParameters: () => [] });
20
+ //# sourceMappingURL=login-required-service.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login-required-service.service.js","sourceRoot":"","sources":["../../../../../../libs/auth/core/src/lib/login-required-service.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;;AAKnE,MAAM,OAAO,2BAA2B;IACtC;QACE,MAAM,SAAS,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC;QAChD,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE;YACjC,mEAAmE;QACrE,CAAC,CAAC,CAAC;IACL,CAAC;8GANU,2BAA2B;kHAA3B,2BAA2B,cAF1B,MAAM;;2FAEP,2BAA2B;kBAHvC,UAAU;mBAAC;oBACV,UAAU,EAAE,MAAM;iBACnB","sourcesContent":["import { Injectable, inject } from '@angular/core';\nimport { SneatAuthStateService } from './sneat-auth-state-service';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class LoginRequiredServiceService {\n constructor() {\n const authState = inject(SneatAuthStateService);\n authState.authState.subscribe(() => {\n // Intentionally empty - just subscribing to trigger the observable\n });\n }\n}\n"]}
@@ -0,0 +1,36 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { of, Subject } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ const tokenKey = (domain, projectId) => `private/tokens/${domain}/${projectId}`;
5
+ export const canceledByUser = 'canceled by user';
6
+ export class PrivateTokenStoreService {
7
+ getPrivateToken(domain, projectId) {
8
+ // Consider storing all tokens in a single item
9
+ const key = tokenKey(domain, projectId);
10
+ let token = localStorage.getItem(key);
11
+ if (token) {
12
+ return of(token);
13
+ }
14
+ const subj = new Subject();
15
+ setTimeout(() => {
16
+ token = prompt(`Please provide access token for ${domain}:`);
17
+ if (token) {
18
+ localStorage.setItem(key, token);
19
+ subj.next(token);
20
+ }
21
+ else {
22
+ subj.error(canceledByUser);
23
+ }
24
+ }, 1);
25
+ return subj.asObservable();
26
+ }
27
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: PrivateTokenStoreService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
28
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: PrivateTokenStoreService, providedIn: 'root' }); }
29
+ }
30
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: PrivateTokenStoreService, decorators: [{
31
+ type: Injectable,
32
+ args: [{
33
+ providedIn: 'root',
34
+ }]
35
+ }] });
36
+ //# sourceMappingURL=private-token-store.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"private-token-store.service.js","sourceRoot":"","sources":["../../../../../../libs/auth/core/src/lib/private-token-store.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAc,EAAE,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;;AAE/C,MAAM,QAAQ,GAAG,CAAC,MAAc,EAAE,SAAiB,EAAE,EAAE,CACrD,kBAAkB,MAAM,IAAI,SAAS,EAAE,CAAC;AAE1C,MAAM,CAAC,MAAM,cAAc,GAAG,kBAAkB,CAAC;AAKjD,MAAM,OAAO,wBAAwB;IAC5B,eAAe,CACpB,MAAc,EACd,SAAiB;QAEjB,+CAA+C;QAC/C,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACxC,IAAI,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,OAAO,EAAU,CAAC;QACnC,UAAU,CAAC,GAAG,EAAE;YACd,KAAK,GAAG,MAAM,CAAC,mCAAmC,MAAM,GAAG,CAAC,CAAC;YAC7D,IAAI,KAAK,EAAE,CAAC;gBACV,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBACjC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC,EAAE,CAAC,CAAC,CAAC;QACN,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;IAC7B,CAAC;8GAvBU,wBAAwB;kHAAxB,wBAAwB,cAFvB,MAAM;;2FAEP,wBAAwB;kBAHpC,UAAU;mBAAC;oBACV,UAAU,EAAE,MAAM;iBACnB","sourcesContent":["import { Injectable } from '@angular/core';\nimport { Observable, of, Subject } from 'rxjs';\n\nconst tokenKey = (domain: string, projectId: string) =>\n `private/tokens/${domain}/${projectId}`;\n\nexport const canceledByUser = 'canceled by user';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class PrivateTokenStoreService {\n public getPrivateToken(\n domain: string,\n projectId: string,\n ): Observable<string> {\n // Consider storing all tokens in a single item\n const key = tokenKey(domain, projectId);\n let token = localStorage.getItem(key);\n if (token) {\n return of(token);\n }\n\n const subj = new Subject<string>();\n setTimeout(() => {\n token = prompt(`Please provide access token for ${domain}:`);\n if (token) {\n localStorage.setItem(key, token);\n subj.next(token);\n } else {\n subj.error(canceledByUser);\n }\n }, 1);\n return subj.asObservable();\n }\n}\n"]}
@@ -0,0 +1,79 @@
1
+ import { Router, } from '@angular/router';
2
+ import { Injectable, inject } from '@angular/core';
3
+ import { Auth } from '@angular/fire/auth';
4
+ import { map } from 'rxjs/operators';
5
+ import * as i0 from "@angular/core";
6
+ export const redirectToLoginIfNotSignedIn = map((user) => {
7
+ if (user) {
8
+ return true;
9
+ }
10
+ let url = '/login';
11
+ if (location.pathname != '/') {
12
+ url += '#' + location.pathname;
13
+ }
14
+ return url;
15
+ });
16
+ export class SneatAuthGuard /*implements CanLoad, CanActivate, CanActivateChild*/ {
17
+ constructor() {
18
+ this.router = inject(Router);
19
+ this.auth = inject(Auth);
20
+ }
21
+ canLoad(_route, _segments) {
22
+ {
23
+ // console.log('SneatAuthGuard.canLoad', route, segments);
24
+ // const authPipeFactory =
25
+ // (route.data && route.data['authCanLoadGuardPipe'] as AuthCanLoadPipeGenerator) ||
26
+ // (() => redirectToLoginIfNotSignedIn);
27
+ // const subj = new Subject<boolean>();
28
+ // onAuthStateChanged(this.auth, {
29
+ // next: (user) => {
30
+ // console.log('onAuthStateChanged', user);
31
+ // }
32
+ // })
33
+ // return this.auth.user.pipe(
34
+ // map((user) => {
35
+ // console.log('user', user);
36
+ // return user;
37
+ // }),
38
+ // take(1),
39
+ // authPipeFactory(route, segments),
40
+ // map((can) => {
41
+ // console.log('can', can);
42
+ // if (typeof can === 'boolean') {
43
+ // return can;
44
+ // } else if (Array.isArray(can)) {
45
+ // return this.router.createUrlTree(can);
46
+ // } else {
47
+ // return this.router.parseUrl(can);
48
+ // }
49
+ // }),
50
+ // );
51
+ return true;
52
+ }
53
+ }
54
+ canActivate(_route, _state) {
55
+ // console.log('SneatAuthGuard.canActivate', route, state);
56
+ return true;
57
+ }
58
+ canActivateChild(_childRoute, _state) {
59
+ // console.log('SneatAuthGuard.canActivateChild', childRoute, state);
60
+ return true;
61
+ }
62
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SneatAuthGuard /*implements CanLoad, CanActivate, CanActivateChild*/, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
63
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SneatAuthGuard /*implements CanLoad, CanActivate, CanActivateChild*/, providedIn: 'root' }); }
64
+ }
65
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SneatAuthGuard /*implements CanLoad, CanActivate, CanActivateChild*/, decorators: [{
66
+ type: Injectable,
67
+ args: [{
68
+ providedIn: 'root',
69
+ }]
70
+ }] });
71
+ export const canLoad = (pipe) => ({
72
+ canLoad: [SneatAuthGuard],
73
+ data: { authCanLoadGuardPipe: pipe },
74
+ });
75
+ export const SNEAT_AUTH_GUARDS = {
76
+ canActivate: [SneatAuthGuard],
77
+ canLoad: [SneatAuthGuard],
78
+ };
79
+ //# sourceMappingURL=sneat-auth-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sneat-auth-guard.js","sourceRoot":"","sources":["../../../../../../libs/auth/core/src/lib/sneat-auth-guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,MAAM,GAIP,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;;AAQrC,MAAM,CAAC,MAAM,4BAA4B,GAAa,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;IACjE,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,GAAG,GAAG,QAAQ,CAAC;IACnB,IAAI,QAAQ,CAAC,QAAQ,IAAI,GAAG,EAAE,CAAC;QAC7B,GAAG,IAAI,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC;IACjC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC,CAAC;AAKH,MAAM,OAAO,cAAc,CAAC,qDAAqD;IAHjF;QAImB,WAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QACxB,SAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;KA0DtC;IAxDQ,OAAO,CACZ,MAAa,EACb,SAAuB;QAMvB,CAAC;YACC,0DAA0D;YAC1D,0BAA0B;YAC1B,qFAAqF;YACrF,yCAAyC;YACzC,uCAAuC;YACvC,kCAAkC;YAClC,qBAAqB;YACrB,6CAA6C;YAC7C,KAAK;YACL,KAAK;YACL,8BAA8B;YAC9B,mBAAmB;YACnB,+BAA+B;YAC/B,iBAAiB;YACjB,OAAO;YACP,YAAY;YACZ,qCAAqC;YACrC,kBAAkB;YAClB,6BAA6B;YAC7B,oCAAoC;YACpC,iBAAiB;YACjB,qCAAqC;YACrC,4CAA4C;YAC5C,aAAa;YACb,uCAAuC;YACvC,MAAM;YACN,OAAO;YACP,KAAK;YACL,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEM,WAAW,CAChB,MAA8B,EAC9B,MAA2B;QAE3B,2DAA2D;QAC3D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gBAAgB,CACd,WAAmC,EACnC,MAA2B;QAE3B,qEAAqE;QACrE,OAAO,IAAI,CAAC;IACd,CAAC;8GA3DU,cAAc,CAAC,qDAAqD;kHAApE,cAAc,CAAC,qDAAqD,cAFnE,MAAM;;2FAEP,cAAc,CAAC,qDAAqD;kBAHhF,UAAU;mBAAC;oBACV,UAAU,EAAE,MAAM;iBACnB;;AA+DD,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAA+B,EAAE,EAAE,CAAC,CAAC;IAC3D,OAAO,EAAE,CAAC,cAAc,CAAC;IACzB,IAAI,EAAE,EAAE,oBAAoB,EAAE,IAAI,EAAE;CACrC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,WAAW,EAAE,CAAC,cAAc,CAAC;IAC7B,OAAO,EAAE,CAAC,cAAc,CAAC;CAC1B,CAAC","sourcesContent":["import {\n ActivatedRouteSnapshot,\n // CanActivate,\n // CanActivateChild,\n // CanLoad,\n Route,\n Router,\n RouterStateSnapshot,\n UrlSegment,\n UrlTree,\n} from '@angular/router';\nimport { Observable } from 'rxjs';\nimport { Injectable, inject } from '@angular/core';\nimport { Auth } from '@angular/fire/auth';\nimport { map } from 'rxjs/operators';\nimport { AuthPipe } from '@angular/fire/auth-guard';\n\ntype AuthCanLoadPipeGenerator = (\n route: Route,\n segments: UrlSegment[],\n) => AuthPipe;\n\nexport const redirectToLoginIfNotSignedIn: AuthPipe = map((user) => {\n if (user) {\n return true;\n }\n let url = '/login';\n if (location.pathname != '/') {\n url += '#' + location.pathname;\n }\n return url;\n});\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SneatAuthGuard /*implements CanLoad, CanActivate, CanActivateChild*/ {\n private readonly router = inject(Router);\n private readonly auth = inject(Auth);\n\n public canLoad(\n _route: Route,\n _segments: UrlSegment[],\n ):\n | Observable<boolean | UrlTree>\n | Promise<boolean | UrlTree>\n | boolean\n | UrlTree {\n {\n // console.log('SneatAuthGuard.canLoad', route, segments);\n // const authPipeFactory =\n // \t(route.data && route.data['authCanLoadGuardPipe'] as AuthCanLoadPipeGenerator) ||\n // \t(() => redirectToLoginIfNotSignedIn);\n // const subj = new Subject<boolean>();\n // onAuthStateChanged(this.auth, {\n // \tnext: (user) => {\n // \t\tconsole.log('onAuthStateChanged', user);\n // \t}\n // })\n // return this.auth.user.pipe(\n // \tmap((user) => {\n // \t\tconsole.log('user', user);\n // \t\treturn user;\n // \t}),\n // \ttake(1),\n // \tauthPipeFactory(route, segments),\n // \tmap((can) => {\n // \t\tconsole.log('can', can);\n // \t\tif (typeof can === 'boolean') {\n // \t\t\treturn can;\n // \t\t} else if (Array.isArray(can)) {\n // \t\t\treturn this.router.createUrlTree(can);\n // \t\t} else {\n // \t\t\treturn this.router.parseUrl(can);\n // \t\t}\n // \t}),\n // );\n return true;\n }\n }\n\n public canActivate(\n _route: ActivatedRouteSnapshot,\n _state: RouterStateSnapshot, //: Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree\n ) {\n // console.log('SneatAuthGuard.canActivate', route, state);\n return true;\n }\n\n canActivateChild(\n _childRoute: ActivatedRouteSnapshot,\n _state: RouterStateSnapshot, // : Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree\n ) {\n // console.log('SneatAuthGuard.canActivateChild', childRoute, state);\n return true;\n }\n}\n\nexport const canLoad = (pipe?: AuthCanLoadPipeGenerator) => ({\n canLoad: [SneatAuthGuard],\n data: { authCanLoadGuardPipe: pipe },\n});\n\nexport const SNEAT_AUTH_GUARDS = {\n canActivate: [SneatAuthGuard],\n canLoad: [SneatAuthGuard],\n};\n"]}
@@ -0,0 +1,267 @@
1
+ import { Capacitor } from '@capacitor/core';
2
+ import { FirebaseAuthentication, } from '@capacitor-firebase/authentication';
3
+ import { AnalyticsService, } from '@sneat/core';
4
+ import { BehaviorSubject, from } from 'rxjs';
5
+ import { Injectable, inject } from '@angular/core';
6
+ import { ErrorLogger } from '@sneat/core';
7
+ import { distinctUntilChanged, shareReplay } from 'rxjs/operators';
8
+ import { Auth, getAuth, signInWithCredential, } from '@angular/fire/auth';
9
+ import { GoogleAuthProvider, OAuthProvider, GithubAuthProvider, FacebookAuthProvider, signInWithEmailLink, signInWithCustomToken, signInWithPopup, linkWithPopup, unlink, } from 'firebase/auth';
10
+ // TODO: fix & remove this eslint hint @nrwl/nx/enforce-module-boundaries
11
+ import { newRandomId } from '@sneat/random';
12
+ import * as i0 from "@angular/core";
13
+ export var AuthStatuses;
14
+ (function (AuthStatuses) {
15
+ AuthStatuses["authenticating"] = "authenticating";
16
+ AuthStatuses["authenticated"] = "authenticated";
17
+ AuthStatuses["notAuthenticated"] = "notAuthenticated";
18
+ })(AuthStatuses || (AuthStatuses = {}));
19
+ const initialAuthStatus = AuthStatuses.authenticating;
20
+ export const initialSneatAuthState = { status: initialAuthStatus };
21
+ export class SneatAuthStateService {
22
+ // private readonly fbAuth: Auth;
23
+ constructor() {
24
+ this.errorLogger = inject(ErrorLogger);
25
+ this.analyticsService = inject(AnalyticsService);
26
+ this.fbAuth = inject(Auth);
27
+ this.id = newRandomId({ len: 5 });
28
+ this.authStatus$ = new BehaviorSubject(initialAuthStatus);
29
+ this.authStatus = this.authStatus$
30
+ .asObservable()
31
+ .pipe(distinctUntilChanged());
32
+ this.authUser$ = new BehaviorSubject(undefined);
33
+ this.authUser = this.authUser$.asObservable();
34
+ this.authState$ = new BehaviorSubject(initialSneatAuthState);
35
+ this.authState = this.authState$.asObservable().pipe(
36
+ // tap(v => console.log('SneatAuthStateService => SneatAuthState:', v)),
37
+ shareReplay(1));
38
+ const errorLogger = this.errorLogger;
39
+ this.fbAuth.onIdTokenChanged({
40
+ next: (firebaseUser) => {
41
+ const status = firebaseUser
42
+ ? AuthStatuses.authenticated
43
+ : AuthStatuses.notAuthenticated;
44
+ if (firebaseUser &&
45
+ this.authState$.value?.user?.uid !== firebaseUser?.uid) {
46
+ this.analyticsService.identify(firebaseUser.uid);
47
+ }
48
+ firebaseUser
49
+ ?.getIdToken()
50
+ .then((token) => {
51
+ const current = this.authState$.value || {};
52
+ this.authState$.next({
53
+ ...current,
54
+ status,
55
+ token,
56
+ user: this.authUser$.value,
57
+ });
58
+ this.authStatus$.next(status); // Should be after authState$
59
+ })
60
+ .catch((err) => {
61
+ const current = this.authState$.value || {};
62
+ this.authState$.next({
63
+ ...current,
64
+ err: `fbUser.getIdToken() failed: ${err}`,
65
+ });
66
+ this.errorLogger.logError(err, 'Failed in fbUser.getIdToken()');
67
+ });
68
+ },
69
+ error: (err) => {
70
+ const current = this.authState$.value || {};
71
+ this.authState$.next({
72
+ ...current,
73
+ err: `fbAuth.onIdTokenChanged() failed: ${err}`,
74
+ });
75
+ errorLogger.logError(err, 'failed in fbAuth.onIdTokenChanged');
76
+ },
77
+ complete: () => void 0,
78
+ });
79
+ this.fbAuth.onAuthStateChanged({
80
+ complete: () => void 0,
81
+ next: (fbUser) => {
82
+ // console.log(
83
+ // `SneatAuthStateService => authStatus: ${this.authStatus$.value}; fbUser`,
84
+ // fbUser,
85
+ // );
86
+ const authUser = createSneatAuthUserFromFbUser(fbUser);
87
+ const status = authUser
88
+ ? AuthStatuses.authenticated
89
+ : AuthStatuses.notAuthenticated;
90
+ this.authStatus$.next(status);
91
+ this.authUser$.next(authUser);
92
+ this.authState$.next({
93
+ ...this.authState$.value,
94
+ user: authUser,
95
+ status,
96
+ });
97
+ },
98
+ error: (err) => {
99
+ this.errorLogger.logError(err, 'failed to retrieve Firebase auth user information');
100
+ const current = this.authState$.value || {};
101
+ this.authState$.next({
102
+ ...current,
103
+ err: `fbAuth.onAuthStateChanged() failed: ${err}`,
104
+ });
105
+ },
106
+ });
107
+ }
108
+ signOut() {
109
+ return this.fbAuth.signOut();
110
+ }
111
+ signInWithToken(token) {
112
+ return signInWithCustomToken(this.fbAuth, token);
113
+ }
114
+ signInWithEmailLink(email) {
115
+ return from(signInWithEmailLink(this.fbAuth, email));
116
+ }
117
+ async signInOnNativeLayer(authProviderID) {
118
+ let signInResult;
119
+ const o = { skipNativeAuth: true };
120
+ switch (authProviderID) {
121
+ case 'google.com':
122
+ signInResult = await FirebaseAuthentication.signInWithGoogle(o);
123
+ break;
124
+ case 'apple.com':
125
+ signInResult = await FirebaseAuthentication.signInWithApple(o);
126
+ break;
127
+ case 'facebook.com':
128
+ signInResult = await FirebaseAuthentication.signInWithFacebook(o);
129
+ break;
130
+ case 'microsoft.com':
131
+ signInResult = await FirebaseAuthentication.signInWithMicrosoft(o);
132
+ break;
133
+ default:
134
+ return Promise.reject('unsupported auth provider: ' + authProviderID);
135
+ }
136
+ // console.log(
137
+ // `SneatAuthStateService.signInWith(${authProviderID}) => signed in on native layer, authenticating in webview...`,
138
+ // signInResult,
139
+ // );
140
+ // we need to authenticate on webview layer using the id token and nonce from signInResult
141
+ const userCredential = await this.authenticateOnWebviewLayer(authProviderID, signInResult);
142
+ return Promise.resolve(userCredential);
143
+ }
144
+ async authenticateOnWebviewLayer(authProviderID, signInResult) {
145
+ const oauthProvider = new OAuthProvider(authProviderID);
146
+ const credential = oauthProvider.credential({
147
+ idToken: signInResult.credential?.idToken,
148
+ accessToken: signInResult.credential?.accessToken,
149
+ rawNonce: signInResult.credential?.nonce,
150
+ });
151
+ const auth = getAuth();
152
+ const userCredential = await signInWithCredential(auth, credential);
153
+ // Get a valid Firebase ID token that has a 'kid' header
154
+ const _firebaseIdToken = await userCredential.user.getIdToken();
155
+ return Promise.resolve(userCredential);
156
+ }
157
+ async signInWithWebSDK(authProviderID) {
158
+ const authProvider = getAuthProvider(authProviderID);
159
+ const userCredential = await signInWithPopup(this.fbAuth, authProvider);
160
+ return Promise.resolve(userCredential);
161
+ }
162
+ async linkWith(authProviderID) {
163
+ const authProvider = getAuthProvider(authProviderID);
164
+ if (!this.fbAuth.currentUser) {
165
+ return Promise.reject('no current user');
166
+ }
167
+ const userCredential = await linkWithPopup(this.fbAuth.currentUser, authProvider);
168
+ return Promise.resolve(userCredential);
169
+ }
170
+ async unlinkAuthProvider(authProviderID) {
171
+ const currentUser = this.fbAuth.currentUser;
172
+ if (currentUser) {
173
+ try {
174
+ const updatedUser = await unlink(currentUser, authProviderID);
175
+ const authUser = createSneatAuthUserFromFbUser(updatedUser);
176
+ this.authUser$.next(authUser);
177
+ return Promise.resolve();
178
+ }
179
+ catch (error) {
180
+ return Promise.reject(`Failed to unlink ${authProviderID} account:` + error);
181
+ }
182
+ }
183
+ else {
184
+ return Promise.reject('No user is currently signed in.');
185
+ }
186
+ }
187
+ async signInWith(authProviderID) {
188
+ // console.log(
189
+ // `SneatAuthStateService.signInWith(${authProviderID}), isSigningInWith=${this.isSigningInWith}, location.protocol=${location.protocol}`,
190
+ // );
191
+ this.analyticsService.logEvent('signingInWith', {
192
+ provider: authProviderID,
193
+ });
194
+ try {
195
+ if (this.isSigningInWith) {
196
+ return Promise.reject(new Error(`a repeated call to SneatAuthStateService.signInWith(${authProviderID}) white previous sign in with ${this.isSigningInWith} is in progress`));
197
+ }
198
+ let userCredential = undefined;
199
+ if (Capacitor.isNativePlatform()) {
200
+ userCredential = await this.signInOnNativeLayer(authProviderID);
201
+ }
202
+ else {
203
+ userCredential = await this.signInWithWebSDK(authProviderID);
204
+ }
205
+ this.isSigningInWith = undefined;
206
+ this.analyticsService.logEvent('signedInWith', {
207
+ provider: authProviderID,
208
+ });
209
+ return Promise.resolve(userCredential);
210
+ }
211
+ catch (e) {
212
+ this.isSigningInWith = undefined;
213
+ return Promise.reject(e);
214
+ }
215
+ }
216
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SneatAuthStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
217
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SneatAuthStateService, providedIn: 'root' }); }
218
+ }
219
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SneatAuthStateService, decorators: [{
220
+ type: Injectable,
221
+ args: [{ providedIn: 'root' }]
222
+ }], ctorParameters: () => [] });
223
+ function getAuthProvider(authProviderID) {
224
+ switch (authProviderID) {
225
+ case 'google.com':
226
+ return new GoogleAuthProvider();
227
+ case 'apple.com':
228
+ return new OAuthProvider('apple.com');
229
+ //
230
+ // https://developer.apple.com/documentation/sign_in_with_apple/incorporating-sign-in-with-apple-into-other-platforms
231
+ // (authProvider as OAuthProvider).setCustomParameters({
232
+ // // // Localize the Apple authentication screen in current app locale.
233
+ // locale: 'en', // TODO: set locale
234
+ // });
235
+ case 'microsoft.com':
236
+ return new OAuthProvider('microsoft.com');
237
+ case 'facebook.com': {
238
+ const facebookAuthProvider = new FacebookAuthProvider();
239
+ facebookAuthProvider.addScope('email');
240
+ return facebookAuthProvider;
241
+ }
242
+ case 'github.com': {
243
+ const githubAuthProvider = new GithubAuthProvider();
244
+ githubAuthProvider.addScope('read:user');
245
+ githubAuthProvider.addScope('user:email');
246
+ return githubAuthProvider;
247
+ }
248
+ default:
249
+ throw new Error('unsupported auth provider: ' + authProviderID);
250
+ }
251
+ }
252
+ function createSneatAuthUserFromFbUser(fbUser) {
253
+ return (fbUser && {
254
+ isAnonymous: fbUser.isAnonymous,
255
+ emailVerified: fbUser.emailVerified,
256
+ email: fbUser.email,
257
+ uid: fbUser.uid,
258
+ displayName: fbUser.displayName,
259
+ phoneNumber: fbUser.phoneNumber,
260
+ photoURL: fbUser.photoURL,
261
+ providerId: fbUser.providerData?.length === 1 && fbUser.providerData[0]
262
+ ? fbUser.providerData[0].providerId
263
+ : fbUser.providerId,
264
+ providerData: fbUser.providerData,
265
+ });
266
+ }
267
+ //# sourceMappingURL=sneat-auth-state-service.js.map
@@ -0,0 +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 IAnalyticsService,\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 Auth,\n AuthProvider,\n getAuth,\n signInWithCredential,\n User,\n UserCredential,\n UserInfo,\n} from '@angular/fire/auth';\n\nimport {\n GoogleAuthProvider,\n OAuthProvider,\n GithubAuthProvider,\n FacebookAuthProvider,\n signInWithEmailLink,\n signInWithCustomToken,\n signInWithPopup,\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(Auth);\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 readonly fbAuth: Auth;\n\n constructor() {\n const errorLogger = this.errorLogger;\n this.fbAuth.onIdTokenChanged({\n next: (firebaseUser) => {\n const status: AuthStatus = firebaseUser\n ? AuthStatuses.authenticated\n : AuthStatuses.notAuthenticated;\n if (\n firebaseUser &&\n this.authState$.value?.user?.uid !== firebaseUser?.uid\n ) {\n this.analyticsService.identify(firebaseUser.uid);\n }\n firebaseUser\n ?.getIdToken()\n .then((token) => {\n const current = this.authState$.value || {};\n this.authState$.next({\n ...current,\n status,\n token,\n user: this.authUser$.value,\n });\n this.authStatus$.next(status); // Should be after authState$\n })\n .catch((err) => {\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\n const authUser = createSneatAuthUserFromFbUser(fbUser);\n\n const status = authUser\n ? AuthStatuses.authenticated\n : AuthStatuses.notAuthenticated;\n this.authStatus$.next(status);\n this.authUser$.next(authUser);\n this.authState$.next({\n ...this.authState$.value,\n user: authUser,\n status,\n });\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 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> {\n const authProvider = getAuthProvider(authProviderID);\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,7 +1,3 @@
1
1
  import { InjectionToken } from '@angular/core';
2
-
3
- export interface ILoginEventsHandler {
4
- onLoggedIn(): void;
5
- }
6
-
7
2
  export const LoginEventsHandler = new InjectionToken('ILoginEventsHandler');
3
+ //# sourceMappingURL=sneat-auth.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sneat-auth.interface.js","sourceRoot":"","sources":["../../../../../../libs/auth/core/src/lib/sneat-auth.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAM/C,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,cAAc,CAAC,qBAAqB,CAAC,CAAC","sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport interface ILoginEventsHandler {\n onLoggedIn(): void;\n}\n\nexport const LoginEventsHandler = new InjectionToken('ILoginEventsHandler');\n"]}
@@ -0,0 +1,39 @@
1
+ import { Injectable, inject } from '@angular/core';
2
+ import { SneatApiService } from '@sneat/api';
3
+ import { SneatAuthStateService } from './sneat-auth-state-service';
4
+ import { ErrorLogger } from '@sneat/core';
5
+ import * as i0 from "@angular/core";
6
+ export class TelegramAuthService {
7
+ constructor() {
8
+ this.errorLogger = inject(ErrorLogger);
9
+ this.authStateService = inject(SneatAuthStateService);
10
+ this.sneatApiService = inject(SneatApiService);
11
+ }
12
+ authenticateIfTelegramWebApp() {
13
+ const telegramWebApp = window.Telegram?.WebApp;
14
+ if (telegramWebApp?.initData) {
15
+ this.sneatApiService
16
+ .postAsAnonymous('auth/login-from-telegram-miniapp', telegramWebApp?.initData)
17
+ .subscribe({
18
+ next: (response) => {
19
+ this.authStateService
20
+ .signInWithToken(response.token)
21
+ .then(() => {
22
+ telegramWebApp.ready();
23
+ })
24
+ .catch(this.errorLogger.logErrorHandler('Failed to sign-in to Firebase auth with a token issued for telegram web-app credentials'));
25
+ },
26
+ error: this.errorLogger.logErrorHandler('Failed to get Firebase auth token issued using telegram web-app credentials'),
27
+ });
28
+ }
29
+ }
30
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: TelegramAuthService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
31
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: TelegramAuthService, providedIn: 'root' }); }
32
+ }
33
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: TelegramAuthService, decorators: [{
34
+ type: Injectable,
35
+ args: [{
36
+ providedIn: 'root',
37
+ }]
38
+ }] });
39
+ //# sourceMappingURL=telegram-auth.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram-auth.service.js","sourceRoot":"","sources":["../../../../../../libs/auth/core/src/lib/telegram-auth.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,WAAW,EAAgB,MAAM,aAAa,CAAC;;AAKxD,MAAM,OAAO,mBAAmB;IAHhC;QAImB,gBAAW,GAAG,MAAM,CAAe,WAAW,CAAC,CAAC;QAChD,qBAAgB,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC;QACjD,oBAAe,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;KAqC5D;IAnCQ,4BAA4B;QACjC,MAAM,cAAc,GAClB,MAQD,CAAC,QAAQ,EAAE,MAAM,CAAC;QACnB,IAAI,cAAc,EAAE,QAAQ,EAAE,CAAC;YAC7B,IAAI,CAAC,eAAe;iBACjB,eAAe,CAEb,kCAAkC,EAAE,cAAc,EAAE,QAAQ,CAAC;iBAC/D,SAAS,CAAC;gBACT,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE;oBACjB,IAAI,CAAC,gBAAgB;yBAClB,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC;yBAC/B,IAAI,CAAC,GAAG,EAAE;wBACT,cAAc,CAAC,KAAK,EAAE,CAAC;oBACzB,CAAC,CAAC;yBACD,KAAK,CACJ,IAAI,CAAC,WAAW,CAAC,eAAe,CAC9B,yFAAyF,CAC1F,CACF,CAAC;gBACN,CAAC;gBACD,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,eAAe,CACrC,6EAA6E,CAC9E;aACF,CAAC,CAAC;QACP,CAAC;IACH,CAAC;8GAvCU,mBAAmB;kHAAnB,mBAAmB,cAFlB,MAAM;;2FAEP,mBAAmB;kBAH/B,UAAU;mBAAC;oBACV,UAAU,EAAE,MAAM;iBACnB","sourcesContent":["import { Injectable, inject } from '@angular/core';\nimport { SneatApiService } from '@sneat/api';\nimport { SneatAuthStateService } from './sneat-auth-state-service';\nimport { ErrorLogger, IErrorLogger } from '@sneat/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class TelegramAuthService {\n private readonly errorLogger = inject<IErrorLogger>(ErrorLogger);\n private readonly authStateService = inject(SneatAuthStateService);\n private readonly sneatApiService = inject(SneatApiService);\n\n public authenticateIfTelegramWebApp() {\n const telegramWebApp = (\n window as unknown as {\n Telegram?: {\n WebApp?: {\n initData: unknown;\n ready: () => void;\n };\n };\n }\n ).Telegram?.WebApp;\n if (telegramWebApp?.initData) {\n this.sneatApiService\n .postAsAnonymous<{\n token: string;\n }>('auth/login-from-telegram-miniapp', telegramWebApp?.initData)\n .subscribe({\n next: (response) => {\n this.authStateService\n .signInWithToken(response.token)\n .then(() => {\n telegramWebApp.ready();\n })\n .catch(\n this.errorLogger.logErrorHandler(\n 'Failed to sign-in to Firebase auth with a token issued for telegram web-app credentials',\n ),\n );\n },\n error: this.errorLogger.logErrorHandler(\n 'Failed to get Firebase auth token issued using telegram web-app credentials',\n ),\n });\n }\n }\n}\n"]}
@@ -0,0 +1,3 @@
1
+ export * from './user-record.service';
2
+ export * from './sneat-user.service';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../libs/auth/core/src/lib/user/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC","sourcesContent":["export * from './user-record.service';\nexport * from './sneat-user.service';\n"]}