UNPKG

@synerty/vortexjs

Version:

Custom observable data serialisation and routing based on Angular 2+

134 lines 16.9 kB
import { Inject, Injectable, NgZone } from "@angular/core"; import { BehaviorSubject, Subject } from "rxjs"; import { bind, dateStr } from "./UtilMisc"; import * as i0 from "@angular/core"; // Node compatibility const logDebug = console.debug ? bind(console, console.debug) : bind(console, console.log); const logInfo = bind(console, console.log); const logError = console.error ? bind(console, console.error) : bind(console, console.log); const logWarning = console.warn ? bind(console, console.warn) : bind(console, console.log); /** * Enum representing the different states of the Vortex application. * Disabled: The vortex if offline and disconnected * Reconnecting: The vortex is not online, but is in the reconnecting state * machine. * Online: The websocket is online and connected * NoNetwork: The network is offline * NetworkOnlineNoWebsocketResource: * The HTTP service is online, but not serving * the websocket upgrades. * This usually means the service is logged out. */ export var VortexStateEnum; (function (VortexStateEnum) { VortexStateEnum[VortexStateEnum["Disabled"] = 1] = "Disabled"; VortexStateEnum[VortexStateEnum["Reconnecting"] = 2] = "Reconnecting"; VortexStateEnum[VortexStateEnum["Online"] = 3] = "Online"; VortexStateEnum[VortexStateEnum["NoNetwork"] = 4] = "NoNetwork"; VortexStateEnum[VortexStateEnum["NetworkOnlineNoWebsocketResource"] = 5] = "NetworkOnlineNoWebsocketResource"; })(VortexStateEnum || (VortexStateEnum = {})); export class VortexStatusService { zone; _websocketState$ = new BehaviorSubject(VortexStateEnum.NoNetwork); _isOnline$ = new BehaviorSubject(false); debug = new Subject(); info = new Subject(); warning = new Subject(); errors = new Subject(); connectionInfo = new Subject(); connectionError = new Subject(); constructor(zone) { this.zone = zone; } get snapshot() { return { isOnline: this.websocketState == VortexStateEnum.Online, queuedActionCount: this.lastQueuedTupleActions, }; } get websocketState() { return this._websocketState$.getValue(); } get websocketStateObservable() { return this._websocketState$.asObservable(); } get isOnline() { return this._isOnline$.asObservable(); } setVortexState(state) { logDebug(dateStr() + "VortexStatusService.setWebsocketState " + ` old state = ${this.websocketState}` + ` new state = ${state}`); // Don't let reconnecting clobber NoNetwork if (this.websocketState === VortexStateEnum.NoNetwork && state === VortexStateEnum.Reconnecting) { logDebug(dateStr() + "VortexStatusService.setWebsocketState skipping change from" + " NoNetwork to Reconnecting"); } else { this._websocketState$.next(state); } const isOnline = state === VortexStateEnum.Online; if (this._isOnline$.getValue() !== isOnline) { this._isOnline$.next(isOnline); } } queuedActionCount = new Subject(); lastQueuedTupleActions = 0; incrementQueuedActionCount() { this.setQueuedActionCount(this.lastQueuedTupleActions + 1); } decrementQueuedActionCount() { this.setQueuedActionCount(this.lastQueuedTupleActions - 1); } setQueuedActionCount(count) { if (count === this.lastQueuedTupleActions) return; this.lastQueuedTupleActions = count; this.queuedActionCount.next(count); } logDebug(message) { logDebug(dateStr() + "Vortex Status - debug: " + message); this.debug.next(message); } logInfo(message) { logInfo(dateStr() + "Vortex Status - info: " + message); this.info.next(message); } logWarning(message) { logWarning(dateStr() + "Vortex Status - warning: " + message); this.warning.next(message); } logError(message) { logError(dateStr() + "Vortex Status - error: " + message); this.errors.next(message); } logConnectionInfo(message) { logInfo(dateStr() + "Vortex Connection Status - info: " + message); this.connectionInfo.next(message); } logConnectionError(message) { logError(dateStr() + "Vortex Connection Status - error: " + message); this.connectionError.next(message); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: VortexStatusService, deps: [{ token: NgZone }], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: VortexStatusService, providedIn: "root" }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: VortexStatusService, decorators: [{ type: Injectable, args: [{ providedIn: "root", }] }], ctorParameters: function () { return [{ type: i0.NgZone, decorators: [{ type: Inject, args: [NgZone] }] }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVm9ydGV4U3RhdHVzU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy92b3J0ZXgvVm9ydGV4U3RhdHVzU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxZQUFZLENBQUM7O0FBRTNDLHFCQUFxQjtBQUNyQixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsS0FBSztJQUMxQixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQzlCLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzQyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsS0FBSztJQUMxQixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQzlCLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsSUFBSTtJQUMzQixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQzdCLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQU9qQzs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sQ0FBTixJQUFZLGVBTVg7QUFORCxXQUFZLGVBQWU7SUFDdkIsNkRBQVksQ0FBQTtJQUNaLHFFQUFZLENBQUE7SUFDWix5REFBTSxDQUFBO0lBQ04sK0RBQVMsQ0FBQTtJQUNULDZHQUFnQyxDQUFBO0FBQ3BDLENBQUMsRUFOVyxlQUFlLEtBQWYsZUFBZSxRQU0xQjtBQUtELE1BQU0sT0FBTyxtQkFBbUI7SUFZUTtJQVhuQixnQkFBZ0IsR0FBRyxJQUFJLGVBQWUsQ0FDbkQsZUFBZSxDQUFDLFNBQVMsQ0FDNUIsQ0FBQztJQUNlLFVBQVUsR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUN6RCxLQUFLLEdBQW9CLElBQUksT0FBTyxFQUFVLENBQUM7SUFDL0MsSUFBSSxHQUFvQixJQUFJLE9BQU8sRUFBVSxDQUFDO0lBQzlDLE9BQU8sR0FBb0IsSUFBSSxPQUFPLEVBQVUsQ0FBQztJQUNqRCxNQUFNLEdBQW9CLElBQUksT0FBTyxFQUFVLENBQUM7SUFDaEQsY0FBYyxHQUFvQixJQUFJLE9BQU8sRUFBVSxDQUFDO0lBQ3hELGVBQWUsR0FBb0IsSUFBSSxPQUFPLEVBQVUsQ0FBQztJQUVsRSxZQUFvQyxJQUFZO1FBQVosU0FBSSxHQUFKLElBQUksQ0FBUTtJQUFHLENBQUM7SUFFcEQsSUFBSSxRQUFRO1FBQ1IsT0FBTztZQUNILFFBQVEsRUFBRSxJQUFJLENBQUMsY0FBYyxJQUFJLGVBQWUsQ0FBQyxNQUFNO1lBQ3ZELGlCQUFpQixFQUFFLElBQUksQ0FBQyxzQkFBc0I7U0FDakQsQ0FBQztJQUNOLENBQUM7SUFFRCxJQUFJLGNBQWM7UUFDZCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0lBRUQsSUFBSSx3QkFBd0I7UUFDeEIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDaEQsQ0FBQztJQUVELElBQUksUUFBUTtRQUNSLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBRUQsY0FBYyxDQUFDLEtBQXNCO1FBQ2pDLFFBQVEsQ0FDSixPQUFPLEVBQUU7WUFDTCx3Q0FBd0M7WUFDeEMsZ0JBQWdCLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDckMsZ0JBQWdCLEtBQUssRUFBRSxDQUM5QixDQUFDO1FBRUYsMkNBQTJDO1FBQzNDLElBQ0ksSUFBSSxDQUFDLGNBQWMsS0FBSyxlQUFlLENBQUMsU0FBUztZQUNqRCxLQUFLLEtBQUssZUFBZSxDQUFDLFlBQVksRUFDeEM7WUFDRSxRQUFRLENBQ0osT0FBTyxFQUFFO2dCQUNMLDREQUE0RDtnQkFDNUQsNEJBQTRCLENBQ25DLENBQUM7U0FDTDthQUFNO1lBQ0gsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNyQztRQUVELE1BQU0sUUFBUSxHQUFHLEtBQUssS0FBSyxlQUFlLENBQUMsTUFBTSxDQUFDO1FBQ2xELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsS0FBSyxRQUFRLEVBQUU7WUFDekMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDbEM7SUFDTCxDQUFDO0lBRUQsaUJBQWlCLEdBQW9CLElBQUksT0FBTyxFQUFVLENBQUM7SUFDM0Qsc0JBQXNCLEdBQVcsQ0FBQyxDQUFDO0lBRW5DLDBCQUEwQjtRQUN0QixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCwwQkFBMEI7UUFDdEIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsb0JBQW9CLENBQUMsS0FBYTtRQUM5QixJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsc0JBQXNCO1lBQUUsT0FBTztRQUVsRCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsS0FBSyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELFFBQVEsQ0FBQyxPQUFlO1FBQ3BCLFFBQVEsQ0FBQyxPQUFPLEVBQUUsR0FBRyx5QkFBeUIsR0FBRyxPQUFPLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQsT0FBTyxDQUFDLE9BQWU7UUFDbkIsT0FBTyxDQUFDLE9BQU8sRUFBRSxHQUFHLHdCQUF3QixHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCxVQUFVLENBQUMsT0FBZTtRQUN0QixVQUFVLENBQUMsT0FBTyxFQUFFLEdBQUcsMkJBQTJCLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELFFBQVEsQ0FBQyxPQUFlO1FBQ3BCLFFBQVEsQ0FBQyxPQUFPLEVBQUUsR0FBRyx5QkFBeUIsR0FBRyxPQUFPLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsaUJBQWlCLENBQUMsT0FBZTtRQUM3QixPQUFPLENBQUMsT0FBTyxFQUFFLEdBQUcsbUNBQW1DLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELGtCQUFrQixDQUFDLE9BQWU7UUFDOUIsUUFBUSxDQUFDLE9BQU8sRUFBRSxHQUFHLG9DQUFvQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7d0dBM0dRLG1CQUFtQixrQkFZUixNQUFNOzRHQVpqQixtQkFBbUIsY0FGaEIsTUFBTTs7NEZBRVQsbUJBQW1CO2tCQUgvQixVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQjs7MEJBYWdCLE1BQU07MkJBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgTmdab25lIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBiaW5kLCBkYXRlU3RyIH0gZnJvbSBcIi4vVXRpbE1pc2NcIjtcblxuLy8gTm9kZSBjb21wYXRpYmlsaXR5XG5jb25zdCBsb2dEZWJ1ZyA9IGNvbnNvbGUuZGVidWdcbiAgICA/IGJpbmQoY29uc29sZSwgY29uc29sZS5kZWJ1ZylcbiAgICA6IGJpbmQoY29uc29sZSwgY29uc29sZS5sb2cpO1xuY29uc3QgbG9nSW5mbyA9IGJpbmQoY29uc29sZSwgY29uc29sZS5sb2cpO1xuY29uc3QgbG9nRXJyb3IgPSBjb25zb2xlLmVycm9yXG4gICAgPyBiaW5kKGNvbnNvbGUsIGNvbnNvbGUuZXJyb3IpXG4gICAgOiBiaW5kKGNvbnNvbGUsIGNvbnNvbGUubG9nKTtcbmNvbnN0IGxvZ1dhcm5pbmcgPSBjb25zb2xlLndhcm5cbiAgICA/IGJpbmQoY29uc29sZSwgY29uc29sZS53YXJuKVxuICAgIDogYmluZChjb25zb2xlLCBjb25zb2xlLmxvZyk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVm9ydGV4U3RhdHVzU2VydmljZVNuYXBzaG90IHtcbiAgICBpc09ubGluZTogYm9vbGVhbjtcbiAgICBxdWV1ZWRBY3Rpb25Db3VudDogbnVtYmVyO1xufVxuXG4vKipcbiAqIEVudW0gcmVwcmVzZW50aW5nIHRoZSBkaWZmZXJlbnQgc3RhdGVzIG9mIHRoZSBWb3J0ZXggYXBwbGljYXRpb24uXG4gKiBEaXNhYmxlZDogVGhlIHZvcnRleCBpZiBvZmZsaW5lIGFuZCBkaXNjb25uZWN0ZWRcbiAqIFJlY29ubmVjdGluZzogVGhlIHZvcnRleCBpcyBub3Qgb25saW5lLCBidXQgaXMgaW4gdGhlIHJlY29ubmVjdGluZyBzdGF0ZVxuICogbWFjaGluZS5cbiAqIE9ubGluZTogVGhlIHdlYnNvY2tldCBpcyBvbmxpbmUgYW5kIGNvbm5lY3RlZFxuICogTm9OZXR3b3JrOiBUaGUgbmV0d29yayBpcyBvZmZsaW5lXG4gKiBOZXR3b3JrT25saW5lTm9XZWJzb2NrZXRSZXNvdXJjZTpcbiAqICAgICBUaGUgSFRUUCBzZXJ2aWNlIGlzIG9ubGluZSwgYnV0IG5vdCBzZXJ2aW5nXG4gKiAgICAgdGhlIHdlYnNvY2tldCB1cGdyYWRlcy5cbiAqICAgICBUaGlzIHVzdWFsbHkgbWVhbnMgdGhlIHNlcnZpY2UgaXMgbG9nZ2VkIG91dC5cbiAqL1xuZXhwb3J0IGVudW0gVm9ydGV4U3RhdGVFbnVtIHtcbiAgICBEaXNhYmxlZCA9IDEsXG4gICAgUmVjb25uZWN0aW5nLFxuICAgIE9ubGluZSxcbiAgICBOb05ldHdvcmssXG4gICAgTmV0d29ya09ubGluZU5vV2Vic29ja2V0UmVzb3VyY2UsXG59XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiBcInJvb3RcIixcbn0pXG5leHBvcnQgY2xhc3MgVm9ydGV4U3RhdHVzU2VydmljZSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfd2Vic29ja2V0U3RhdGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxWb3J0ZXhTdGF0ZUVudW0+KFxuICAgICAgICBWb3J0ZXhTdGF0ZUVudW0uTm9OZXR3b3JrLFxuICAgICk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfaXNPbmxpbmUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gICAgcmVhZG9ubHkgZGVidWc6IFN1YmplY3Q8c3RyaW5nPiA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcbiAgICByZWFkb25seSBpbmZvOiBTdWJqZWN0PHN0cmluZz4gPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gICAgcmVhZG9ubHkgd2FybmluZzogU3ViamVjdDxzdHJpbmc+ID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuICAgIHJlYWRvbmx5IGVycm9yczogU3ViamVjdDxzdHJpbmc+ID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuICAgIHJlYWRvbmx5IGNvbm5lY3Rpb25JbmZvOiBTdWJqZWN0PHN0cmluZz4gPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gICAgcmVhZG9ubHkgY29ubmVjdGlvbkVycm9yOiBTdWJqZWN0PHN0cmluZz4gPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG5cbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KE5nWm9uZSkgcHJpdmF0ZSB6b25lOiBOZ1pvbmUpIHt9XG5cbiAgICBnZXQgc25hcHNob3QoKTogVm9ydGV4U3RhdHVzU2VydmljZVNuYXBzaG90IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlzT25saW5lOiB0aGlzLndlYnNvY2tldFN0YXRlID09IFZvcnRleFN0YXRlRW51bS5PbmxpbmUsXG4gICAgICAgICAgICBxdWV1ZWRBY3Rpb25Db3VudDogdGhpcy5sYXN0UXVldWVkVHVwbGVBY3Rpb25zLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldCB3ZWJzb2NrZXRTdGF0ZSgpOiBWb3J0ZXhTdGF0ZUVudW0ge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2Vic29ja2V0U3RhdGUkLmdldFZhbHVlKCk7XG4gICAgfVxuXG4gICAgZ2V0IHdlYnNvY2tldFN0YXRlT2JzZXJ2YWJsZSgpOiBPYnNlcnZhYmxlPFZvcnRleFN0YXRlRW51bT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2Vic29ja2V0U3RhdGUkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIGdldCBpc09ubGluZSgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzT25saW5lJC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICBzZXRWb3J0ZXhTdGF0ZShzdGF0ZTogVm9ydGV4U3RhdGVFbnVtKSB7XG4gICAgICAgIGxvZ0RlYnVnKFxuICAgICAgICAgICAgZGF0ZVN0cigpICtcbiAgICAgICAgICAgICAgICBcIlZvcnRleFN0YXR1c1NlcnZpY2Uuc2V0V2Vic29ja2V0U3RhdGUgXCIgK1xuICAgICAgICAgICAgICAgIGAgb2xkIHN0YXRlID0gJHt0aGlzLndlYnNvY2tldFN0YXRlfWAgK1xuICAgICAgICAgICAgICAgIGAgbmV3IHN0YXRlID0gJHtzdGF0ZX1gLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIERvbid0IGxldCByZWNvbm5lY3RpbmcgY2xvYmJlciBOb05ldHdvcmtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy53ZWJzb2NrZXRTdGF0ZSA9PT0gVm9ydGV4U3RhdGVFbnVtLk5vTmV0d29yayAmJlxuICAgICAgICAgICAgc3RhdGUgPT09IFZvcnRleFN0YXRlRW51bS5SZWNvbm5lY3RpbmdcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBsb2dEZWJ1ZyhcbiAgICAgICAgICAgICAgICBkYXRlU3RyKCkgK1xuICAgICAgICAgICAgICAgICAgICBcIlZvcnRleFN0YXR1c1NlcnZpY2Uuc2V0V2Vic29ja2V0U3RhdGUgc2tpcHBpbmcgY2hhbmdlIGZyb21cIiArXG4gICAgICAgICAgICAgICAgICAgIFwiIE5vTmV0d29yayB0byBSZWNvbm5lY3RpbmdcIixcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl93ZWJzb2NrZXRTdGF0ZSQubmV4dChzdGF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc09ubGluZSA9IHN0YXRlID09PSBWb3J0ZXhTdGF0ZUVudW0uT25saW5lO1xuICAgICAgICBpZiAodGhpcy5faXNPbmxpbmUkLmdldFZhbHVlKCkgIT09IGlzT25saW5lKSB7XG4gICAgICAgICAgICB0aGlzLl9pc09ubGluZSQubmV4dChpc09ubGluZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBxdWV1ZWRBY3Rpb25Db3VudDogU3ViamVjdDxudW1iZXI+ID0gbmV3IFN1YmplY3Q8bnVtYmVyPigpO1xuICAgIGxhc3RRdWV1ZWRUdXBsZUFjdGlvbnM6IG51bWJlciA9IDA7XG5cbiAgICBpbmNyZW1lbnRRdWV1ZWRBY3Rpb25Db3VudCgpIHtcbiAgICAgICAgdGhpcy5zZXRRdWV1ZWRBY3Rpb25Db3VudCh0aGlzLmxhc3RRdWV1ZWRUdXBsZUFjdGlvbnMgKyAxKTtcbiAgICB9XG5cbiAgICBkZWNyZW1lbnRRdWV1ZWRBY3Rpb25Db3VudCgpIHtcbiAgICAgICAgdGhpcy5zZXRRdWV1ZWRBY3Rpb25Db3VudCh0aGlzLmxhc3RRdWV1ZWRUdXBsZUFjdGlvbnMgLSAxKTtcbiAgICB9XG5cbiAgICBzZXRRdWV1ZWRBY3Rpb25Db3VudChjb3VudDogbnVtYmVyKSB7XG4gICAgICAgIGlmIChjb3VudCA9PT0gdGhpcy5sYXN0UXVldWVkVHVwbGVBY3Rpb25zKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5sYXN0UXVldWVkVHVwbGVBY3Rpb25zID0gY291bnQ7XG4gICAgICAgIHRoaXMucXVldWVkQWN0aW9uQ291bnQubmV4dChjb3VudCk7XG4gICAgfVxuXG4gICAgbG9nRGVidWcobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIGxvZ0RlYnVnKGRhdGVTdHIoKSArIFwiVm9ydGV4IFN0YXR1cyAtIGRlYnVnOiBcIiArIG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLmRlYnVnLm5leHQobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgbG9nSW5mbyhtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgbG9nSW5mbyhkYXRlU3RyKCkgKyBcIlZvcnRleCBTdGF0dXMgLSBpbmZvOiBcIiArIG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLmluZm8ubmV4dChtZXNzYWdlKTtcbiAgICB9XG5cbiAgICBsb2dXYXJuaW5nKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICBsb2dXYXJuaW5nKGRhdGVTdHIoKSArIFwiVm9ydGV4IFN0YXR1cyAtIHdhcm5pbmc6IFwiICsgbWVzc2FnZSk7XG4gICAgICAgIHRoaXMud2FybmluZy5uZXh0KG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGxvZ0Vycm9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgICAgICBsb2dFcnJvcihkYXRlU3RyKCkgKyBcIlZvcnRleCBTdGF0dXMgLSBlcnJvcjogXCIgKyBtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5lcnJvcnMubmV4dChtZXNzYWdlKTtcbiAgICB9XG5cbiAgICBsb2dDb25uZWN0aW9uSW5mbyhtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAgICAgbG9nSW5mbyhkYXRlU3RyKCkgKyBcIlZvcnRleCBDb25uZWN0aW9uIFN0YXR1cyAtIGluZm86IFwiICsgbWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbkluZm8ubmV4dChtZXNzYWdlKTtcbiAgICB9XG5cbiAgICBsb2dDb25uZWN0aW9uRXJyb3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgICAgIGxvZ0Vycm9yKGRhdGVTdHIoKSArIFwiVm9ydGV4IENvbm5lY3Rpb24gU3RhdHVzIC0gZXJyb3I6IFwiICsgbWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbkVycm9yLm5leHQobWVzc2FnZSk7XG4gICAgfVxufVxuIl19