UNPKG

vix-ui

Version:

298 lines 26.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { OAuthService } from 'angular-oauth2-oidc'; import { Injectable } from '@angular/core'; import * as OktaAuth from '@okta/okta-auth-js'; import { AuthConfigService } from './auth-config.service'; import { OktaService } from './okta.service'; import { UserInfo } from './user-info'; import { UserGroups } from './user-groups'; /** * VixAuthService is the interface exported to users. It wraps all API and methods. */ export class VixAuthService { /** * @param {?} oauth * @param {?} authConfig * @param {?} okta */ constructor(oauth, authConfig, okta) { this.oauth = oauth; this.authConfig = authConfig; this.okta = okta; this.oktaAuth = new OktaAuth({ url: this.authConfig.getUrl(), issuer: this.authConfig.getIssuer() }); } /** * Check permissions by userGroups and requireGroups * * @param {?} userGroups groups users are in * @param {?} requireGroups groups application requires user to have * @return {?} true/false */ static hasPermission(userGroups, requireGroups) { return userGroups.hasPermission(requireGroups); } /** * Use tokenManager to store userId * TODO: actually I have problems in create a cache object to hold all these cache variables, so I use tokenManager to do these works. * TODO: need to create a share service to provide cache service * @param {?} userId * @return {?} */ setUserId(userId) { /** @type {?} */ const obj = { accessToken: 'userId', expiresAt: Math.round((new Date()).getTime() / 1000 + 3600), scopes: [userId] }; this.oktaAuth.tokenManager.add('userId', obj); } /** * Use tokenManager to store userId * TODO: actually I have problems in create a cache object to hold all these cache variables, so I use tokenManager to do these works. * TODO: need to create a share service to provide cache service * @param {?} sessionToken * @return {?} */ setSessionToken(sessionToken) { /** @type {?} */ const obj = { accessToken: 'sessionToken', expiresAt: Math.round((new Date()).getTime() / 1000 + 3600), scopes: [sessionToken] }; this.oktaAuth.tokenManager.add('sessionToken', obj); } /** * Get userId from tokenManager * @return {?} */ getUserId() { /** @type {?} */ const userIdObj = this.oktaAuth.tokenManager.get('userId'); if (userIdObj) { return this.oktaAuth.tokenManager.get('userId').scopes[0]; } else { return null; } } /** * Get acess token * @return {?} */ getSessionToken() { /** @type {?} */ const sessionTokenObj = this.oktaAuth.tokenManager.get('sessionToken'); if (sessionTokenObj) { return this.oktaAuth.tokenManager.get('sessionToken').scopes[0]; } else { return null; } } /** * Store userGroup and shared among browsers by TokenManager with key 'userGroup' * @param {?} userGroups * @return {?} */ setCurrentUserGroups(userGroups) { /** @type {?} */ const obj = { accessToken: 'userGroups', expiresAt: Math.round((new Date()).getTime() / 1000 + 3600), scopes: userGroups.groups }; this.oktaAuth.tokenManager.add('userGroups', obj); } /** * Get stored userGroups and refresh if expires * @return {?} */ getLoginUserGroups() { return tslib_1.__awaiter(this, void 0, void 0, function* () { /** @type {?} */ const userGroupsTokenObj = this.oktaAuth.tokenManager.get('userGroups'); /** @type {?} */ const nowSecond = (new Date()).getTime() / 1000; if (!userGroupsTokenObj || nowSecond > userGroupsTokenObj.expireAt) { /** @type {?} */ const tmpUserGroups = yield this.getUserGroups(this.getUserId()); this.setCurrentUserGroups(tmpUserGroups); } /** @type {?} */ const userGroups = new UserGroups(null); userGroups.groups = this.oktaAuth.tokenManager.get('userGroups').scopes; return userGroups; }); } /** * Get current login userInfo * TODO: we can cache user info includes groups information when finished login * @return {?} */ getUserInfo() { return tslib_1.__awaiter(this, void 0, void 0, function* () { if (this.isLogin()) { /** @type {?} */ const oktaUserInfo = yield this.okta.getUserInfo(this.getUserId()); return yield new UserInfo(oktaUserInfo); } else { return Promise.reject('not login'); } }); } /** * get userGroup by given userId * @param {?} userId * @return {?} */ getUserGroups(userId) { return tslib_1.__awaiter(this, void 0, void 0, function* () { if (this.isLogin()) { try { /** @type {?} */ const oktaUserGroups = yield this.okta.getUserGroups(userId); return yield new UserGroups(oktaUserGroups); } catch (err) { console.log('getUserGroups err', err); // return new UserGroups(null); } } else { return null; } }); } /** * Return if already login by check the existence of accessToken * @return {?} */ isLogin() { return !!this.getUserId(); } /** * Redirect to url for Google login * @param {?} redirectUrl * @return {?} */ loginWithGoogle(redirectUrl) { window.location.href = `${this.authConfig.getUrl()}/oauth2/v1/authorize?` + `idp=0oadulhuz78SMW8cD0h7&client_id=${this.authConfig.getClientId()}&response_type=id_token&` + `response_mode=fragment&scope=openid&scope=email&scope=picture&scope=name&` + `state=WM6D&nonce=YsG76jo&redirect_uri=${redirectUrl}`; } /** * Login by username and password * @param {?} username * @param {?} password * @return {?} */ loginWithPassword(username, password) { return tslib_1.__awaiter(this, void 0, void 0, function* () { /** @type {?} */ const nonce = yield this.oauth.createAndSaveNonce(); /** @type {?} */ const signInResponse = yield this.oktaAuth.signIn({ username: username, password: password }); if (signInResponse.status === 'SUCCESS') { yield this.oktaAuth.token.getWithoutPrompt({ clientId: this.authConfig.getClientId(), responseType: ['id_token', 'token'], scopes: ['openid', 'profile', 'email'], sessionToken: signInResponse.sessionToken, nonce: nonce, redirectUri: window.location.origin }); /** @type {?} */ const session = yield this.getSession(); if (session.status === 'ACTIVE') { console.log('session ACTIVE'); this.setUserId(session.userId); this.setSessionToken(session.id); } return Promise.resolve('login successfully'); } else { return Promise.reject('username or password error'); } }); } /** * List all groups * @return {?} */ listGroups() { return tslib_1.__awaiter(this, void 0, void 0, function* () { return yield this.okta.listGroups(); }); } /** * Get session * @return {?} */ getSession() { return tslib_1.__awaiter(this, void 0, void 0, function* () { return yield this.oktaAuth.session.get(); }); } /** * Navigate browser to login page * @return {?} */ navigateToLoginPage() { console.log('navigateToLoginPage:', this.authConfig.getLoginUrl()); document.location.href = this.authConfig.getLoginUrl(); } /** * Navigate browser to redirect page * @return {?} */ navigateToRedirectPage() { console.log('navigateToRedirectPage:', this.authConfig.getRedirectUrl()); document.location.href = this.authConfig.getRedirectUrl(); } /** * Logout current user and clear token * @return {?} */ logout() { if (this.isLogin()) { this.oktaAuth.tokenManager.clear(); console.log('start to logout'); this.oktaAuth.signOut().then(() => { console.log('logout done, to navigate', this.authConfig.getLoginUrl()); this.navigateToLoginPage(); }); } else { } } } VixAuthService.decorators = [ { type: Injectable } ]; VixAuthService.ctorParameters = () => [ { type: OAuthService }, { type: AuthConfigService }, { type: OktaService } ]; if (false) { /** @type {?} */ VixAuthService.prototype.oktaAuth; /** @type {?} */ VixAuthService.prototype.oauth; /** @type {?} */ VixAuthService.prototype.authConfig; /** @type {?} */ VixAuthService.prototype.okta; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vdml4LXVpLyIsInNvdXJjZXMiOlsidml4LWF1dGgvYXV0aC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxLQUFLLFFBQVEsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7O0FBTTNDLE1BQU07Ozs7OztJQUdKLFlBQW9CLEtBQW1CLEVBQ25CLFVBQTZCLEVBQzdCLElBQWlCO1FBRmpCLFVBQUssR0FBTCxLQUFLLENBQWM7UUFDbkIsZUFBVSxHQUFWLFVBQVUsQ0FBbUI7UUFDN0IsU0FBSSxHQUFKLElBQUksQ0FBYTtRQUNuQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksUUFBUSxDQUFDO1lBQzNCLEdBQUcsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRTtZQUM3QixNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUU7U0FDcEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7Ozs7Ozs7SUFVRCxNQUFNLENBQUMsYUFBYSxDQUFDLFVBQXNCLEVBQUUsYUFBdUI7UUFDbEUsT0FBTyxVQUFVLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2pELENBQUM7Ozs7Ozs7O0lBT0QsU0FBUyxDQUFDLE1BQWM7O2NBQ2hCLEdBQUcsR0FBRztZQUNWLFdBQVcsRUFBRSxRQUFRO1lBQ3JCLFNB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QUEyQjs7SUFDM0Isb0NBQXFDOztJQUNyQyw4QkFBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPQXV0aFNlcnZpY2UgfSBmcm9tICdhbmd1bGFyLW9hdXRoMi1vaWRjJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCAqIGFzIE9rdGFBdXRoIGZyb20gJ0Bva3RhL29rdGEtYXV0aC1qcyc7XG5pbXBvcnQgeyBBdXRoQ29uZmlnU2VydmljZSB9IGZyb20gJy4vYXV0aC1jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBPa3RhU2VydmljZSB9IGZyb20gJy4vb2t0YS5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJJbmZvIH0gZnJvbSAnLi91c2VyLWluZm8nO1xuaW1wb3J0IHsgVXNlckdyb3VwcyB9IGZyb20gJy4vdXNlci1ncm91cHMnO1xuXG4vKipcbiAqIFZpeEF1dGhTZXJ2aWNlIGlzIHRoZSBpbnRlcmZhY2UgZXhwb3J0ZWQgdG8gdXNlcnMuIEl0IHdyYXBzIGFsbCBBUEkgYW5kIG1ldGhvZHMuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBWaXhBdXRoU2VydmljZSB7XG4gIHByaXZhdGUgb2t0YUF1dGg6IGFueTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG9hdXRoOiBPQXV0aFNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgYXV0aENvbmZpZzogQXV0aENvbmZpZ1NlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgb2t0YTogT2t0YVNlcnZpY2UpIHtcbiAgICB0aGlzLm9rdGFBdXRoID0gbmV3IE9rdGFBdXRoKHtcbiAgICAgIHVybDogdGhpcy5hdXRoQ29uZmlnLmdldFVybCgpLFxuICAgICAgaXNzdWVyOiB0aGlzLmF1dGhDb25maWcuZ2V0SXNzdWVyKClcbiAgICB9KTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIENoZWNrIHBlcm1pc3Npb25zIGJ5IHVzZXJHcm91cHMgYW5kIHJlcXVpcmVHcm91cHNcbiAgICpcbiAgICogQHBhcmFtIHVzZXJHcm91cHMgZ3JvdXBzIHVzZXJzIGFyZSBpblxuICAgKiBAcGFyYW0gcmVxdWlyZUdyb3VwcyBncm91cHMgYXBwbGljYXRpb24gcmVxdWlyZXMgdXNlciB0byBoYXZlXG4gICAqIEByZXR1cm5zIHRydWUvZmFsc2VcbiAgICovXG4gIHN0YXRpYyBoYXNQZXJtaXNzaW9uKHVzZXJHcm91cHM6IFVzZXJHcm91cHMsIHJlcXVpcmVHcm91cHM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHVzZXJHcm91cHMuaGFzUGVybWlzc2lvbihyZXF1aXJlR3JvdXBzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2UgdG9rZW5NYW5hZ2VyIHRvIHN0b3JlIHVzZXJJZFxuICAgKiBUT0RPOiBhY3R1YWxseSBJIGhhdmUgcHJvYmxlbXMgaW4gY3JlYXRlIGEgY2FjaGUgb2JqZWN0IHRvIGhvbGQgYWxsIHRoZXNlIGNhY2hlIHZhcmlhYmxlcywgc28gSSB1c2UgdG9rZW5NYW5hZ2VyIHRvIGRvIHRoZXNlIHdvcmtzLlxuICAgKiBUT0RPOiBuZWVkIHRvIGNyZWF0ZSBhIHNoYXJlIHNlcnZpY2UgdG8gcHJvdmlkZSBjYWNoZSBzZXJ2aWNlXG4gICAqL1xuICBzZXRVc2VySWQodXNlcklkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBvYmogPSB7XG4gICAgICBhY2Nlc3NUb2tlbjogJ3VzZXJJZCcsXG4gICAgICBleHBpcmVzQXQ6IE1hdGgucm91bmQoKG5ldyBEYXRlKCkpLmdldFRpbWUoKSAvIDEwMDAgKyAzNjAwKSxcbiAgICAgIHNjb3BlczogW3VzZXJJZF1cbiAgICB9O1xuICAgIHRoaXMub2t0YUF1dGgudG9rZW5NYW5hZ2VyLmFkZCgndXNlcklkJywgb2JqKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2UgdG9rZW5NYW5hZ2VyIHRvIHN0b3JlIHVzZXJJZFxuICAgKiBUT0RPOiBhY3R1YWxseSBJIGhhdmUgcHJvYmxlbXMgaW4gY3JlYXRlIGEgY2FjaGUgb2JqZWN0IHRvIGhvbGQgYWxsIHRoZXNlIGNhY2hlIHZhcmlhYmxlcywgc28gSSB1c2UgdG9rZW5NYW5hZ2VyIHRvIGRvIHRoZXNlIHdvcmtzLlxuICAgKiBUT0RPOiBuZWVkIHRvIGNyZWF0ZSBhIHNoYXJlIHNlcnZpY2UgdG8gcHJvdmlkZSBjYWNoZSBzZXJ2aWNlXG4gICAqL1xuICBzZXRTZXNzaW9uVG9rZW4oc2Vzc2lvblRva2VuOiBzdHJpbmcpIHtcbiAgICBjb25zdCBvYmogPSB7XG4gICAgICBhY2Nlc3NUb2tlbjogJ3Nlc3Npb25Ub2tlbicsXG4gICAgICBleHBpcmVzQXQ6IE1hdGgucm91bmQoKG5ldyBEYXRlKCkpLmdldFRpbWUoKSAvIDEwMDAgKyAzNjAwKSxcbiAgICAgIHNjb3BlczogW3Nlc3Npb25Ub2tlbl1cbiAgICB9O1xuICAgIHRoaXMub2t0YUF1dGgudG9rZW5NYW5hZ2VyLmFkZCgnc2Vzc2lvblRva2VuJywgb2JqKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdXNlcklkIGZyb20gdG9rZW5NYW5hZ2VyXG4gICAqL1xuICBnZXRVc2VySWQoKSB7XG4gICAgY29uc3QgdXNlcklkT2JqID0gdGhpcy5va3RhQXV0aC50b2tlbk1hbmFnZXIuZ2V0KCd1c2VySWQnKTtcbiAgICBpZiAodXNlcklkT2JqKSB7XG4gICAgICByZXR1cm4gdGhpcy5va3RhQXV0aC50b2tlbk1hbmFnZXIuZ2V0KCd1c2VySWQnKS5zY29wZXNbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgICogR2V0IGFjZXNzIHRva2VuXG4gICovXG4gIHB1YmxpYyBnZXRTZXNzaW9uVG9rZW4oKSB7XG4gICAgY29uc3Qgc2Vzc2lvblRva2VuT2JqID0gdGhpcy5va3RhQXV0aC50b2tlbk1hbmFnZXIuZ2V0KCdzZXNzaW9uVG9rZW4nKTtcbiAgICBpZiAoc2Vzc2lvblRva2VuT2JqKSB7XG4gICAgICByZXR1cm4gdGhpcy5va3RhQXV0aC50b2tlbk1hbmFnZXIuZ2V0KCdzZXNzaW9uVG9rZW4nKS5zY29wZXNbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9yZSB1c2VyR3JvdXAgYW5kIHNoYXJlZCBhbW9uZyBicm93c2VycyBieSBUb2tlbk1hbmFnZXIgd2l0aCBrZXkgJ3VzZXJHcm91cCdcbiAgICovXG4gIHNldEN1cnJlbnRVc2VyR3JvdXBzKHVzZXJHcm91cHM6IFVzZXJHcm91cHMpIHtcbiAgICBjb25zdCBvYmogPSB7XG4gICAgICBhY2Nlc3NUb2tlbjogJ3VzZXJHcm91cHMnLFxuICAgICAgZXhwaXJlc0F0OiBNYXRoLnJvdW5kKChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkgLyAxMDAwICsgMzYwMCksXG4gICAgICBzY29wZXM6IHVzZXJHcm91cHMuZ3JvdXBzXG4gICAgfTtcbiAgICB0aGlzLm9rdGFBdXRoLnRva2VuTWFuYWdlci5hZGQoJ3VzZXJHcm91cHMnLCBvYmopO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzdG9yZWQgdXNlckdyb3VwcyBhbmQgcmVmcmVzaCBpZiBleHBpcmVzXG4gICAqL1xuICBhc3luYyBnZXRMb2dpblVzZXJHcm91cHMoKTogUHJvbWlzZTxVc2VyR3JvdXBzPiB7XG4gICAgY29uc3QgdXNlckdyb3Vwc1Rva2VuT2JqID0gdGhpcy5va3RhQXV0aC50b2tlbk1hbmFnZXIuZ2V0KCd1c2VyR3JvdXBzJyk7XG4gICAgY29uc3Qgbm93U2Vjb25kID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKSAvIDEwMDA7XG4gICAgaWYgKCF1c2VyR3JvdXBzVG9rZW5PYmogfHwgbm93U2Vjb25kID4gdXNlckdyb3Vwc1Rva2VuT2JqLmV4cGlyZUF0KSB7XG4gICAgICBjb25zdCB0bXBVc2VyR3JvdXBzID0gYXdhaXQgdGhpcy5nZXRVc2VyR3JvdXBzKHRoaXMuZ2V0VXNlcklkKCkpO1xuICAgICAgdGhpcy5zZXRDdXJyZW50VXNlckdyb3Vwcyh0bXBVc2VyR3JvdXBzKTtcbiAgICB9XG4gICAgY29uc3QgdXNlckdyb3VwcyA9IG5ldyBVc2VyR3JvdXBzKG51bGwpO1xuICAgIHVzZXJHcm91cHMuZ3JvdXBzID0gdGhpcy5va3RhQXV0aC50b2tlbk1hbmFnZXIuZ2V0KCd1c2VyR3JvdXBzJykuc2NvcGVzO1xuICAgIHJldHVybiB1c2VyR3JvdXBzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IGxvZ2luIHVzZXJJbmZvXG4gICAqIFRPRE86IHdlIGNhbiBjYWNoZSB1c2VyIGluZm8gaW5jbHVkZXMgZ3JvdXBzIGluZm9ybWF0aW9uIHdoZW4gZmluaXNoZWQgbG9naW5cbiAgICovXG4gIGFzeW5jIGdldFVzZXJJbmZvKCk6IFByb21pc2U8VXNlckluZm8+IHtcbiAgICBpZiAodGhpcy5pc0xvZ2luKCkpIHtcbiAgICAgIGNvbnN0IG9rdGFVc2VySW5mbyA9IGF3YWl0IHRoaXMub2t0YS5nZXRVc2VySW5mbyh0aGlzLmdldFVzZXJJZCgpKTtcbiAgICAgIHJldHVybiBhd2FpdCBuZXcgVXNlckluZm8ob2t0YVVzZXJJbmZvKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCdub3QgbG9naW4nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZ2V0IHVzZXJHcm91cCBieSBnaXZlbiB1c2VySWRcbiAgICovXG4gIGFzeW5jIGdldFVzZXJHcm91cHModXNlcklkOiBzdHJpbmcpOiBQcm9taXNlPFVzZXJHcm91cHM+IHtcbiAgICBpZiAodGhpcy5pc0xvZ2luKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG9rdGFVc2VyR3JvdXBzID0gYXdhaXQgdGhpcy5va3RhLmdldFVzZXJHcm91cHModXNlcklkKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IG5ldyBVc2VyR3JvdXBzKG9rdGFVc2VyR3JvdXBzKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmxvZygnZ2V0VXNlckdyb3VwcyBlcnInLCBlcnIpO1xuICAgICAgICAvLyByZXR1cm4gbmV3IFVzZXJHcm91cHMobnVsbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gaWYgYWxyZWFkeSBsb2dpbiBieSBjaGVjayB0aGUgZXhpc3RlbmNlIG9mIGFjY2Vzc1Rva2VuXG4gICAqL1xuICBpc0xvZ2luKCk6IGFueSB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRVc2VySWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWRpcmVjdCB0byB1cmwgZm9yIEdvb2dsZSBsb2dpblxuICAgKi9cbiAgbG9naW5XaXRoR29vZ2xlKHJlZGlyZWN0VXJsOiBzdHJpbmcpIHtcbiAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGAke3RoaXMuYXV0aENvbmZpZy5nZXRVcmwoKX0vb2F1dGgyL3YxL2F1dGhvcml6ZT9gICtcbiAgICAgIGBpZHA9MG9hZHVsaHV6NzhTTVc4Y0QwaDcmY2xpZW50X2lkPSR7dGhpcy5hdXRoQ29uZmlnLmdldENsaWVudElkKCl9JnJlc3BvbnNlX3R5cGU9aWRfdG9rZW4mYCArXG4gICAgICBgcmVzcG9uc2VfbW9kZT1mcmFnbWVudCZzY29wZT1vcGVuaWQmc2NvcGU9ZW1haWwmc2NvcGU9cGljdHVyZSZzY29wZT1uYW1lJmAgK1xuICAgICAgYHN0YXRlPVdNNkQmbm9uY2U9WXNHNzZqbyZyZWRpcmVjdF91cmk9JHtyZWRpcmVjdFVybH1gO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ2luIGJ5IHVzZXJuYW1lIGFuZCBwYXNzd29yZFxuICAgKi9cbiAgYXN5bmMgbG9naW5XaXRoUGFzc3dvcmQodXNlcm5hbWU6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3Qgbm9uY2UgPSBhd2FpdCB0aGlzLm9hdXRoLmNyZWF0ZUFuZFNhdmVOb25jZSgpO1xuICAgIGNvbnN0IHNpZ25JblJlc3BvbnNlID0gYXdhaXQgdGhpcy5va3RhQXV0aC5zaWduSW4oe3VzZXJuYW1lOiB1c2VybmFtZSwgcGFzc3dvcmQ6IHBhc3N3b3JkfSk7XG4gICAgaWYgKHNpZ25JblJlc3BvbnNlLnN0YXR1cyA9PT0gJ1NVQ0NFU1MnKSB7XG4gICAgICBhd2FpdCB0aGlzLm9rdGFBdXRoLnRva2VuLmdldFdpdGhvdXRQcm9tcHQoe1xuICAgICAgICBjbGllbnRJZDogdGhpcy5hdXRoQ29uZmlnLmdldENsaWVudElkKCksXG4gICAgICAgIHJlc3BvbnNlVHlwZTogWydpZF90b2tlbicsICd0b2tlbiddLFxuICAgICAgICBzY29wZXM6IFsnb3BlbmlkJywgJ3Byb2ZpbGUnLCAnZW1haWwnXSxcbiAgICAgICAgc2Vzc2lvblRva2VuOiBzaWduSW5SZXNwb25zZS5zZXNzaW9uVG9rZW4sXG4gICAgICAgIG5vbmNlOiBub25jZSxcbiAgICAgICAgcmVkaXJlY3RVcmk6IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW5cbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHRoaXMuZ2V0U2Vzc2lvbigpO1xuICAgICAgaWYgKHNlc3Npb24uc3RhdHVzID09PSAnQUNUSVZFJykge1xuICAgICAgICBjb25zb2xlLmxvZygnc2Vzc2lvbiBBQ1RJVkUnKTtcbiAgICAgICAgdGhpcy5zZXRVc2VySWQoc2Vzc2lvbi51c2VySWQpO1xuICAgICAgICB0aGlzLnNldFNlc3Npb25Ub2tlbihzZXNzaW9uLmlkKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoJ2xvZ2luIHN1Y2Nlc3NmdWxseScpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ3VzZXJuYW1lIG9yIHBhc3N3b3JkIGVycm9yJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgYWxsIGdyb3Vwc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGxpc3RHcm91cHMoKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMub2t0YS5saXN0R3JvdXBzKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlc3Npb25cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRTZXNzaW9uKCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLm9rdGFBdXRoLnNlc3Npb24uZ2V0KCk7XG4gIH1cblxuICAvKipcbiAgICogTmF2aWdhdGUgYnJvd3NlciB0byBsb2dpbiBwYWdlXG4gICAqL1xuICBwdWJsaWMgbmF2aWdhdGVUb0xvZ2luUGFnZSgpIHtcbiAgICBjb25zb2xlLmxvZygnbmF2aWdhdGVUb0xvZ2luUGFnZTonLCB0aGlzLmF1dGhDb25maWcuZ2V0TG9naW5VcmwoKSk7XG4gICAgZG9jdW1lbnQubG9jYXRpb24uaHJlZiA9IHRoaXMuYXV0aENvbmZpZy5nZXRMb2dpblVybCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE5hdmlnYXRlIGJyb3dzZXIgdG8gcmVkaXJlY3QgcGFnZVxuICAgKi9cbiAgbmF2aWdhdGVUb1JlZGlyZWN0UGFnZSgpIHtcbiAgICBjb25zb2xlLmxvZygnbmF2aWdhdGVUb1JlZGlyZWN0UGFnZTonLCB0aGlzLmF1dGhDb25maWcuZ2V0UmVkaXJlY3RVcmwoKSk7XG4gICAgZG9jdW1lbnQubG9jYXRpb24uaHJlZiA9IHRoaXMuYXV0aENvbmZpZy5nZXRSZWRpcmVjdFVybCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ291dCBjdXJyZW50IHVzZXIgYW5kIGNsZWFyIHRva2VuXG4gICAqL1xuICBsb2dvdXQoKSB7XG4gICAgaWYgKHRoaXMuaXNMb2dpbigpKSB7XG4gICAgICB0aGlzLm9rdGFBdXRoLnRva2VuTWFuYWdlci5jbGVhcigpO1xuICAgICAgY29uc29sZS5sb2coJ3N0YXJ0IHRvIGxvZ291dCcpO1xuICAgICAgdGhpcy5va3RhQXV0aC5zaWduT3V0KCkudGhlbigoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdsb2dvdXQgZG9uZSwgdG8gbmF2aWdhdGUnLCB0aGlzLmF1dGhDb25maWcuZ2V0TG9naW5VcmwoKSk7XG4gICAgICAgIHRoaXMubmF2aWdhdGVUb0xvZ2luUGFnZSgpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICB9XG4gIH1cbn1cbiJdfQ==