UNPKG

@codaglobal/ng-jwt-authentication

Version:

<a> <br> <h1 align="center">ng-jwt-authentication</h1> </a>

321 lines (320 loc) 37.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { Injectable, Inject } from '@angular/core'; import { HttpClient, HttpHeaders } from '@angular/common/http'; import { CookieService } from 'ngx-cookie-service'; import { throwError } from 'rxjs'; import { map, catchError, switchMap } from 'rxjs/operators'; import { METHODS, Config, DEFAULTS } from './angular-jwt.constants'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common/http"; import * as i2 from "ngx-cookie-service/cookie-service/cookie.service"; var JwtAuthenticationService = /** @class */ (function () { function JwtAuthenticationService(http, cookie, config) { this.http = http; this.cookie = cookie; this.config = config; this.libraryConfig = new Config(); this.libraryConfig.refreshUrl = this.config.refreshUrl || DEFAULTS.refreshUrl; this.libraryConfig.headerKeyName = this.config.headerKeyName || DEFAULTS.headerKeyName; this.libraryConfig.accessTokenKey = this.config.accessTokenKey || DEFAULTS.accessTokenKey; this.libraryConfig.refreshTokenKey = this.config.refreshTokenKey || DEFAULTS.refreshTokenKey; this.libraryConfig.expiresInKey = this.config.expiresInKey || DEFAULTS.expiresInKey; this.libraryConfig.errorStatusCode = this.config.errorStatusCode || DEFAULTS.errorStatusCode; this.libraryConfig.authorizationSchema = this.config.authorizationSchema || DEFAULTS.authorizationSchema; this.libraryConfig.contentTypeKeyName = DEFAULTS.contentTypeKeyName; this.libraryConfig.contentType = DEFAULTS.contentType; this.libraryConfig.jwtResponse = this.config.jwtResponse || DEFAULTS.jwtResponse; } /** * @param {?} customHeaders * @return {?} */ JwtAuthenticationService.prototype.setHeaders = /** * @param {?} customHeaders * @return {?} */ function (customHeaders) { /** @type {?} */ var headers; /** * If custom header available append the Authorization header, * Otherwise creating the header with Authorization and default Content type */ if (customHeaders) { headers = customHeaders; } else { headers = new HttpHeaders(); } if (!headers.has(this.libraryConfig.contentTypeKeyName)) { headers = headers.set(this.libraryConfig.contentTypeKeyName, this.libraryConfig.contentType); } headers = headers.set(this.libraryConfig.headerKeyName, this.libraryConfig.authorizationSchema + " " + this.cookie.get(this.libraryConfig.accessTokenKey)); return headers; }; /** * @param {?} url * @param {?=} options * @return {?} */ JwtAuthenticationService.prototype.jwtAuthGet = /** * @param {?} url * @param {?=} options * @return {?} */ function (url, options) { var _this = this; /** @type {?} */ var observeParameter = 'body'; /** @type {?} */ var requestHeader = this.setHeaders(options ? options.headers : undefined); if (options) { observeParameter = options.observe ? options.observe : 'body'; } return this.http.get(url, { headers: requestHeader, observe: observeParameter }).pipe(map(function (res) { return res; }), catchError(function (error) { return _this.handleServerError(error, url, METHODS.GET, options); })); }; /** * @param {?} url * @param {?} body * @param {?=} options * @return {?} */ JwtAuthenticationService.prototype.jwtAuthPost = /** * @param {?} url * @param {?} body * @param {?=} options * @return {?} */ function (url, body, options) { var _this = this; /** @type {?} */ var observeParameter = 'body'; /** @type {?} */ var requestHeader = this.setHeaders(options ? options.headers : undefined); if (options) { observeParameter = options.observe ? options.observe : 'body'; } return this.http.post(url, body, { headers: requestHeader, observe: observeParameter }).pipe(map(function (res) { return res; }), catchError(function (error) { return _this.handleServerError(error, url, METHODS.POST, body, options); })); }; /** * @param {?} url * @param {?} body * @param {?=} options * @return {?} */ JwtAuthenticationService.prototype.jwtAuthPut = /** * @param {?} url * @param {?} body * @param {?=} options * @return {?} */ function (url, body, options) { var _this = this; /** @type {?} */ var observeParameter = 'body'; /** @type {?} */ var requestHeader = this.setHeaders(options ? options.headers : undefined); if (options) { observeParameter = options.observe ? options.observe : 'body'; } return this.http.put(url, body, { headers: requestHeader, observe: observeParameter }).pipe(map(function (res) { return res; }), catchError(function (error) { return _this.handleServerError(error, url, METHODS.PUT, body, options); })); }; /** * @param {?} url * @param {?=} options * @return {?} */ JwtAuthenticationService.prototype.jwtAuthDelete = /** * @param {?} url * @param {?=} options * @return {?} */ function (url, options) { var _this = this; /** @type {?} */ var observeParameter = 'body'; /** @type {?} */ var requestHeader = this.setHeaders(options ? options.headers : undefined); if (options) { observeParameter = options.observe ? options.observe : 'body'; } return this.http.delete(url, { headers: requestHeader, observe: observeParameter }).pipe(map(function (res) { return res; }), catchError(function (error) { return _this.handleServerError(error, url, METHODS.DELETE, options); })); }; /** * @param {?} url * @param {?} body * @param {?=} options * @return {?} */ JwtAuthenticationService.prototype.jwtAuthPatch = /** * @param {?} url * @param {?} body * @param {?=} options * @return {?} */ function (url, body, options) { var _this = this; /** @type {?} */ var observeParameter = 'body'; /** @type {?} */ var requestHeader = this.setHeaders(options ? options.headers : undefined); if (options) { observeParameter = options.observe ? options.observe : 'body'; } return this.http.patch(url, body, { headers: requestHeader, observe: observeParameter }).pipe(map(function (res) { return res; }), catchError(function (error) { return _this.handleServerError(error, url, METHODS.PATCH, body, options); })); }; /** * @param {?} error * @param {?} url * @param {?} method * @param {?=} body * @param {?=} options * @return {?} */ JwtAuthenticationService.prototype.handleServerError = /** * @param {?} error * @param {?} url * @param {?} method * @param {?=} body * @param {?=} options * @return {?} */ function (error, url, method, body, options) { var _this = this; /** @type {?} */ var observeParameter = 'body'; if (options) { observeParameter = options.observe ? options.observe : 'body'; } if (this.libraryConfig.refreshUrl) { if (error.status === this.libraryConfig.errorStatusCode) { return this.getToken() .pipe(switchMap(function (data) { _this.cookie.set(_this.libraryConfig.accessTokenKey, data[_this.libraryConfig.accessTokenKey]); _this.cookie.set(_this.libraryConfig.expiresInKey, data[_this.libraryConfig.expiresInKey]); switch (method) { case METHODS.GET: return _this.http.get(url, { headers: _this.setHeaders(options ? options.headers : undefined), observe: observeParameter }).pipe(map(function (res) { return res; })); case METHODS.POST: return _this.http.post(url, JSON.stringify(body), { headers: _this.setHeaders(options ? options.headers : undefined), observe: observeParameter }).pipe(map(function (res) { return res; })); case METHODS.PUT: return _this.http.put(url, JSON.stringify(body), { headers: _this.setHeaders(options ? options.headers : undefined), observe: observeParameter }).pipe(map(function (res) { return res; })); case METHODS.DELETE: return _this.http.delete(url, { headers: _this.setHeaders(options ? options.headers : undefined), observe: observeParameter }).pipe(map(function (res) { return res; })); case METHODS.PATCH: return _this.http.patch(url, { headers: _this.setHeaders(options ? options.headers : undefined), observe: observeParameter }).pipe(map(function (res) { return res; })); } })); } } return throwError(error || 'Server error'); }; /** * @return {?} */ JwtAuthenticationService.prototype.getToken = /** * @return {?} */ function () { /** @type {?} */ var data; data = {}; data[this.libraryConfig.accessTokenKey] = this.cookie.get(this.libraryConfig.accessTokenKey); data[this.libraryConfig.refreshTokenKey] = this.cookie.get(this.libraryConfig.refreshTokenKey); data[this.libraryConfig.expiresInKey] = this.cookie.get(this.libraryConfig.expiresInKey); return this.refreshToken(this.libraryConfig.refreshUrl, data); }; /** * @param {?} url * @param {?} data * @return {?} */ JwtAuthenticationService.prototype.refreshToken = /** * @param {?} url * @param {?} data * @return {?} */ function (url, data) { /** @type {?} */ var headers = new HttpHeaders() .set(this.libraryConfig.contentTypeKeyName, this.libraryConfig.contentType) .set(this.libraryConfig.headerKeyName, this.libraryConfig.authorizationSchema + " " + this.cookie.get(this.libraryConfig.accessTokenKey)); /** @type {?} */ var observeParameter = this.libraryConfig.jwtResponse ? this.libraryConfig.jwtResponse : 'body'; return this.http.post(url, JSON.stringify(data), { headers: headers, observe: observeParameter }).pipe(map(function (res) { return res; })); }; /** * @param {?} accessToken * @param {?} refreshToken * @param {?} expiresIn * @return {?} */ JwtAuthenticationService.prototype.saveJwtToken = /** * @param {?} accessToken * @param {?} refreshToken * @param {?} expiresIn * @return {?} */ function (accessToken, refreshToken, expiresIn) { this.cookie.set(this.libraryConfig.accessTokenKey, accessToken); this.cookie.set(this.libraryConfig.refreshTokenKey, refreshToken); this.cookie.set(this.libraryConfig.expiresInKey, expiresIn); }; /** * @return {?} */ JwtAuthenticationService.prototype.clearJwtTokens = /** * @return {?} */ function () { this.cookie.delete(this.libraryConfig.accessTokenKey); this.cookie.delete(this.libraryConfig.refreshTokenKey); this.cookie.delete(this.libraryConfig.expiresInKey); }; JwtAuthenticationService.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] }, ]; /** @nocollapse */ JwtAuthenticationService.ctorParameters = function () { return [ { type: HttpClient }, { type: CookieService }, { type: Config, decorators: [{ type: Inject, args: ['config',] }] } ]; }; /** @nocollapse */ JwtAuthenticationService.ngInjectableDef = i0.defineInjectable({ factory: function JwtAuthenticationService_Factory() { return new JwtAuthenticationService(i0.inject(i1.HttpClient), i0.inject(i2.CookieService), i0.inject("config")); }, token: JwtAuthenticationService, providedIn: "root" }); return JwtAuthenticationService; }()); export { JwtAuthenticationService }; if (false) { /** @type {?} */ JwtAuthenticationService.prototype.libraryConfig; /** @type {?} */ JwtAuthenticationService.prototype.http; /** @type {?} */ JwtAuthenticationService.prototype.cookie; /** @type {?} */ JwtAuthenticationService.prototype.config; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1qd3Quc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bjb2RhZ2xvYmFsL25nLWp3dC1hdXRoZW50aWNhdGlvbi8iLCJzb3VyY2VzIjpbImxpYi9hbmd1bGFyLWp3dC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBbUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbkQsT0FBTyxFQUFjLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM5QyxPQUFPLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7Ozs7SUFTbEUsa0NBQW9CLElBQWdCLEVBQVUsTUFBcUIsRUFBNEIsTUFBYztRQUF6RixTQUFJLEdBQUosSUFBSSxDQUFZO1FBQVUsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQUE0QixXQUFNLEdBQU4sTUFBTSxDQUFROzZCQUZyRixJQUFJLE1BQU0sRUFBRTtRQUdsQyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDO1FBQzlFLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxJQUFJLFFBQVEsQ0FBQyxhQUFhLENBQUM7UUFDdkYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLElBQUksUUFBUSxDQUFDLGNBQWMsQ0FBQztRQUMxRixJQUFJLENBQUMs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TSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQztLQUM3RDs7OztJQUVELGlEQUFjOzs7SUFBZDtRQUNFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO0tBQ3JEOztnQkF0TEYsVUFBVSxTQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7OztnQkFSUSxVQUFVO2dCQUNWLGFBQWE7Z0JBR0osTUFBTSx1QkFTZ0QsTUFBTSxTQUFDLFFBQVE7OzttQ0FkdkY7O1NBVWEsd0JBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycywgSHR0cEVycm9yUmVzcG9uc2UsIEh0dHBSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IENvb2tpZVNlcnZpY2UgfSBmcm9tICduZ3gtY29va2llLXNlcnZpY2UnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBjYXRjaEVycm9yLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBNRVRIT0RTLCBDb25maWcsIERFRkFVTFRTIH0gZnJvbSAnLi9hbmd1bGFyLWp3dC5jb25zdGFudHMnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBKd3RBdXRoZW50aWNhdGlvblNlcnZpY2Uge1xuXG4gIGxpYnJhcnlDb25maWc6IENvbmZpZyA9IG5ldyBDb25maWcoKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsIHByaXZhdGUgY29va2llOiBDb29raWVTZXJ2aWNlLCBASW5qZWN0KCdjb25maWcnKSBwcml2YXRlIGNvbmZpZzogQ29uZmlnKSB7XG4gICAgdGhpcy5saWJyYXJ5Q29uZmlnLnJlZnJlc2hVcmwgPSB0aGlzLmNvbmZpZy5yZWZyZXNoVXJsIHx8IERFRkFVTFRTLnJlZnJlc2hVcmw7XG4gICAgdGhpcy5saWJyYXJ5Q29uZmlnLmhlYWRlcktleU5hbWUgPSB0aGlzLmNvbmZpZy5oZWFkZXJLZXlOYW1lIHx8IERFRkFVTFRTLmhlYWRlcktleU5hbWU7XG4gICAgdGhpcy5saWJyYXJ5Q29uZmlnLmFjY2Vzc1Rva2VuS2V5ID0gdGhpcy5jb25maWcuYWNjZXNzVG9rZW5LZXkgfHwgREVGQVVMVFMuYWNjZXNzVG9rZW5LZXk7XG4gICAgdGhpcy5saWJyYXJ5Q29uZmlnLnJlZnJlc2hUb2tlbktleSA9IHRoaXMuY29uZmlnLnJlZnJlc2hUb2tlbktleSB8fCBERUZBVUxUUy5yZWZyZXNoVG9rZW5LZXk7XG4gICAgdGhpcy5saWJyYXJ5Q29uZmlnLmV4cGlyZXNJbktleSA9IHRoaXMuY29uZmlnLmV4cGlyZXNJbktleSB8fCBERUZBVUxUUy5leHBpcmVzSW5LZXk7XG4gICAgdGhpcy5saWJyYXJ5Q29uZmlnLmVycm9yU3RhdHVzQ29kZSA9IHRoaXMuY29uZmlnLmVycm9yU3RhdHVzQ29kZSB8fCBERUZBVUxUUy5lcnJvclN0YXR1c0NvZGU7XG4gICAgdGhpcy5saWJyYXJ5Q29uZmlnLmF1dGhvcml6YXRpb25TY2hlbWEgPSB0aGlzLmNvbmZpZy5hdXRob3JpemF0aW9uU2NoZW1hIHx8IERFRkFVTFRTLmF1dGhvcml6YXRpb25TY2hlbWE7XG4gICAgdGhpcy5saWJyYXJ5Q29uZmlnLmNvbnRlbnRUeXBlS2V5TmFtZSA9IERFRkFVTFRTLmNvbnRlbnRUeXBlS2V5TmFtZTtcbiAgICB0aGlzLmxpYnJhcnlDb25maWcuY29udGVudFR5cGUgPSBERUZBVUxUUy5jb250ZW50VHlwZTtcbiAgICB0aGlzLmxpYnJhcnlDb25maWcuand0UmVzcG9uc2UgPSB0aGlzLmNvbmZpZy5qd3RSZXNwb25zZSB8fCBERUZBVUxUUy5qd3RSZXNwb25zZTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0SGVhZGVycyhjdXN0b21IZWFkZXJzOiBIdHRwSGVhZGVycykge1xuICAgIGxldCBoZWFkZXJzOiBIdHRwSGVhZGVycztcbiAgICAvKipcbiAgICAgKiBJZiBjdXN0b20gaGVhZGVyIGF2YWlsYWJsZSBhcHBlbmQgdGhlIEF1dGhvcml6YXRpb24gaGVhZGVyLFxuICAgICAqIE90aGVyd2lzZSBjcmVhdGluZyB0aGUgIGhlYWRlciB3aXRoIEF1dGhvcml6YXRpb24gYW5kIGRlZmF1bHQgQ29udGVudCB0eXBlXG4gICAgICovXG4gICAgaWYgKGN1c3RvbUhlYWRlcnMpIHtcbiAgICAgIGhlYWRlcnMgPSBjdXN0b21IZWFkZXJzO1xuICAgIH0gZWxzZSB7XG4gICAgICBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XG4gICAgfVxuICAgIGlmICghaGVhZGVycy5oYXModGhpcy5saWJyYXJ5Q29uZmlnLmNvbnRlbnRUeXBlS2V5TmFtZSkpIHtcbiAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCh0aGlzLmxpYnJhcnlDb25maWcuY29udGVudFR5cGVLZXlOYW1lLCB0aGlzLmxpYnJhcnlDb25maWcuY29udGVudFR5cGUpO1xuICAgIH1cbiAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQodGhpcy5saWJyYXJ5Q29uZmlnLmhlYWRlcktleU5hbWUsXG4gICAgICBgJHt0aGlzLmxpYnJhcnlDb25maWcuYXV0aG9yaXphdGlvblNjaGVtYX0gJHt0aGlzLmNvb2tpZS5nZXQodGhpcy5saWJyYXJ5Q29uZmlnLmFjY2Vzc1Rva2VuS2V5KX1gKTtcbiAgICByZXR1cm4gaGVhZGVycztcbiAgfVxuXG4gIGp3dEF1dGhHZXQodXJsOiBzdHJpbmcsIG9wdGlvbnM/OiB7IGhlYWRlcnM/OiBIdHRwSGVhZGVycywgb2JzZXJ2ZT86IGFueSB9KSB7XG4gICAgbGV0IG9ic2VydmVQYXJhbWV0ZXI6IGFueSA9ICdib2R5JztcbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyOiBIdHRwSGVhZGVycyA9IHRoaXMuc2V0SGVhZGVycyhvcHRpb25zID8gb3B0aW9ucy5oZWFkZXJzIDogdW5kZWZpbmVkKTtcbiAgICBpZiAob3B0aW9ucykge1xuICAgICAgb2JzZXJ2ZVBhcmFtZXRlciA9IG9wdGlvbnMub2JzZXJ2ZSA/IG9wdGlvbnMub2JzZXJ2ZSA6ICdib2R5JztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodXJsLCB7XG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVyLFxuICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZVBhcmFtZXRlclxuICAgIH0pLnBpcGUobWFwKChyZXM6IGFueSkgPT4gcmVzKSwgY2F0Y2hFcnJvcihcbiAgICAgIChlcnJvcikgPT4gdGhpcy5oYW5kbGVTZXJ2ZXJFcnJvcihcbiAgICAgICAgZXJyb3IsIHVybCwgTUVUSE9EUy5HRVQsIG9wdGlvbnMpKSk7XG5cbiAgfVxuXG4gIGp3dEF1dGhQb3N0KHVybDogc3RyaW5nLCBib2R5OiBhbnksIG9wdGlvbnM/OiB7IGhlYWRlcnM/OiBIdHRwSGVhZGVycywgb2JzZXJ2ZT86IGFueSB9KSB7XG4gICAgbGV0IG9ic2VydmVQYXJhbWV0ZXI6IGFueSA9ICdib2R5JztcbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyOiBIdHRwSGVhZGVycyA9IHRoaXMuc2V0SGVhZGVycyhvcHRpb25zID8gb3B0aW9ucy5oZWFkZXJzIDogdW5kZWZpbmVkKTtcbiAgICBpZiAob3B0aW9ucykge1xuICAgICAgb2JzZXJ2ZVBhcmFtZXRlciA9IG9wdGlvbnMub2JzZXJ2ZSA/IG9wdGlvbnMub2JzZXJ2ZSA6ICdib2R5JztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KHVybCwgYm9keSwge1xuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcixcbiAgICAgIG9ic2VydmU6IG9ic2VydmVQYXJhbWV0ZXJcbiAgICB9KS5waXBlKFxuICAgICAgbWFwKChyZXM6IEh0dHBSZXNwb25zZTxhbnk+KSA9PiByZXMpLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHRoaXMuaGFuZGxlU2VydmVyRXJyb3IoXG4gICAgICAgIGVycm9yLCB1cmwsIE1FVEhPRFMuUE9TVCwgYm9keSwgb3B0aW9ucykpKTtcblxuICB9XG5cbiAgand0QXV0aFB1dCh1cmw6IHN0cmluZywgYm9keTogYW55LCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMsIG9ic2VydmU/OiBhbnkgfSkge1xuICAgIGxldCBvYnNlcnZlUGFyYW1ldGVyOiBhbnkgPSAnYm9keSc7XG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcjogSHR0cEhlYWRlcnMgPSB0aGlzLnNldEhlYWRlcnMob3B0aW9ucyA/IG9wdGlvbnMuaGVhZGVycyA6IHVuZGVmaW5lZCk7XG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgIG9ic2VydmVQYXJhbWV0ZXIgPSBvcHRpb25zLm9ic2VydmUgPyBvcHRpb25zLm9ic2VydmUgOiAnYm9keSc7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmh0dHAucHV0KHVybCwgYm9keSwge1xuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcixcbiAgICAgIG9ic2VydmU6IG9ic2VydmVQYXJhbWV0ZXJcbiAgICB9KS5waXBlKG1hcCgocmVzOiBhbnkpID0+IHJlcyksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4gdGhpcy5oYW5kbGVTZXJ2ZXJFcnJvcihcbiAgICAgICAgZXJyb3IsIHVybCwgTUVUSE9EUy5QVVQsIGJvZHksIG9wdGlvbnMpKSk7XG5cbiAgfVxuXG4gIGp3dEF1dGhEZWxldGUodXJsOiBzdHJpbmcsIG9wdGlvbnM/OiB7IGhlYWRlcnM/OiBIdHRwSGVhZGVycywgb2JzZXJ2ZT86IGFueSB9KSB7XG4gICAgbGV0IG9ic2VydmVQYXJhbWV0ZXI6IGFueSA9ICdib2R5JztcbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyOiBIdHRwSGVhZGVycyA9IHRoaXMuc2V0SGVhZGVycyhvcHRpb25zID8gb3B0aW9ucy5oZWFkZXJzIDogdW5kZWZpbmVkKTtcbiAgICBpZiAob3B0aW9ucykge1xuICAgICAgb2JzZXJ2ZVBhcmFtZXRlciA9IG9wdGlvbnMub2JzZXJ2ZSA/IG9wdGlvbnMub2JzZXJ2ZSA6ICdib2R5JztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGUodXJsLCB7XG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVyLFxuICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZVBhcmFtZXRlclxuICAgIH0pLnBpcGUobWFwKChyZXM6IGFueSkgPT4gcmVzKSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB0aGlzLmhhbmRsZVNlcnZlckVycm9yKFxuICAgICAgICBlcnJvciwgdXJsLCBNRVRIT0RTLkRFTEVURSwgb3B0aW9ucykpKTtcbiAgfVxuXG4gIGp3dEF1dGhQYXRjaCh1cmw6IHN0cmluZywgYm9keTogYW55LCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMsIG9ic2VydmU/OiBhbnkgfSkge1xuICAgIGxldCBvYnNlcnZlUGFyYW1ldGVyOiBhbnkgPSAnYm9keSc7XG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcjogSHR0cEhlYWRlcnMgPSB0aGlzLnNldEhlYWRlcnMob3B0aW9ucyA/IG9wdGlvbnMuaGVhZGVycyA6IHVuZGVmaW5lZCk7XG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgIG9ic2VydmVQYXJhbWV0ZXIgPSBvcHRpb25zLm9ic2VydmUgPyBvcHRpb25zLm9ic2VydmUgOiAnYm9keSc7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmh0dHAucGF0Y2godXJsLCBib2R5LCB7XG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVyLFxuICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZVBhcmFtZXRlclxuICAgIH0pLnBpcGUobWFwKChyZXM6IGFueSkgPT4gcmVzKSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB0aGlzLmhhbmRsZVNlcnZlckVycm9yKFxuICAgICAgICBlcnJvciwgdXJsLCBNRVRIT0RTLlBBVENILCBib2R5LCBvcHRpb25zKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVTZXJ2ZXJFcnJvcihlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UsIHVybDogc3RyaW5nLCBtZXRob2Q6IHN0cmluZywgYm9keT86IGFueSxcbiAgICBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnM7IG9ic2VydmU/OiBhbnkgfSkge1xuICAgIGxldCBvYnNlcnZlUGFyYW1ldGVyOiBhbnkgPSAnYm9keSc7XG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgIG9ic2VydmVQYXJhbWV0ZXIgPSBvcHRpb25zLm9ic2VydmUgPyBvcHRpb25zLm9ic2VydmUgOiAnYm9keSc7XG4gICAgfVxuICAgIGlmICh0aGlzLmxpYnJhcnlDb25maWcucmVmcmVzaFVybCkge1xuICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PT0gdGhpcy5saWJyYXJ5Q29uZmlnLmVycm9yU3RhdHVzQ29kZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRUb2tlbigpXG4gICAgICAgICAgLnBpcGUoc3dpdGNoTWFwKGRhdGEgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb29raWUuc2V0KHRoaXMubGlicmFyeUNvbmZpZy5hY2Nlc3NUb2tlbktleSwgZGF0YVt0aGlzLmxpYnJhcnlDb25maWcuYWNjZXNzVG9rZW5LZXldKTtcbiAgICAgICAgICAgIHRoaXMuY29va2llLnNldCh0aGlzLmxpYnJhcnlDb25maWcuZXhwaXJlc0luS2V5LCBkYXRhW3RoaXMubGlicmFyeUNvbmZpZy5leHBpcmVzSW5LZXldKTtcbiAgICAgICAgICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICAgICAgICAgIGNhc2UgTUVUSE9EUy5HRVQ6IHJldHVybiB0aGlzLmh0dHAuZ2V0KHVybCxcbiAgICAgICAgICAgICAgICB7IGhlYWRlcnM6IHRoaXMuc2V0SGVhZGVycyhvcHRpb25zID8gb3B0aW9ucy5oZWFkZXJzIDogdW5kZWZpbmVkKSxcbiAgICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmVQYXJhbWV0ZXIgfSkucGlwZShtYXAoKHJlczogYW55KSA9PiByZXMpKTtcbiAgICAgICAgICAgICAgY2FzZSBNRVRIT0RTLlBPU1Q6IHJldHVybiB0aGlzLmh0dHAucG9zdCh1cmwsIEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgICAgICAgICAgICAgIHsgaGVhZGVyczogdGhpcy5zZXRIZWFkZXJzKG9wdGlvbnMgPyBvcHRpb25zLmhlYWRlcnMgOiB1bmRlZmluZWQpLFxuICAgICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZVBhcmFtZXRlciB9KS5waXBlKG1hcCgocmVzOiBhbnkpID0+IHJlcykpO1xuICAgICAgICAgICAgICBjYXNlIE1FVEhPRFMuUFVUOiByZXR1cm4gdGhpcy5odHRwLnB1dCh1cmwsIEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgICAgICAgICAgICAgIHsgaGVhZGVyczogdGhpcy5zZXRIZWFkZXJzKG9wdGlvbnMgPyBvcHRpb25zLmhlYWRlcnMgOiB1bmRlZmluZWQpLFxuICAgICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZVBhcmFtZXRlciB9KS5waXBlKG1hcCgocmVzOiBhbnkpID0+IHJlcykpO1xuICAgICAgICAgICAgICBjYXNlIE1FVEhPRFMuREVMRVRFOiByZXR1cm4gdGhpcy5odHRwLmRlbGV0ZSh1cmwsXG4gICAgICAgICAgICAgICAgeyBoZWFkZXJzOiB0aGlzLnNldEhlYWRlcnMob3B0aW9ucyA/IG9wdGlvbnMuaGVhZGVycyA6IHVuZGVmaW5lZCksXG4gICAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlUGFyYW1ldGVyIH0pLnBpcGUobWFwKChyZXM6IGFueSkgPT4gcmVzKSk7XG4gICAgICAgICAgICAgIGNhc2UgTUVUSE9EUy5QQVRDSDogcmV0dXJuIHRoaXMuaHR0cC5wYXRjaCh1cmwsXG4gICAgICAgICAgICAgICAgeyBoZWFkZXJzOiB0aGlzLnNldEhlYWRlcnMob3B0aW9ucyA/IG9wdGlvbnMuaGVhZGVycyA6IHVuZGVmaW5lZCksXG4gICAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlUGFyYW1ldGVyIH0pLnBpcGUobWFwKChyZXM6IGFueSkgPT4gcmVzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkpO1xuXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRocm93RXJyb3IoZXJyb3IgfHwgJ1NlcnZlciBlcnJvcicpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUb2tlbigpIHtcbiAgICBsZXQgZGF0YTtcbiAgICBkYXRhID0ge307XG4gICAgZGF0YVt0aGlzLmxpYnJhcnlDb25maWcuYWNjZXNzVG9rZW5LZXldID0gdGhpcy5jb29raWUuZ2V0KHRoaXMubGlicmFyeUNvbmZpZy5hY2Nlc3NUb2tlbktleSk7XG4gICAgZGF0YVt0aGlzLmxpYnJhcnlDb25maWcucmVmcmVzaFRva2VuS2V5XSA9IHRoaXMuY29va2llLmdldCh0aGlzLmxpYnJhcnlDb25maWcucmVmcmVzaFRva2VuS2V5KTtcbiAgICBkYXRhW3RoaXMubGlicmFyeUNvbmZpZy5leHBpcmVzSW5LZXldID0gdGhpcy5jb29raWUuZ2V0KHRoaXMubGlicmFyeUNvbmZpZy5leHBpcmVzSW5LZXkpO1xuICAgIHJldHVybiB0aGlzLnJlZnJlc2hUb2tlbih0aGlzLmxpYnJhcnlDb25maWcucmVmcmVzaFVybCwgZGF0YSk7XG4gIH1cblxuICBwcml2YXRlIHJlZnJlc2hUb2tlbih1cmwsIGRhdGEpIHtcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKClcbiAgICAgIC5zZXQodGhpcy5saWJyYXJ5Q29uZmlnLmNvbnRlbnRUeXBlS2V5TmFtZSwgdGhpcy5saWJyYXJ5Q29uZmlnLmNvbnRlbnRUeXBlKVxuICAgICAgLnNldCh0aGlzLmxpYnJhcnlDb25maWcuaGVhZGVyS2V5TmFtZSxcbiAgICAgICAgYCR7dGhpcy5saWJyYXJ5Q29uZmlnLmF1dGhvcml6YXRpb25TY2hlbWF9ICR7dGhpcy5jb29raWUuZ2V0KHRoaXMubGlicmFyeUNvbmZpZy5hY2Nlc3NUb2tlbktleSl9YCk7XG4gICAgY29uc3Qgb2JzZXJ2ZVBhcmFtZXRlcjogYW55ID0gdGhpcy5saWJyYXJ5Q29uZmlnLmp3dFJlc3BvbnNlID8gdGhpcy5saWJyYXJ5Q29uZmlnLmp3dFJlc3BvbnNlIDogJ2JvZHknO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCh1cmwsIEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICAgICAge1xuICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICBvYnNlcnZlOiBvYnNlcnZlUGFyYW1ldGVyXG4gICAgICB9KS5waXBlKG1hcCgocmVzOiBhbnkpID0+IHJlcykpO1xuICB9XG5cbiAgc2F2ZUp3dFRva2VuKGFjY2Vzc1Rva2VuLCByZWZyZXNoVG9rZW4sIGV4cGlyZXNJbikge1xuICAgIHRoaXMuY29va2llLnNldCh0aGlzLmxpYnJhcnlDb25maWcuYWNjZXNzVG9rZW5LZXksIGFjY2Vzc1Rva2VuKTtcbiAgICB0aGlzLmNvb2tpZS5zZXQodGhpcy5saWJyYXJ5Q29uZmlnLnJlZnJlc2hUb2tlbktleSwgcmVmcmVzaFRva2VuKTtcbiAgICB0aGlzLmNvb2tpZS5zZXQodGhpcy5saWJyYXJ5Q29uZmlnLmV4cGlyZXNJbktleSwgZXhwaXJlc0luKTtcbiAgfVxuXG4gIGNsZWFySnd0VG9rZW5zKCkge1xuICAgIHRoaXMuY29va2llLmRlbGV0ZSh0aGlzLmxpYnJhcnlDb25maWcuYWNjZXNzVG9rZW5LZXkpO1xuICAgIHRoaXMuY29va2llLmRlbGV0ZSh0aGlzLmxpYnJhcnlDb25maWcucmVmcmVzaFRva2VuS2V5KTtcbiAgICB0aGlzLmNvb2tpZS5kZWxldGUodGhpcy5saWJyYXJ5Q29uZmlnLmV4cGlyZXNJbktleSk7XG4gIH1cbn1cbiJdfQ==