UNPKG

@gorniv/ngx-universal

Version:
149 lines 23.7 kB
import { Injectable, Inject, PLATFORM_ID } from '@angular/core'; import { makeStateKey } from '@angular/platform-browser'; import { from } from 'rxjs'; import { tap } from 'rxjs/operators'; import { isPlatformBrowser, isPlatformServer } from '@angular/common'; import * as i0 from "@angular/core"; import * as i1 from "@angular/platform-browser"; import * as i2 from "@angular/common/http"; export class TransferHttpService { constructor(transferState, httpClient, platformId) { this.transferState = transferState; this.httpClient = httpClient; this.platformId = platformId; } request(method, uri, options) { return this.getData(method, uri, options, (method, uri, options) => { return this.httpClient.request(method, typeof uri === 'string' ? uri : uri.url, options); }); } /** * Performs a request with `get` http method. */ get(url, options) { return this.getData('get', url, options, (_method, uri, options) => { return this.httpClient.get(url, options); }); } /** * Performs a request with `post` http method. */ post(url, body, options) { return this.getPostData('post', url, body, options, (_method, uri, body, options) => { return this.httpClient.post(url, body, options); }); } /** * Performs a request with `put` http method. */ put(url, _body, options) { return this.getPostData('put', url, _body, options, (_method, uri, _body, options) => { return this.httpClient.put(url, _body, options); }); } /** * Performs a request with `delete` http method. */ delete(url, options) { return this.getData('delete', url, options, (_method, uri, options) => { return this.httpClient.delete(url, options); }); } /** * Performs a request with `patch` http method. */ patch(url, body, options) { return this.getPostData('patch', url, body, options, (_method, uri, body, options) => { return this.httpClient.patch(url, body, options); }); } /** * Performs a request with `head` http method. */ head(url, options) { return this.getData('head', url, options, (_method, uri, options) => { return this.httpClient.head(url, options); }); } /** * Performs a request with `options` http method. */ options(url, options) { return this.getData('options', url, options, (_method, uri, options) => { return this.httpClient.options(url, options); }); } getData(method, uri, options, callback) { let url = uri; if (typeof uri !== 'string') { url = uri.url; } const tempKey = url + (options ? JSON.stringify(options) : ''); const key = makeStateKey(tempKey); try { return this.resolveData(key); } catch (e) { return callback(method, uri, options).pipe(tap((data) => { if (isPlatformBrowser(this.platformId)) { // Client only code. // nothing; } if (isPlatformServer(this.platformId)) { this.setCache(key, data); } })); } } getPostData(_method, uri, body, options, callback) { let url = uri; if (typeof uri !== 'string') { url = uri.url; } const tempKey = url + (body ? JSON.stringify(body) : '') + (options ? JSON.stringify(options) : ''); const key = makeStateKey(tempKey); try { return this.resolveData(key); } catch (e) { return callback(_method, uri, body, options).pipe(tap((data) => { if (isPlatformBrowser(this.platformId)) { // Client only code. // nothing; } if (isPlatformServer(this.platformId)) { this.setCache(key, data); } })); } } resolveData(key) { const data = this.getFromCache(key); if (!data) { throw new Error(); } if (isPlatformBrowser(this.platformId)) { // Client only code. this.transferState.remove(key); } if (isPlatformServer(this.platformId)) { // Server only code. } return from(Promise.resolve(data)); } setCache(key, data) { return this.transferState.set(key, data); } getFromCache(key) { return this.transferState.get(key, {}); } } TransferHttpService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: TransferHttpService, deps: [{ token: i1.TransferState }, { token: i2.HttpClient }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Injectable }); TransferHttpService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: TransferHttpService }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: TransferHttpService, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i1.TransferState }, { type: i2.HttpClient }, { type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID] }] }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXItaHR0cC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL3NyYy90cmFuc2Zlci1odHRwL3RyYW5zZmVyLWh0dHAuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEUsT0FBTyxFQUEyQixZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNsRixPQUFPLEVBQWMsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7OztBQUl0RSxNQUFNLE9BQU8sbUJBQW1CO0lBQzlCLFlBQ1ksYUFBNEIsRUFDOUIsVUFBc0IsRUFDRCxVQUFrQjtRQUZyQyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM5QixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ0QsZUFBVSxHQUFWLFVBQVUsQ0FBUTtJQUVqRCxDQUFDO0lBRUQsT0FBTyxDQUNMLE1BQWMsRUFDZCxHQUFxQixFQUNyQixPQWdCQztRQUVELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBSSxNQUFNLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDLE1BQWMsRUFBRSxHQUFxQixFQUFFLE9BQVksRUFBRSxFQUFFO1lBQ25HLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUksTUFBTSxFQUFFLE9BQU8sR0FBRyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzlGLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsR0FBRyxDQUNELEdB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LENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ3JDLG9CQUFvQjtTQUNyQjtRQUVELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRU8sUUFBUSxDQUFJLEdBQWdCLEVBQUUsSUFBTztRQUMzQyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFJLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRU8sWUFBWSxDQUFJLEdBQWdCO1FBQ3RDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUksR0FBRyxFQUFFLEVBQU8sQ0FBQyxDQUFDO0lBQ2pELENBQUM7O2dIQWxWVSxtQkFBbUIseUVBSXBCLFdBQVc7b0hBSlYsbUJBQW1COzJGQUFuQixtQkFBbUI7a0JBRC9CLFVBQVU7K0dBS2tDLE1BQU07MEJBQTlDLE1BQU07MkJBQUMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCwgUExBVEZPUk1fSUQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRyYW5zZmVyU3RhdGUsIFN0YXRlS2V5LCBtYWtlU3RhdGVLZXkgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IE9ic2VydmFibGUsIGZyb20gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyLCBpc1BsYXRmb3JtU2VydmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVHJhbnNmZXJIdHRwU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCB0cmFuc2ZlclN0YXRlOiBUcmFuc2ZlclN0YXRlLFxuICAgIHByaXZhdGUgaHR0cENsaWVudDogSHR0cENsaWVudCxcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IE9iamVjdCxcbiAgKSB7XG4gIH1cblxuICByZXF1ZXN0PFQ+KFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHVyaTogc3RyaW5nIHwgUmVxdWVzdCxcbiAgICBvcHRpb25zPzoge1xuICAgICAgYm9keT86IGFueTtcbiAgICAgIGhlYWRlcnM/OlxuICAgICAgICB8IEh0dHBIZWFkZXJzXG4gICAgICAgIHwge1xuICAgICAgICBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgICAgIH07XG4gICAgICByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW47XG4gICAgICBvYnNlcnZlPzogJ3Jlc3BvbnNlJztcbiAgICAgIHBhcmFtcz86XG4gICAgICAgIHwgSHR0cFBhcmFtc1xuICAgICAgICB8IHtcbiAgICAgICAgW3BhcmFtOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgICAgIH07XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgICB3aXRoQ3JlZGVudGlhbHM/OiBib29sZWFuO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLmdldERhdGE8VD4obWV0aG9kLCB1cmksIG9wdGlvbnMsIChtZXRob2Q6IHN0cmluZywgdXJpOiBzdHJpbmcgfCBSZXF1ZXN0LCBvcHRpb25zOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxUPihtZXRob2QsIHR5cGVvZiB1cmkgPT09ICdzdHJpbmcnID8gdXJpIDogdXJpLnVybCwgb3B0aW9ucyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgYSByZXF1ZXN0IHdpdGggYGdldGAgaHR0cCBtZXRob2QuXG4gICAqL1xuICBnZXQ8VD4oXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIGhlYWRlcnM/OlxuICAgICAgICB8IEh0dHBIZWFkZXJzXG4gICAgICAgIHwge1xuICAgICAgICBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgICAgIH07XG4gICAgICBvYnNlcnZlPzogJ3Jlc3BvbnNlJztcbiAgICAgIHBhcmFtcz86XG4gICAgICAgIHwgSHR0cFBhcmFtc1xuICAgICAgICB8IHtcbiAgICAgICAgW3BhcmFtOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgICAgIH07XG4gICAgICByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW47XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgICB3aXRoQ3JlZGVudGlhbHM/OiBib29sZWFuO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLmdldERhdGE8VD4oJ2dldCcsIHVybCwgb3B0aW9ucywgKF9tZXRob2Q6IHN0cmluZywgdXJpOiBzdHJpbmcgfCBSZXF1ZXN0LCBvcHRpb25zOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PFQ+KHVybCwgb3B0aW9ucyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgYSByZXF1ZXN0IHdpdGggYHBvc3RgIGh0dHAgbWV0aG9kLlxuICAgKi9cbiAgcG9zdDxUPihcbiAgICB1cmw6IHN0cmluZyxcbiAgICBib2R5OiBhbnksXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIGhlYWRlcnM/OlxuICAgICAgICB8IEh0dHBIZWFkZXJzXG4gICAgICAgIHwge1xuICAgICAgICBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgICAgIH07XG4gICAgICBvYnNlcnZlPzogJ3Jlc3BvbnNlJztcbiAgICAgIHBhcmFtcz86XG4gICAgICAgIHwgSHR0cFBhcmFtc1xuICAgICAgICB8IHtcbiAgICAgICAgW3BhcmFtOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgICAgIH07XG4gICAgICByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW47XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgICB3aXRoQ3JlZGVudGlhbHM/OiBib29sZWFuO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLmdldFBvc3REYXRhPFQ+KFxuICAgICAgJ3Bvc3QnLFxuICAgICAgdXJsLFxuICAgICAgYm9keSxcbiAgICAgIG9wdGlvbnMsXG4gICAgICAoX21ldGhvZDogc3RyaW5nLCB1cmk6IHN0cmluZyB8IFJlcXVlc3QsIGJvZHk6IGFueSwgb3B0aW9uczogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdDxUPih1cmwsIGJvZHksIG9wdGlvbnMpO1xuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGEgcmVxdWVzdCB3aXRoIGBwdXRgIGh0dHAgbWV0aG9kLlxuICAgKi9cbiAgcHV0PFQ+KFxuICAgIHVybDogc3RyaW5nLFxuICAgIF9ib2R5OiBhbnksXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIGhlYWRlcnM/OlxuICAgICAgICB8IEh0dHBIZWFkZXJzXG4gICAgICAgIHwge1xuICAgICAgICBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgICAgIH07XG4gICAgICBvYnNlcnZlPzogJ2JvZHknO1xuICAgICAgcGFyYW1zPzpcbiAgICAgICAgfCBIdHRwUGFyYW1zXG4gICAgICAgIHwge1xuICAgICAgICBbcGFyYW06IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdO1xuICAgICAgfTtcbiAgICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbjtcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcbiAgICAgIHdpdGhDcmVkZW50aWFscz86IGJvb2xlYW47XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UG9zdERhdGE8VD4oXG4gICAgICAncHV0JyxcbiAgICAgIHVybCxcbiAgICAgIF9ib2R5LFxuICAgICAgb3B0aW9ucyxcbiAgICAgIChfbWV0aG9kOiBzdHJpbmcsIHVyaTogc3RyaW5nIHwgUmVxdWVzdCwgX2JvZHk6IGFueSwgb3B0aW9uczogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucHV0PFQ+KHVybCwgX2JvZHksIG9wdGlvbnMpO1xuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGEgcmVxdWVzdCB3aXRoIGBkZWxldGVgIGh0dHAgbWV0aG9kLlxuICAgKi9cbiAgZGVsZXRlPFQ+KFxuICAgIHVybDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBoZWFkZXJzPzpcbiAgICAgICAgfCBIdHRwSGVhZGVyc1xuICAgICAgICB8IHtcbiAgICAgICAgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW107XG4gICAgICB9O1xuICAgICAgb2JzZXJ2ZT86ICdyZXNwb25zZSc7XG4gICAgICBwYXJhbXM/OlxuICAgICAgICB8IEh0dHBQYXJhbXNcbiAgICAgICAgfCB7XG4gICAgICAgIFtwYXJhbTogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW107XG4gICAgICB9O1xuICAgICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xuICAgICAgd2l0aENyZWRlbnRpYWxzPzogYm9vbGVhbjtcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5nZXREYXRhPFQ+KCdkZWxldGUnLCB1cmwsIG9wdGlvbnMsIChfbWV0aG9kOiBzdHJpbmcsIHVyaTogc3RyaW5nIHwgUmVxdWVzdCwgb3B0aW9uczogYW55KSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmRlbGV0ZTxUPih1cmwsIG9wdGlvbnMpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGEgcmVxdWVzdCB3aXRoIGBwYXRjaGAgaHR0cCBtZXRob2QuXG4gICAqL1xuICBwYXRjaDxUPihcbiAgICB1cmw6IHN0cmluZyxcbiAgICBib2R5OiBhbnksXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIGhlYWRlcnM/OlxuICAgICAgICB8IEh0dHBIZWFkZXJzXG4gICAgICAgIHwge1xuICAgICAgICBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgICAgIH07XG4gICAgICBvYnNlcnZlPzogJ3Jlc3BvbnNlJztcbiAgICAgIHBhcmFtcz86XG4gICAgICAgIHwgSHR0cFBhcmFtc1xuICAgICAgICB8IHtcbiAgICAgICAgW3BhcmFtOiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgICAgIH07XG4gICAgICByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW47XG4gICAgICByZXNwb25zZVR5cGU/OiAnanNvbic7XG4gICAgICB3aXRoQ3JlZGVudGlhbHM/OiBib29sZWFuO1xuICAgIH0sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIHJldHVybiB0aGlzLmdldFBvc3REYXRhPFQ+KFxuICAgICAgJ3BhdGNoJyxcbiAgICAgIHVybCxcbiAgICAgIGJvZHksXG4gICAgICBvcHRpb25zLFxuICAgICAgKF9tZXRob2Q6IHN0cmluZywgdXJpOiBzdHJpbmcgfCBSZXF1ZXN0LCBib2R5OiBhbnksIG9wdGlvbnM6IGFueSk6IE9ic2VydmFibGU8YW55PiA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucGF0Y2g8VD4odXJsLCBib2R5LCBvcHRpb25zKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBhIHJlcXVlc3Qgd2l0aCBgaGVhZGAgaHR0cCBtZXRob2QuXG4gICAqL1xuICBoZWFkPFQ+KFxuICAgIHVybDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBoZWFkZXJzPzpcbiAgICAgICAgfCBIdHRwSGVhZGVyc1xuICAgICAgICB8IHtcbiAgICAgICAgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW107XG4gICAgICB9O1xuICAgICAgb2JzZXJ2ZT86ICdyZXNwb25zZSc7XG4gICAgICBwYXJhbXM/OlxuICAgICAgICB8IEh0dHBQYXJhbXNcbiAgICAgICAgfCB7XG4gICAgICAgIFtwYXJhbTogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW107XG4gICAgICB9O1xuICAgICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuO1xuICAgICAgcmVzcG9uc2VUeXBlPzogJ2pzb24nO1xuICAgICAgd2l0aENyZWRlbnRpYWxzPzogYm9vbGVhbjtcbiAgICB9LFxuICApOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5nZXREYXRhPFQ+KCdoZWFkJywgdXJsLCBvcHRpb25zLCAoX21ldGhvZDogc3RyaW5nLCB1cmk6IHN0cmluZyB8IFJlcXVlc3QsIG9wdGlvbnM6IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5oZWFkPFQ+KHVybCwgb3B0aW9ucyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgYSByZXF1ZXN0IHdpdGggYG9wdGlvbnNgIGh0dHAgbWV0aG9kLlxuICAgKi9cbiAgb3B0aW9uczxUPihcbiAgICB1cmw6IHN0cmluZyxcbiAgICBvcHRpb25zPzoge1xuICAgICAgaGVhZGVycz86XG4gICAgICAgIHwgSHR0cEhlYWRlcnNcbiAgICAgICAgfCB7XG4gICAgICAgIFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdO1xuICAgICAgfTtcbiAgICAgIG9ic2VydmU/OiAncmVzcG9uc2UnO1xuICAgICAgcGFyYW1zPzpcbiAgICAgICAgfCBIdHRwUGFyYW1zXG4gICAgICAgIHwge1xuICAgICAgICBbcGFyYW06IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdO1xuICAgICAgfTtcbiAgICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbjtcbiAgICAgIHJlc3BvbnNlVHlwZT86ICdqc29uJztcbiAgICAgIHdpdGhDcmVkZW50aWFscz86IGJvb2xlYW47XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RGF0YTxUPihcbiAgICAgICdvcHRpb25zJyxcbiAgICAgIHVybCxcbiAgICAgIG9wdGlvbnMsXG4gICAgICAoX21ldGhvZDogc3RyaW5nLCB1cmk6IHN0cmluZyB8IFJlcXVlc3QsIG9wdGlvbnM6IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50Lm9wdGlvbnM8VD4odXJsLCBvcHRpb25zKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGF0YTxUPihcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICB1cmk6IHN0cmluZyB8IFJlcXVlc3QsXG4gICAgb3B0aW9uczogYW55LFxuICAgIGNhbGxiYWNrOiAobWV0aG9kOiBzdHJpbmcsIHVyaTogc3RyaW5nIHwgUmVxdWVzdCwgb3B0aW9uczogYW55KSA9PiBPYnNlcnZhYmxlPGFueT4sXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIGxldCB1cmwgPSB1cmk7XG5cbiAgICBpZiAodHlwZW9mIHVyaSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHVybCA9IHVyaS51cmw7XG4gICAgfVxuXG4gICAgY29uc3QgdGVtcEtleSA9IHVybCArIChvcHRpb25zID8gSlNPTi5zdHJpbmdpZnkob3B0aW9ucykgOiAnJyk7XG4gICAgY29uc3Qga2V5ID0gbWFrZVN0YXRlS2V5PFQ+KHRlbXBLZXkpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXNvbHZlRGF0YTxUPihrZXkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhtZXRob2QsIHVyaSwgb3B0aW9ucykucGlwZShcbiAgICAgICAgdGFwKChkYXRhOiBUKSA9PiB7XG4gICAgICAgICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcbiAgICAgICAgICAgIC8vIENsaWVudCBvbmx5IGNvZGUuXG4gICAgICAgICAgICAvLyBub3RoaW5nO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNQbGF0Zm9ybVNlcnZlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICAgICAgICB0aGlzLnNldENhY2hlPFQ+KGtleSwgZGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRQb3N0RGF0YTxUPihcbiAgICBfbWV0aG9kOiBzdHJpbmcsXG4gICAgdXJpOiBzdHJpbmcgfCBSZXF1ZXN0LFxuICAgIGJvZHk6IGFueSxcbiAgICBvcHRpb25zOiBhbnksXG4gICAgY2FsbGJhY2s6IChtZXRob2Q6IHN0cmluZywgdXJpOiBzdHJpbmcgfCBSZXF1ZXN0LCBib2R5OiBhbnksIG9wdGlvbnM6IGFueSkgPT4gT2JzZXJ2YWJsZTxhbnk+LFxuICApOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICBsZXQgdXJsID0gdXJpO1xuXG4gICAgaWYgKHR5cGVvZiB1cmkgIT09ICdzdHJpbmcnKSB7XG4gICAgICB1cmwgPSB1cmkudXJsO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBLZXkgPVxuICAgICAgdXJsICsgKGJvZHkgPyBKU09OLnN0cmluZ2lmeShib2R5KSA6ICcnKSArIChvcHRpb25zID8gSlNPTi5zdHJpbmdpZnkob3B0aW9ucykgOiAnJyk7XG4gICAgY29uc3Qga2V5ID0gbWFrZVN0YXRlS2V5PFQ+KHRlbXBLZXkpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmVEYXRhPFQ+KGtleSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKF9tZXRob2QsIHVyaSwgYm9keSwgb3B0aW9ucykucGlwZShcbiAgICAgICAgdGFwKChkYXRhOiBUKSA9PiB7XG4gICAgICAgICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcbiAgICAgICAgICAgIC8vIENsaWVudCBvbmx5IGNvZGUuXG4gICAgICAgICAgICAvLyBub3RoaW5nO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNQbGF0Zm9ybVNlcnZlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICAgICAgICB0aGlzLnNldENhY2hlPFQ+KGtleSwgZGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlRGF0YTxUPihrZXk6IFN0YXRlS2V5PFQ+KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0RnJvbUNhY2hlPFQ+KGtleSk7XG5cbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgIH1cblxuICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICAvLyBDbGllbnQgb25seSBjb2RlLlxuICAgICAgdGhpcy50cmFuc2ZlclN0YXRlLnJlbW92ZShrZXkpO1xuICAgIH1cbiAgICBpZiAoaXNQbGF0Zm9ybVNlcnZlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICAvLyBTZXJ2ZXIgb25seSBjb2RlLlxuICAgIH1cblxuICAgIHJldHVybiBmcm9tKFByb21pc2UucmVzb2x2ZTxUPihkYXRhKSk7XG4gIH1cblxuICBwcml2YXRlIHNldENhY2hlPFQ+KGtleTogU3RhdGVLZXk8VD4sIGRhdGE6IFQpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2ZlclN0YXRlLnNldDxUPihrZXksIGRhdGEpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRGcm9tQ2FjaGU8VD4oa2V5OiBTdGF0ZUtleTxUPik6IFQge1xuICAgIHJldHVybiB0aGlzLnRyYW5zZmVyU3RhdGUuZ2V0PFQ+KGtleSwge30gYXMgVCk7XG4gIH1cbn1cbiJdfQ==