UNPKG

kinde-angular

Version:

Angular wrapper for the Kinde TypeScript SDK

109 lines 18.8 kB
import { Inject, Injectable } from '@angular/core'; import { defer, filter, from, iif, map, of, Subject, switchMap, takeUntil, tap } from "rxjs"; import { KINDE_FACTORY_TOKEN } from "./kinde-client-factory.service"; import { sessionManager } from "./session-manager"; import { DOCUMENT } from "@angular/common"; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "./auth-state.service"; export class KindeAngularService { constructor(kindeClient, document, location, authState) { this.kindeClient = kindeClient; this.document = document; this.location = location; this.authState = authState; this.unsubscribe$ = new Subject(); this.user$ = this.authState.user$; this.isAuthenticated$ = this.authState.isAuthenticated$; this.isLoading$ = this.authState.isLoading$; this.accessToken$ = this.authState.accessToken$; this.shouldHandleCallback() .pipe(filter(_ => this.kindeClient !== null), switchMap(shouldHandleCallback => iif(() => shouldHandleCallback, defer(() => this.handleCallback()), of(false))), tap(() => authState.setIsLoading(false)), takeUntil(this.unsubscribe$)).subscribe(); } ngOnDestroy() { this.unsubscribe$.next(); this.unsubscribe$.complete(); } getClaim(claim, type) { // todo: make reusable function to handle isAuthenticated return this.isAuthenticated$.pipe(filter(_ => this.kindeClient !== null), switchMap(isAuthenticated => iif(() => isAuthenticated, from(this.kindeClient.getClaim(claim, type)), of(null)))); } ; getUserOrganizations() { // todo: check L59 return this.isAuthenticated$.pipe(filter(_ => this.kindeClient !== null), switchMap(isAuthenticated => iif(() => isAuthenticated, from(this.kindeClient.getUserOrganizations()), of({ orgCodes: [] })))); } getAccessToken() { if (!this.kindeClient) throw new Error("kindeClient is null"); return this.kindeClient.getToken(); } getFeatureFlag(code, defaultValue, flagType) { if (!this.kindeClient) throw new Error("kindeClient is null"); return this.kindeClient.getFlag(code, defaultValue, flagType); } async getFeatureFlagEnabled(code, defaultValue) { const BOOLEAN_FLAG_TYPE = 'b'; return (await this.getFeatureFlag(code, defaultValue, BOOLEAN_FLAG_TYPE)).value; } async login(options) { if (!this.kindeClient) throw new Error("kindeClient is null"); const loginUrl = await this.kindeClient.login(options); if (options?.post_login_redirect_url) { await sessionManager.setSessionItemBrowser('post_login_redirect_url', options.post_login_redirect_url); } this.document.location.href = loginUrl.href; } async logout() { if (!this.kindeClient) throw new Error("kindeClient is null"); const logoutUrl = await this.kindeClient.logout(); this.document.location.href = logoutUrl.href; } async register(options) { if (!this.kindeClient) throw new Error("kindeClient is null"); const registerUrl = await this.kindeClient.register(options); this.document.location.href = registerUrl.href; } shouldHandleCallback() { return of(this.document.location.search) .pipe(map(search => new URLSearchParams(search)), map(params => params.has('code') || params.has('state'))); } async handleCallback() { try { await this.kindeClient.handleRedirectToApp(new URL(this.document.location.href)); const token = await this.kindeClient.getToken(); this.authState.setAccessToken(token); let url = new URL(this.document.location.href); url.search = ''; const loginRedirectUrl = await sessionManager.getSessionItemBrowser('post_login_redirect_url'); if (loginRedirectUrl) { url = new URL(loginRedirectUrl); await sessionManager.removeSessionItemBrowser('post_login_redirect_url'); } this.document.location.href = url.href; this.location.go(url.toString()); } catch (e) { console.log(e); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: KindeAngularService, deps: [{ token: KINDE_FACTORY_TOKEN }, { token: DOCUMENT }, { token: i1.Location }, { token: i2.AuthStateService }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: KindeAngularService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: KindeAngularService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [{ type: undefined, decorators: [{ type: Inject, args: [KINDE_FACTORY_TOKEN] }] }, { type: Document, decorators: [{ type: Inject, args: [DOCUMENT] }] }, { type: i1.Location }, { type: i2.AuthStateService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2luZGUtYW5ndWxhci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMva2luZGUtYW5ndWxhci9zcmMvbGliL2tpbmRlLWFuZ3VsYXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUM5RCxPQUFPLEVBQ0wsS0FBSyxFQUNMLE1BQU0sRUFDTixJQUFJLEVBQ0osR0FBRyxFQUNILEdBQUcsRUFFSCxFQUFFLEVBQ0YsT0FBTyxFQUNQLFNBQVMsRUFDVCxTQUFTLEVBQ1QsR0FBRyxFQUNKLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFLckUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxRQUFRLEVBQStCLE1BQU0saUJBQWlCLENBQUM7Ozs7QUFLeEUsTUFBTSxPQUFPLG1CQUFtQjtJQVE5QixZQUN1QyxXQUErQixFQUMxQyxRQUFrQixFQUNwQyxRQUFrQixFQUNsQixTQUEyQjtRQUhFLGdCQUFXLEdBQVgsV0FBVyxDQUFvQjtRQUMxQyxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ3BDLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUFYN0IsaUJBQVksR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBRTNDLFVBQUssR0FBZ0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUM7UUFDMUQscUJBQWdCLEdBQXdCLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUM7UUFDeEUsZUFBVSxHQUF3QixJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQztRQUM1RCxpQkFBWSxHQUE4QixJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQztRQVFw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QUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pCLENBQUM7SUFDSCxDQUFDOzhHQTVIVSxtQkFBbUIsa0JBU3BCLG1CQUFtQixhQUNuQixRQUFRO2tIQVZQLG1CQUFtQixjQUZsQixNQUFNOzsyRkFFUCxtQkFBbUI7a0JBSC9CLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFVSSxNQUFNOzJCQUFDLG1CQUFtQjs7MEJBQzFCLE1BQU07MkJBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBkZWZlcixcbiAgZmlsdGVyLFxuICBmcm9tLFxuICBpaWYsXG4gIG1hcCxcbiAgT2JzZXJ2YWJsZSxcbiAgb2YsXG4gIFN1YmplY3QsXG4gIHN3aXRjaE1hcCxcbiAgdGFrZVVudGlsLFxuICB0YXBcbn0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IEtJTkRFX0ZBQ1RPUllfVE9LRU4gfSBmcm9tIFwiLi9raW5kZS1jbGllbnQtZmFjdG9yeS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBLaW5kZUNsaWVudCB9IGZyb20gXCIuL2ludGVyZmFjZXMva2luZGUtY2xpZW50LmludGVyZmFjZVwiO1xuaW1wb3J0IHsgQXV0aFN0YXRlU2VydmljZSB9IGZyb20gXCIuL2F1dGgtc3RhdGUuc2VydmljZVwiO1xuaW1wb3J0IHsgQ2xhaW1Ub2tlblR5cGUsIEZsYWdUeXBlLCBHZXRGbGFnVHlwZSwgUmVnaXN0ZXJVUkxPcHRpb25zLCBVc2VyVHlwZSB9IGZyb20gXCJAa2luZGUtb3NzL2tpbmRlLXR5cGVzY3JpcHQtc2RrXCI7XG5pbXBvcnQgeyBJQ2xhaW0gfSBmcm9tIFwiLi9pbnRlcmZhY2VzL2NsYWltLmludGVyZmFjZVwiO1xuaW1wb3J0IHsgc2Vzc2lvbk1hbmFnZXIgfSBmcm9tIFwiLi9zZXNzaW9uLW1hbmFnZXJcIjtcbmltcG9ydCB7IERPQ1VNRU5ULCBpc1BsYXRmb3JtQnJvd3NlciwgTG9jYXRpb24gfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEtpbmRlQW5ndWxhclNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHVuc3Vic2NyaWJlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgdXNlciQ6IE9ic2VydmFibGU8VXNlclR5cGUgfCBudWxsPiA9IHRoaXMuYXV0aFN0YXRlLnVzZXIkO1xuICBpc0F1dGhlbnRpY2F0ZWQkOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5hdXRoU3RhdGUuaXNBdXRoZW50aWNhdGVkJDtcbiAgaXNMb2FkaW5nJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuYXV0aFN0YXRlLmlzTG9hZGluZyQ7XG4gIGFjY2Vzc1Rva2VuJDogT2JzZXJ2YWJsZTxzdHJpbmcgfCBudWxsPiA9IHRoaXMuYXV0aFN0YXRlLmFjY2Vzc1Rva2VuJDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KEtJTkRFX0ZBQ1RPUllfVE9LRU4pIHByaXZhdGUga2luZGVDbGllbnQ6IEtpbmRlQ2xpZW50IHwgbnVsbCxcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBEb2N1bWVudCxcbiAgICBwcml2YXRlIGxvY2F0aW9uOiBMb2NhdGlvbixcbiAgICBwcml2YXRlIGF1dGhTdGF0ZTogQXV0aFN0YXRlU2VydmljZVxuICApIHtcbiAgICB0aGlzLnNob3VsZEhhbmRsZUNhbGxiYWNrKClcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoXyA9PiB0aGlzLmtpbmRlQ2xpZW50ICE9PSBudWxsKSxcbiAgICAgICAgc3dpdGNoTWFwKHNob3VsZEhhbmRsZUNhbGxiYWNrID0+XG4gICAgICAgICAgaWlmKFxuICAgICAgICAgICAgKCkgPT4gc2hvdWxkSGFuZGxlQ2FsbGJhY2ssXG4gICAgICAgICAgICBkZWZlcigoKSA9PiB0aGlzLmhhbmRsZUNhbGxiYWNrKCkpLFxuICAgICAgICAgICAgb2YoZmFsc2UpXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgICAgdGFwKCgpID0+XG4gICAgICAgICAgYXV0aFN0YXRlLnNldElzTG9hZGluZyhmYWxzZSlcbiAgICAgICAgKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKVxuICAgICAgKS5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMudW5zdWJzY3JpYmUkLm5leHQoKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlJC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgZ2V0Q2xhaW08VD4oY2xhaW06IHN0cmluZywgdHlwZT86IENsYWltVG9rZW5UeXBlKTogT2JzZXJ2YWJsZTxJQ2xhaW08VD4gfCBudWxsPiB7XG4gICAgLy8gdG9kbzogbWFrZSByZXVzYWJsZSBmdW5jdGlvbiB0byBoYW5kbGUgaXNBdXRoZW50aWNhdGVkXG4gICAgcmV0dXJuIHRoaXMuaXNBdXRoZW50aWNhdGVkJC5waXBlKFxuICAgICAgZmlsdGVyKF8gPT4gdGhpcy5raW5kZUNsaWVudCAhPT0gbnVsbCksXG4gICAgICBzd2l0Y2hNYXAoaXNBdXRoZW50aWNhdGVkID0+XG4gICAgICAgIGlpZihcbiAgICAgICAgICAoKSA9PiBpc0F1dGhlbnRpY2F0ZWQsXG4gICAgICAgICAgZnJvbSh0aGlzLmtpbmRlQ2xpZW50IS5nZXRDbGFpbShjbGFpbSwgdHlwZSkpIGFzIE9ic2VydmFibGU8SUNsYWltPFQ+PixcbiAgICAgICAgICBvZihudWxsKVxuICAgICAgICApXG4gICAgKSk7XG4gIH07XG5cbiAgZ2V0VXNlck9yZ2FuaXphdGlvbnMoKTogT2JzZXJ2YWJsZTx7IG9yZ0NvZGVzOiBzdHJpbmdbXSB9PiB7XG4gICAgLy8gdG9kbzogY2hlY2sgTDU5XG4gICAgcmV0dXJuIHRoaXMuaXNBdXRoZW50aWNhdGVkJC5waXBlKFxuICAgICAgZmlsdGVyKF8gPT4gdGhpcy5raW5kZUNsaWVudCAhPT0gbnVsbCksXG4gICAgICBzd2l0Y2hNYXAoaXNBdXRoZW50aWNhdGVkID0+XG4gICAgICAgIGlpZihcbiAgICAgICAgICAoKSA9PiBpc0F1dGhlbnRpY2F0ZWQsXG4gICAgICAgICAgZnJvbSh0aGlzLmtpbmRlQ2xpZW50IS5nZXRVc2VyT3JnYW5pemF0aW9ucygpKSxcbiAgICAgICAgICBvZih7IG9yZ0NvZGVzOiBbXSB9KVxuICAgICAgICApXG4gICAgKSk7XG4gIH1cblxuICBnZXRBY2Nlc3NUb2tlbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmKCF0aGlzLmtpbmRlQ2xpZW50KSB0aHJvdyBuZXcgRXJyb3IoXCJraW5kZUNsaWVudCBpcyBudWxsXCIpO1xuICAgIHJldHVybiB0aGlzLmtpbmRlQ2xpZW50LmdldFRva2VuKCk7XG4gIH1cblxuICBnZXRGZWF0dXJlRmxhZyhjb2RlOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZT86IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCB1bmRlZmluZWQsIGZsYWdUeXBlPzoga2V5b2YgRmxhZ1R5cGUpOiBQcm9taXNlPEdldEZsYWdUeXBlPiB7XG4gICAgaWYoIXRoaXMua2luZGVDbGllbnQpIHRocm93IG5ldyBFcnJvcihcImtpbmRlQ2xpZW50IGlzIG51bGxcIik7XG4gICAgcmV0dXJuIHRoaXMua2luZGVDbGllbnQuZ2V0RmxhZyhjb2RlLCBkZWZhdWx0VmFsdWUsIGZsYWdUeXBlKTtcbiAgfVxuXG4gIGFzeW5jIGdldEZlYXR1cmVGbGFnRW5hYmxlZChjb2RlOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZT86IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBCT09MRUFOX0ZMQUdfVFlQRSA9ICdiJztcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuZ2V0RmVhdHVyZUZsYWcoY29kZSwgZGVmYXVsdFZhbHVlLCBCT09MRUFOX0ZMQUdfVFlQRSkpLnZhbHVlIGFzIGJvb2xlYW47XG4gIH1cblxuICBhc3luYyBsb2dpbihvcHRpb25zPzogUmVnaXN0ZXJVUkxPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYoIXRoaXMua2luZGVDbGllbnQpIHRocm93IG5ldyBFcnJvcihcImtpbmRlQ2xpZW50IGlzIG51bGxcIik7XG4gICAgY29uc3QgbG9naW5VcmwgPSBhd2FpdCB0aGlzLmtpbmRlQ2xpZW50LmxvZ2luKG9wdGlvbnMpO1xuICAgIGlmIChvcHRpb25zPy5wb3N0X2xvZ2luX3JlZGlyZWN0X3VybCkge1xuICAgICAgYXdhaXQgc2Vzc2lvbk1hbmFnZXIuc2V0U2Vzc2lvbkl0ZW1Ccm93c2VyKCdwb3N0X2xvZ2luX3JlZGlyZWN0X3VybCcsIG9wdGlvbnMucG9zdF9sb2dpbl9yZWRpcmVjdF91cmwpO1xuICAgIH1cbiAgICB0aGlzLmRvY3VtZW50LmxvY2F0aW9uLmhyZWYgPSBsb2dpblVybC5ocmVmO1xuICB9XG5cbiAgYXN5bmMgbG9nb3V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmKCF0aGlzLmtpbmRlQ2xpZW50KSB0aHJvdyBuZXcgRXJyb3IoXCJraW5kZUNsaWVudCBpcyBudWxsXCIpO1xuICAgIGNvbnN0IGxvZ291dFVybCA9IGF3YWl0IHRoaXMua2luZGVDbGllbnQubG9nb3V0KCk7XG4gICAgdGhpcy5kb2N1bWVudC5sb2NhdGlvbi5ocmVmID0gbG9nb3V0VXJsLmhyZWY7XG4gIH1cblxuICBhc3luYyByZWdpc3RlcihvcHRpb25zPzogUmVnaXN0ZXJVUkxPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYoIXRoaXMua2luZGVDbGllbnQpIHRocm93IG5ldyBFcnJvcihcImtpbmRlQ2xpZW50IGlzIG51bGxcIik7XG4gICAgY29uc3QgcmVnaXN0ZXJVcmwgPSBhd2FpdCB0aGlzLmtpbmRlQ2xpZW50LnJlZ2lzdGVyKG9wdGlvbnMpO1xuICAgIHRoaXMuZG9jdW1lbnQubG9jYXRpb24uaHJlZiA9IHJlZ2lzdGVyVXJsLmhyZWY7XG4gIH1cblxuICBwcml2YXRlIHNob3VsZEhhbmRsZUNhbGxiYWNrKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBvZih0aGlzLmRvY3VtZW50LmxvY2F0aW9uLnNlYXJjaClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoc2VhcmNoID0+IG5ldyBVUkxTZWFyY2hQYXJhbXMoc2VhcmNoKSksXG4gICAgICAgIG1hcChwYXJhbXMgPT4gcGFyYW1zLmhhcygnY29kZScpIHx8IHBhcmFtcy5oYXMoJ3N0YXRlJykpXG4gICAgICApO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlQ2FsbGJhY2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMua2luZGVDbGllbnQhLmhhbmRsZVJlZGlyZWN0VG9BcHAobmV3IFVSTCh0aGlzLmRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtcbiAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5raW5kZUNsaWVudCEuZ2V0VG9rZW4oKTtcbiAgICAgIHRoaXMuYXV0aFN0YXRlLnNldEFjY2Vzc1Rva2VuKHRva2VuKTtcbiAgICAgIGxldCB1cmwgPSBuZXcgVVJMKHRoaXMuZG9jdW1lbnQubG9jYXRpb24uaHJlZik7XG4gICAgICB1cmwuc2VhcmNoID0gJyc7XG5cbiAgICAgIGNvbnN0IGxvZ2luUmVkaXJlY3RVcmwgPSBhd2FpdCBzZXNzaW9uTWFuYWdlci5nZXRTZXNzaW9uSXRlbUJyb3dzZXIoJ3Bvc3RfbG9naW5fcmVkaXJlY3RfdXJsJyk7XG4gICAgICBpZiAobG9naW5SZWRpcmVjdFVybCkge1xuICAgICAgICB1cmwgPSBuZXcgVVJMKGxvZ2luUmVkaXJlY3RVcmwpO1xuICAgICAgICBhd2FpdCBzZXNzaW9uTWFuYWdlci5yZW1vdmVTZXNzaW9uSXRlbUJyb3dzZXIoJ3Bvc3RfbG9naW5fcmVkaXJlY3RfdXJsJyk7XG4gICAgICB9XG4gICAgICB0aGlzLmRvY3VtZW50LmxvY2F0aW9uLmhyZWYgPSB1cmwuaHJlZjtcbiAgICAgIHRoaXMubG9jYXRpb24uZ28odXJsLnRvU3RyaW5nKCkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgIH1cbiAgfVxufVxuIl19