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); } } NbAuthService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: NbAuthService, deps: [{ token: i1.NbTokenService }, { token: NB_AUTH_STRATEGIES }], target: i0.ɵɵFactoryTarget.Injectable }); NbAuthService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: NbAuthService }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: NbAuthService, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i1.NbTokenService }, { type: undefined, decorators: [{ type: Inject, args: [NB_AUTH_STRATEGIES] }] }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2ZyYW1ld29yay9hdXRoL3NlcnZpY2VzL2F1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBQ0gsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFjLEVBQUUsSUFBSSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUdoRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7O0FBS3JEOzs7R0FHRztBQUVILE1BQU0sT0FBTyxhQUFhO0lBRXhCLFlBQXNCLFlBQTRCLEVBQ0EsVUFBVTtRQUR0QyxpQkFBWSxHQUFaLFlBQVksQ0FBZ0I7UUFDQSxlQUFVLEdBQVYsVUFBVSxDQUFBO0lBQzVELENBQUM7SUFFRDs7O09BR0c7SUFDSCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxlQUFlO1FBQ2IsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFO2FBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFrQixFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsd0JBQXdCO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRTthQUNuQixJQUFJLENBQ0gsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2xCLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUN4QyxPQUFPLElBQUksQ0FBQyxZ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QUM7YUFDckQsSUFBSSxDQUNILFNBQVMsQ0FBQyxDQUFDLE1BQW9CLEVBQUUsRUFBRTtZQUNqQyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6QyxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ04sQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ08sV0FBVyxDQUFDLFlBQW9CO1FBQ3hDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBd0IsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxLQUFLLFlBQVksQ0FBQyxDQUFDO1FBRXRHLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDVixNQUFNLElBQUksU0FBUyxDQUFDLCtDQUErQyxZQUFZLFFBQVEsQ0FBQyxDQUFDO1NBQzFGO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU8sa0JBQWtCLENBQUMsTUFBb0I7UUFDN0MsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQzNDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO2lCQUM1QyxJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsS0FBa0IsRUFBRSxFQUFFO2dCQUN6QixPQUFPLE1BQU0sQ0FBQztZQUNoQixDQUFDLENBQUMsQ0FDSCxDQUFDO1NBQ0w7UUFFRCxPQUFPLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM5QixDQUFDOzswR0EvTVUsYUFBYSxnREFHSixrQkFBa0I7OEdBSDNCLGFBQWE7MkZBQWIsYUFBYTtrQkFEekIsVUFBVTs7MEJBSUksTUFBTTsyQkFBQyxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgQWt2ZW8uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICovXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgYXMgb2JzZXJ2YWJsZU9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBzd2l0Y2hNYXAsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgTmJBdXRoU3RyYXRlZ3kgfSBmcm9tICcuLi9zdHJhdGVnaWVzL2F1dGgtc3RyYXRlZ3knO1xuaW1wb3J0IHsgTkJfQVVUSF9TVFJBVEVHSUVTIH0gZnJvbSAnLi4vYXV0aC5vcHRpb25zJztcbmltcG9ydCB7IE5iQXV0aFJlc3VsdCB9IGZyb20gJy4vYXV0aC1yZXN1bHQnO1xuaW1wb3J0IHsgTmJUb2tlblNlcnZpY2UgfSBmcm9tICcuL3Rva2VuL3Rva2VuLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmJBdXRoVG9rZW4gfSBmcm9tICcuL3Rva2VuL3Rva2VuJztcblxuLyoqXG4gKiBDb21tb24gYXV0aGVudGljYXRpb24gc2VydmljZS5cbiAqIFNob3VsZCBiZSB1c2VkIHRvIGFzIGFuIGludGVybGF5ZXIgYmV0d2VlbiBVSSBDb21wb25lbnRzIGFuZCBBdXRoIFN0cmF0ZWd5LlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTmJBdXRoU2VydmljZSB7XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHRva2VuU2VydmljZTogTmJUb2tlblNlcnZpY2UsXG4gICAgICAgICAgICAgIEBJbmplY3QoTkJfQVVUSF9TVFJBVEVHSUVTKSBwcm90ZWN0ZWQgc3RyYXRlZ2llcykge1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBjdXJyZW50IGF1dGhlbnRpY2F0ZWQgdG9rZW4gc3RvcmVkXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPGFueT59XG4gICAqL1xuICBnZXRUb2tlbigpOiBPYnNlcnZhYmxlPE5iQXV0aFRva2VuPiB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5TZXJ2aWNlLmdldCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBhdXRoIHRva2VuIGlzIHByZXNlbnQgaW4gdGhlIHRva2VuIHN0b3JhZ2VcbiAgICogQHJldHVybnMge09ic2VydmFibGU8Ym9vbGVhbj59XG4gICAqL1xuICBpc0F1dGhlbnRpY2F0ZWQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VG9rZW4oKVxuICAgICAgLnBpcGUobWFwKCh0b2tlbjogTmJBdXRoVG9rZW4pID0+IHRva2VuLmlzVmFsaWQoKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB2YWxpZCBhdXRoIHRva2VuIGlzIHByZXNlbnQgaW4gdGhlIHRva2VuIHN0b3JhZ2UuXG4gICAqIElmIG5vdCwgY2FsbHMgdGhlIHN0cmF0ZWd5IHJlZnJlc2hUb2tlbiwgYW5kIHJldHVybnMgaXNBdXRoZW50aWNhdGVkKCkgaWYgc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPGJvb2xlYW4+fVxuICAgKi9cbiAgaXNBdXRoZW50aWNhdGVkT3JSZWZyZXNoKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmdldFRva2VuKClcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAodG9rZW4gPT4ge1xuICAgICAgICBpZiAodG9rZW4uZ2V0VmFsdWUoKSAmJiAhdG9rZW4uaXNWYWxpZCgpKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucmVmcmVzaFRva2VuKHRva2VuLmdldE93bmVyU3RyYXRlZ3lOYW1lKCksIHRva2VuKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgIHN3aXRjaE1hcChyZXMgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXMuaXNTdWNjZXNzKCkpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzQXV0aGVudGljYXRlZCgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZU9mKGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBvYnNlcnZhYmxlT2YodG9rZW4uaXNWYWxpZCgpKTtcbiAgICAgICAgfVxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRva2VucyBzdHJlYW1cbiAgICogQHJldHVybnMge09ic2VydmFibGU8TmJBdXRoU2ltcGxlVG9rZW4+fVxuICAgKi9cbiAgb25Ub2tlbkNoYW5nZSgpOiBPYnNlcnZhYmxlPE5iQXV0aFRva2VuPiB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5TZXJ2aWNlLnRva2VuQ2hhbmdlKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhdXRoZW50aWNhdGlvbiBzdGF0dXMgc3RyZWFtXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPGJvb2xlYW4+fVxuICAgKi9cbiAgb25BdXRoZW50aWNhdGlvbkNoYW5nZSgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5vblRva2VuQ2hhbmdlKClcbiAgICAgIC5waXBlKG1hcCgodG9rZW46IE5iQXV0aFRva2VuKSA9PiB0b2tlbi5pc1ZhbGlkKCkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdXRoZW50aWNhdGVzIHdpdGggdGhlIHNlbGVjdGVkIHN0cmF0ZWd5XG4gICAqIFN0b3JlcyByZWNlaXZlZCB0b2tlbiBpbiB0aGUgdG9rZW4gc3RvcmFnZVxuICAgKlxuICAgKiBFeGFtcGxlOlxuICAgKiBhdXRoZW50aWNhdGUoJ2VtYWlsJywge2VtYWlsOiAnZW1haWxAZXhhbXBsZS5jb20nLCBwYXNzd29yZDogJ3Rlc3QnfSlcbiAgICpcbiAgICogQHBhcmFtIHN0cmF0ZWd5TmFtZVxuICAgKiBAcGFyYW0gZGF0YVxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxOYkF1dGhSZXN1bHQ+fVxuICAgKi9cbiAgYXV0aGVudGljYXRlKHN0cmF0ZWd5TmFtZTogc3RyaW5nLCBkYXRhPzogYW55KTogT2JzZXJ2YWJsZTxOYkF1dGhSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJhdGVneShzdHJhdGVneU5hbWUpLmF1dGhlbnRpY2F0ZShkYXRhKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgocmVzdWx0OiBOYkF1dGhSZXN1bHQpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzUmVzdWx0VG9rZW4ocmVzdWx0KTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyB3aXRoIHRoZSBzZWxlY3RlZCBzdHJhdGVneVxuICAgKiBTdG9yZXMgcmVjZWl2ZWQgdG9rZW4gaW4gdGhlIHRva2VuIHN0b3JhZ2VcbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICogcmVnaXN0ZXIoJ2VtYWlsJywge2VtYWlsOiAnZW1haWxAZXhhbXBsZS5jb20nLCBuYW1lOiAnU29tZSBOYW1lJywgcGFzc3dvcmQ6ICd0ZXN0J30pXG4gICAqXG4gICAqIEBwYXJhbSBzdHJhdGVneU5hbWVcbiAgICogQHBhcmFtIGRhdGFcbiAgICogQHJldHVybnMge09ic2VydmFibGU8TmJBdXRoUmVzdWx0Pn1cbiAgICovXG4gIHJlZ2lzdGVyKHN0cmF0ZWd5TmFtZTogc3RyaW5nLCBkYXRhPzogYW55KTogT2JzZXJ2YWJsZTxOYkF1dGhSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJhdGVneShzdHJhdGVneU5hbWUpLnJlZ2lzdGVyKGRhdGEpXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKChyZXN1bHQ6IE5iQXV0aFJlc3VsdCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NSZXN1bHRUb2tlbihyZXN1bHQpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbiBvdXRzIHdpdGggdGhlIHNlbGVjdGVkIHN0cmF0ZWd5XG4gICAqIFJlbW92ZXMgdG9rZW4gZnJvbSB0aGUgdG9rZW4gc3RvcmFnZVxuICAgKlxuICAgKiBFeGFtcGxlOlxuICAgKiBsb2dvdXQoJ2VtYWlsJylcbiAgICpcbiAgICogQHBhcmFtIHN0cmF0ZWd5TmFtZVxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxOYkF1dGhSZXN1bHQ+fVxuICAgKi9cbiAgbG9nb3V0KHN0cmF0ZWd5TmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxOYkF1dGhSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJhdGVneShzdHJhdGVneU5hbWUpLmxvZ291dCgpXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKChyZXN1bHQ6IE5iQXV0aFJlc3VsdCkgPT4ge1xuICAgICAgICAgIGlmIChyZXN1bHQuaXNTdWNjZXNzKCkpIHtcbiAgICAgICAgICAgIHRoaXMudG9rZW5TZXJ2aWNlLmNsZWFyKClcbiAgICAgICAgICAgICAgLnBpcGUobWFwKCgpID0+IHJlc3VsdCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZU9mKHJlc3VsdCk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBmb3Jnb3QgcGFzc3dvcmQgcmVxdWVzdCB0byB0aGUgc2VsZWN0ZWQgc3RyYXRlZ3lcbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICogcmVxdWVzdFBhc3N3b3JkKCdlbWFpbCcsIHtlbWFpbDogJ2VtYWlsQGV4YW1wbGUuY29tJ30pXG4gICAqXG4gICAqIEBwYXJhbSBzdHJhdGVneU5hbWVcbiAgICogQHBhcmFtIGRhdGFcbiAgICogQHJldHVybnMge09ic2VydmFibGU8TmJBdXRoUmVzdWx0Pn1cbiAgICovXG4gIHJlcXVlc3RQYXNzd29yZChzdHJhdGVneU5hbWU6IHN0cmluZywgZGF0YT86IGFueSk6IE9ic2VydmFibGU8TmJBdXRoUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyYXRlZ3koc3RyYXRlZ3lOYW1lKS5yZXF1ZXN0UGFzc3dvcmQoZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogVHJpZXMgdG8gcmVzZXQgcGFzc3dvcmQgd2l0aCB0aGUgc2VsZWN0ZWQgc3RyYXRlZ3lcbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICogcmVzZXRQYXNzd29yZCgnZW1haWwnLCB7bmV3UGFzc3dvcmQ6ICd0ZXN0J30pXG4gICAqXG4gICAqIEBwYXJhbSBzdHJhdGVneU5hbWVcbiAgICogQHBhcmFtIGRhdGFcbiAgICogQHJldHVybnMge09ic2VydmFibGU8TmJBdXRoUmVzdWx0Pn1cbiAgICovXG4gIHJlc2V0UGFzc3dvcmQoc3RyYXRlZ3lOYW1lOiBzdHJpbmcsIGRhdGE/OiBhbnkpOiBPYnNlcnZhYmxlPE5iQXV0aFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmF0ZWd5KHN0cmF0ZWd5TmFtZSkucmVzZXRQYXNzd29yZChkYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIHJlZnJlc2ggdG9rZW4gcmVxdWVzdFxuICAgKiBTdG9yZXMgcmVjZWl2ZWQgdG9rZW4gaW4gdGhlIHRva2VuIHN0b3JhZ2VcbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICogcmVmcmVzaFRva2VuKCdlbWFpbCcsIHt0b2tlbjogdG9rZW59KVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyYXRlZ3lOYW1lXG4gICAqIEBwYXJhbSBkYXRhXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPE5iQXV0aFJlc3VsdD59XG4gICAqL1xuICByZWZyZXNoVG9rZW4oc3RyYXRlZ3lOYW1lOiBzdHJpbmcsIGRhdGE/OiBhbnkpOiBPYnNlcnZhYmxlPE5iQXV0aFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmF0ZWd5KHN0cmF0ZWd5TmFtZSkucmVmcmVzaFRva2VuKGRhdGEpXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKChyZXN1bHQ6IE5iQXV0aFJlc3VsdCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NSZXN1bHRUb2tlbihyZXN1bHQpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJlZ2lzdGVyZWQgc3RyYXRlZ3kgYnkgbmFtZVxuICAgKlxuICAgKiBFeGFtcGxlOlxuICAgKiBnZXRTdHJhdGVneSgnZW1haWwnKVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvdmlkZXJcbiAgICogQHJldHVybnMge05iQWJzdHJhY3RBdXRoUHJvdmlkZXJ9XG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0U3RyYXRlZ3koc3RyYXRlZ3lOYW1lOiBzdHJpbmcpOiBOYkF1dGhTdHJhdGVneSB7XG4gICAgY29uc3QgZm91bmQgPSB0aGlzLnN0cmF0ZWdpZXMuZmluZCgoc3RyYXRlZ3k6IE5iQXV0aFN0cmF0ZWd5KSA9PiBzdHJhdGVneS5nZXROYW1lKCkgPT09IHN0cmF0ZWd5TmFtZSk7XG5cbiAgICBpZiAoIWZvdW5kKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBUaGVyZSBpcyBubyBBdXRoIFN0cmF0ZWd5IHJlZ2lzdGVyZWQgdW5kZXIgJyR7c3RyYXRlZ3lOYW1lfScgbmFtZWApO1xuICAgIH1cblxuICAgIHJldHVybiBmb3VuZDtcbiAgfVxuXG4gIHByaXZhdGUgcHJvY2Vzc1Jlc3VsdFRva2VuKHJlc3VsdDogTmJBdXRoUmVzdWx0KSB7XG4gICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSAmJiByZXN1bHQuZ2V0VG9rZW4oKSkge1xuICAgICAgcmV0dXJuIHRoaXMudG9rZW5TZXJ2aWNlLnNldChyZXN1bHQuZ2V0VG9rZW4oKSlcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgbWFwKCh0b2tlbjogTmJBdXRoVG9rZW4pID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9ic2VydmFibGVPZihyZXN1bHQpO1xuICB9XG59XG4iXX0=