@protoarch.angular/api
Version:
Angular HttpClient simplifier
141 lines • 21.6 kB
JavaScript
import { HttpClient, HttpParams } from '@angular/common/http';
import { Inject, Injectable, Optional } from '@angular/core';
import { map } from 'rxjs/operators';
import { API_ENDPOINT, API_SERIALIZER } from './api.tokens';
import { flattenParamsObject } from './web-api-http-params';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common/http";
export var ResponseTypeEnum;
(function (ResponseTypeEnum) {
ResponseTypeEnum["json"] = "json";
ResponseTypeEnum["text"] = "text";
ResponseTypeEnum["arraybuffer"] = "arraybuffer";
ResponseTypeEnum["blob"] = "blob";
})(ResponseTypeEnum || (ResponseTypeEnum = {}));
export class Api {
http;
apiEndpoint;
serializer;
constructor(http, apiEndpoint = null, serializer) {
this.http = http;
this.apiEndpoint = apiEndpoint;
this.serializer = serializer;
}
get(url, options) {
const opts = this.buildOptions(options);
return this.http
.get(this.buildUrl(url), opts)
.pipe(map(result => this.tryDeserialize(result, opts?.deserializeTo)));
}
post(url, body, options) {
const opts = this.buildOptions(options);
return this.http
.post(this.buildUrl(url), this.trySerialize(body), opts)
.pipe(map(result => this.tryDeserialize(result, opts?.deserializeTo)));
}
put(url, body, options) {
const opts = this.buildOptions(options);
return this.http
.put(this.buildUrl(url), this.trySerialize(body), opts)
.pipe(map(result => this.tryDeserialize(result, opts?.deserializeTo)));
}
delete(url, options) {
const opts = this.buildOptions(options);
return this.http
.delete(this.buildUrl(url), opts)
.pipe(map(result => this.tryDeserialize(result, opts?.deserializeTo)));
}
download(url, triggerBrowserDownload = true, options) {
const opts = this.buildOptions({
observe: 'response',
responseType: 'blob',
...options,
});
return new Promise((resolve, reject) => {
this.http.get(this.buildUrl(url), opts).subscribe({
next: blobResp => {
if (!blobResp.body) {
const errorTxt = `[Api] Failed to download file ${url}. Empty response`;
console.error(errorTxt);
reject(errorTxt);
return;
}
if (triggerBrowserDownload) {
const a = document.createElement('a');
const objectUrl = URL.createObjectURL(blobResp.body);
let filename = blobResp.headers
.get('content-disposition')
?.split('filename=')?.[1];
if (filename) {
filename = decodeURI(filename);
}
a.href = objectUrl;
a.download = (filename ?? url.replaceAll('/', '')).replaceAll('"', '');
a.click();
URL.revokeObjectURL(objectUrl);
}
resolve(blobResp.body);
},
error: e => {
console.error(`[Api] Failed to download file ${url}`, e);
reject(e);
},
});
});
}
buildUrl(url) {
if ((url && url.startsWith('http')) || !this.apiEndpoint) {
return url;
}
return this.apiEndpoint.concat(url);
}
buildOptions(options) {
const opts = { responseType: ResponseTypeEnum.json, ...options };
opts.params = this.getHttpParams(opts?.params);
return opts;
}
getHttpParams(params = null) {
if (params === null || params === undefined) {
return undefined;
}
const serializedParams = this.trySerialize(params);
return typeof serializedParams === 'object'
? flattenParamsObject(serializedParams)
: new HttpParams({ fromString: serializedParams.toString() });
}
trySerialize(data) {
if (this.serializer) {
return this.serializer.serialize(data);
}
return data;
}
tryDeserialize(data, deserializeTo) {
if (!deserializeTo || !this.serializer) {
return data;
}
if (deserializeTo instanceof Array && data instanceof Array) {
const type = deserializeTo.length > 0 ? deserializeTo[0] : undefined;
return data.map(d => this.serializer.deserialize(d, type));
}
if (typeof deserializeTo === 'function') {
return this.serializer.deserialize(data, deserializeTo);
}
return data;
}
static ɵfac = function Api_Factory(t) { return new (t || Api)(i0.ɵɵinject(i1.HttpClient), i0.ɵɵinject(API_ENDPOINT, 8), i0.ɵɵinject(API_SERIALIZER, 8)); };
static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: Api, factory: Api.ɵfac });
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(Api, [{
type: Injectable
}], () => [{ type: i1.HttpClient }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [API_ENDPOINT]
}] }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [API_SERIALIZER]
}] }], null); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2FwaS9zcmMvbGliL2FwaS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQTRCLFVBQVUsRUFBZSxNQUFNLHNCQUFzQixDQUFDO0FBQ3BHLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUUzRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFHbkMsT0FBTyxFQUFDLFlBQVksRUFBRSxjQUFjLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDMUQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7OztBQUUxRCxNQUFNLENBQU4sSUFBWSxnQkFLWDtBQUxELFdBQVksZ0JBQWdCO0lBQ3hCLGlDQUFhLENBQUE7SUFDYixpQ0FBYSxDQUFBO0lBQ2IsK0NBQTJCLENBQUE7SUFDM0IsaUNBQWEsQ0FBQTtBQUNqQixDQUFDLEVBTFcsZ0JBQWdCLEtBQWhCLGdCQUFnQixRQUszQjtBQThCRCxNQUFNLE9BQU8sR0FBRztJQUVBO0lBR0E7SUFHQTtJQVBaLFlBQ1ksSUFBZ0IsRUFHaEIsY0FBNkIsSUFBSSxFQUdqQyxVQUF1QjtRQU52QixTQUFJLEdBQUosSUFBSSxDQUFZO1FBR2hCLGdCQUFXLEdBQVgsV0FBVyxDQUFzQjtRQUdqQyxlQUFVLEdBQVYsVUFBVSxDQUFhO0lBQ2hDLENBQUM7SUFFRyxHQUFHLENBQUksR0FBVyxFQUFFLE9BQTJDO1FBQ2xFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEMsT0FBTyxJQUFJLENBQUMsSUFBSTthQUNYLEdBQUcsQ0FBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQzthQUNoQyxJQUFJ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QUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3JFLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQy9ELENBQUM7UUFDRCxJQUFJLE9BQU8sYUFBYSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ3RDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDOzZEQTNJUSxHQUFHLDBDQUlBLFlBQVksa0JBR1osY0FBYztnRUFQakIsR0FBRyxXQUFILEdBQUc7O2lGQUFILEdBQUc7Y0FEZixVQUFVOztzQkFJRixRQUFROztzQkFDUixNQUFNO3VCQUFDLFlBQVk7O3NCQUVuQixRQUFROztzQkFDUixNQUFNO3VCQUFDLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0h0dHBDbGllbnQsIEh0dHBDb250ZXh0LCBIdHRwSGVhZGVycywgSHR0cFBhcmFtcywgSHR0cFJlc3BvbnNlfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7bWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQge0lTZXJpYWxpemVyfSBmcm9tICcuL2FwaS5vcHRpb25zJztcclxuaW1wb3J0IHtBUElfRU5EUE9JTlQsIEFQSV9TRVJJQUxJWkVSfSBmcm9tICcuL2FwaS50b2tlbnMnO1xyXG5pbXBvcnQge2ZsYXR0ZW5QYXJhbXNPYmplY3R9IGZyb20gJy4vd2ViLWFwaS1odHRwLXBhcmFtcyc7XHJcblxyXG5leHBvcnQgZW51bSBSZXNwb25zZVR5cGVFbnVtIHtcclxuICAgIGpzb24gPSAnanNvbicsXHJcbiAgICB0ZXh0ID0gJ3RleHQnLFxyXG4gICAgYXJyYXlidWZmZXIgPSAnYXJyYXlidWZmZXInLFxyXG4gICAgYmxvYiA9ICdibG9iJyxcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJQXBpT3B0aW9ucyB7XHJcbiAgICBoZWFkZXJzPzpcclxuICAgICAgICB8IEh0dHBIZWFkZXJzXHJcbiAgICAgICAgfCB7XHJcbiAgICAgICAgICAgICAgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW107XHJcbiAgICAgICAgICB9O1xyXG4gICAgY29udGV4dD86IEh0dHBDb250ZXh0O1xyXG4gICAgb2JzZXJ2ZT86IGFueSB8ICdib2R5JztcclxuICAgIHBhcmFtcz86IGFueTtcclxuICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbjtcclxuICAgIHJlc3BvbnNlVHlwZT86IGFueSB8IFJlc3BvbnNlVHlwZUVudW07XHJcbiAgICB3aXRoQ3JlZGVudGlhbHM/OiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElEZXNlcmlhbGl6ZU9wdGlvbnMge1xyXG4gICAgLyoqXHJcbiAgICAgKiAgQWNjZXB0czpcclxuICAgICAqICAtIGNvbnN0cnVjdG9yOiB0byBkZXNlcmlhbGl6ZSB0byBpbnN0YW5jZSBvZiBvYmplY3RcclxuICAgICAqICAtIFtjb25zdHJ1Y3Rvcl0gKGFycmF5IHdpdGggYSBzaW5nbGUgZWxlbWVudCBjb25zdHJ1Y3Rvcik6IHRvIGRlc2VyaWFsaXplIHRvIGFycmF5IG9mIGluc3RhbmNlc1xyXG4gICAgICpcclxuICAgICAqIHR5cGUgeyh7IG5ldyguLi5hcmdzKTogYW55IH0gfCBbeyBuZXcoLi4uYXJncyk6IGFueSB9XSl9XHJcbiAgICAgKlxyXG4gICAgICogbWVtYmVyb2YgSURlc2VyaWFsaXplT3B0aW9uc1xyXG4gICAgICovXHJcbiAgICBkZXNlcmlhbGl6ZVRvPzoge25ldyAoLi4uYXJnczogYW55W10pOiBhbnl9IHwgW3tuZXcgKC4uLmFyZ3M6IGFueVtdKTogYW55fV07XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEFwaSB7XHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICAgICAgQE9wdGlvbmFsKClcclxuICAgICAgICBASW5qZWN0KEFQSV9FTkRQT0lOVClcclxuICAgICAgICBwcml2YXRlIGFwaUVuZHBvaW50OiBzdHJpbmcgfCBudWxsID0gbnVsbCxcclxuICAgICAgICBAT3B0aW9uYWwoKVxyXG4gICAgICAgIEBJbmplY3QoQVBJX1NFUklBTElaRVIpXHJcbiAgICAgICAgcHJpdmF0ZSBzZXJpYWxpemVyOiBJU2VyaWFsaXplcixcclxuICAgICkge31cclxuXHJcbiAgICBwdWJsaWMgZ2V0PFQ+KHVybDogc3RyaW5nLCBvcHRpb25zPzogSUFwaU9wdGlvbnMgJiBJRGVzZXJpYWxpemVPcHRpb25zKTogT2JzZXJ2YWJsZTxUPiB7XHJcbiAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMuYnVpbGRPcHRpb25zKG9wdGlvbnMpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBcclxuICAgICAgICAgICAgLmdldDxUPih0aGlzLmJ1aWxkVXJsKHVybCksIG9wdHMpXHJcbiAgICAgICAgICAgIC5waXBlKG1hcChyZXN1bHQgPT4gdGhpcy50cnlEZXNlcmlhbGl6ZTxUPihyZXN1bHQsIG9wdHM/LmRlc2VyaWFsaXplVG8pKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHBvc3Q8VD4oXHJcbiAgICAgICAgdXJsOiBzdHJpbmcsXHJcbiAgICAgICAgYm9keTogYW55LFxyXG4gICAgICAgIG9wdGlvbnM/OiBJQXBpT3B0aW9ucyAmIElEZXNlcmlhbGl6ZU9wdGlvbnMsXHJcbiAgICApOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgICAgICBjb25zdCBvcHRzID0gdGhpcy5idWlsZE9wdGlvbnMob3B0aW9ucyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cFxyXG4gICAgICAgICAgICAucG9zdDxUPih0aGlzLmJ1aWxkVXJsKHVybCksIHRoaXMudHJ5U2VyaWFsaXplKGJvZHkpLCBvcHRzKVxyXG4gICAgICAgICAgICAucGlwZShtYXAocmVzdWx0ID0+IHRoaXMudHJ5RGVzZXJpYWxpemU8VD4ocmVzdWx0LCBvcHRzPy5kZXNlcmlhbGl6ZVRvKSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBwdXQ8VD4oXHJcbiAgICAgICAgdXJsOiBzdHJpbmcsXHJcbiAgICAgICAgYm9keTogYW55LFxyXG4gICAgICAgIG9wdGlvbnM/OiBJQXBpT3B0aW9ucyAmIElEZXNlcmlhbGl6ZU9wdGlvbnMsXHJcbiAgICApOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgICAgICBjb25zdCBvcHRzID0gdGhpcy5idWlsZE9wdGlvbnMob3B0aW9ucyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cFxyXG4gICAgICAgICAgICAucHV0PFQ+KHRoaXMuYnVpbGRVcmwodXJsKSwgdGhpcy50cnlTZXJpYWxpemUoYm9keSksIG9wdHMpXHJcbiAgICAgICAgICAgIC5waXBlKG1hcChyZXN1bHQgPT4gdGhpcy50cnlEZXNlcmlhbGl6ZTxUPihyZXN1bHQsIG9wdHM/LmRlc2VyaWFsaXplVG8pKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlbGV0ZTxUPih1cmw6IHN0cmluZywgb3B0aW9ucz86IElBcGlPcHRpb25zICYgSURlc2VyaWFsaXplT3B0aW9ucyk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgICAgIGNvbnN0IG9wdHMgPSB0aGlzLmJ1aWxkT3B0aW9ucyhvcHRpb25zKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwXHJcbiAgICAgICAgICAgIC5kZWxldGU8VD4odGhpcy5idWlsZFVybCh1cmwpLCBvcHRzKVxyXG4gICAgICAgICAgICAucGlwZShtYXAocmVzdWx0ID0+IHRoaXMudHJ5RGVzZXJpYWxpemU8VD4ocmVzdWx0LCBvcHRzPy5kZXNlcmlhbGl6ZVRvKSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBkb3dubG9hZChcclxuICAgICAgICB1cmw6IHN0cmluZyxcclxuICAgICAgICB0cmlnZ2VyQnJvd3NlckRvd25sb2FkID0gdHJ1ZSxcclxuICAgICAgICBvcHRpb25zPzogSUFwaU9wdGlvbnMgJiBJRGVzZXJpYWxpemVPcHRpb25zLFxyXG4gICAgKTogUHJvbWlzZTxCbG9iPiB7XHJcbiAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMuYnVpbGRPcHRpb25zKHtcclxuICAgICAgICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyxcclxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAnYmxvYicsXHJcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxCbG9iPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuaHR0cC5nZXQ8SHR0cFJlc3BvbnNlPEJsb2I+Pih0aGlzLmJ1aWxkVXJsKHVybCksIG9wdHMpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgICBuZXh0OiBibG9iUmVzcCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFibG9iUmVzcC5ib2R5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yVHh0ID0gYFtBcGldIEZhaWxlZCB0byBkb3dubG9hZCBmaWxlICR7dXJsfS4gRW1wdHkgcmVzcG9uc2VgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yVHh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yVHh0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodHJpZ2dlckJyb3dzZXJEb3dubG9hZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvYmplY3RVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2JSZXNwLmJvZHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmlsZW5hbWUgPSBibG9iUmVzcC5oZWFkZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KCdjb250ZW50LWRpc3Bvc2l0aW9uJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8uc3BsaXQoJ2ZpbGVuYW1lPScpPy5bMV07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZW5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gZGVjb2RlVVJJKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgYS5ocmVmID0gb2JqZWN0VXJsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhLmRvd25sb2FkID0gKGZpbGVuYW1lID8/IHVybC5yZXBsYWNlQWxsKCcvJywgJycpKS5yZXBsYWNlQWxsKCdcIicsICcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYS5jbGljaygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKG9iamVjdFVybCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGJsb2JSZXNwLmJvZHkpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVycm9yOiBlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBbQXBpXSBGYWlsZWQgdG8gZG93bmxvYWQgZmlsZSAke3VybH1gLCBlKTtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYnVpbGRVcmwodXJsOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAoKHVybCAmJiB1cmwuc3RhcnRzV2l0aCgnaHR0cCcpKSB8fCAhdGhpcy5hcGlFbmRwb2ludCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdXJsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5hcGlFbmRwb2ludC5jb25jYXQodXJsKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGJ1aWxkT3B0aW9ucyhvcHRpb25zOiAoSUFwaU9wdGlvbnMgJiBJRGVzZXJpYWxpemVPcHRpb25zKSB8IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGNvbnN0IG9wdHMgPSB7cmVzcG9uc2VUeXBlOiBSZXNwb25zZVR5cGVFbnVtLmpzb24sIC4uLm9wdGlvbnN9O1xyXG4gICAgICAgIG9wdHMucGFyYW1zID0gdGhpcy5nZXRIdHRwUGFyYW1zKG9wdHM/LnBhcmFtcyk7XHJcbiAgICAgICAgcmV0dXJuIG9wdHM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRIdHRwUGFyYW1zKHBhcmFtczoge1trZXk6IHN0cmluZ106IGFueX0gfCBudWxsID0gbnVsbCk6IEh0dHBQYXJhbXMgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGlmIChwYXJhbXMgPT09IG51bGwgfHwgcGFyYW1zID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZFBhcmFtcyA9IHRoaXMudHJ5U2VyaWFsaXplKHBhcmFtcyk7XHJcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBzZXJpYWxpemVkUGFyYW1zID09PSAnb2JqZWN0J1xyXG4gICAgICAgICAgICA/IGZsYXR0ZW5QYXJhbXNPYmplY3Qoc2VyaWFsaXplZFBhcmFtcylcclxuICAgICAgICAgICAgOiBuZXcgSHR0cFBhcmFtcyh7ZnJvbVN0cmluZzogc2VyaWFsaXplZFBhcmFtcy50b1N0cmluZygpfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB0cnlTZXJpYWxpemUoZGF0YTogYW55KTogYW55IHtcclxuICAgICAgICBpZiAodGhpcy5zZXJpYWxpemVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHRyeURlc2VyaWFsaXplPFQ+KFxyXG4gICAgICAgIGRhdGE6IGFueSxcclxuICAgICAgICBkZXNlcmlhbGl6ZVRvPzoge25ldyAoLi4uYXJnczogYW55W10pOiBUfSB8IFt7bmV3ICguLi5hcmdzOiBhbnlbXSk6IFR9XSxcclxuICAgICkge1xyXG4gICAgICAgIGlmICghZGVzZXJpYWxpemVUbyB8fCAhdGhpcy5zZXJpYWxpemVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZGVzZXJpYWxpemVUbyBpbnN0YW5jZW9mIEFycmF5ICYmIGRhdGEgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlID0gZGVzZXJpYWxpemVUby5sZW5ndGggPiAwID8gZGVzZXJpYWxpemVUb1swXSA6IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGEubWFwKGQgPT4gdGhpcy5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGQsIHR5cGUpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBkZXNlcmlhbGl6ZVRvID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZGF0YSwgZGVzZXJpYWxpemVUbyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==