@synerty/vortexjs
Version:
Custom observable data serialisation and routing based on Angular 2+
121 lines • 16.3 kB
JavaScript
import { Payload } from "./Payload";
import { Inject, Injectable } from "@angular/core";
import { PayloadEndpoint } from "./PayloadEndpoint";
import { TupleLoader } from "./TupleLoader";
import { VortexStatusService } from "./VortexStatusService";
import { VortexClientHttp } from "./VortexClientHttp";
import { VortexClientWebsocket } from "./VortexClientWebsocket";
import { dateStr } from "./UtilMisc";
import * as i0 from "@angular/core";
export class VortexService {
vortexStatusService;
vortex;
static vortexUrl = "/vortex";
static vortexClientName = "";
constructor(vortexStatusService) {
this.vortexStatusService = vortexStatusService;
this.reconnect() //
.catch((e) => console.log(`${dateStr()} VortexService constructor reconnect failed`));
}
/**
* Set Vortex URL
*
* This method should not be used except in rare cases, such as an ios or android app.
*
* @param url: The new URL for the vortex to use.
*/
static setVortexUrl(url) {
VortexService.vortexUrl = url;
}
/**
* Set Vortex Name
*
* @param vortexClientName: The vortexClientName to tell the server that we are.
*/
static setVortexClientName(vortexClientName) {
VortexService.vortexClientName = vortexClientName;
}
async reconnect() {
if (VortexService.vortexUrl == null) {
this.vortexStatusService.setOnline(false);
return;
}
if (VortexService.vortexClientName == "") {
throw new Error("VortexService.setVortexClientName() not set yet");
}
if (this.vortex != null)
await this.vortex.close();
if (VortexService.vortexUrl.toLowerCase().startsWith("ws")) {
this.vortex = new VortexClientWebsocket(this.vortexStatusService, VortexService.vortexUrl, VortexService.vortexClientName);
}
else {
this.vortex = new VortexClientHttp(this.vortexStatusService, VortexService.vortexUrl, VortexService.vortexClientName);
}
await this.vortex.reconnect();
}
sendTuple(filt, tuples) {
if (typeof filt === "string") {
filt = { key: filt };
}
this.sendPayload(new Payload(filt, tuples));
}
sendFilt(filt) {
this.sendPayload(new Payload(filt));
}
/** Send Payload
*
* @param {Payload[] | Payload} payload
* @returns {Promise<void>}
*/
sendPayload(payload) {
if (this.vortex == null) {
throw new Error("The vortex is not initialised yet.");
}
let payloads = [];
if (payload instanceof Array)
payloads = payload;
else
payloads = [payload];
let promises = [];
for (let payload of payloads) {
promises.push(payload
.makePayloadEnvelope()
.then((payloadEnvelope) => {
this.vortex.send(payloadEnvelope);
}));
}
let ret = Promise.all(promises);
return ret;
}
/** Send Payload Envelope(s)
*
* @param {PayloadEnvelope[] | PayloadEnvelope} payloadEnvelope
* @returns {Promise<void>}
*/
sendPayloadEnvelope(payloadEnvelope) {
if (this.vortex == null) {
throw new Error("The vortex is not initialised yet.");
}
return this.vortex.send(payloadEnvelope);
}
createEndpointObservable(component, filter, processLatestOnly = false) {
let endpoint = new PayloadEndpoint(component, filter, processLatestOnly);
return this.createEndpoint(component, filter, processLatestOnly)
.observable;
}
createEndpoint(component, filter, processLatestOnly = false) {
return new PayloadEndpoint(component, filter, processLatestOnly);
}
createTupleLoader(component, filterUpdateCallable) {
return new TupleLoader(this.vortex, this.vortexStatusService, component, filterUpdateCallable);
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: VortexService, deps: [{ token: VortexStatusService }], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: VortexService });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: VortexService, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
type: Inject,
args: [VortexStatusService]
}] }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVm9ydGV4U2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy92b3J0ZXgvVm9ydGV4U2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWdCLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNsRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUduRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUF5QixXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFNUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHaEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFlBQVksQ0FBQzs7QUFHckMsTUFBTSxPQUFPLGFBQWE7SUFLMkI7SUFKekMsTUFBTSxDQUFrQjtJQUN4QixNQUFNLENBQUMsU0FBUyxHQUFrQixTQUFTLENBQUM7SUFDNUMsTUFBTSxDQUFDLGdCQUFnQixHQUFXLEVBQUUsQ0FBQztJQUU3QyxZQUFpRCxtQkFBbUI7UUFBbkIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFBO1FBQ2hFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFO2FBQ2QsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDVCxPQUFPLENBQUMsR0FBRyxDQUNQLEdBQUcsT0FBTyxFQUFFLDZDQUE2QyxDQUM1RCxDQUNKLENBQUM7SUFDVixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFrQjtRQUNsQyxhQUFhLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7Ozs7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QztJQUM3QyxDQUFDO0lBRUQsd0JBQXdCLENBQ3BCLFNBQTRCLEVBQzVCLE1BQW9CLEVBQ3BCLG9CQUE2QixLQUFLO1FBRWxDLElBQUksUUFBUSxHQUFHLElBQUksZUFBZSxDQUM5QixTQUFTLEVBQ1QsTUFBTSxFQUNOLGlCQUFpQixDQUNwQixDQUFDO1FBRUYsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsaUJBQWlCLENBQUM7YUFDM0QsVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxjQUFjLENBQ1YsU0FBNEIsRUFDNUIsTUFBb0IsRUFDcEIsb0JBQTZCLEtBQUs7UUFFbEMsT0FBTyxJQUFJLGVBQWUsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVELGlCQUFpQixDQUNiLFNBQTRCLEVBQzVCLG9CQUEwRDtRQUUxRCxPQUFPLElBQUksV0FBVyxDQUNsQixJQUFJLENBQUMsTUFBTSxFQUNYLElBQUksQ0FBQyxtQkFBbUIsRUFDeEIsU0FBUyxFQUNULG9CQUFvQixDQUN2QixDQUFDO0lBQ04sQ0FBQzt3R0FySlEsYUFBYSxrQkFLRixtQkFBbUI7NEdBTDlCLGFBQWE7OzRGQUFiLGFBQWE7a0JBRHpCLFVBQVU7OzBCQU1NLE1BQU07MkJBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSVBheWxvYWRGaWx0LCBQYXlsb2FkIH0gZnJvbSBcIi4vUGF5bG9hZFwiO1xuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IFR1cGxlIH0gZnJvbSBcIi4vZXhwb3J0c1wiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBQYXlsb2FkRW5kcG9pbnQgfSBmcm9tIFwiLi9QYXlsb2FkRW5kcG9pbnRcIjtcbmltcG9ydCB7IElGaWx0ZXJVcGRhdGVDYWxsYWJsZSwgVHVwbGVMb2FkZXIgfSBmcm9tIFwiLi9UdXBsZUxvYWRlclwiO1xuaW1wb3J0IHsgVm9ydGV4U3RhdHVzU2VydmljZSB9IGZyb20gXCIuL1ZvcnRleFN0YXR1c1NlcnZpY2VcIjtcbmltcG9ydCB7IFZvcnRleENsaWVudEFCQyB9IGZyb20gXCIuL1ZvcnRleENsaWVudEFCQ1wiO1xuaW1wb3J0IHsgVm9ydGV4Q2xpZW50SHR0cCB9IGZyb20gXCIuL1ZvcnRleENsaWVudEh0dHBcIjtcbmltcG9ydCB7IFZvcnRleENsaWVudFdlYnNvY2tldCB9IGZyb20gXCIuL1ZvcnRleENsaWVudFdlYnNvY2tldFwiO1xuaW1wb3J0IHsgUGF5bG9hZEVudmVsb3BlIH0gZnJvbSBcIi4vUGF5bG9hZEVudmVsb3BlXCI7XG5pbXBvcnQgeyBOZ0xpZmVDeWNsZUV2ZW50cyB9IGZyb20gXCIuLi91dGlsL05nTGlmZUN5Y2xlRXZlbnRzXCI7XG5pbXBvcnQgeyBkYXRlU3RyIH0gZnJvbSBcIi4vVXRpbE1pc2NcIjtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFZvcnRleFNlcnZpY2Uge1xuICAgIHByaXZhdGUgdm9ydGV4OiBWb3J0ZXhDbGllbnRBQkM7XG4gICAgcHJpdmF0ZSBzdGF0aWMgdm9ydGV4VXJsOiBzdHJpbmcgfCBudWxsID0gXCIvdm9ydGV4XCI7XG4gICAgcHJpdmF0ZSBzdGF0aWMgdm9ydGV4Q2xpZW50TmFtZTogc3RyaW5nID0gXCJcIjtcblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoVm9ydGV4U3RhdHVzU2VydmljZSkgcHJpdmF0ZSB2b3J0ZXhTdGF0dXNTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMucmVjb25uZWN0KCkgLy9cbiAgICAgICAgICAgIC5jYXRjaCgoZSkgPT5cbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgICAgYCR7ZGF0ZVN0cigpfSBWb3J0ZXhTZXJ2aWNlIGNvbnN0cnVjdG9yIHJlY29ubmVjdCBmYWlsZWRgXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgVm9ydGV4IFVSTFxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkIGV4Y2VwdCBpbiByYXJlIGNhc2VzLCBzdWNoIGFzIGFuIGlvcyBvciBhbmRyb2lkIGFwcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB1cmw6IFRoZSBuZXcgVVJMIGZvciB0aGUgdm9ydGV4IHRvIHVzZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgc2V0Vm9ydGV4VXJsKHVybDogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICBWb3J0ZXhTZXJ2aWNlLnZvcnRleFVybCA9IHVybDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgVm9ydGV4IE5hbWVcbiAgICAgKlxuICAgICAqIEBwYXJhbSB2b3J0ZXhDbGllbnROYW1lOiBUaGUgdm9ydGV4Q2xpZW50TmFtZSB0byB0ZWxsIHRoZSBzZXJ2ZXIgdGhhdCB3ZSBhcmUuXG4gICAgICovXG4gICAgc3RhdGljIHNldFZvcnRleENsaWVudE5hbWUodm9ydGV4Q2xpZW50TmFtZTogc3RyaW5nKSB7XG4gICAgICAgIFZvcnRleFNlcnZpY2Uudm9ydGV4Q2xpZW50TmFtZSA9IHZvcnRleENsaWVudE5hbWU7XG4gICAgfVxuXG4gICAgYXN5bmMgcmVjb25uZWN0KCkge1xuICAgICAgICBpZiAoVm9ydGV4U2VydmljZS52b3J0ZXhVcmwgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy52b3J0ZXhTdGF0dXNTZXJ2aWNlLnNldE9ubGluZShmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoVm9ydGV4U2VydmljZS52b3J0ZXhDbGllbnROYW1lID09IFwiXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlZvcnRleFNlcnZpY2Uuc2V0Vm9ydGV4Q2xpZW50TmFtZSgpIG5vdCBzZXQgeWV0XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudm9ydGV4ICE9IG51bGwpIGF3YWl0IHRoaXMudm9ydGV4LmNsb3NlKCk7XG5cbiAgICAgICAgaWYgKFZvcnRleFNlcnZpY2Uudm9ydGV4VXJsLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChcIndzXCIpKSB7XG4gICAgICAgICAgICB0aGlzLnZvcnRleCA9IG5ldyBWb3J0ZXhDbGllbnRXZWJzb2NrZXQoXG4gICAgICAgICAgICAgICAgdGhpcy52b3J0ZXhTdGF0dXNTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIFZvcnRleFNlcnZpY2Uudm9ydGV4VXJsLFxuICAgICAgICAgICAgICAgIFZvcnRleFNlcnZpY2Uudm9ydGV4Q2xpZW50TmFtZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudm9ydGV4ID0gbmV3IFZvcnRleENsaWVudEh0dHAoXG4gICAgICAgICAgICAgICAgdGhpcy52b3J0ZXhTdGF0dXNTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIFZvcnRleFNlcnZpY2Uudm9ydGV4VXJsLFxuICAgICAgICAgICAgICAgIFZvcnRleFNlcnZpY2Uudm9ydGV4Q2xpZW50TmFtZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMudm9ydGV4LnJlY29ubmVjdCgpO1xuICAgIH1cblxuICAgIHNlbmRUdXBsZShmaWx0OiBJUGF5bG9hZEZpbHQgfCBzdHJpbmcsIHR1cGxlczogYW55W10gfCBUdXBsZVtdKTogdm9pZCB7XG4gICAgICAgIGlmICh0eXBlb2YgZmlsdCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgZmlsdCA9IHsga2V5OiBmaWx0IH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZW5kUGF5bG9hZChuZXcgUGF5bG9hZChmaWx0LCB0dXBsZXMpKTtcbiAgICB9XG5cbiAgICBzZW5kRmlsdChmaWx0KTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VuZFBheWxvYWQobmV3IFBheWxvYWQoZmlsdCkpO1xuICAgIH1cblxuICAgIC8qKiBTZW5kIFBheWxvYWRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UGF5bG9hZFtdIHwgUGF5bG9hZH0gcGF5bG9hZFxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgICAqL1xuICAgIHNlbmRQYXlsb2FkKHBheWxvYWQ6IFBheWxvYWRbXSB8IFBheWxvYWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMudm9ydGV4ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSB2b3J0ZXggaXMgbm90IGluaXRpYWxpc2VkIHlldC5cIik7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGF5bG9hZHM6IFBheWxvYWRbXSA9IFtdO1xuICAgICAgICBpZiAocGF5bG9hZCBpbnN0YW5jZW9mIEFycmF5KSBwYXlsb2FkcyA9IHBheWxvYWQ7XG4gICAgICAgIGVsc2UgcGF5bG9hZHMgPSBbcGF5bG9hZF07XG5cbiAgICAgICAgbGV0IHByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgcGF5bG9hZCBvZiBwYXlsb2Fkcykge1xuICAgICAgICAgICAgcHJvbWlzZXMucHVzaChcbiAgICAgICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICAgICAgICAgICAgIC5tYWtlUGF5bG9hZEVudmVsb3BlKClcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKHBheWxvYWRFbnZlbG9wZTogUGF5bG9hZEVudmVsb3BlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZvcnRleC5zZW5kKHBheWxvYWRFbnZlbG9wZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXQ6IGFueSA9IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICAvKiogU2VuZCBQYXlsb2FkIEVudmVsb3BlKHMpXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BheWxvYWRFbnZlbG9wZVtdIHwgUGF5bG9hZEVudmVsb3BlfSBwYXlsb2FkRW52ZWxvcGVcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICAgKi9cbiAgICBzZW5kUGF5bG9hZEVudmVsb3BlKFxuICAgICAgICBwYXlsb2FkRW52ZWxvcGU6IFBheWxvYWRFbnZlbG9wZVtdIHwgUGF5bG9hZEVudmVsb3BlXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLnZvcnRleCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgdm9ydGV4IGlzIG5vdCBpbml0aWFsaXNlZCB5ZXQuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnZvcnRleC5zZW5kKHBheWxvYWRFbnZlbG9wZSk7XG4gICAgfVxuXG4gICAgY3JlYXRlRW5kcG9pbnRPYnNlcnZhYmxlKFxuICAgICAgICBjb21wb25lbnQ6IE5nTGlmZUN5Y2xlRXZlbnRzLFxuICAgICAgICBmaWx0ZXI6IElQYXlsb2FkRmlsdCxcbiAgICAgICAgcHJvY2Vzc0xhdGVzdE9ubHk6IGJvb2xlYW4gPSBmYWxzZVxuICAgICk6IE9ic2VydmFibGU8UGF5bG9hZEVudmVsb3BlPiB7XG4gICAgICAgIGxldCBlbmRwb2ludCA9IG5ldyBQYXlsb2FkRW5kcG9pbnQoXG4gICAgICAgICAgICBjb21wb25lbnQsXG4gICAgICAgICAgICBmaWx0ZXIsXG4gICAgICAgICAgICBwcm9jZXNzTGF0ZXN0T25seVxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUVuZHBvaW50KGNvbXBvbmVudCwgZmlsdGVyLCBwcm9jZXNzTGF0ZXN0T25seSlcbiAgICAgICAgICAgIC5vYnNlcnZhYmxlO1xuICAgIH1cblxuICAgIGNyZWF0ZUVuZHBvaW50KFxuICAgICAgICBjb21wb25lbnQ6IE5nTGlmZUN5Y2xlRXZlbnRzLFxuICAgICAgICBmaWx0ZXI6IElQYXlsb2FkRmlsdCxcbiAgICAgICAgcHJvY2Vzc0xhdGVzdE9ubHk6IGJvb2xlYW4gPSBmYWxzZVxuICAgICk6IFBheWxvYWRFbmRwb2ludCB7XG4gICAgICAgIHJldHVybiBuZXcgUGF5bG9hZEVuZHBvaW50KGNvbXBvbmVudCwgZmlsdGVyLCBwcm9jZXNzTGF0ZXN0T25seSk7XG4gICAgfVxuXG4gICAgY3JlYXRlVHVwbGVMb2FkZXIoXG4gICAgICAgIGNvbXBvbmVudDogTmdMaWZlQ3ljbGVFdmVudHMsXG4gICAgICAgIGZpbHRlclVwZGF0ZUNhbGxhYmxlOiBJRmlsdGVyVXBkYXRlQ2FsbGFibGUgfCBJUGF5bG9hZEZpbHRcbiAgICApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUdXBsZUxvYWRlcihcbiAgICAgICAgICAgIHRoaXMudm9ydGV4LFxuICAgICAgICAgICAgdGhpcy52b3J0ZXhTdGF0dXNTZXJ2aWNlLFxuICAgICAgICAgICAgY29tcG9uZW50LFxuICAgICAgICAgICAgZmlsdGVyVXBkYXRlQ2FsbGFibGVcbiAgICAgICAgKTtcbiAgICB9XG59XG4iXX0=