UNPKG

@synerty/vortexjs

Version:

Custom observable data serialisation and routing based on Angular 2+

191 lines 25.3 kB
import { Payload } from "./Payload"; import { Inject, Injectable } from "@angular/core"; import { PayloadEndpoint } from "./PayloadEndpoint"; import { TupleLoader } from "./TupleLoader"; import { VortexStateEnum, VortexStatusService } from "./VortexStatusService"; import { VortexClientHttp } from "./VortexClientHttp"; import { VortexClientCapacitorWebsocket } from "./VortexClientCapacitorWebsocket"; import { VortexClientBrowserWebsocket } from "./VortexClientBrowserWebsocket"; import { dateStr } from "./UtilMisc"; import { HttpHeaders } from "@angular/common/http"; import { Capacitor } from "@capacitor/core"; import * as i0 from "@angular/core"; import * as i1 from "./VortexStatusService"; export class VortexService { vortexStatusService; vortex; static _vortexUrl = "/vortex"; static vortexClientName = ""; static vortexHeaders = new HttpHeaders(); lastReconnectPromise = null; constructor(vortexStatusService) { this.vortexStatusService = vortexStatusService; this.reconnect() // .catch((e) => console.log(`${dateStr()} VortexService constructor reconnect failed ${e}`)); } /** * 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) { // Remove stray empty-port colon (e.g. "wss://host:/path" → "wss://host/path") // Use \/[^/] to avoid stripping the colon from the protocol (e.g. "wss://") VortexService._vortexUrl = url != null ? url.replace(/:(?=\/[^/])/, "") : null; } /** * Vortex URL * * The URL that the vortex is trying to connect to * * @return The new URL for the vortex to use. */ static getVortexUrl() { return VortexService._vortexUrl; } /** * Set Vortex HTTP Headers * * Set HTTP headers that will be sent when connecting to vortexes via HTTP. * NOTE Websockets are over HTTP. * * Calling this method is required if the http service requires * authentication, for example, with an oauth2 token, such as an azure * proxy. * * @param headers The new headers to use. */ static setVortexHeaders(headers) { VortexService.vortexHeaders = headers; } /** * Set Vortex Name * * @param vortexClientName The vortexClientName to tell the server that we are. */ static setVortexClientName(vortexClientName) { VortexService.vortexClientName = vortexClientName; } async disconnect() { this.vortexStatusService.logDebug("VortexService.disconnect called"); await this.vortex?.close(); this.vortex = null; this.vortexStatusService.logDebug("VortexService.disconnect returning"); } async reconnect() { if (this.lastReconnectPromise) { try { await this.lastReconnectPromise; } catch (e) { console.log(`Last reconnect error: ${e}`); } } if (!this.lastReconnectPromise) { this.lastReconnectPromise = this._reconnect(); this.lastReconnectPromise // .catch((e) => { console.log(`Last reconnect error: ${e}`); }) // .finally(() => { this.lastReconnectPromise = null; }); } return this.lastReconnectPromise; } async _reconnect() { this.vortexStatusService.logDebug("VortexService.reconnect called"); if (VortexService._vortexUrl == null) { this.vortexStatusService.setVortexState(VortexStateEnum.Reconnecting); this.vortexStatusService.logDebug("VortexService.reconnect returning #1"); return; } if (VortexService.vortexClientName == "") { throw new Error("VortexService.setVortexClientName() not set yet"); } await this.vortex?.close(); this.vortex = null; if (VortexService._vortexUrl.toLowerCase().startsWith("ws")) { const WsClass = Capacitor.isNativePlatform() ? VortexClientCapacitorWebsocket : VortexClientBrowserWebsocket; this.vortex = new WsClass(this.vortexStatusService, VortexService._vortexUrl, VortexService.vortexClientName, VortexService.vortexHeaders); } else { this.vortex = new VortexClientHttp(this.vortexStatusService, VortexService._vortexUrl, VortexService.vortexClientName, VortexService.vortexHeaders); } await this.vortex.reconnect(); this.vortexStatusService.logDebug("VortexService.reconnect returning #2"); } 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, providedIn: "root" }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: VortexService, decorators: [{ type: Injectable, args: [{ providedIn: "root", }] }], ctorParameters: function () { return [{ type: i1.VortexStatusService, decorators: [{ type: Inject, args: [VortexStatusService] }] }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVm9ydGV4U2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy92b3J0ZXgvVm9ydGV4U2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWUsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2hELE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBR2pELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEVBQXdCLFdBQVcsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNqRSxPQUFPLEVBQUMsZUFBZSxFQUFFLG1CQUFtQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFM0UsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFDLDhCQUE4QixFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFDaEYsT0FBTyxFQUFDLDRCQUE0QixFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFHNUUsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGlCQUFpQixDQUFDOzs7QUFLMUMsTUFBTSxPQUFPLGFBQWE7SUFVVjtJQVRKLE1BQU0sQ0FBa0I7SUFDeEIsTUFBTSxDQUFDLFVBQVUsR0FBa0IsU0FBUyxDQUFDO0lBQzdDLE1BQU0sQ0FBQyxnQkFBZ0IsR0FBVyxFQUFFLENBQUM7SUFDckMsTUFBTSxDQUFDLGFBQWEsR0FBZ0IsSUFBSSxXQUFXLEVBQUUsQ0FBQztJQUV0RCxvQkFBb0IsR0FBeUIsSUFBSSxDQUFDO0lBRTFELFlBRVksbUJBQXdDO1FBQXhDLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFFaEQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFD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LGlCQUFpQixDQUFDO2FBQzNELFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRUQsY0FBYyxDQUNWLFNBQTRCLEVBQzVCLE1BQW9CLEVBQ3BCLG9CQUE2QixLQUFLO1FBRWxDLE9BQU8sSUFBSSxlQUFlLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFRCxpQkFBaUIsQ0FDYixTQUE0QixFQUM1QixvQkFBMEQ7UUFFMUQsT0FBTyxJQUFJLFdBQVcsQ0FDbEIsSUFBSSxDQUFDLE1BQU0sRUFDWCxJQUFJLENBQUMsbUJBQW1CLEVBQ3hCLFNBQVMsRUFDVCxvQkFBb0IsQ0FDdkIsQ0FBQztJQUNOLENBQUM7d0dBdE9RLGFBQWEsa0JBU1YsbUJBQW1COzRHQVR0QixhQUFhLGNBRlYsTUFBTTs7NEZBRVQsYUFBYTtrQkFIekIsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckI7OzBCQVVRLE1BQU07MkJBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJUGF5bG9hZEZpbHQsIFBheWxvYWR9IGZyb20gXCIuL1BheWxvYWRcIjtcbmltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHtUdXBsZX0gZnJvbSBcIi4vZXhwb3J0c1wiO1xuaW1wb3J0IHtPYnNlcnZhYmxlfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHtQYXlsb2FkRW5kcG9pbnR9IGZyb20gXCIuL1BheWxvYWRFbmRwb2ludFwiO1xuaW1wb3J0IHtJRmlsdGVyVXBkYXRlQ2FsbGFibGUsIFR1cGxlTG9hZGVyfSBmcm9tIFwiLi9UdXBsZUxvYWRlclwiO1xuaW1wb3J0IHtWb3J0ZXhTdGF0ZUVudW0sIFZvcnRleFN0YXR1c1NlcnZpY2V9IGZyb20gXCIuL1ZvcnRleFN0YXR1c1NlcnZpY2VcIjtcbmltcG9ydCB7Vm9ydGV4Q2xpZW50QUJDfSBmcm9tIFwiLi9Wb3J0ZXhDbGllbnRBQkNcIjtcbmltcG9ydCB7Vm9ydGV4Q2xpZW50SHR0cH0gZnJvbSBcIi4vVm9ydGV4Q2xpZW50SHR0cFwiO1xuaW1wb3J0IHtWb3J0ZXhDbGllbnRDYXBhY2l0b3JXZWJzb2NrZXR9IGZyb20gXCIuL1ZvcnRleENsaWVudENhcGFjaXRvcldlYnNvY2tldFwiO1xuaW1wb3J0IHtWb3J0ZXhDbGllbnRCcm93c2VyV2Vic29ja2V0fSBmcm9tIFwiLi9Wb3J0ZXhDbGllbnRCcm93c2VyV2Vic29ja2V0XCI7XG5pbXBvcnQge1BheWxvYWRFbnZlbG9wZX0gZnJvbSBcIi4vUGF5bG9hZEVudmVsb3BlXCI7XG5pbXBvcnQge05nTGlmZUN5Y2xlRXZlbnRzfSBmcm9tIFwiLi4vdXRpbC9OZ0xpZmVDeWNsZUV2ZW50c1wiO1xuaW1wb3J0IHtkYXRlU3RyfSBmcm9tIFwiLi9VdGlsTWlzY1wiO1xuaW1wb3J0IHtIdHRwSGVhZGVyc30gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XG5pbXBvcnQge0NhcGFjaXRvcn0gZnJvbSBcIkBjYXBhY2l0b3IvY29yZVwiO1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogXCJyb290XCIsXG59KVxuZXhwb3J0IGNsYXNzIFZvcnRleFNlcnZpY2Uge1xuICAgIHByaXZhdGUgdm9ydGV4OiBWb3J0ZXhDbGllbnRBQkM7XG4gICAgcHJpdmF0ZSBzdGF0aWMgX3ZvcnRleFVybDogc3RyaW5nIHwgbnVsbCA9IFwiL3ZvcnRleFwiO1xuICAgIHByaXZhdGUgc3RhdGljIHZvcnRleENsaWVudE5hbWU6IHN0cmluZyA9IFwiXCI7XG4gICAgcHJpdmF0ZSBzdGF0aWMgdm9ydGV4SGVhZGVyczogSHR0cEhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcblxuICAgIHByaXZhdGUgbGFzdFJlY29ubmVjdFByb21pc2U6IG51bGwgfCBQcm9taXNlPHZvaWQ+ID0gbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KFZvcnRleFN0YXR1c1NlcnZpY2UpXG4gICAgICAgIHByaXZhdGUgdm9ydGV4U3RhdHVzU2VydmljZTogVm9ydGV4U3RhdHVzU2VydmljZSxcbiAgICApIHtcbiAgICAgICAgdGhpcy5yZWNvbm5lY3QoKSAvL1xuICAgICAgICAgICAgLmNhdGNoKChlKSA9PlxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgICBgJHtkYXRlU3RyKCl9IFZvcnRleFNlcnZpY2UgY29uc3RydWN0b3IgcmVjb25uZWN0IGZhaWxlZCAke2V9YCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgVm9ydGV4IFVSTFxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkIGV4Y2VwdCBpbiByYXJlIGNhc2VzLCBzdWNoIGFzIGFuIGlvcyBvciBhbmRyb2lkIGFwcC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB1cmwgVGhlIG5ldyBVUkwgZm9yIHRoZSB2b3J0ZXggdG8gdXNlLlxuICAgICAqL1xuICAgIHN0YXRpYyBzZXRWb3J0ZXhVcmwodXJsOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgICAgIC8vIFJlbW92ZSBzdHJheSBlbXB0eS1wb3J0IGNvbG9uIChlLmcuIFwid3NzOi8vaG9zdDovcGF0aFwiIOKGkiBcIndzczovL2hvc3QvcGF0aFwiKVxuICAgICAgICAvLyBVc2UgXFwvW14vXSB0byBhdm9pZCBzdHJpcHBpbmcgdGhlIGNvbG9uIGZyb20gdGhlIHByb3RvY29sIChlLmcuIFwid3NzOi8vXCIpXG4gICAgICAgIFZvcnRleFNlcnZpY2UuX3ZvcnRleFVybCA9XG4gICAgICAgICAgICB1cmwgIT0gbnVsbCA/IHVybC5yZXBsYWNlKC86KD89XFwvW14vXSkvLCBcIlwiKSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVm9ydGV4IFVSTFxuICAgICAqXG4gICAgICogVGhlIFVSTCB0aGF0IHRoZSB2b3J0ZXggaXMgdHJ5aW5nIHRvIGNvbm5lY3QgdG9cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIG5ldyBVUkwgZm9yIHRoZSB2b3J0ZXggdG8gdXNlLlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRWb3J0ZXhVcmwoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiBWb3J0ZXhTZXJ2aWNlLl92b3J0ZXhVcmw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IFZvcnRleCBIVFRQIEhlYWRlcnNcbiAgICAgKlxuICAgICAqIFNldCBIVFRQIGhlYWRlcnMgdGhhdCB3aWxsIGJlIHNlbnQgd2hlbiBjb25uZWN0aW5nIHRvIHZvcnRleGVzIHZpYSBIVFRQLlxuICAgICAqIE5PVEUgV2Vic29ja2V0cyBhcmUgb3ZlciBIVFRQLlxuICAgICAqXG4gICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBpcyByZXF1aXJlZCBpZiB0aGUgaHR0cCBzZXJ2aWNlIHJlcXVpcmVzXG4gICAgICogYXV0aGVudGljYXRpb24sIGZvciBleGFtcGxlLCB3aXRoIGFuIG9hdXRoMiB0b2tlbiwgc3VjaCBhcyBhbiBhenVyZVxuICAgICAqIHByb3h5LlxuICAgICAqXG4gICAgICogQHBhcmFtIGhlYWRlcnMgVGhlIG5ldyBoZWFkZXJzIHRvIHVzZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgc2V0Vm9ydGV4SGVhZGVycyhoZWFkZXJzOiBIdHRwSGVhZGVycykge1xuICAgICAgICBWb3J0ZXhTZXJ2aWNlLnZvcnRleEhlYWRlcnMgPSBoZWFkZXJzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBWb3J0ZXggTmFtZVxuICAgICAqXG4gICAgICogQHBhcmFtIHZvcnRleENsaWVudE5hbWUgVGhlIHZvcnRleENsaWVudE5hbWUgdG8gdGVsbCB0aGUgc2VydmVyIHRoYXQgd2UgYXJlLlxuICAgICAqL1xuICAgIHN0YXRpYyBzZXRWb3J0ZXhDbGllbnROYW1lKHZvcnRleENsaWVudE5hbWU6IHN0cmluZykge1xuICAgICAgICBWb3J0ZXhTZXJ2aWNlLnZvcnRleENsaWVudE5hbWUgPSB2b3J0ZXhDbGllbnROYW1lO1xuICAgIH1cblxuICAgIGFzeW5jIGRpc2Nvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMudm9ydGV4U3RhdHVzU2VydmljZS5sb2dEZWJ1ZyhcIlZvcnRleFNlcnZpY2UuZGlzY29ubmVjdCBjYWxsZWRcIik7XG4gICAgICAgIGF3YWl0IHRoaXMudm9ydGV4Py5jbG9zZSgpO1xuICAgICAgICB0aGlzLnZvcnRleCA9IG51bGw7XG4gICAgICAgIHRoaXMudm9ydGV4U3RhdHVzU2VydmljZS5sb2dEZWJ1ZyhcIlZvcnRleFNlcnZpY2UuZGlzY29ubmVjdCByZXR1cm5pbmdcIik7XG4gICAgfVxuXG4gICAgYXN5bmMgcmVjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5sYXN0UmVjb25uZWN0UHJvbWlzZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmxhc3RSZWNvbm5lY3RQcm9taXNlO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBMYXN0IHJlY29ubmVjdCBlcnJvcjogJHtlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmxhc3RSZWNvbm5lY3RQcm9taXNlKSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RSZWNvbm5lY3RQcm9taXNlID0gdGhpcy5fcmVjb25uZWN0KCk7XG4gICAgICAgICAgICB0aGlzLmxhc3RSZWNvbm5lY3RQcm9taXNlIC8vXG4gICAgICAgICAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBMYXN0IHJlY29ubmVjdCBlcnJvcjogJHtlfWApO1xuICAgICAgICAgICAgICAgIH0pIC8vXG4gICAgICAgICAgICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RSZWNvbm5lY3RQcm9taXNlID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmxhc3RSZWNvbm5lY3RQcm9taXNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX3JlY29ubmVjdCgpIHtcbiAgICAgICAgdGhpcy52b3J0ZXhTdGF0dXNTZXJ2aWNlLmxvZ0RlYnVnKFwiVm9ydGV4U2VydmljZS5yZWNvbm5lY3QgY2FsbGVkXCIpO1xuICAgICAgICBpZiAoVm9ydGV4U2VydmljZS5fdm9ydGV4VXJsID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMudm9ydGV4U3RhdHVzU2VydmljZS5zZXRWb3J0ZXhTdGF0ZShcbiAgICAgICAgICAgICAgICBWb3J0ZXhTdGF0ZUVudW0uUmVjb25uZWN0aW5nLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMudm9ydGV4U3RhdHVzU2VydmljZS5sb2dEZWJ1ZyhcbiAgICAgICAgICAgICAgICBcIlZvcnRleFNlcnZpY2UucmVjb25uZWN0IHJldHVybmluZyAjMVwiLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChWb3J0ZXhTZXJ2aWNlLnZvcnRleENsaWVudE5hbWUgPT0gXCJcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVm9ydGV4U2VydmljZS5zZXRWb3J0ZXhDbGllbnROYW1lKCkgbm90IHNldCB5ZXRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLnZvcnRleD8uY2xvc2UoKTtcbiAgICAgICAgdGhpcy52b3J0ZXggPSBudWxsO1xuXG4gICAgICAgIGlmIChWb3J0ZXhTZXJ2aWNlLl92b3J0ZXhVcmwudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFwid3NcIikpIHtcbiAgICAgICAgICAgIGNvbnN0IFdzQ2xhc3MgPSBDYXBhY2l0b3IuaXNOYXRpdmVQbGF0Zm9ybSgpXG4gICAgICAgICAgICAgICAgPyBWb3J0ZXhDbGllbnRDYXBhY2l0b3JXZWJzb2NrZXRcbiAgICAgICAgICAgICAgICA6IFZvcnRleENsaWVudEJyb3dzZXJXZWJzb2NrZXQ7XG4gICAgICAgICAgICB0aGlzLnZvcnRleCA9IG5ldyBXc0NsYXNzKFxuICAgICAgICAgICAgICAgIHRoaXMudm9ydGV4U3RhdHVzU2VydmljZSxcbiAgICAgICAgICAgICAgICBWb3J0ZXhTZXJ2aWNlLl92b3J0ZXhVcmwsXG4gICAgICAgICAgICAgICAgVm9ydGV4U2VydmljZS52b3J0ZXhDbGllbnROYW1lLFxuICAgICAgICAgICAgICAgIFZvcnRleFNlcnZpY2Uudm9ydGV4SGVhZGVycyxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZvcnRleCA9IG5ldyBWb3J0ZXhDbGllbnRIdHRwKFxuICAgICAgICAgICAgICAgIHRoaXMudm9ydGV4U3RhdHVzU2VydmljZSxcbiAgICAgICAgICAgICAgICBWb3J0ZXhTZXJ2aWNlLl92b3J0ZXhVcmwsXG4gICAgICAgICAgICAgICAgVm9ydGV4U2VydmljZS52b3J0ZXhDbGllbnROYW1lLFxuICAgICAgICAgICAgICAgIFZvcnRleFNlcnZpY2Uudm9ydGV4SGVhZGVycyxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLnZvcnRleC5yZWNvbm5lY3QoKTtcbiAgICAgICAgdGhpcy52b3J0ZXhTdGF0dXNTZXJ2aWNlLmxvZ0RlYnVnKFxuICAgICAgICAgICAgXCJWb3J0ZXhTZXJ2aWNlLnJlY29ubmVjdCByZXR1cm5pbmcgIzJcIixcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBzZW5kVHVwbGUoZmlsdDogSVBheWxvYWRGaWx0IHwgc3RyaW5nLCB0dXBsZXM6IGFueVtdIHwgVHVwbGVbXSk6IHZvaWQge1xuICAgICAgICBpZiAodHlwZW9mIGZpbHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGZpbHQgPSB7a2V5OiBmaWx0fTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbmRQYXlsb2FkKG5ldyBQYXlsb2FkKGZpbHQsIHR1cGxlcykpO1xuICAgIH1cblxuICAgIHNlbmRGaWx0KGZpbHQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZW5kUGF5bG9hZChuZXcgUGF5bG9hZChmaWx0KSk7XG4gICAgfVxuXG4gICAgLyoqIFNlbmQgUGF5bG9hZFxuICAgICAqXG4gICAgICogQHBhcmFtIHtQYXlsb2FkW10gfCBQYXlsb2FkfSBwYXlsb2FkXG4gICAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAgICovXG4gICAgc2VuZFBheWxvYWQocGF5bG9hZDogUGF5bG9hZFtdIHwgUGF5bG9hZCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy52b3J0ZXggPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHZvcnRleCBpcyBub3QgaW5pdGlhbGlzZWQgeWV0LlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXlsb2FkczogUGF5bG9hZFtdID0gW107XG4gICAgICAgIGlmIChwYXlsb2FkIGluc3RhbmNlb2YgQXJyYXkpIHBheWxvYWRzID0gcGF5bG9hZDtcbiAgICAgICAgZWxzZSBwYXlsb2FkcyA9IFtwYXlsb2FkXTtcblxuICAgICAgICBsZXQgcHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBwYXlsb2FkIG9mIHBheWxvYWRzKSB7XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKFxuICAgICAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgICAgICAgICAgICAgLm1ha2VQYXlsb2FkRW52ZWxvcGUoKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigocGF5bG9hZEVudmVsb3BlOiBQYXlsb2FkRW52ZWxvcGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudm9ydGV4LnNlbmQocGF5bG9hZEVudmVsb3BlKTtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXQ6IGFueSA9IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICAvKiogU2VuZCBQYXlsb2FkIEVudmVsb3BlKHMpXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1BheWxvYWRFbnZlbG9wZVtdIHwgUGF5bG9hZEVudmVsb3BlfSBwYXlsb2FkRW52ZWxvcGVcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICAgKi9cbiAgICBzZW5kUGF5bG9hZEVudmVsb3BlKFxuICAgICAgICBwYXlsb2FkRW52ZWxvcGU6IFBheWxvYWRFbnZlbG9wZVtdIHwgUGF5bG9hZEVudmVsb3BlLFxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy52b3J0ZXggPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHZvcnRleCBpcyBub3QgaW5pdGlhbGlzZWQgeWV0LlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy52b3J0ZXguc2VuZChwYXlsb2FkRW52ZWxvcGUpO1xuICAgIH1cblxuICAgIGNyZWF0ZUVuZHBvaW50T2JzZXJ2YWJsZShcbiAgICAgICAgY29tcG9uZW50OiBOZ0xpZmVDeWNsZUV2ZW50cyxcbiAgICAgICAgZmlsdGVyOiBJUGF5bG9hZEZpbHQsXG4gICAgICAgIHByb2Nlc3NMYXRlc3RPbmx5OiBib29sZWFuID0gZmFsc2UsXG4gICAgKTogT2JzZXJ2YWJsZTxQYXlsb2FkRW52ZWxvcGU+IHtcbiAgICAgICAgbGV0IGVuZHBvaW50ID0gbmV3IFBheWxvYWRFbmRwb2ludChcbiAgICAgICAgICAgIGNvbXBvbmVudCxcbiAgICAgICAgICAgIGZpbHRlcixcbiAgICAgICAgICAgIHByb2Nlc3NMYXRlc3RPbmx5LFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUVuZHBvaW50KGNvbXBvbmVudCwgZmlsdGVyLCBwcm9jZXNzTGF0ZXN0T25seSlcbiAgICAgICAgICAgIC5vYnNlcnZhYmxlO1xuICAgIH1cblxuICAgIGNyZWF0ZUVuZHBvaW50KFxuICAgICAgICBjb21wb25lbnQ6IE5nTGlmZUN5Y2xlRXZlbnRzLFxuICAgICAgICBmaWx0ZXI6IElQYXlsb2FkRmlsdCxcbiAgICAgICAgcHJvY2Vzc0xhdGVzdE9ubHk6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICApOiBQYXlsb2FkRW5kcG9pbnQge1xuICAgICAgICByZXR1cm4gbmV3IFBheWxvYWRFbmRwb2ludChjb21wb25lbnQsIGZpbHRlciwgcHJvY2Vzc0xhdGVzdE9ubHkpO1xuICAgIH1cblxuICAgIGNyZWF0ZVR1cGxlTG9hZGVyKFxuICAgICAgICBjb21wb25lbnQ6IE5nTGlmZUN5Y2xlRXZlbnRzLFxuICAgICAgICBmaWx0ZXJVcGRhdGVDYWxsYWJsZTogSUZpbHRlclVwZGF0ZUNhbGxhYmxlIHwgSVBheWxvYWRGaWx0LFxuICAgICkge1xuICAgICAgICByZXR1cm4gbmV3IFR1cGxlTG9hZGVyKFxuICAgICAgICAgICAgdGhpcy52b3J0ZXgsXG4gICAgICAgICAgICB0aGlzLnZvcnRleFN0YXR1c1NlcnZpY2UsXG4gICAgICAgICAgICBjb21wb25lbnQsXG4gICAgICAgICAgICBmaWx0ZXJVcGRhdGVDYWxsYWJsZSxcbiAgICAgICAgKTtcbiAgICB9XG59XG4iXX0=