@synerty/vortexjs
Version:
Custom observable data serialisation and routing based on Angular 2+
126 lines • 16.5 kB
JavaScript
import { VortexClientABC } from "./VortexClientABC";
import { dateStr } from "./UtilMisc";
import { NgLifeCycleEvents } from "../util/NgLifeCycleEvents";
import { takeUntil } from "rxjs/operators";
/** Payload Response
*
* This class is used to catch responses from a sent payload.
* If the remote end is going to send back a payload, with the same filt,
* this class catches this then either resolves or rejects the promise.
*
* If the response is not received within the timeout, the errback is called.
*
* ** The PayloadResponse in VortexJS Sends the Payload **
*
* Here is some example usage.
*
* ::
*
* payload = Payload(filt={"rapuiServerEcho":True})
* responsePromise = PayloadResponse(vortexService, payload)
* .then((payload) => console.log(`Received payload ${payload}`))
* .catch((err) => console.log(err));
*
*/
export class PayloadResponse {
payloadEnvelope;
timeoutSeconds;
resultCheck;
static RESPONSE_TIMEOUT_SECONDS = 30.0;
static messageIdKey = "PayloadResponse.messageId";
PROCESSING = "Processing";
// NO_ENDPOINT = "No Endpoint"
FAILED = "Failed";
SEND_FAILED = "Send Failed";
SUCCESS = "Success";
TIMED_OUT = "Timed Out";
_messageId = VortexClientABC.makeUuid();
_status = this.PROCESSING;
_lcEmitter = new NgLifeCycleEvents();
promise;
/** Constructor
* @param vortexService
* @param payloadEnvelope The PayloadEnvelope to send.
* @param timeoutSeconds The timeout to wait for a response - in seconds;
* @param resultCheck Should the result of the payload response be checked.
*/
constructor(vortexService, payloadEnvelope, timeoutSeconds = PayloadResponse.RESPONSE_TIMEOUT_SECONDS, resultCheck = true) {
this.payloadEnvelope = payloadEnvelope;
this.timeoutSeconds = timeoutSeconds;
this.resultCheck = resultCheck;
this.promise = new Promise((resolve, reject) => {
// Start the timer
let timer = null;
// Create the endpoint
this.payloadEnvelope.filt[PayloadResponse.messageIdKey] =
this._messageId;
let endpoint = vortexService.createEndpoint(this._lcEmitter, this.payloadEnvelope.filt);
let finish = (status) => {
this._status = status;
this._lcEmitter.onDestroyEvent.next();
if (timer != null) {
clearTimeout(timer);
timer = null;
}
};
let callFail = (status, msgArg = "") => {
let filtStr = JSON.stringify(this.payloadEnvelope.filt);
let msg = `${dateStr()} PayloadEndpoint ${status} Failed : ${msgArg}\n${filtStr}`;
console.log(msg);
finish(status);
reject(msgArg);
};
// Subscribe
endpoint.observable
.pipe(takeUntil(this._lcEmitter.onDestroyEvent))
.subscribe((payloadEnvelope) => {
let r = payloadEnvelope.result; // success is null or true
if (this.resultCheck && !(r == null || r === true)) {
callFail(this.FAILED, r.toString());
}
else {
finish(this.SUCCESS);
resolve(payloadEnvelope);
}
});
vortexService
.sendPayloadEnvelope(this.payloadEnvelope)
.then(() => {
timer = setTimeout(() => callFail(this.TIMED_OUT), timeoutSeconds * 1000);
})
.catch((err) => {
callFail(this.SEND_FAILED, err);
});
});
}
/**
* Attaches callbacks for the resolution and/or rejection of the Promise.
* @param onfulfilled The callback to execute when the Promise is resolved.
* @param onrejected The callback to execute when the Promise is rejected.
* @returns A Promise for the completion of which ever callback is executed.
*/
then(onfulfilled, onrejected = null) {
return this.promise.then(onfulfilled, onrejected);
}
/**
* Attaches a callback for only the rejection of the Promise.
* @param onrejected The callback to execute when the Promise is rejected.
* @returns A Promise for the completion of the callback.
*/
catch(onrejected) {
return this.promise.catch(onrejected);
}
/** Is Response Payload
*
* The PayloadResponse tags the payloads, so it expects a unique message back.
*
* @returns True if this payload has been tagged by a PayloadResponse class
*/
static isResponsePayloadEnvelope(payloadEnvelope) {
return payloadEnvelope.filt.hasOwnProperty(PayloadResponse.messageIdKey);
}
get status() {
return this._status;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGF5bG9hZFJlc3BvbnNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3ZvcnRleC9QYXlsb2FkUmVzcG9uc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRWxELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFbkMsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFFNUQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRXpDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsTUFBTSxPQUFPLGVBQWU7SUEwQlo7SUFDQTtJQUNBO0lBM0JMLE1BQU0sQ0FBVSx3QkFBd0IsR0FBRyxJQUFJLENBQUM7SUFDL0MsTUFBTSxDQUFDLFlBQVksR0FBRywyQkFBMkIsQ0FBQztJQUVqRCxVQUFVLEdBQUcsWUFBWSxDQUFDO0lBQ25DLDhCQUE4QjtJQUNyQixNQUFNLEdBQUcsUUFBUSxDQUFDO0lBQ2xCLFdBQVcsR0FBRyxhQUFhLENBQUM7SUFDNUIsT0FBTyxHQUFHLFNBQVMsQ0FBQztJQUNwQixTQUFTLEdBQUcsV0FBVyxDQUFDO0lBRXpCLFVBQVUsR0FBVyxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDaEQsT0FBTyxHQUFXLElBQUksQ0FBQyxVQUFVLENBQUM7SUFFbEMsVUFBVSxHQUFzQixJQUFJLGlCQUFpQixFQUFFLENBQUM7SUFFeEQsT0FBTyxDQUEyQjtJQUUxQzs7Ozs7T0FLRztJQUNILFlBQ0ksYUFBNEIsRUFDcEIsZUFBZ0MsRUFDaEMsaUJBQXlCLGVBQWUsQ0FBQyx3QkFBd0IsRUFDakUsY0FBdUIsSUFBSTtRQUYzQixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDaEMsbUJBQWMsR0FBZCxjQUFjLENBQW1EO1FBQ2pFLGdCQUFXLEdBQVgsV0FBVyxDQUFnQjtR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QUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLHlCQUF5QixDQUFDLGVBQWdDO1FBQzdELE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQ3RDLGVBQWUsQ0FBQyxZQUFZLENBQy9CLENBQUM7SUFDTixDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ04sT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1ZvcnRleENsaWVudEFCQ30gZnJvbSBcIi4vVm9ydGV4Q2xpZW50QUJDXCI7XG5pbXBvcnQge0lQYXlsb2FkRmlsdH0gZnJvbSBcIi4vUGF5bG9hZFwiO1xuaW1wb3J0IHtkYXRlU3RyfSBmcm9tIFwiLi9VdGlsTWlzY1wiO1xuaW1wb3J0IHtWb3J0ZXhTZXJ2aWNlfSBmcm9tIFwiLi9Wb3J0ZXhTZXJ2aWNlXCI7XG5pbXBvcnQge05nTGlmZUN5Y2xlRXZlbnRzfSBmcm9tIFwiLi4vdXRpbC9OZ0xpZmVDeWNsZUV2ZW50c1wiO1xuaW1wb3J0IHtQYXlsb2FkRW52ZWxvcGV9IGZyb20gXCIuL1BheWxvYWRFbnZlbG9wZVwiO1xuaW1wb3J0IHt0YWtlVW50aWx9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuXG4vKiogUGF5bG9hZCBSZXNwb25zZVxuICpcbiAqICAgIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjYXRjaCByZXNwb25zZXMgZnJvbSBhIHNlbnQgcGF5bG9hZC5cbiAqICAgIElmIHRoZSByZW1vdGUgZW5kIGlzIGdvaW5nIHRvIHNlbmQgYmFjayBhIHBheWxvYWQsIHdpdGggdGhlIHNhbWUgZmlsdCxcbiAqICAgIHRoaXMgY2xhc3MgY2F0Y2hlcyB0aGlzIHRoZW4gZWl0aGVyIHJlc29sdmVzIG9yIHJlamVjdHMgdGhlIHByb21pc2UuXG4gKlxuICogICAgSWYgdGhlIHJlc3BvbnNlIGlzIG5vdCByZWNlaXZlZCB3aXRoaW4gdGhlIHRpbWVvdXQsIHRoZSBlcnJiYWNrIGlzIGNhbGxlZC5cbiAqXG4gKiAgICAqKiBUaGUgUGF5bG9hZFJlc3BvbnNlIGluIFZvcnRleEpTIFNlbmRzIHRoZSBQYXlsb2FkICoqXG4gKlxuICogICAgSGVyZSBpcyBzb21lIGV4YW1wbGUgdXNhZ2UuXG4gKlxuICogICAgOjpcbiAqXG4gKiAgICAgICAgcGF5bG9hZCA9IFBheWxvYWQoZmlsdD17XCJyYXB1aVNlcnZlckVjaG9cIjpUcnVlfSlcbiAqICAgICAgICByZXNwb25zZVByb21pc2UgPSBQYXlsb2FkUmVzcG9uc2Uodm9ydGV4U2VydmljZSwgcGF5bG9hZClcbiAqICAgICAgICAgIC50aGVuKChwYXlsb2FkKSA9PiBjb25zb2xlLmxvZyhgUmVjZWl2ZWQgcGF5bG9hZCAke3BheWxvYWR9YCkpXG4gKiAgICAgICAgICAuY2F0Y2goKGVycikgPT4gY29uc29sZS5sb2coZXJyKSk7XG4gKlxuICovXG5leHBvcnQgY2xhc3MgUGF5bG9hZFJlc3BvbnNlIHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFJFU1BPTlNFX1RJTUVPVVRfU0VDT05EUyA9IDMwLjA7XG4gICAgcHJpdmF0ZSBzdGF0aWMgbWVzc2FnZUlkS2V5ID0gXCJQYXlsb2FkUmVzcG9uc2UubWVzc2FnZUlkXCI7XG5cbiAgICByZWFkb25seSBQUk9DRVNTSU5HID0gXCJQcm9jZXNzaW5nXCI7XG4gICAgLy8gTk9fRU5EUE9JTlQgPSBcIk5vIEVuZHBvaW50XCJcbiAgICByZWFkb25seSBGQUlMRUQgPSBcIkZhaWxlZFwiO1xuICAgIHJlYWRvbmx5IFNFTkRfRkFJTEVEID0gXCJTZW5kIEZhaWxlZFwiO1xuICAgIHJlYWRvbmx5IFNVQ0NFU1MgPSBcIlN1Y2Nlc3NcIjtcbiAgICByZWFkb25seSBUSU1FRF9PVVQgPSBcIlRpbWVkIE91dFwiO1xuXG4gICAgcHJpdmF0ZSBfbWVzc2FnZUlkOiBzdHJpbmcgPSBWb3J0ZXhDbGllbnRBQkMubWFrZVV1aWQoKTtcbiAgICBwcml2YXRlIF9zdGF0dXM6IHN0cmluZyA9IHRoaXMuUFJPQ0VTU0lORztcblxuICAgIHByaXZhdGUgX2xjRW1pdHRlcjogTmdMaWZlQ3ljbGVFdmVudHMgPSBuZXcgTmdMaWZlQ3ljbGVFdmVudHMoKTtcblxuICAgIHByaXZhdGUgcHJvbWlzZTogUHJvbWlzZTxQYXlsb2FkRW52ZWxvcGU+O1xuXG4gICAgLyoqIENvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHZvcnRleFNlcnZpY2VcbiAgICAgKiBAcGFyYW0gcGF5bG9hZEVudmVsb3BlIFRoZSBQYXlsb2FkRW52ZWxvcGUgdG8gc2VuZC5cbiAgICAgKiBAcGFyYW0gdGltZW91dFNlY29uZHMgVGhlIHRpbWVvdXQgdG8gd2FpdCBmb3IgYSByZXNwb25zZSAtIGluIHNlY29uZHM7XG4gICAgICogQHBhcmFtIHJlc3VsdENoZWNrIFNob3VsZCB0aGUgcmVzdWx0IG9mIHRoZSBwYXlsb2FkIHJlc3BvbnNlIGJlIGNoZWNrZWQuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHZvcnRleFNlcnZpY2U6IFZvcnRleFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcGF5bG9hZEVudmVsb3BlOiBQYXlsb2FkRW52ZWxvcGUsXG4gICAgICAgIHByaXZhdGUgdGltZW91dFNlY29uZHM6IG51bWJlciA9IFBheWxvYWRSZXNwb25zZS5SRVNQT05TRV9USU1FT1VUX1NFQ09ORFMsXG4gICAgICAgIHByaXZhdGUgcmVzdWx0Q2hlY2s6IGJvb2xlYW4gPSB0cnVlLFxuICAgICkge1xuICAgICAgICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZTxQYXlsb2FkRW52ZWxvcGU+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSB0aW1lclxuICAgICAgICAgICAgbGV0IHRpbWVyID0gbnVsbDtcblxuICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBlbmRwb2ludFxuICAgICAgICAgICAgdGhpcy5wYXlsb2FkRW52ZWxvcGUuZmlsdFtQYXlsb2FkUmVzcG9uc2UubWVzc2FnZUlkS2V5XSA9XG4gICAgICAgICAgICAgICAgdGhpcy5fbWVzc2FnZUlkO1xuICAgICAgICAgICAgbGV0IGVuZHBvaW50ID0gdm9ydGV4U2VydmljZS5jcmVhdGVFbmRwb2ludChcbiAgICAgICAgICAgICAgICB0aGlzLl9sY0VtaXR0ZXIsXG4gICAgICAgICAgICAgICAgPElQYXlsb2FkRmlsdD50aGlzLnBheWxvYWRFbnZlbG9wZS5maWx0LFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgbGV0IGZpbmlzaCA9IChzdGF0dXMpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGNFbWl0dGVyLm9uRGVzdHJveUV2ZW50Lm5leHQoKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aW1lciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICAgICAgICAgIHRpbWVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBsZXQgY2FsbEZhaWwgPSAoc3RhdHVzOiBzdHJpbmcsIG1zZ0FyZyA9IFwiXCIpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgZmlsdFN0ciA9IEpTT04uc3RyaW5naWZ5KHRoaXMucGF5bG9hZEVudmVsb3BlLmZpbHQpO1xuICAgICAgICAgICAgICAgIGxldCBtc2cgPSBgJHtkYXRlU3RyKCl9IFBheWxvYWRFbmRwb2ludCAke3N0YXR1c30gRmFpbGVkIDogJHttc2dBcmd9XFxuJHtmaWx0U3RyfWA7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cobXNnKTtcblxuICAgICAgICAgICAgICAgIGZpbmlzaChzdGF0dXMpO1xuICAgICAgICAgICAgICAgIHJlamVjdChtc2dBcmcpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gU3Vic2NyaWJlXG4gICAgICAgICAgICBlbmRwb2ludC5vYnNlcnZhYmxlXG4gICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2xjRW1pdHRlci5vbkRlc3Ryb3lFdmVudCkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgocGF5bG9hZEVudmVsb3BlOiBQYXlsb2FkRW52ZWxvcGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHIgPSBwYXlsb2FkRW52ZWxvcGUucmVzdWx0OyAvLyBzdWNjZXNzIGlzIG51bGwgb3IgdHJ1ZVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZXN1bHRDaGVjayAmJiAhKHIgPT0gbnVsbCB8fCByID09PSB0cnVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbEZhaWwodGhpcy5GQUlMRUQsIHIudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2godGhpcy5TVUNDRVNTKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocGF5bG9hZEVudmVsb3BlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB2b3J0ZXhTZXJ2aWNlXG4gICAgICAgICAgICAgICAgLnNlbmRQYXlsb2FkRW52ZWxvcGUodGhpcy5wYXlsb2FkRW52ZWxvcGUpXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiBjYWxsRmFpbCh0aGlzLlRJTUVEX09VVCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0U2Vjb25kcyAqIDEwMDAsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjYWxsRmFpbCh0aGlzLlNFTkRfRkFJTEVELCBlcnIpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdHRhY2hlcyBjYWxsYmFja3MgZm9yIHRoZSByZXNvbHV0aW9uIGFuZC9vciByZWplY3Rpb24gb2YgdGhlIFByb21pc2UuXG4gICAgICogQHBhcmFtIG9uZnVsZmlsbGVkIFRoZSBjYWxsYmFjayB0byBleGVjdXRlIHdoZW4gdGhlIFByb21pc2UgaXMgcmVzb2x2ZWQuXG4gICAgICogQHBhcmFtIG9ucmVqZWN0ZWQgVGhlIGNhbGxiYWNrIHRvIGV4ZWN1dGUgd2hlbiB0aGUgUHJvbWlzZSBpcyByZWplY3RlZC5cbiAgICAgKiBAcmV0dXJucyBBIFByb21pc2UgZm9yIHRoZSBjb21wbGV0aW9uIG9mIHdoaWNoIGV2ZXIgY2FsbGJhY2sgaXMgZXhlY3V0ZWQuXG4gICAgICovXG4gICAgdGhlbihvbmZ1bGZpbGxlZCwgb25yZWplY3RlZCA9IG51bGwpOiBQcm9taXNlPFBheWxvYWRFbnZlbG9wZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9taXNlLnRoZW4ob25mdWxmaWxsZWQsIG9ucmVqZWN0ZWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF0dGFjaGVzIGEgY2FsbGJhY2sgZm9yIG9ubHkgdGhlIHJlamVjdGlvbiBvZiB0aGUgUHJvbWlzZS5cbiAgICAgKiBAcGFyYW0gb25yZWplY3RlZCBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZSB3aGVuIHRoZSBQcm9taXNlIGlzIHJlamVjdGVkLlxuICAgICAqIEByZXR1cm5zIEEgUHJvbWlzZSBmb3IgdGhlIGNvbXBsZXRpb24gb2YgdGhlIGNhbGxiYWNrLlxuICAgICAqL1xuICAgIGNhdGNoKG9ucmVqZWN0ZWQpOiBQcm9taXNlPFBheWxvYWRFbnZlbG9wZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9taXNlLmNhdGNoKG9ucmVqZWN0ZWQpO1xuICAgIH1cblxuICAgIC8qKiBJcyBSZXNwb25zZSBQYXlsb2FkXG4gICAgICpcbiAgICAgKiBUaGUgUGF5bG9hZFJlc3BvbnNlIHRhZ3MgdGhlIHBheWxvYWRzLCBzbyBpdCBleHBlY3RzIGEgdW5pcXVlIG1lc3NhZ2UgYmFjay5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRydWUgaWYgdGhpcyBwYXlsb2FkIGhhcyBiZWVuIHRhZ2dlZCBieSBhIFBheWxvYWRSZXNwb25zZSBjbGFzc1xuICAgICAqL1xuICAgIHN0YXRpYyBpc1Jlc3BvbnNlUGF5bG9hZEVudmVsb3BlKHBheWxvYWRFbnZlbG9wZTogUGF5bG9hZEVudmVsb3BlKSB7XG4gICAgICAgIHJldHVybiBwYXlsb2FkRW52ZWxvcGUuZmlsdC5oYXNPd25Qcm9wZXJ0eShcbiAgICAgICAgICAgIFBheWxvYWRSZXNwb25zZS5tZXNzYWdlSWRLZXksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZ2V0IHN0YXR1cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXR1cztcbiAgICB9XG59XG4iXX0=