UNPKG

@knora/core

Version:
244 lines 31.3 kB
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"; const jsonld = require('jsonld'); const semver = require('semver'); let ApiService = class ApiService { constructor(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 */ httpGet(path, params) { this.loading = true; const headers = this.setHeaders(); return this.http.get(this.knoraApiConfig.apiUrl + path, { headers: headers, observe: 'response', params: params }).pipe(map((response) => { this.loading = false; const 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((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 */ processJSONLD(resourceResponse) { const resPromises = jsonld.promises; // compact JSON-LD using an empty context: expands all Iris const 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 */ httpPost(path, body) { this.loading = true; const headers = this.setHeaders(); return this.http.post(this.knoraApiConfig.apiUrl + path, body, { headers: headers, observe: 'response' }).pipe(map((response) => { this.loading = false; const 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((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 */ httpPut(path, body) { this.loading = true; const headers = this.setHeaders(); return this.http.put(this.knoraApiConfig.apiUrl + path, body, { headers: headers, observe: 'response' }).pipe(map((response) => { this.loading = false; // console.log(response); const 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((error) => { this.loading = false; // console.error(error); return this.handleRequestError(error); })); } /** * @deprecated since v9.5.0 * * DELETE * * @param {string} path * @returns Observable of any */ httpDelete(path) { this.loading = true; const headers = this.setHeaders(); return this.http.delete(this.knoraApiConfig.apiUrl + path, { headers: headers, observe: 'response' }).pipe(map((response) => { this.loading = false; // console.log(response); const 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((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 */ handleRequestError(error) { // console.error(error); const 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 */ handleJsonError(error) { if (error instanceof ApiServiceError) return throwError(error); const 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 */ compareVersion(server) { // expected knora api version const expected = KnoraConstants.KnoraVersion; // existing knora api version if (server) { const versions = server.split(' '); const 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 */ setHeaders() { const session = JSON.parse(localStorage.getItem('session')); if (session && session !== null) { return new HttpHeaders({ 'Authorization': `Bearer ${session.user.jwt}` }); } else { return new HttpHeaders(); } } }; ApiService.ctorParameters = () => [ { 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); export { ApiService }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Aa25vcmEvY29yZS8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlcy9hcGkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzVHLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDNUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU1QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDakUsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFDQUFxQyxDQUFDOzs7O0FBSXJFLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUVqQyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFLakMsSUFBc0IsVUFBVSxHQUFoQyxNQUFzQixVQUFVO0lBUzVCLFlBQ1csSUFBZ0IsRUFDYyxjQUE4QjtRQUQ1RCxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2MsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBVHZFLDhCQUE4QjtRQUM5QiwrQkFBK0I7UUFDL0IsOEJBQThCO1FBQzlCLFlBQU8sR0FBRyxLQUFLLENBQUM7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QUFJLE9BQU8sSUFBSSxPQUFPLEtBQUssSUFBSSxFQUFFO1lBQzdCLE9BQU8sSUFBSSxXQUFXLENBQUM7Z0JBQ25CLGVBQWUsRUFBRSxVQUFVLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO2FBQ2hELENBQUMsQ0FBQztTQUNOO2FBQU07WUFDSCxPQUFPLElBQUksV0FBVyxFQUFFLENBQUM7U0FDNUI7SUFDTCxDQUFDO0NBQ0osQ0FBQTs7WUExUW9CLFVBQVU7WUFDOEIsY0FBYyx1QkFBbEUsTUFBTSxTQUFDLG1CQUFtQjs7O0FBWGIsVUFBVTtJQUgvQixVQUFVLENBQUM7UUFDUixVQUFVLEVBQUUsTUFBTTtLQUNyQixDQUFDO0lBWU8sbUJBQUEsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUE7NkNBRGYsVUFBVTtRQUM4QixjQUFjO0dBWHJELFVBQVUsQ0FvUi9CO1NBcFJxQixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEVycm9yUmVzcG9uc2UsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zLCBIdHRwUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEtub3JhQXBpQ29uZmlnIH0gZnJvbSAnQGtub3JhL2FwaSc7XG5pbXBvcnQgeyBmcm9tIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcy9pbnRlcm5hbC9PYnNlcnZhYmxlJztcbmltcG9ydCB7IHRocm93RXJyb3IgfSBmcm9tICdyeGpzL2ludGVybmFsL29ic2VydmFibGUvdGhyb3dFcnJvcic7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IEtub3JhQXBpQ29uZmlnVG9rZW4gfSBmcm9tICcuLi9jb3JlLm1vZHVsZSc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlRXJyb3IgfSBmcm9tICcuLi9kZWNsYXJhdGlvbnMvYXBpLXNlcnZpY2UtZXJyb3InO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlc3VsdCB9IGZyb20gJy4uL2RlY2xhcmF0aW9ucy9hcGktc2VydmljZS1yZXN1bHQnO1xuaW1wb3J0IHsgS25vcmFDb25zdGFudHMgfSBmcm9tICcuLi9kZWNsYXJhdGlvbnMvYXBpL2tub3JhLWNvbnN0YW50cyc7XG5pbXBvcnQgeyBTZXNzaW9uIH0gZnJvbSAnLi4vc2Vzc2lvbi5zZXJ2aWNlJztcblxuZGVjbGFyZSBsZXQgcmVxdWlyZTogYW55OyAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM0NzMwMDEwL2FuZ3VsYXIyLTUtbWludXRlLWluc3RhbGwtYnVnLXJlcXVpcmUtaXMtbm90LWRlZmluZWRcbmNvbnN0IGpzb25sZCA9IHJlcXVpcmUoJ2pzb25sZCcpO1xuXG5jb25zdCBzZW12ZXIgPSByZXF1aXJlKCdzZW12ZXInKTtcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQXBpU2VydmljZSB7XG5cbiAgICAvLyBpZiBpcyBsb2FkaW5nLCBzZXQgaXQgdHJ1ZTtcbiAgICAvLyBpdCBjYW4gYmUgdXNlZCBpbiBjb21wb25lbnRzXG4gICAgLy8gZm9yIHByb2dyZXNzIGxvYWRlciBlbGVtZW50XG4gICAgbG9hZGluZyA9IGZhbHNlO1xuXG4gICAga25vcmFBcGlVcmw6IHN0cmluZztcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgICAgIEBJbmplY3QoS25vcmFBcGlDb25maWdUb2tlbikgcHJpdmF0ZSBrbm9yYUFwaUNvbmZpZzogS25vcmFBcGlDb25maWdcbiAgICApIHsgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgdjkuNS4wXG4gICAgICpcbiAgICAgKiBHRVRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIHRoZSBVUkwgZm9yIHRoZSBHRVQgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0ge0h0dHBQYXJhbXN9IHBhcmFtcyB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIEdFVCByZXF1ZXN0LlxuICAgICAqIEByZXR1cm5zIE9ic2VydmFibGUgb2YgYW55XG4gICAgICovXG4gICAgaHR0cEdldChwYXRoOiBzdHJpbmcsIHBhcmFtcz86IEh0dHBQYXJhbXMpOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG5cbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuc2V0SGVhZGVycygpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMua25vcmFBcGlDb25maWcuYXBpVXJsICsgcGF0aCwgeyBoZWFkZXJzOiBoZWFkZXJzLCBvYnNlcnZlOiAncmVzcG9uc2UnLCBwYXJhbXM6IHBhcmFtcyB9KS5waXBlKFxuICAgICAgICAgICAgbWFwKChyZXNwb25zZTogSHR0cFJlc3BvbnNlPGFueT4pOiBBcGlTZXJ2aWNlUmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcGlTZXJ2aWNlUmVzdWx0KCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmhlYWRlciA9IHsgJ3NlcnZlcic6IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdTZXJ2ZXInKSB9O1xuICAgICAgICAgICAgICAgIHRoaXMuY29tcGFyZVZlcnNpb24ocmVzcG9uc2UuaGVhZGVycy5nZXQoJ1NlcnZlcicpKTtcbiAgICAgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zdGF0dXNUZXh0ID0gcmVzcG9uc2Uuc3RhdHVzVGV4dDtcbiAgICAgICAgICAgICAgICByZXN1bHQudXJsID0gcGF0aDtcbiAgICAgICAgICAgICAgICByZXN1bHQuYm9keSA9IHJlc3BvbnNlLmJvZHk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBjYXRjaEVycm9yKChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZVJlcXVlc3RFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgdjkuNS4wXG4gICAgICpcbiAgICAgKiBQcm9jZXNzZXMgSlNPTi1MRCByZXR1cm5lZCBieSBLbm9yYS5cbiAgICAgKiBFeHBhbmRzIElyaXMgYW5kIGNyZWF0ZXMgYW4gZW1wdHkgY29udGV4dCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FwaVNlcnZpY2VSZXN1bHR9IHJlc291cmNlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0pTT05MRChyZXNvdXJjZVJlc3BvbnNlOiBBcGlTZXJ2aWNlUmVzdWx0KTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgICAgICBjb25zdCByZXNQcm9taXNlcyA9IGpzb25sZC5wcm9taXNlcztcblxuXG4gICAgICAgIC8vIGNvbXBhY3QgSlNPTi1MRCB1c2luZyBhbiBlbXB0eSBjb250ZXh0OiBleHBhbmRzIGFsbCBJcmlzXG4gICAgICAgIGNvbnN0IHJlc1Byb21pc2UgPSByZXNQcm9taXNlcy5jb21wYWN0KHJlc291cmNlUmVzcG9uc2UuYm9keSwge30pO1xuXG4gICAgICAgIC8vIGNvbnZlcnQgcHJvbWlzZSB0byBPYnNlcnZhYmxlIGFuZCByZXR1cm4gaXRcbiAgICAgICAgLy8gaHR0cHM6Ly93d3cubGVhcm5yeGpzLmlvL29wZXJhdG9ycy9jcmVhdGlvbi9mcm9tcHJvbWlzZS5odG1sXG4gICAgICAgIHJldHVybiBmcm9tKHJlc1Byb21pc2UpO1xuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgdjkuNS4wXG4gICAgICpcbiAgICAgKiBQT1NUXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgICAqIEBwYXJhbSB7YW55fSBib2R5XG4gICAgICogQHJldHVybnMgT2JzZXJ2YWJsZSBvZiBhbnlcbiAgICAgKi9cbiAgICBodHRwUG9zdChwYXRoOiBzdHJpbmcsIGJvZHk/OiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG5cbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuc2V0SGVhZGVycygpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCh0aGlzLmtub3JhQXBpQ29uZmlnLmFwaVVybCArIHBhdGgsIGJvZHksIHsgaGVhZGVyczogaGVhZGVycywgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KS5waXBlKFxuICAgICAgICAgICAgbWFwKChyZXNwb25zZTogSHR0cFJlc3BvbnNlPGFueT4pOiBBcGlTZXJ2aWNlUmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcGlTZXJ2aWNlUmVzdWx0KCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmhlYWRlciA9IHsgJ3NlcnZlcic6IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdTZXJ2ZXInKSB9O1xuICAgICAgICAgICAgICAgIHRoaXMuY29tcGFyZVZlcnNpb24ocmVzdWx0LmhlYWRlci5zZXJ2ZXIpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnN0YXR1c1RleHQgPSByZXNwb25zZS5zdGF0dXNUZXh0O1xuICAgICAgICAgICAgICAgIHJlc3VsdC51cmwgPSBwYXRoO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5ib2R5ID0gcmVzcG9uc2UuYm9keTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBjYXRjaEVycm9yKChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlUmVxdWVzdEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSB2OS41LjBcbiAgICAgKlxuICAgICAqIFBVVFxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICAgKiBAcGFyYW0ge2FueX0gYm9keVxuICAgICAqIEByZXR1cm5zIE9ic2VydmFibGUgb2YgYW55XG4gICAgICovXG4gICAgaHR0cFB1dChwYXRoOiBzdHJpbmcsIGJvZHk/OiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG5cbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuc2V0SGVhZGVycygpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0KHRoaXMua25vcmFBcGlDb25maWcuYXBpVXJsICsgcGF0aCwgYm9keSwgeyBoZWFkZXJzOiBoZWFkZXJzLCBvYnNlcnZlOiAncmVzcG9uc2UnIH0pLnBpcGUoXG4gICAgICAgICAgICBtYXAoKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2U8YW55Pik6IEFwaVNlcnZpY2VSZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2cocmVzcG9uc2UpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFwaVNlcnZpY2VSZXN1bHQoKTtcbiAgICAgICAgICAgICAgICByZXN1bHQuaGVhZGVyID0geyAnc2VydmVyJzogcmVzcG9uc2UuaGVhZGVycy5nZXQoJ1NlcnZlcicpIH07XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wYXJlVmVyc2lvbihyZXN1bHQuaGVhZGVyLnNlcnZlcik7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgICAgICAgICByZXN1bHQuc3RhdHVzVGV4dCA9IHJlc3BvbnNlLnN0YXR1c1RleHQ7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnVybCA9IHBhdGg7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmJvZHkgPSByZXNwb25zZS5ib2R5O1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG5cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmVycm9yKGVycm9yKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZVJlcXVlc3RFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIHY5LjUuMFxuICAgICAqXG4gICAgICogREVMRVRFXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgICAqIEByZXR1cm5zIE9ic2VydmFibGUgb2YgYW55XG4gICAgICovXG4gICAgaHR0cERlbGV0ZShwYXRoOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG5cbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuc2V0SGVhZGVycygpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlKHRoaXMua25vcmFBcGlDb25maWcuYXBpVXJsICsgcGF0aCwgeyBoZWFkZXJzOiBoZWFkZXJzLCBvYnNlcnZlOiAncmVzcG9uc2UnIH0pLnBpcGUoXG4gICAgICAgICAgICBtYXAoKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2U8YW55Pik6IEFwaVNlcnZpY2VSZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2cocmVzcG9uc2UpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFwaVNlcnZpY2VSZXN1bHQoKTtcbiAgICAgICAgICAgICAgICByZXN1bHQuaGVhZGVyID0geyAnc2VydmVyJzogcmVzcG9uc2UuaGVhZGVycy5nZXQoJ1NlcnZlcicpIH07XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wYXJlVmVyc2lvbihyZXN1bHQuaGVhZGVyLnNlcnZlcik7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgICAgICAgICByZXN1bHQuc3RhdHVzVGV4dCA9IHJlc3BvbnNlLnN0YXR1c1RleHQ7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnVybCA9IHBhdGg7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmJvZHkgPSByZXNwb25zZS5ib2R5O1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG5cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmVycm9yKGVycm9yKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZVJlcXVlc3RFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogaGFuZGxlIHJlcXVlc3QgZXJyb3IgaW4gY2FzZSBvZiBzZXJ2ZXIgZXJyb3JcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SHR0cEVycm9yUmVzcG9uc2V9IGVycm9yXG4gICAgICogQHJldHVybnMgT2JzZXJ2YWJsZSBvZiBBcGlTZXJ2aWNlRXJyb3JcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgaGFuZGxlUmVxdWVzdEVycm9yKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSk6IE9ic2VydmFibGU8QXBpU2VydmljZUVycm9yPiB7XG4gICAgICAgIC8vIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICBjb25zdCBzZXJ2aWNlRXJyb3IgPSBuZXcgQXBpU2VydmljZUVycm9yKCk7XG4gICAgICAgIHNlcnZpY2VFcnJvci5oZWFkZXIgPSB7ICdzZXJ2ZXInOiBlcnJvci5oZWFkZXJzLmdldCgnU2VydmVyJykgfTtcbiAgICAgICAgc2VydmljZUVycm9yLnN0YXR1cyA9IGVycm9yLnN0YXR1cztcbiAgICAgICAgc2VydmljZUVycm9yLnN0YXR1c1RleHQgPSBlcnJvci5zdGF0dXNUZXh0O1xuICAgICAgICBzZXJ2aWNlRXJyb3IuZXJyb3JJbmZvID0gZXJyb3IubWVzc2FnZTtcbiAgICAgICAgc2VydmljZUVycm9yLnVybCA9IGVycm9yLnVybDtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3Ioc2VydmljZUVycm9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBoYW5kbGUganNvbiBlcnJvciBpbiBjYXNlIG9mIHR5cGUgZXJyb3IgaW4ganNvbiByZXNwb25zZSAoanNvbjJ0eXBlc2NyaXB0KVxuICAgICAqXG4gICAgICogQHBhcmFtIHthbnl9IGVycm9yXG4gICAgICogQHJldHVybnMgT2JzZXJ2YWJsZSBvZiBBcGlTZXJ2aWNlRXJyb3JcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgaGFuZGxlSnNvbkVycm9yKGVycm9yOiBhbnkpOiBPYnNlcnZhYmxlPEFwaVNlcnZpY2VFcnJvcj4ge1xuXG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEFwaVNlcnZpY2VFcnJvcikgcmV0dXJuIHRocm93RXJyb3IoZXJyb3IpO1xuXG4gICAgICAgIGNvbnN0IHNlcnZpY2VFcnJvciA9IG5ldyBBcGlTZXJ2aWNlRXJyb3IoKTtcbiAgICAgICAgc2VydmljZUVycm9yLmhlYWRlciA9IHsgJ3NlcnZlcic6IGVycm9yLmhlYWRlcnMuZ2V0KCdTZXJ2ZXInKSB9O1xuICAgICAgICBzZXJ2aWNlRXJyb3Iuc3RhdHVzID0gLTE7XG4gICAgICAgIHNlcnZpY2VFcnJvci5zdGF0dXNUZXh0ID0gJ0ludmFsaWQgSlNPTic7XG4gICAgICAgIHNlcnZpY2VFcnJvci5lcnJvckluZm8gPSBlcnJvcjtcbiAgICAgICAgc2VydmljZUVycm9yLnVybCA9ICcnO1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihzZXJ2aWNlRXJyb3IpO1xuXG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIHY5LjUuMFxuICAgICAqXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBzZXJ2ZXJcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY29tcGFyZVZlcnNpb24oc2VydmVyOiBzdHJpbmcpOiB2b2lkIHtcblxuICAgICAgICAvLyBleHBlY3RlZCBrbm9yYSBhcGkgdmVyc2lvblxuICAgICAgICBjb25zdCBleHBlY3RlZDogc3RyaW5nID0gS25vcmFDb25zdGFudHMuS25vcmFWZXJzaW9uO1xuXG4gICAgICAgIC8vIGV4aXN0aW5nIGtub3JhIGFwaSB2ZXJzaW9uXG4gICAgICAgIGlmIChzZXJ2ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHZlcnNpb25zOiBzdHJpbmdbXSA9IHNlcnZlci5zcGxpdCgnICcpO1xuICAgICAgICAgICAgY29uc3QgZXhpc3Rpbmc6IHN0cmluZyA9IHZlcnNpb25zWzBdLnNwbGl0KCcvJylbMV07XG5cbiAgICAgICAgICAgIC8vIGNvbXBhcmUgdGhlIHR3byB2ZXJzaW9uczogZXhwZWN0ZWQgdnMgZXhpc3RpbmdcbiAgICAgICAgICAgIGlmIChzZW12ZXIuZGlmZihleGlzdGluZywgZXhwZWN0ZWQpID09PSAnbWFqb3InKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdUaGUgdmVyc2lvbiBvZiB0aGUgQGtub3JhL2NvcmUgbW9kdWxlIHdvcmtzIHdpdGggS25vcmEgdicgKyBleHBlY3RlZCArICcsIGJ1dCB5b3UgYXJlIHVzaW5nIGl0IHdpdGggS25vcmEgdicgKyBleGlzdGluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oJ05vIHNlcnZlciBpbmZvcm1hdGlvbiBmcm9tIGhlYWRlcnMgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBoZWFkZXJzIHRvIGF1dGhvcmlzZSBodHRwIHJlcXVlc3RzXG4gICAgICpcbiAgICAgKiBUaGlzIG1ldGhvZCB3YXMgcmVwbGFjZWQgYnkgaW50ZXJjZXB0b3IuIEJ1dCBzaW5jZSB0aGUgaW1wbGVtZW50YXRpb25cbiAgICAgKiBvZiBuZXcga25vcmEtYXBpLWpzLWxpYiBzZXJ2aWNlcyB0aGUgaW50ZXJjZXB0b3IgaXMgcmVkdW5kYW50LlxuICAgICAqIEFzIGxvbmcgd2Ugbm90IGFsbCBzZXJ2aWNlcyBhcmUgcmVwbGFjZWQgYnkga25vcmEtYXBpLWpzLWxpYlxuICAgICAqIHdlIGhhdmUgdG8gdXNlIHRoaXMgc2V0SGVhZGVycyBcImhhY2tcIiBmb3IgdGhlIHR3byBzZXJ2aWNlcyBsZWZ0LlxuICAgICAqXG4gICAgICogQHJldHVybnMgSHR0cEhlYWRlcnNcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgc2V0SGVhZGVycygpOiBIdHRwSGVhZGVycyB7XG4gICAgICAgIGNvbnN0IHNlc3Npb246IFNlc3Npb24gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdzZXNzaW9uJykpO1xuXG4gICAgICAgIGlmIChzZXNzaW9uICYmIHNlc3Npb24gIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke3Nlc3Npb24udXNlci5qd3R9YFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEh0dHBIZWFkZXJzKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=