UNPKG

@first-line/firstline-angular

Version:

Firstline SDK for Angular Single Page Applications (SPA)

105 lines 12.3 kB
import { Injectable, Inject } from '@angular/core'; // do not remove Inject import!! import { of, from, Subject, ReplaySubject, throwError, } from 'rxjs'; import { concatMap, tap, catchError } from 'rxjs/operators'; import { ClientService } from './client'; // do not remove ClientService import!! import * as i0 from "@angular/core"; import * as i1 from "./state"; import * as i2 from "./client"; ; export class AuthService { constructor(client, authState) { this.client = client; this.authState = authState; this.appStateSubject$ = new ReplaySubject(1); // https://stackoverflow.com/a/41177163 this.ngUnsubscribe$ = new Subject(); /** * Emits boolean values indicating the loading state of the SDK. */ this.isLoading$ = this.authState.isLoading$; /** * Emits boolean values indicating the authentication state of the user. If `true`, it means a user has authenticated. * This depends on the value of `isLoading$`, so there is no need to manually check the loading state of the SDK. */ this.isAuthenticated$ = this.authState.isAuthenticated$; /** * Emits details about the authenticated user, or null if not authenticated. */ this.user$ = this.authState.user$; /** * Emits errors that occur during login, or when checking for an active session on startup. */ this.error$ = this.authState.error$; /** * Emits the value (if any) that was passed to the `loginWithRedirect` method call * but only **after** `handleRedirectCallback` is first called */ this.appState$ = this.appStateSubject$.asObservable(); this.client.getAccessToken() .then() .catch(e => undefined) .finally(() => this.authState.setIsLoading(false)); } /** * Called when the service is destroyed */ ngOnDestroy() { // https://stackoverflow.com/a/41177163 this.ngUnsubscribe$.next(); this.ngUnsubscribe$.complete(); } /** * ```js * loginWithRedirect(options); * ``` * * Performs a login via redirect */ loginWithRedirect(options) { return from(this.client.loginRedirect(options)); } /** * ```js * logout(); * ``` * * Clears the application session and signes out the user. */ logout() { return from(this.client.logout()); } /** * ```js * getAccessToken().subscribe(token => ...) * ``` * * If there's a valid token stored, return it. Otherwise, opens an * iframe with the `/authorize` URL using the parameters provided * as arguments. Random and secure `state` and `nonce` parameters * will be auto-generated. If the response is successful, results * will be valid according to their expiration times. * */ getAccessToken() { return of(this.client).pipe(concatMap(client => client.getAccessToken()), tap((access_token) => { if (access_token) return this.authState.setAccessToken(access_token); }), catchError((error) => { this.authState.setError(error); this.authState.refresh(); return throwError(error); })); } } AuthService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: AuthService, deps: [{ token: ClientService }, { token: i1.AuthState }], target: i0.ɵɵFactoryTarget.Injectable }); AuthService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: AuthService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: AuthService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: function () { return [{ type: i2.Client, decorators: [{ type: Inject, args: [ClientService] }] }, { type: i1.AuthState }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFhLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQyxDQUFFLGdDQUFnQztBQUVoRyxPQUFPLEVBQ0wsRUFBRSxFQUNGLElBQUksRUFDSixPQUFPLEVBRVAsYUFBYSxFQUNiLFVBQVUsR0FDWCxNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFDTCxTQUFTLEVBQ1QsR0FBRyxFQUNILFVBQVUsRUFDWCxNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBVSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUMsQ0FBRSx1Q0FBdUM7Ozs7QUFJYixDQUFDO0FBSzlFLE1BQU0sT0FBTyxXQUFXO0lBaUN0QixZQUNpQyxNQUFjLEVBQ3JDLFNBQW9CO1FBREcsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNyQyxjQUFTLEdBQVQsU0FBUyxDQUFXO1FBakN0QixxQkFBZ0IsR0FBRyxJQUFJLGFBQWEsQ0FBWSxDQUFDLENBQUMsQ0FBQztRQUUzRCx1Q0FBdUM7UUFDL0IsbUJBQWMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQzdDOztXQUVHO1FBQ00sZUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDO1FBRWhEOzs7V0FHRztRQUNNLHFCQUFnQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUM7UUFFNUQ7O1dBRUc7UUFDTSxVQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUM7UUFFdEM7O1dBRUc7UUFDTSxXQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7UUFFeEM7OztXQUdHO1FBQ00sY0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQU14RCxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRTthQUN6QixJQUFJLEVBQUU7YUFDTixLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUM7YUFDckIsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsV0FBVztRQUNULHVDQUF1QztRQUN2QyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILGlCQUFpQixDQUNmLE9BQWtDO1FBRWxDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUVILE1BQU07UUFDSixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsY0FBYztRQUNaLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQ3pCLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQyxFQUM1QyxHQUFHLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRTtZQUNuQixJQUFJLFlBQVk7Z0JBQ2QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN2RCxDQUFDLENBQUMsRUFDRixVQUFVLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNuQixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3pCLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDOzt3R0F0R1UsV0FBVyxrQkFrQ1osYUFBYTs0R0FsQ1osV0FBVyxjQUZWLE1BQU07MkZBRVAsV0FBVztrQkFIdkIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQW1DSSxNQUFNOzJCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBPbkRlc3Ryb3ksIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnOyAgLy8gZG8gbm90IHJlbW92ZSBJbmplY3QgaW1wb3J0ISFcclxuaW1wb3J0IHsgTG9naW5SZWRpcmVjdE9wdGlvbnMgYXMgTG9naW5SZWRpcmVjdE9wdGlvbnNTUEEgfSBmcm9tIFwiQGZpcnN0LWxpbmUvZmlyc3RsaW5lLXNwYS1qc1wiO1xyXG5pbXBvcnQge1xyXG4gIG9mLFxyXG4gIGZyb20sXHJcbiAgU3ViamVjdCxcclxuICBPYnNlcnZhYmxlLFxyXG4gIFJlcGxheVN1YmplY3QsXHJcbiAgdGhyb3dFcnJvcixcclxufSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtcclxuICBjb25jYXRNYXAsXHJcbiAgdGFwLFxyXG4gIGNhdGNoRXJyb3JcclxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQgeyBDbGllbnQsIENsaWVudFNlcnZpY2UgfSBmcm9tICcuL2NsaWVudCc7ICAvLyBkbyBub3QgcmVtb3ZlIENsaWVudFNlcnZpY2UgaW1wb3J0ISFcclxuaW1wb3J0IHsgQXBwU3RhdGUgfSBmcm9tICcuL2NvbmZpZyc7XHJcbmltcG9ydCB7IEF1dGhTdGF0ZSB9IGZyb20gJy4vc3RhdGUnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBMb2dpbldpdGhSZWRpcmVjdE9wdGlvbnMgZXh0ZW5kcyBMb2dpblJlZGlyZWN0T3B0aW9uc1NQQSB7IH07XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXV0aFNlcnZpY2U8VEFwcFN0YXRlIGV4dGVuZHMgQXBwU3RhdGUgPSBBcHBTdGF0ZT5cclxuICBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcbiAgcHJpdmF0ZSBhcHBTdGF0ZVN1YmplY3QkID0gbmV3IFJlcGxheVN1YmplY3Q8VEFwcFN0YXRlPigxKTtcclxuXHJcbiAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzQxMTc3MTYzXHJcbiAgcHJpdmF0ZSBuZ1Vuc3Vic2NyaWJlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgLyoqXHJcbiAgICogRW1pdHMgYm9vbGVhbiB2YWx1ZXMgaW5kaWNhdGluZyB0aGUgbG9hZGluZyBzdGF0ZSBvZiB0aGUgU0RLLlxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IGlzTG9hZGluZyQgPSB0aGlzLmF1dGhTdGF0ZS5pc0xvYWRpbmckO1xyXG5cclxuICAvKipcclxuICAgKiBFbWl0cyBib29sZWFuIHZhbHVlcyBpbmRpY2F0aW5nIHRoZSBhdXRoZW50aWNhdGlvbiBzdGF0ZSBvZiB0aGUgdXNlci4gSWYgYHRydWVgLCBpdCBtZWFucyBhIHVzZXIgaGFzIGF1dGhlbnRpY2F0ZWQuXHJcbiAgICogVGhpcyBkZXBlbmRzIG9uIHRoZSB2YWx1ZSBvZiBgaXNMb2FkaW5nJGAsIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gbWFudWFsbHkgY2hlY2sgdGhlIGxvYWRpbmcgc3RhdGUgb2YgdGhlIFNESy5cclxuICAgKi9cclxuICByZWFkb25seSBpc0F1dGhlbnRpY2F0ZWQkID0gdGhpcy5hdXRoU3RhdGUuaXNBdXRoZW50aWNhdGVkJDtcclxuXHJcbiAgLyoqXHJcbiAgICogRW1pdHMgZGV0YWlscyBhYm91dCB0aGUgYXV0aGVudGljYXRlZCB1c2VyLCBvciBudWxsIGlmIG5vdCBhdXRoZW50aWNhdGVkLlxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IHVzZXIkID0gdGhpcy5hdXRoU3RhdGUudXNlciQ7XHJcblxyXG4gIC8qKlxyXG4gICAqIEVtaXRzIGVycm9ycyB0aGF0IG9jY3VyIGR1cmluZyBsb2dpbiwgb3Igd2hlbiBjaGVja2luZyBmb3IgYW4gYWN0aXZlIHNlc3Npb24gb24gc3RhcnR1cC5cclxuICAgKi9cclxuICByZWFkb25seSBlcnJvciQgPSB0aGlzLmF1dGhTdGF0ZS5lcnJvciQ7XHJcblxyXG4gIC8qKlxyXG4gICAqIEVtaXRzIHRoZSB2YWx1ZSAoaWYgYW55KSB0aGF0IHdhcyBwYXNzZWQgdG8gdGhlIGBsb2dpbldpdGhSZWRpcmVjdGAgbWV0aG9kIGNhbGxcclxuICAgKiBidXQgb25seSAqKmFmdGVyKiogYGhhbmRsZVJlZGlyZWN0Q2FsbGJhY2tgIGlzIGZpcnN0IGNhbGxlZFxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IGFwcFN0YXRlJCA9IHRoaXMuYXBwU3RhdGVTdWJqZWN0JC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KENsaWVudFNlcnZpY2UpIHByaXZhdGUgY2xpZW50OiBDbGllbnQsXHJcbiAgICBwcml2YXRlIGF1dGhTdGF0ZTogQXV0aFN0YXRlXHJcbiAgKSB7XHJcbiAgICB0aGlzLmNsaWVudC5nZXRBY2Nlc3NUb2tlbigpXHJcbiAgICAgIC50aGVuKClcclxuICAgICAgLmNhdGNoKGUgPT4gdW5kZWZpbmVkKVxyXG4gICAgICAuZmluYWxseSgoKSA9PiB0aGlzLmF1dGhTdGF0ZS5zZXRJc0xvYWRpbmcoZmFsc2UpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGxlZCB3aGVuIHRoZSBzZXJ2aWNlIGlzIGRlc3Ryb3llZFxyXG4gICAqL1xyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzQxMTc3MTYzXHJcbiAgICB0aGlzLm5nVW5zdWJzY3JpYmUkLm5leHQoKTtcclxuICAgIHRoaXMubmdVbnN1YnNjcmliZSQuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGBgYGpzXHJcbiAgICogbG9naW5XaXRoUmVkaXJlY3Qob3B0aW9ucyk7XHJcbiAgICogYGBgXHJcbiAgICpcclxuICAgKiBQZXJmb3JtcyBhIGxvZ2luIHZpYSByZWRpcmVjdFxyXG4gICAqL1xyXG4gIGxvZ2luV2l0aFJlZGlyZWN0KFxyXG4gICAgb3B0aW9ucz86IExvZ2luV2l0aFJlZGlyZWN0T3B0aW9uc1xyXG4gICk6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gICAgcmV0dXJuIGZyb20odGhpcy5jbGllbnQubG9naW5SZWRpcmVjdChvcHRpb25zKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBgYGBqc1xyXG4gICAqIGxvZ291dCgpO1xyXG4gICAqIGBgYFxyXG4gICAqXHJcbiAgICogQ2xlYXJzIHRoZSBhcHBsaWNhdGlvbiBzZXNzaW9uIGFuZCBzaWduZXMgb3V0IHRoZSB1c2VyLlxyXG4gICAqL1xyXG5cclxuICBsb2dvdXQoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gZnJvbSh0aGlzLmNsaWVudC5sb2dvdXQoKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBgYGBqc1xyXG4gICAqIGdldEFjY2Vzc1Rva2VuKCkuc3Vic2NyaWJlKHRva2VuID0+IC4uLilcclxuICAgKiBgYGBcclxuICAgKlxyXG4gICAqIElmIHRoZXJlJ3MgYSB2YWxpZCB0b2tlbiBzdG9yZWQsIHJldHVybiBpdC4gT3RoZXJ3aXNlLCBvcGVucyBhblxyXG4gICAqIGlmcmFtZSB3aXRoIHRoZSBgL2F1dGhvcml6ZWAgVVJMIHVzaW5nIHRoZSBwYXJhbWV0ZXJzIHByb3ZpZGVkXHJcbiAgICogYXMgYXJndW1lbnRzLiBSYW5kb20gYW5kIHNlY3VyZSBgc3RhdGVgIGFuZCBgbm9uY2VgIHBhcmFtZXRlcnNcclxuICAgKiB3aWxsIGJlIGF1dG8tZ2VuZXJhdGVkLiBJZiB0aGUgcmVzcG9uc2UgaXMgc3VjY2Vzc2Z1bCwgcmVzdWx0c1xyXG4gICAqIHdpbGwgYmUgdmFsaWQgYWNjb3JkaW5nIHRvIHRoZWlyIGV4cGlyYXRpb24gdGltZXMuXHJcbiAgICpcclxuICAgKi9cclxuICBnZXRBY2Nlc3NUb2tlbigpOiBPYnNlcnZhYmxlPHN0cmluZyB8IG51bGw+IHtcclxuICAgIHJldHVybiBvZih0aGlzLmNsaWVudCkucGlwZShcclxuICAgICAgY29uY2F0TWFwKGNsaWVudCA9PiBjbGllbnQuZ2V0QWNjZXNzVG9rZW4oKSksXHJcbiAgICAgIHRhcCgoYWNjZXNzX3Rva2VuKSA9PiB7XHJcbiAgICAgICAgaWYgKGFjY2Vzc190b2tlbilcclxuICAgICAgICAgIHJldHVybiB0aGlzLmF1dGhTdGF0ZS5zZXRBY2Nlc3NUb2tlbihhY2Nlc3NfdG9rZW4pO1xyXG4gICAgICB9KSxcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICB0aGlzLmF1dGhTdGF0ZS5zZXRFcnJvcihlcnJvcik7XHJcbiAgICAgICAgdGhpcy5hdXRoU3RhdGUucmVmcmVzaCgpO1xyXG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGVycm9yKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG59XHJcbiJdfQ==