UNPKG

@nebular/auth

Version:
206 lines 20.2 kB
/** * @license * Copyright Akveo. All Rights Reserved. * Licensed under the MIT License. See License.txt in the project root for license information. */ import { Inject, Injectable } from '@angular/core'; import { of as observableOf } from 'rxjs'; import { switchMap, map } from 'rxjs/operators'; import { NB_AUTH_STRATEGIES } from '../auth.options'; import * as i0 from "@angular/core"; import * as i1 from "./token/token.service"; /** * Common authentication service. * Should be used to as an interlayer between UI Components and Auth Strategy. */ export class NbAuthService { constructor(tokenService, strategies) { this.tokenService = tokenService; this.strategies = strategies; } /** * Retrieves current authenticated token stored * @returns {Observable<any>} */ getToken() { return this.tokenService.get(); } /** * Returns true if auth token is present in the token storage * @returns {Observable<boolean>} */ isAuthenticated() { return this.getToken() .pipe(map((token) => token.isValid())); } /** * Returns true if valid auth token is present in the token storage. * If not, calls the strategy refreshToken, and returns isAuthenticated() if success, false otherwise * @returns {Observable<boolean>} */ isAuthenticatedOrRefresh() { return this.getToken() .pipe(switchMap(token => { if (token.getValue() && !token.isValid()) { return this.refreshToken(token.getOwnerStrategyName(), token) .pipe(switchMap(res => { if (res.isSuccess()) { return this.isAuthenticated(); } else { return observableOf(false); } })); } else { return observableOf(token.isValid()); } })); } /** * Returns tokens stream * @returns {Observable<NbAuthSimpleToken>} */ onTokenChange() { return this.tokenService.tokenChange(); } /** * Returns authentication status stream * @returns {Observable<boolean>} */ onAuthenticationChange() { return this.onTokenChange() .pipe(map((token) => token.isValid())); } /** * Authenticates with the selected strategy * Stores received token in the token storage * * Example: * authenticate('email', {email: 'email@example.com', password: 'test'}) * * @param strategyName * @param data * @returns {Observable<NbAuthResult>} */ authenticate(strategyName, data) { return this.getStrategy(strategyName).authenticate(data) .pipe(switchMap((result) => { return this.processResultToken(result); })); } /** * Registers with the selected strategy * Stores received token in the token storage * * Example: * register('email', {email: 'email@example.com', name: 'Some Name', password: 'test'}) * * @param strategyName * @param data * @returns {Observable<NbAuthResult>} */ register(strategyName, data) { return this.getStrategy(strategyName).register(data) .pipe(switchMap((result) => { return this.processResultToken(result); })); } /** * Sign outs with the selected strategy * Removes token from the token storage * * Example: * logout('email') * * @param strategyName * @returns {Observable<NbAuthResult>} */ logout(strategyName) { return this.getStrategy(strategyName).logout() .pipe(switchMap((result) => { if (result.isSuccess()) { this.tokenService.clear() .pipe(map(() => result)); } return observableOf(result); })); } /** * Sends forgot password request to the selected strategy * * Example: * requestPassword('email', {email: 'email@example.com'}) * * @param strategyName * @param data * @returns {Observable<NbAuthResult>} */ requestPassword(strategyName, data) { return this.getStrategy(strategyName).requestPassword(data); } /** * Tries to reset password with the selected strategy * * Example: * resetPassword('email', {newPassword: 'test'}) * * @param strategyName * @param data * @returns {Observable<NbAuthResult>} */ resetPassword(strategyName, data) { return this.getStrategy(strategyName).resetPassword(data); } /** * Sends a refresh token request * Stores received token in the token storage * * Example: * refreshToken('email', {token: token}) * * @param {string} strategyName * @param data * @returns {Observable<NbAuthResult>} */ refreshToken(strategyName, data) { return this.getStrategy(strategyName).refreshToken(data) .pipe(switchMap((result) => { return this.processResultToken(result); })); } /** * Get registered strategy by name * * Example: * getStrategy('email') * * @param {string} provider * @returns {NbAbstractAuthProvider} */ getStrategy(strategyName) { const found = this.strategies.find((strategy) => strategy.getName() === strategyName); if (!found) { throw new TypeError(`There is no Auth Strategy registered under '${strategyName}' name`); } return found; } processResultToken(result) { if (result.isSuccess() && result.getToken()) { return this.tokenService.set(result.getToken()) .pipe(map((token) => { return result; })); } return observableOf(result); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NbAuthService, deps: [{ token: i1.NbTokenService }, { token: NB_AUTH_STRATEGIES }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NbAuthService }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: NbAuthService, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: i1.NbTokenService }, { type: undefined, decorators: [{ type: Inject, args: [NB_AUTH_STRATEGIES] }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2ZyYW1ld29yay9hdXRoL3NlcnZpY2VzL2F1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBQ0gsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFjLEVBQUUsSUFBSSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUdoRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7O0FBS3JEOzs7R0FHRztBQUVILE1BQU0sT0FBTyxhQUFhO0lBRXhCLFlBQXNCLFlBQTRCLEVBQ0EsVUFBVTtRQUR0QyxpQkFBWSxHQUFaLFlBQVksQ0FBZ0I7UUFDQSxlQUFVLEdBQVYsVUFBVSxDQUFBO0lBQzVELENBQUM7SUFFRDs7O09BR0c7SUFDSCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxlQUFlO1FBQ2IsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFO2FBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFrQixFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsd0JBQXdCO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRTthQUNuQixJQUFJLENBQ0gsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2xCLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7Z0JBQ3pDLE9BQU8sSUFBSSxD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eXJpZ2h0IEFrdmVvLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqL1xuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIGFzIG9ic2VydmFibGVPZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgc3dpdGNoTWFwLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IE5iQXV0aFN0cmF0ZWd5IH0gZnJvbSAnLi4vc3RyYXRlZ2llcy9hdXRoLXN0cmF0ZWd5JztcbmltcG9ydCB7IE5CX0FVVEhfU1RSQVRFR0lFUyB9IGZyb20gJy4uL2F1dGgub3B0aW9ucyc7XG5pbXBvcnQgeyBOYkF1dGhSZXN1bHQgfSBmcm9tICcuL2F1dGgtcmVzdWx0JztcbmltcG9ydCB7IE5iVG9rZW5TZXJ2aWNlIH0gZnJvbSAnLi90b2tlbi90b2tlbi5zZXJ2aWNlJztcbmltcG9ydCB7IE5iQXV0aFRva2VuIH0gZnJvbSAnLi90b2tlbi90b2tlbic7XG5cbi8qKlxuICogQ29tbW9uIGF1dGhlbnRpY2F0aW9uIHNlcnZpY2UuXG4gKiBTaG91bGQgYmUgdXNlZCB0byBhcyBhbiBpbnRlcmxheWVyIGJldHdlZW4gVUkgQ29tcG9uZW50cyBhbmQgQXV0aCBTdHJhdGVneS5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE5iQXV0aFNlcnZpY2Uge1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCB0b2tlblNlcnZpY2U6IE5iVG9rZW5TZXJ2aWNlLFxuICAgICAgICAgICAgICBASW5qZWN0KE5CX0FVVEhfU1RSQVRFR0lFUykgcHJvdGVjdGVkIHN0cmF0ZWdpZXMpIHtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgY3VycmVudCBhdXRoZW50aWNhdGVkIHRva2VuIHN0b3JlZFxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxhbnk+fVxuICAgKi9cbiAgZ2V0VG9rZW4oKTogT2JzZXJ2YWJsZTxOYkF1dGhUb2tlbj4ge1xuICAgIHJldHVybiB0aGlzLnRva2VuU2VydmljZS5nZXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgYXV0aCB0b2tlbiBpcyBwcmVzZW50IGluIHRoZSB0b2tlbiBzdG9yYWdlXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPGJvb2xlYW4+fVxuICAgKi9cbiAgaXNBdXRoZW50aWNhdGVkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmdldFRva2VuKClcbiAgICAgIC5waXBlKG1hcCgodG9rZW46IE5iQXV0aFRva2VuKSA9PiB0b2tlbi5pc1ZhbGlkKCkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdmFsaWQgYXV0aCB0b2tlbiBpcyBwcmVzZW50IGluIHRoZSB0b2tlbiBzdG9yYWdlLlxuICAgKiBJZiBub3QsIGNhbGxzIHRoZSBzdHJhdGVneSByZWZyZXNoVG9rZW4sIGFuZCByZXR1cm5zIGlzQXV0aGVudGljYXRlZCgpIGlmIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZVxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxib29sZWFuPn1cbiAgICovXG4gIGlzQXV0aGVudGljYXRlZE9yUmVmcmVzaCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRUb2tlbigpXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKHRva2VuID0+IHtcbiAgICAgICAgaWYgKHRva2VuLmdldFZhbHVlKCkgJiYgIXRva2VuLmlzVmFsaWQoKSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnJlZnJlc2hUb2tlbih0b2tlbi5nZXRPd25lclN0cmF0ZWd5TmFtZSgpLCB0b2tlbilcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICBzd2l0Y2hNYXAocmVzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzLmlzU3VjY2VzcygpKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pc0F1dGhlbnRpY2F0ZWQoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG9ic2VydmFibGVPZihmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZU9mKHRva2VuLmlzVmFsaWQoKSk7XG4gICAgICAgIH1cbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0b2tlbnMgc3RyZWFtXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPE5iQXV0aFNpbXBsZVRva2VuPn1cbiAgICovXG4gIG9uVG9rZW5DaGFuZ2UoKTogT2JzZXJ2YWJsZTxOYkF1dGhUb2tlbj4ge1xuICAgIHJldHVybiB0aGlzLnRva2VuU2VydmljZS50b2tlbkNoYW5nZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYXV0aGVudGljYXRpb24gc3RhdHVzIHN0cmVhbVxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxib29sZWFuPn1cbiAgICovXG4gIG9uQXV0aGVudGljYXRpb25DaGFuZ2UoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMub25Ub2tlbkNoYW5nZSgpXG4gICAgICAucGlwZShtYXAoKHRva2VuOiBOYkF1dGhUb2tlbikgPT4gdG9rZW4uaXNWYWxpZCgpKSk7XG4gIH1cblxuICAvKipcbiAgICogQXV0aGVudGljYXRlcyB3aXRoIHRoZSBzZWxlY3RlZCBzdHJhdGVneVxuICAgKiBTdG9yZXMgcmVjZWl2ZWQgdG9rZW4gaW4gdGhlIHRva2VuIHN0b3JhZ2VcbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICogYXV0aGVudGljYXRlKCdlbWFpbCcsIHtlbWFpbDogJ2VtYWlsQGV4YW1wbGUuY29tJywgcGFzc3dvcmQ6ICd0ZXN0J30pXG4gICAqXG4gICAqIEBwYXJhbSBzdHJhdGVneU5hbWVcbiAgICogQHBhcmFtIGRhdGFcbiAgICogQHJldHVybnMge09ic2VydmFibGU8TmJBdXRoUmVzdWx0Pn1cbiAgICovXG4gIGF1dGhlbnRpY2F0ZShzdHJhdGVneU5hbWU6IHN0cmluZywgZGF0YT86IGFueSk6IE9ic2VydmFibGU8TmJBdXRoUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyYXRlZ3koc3RyYXRlZ3lOYW1lKS5hdXRoZW50aWNhdGUoZGF0YSlcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKHJlc3VsdDogTmJBdXRoUmVzdWx0KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1Jlc3VsdFRva2VuKHJlc3VsdCk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgd2l0aCB0aGUgc2VsZWN0ZWQgc3RyYXRlZ3lcbiAgICogU3RvcmVzIHJlY2VpdmVkIHRva2VuIGluIHRoZSB0b2tlbiBzdG9yYWdlXG4gICAqXG4gICAqIEV4YW1wbGU6XG4gICAqIHJlZ2lzdGVyKCdlbWFpbCcsIHtlbWFpbDogJ2VtYWlsQGV4YW1wbGUuY29tJywgbmFtZTogJ1NvbWUgTmFtZScsIHBhc3N3b3JkOiAndGVzdCd9KVxuICAgKlxuICAgKiBAcGFyYW0gc3RyYXRlZ3lOYW1lXG4gICAqIEBwYXJhbSBkYXRhXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPE5iQXV0aFJlc3VsdD59XG4gICAqL1xuICByZWdpc3RlcihzdHJhdGVneU5hbWU6IHN0cmluZywgZGF0YT86IGFueSk6IE9ic2VydmFibGU8TmJBdXRoUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyYXRlZ3koc3RyYXRlZ3lOYW1lKS5yZWdpc3RlcihkYXRhKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgocmVzdWx0OiBOYkF1dGhSZXN1bHQpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzUmVzdWx0VG9rZW4ocmVzdWx0KTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gb3V0cyB3aXRoIHRoZSBzZWxlY3RlZCBzdHJhdGVneVxuICAgKiBSZW1vdmVzIHRva2VuIGZyb20gdGhlIHRva2VuIHN0b3JhZ2VcbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICogbG9nb3V0KCdlbWFpbCcpXG4gICAqXG4gICAqIEBwYXJhbSBzdHJhdGVneU5hbWVcbiAgICogQHJldHVybnMge09ic2VydmFibGU8TmJBdXRoUmVzdWx0Pn1cbiAgICovXG4gIGxvZ291dChzdHJhdGVneU5hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8TmJBdXRoUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyYXRlZ3koc3RyYXRlZ3lOYW1lKS5sb2dvdXQoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgocmVzdWx0OiBOYkF1dGhSZXN1bHQpID0+IHtcbiAgICAgICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcygpKSB7XG4gICAgICAgICAgICB0aGlzLnRva2VuU2VydmljZS5jbGVhcigpXG4gICAgICAgICAgICAgIC5waXBlKG1hcCgoKSA9PiByZXN1bHQpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG9ic2VydmFibGVPZihyZXN1bHQpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgZm9yZ290IHBhc3N3b3JkIHJlcXVlc3QgdG8gdGhlIHNlbGVjdGVkIHN0cmF0ZWd5XG4gICAqXG4gICAqIEV4YW1wbGU6XG4gICAqIHJlcXVlc3RQYXNzd29yZCgnZW1haWwnLCB7ZW1haWw6ICdlbWFpbEBleGFtcGxlLmNvbSd9KVxuICAgKlxuICAgKiBAcGFyYW0gc3RyYXRlZ3lOYW1lXG4gICAqIEBwYXJhbSBkYXRhXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPE5iQXV0aFJlc3VsdD59XG4gICAqL1xuICByZXF1ZXN0UGFzc3dvcmQoc3RyYXRlZ3lOYW1lOiBzdHJpbmcsIGRhdGE/OiBhbnkpOiBPYnNlcnZhYmxlPE5iQXV0aFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmF0ZWd5KHN0cmF0ZWd5TmFtZSkucmVxdWVzdFBhc3N3b3JkKGRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWVzIHRvIHJlc2V0IHBhc3N3b3JkIHdpdGggdGhlIHNlbGVjdGVkIHN0cmF0ZWd5XG4gICAqXG4gICAqIEV4YW1wbGU6XG4gICAqIHJlc2V0UGFzc3dvcmQoJ2VtYWlsJywge25ld1Bhc3N3b3JkOiAndGVzdCd9KVxuICAgKlxuICAgKiBAcGFyYW0gc3RyYXRlZ3lOYW1lXG4gICAqIEBwYXJhbSBkYXRhXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPE5iQXV0aFJlc3VsdD59XG4gICAqL1xuICByZXNldFBhc3N3b3JkKHN0cmF0ZWd5TmFtZTogc3RyaW5nLCBkYXRhPzogYW55KTogT2JzZXJ2YWJsZTxOYkF1dGhSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJhdGVneShzdHJhdGVneU5hbWUpLnJlc2V0UGFzc3dvcmQoZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSByZWZyZXNoIHRva2VuIHJlcXVlc3RcbiAgICogU3RvcmVzIHJlY2VpdmVkIHRva2VuIGluIHRoZSB0b2tlbiBzdG9yYWdlXG4gICAqXG4gICAqIEV4YW1wbGU6XG4gICAqIHJlZnJlc2hUb2tlbignZW1haWwnLCB7dG9rZW46IHRva2VufSlcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmF0ZWd5TmFtZVxuICAgKiBAcGFyYW0gZGF0YVxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxOYkF1dGhSZXN1bHQ+fVxuICAgKi9cbiAgcmVmcmVzaFRva2VuKHN0cmF0ZWd5TmFtZTogc3RyaW5nLCBkYXRhPzogYW55KTogT2JzZXJ2YWJsZTxOYkF1dGhSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJhdGVneShzdHJhdGVneU5hbWUpLnJlZnJlc2hUb2tlbihkYXRhKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgocmVzdWx0OiBOYkF1dGhSZXN1bHQpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzUmVzdWx0VG9rZW4ocmVzdWx0KTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZWdpc3RlcmVkIHN0cmF0ZWd5IGJ5IG5hbWVcbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICogZ2V0U3RyYXRlZ3koJ2VtYWlsJylcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3ZpZGVyXG4gICAqIEByZXR1cm5zIHtOYkFic3RyYWN0QXV0aFByb3ZpZGVyfVxuICAgKi9cbiAgcHJvdGVjdGVkIGdldFN0cmF0ZWd5KHN0cmF0ZWd5TmFtZTogc3RyaW5nKTogTmJBdXRoU3RyYXRlZ3kge1xuICAgIGNvbnN0IGZvdW5kID0gdGhpcy5zdHJhdGVnaWVzLmZpbmQoKHN0cmF0ZWd5OiBOYkF1dGhTdHJhdGVneSkgPT4gc3RyYXRlZ3kuZ2V0TmFtZSgpID09PSBzdHJhdGVneU5hbWUpO1xuXG4gICAgaWYgKCFmb3VuZCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVGhlcmUgaXMgbm8gQXV0aCBTdHJhdGVneSByZWdpc3RlcmVkIHVuZGVyICcke3N0cmF0ZWd5TmFtZX0nIG5hbWVgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm91bmQ7XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NSZXN1bHRUb2tlbihyZXN1bHQ6IE5iQXV0aFJlc3VsdCkge1xuICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKCkgJiYgcmVzdWx0LmdldFRva2VuKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnRva2VuU2VydmljZS5zZXQocmVzdWx0LmdldFRva2VuKCkpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIG1hcCgodG9rZW46IE5iQXV0aFRva2VuKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBvYnNlcnZhYmxlT2YocmVzdWx0KTtcbiAgfVxufVxuIl19