vix-ui
Version:
298 lines • 26.8 kB
JavaScript
/**
* @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==