@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
126 lines • 18.3 kB
JavaScript
import { Injectable } from '@angular/core';
import { AlertService } from '@c8y/ngx-components';
import { orderBy, isEqual, remove, some } from 'lodash-es';
import { InventoryService, FetchClient } from '@c8y/client';
import { TranslateService } from '@ngx-translate/core';
import * as i0 from "@angular/core";
import * as i1 from "@c8y/ngx-components";
import * as i2 from "@c8y/client";
import * as i3 from "@ngx-translate/core";
export class ReportsService {
constructor(alertService, inventoryService, client, translateService) {
this.alertService = alertService;
this.inventoryService = inventoryService;
this.client = client;
this.translateService = translateService;
this.microserviceUrl = '/service/reporting';
this.headers = { 'Content-Type': 'application/json' };
this.isReportAgentSubscribed = true;
this.REPORT_AGENT_NOT_SUBSCRIBED_EXPECTED_ERROR_LOWER_CASE = 'microservice/not found';
}
async getExport(exportId) {
let exp;
const exportDetail = await this.inventoryService.detail(exportId);
const { data, res } = exportDetail;
if (res.status !== 200) {
this.alertService.addServerFailure({ data, res });
}
else {
exp = data ? data : {};
}
return exp;
}
async getScheduleList(exportId) {
const exp = await this.getExport(exportId);
return this.extractScheduleListFromExport(exp);
}
extractScheduleListFromExport(exp) {
let scheduleList;
if (exp) {
scheduleList = exp.c8y_ScheduleConfiguration ? exp.c8y_ScheduleConfiguration : [];
}
return orderBy(scheduleList, ['timestamp'], ['desc']);
}
async addSchedule(schedule, exportId) {
return await this.updateSchedules(exportId, [], [schedule]);
}
async updateSchedule(oldSchedule, schedule, exportId) {
return await this.updateSchedules(exportId, [oldSchedule], [schedule]);
}
async updateSchedules(exportId, schedulesToRemove = [], schedulesToAdd = []) {
let success = false;
const exp = await this.getExport(exportId);
const schedules = this.extractScheduleListFromExport(exp);
remove(schedules, (schedule) => some(schedulesToRemove, (scheduleToRemove) => isEqual(schedule, scheduleToRemove)));
schedules.push(...schedulesToAdd);
exp.c8y_ScheduleConfiguration = schedules;
const { data, res } = await this.inventoryService.update(exp);
if (res.status === 200) {
success = await this.reschedule(exportId);
}
else {
this.alertService.addServerFailure({ data, res });
}
return success;
}
async reschedule(exportId) {
const options = {
method: 'PUT',
headers: this.headers
};
const rescheduling = await this.client.fetch(`${this.microserviceUrl}/schedule/${exportId}`, options);
return rescheduling.status === 200;
}
async deleteSchedule(schedule, exportId) {
return await this.updateSchedules(exportId, [schedule], []);
}
/**
* Removes report configuration.
*
* Note: fallback strategy is based on error code returned by backend
* in case of missing subscription for report-agent microservice.
* @param config entity of report configuration
* @returns Response wrapped in [[IFetchResponse]]
*/
async removeConfiguration(config) {
let res;
if (!this.isReportAgentSubscribed) {
res = await this.fallbackConfigurationRemoval(config);
}
else {
res = await this.normalConfigurationRemoval(config);
if (res.status === 404) {
const data = await res.json();
if (data &&
data.error &&
data.error.toLowerCase() === this.REPORT_AGENT_NOT_SUBSCRIBED_EXPECTED_ERROR_LOWER_CASE) {
res = await this.fallbackConfigurationRemoval(config);
this.isReportAgentSubscribed = false;
}
}
}
return res;
}
async normalConfigurationRemoval(config) {
const url = `${this.microserviceUrl}/config/${config.id}`;
return await this.client.fetch(url, { method: 'DELETE' });
}
async fallbackConfigurationRemoval(config) {
let res;
try {
res = (await this.inventoryService.delete(config)).res;
}
catch (e) {
// this could be an error related to not existing object or anything else which makes request return error status code
// in case of concurrent removal everything is fine, therefor warning message. But it might not recover from some errors
this.alertService.addServerFailure(e, 'warning');
}
return res;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ReportsService, deps: [{ token: i1.AlertService }, { token: i2.InventoryService }, { token: i2.FetchClient }, { token: i3.TranslateService }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ReportsService }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ReportsService, decorators: [{
type: Injectable
}], ctorParameters: () => [{ type: i1.AlertService }, { type: i2.InventoryService }, { type: i2.FetchClient }, { type: i3.TranslateService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0cy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcmVwb3J0cy9yZXBvcnRzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUMzRCxPQUFPLEVBQ0wsZ0JBQWdCLEVBSWhCLFdBQVcsRUFFWixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7QUFHdkQsTUFBTSxPQUFPLGNBQWM7SUFNekIsWUFDVSxZQUEwQixFQUMxQixnQkFBa0MsRUFDbEMsTUFBbUIsRUFDbkIsZ0JBQWtDO1FBSGxDLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsV0FBTSxHQUFOLE1BQU0sQ0FBYTtRQUNuQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBRTFDLElBQUksQ0FBQyxlQUFlLEdBQUcsb0JBQW9CLENBQUM7UUFDNUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxDQUFDO1FBQ3RELElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUM7UUFDcEMsSUFBSSxDQUFDLHFEQUFxRCxHQUFHLHdCQUF3QixDQUFDO0lBQ3hGLENBQUM7SUFFRCxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQXFCO1FBQ25DLElBQUksR0FBVyxDQUFDO1FBQ2hCLE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNsRSxNQUFN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SSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQztnQkFDdkMsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQsS0FBSyxDQUFDLDBCQUEwQixDQUFDLE1BQW1CO1FBQ2xELE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLGVBQWUsV0FBVyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDMUQsT0FBTyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRCxLQUFLLENBQUMsNEJBQTRCLENBQUMsTUFBbUI7UUFDcEQsSUFBSSxHQUFHLENBQUM7UUFDUixJQUFJLENBQUM7WUFDSCxHQUFHLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDekQsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxzSEFBc0g7WUFDdEgsd0hBQXdIO1lBQ3hILElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ25ELENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7K0dBeklVLGNBQWM7bUhBQWQsY0FBYzs7NEZBQWQsY0FBYztrQkFEMUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEV4cG9ydCwgU2NoZWR1bGUgfSBmcm9tICcuL2V4cG9ydC1zY2hlZHVsZXMuaW50ZXJmYWNlJztcbmltcG9ydCB7IEFsZXJ0U2VydmljZSB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgb3JkZXJCeSwgaXNFcXVhbCwgcmVtb3ZlLCBzb21lIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7XG4gIEludmVudG9yeVNlcnZpY2UsXG4gIElkUmVmZXJlbmNlLFxuICBJRmV0Y2hSZXNwb25zZSxcbiAgSUlkZW50aWZpZWQsXG4gIEZldGNoQ2xpZW50LFxuICBJRmV0Y2hPcHRpb25zXG59IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJlcG9ydHNTZXJ2aWNlIHtcbiAgbWljcm9zZXJ2aWNlVXJsOiBzdHJpbmc7XG4gIGhlYWRlcnM6IGFueTtcbiAgaXNSZXBvcnRBZ2VudFN1YnNjcmliZWQ6IGJvb2xlYW47XG4gIFJFUE9SVF9BR0VOVF9OT1RfU1VCU0NSSUJFRF9FWFBFQ1RFRF9FUlJPUl9MT1dFUl9DQVNFOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcbiAgICBwcml2YXRlIGludmVudG9yeVNlcnZpY2U6IEludmVudG9yeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjbGllbnQ6IEZldGNoQ2xpZW50LFxuICAgIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZVxuICApIHtcbiAgICB0aGlzLm1pY3Jvc2VydmljZVVybCA9ICcvc2VydmljZS9yZXBvcnRpbmcnO1xuICAgIHRoaXMuaGVhZGVycyA9IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9O1xuICAgIHRoaXMuaXNSZXBvcnRBZ2VudFN1YnNjcmliZWQgPSB0cnVlO1xuICAgIHRoaXMuUkVQT1JUX0FHRU5UX05PVF9TVUJTQ1JJQkVEX0VYUEVDVEVEX0VSUk9SX0xPV0VSX0NBU0UgPSAnbWljcm9zZXJ2aWNlL25vdCBmb3VuZCc7XG4gIH1cblxuICBhc3luYyBnZXRFeHBvcnQoZXhwb3J0SWQ6IElkUmVmZXJlbmNlKSB7XG4gICAgbGV0IGV4cDogRXhwb3J0O1xuICAgIGNvbnN0IGV4cG9ydERldGFpbCA9IGF3YWl0IHRoaXMuaW52ZW50b3J5U2VydmljZS5kZXRhaWwoZXhwb3J0SWQpO1xuICAgIGNvbnN0IHsgZGF0YSwgcmVzIH0gPSBleHBvcnREZXRhaWw7XG4gICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkge1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkU2VydmVyRmFpbHVyZSh7IGRhdGEsIHJlcyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhwID0gZGF0YSA/IChkYXRhIGFzIHVua25vd24gYXMgRXhwb3J0KSA6ICh7fSBhcyBFeHBvcnQpO1xuICAgIH1cblxuICAgIHJldHVybiBleHA7XG4gIH1cblxuICBhc3luYyBnZXRTY2hlZHVsZUxpc3QoZXhwb3J0SWQ6IElkUmVmZXJlbmNlKSB7XG4gICAgY29uc3QgZXhwID0gYXdhaXQgdGhpcy5nZXRFeHBvcnQoZXhwb3J0SWQpO1xuXG4gICAgcmV0dXJuIHRoaXMuZXh0cmFjdFNjaGVkdWxlTGlzdEZyb21FeHBvcnQoZXhwKTtcbiAgfVxuXG4gIGV4dHJhY3RTY2hlZHVsZUxpc3RGcm9tRXhwb3J0KGV4cDogRXhwb3J0KSB7XG4gICAgbGV0IHNjaGVkdWxlTGlzdDogU2NoZWR1bGVbXTtcbiAgICBpZiAoZXhwKSB7XG4gICAgICBzY2hlZHVsZUxpc3QgPSBleHAuYzh5X1NjaGVkdWxlQ29uZmlndXJhdGlvbiA/IGV4cC5jOHlfU2NoZWR1bGVDb25maWd1cmF0aW9uIDogW107XG4gICAgfVxuICAgIHJldHVybiBvcmRlckJ5KHNjaGVkdWxlTGlzdCwgWyd0aW1lc3RhbXAnXSwgWydkZXNjJ10pO1xuICB9XG5cbiAgYXN5bmMgYWRkU2NoZWR1bGUoc2NoZWR1bGU6IFNjaGVkdWxlLCBleHBvcnRJZDogSWRSZWZlcmVuY2UpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy51cGRhdGVTY2hlZHVsZXMoZXhwb3J0SWQsIFtdLCBbc2NoZWR1bGVdKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZVNjaGVkdWxlKG9sZFNjaGVkdWxlOiBTY2hlZHVsZSwgc2NoZWR1bGU6IFNjaGVkdWxlLCBleHBvcnRJZDogSWRSZWZlcmVuY2UpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy51cGRhdGVTY2hlZHVsZXMoZXhwb3J0SWQsIFtvbGRTY2hlZHVsZV0sIFtzY2hlZHVsZV0pO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlU2NoZWR1bGVzKFxuICAgIGV4cG9ydElkOiBJZFJlZmVyZW5jZSxcbiAgICBzY2hlZHVsZXNUb1JlbW92ZTogU2NoZWR1bGVbXSA9IFtdLFxuICAgIHNjaGVkdWxlc1RvQWRkOiBTY2hlZHVsZVtdID0gW11cbiAgKSB7XG4gICAgbGV0IHN1Y2Nlc3MgPSBmYWxzZTtcbiAgICBjb25zdCBleHAgPSBhd2FpdCB0aGlzLmdldEV4cG9ydChleHBvcnRJZCk7XG4gICAgY29uc3Qgc2NoZWR1bGVzID0gdGhpcy5leHRyYWN0U2NoZWR1bGVMaXN0RnJvbUV4cG9ydChleHApO1xuXG4gICAgcmVtb3ZlKHNjaGVkdWxlcywgKHNjaGVkdWxlOiBTY2hlZHVsZSkgPT5cbiAgICAgIHNvbWUoc2NoZWR1bGVzVG9SZW1vdmUsIChzY2hlZHVsZVRvUmVtb3ZlOiBTY2hlZHVsZSkgPT4gaXNFcXVhbChzY2hlZHVsZSwgc2NoZWR1bGVUb1JlbW92ZSkpXG4gICAgKTtcbiAgICBzY2hlZHVsZXMucHVzaCguLi5zY2hlZHVsZXNUb0FkZCk7XG4gICAgZXhwLmM4eV9TY2hlZHVsZUNvbmZpZ3VyYXRpb24gPSBzY2hlZHVsZXM7XG4gICAgY29uc3QgeyBkYXRhLCByZXMgfSA9IGF3YWl0IHRoaXMuaW52ZW50b3J5U2VydmljZS51cGRhdGUoZXhwKTtcbiAgICBpZiAocmVzLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICBzdWNjZXNzID0gYXdhaXQgdGhpcy5yZXNjaGVkdWxlKGV4cG9ydElkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkU2VydmVyRmFpbHVyZSh7IGRhdGEsIHJlcyB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VjY2VzcztcbiAgfVxuXG4gIGFzeW5jIHJlc2NoZWR1bGUoZXhwb3J0SWQ6IElkUmVmZXJlbmNlKSB7XG4gICAgY29uc3Qgb3B0aW9uczogSUZldGNoT3B0aW9ucyA9IHtcbiAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnNcbiAgICB9O1xuICAgIGNvbnN0IHJlc2NoZWR1bGluZyA9IGF3YWl0IHRoaXMuY2xpZW50LmZldGNoKFxuICAgICAgYCR7dGhpcy5taWNyb3NlcnZpY2VVcmx9L3NjaGVkdWxlLyR7ZXhwb3J0SWR9YCxcbiAgICAgIG9wdGlvbnNcbiAgICApO1xuICAgIHJldHVybiByZXNjaGVkdWxpbmcuc3RhdHVzID09PSAyMDA7XG4gIH1cblxuICBhc3luYyBkZWxldGVTY2hlZHVsZShzY2hlZHVsZTogU2NoZWR1bGUsIGV4cG9ydElkOiBJZFJlZmVyZW5jZSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnVwZGF0ZVNjaGVkdWxlcyhleHBvcnRJZCwgW3NjaGVkdWxlXSwgW10pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgcmVwb3J0IGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIE5vdGU6IGZhbGxiYWNrIHN0cmF0ZWd5IGlzIGJhc2VkIG9uIGVycm9yIGNvZGUgcmV0dXJuZWQgYnkgYmFja2VuZFxuICAgKiBpbiBjYXNlIG9mIG1pc3Npbmcgc3Vic2NyaXB0aW9uIGZvciByZXBvcnQtYWdlbnQgbWljcm9zZXJ2aWNlLlxuICAgKiBAcGFyYW0gY29uZmlnIGVudGl0eSBvZiByZXBvcnQgY29uZmlndXJhdGlvblxuICAgKiBAcmV0dXJucyBSZXNwb25zZSB3cmFwcGVkIGluIFtbSUZldGNoUmVzcG9uc2VdXVxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlQ29uZmlndXJhdGlvbihjb25maWc6IElJZGVudGlmaWVkKTogUHJvbWlzZTxJRmV0Y2hSZXNwb25zZT4ge1xuICAgIGxldCByZXM6IElGZXRjaFJlc3BvbnNlO1xuICAgIGlmICghdGhpcy5pc1JlcG9ydEFnZW50U3Vic2NyaWJlZCkge1xuICAgICAgcmVzID0gYXdhaXQgdGhpcy5mYWxsYmFja0NvbmZpZ3VyYXRpb25SZW1vdmFsKGNvbmZpZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcyA9IGF3YWl0IHRoaXMubm9ybWFsQ29uZmlndXJhdGlvblJlbW92YWwoY29uZmlnKTtcbiAgICAgIGlmIChyZXMuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBkYXRhICYmXG4gICAgICAgICAgZGF0YS5lcnJvciAmJlxuICAgICAgICAgIGRhdGEuZXJyb3IudG9Mb3dlckNhc2UoKSA9PT0gdGhpcy5SRVBPUlRfQUdFTlRfTk9UX1NVQlNDUklCRURfRVhQRUNURURfRVJST1JfTE9XRVJfQ0FTRVxuICAgICAgICApIHtcbiAgICAgICAgICByZXMgPSBhd2FpdCB0aGlzLmZhbGxiYWNrQ29uZmlndXJhdGlvblJlbW92YWwoY29uZmlnKTtcbiAgICAgICAgICB0aGlzLmlzUmVwb3J0QWdlbnRTdWJzY3JpYmVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIGFzeW5jIG5vcm1hbENvbmZpZ3VyYXRpb25SZW1vdmFsKGNvbmZpZzogSUlkZW50aWZpZWQpOiBQcm9taXNlPElGZXRjaFJlc3BvbnNlPiB7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5taWNyb3NlcnZpY2VVcmx9L2NvbmZpZy8ke2NvbmZpZy5pZH1gO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaCh1cmwsIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbiAgfVxuXG4gIGFzeW5jIGZhbGxiYWNrQ29uZmlndXJhdGlvblJlbW92YWwoY29uZmlnOiBJSWRlbnRpZmllZCk6IFByb21pc2U8SUZldGNoUmVzcG9uc2U+IHtcbiAgICBsZXQgcmVzO1xuICAgIHRyeSB7XG4gICAgICByZXMgPSAoYXdhaXQgdGhpcy5pbnZlbnRvcnlTZXJ2aWNlLmRlbGV0ZShjb25maWcpKS5yZXM7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gdGhpcyBjb3VsZCBiZSBhbiBlcnJvciByZWxhdGVkIHRvIG5vdCBleGlzdGluZyBvYmplY3Qgb3IgYW55dGhpbmcgZWxzZSB3aGljaCBtYWtlcyByZXF1ZXN0IHJldHVybiBlcnJvciBzdGF0dXMgY29kZVxuICAgICAgLy8gaW4gY2FzZSBvZiBjb25jdXJyZW50IHJlbW92YWwgZXZlcnl0aGluZyBpcyBmaW5lLCB0aGVyZWZvciB3YXJuaW5nIG1lc3NhZ2UuIEJ1dCBpdCBtaWdodCBub3QgcmVjb3ZlciBmcm9tIHNvbWUgZXJyb3JzXG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGUsICd3YXJuaW5nJyk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cbn1cbiJdfQ==