@knora/core
Version:
Knora ui module: core
249 lines • 31.9 kB
JavaScript
import * as tslib_1 from "tslib";
import { HttpClient, HttpErrorResponse, HttpHeaders, HttpParams, HttpResponse } from '@angular/common/http';
import { Inject, Injectable } from '@angular/core';
import { KnoraApiConfig } from '@knora/api';
import { from } from 'rxjs';
import { throwError } from 'rxjs/internal/observable/throwError';
import { catchError, map } from 'rxjs/operators';
import { KnoraApiConfigToken } from '../core.module';
import { ApiServiceError } from '../declarations/api-service-error';
import { ApiServiceResult } from '../declarations/api-service-result';
import { KnoraConstants } from '../declarations/api/knora-constants';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common/http";
import * as i2 from "../core.module";
var jsonld = require('jsonld');
var semver = require('semver');
var ApiService = /** @class */ (function () {
function ApiService(http, knoraApiConfig) {
this.http = http;
this.knoraApiConfig = knoraApiConfig;
// if is loading, set it true;
// it can be used in components
// for progress loader element
this.loading = false;
}
/**
* @deprecated since v9.5.0
*
* GET
*
* @param {string} path the URL for the GET request.
* @param {HttpParams} params the parameters for the GET request.
* @returns Observable of any
*/
ApiService.prototype.httpGet = function (path, params) {
var _this = this;
this.loading = true;
var headers = this.setHeaders();
return this.http.get(this.knoraApiConfig.apiUrl + path, { headers: headers, observe: 'response', params: params }).pipe(map(function (response) {
_this.loading = false;
var result = new ApiServiceResult();
result.header = { 'server': response.headers.get('Server') };
_this.compareVersion(response.headers.get('Server'));
result.status = response.status;
result.statusText = response.statusText;
result.url = path;
result.body = response.body;
return result;
}), catchError(function (error) {
_this.loading = false;
return _this.handleRequestError(error);
}));
};
/**
* @deprecated since v9.5.0
*
* Processes JSON-LD returned by Knora.
* Expands Iris and creates an empty context object.
*
* @param {ApiServiceResult} resourceResponse
*/
ApiService.prototype.processJSONLD = function (resourceResponse) {
var resPromises = jsonld.promises;
// compact JSON-LD using an empty context: expands all Iris
var resPromise = resPromises.compact(resourceResponse.body, {});
// convert promise to Observable and return it
// https://www.learnrxjs.io/operators/creation/frompromise.html
return from(resPromise);
};
/**
* @deprecated since v9.5.0
*
* POST
*
* @param {string} path
* @param {any} body
* @returns Observable of any
*/
ApiService.prototype.httpPost = function (path, body) {
var _this = this;
this.loading = true;
var headers = this.setHeaders();
return this.http.post(this.knoraApiConfig.apiUrl + path, body, { headers: headers, observe: 'response' }).pipe(map(function (response) {
_this.loading = false;
var result = new ApiServiceResult();
result.header = { 'server': response.headers.get('Server') };
_this.compareVersion(result.header.server);
result.status = response.status;
result.statusText = response.statusText;
result.url = path;
result.body = response.body;
return result;
}), catchError(function (error) {
_this.loading = false;
// console.error(error);
return _this.handleRequestError(error);
}));
};
/**
* @deprecated since v9.5.0
*
* PUT
*
* @param {string} path
* @param {any} body
* @returns Observable of any
*/
ApiService.prototype.httpPut = function (path, body) {
var _this = this;
this.loading = true;
var headers = this.setHeaders();
return this.http.put(this.knoraApiConfig.apiUrl + path, body, { headers: headers, observe: 'response' }).pipe(map(function (response) {
_this.loading = false;
// console.log(response);
var result = new ApiServiceResult();
result.header = { 'server': response.headers.get('Server') };
_this.compareVersion(result.header.server);
result.status = response.status;
result.statusText = response.statusText;
result.url = path;
result.body = response.body;
return result;
}), catchError(function (error) {
_this.loading = false;
// console.error(error);
return _this.handleRequestError(error);
}));
};
/**
* @deprecated since v9.5.0
*
* DELETE
*
* @param {string} path
* @returns Observable of any
*/
ApiService.prototype.httpDelete = function (path) {
var _this = this;
this.loading = true;
var headers = this.setHeaders();
return this.http.delete(this.knoraApiConfig.apiUrl + path, { headers: headers, observe: 'response' }).pipe(map(function (response) {
_this.loading = false;
// console.log(response);
var result = new ApiServiceResult();
result.header = { 'server': response.headers.get('Server') };
_this.compareVersion(result.header.server);
result.status = response.status;
result.statusText = response.statusText;
result.url = path;
result.body = response.body;
return result;
}), catchError(function (error) {
_this.loading = false;
// console.error(error);
return _this.handleRequestError(error);
}));
};
/**
* handle request error in case of server error
*
* @param {HttpErrorResponse} error
* @returns Observable of ApiServiceError
*/
ApiService.prototype.handleRequestError = function (error) {
// console.error(error);
var serviceError = new ApiServiceError();
serviceError.header = { 'server': error.headers.get('Server') };
serviceError.status = error.status;
serviceError.statusText = error.statusText;
serviceError.errorInfo = error.message;
serviceError.url = error.url;
return throwError(serviceError);
};
/**
* handle json error in case of type error in json response (json2typescript)
*
* @param {any} error
* @returns Observable of ApiServiceError
*/
ApiService.prototype.handleJsonError = function (error) {
if (error instanceof ApiServiceError)
return throwError(error);
var serviceError = new ApiServiceError();
serviceError.header = { 'server': error.headers.get('Server') };
serviceError.status = -1;
serviceError.statusText = 'Invalid JSON';
serviceError.errorInfo = error;
serviceError.url = '';
return throwError(serviceError);
};
/**
* @deprecated since v9.5.0
*
* @param {string} server
*/
ApiService.prototype.compareVersion = function (server) {
// expected knora api version
var expected = KnoraConstants.KnoraVersion;
// existing knora api version
if (server) {
var versions = server.split(' ');
var existing = versions[0].split('/')[1];
// compare the two versions: expected vs existing
if (semver.diff(existing, expected) === 'major') {
console.warn('The version of the @knora/core module works with Knora v' + expected + ', but you are using it with Knora v' + existing);
}
}
else {
// console.warn('No server information from headers response');
}
};
/**
* Set headers to authorise http requests
*
* This method was replaced by interceptor. But since the implementation
* of new knora-api-js-lib services the interceptor is redundant.
* As long we not all services are replaced by knora-api-js-lib
* we have to use this setHeaders "hack" for the two services left.
*
* @returns HttpHeaders
*/
ApiService.prototype.setHeaders = function () {
var session = JSON.parse(localStorage.getItem('session'));
if (session && session !== null) {
return new HttpHeaders({
'Authorization': "Bearer " + session.user.jwt
});
}
else {
return new HttpHeaders();
}
};
ApiService.ctorParameters = function () { return [
{ type: HttpClient },
{ type: KnoraApiConfig, decorators: [{ type: Inject, args: [KnoraApiConfigToken,] }] }
]; };
ApiService.ngInjectableDef = i0.ɵɵdefineInjectable({ factory: function ApiService_Factory() { return new ApiService(i0.ɵɵinject(i1.HttpClient), i0.ɵɵinject(i2.KnoraApiConfigToken)); }, token: ApiService, providedIn: "root" });
ApiService = tslib_1.__decorate([
Injectable({
providedIn: 'root',
}),
tslib_1.__param(1, Inject(KnoraApiConfigToken)),
tslib_1.__metadata("design:paramtypes", [HttpClient,
KnoraApiConfig])
], ApiService);
return ApiService;
}());
export { ApiService };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Aa25vcmEvY29yZS8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlcy9hcGkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzVHLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDNUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU1QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDakUsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFDQUFxQyxDQUFDOzs7O0FBSXJFLElBQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUVqQyxJQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFLakM7SUFTSSxvQkFDVyxJQUFnQixFQUNjLGNBQThCO1FBRDVELFNBQUksR0FBSixJQUFJLENBQVk7UUFDYyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFUdkUsOEJBQThCO1FBQzlCLCtCQUErQjtRQUMvQiw4QkFBOEI7UUFDOUIsWUFBTyxHQUFHLEtBQUssQ0FBQztJQU9aLENBQUM7SUFFTDs7Ozs7Ozs7T0FRRztJ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SUFBSSxPQUFPLElBQUksT0FBTyxLQUFLLElBQUksRUFBRTtZQUM3QixPQUFPLElBQUksV0FBVyxDQUFDO2dCQUNuQixlQUFlLEVBQUUsWUFBVSxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUs7YUFDaEQsQ0FBQyxDQUFDO1NBQ047YUFBTTtZQUNILE9BQU8sSUFBSSxXQUFXLEVBQUUsQ0FBQztTQUM1QjtJQUNMLENBQUM7O2dCQXpRZ0IsVUFBVTtnQkFDOEIsY0FBYyx1QkFBbEUsTUFBTSxTQUFDLG1CQUFtQjs7O0lBWGIsVUFBVTtRQUgvQixVQUFVLENBQUM7WUFDUixVQUFVLEVBQUUsTUFBTTtTQUNyQixDQUFDO1FBWU8sbUJBQUEsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUE7aURBRGYsVUFBVTtZQUM4QixjQUFjO09BWHJELFVBQVUsQ0FvUi9CO3FCQTFTRDtDQTBTQyxBQXBSRCxJQW9SQztTQXBScUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlLCBIdHRwSGVhZGVycywgSHR0cFBhcmFtcywgSHR0cFJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBLbm9yYUFwaUNvbmZpZyB9IGZyb20gJ0Brbm9yYS9hcGknO1xuaW1wb3J0IHsgZnJvbSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMvaW50ZXJuYWwvT2JzZXJ2YWJsZSc7XG5pbXBvcnQgeyB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcy9pbnRlcm5hbC9vYnNlcnZhYmxlL3Rocm93RXJyb3InO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBLbm9yYUFwaUNvbmZpZ1Rva2VuIH0gZnJvbSAnLi4vY29yZS5tb2R1bGUnO1xuaW1wb3J0IHsgQXBpU2VydmljZUVycm9yIH0gZnJvbSAnLi4vZGVjbGFyYXRpb25zL2FwaS1zZXJ2aWNlLWVycm9yJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZXN1bHQgfSBmcm9tICcuLi9kZWNsYXJhdGlvbnMvYXBpLXNlcnZpY2UtcmVzdWx0JztcbmltcG9ydCB7IEtub3JhQ29uc3RhbnRzIH0gZnJvbSAnLi4vZGVjbGFyYXRpb25zL2FwaS9rbm9yYS1jb25zdGFudHMnO1xuaW1wb3J0IHsgU2Vzc2lvbiB9IGZyb20gJy4uL3Nlc3Npb24uc2VydmljZSc7XG5cbmRlY2xhcmUgbGV0IHJlcXVpcmU6IGFueTsgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNDczMDAxMC9hbmd1bGFyMi01LW1pbnV0ZS1pbnN0YWxsLWJ1Zy1yZXF1aXJlLWlzLW5vdC1kZWZpbmVkXG5jb25zdCBqc29ubGQgPSByZXF1aXJlKCdqc29ubGQnKTtcblxuY29uc3Qgc2VtdmVyID0gcmVxdWlyZSgnc2VtdmVyJyk7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFwaVNlcnZpY2Uge1xuXG4gICAgLy8gaWYgaXMgbG9hZGluZywgc2V0IGl0IHRydWU7XG4gICAgLy8gaXQgY2FuIGJlIHVzZWQgaW4gY29tcG9uZW50c1xuICAgIC8vIGZvciBwcm9ncmVzcyBsb2FkZXIgZWxlbWVudFxuICAgIGxvYWRpbmcgPSBmYWxzZTtcblxuICAgIGtub3JhQXBpVXJsOiBzdHJpbmc7XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBodHRwOiBIdHRwQ2xpZW50LFxuICAgICAgICBASW5qZWN0KEtub3JhQXBpQ29uZmlnVG9rZW4pIHByaXZhdGUga25vcmFBcGlDb25maWc6IEtub3JhQXBpQ29uZmlnXG4gICAgKSB7IH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIHY5LjUuMFxuICAgICAqXG4gICAgICogR0VUXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCB0aGUgVVJMIGZvciB0aGUgR0VUIHJlcXVlc3QuXG4gICAgICogQHBhcmFtIHtIdHRwUGFyYW1zfSBwYXJhbXMgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBHRVQgcmVxdWVzdC5cbiAgICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIG9mIGFueVxuICAgICAqL1xuICAgIGh0dHBHZXQocGF0aDogc3RyaW5nLCBwYXJhbXM/OiBIdHRwUGFyYW1zKTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLnNldEhlYWRlcnMoKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldCh0aGlzLmtub3JhQXBpQ29uZmlnLmFwaVVybCArIHBhdGgsIHsgaGVhZGVyczogaGVhZGVycywgb2JzZXJ2ZTogJ3Jlc3BvbnNlJywgcGFyYW1zOiBwYXJhbXMgfSkucGlwZShcbiAgICAgICAgICAgIG1hcCgocmVzcG9uc2U6IEh0dHBSZXNwb25zZTxhbnk+KTogQXBpU2VydmljZVJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXBpU2VydmljZVJlc3VsdCgpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5oZWFkZXIgPSB7ICdzZXJ2ZXInOiByZXNwb25zZS5oZWFkZXJzLmdldCgnU2VydmVyJykgfTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBhcmVWZXJzaW9uKHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdTZXJ2ZXInKSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgICAgICAgICByZXN1bHQuc3RhdHVzVGV4dCA9IHJlc3BvbnNlLnN0YXR1c1RleHQ7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnVybCA9IHBhdGg7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmJvZHkgPSByZXNwb25zZS5ib2R5O1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVSZXF1ZXN0RXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIHY5LjUuMFxuICAgICAqXG4gICAgICogUHJvY2Vzc2VzIEpTT04tTEQgcmV0dXJuZWQgYnkgS25vcmEuXG4gICAgICogRXhwYW5kcyBJcmlzIGFuZCBjcmVhdGVzIGFuIGVtcHR5IGNvbnRleHQgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcGlTZXJ2aWNlUmVzdWx0fSByZXNvdXJjZVJlc3BvbnNlXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NKU09OTEQocmVzb3VyY2VSZXNwb25zZTogQXBpU2VydmljZVJlc3VsdCk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICAgICAgY29uc3QgcmVzUHJvbWlzZXMgPSBqc29ubGQucHJvbWlzZXM7XG5cblxuICAgICAgICAvLyBjb21wYWN0IEpTT04tTEQgdXNpbmcgYW4gZW1wdHkgY29udGV4dDogZXhwYW5kcyBhbGwgSXJpc1xuICAgICAgICBjb25zdCByZXNQcm9taXNlID0gcmVzUHJvbWlzZXMuY29tcGFjdChyZXNvdXJjZVJlc3BvbnNlLmJvZHksIHt9KTtcblxuICAgICAgICAvLyBjb252ZXJ0IHByb21pc2UgdG8gT2JzZXJ2YWJsZSBhbmQgcmV0dXJuIGl0XG4gICAgICAgIC8vIGh0dHBzOi8vd3d3LmxlYXJucnhqcy5pby9vcGVyYXRvcnMvY3JlYXRpb24vZnJvbXByb21pc2UuaHRtbFxuICAgICAgICByZXR1cm4gZnJvbShyZXNQcm9taXNlKTtcblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIHY5LjUuMFxuICAgICAqXG4gICAgICogUE9TVFxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICAgKiBAcGFyYW0ge2FueX0gYm9keVxuICAgICAqIEByZXR1cm5zIE9ic2VydmFibGUgb2YgYW55XG4gICAgICovXG4gICAgaHR0cFBvc3QocGF0aDogc3RyaW5nLCBib2R5PzogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLnNldEhlYWRlcnMoKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QodGhpcy5rbm9yYUFwaUNvbmZpZy5hcGlVcmwgKyBwYXRoLCBib2R5LCB7IGhlYWRlcnM6IGhlYWRlcnMsIG9ic2VydmU6ICdyZXNwb25zZScgfSkucGlwZShcbiAgICAgICAgICAgIG1hcCgocmVzcG9uc2U6IEh0dHBSZXNwb25zZTxhbnk+KTogQXBpU2VydmljZVJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXBpU2VydmljZVJlc3VsdCgpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5oZWFkZXIgPSB7ICdzZXJ2ZXInOiByZXNwb25zZS5oZWFkZXJzLmdldCgnU2VydmVyJykgfTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBhcmVWZXJzaW9uKHJlc3VsdC5oZWFkZXIuc2VydmVyKTtcbiAgICAgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zdGF0dXNUZXh0ID0gcmVzcG9uc2Uuc3RhdHVzVGV4dDtcbiAgICAgICAgICAgICAgICByZXN1bHQudXJsID0gcGF0aDtcbiAgICAgICAgICAgICAgICByZXN1bHQuYm9keSA9IHJlc3BvbnNlLmJvZHk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmVycm9yKGVycm9yKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZVJlcXVlc3RFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgdjkuNS4wXG4gICAgICpcbiAgICAgKiBQVVRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAgICogQHBhcmFtIHthbnl9IGJvZHlcbiAgICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIG9mIGFueVxuICAgICAqL1xuICAgIGh0dHBQdXQocGF0aDogc3RyaW5nLCBib2R5PzogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLnNldEhlYWRlcnMoKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnB1dCh0aGlzLmtub3JhQXBpQ29uZmlnLmFwaVVybCArIHBhdGgsIGJvZHksIHsgaGVhZGVyczogaGVhZGVycywgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KS5waXBlKFxuICAgICAgICAgICAgbWFwKChyZXNwb25zZTogSHR0cFJlc3BvbnNlPGFueT4pOiBBcGlTZXJ2aWNlUmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHJlc3BvbnNlKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcGlTZXJ2aWNlUmVzdWx0KCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmhlYWRlciA9IHsgJ3NlcnZlcic6IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdTZXJ2ZXInKSB9O1xuICAgICAgICAgICAgICAgIHRoaXMuY29tcGFyZVZlcnNpb24ocmVzdWx0LmhlYWRlci5zZXJ2ZXIpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnN0YXR1c1RleHQgPSByZXNwb25zZS5zdGF0dXNUZXh0O1xuICAgICAgICAgICAgICAgIHJlc3VsdC51cmwgPSBwYXRoO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5ib2R5ID0gcmVzcG9uc2UuYm9keTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5lcnJvcihlcnJvcik7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVSZXF1ZXN0RXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSB2OS41LjBcbiAgICAgKlxuICAgICAqIERFTEVURVxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIG9mIGFueVxuICAgICAqL1xuICAgIGh0dHBEZWxldGUocGF0aDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLnNldEhlYWRlcnMoKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmRlbGV0ZSh0aGlzLmtub3JhQXBpQ29uZmlnLmFwaVVybCArIHBhdGgsIHsgaGVhZGVyczogaGVhZGVycywgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KS5waXBlKFxuICAgICAgICAgICAgbWFwKChyZXNwb25zZTogSHR0cFJlc3BvbnNlPGFueT4pOiBBcGlTZXJ2aWNlUmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHJlc3BvbnNlKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcGlTZXJ2aWNlUmVzdWx0KCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmhlYWRlciA9IHsgJ3NlcnZlcic6IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdTZXJ2ZXInKSB9O1xuICAgICAgICAgICAgICAgIHRoaXMuY29tcGFyZVZlcnNpb24ocmVzdWx0LmhlYWRlci5zZXJ2ZXIpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnN0YXR1c1RleHQgPSByZXNwb25zZS5zdGF0dXNUZXh0O1xuICAgICAgICAgICAgICAgIHJlc3VsdC51cmwgPSBwYXRoO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5ib2R5ID0gcmVzcG9uc2UuYm9keTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5lcnJvcihlcnJvcik7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVSZXF1ZXN0RXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIGhhbmRsZSByZXF1ZXN0IGVycm9yIGluIGNhc2Ugb2Ygc2VydmVyIGVycm9yXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0h0dHBFcnJvclJlc3BvbnNlfSBlcnJvclxuICAgICAqIEByZXR1cm5zIE9ic2VydmFibGUgb2YgQXBpU2VydmljZUVycm9yXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGhhbmRsZVJlcXVlc3RFcnJvcihlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpOiBPYnNlcnZhYmxlPEFwaVNlcnZpY2VFcnJvcj4ge1xuICAgICAgICAvLyBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgY29uc3Qgc2VydmljZUVycm9yID0gbmV3IEFwaVNlcnZpY2VFcnJvcigpO1xuICAgICAgICBzZXJ2aWNlRXJyb3IuaGVhZGVyID0geyAnc2VydmVyJzogZXJyb3IuaGVhZGVycy5nZXQoJ1NlcnZlcicpIH07XG4gICAgICAgIHNlcnZpY2VFcnJvci5zdGF0dXMgPSBlcnJvci5zdGF0dXM7XG4gICAgICAgIHNlcnZpY2VFcnJvci5zdGF0dXNUZXh0ID0gZXJyb3Iuc3RhdHVzVGV4dDtcbiAgICAgICAgc2VydmljZUVycm9yLmVycm9ySW5mbyA9IGVycm9yLm1lc3NhZ2U7XG4gICAgICAgIHNlcnZpY2VFcnJvci51cmwgPSBlcnJvci51cmw7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKHNlcnZpY2VFcnJvcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogaGFuZGxlIGpzb24gZXJyb3IgaW4gY2FzZSBvZiB0eXBlIGVycm9yIGluIGpzb24gcmVzcG9uc2UgKGpzb24ydHlwZXNjcmlwdClcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7YW55fSBlcnJvclxuICAgICAqIEByZXR1cm5zIE9ic2VydmFibGUgb2YgQXBpU2VydmljZUVycm9yXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGhhbmRsZUpzb25FcnJvcihlcnJvcjogYW55KTogT2JzZXJ2YWJsZTxBcGlTZXJ2aWNlRXJyb3I+IHtcblxuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBcGlTZXJ2aWNlRXJyb3IpIHJldHVybiB0aHJvd0Vycm9yKGVycm9yKTtcblxuICAgICAgICBjb25zdCBzZXJ2aWNlRXJyb3IgPSBuZXcgQXBpU2VydmljZUVycm9yKCk7XG4gICAgICAgIHNlcnZpY2VFcnJvci5oZWFkZXIgPSB7ICdzZXJ2ZXInOiBlcnJvci5oZWFkZXJzLmdldCgnU2VydmVyJykgfTtcbiAgICAgICAgc2VydmljZUVycm9yLnN0YXR1cyA9IC0xO1xuICAgICAgICBzZXJ2aWNlRXJyb3Iuc3RhdHVzVGV4dCA9ICdJbnZhbGlkIEpTT04nO1xuICAgICAgICBzZXJ2aWNlRXJyb3IuZXJyb3JJbmZvID0gZXJyb3I7XG4gICAgICAgIHNlcnZpY2VFcnJvci51cmwgPSAnJztcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3Ioc2VydmljZUVycm9yKTtcblxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSB2OS41LjBcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gc2VydmVyXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNvbXBhcmVWZXJzaW9uKHNlcnZlcjogc3RyaW5nKTogdm9pZCB7XG5cbiAgICAgICAgLy8gZXhwZWN0ZWQga25vcmEgYXBpIHZlcnNpb25cbiAgICAgICAgY29uc3QgZXhwZWN0ZWQ6IHN0cmluZyA9IEtub3JhQ29uc3RhbnRzLktub3JhVmVyc2lvbjtcblxuICAgICAgICAvLyBleGlzdGluZyBrbm9yYSBhcGkgdmVyc2lvblxuICAgICAgICBpZiAoc2VydmVyKSB7XG4gICAgICAgICAgICBjb25zdCB2ZXJzaW9uczogc3RyaW5nW10gPSBzZXJ2ZXIuc3BsaXQoJyAnKTtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nOiBzdHJpbmcgPSB2ZXJzaW9uc1swXS5zcGxpdCgnLycpWzFdO1xuXG4gICAgICAgICAgICAvLyBjb21wYXJlIHRoZSB0d28gdmVyc2lvbnM6IGV4cGVjdGVkIHZzIGV4aXN0aW5nXG4gICAgICAgICAgICBpZiAoc2VtdmVyLmRpZmYoZXhpc3RpbmcsIGV4cGVjdGVkKSA9PT0gJ21ham9yJykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignVGhlIHZlcnNpb24gb2YgdGhlIEBrbm9yYS9jb3JlIG1vZHVsZSB3b3JrcyB3aXRoIEtub3JhIHYnICsgZXhwZWN0ZWQgKyAnLCBidXQgeW91IGFyZSB1c2luZyBpdCB3aXRoIEtub3JhIHYnICsgZXhpc3RpbmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKCdObyBzZXJ2ZXIgaW5mb3JtYXRpb24gZnJvbSBoZWFkZXJzIHJlc3BvbnNlJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgaGVhZGVycyB0byBhdXRob3Jpc2UgaHR0cCByZXF1ZXN0c1xuICAgICAqXG4gICAgICogVGhpcyBtZXRob2Qgd2FzIHJlcGxhY2VkIGJ5IGludGVyY2VwdG9yLiBCdXQgc2luY2UgdGhlIGltcGxlbWVudGF0aW9uXG4gICAgICogb2YgbmV3IGtub3JhLWFwaS1qcy1saWIgc2VydmljZXMgdGhlIGludGVyY2VwdG9yIGlzIHJlZHVuZGFudC5cbiAgICAgKiBBcyBsb25nIHdlIG5vdCBhbGwgc2VydmljZXMgYXJlIHJlcGxhY2VkIGJ5IGtub3JhLWFwaS1qcy1saWJcbiAgICAgKiB3ZSBoYXZlIHRvIHVzZSB0aGlzIHNldEhlYWRlcnMgXCJoYWNrXCIgZm9yIHRoZSB0d28gc2VydmljZXMgbGVmdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEh0dHBIZWFkZXJzXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHNldEhlYWRlcnMoKTogSHR0cEhlYWRlcnMge1xuICAgICAgICBjb25zdCBzZXNzaW9uOiBTZXNzaW9uID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnc2Vzc2lvbicpKTtcblxuICAgICAgICBpZiAoc2Vzc2lvbiAmJiBzZXNzaW9uICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHtzZXNzaW9uLnVzZXIuand0fWBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBIdHRwSGVhZGVycygpO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19