UNPKG

ionic-logging-service

Version:

Logging functionalities for apps built with Ionic framework

149 lines 16.5 kB
import { EventEmitter } from "@angular/core"; import * as log4javascript from "log4javascript"; import { JsonLayout } from "./json-layout.model"; import { LogLevelConverter } from "./log-level.converter"; /** * An appender which sends the log messages to a server via HTTP. * * A typical configuration could be: * * ```json * { * "url": "https://my.backend.xy/LoggingBackend", * "batchSize": 10, * "timerInterval": 60000, * "threshold": "INFO" * } * ``` */ export class AjaxAppender extends log4javascript.Appender { static { this.batchSizeDefault = 1; } static { this.timerIntervalDefault = 0; } static { this.thresholdDefault = "WARN"; } /** * Creates a new instance of the appender. * * @param configuration configuration for the appender. */ constructor(configuration) { super(); if (!configuration) { throw new Error("configuration must be not empty"); } if (!configuration.url) { throw new Error("url must be not empty"); } this.ajaxAppender = new log4javascript.AjaxAppender(configuration.url, configuration.withCredentials); this.url = configuration.url; this.withCredentials = configuration.withCredentials; this.ajaxAppender.setLayout(new JsonLayout(false, false)); this.ajaxAppender.addHeader("Content-Type", "application/json; charset=utf-8"); this.ajaxAppender.setSendAllOnUnload(true); this.appenderFailed = new EventEmitter(); this.ajaxAppender.setFailCallback((message) => { this.appenderFailed.emit(message); }); // process remaining configuration this.configure({ batchSize: configuration.batchSize || AjaxAppender.batchSizeDefault, threshold: configuration.threshold || AjaxAppender.thresholdDefault, timerInterval: configuration.timerInterval || AjaxAppender.timerIntervalDefault, url: configuration.url, withCredentials: configuration.withCredentials }); } /** * Configures the logging depending on the given configuration. * * Only the defined properties get overwritten. * Neither url nor withCredentials can be modified. * * @param configuration configuration data. */ configure(configuration) { if (configuration) { if (configuration.url && configuration.url !== this.url) { throw new Error("url must not be changed"); } if (configuration.withCredentials && configuration.withCredentials !== this.withCredentials) { throw new Error("withCredentials must not be changed"); } if (configuration.batchSize) { this.setBatchSize(configuration.batchSize); } if (typeof configuration.timerInterval === "number") { this.setTimerInterval(configuration.timerInterval); } if (configuration.threshold) { const convertedThreshold = LogLevelConverter.levelToLog4Javascript(LogLevelConverter.levelFromString(configuration.threshold)); this.setThreshold(convertedThreshold); } } } /** * Appender-specific method to append a log message. * * @param loggingEvent event to be appended. */ append(loggingEvent) { this.ajaxAppender.append(loggingEvent); } /** * Gets the appender's name. * Mainly for unit testing purposes. * * @return appender's name */ toString() { return "Ionic.Logging.AjaxAppender"; } /** * Get the internally used appender. * Mainly for unit testing purposes. */ getInternalAppender() { return this.ajaxAppender; } /** * Returns the number of log messages sent in each request. */ getBatchSize() { return this.ajaxAppender.getBatchSize(); } /** * Sets the number of log messages to send in each request. * * @param batchSize new batch size */ setBatchSize(batchSize) { this.ajaxAppender.setBatchSize(batchSize); } /** * Returns the appender's layout. */ getLayout() { return this.ajaxAppender.getLayout(); } /** * Sets the appender's layout. */ setLayout(layout) { this.ajaxAppender.setLayout(layout); } /** * Returns the length of time in milliseconds between each sending of queued log messages. */ getTimerInterval() { return this.ajaxAppender.getTimerInterval(); } /** * Sets the length of time in milliseconds between each sending of queued log messages. * * @param timerInterval new timer interval */ setTimerInterval(timerInterval) { this.ajaxAppender.setTimed(timerInterval > 0); this.ajaxAppender.setTimerInterval(timerInterval); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWpheC1hcHBlbmRlci5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2lvbmljLWxvZ2dpbmctc2VydmljZS9zcmMvbGliL2FqYXgtYXBwZW5kZXIubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU3QyxPQUFPLEtBQUssY0FBYyxNQUFNLGdCQUFnQixDQUFDO0FBR2pELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxPQUFPLFlBQWEsU0FBUSxjQUFjLENBQUMsUUFBUTthQUV6QyxxQkFBZ0IsR0FBRyxDQUFDLENBQUM7YUFDckIseUJBQW9CLEdBQUcsQ0FBQyxDQUFDO2FBQ3pCLHFCQUFnQixHQUFHLE1BQU0sQ0FBQztJQWF6Qzs7OztPQUlHO0lBQ0gsWUFBWSxhQUF3QztRQUNuRCxLQUFLLEVBQUUsQ0FBQztRQUVSLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUNELElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQzFDLENBQUM7UUFDRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksY0FBYyxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN0RyxJQUFJLENBQUMsR0FBRyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUM7UUFDN0IsSUFBSSxDQUFDLGVBQWUsR0FBRyxhQUFhLENBQUMsZUFBZSxDQUFD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RDs7T0FFRztJQUNJLFNBQVM7UUFDZixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksU0FBUyxDQUFDLE1BQTZCO1FBQzdDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7T0FFRztJQUNJLGdCQUFnQjtRQUN0QixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLGdCQUFnQixDQUFDLGFBQXFCO1FBQzVDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ25ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuXG5pbXBvcnQgKiBhcyBsb2c0amF2YXNjcmlwdCBmcm9tIFwibG9nNGphdmFzY3JpcHRcIjtcblxuaW1wb3J0IHsgQWpheEFwcGVuZGVyQ29uZmlndXJhdGlvbiB9IGZyb20gXCIuL2FqYXgtYXBwZW5kZXIuY29uZmlndXJhdGlvblwiO1xuaW1wb3J0IHsgSnNvbkxheW91dCB9IGZyb20gXCIuL2pzb24tbGF5b3V0Lm1vZGVsXCI7XG5pbXBvcnQgeyBMb2dMZXZlbENvbnZlcnRlciB9IGZyb20gXCIuL2xvZy1sZXZlbC5jb252ZXJ0ZXJcIjtcblxuLyoqXG4gKiBBbiBhcHBlbmRlciB3aGljaCBzZW5kcyB0aGUgbG9nIG1lc3NhZ2VzIHRvIGEgc2VydmVyIHZpYSBIVFRQLlxuICpcbiAqIEEgdHlwaWNhbCBjb25maWd1cmF0aW9uIGNvdWxkIGJlOlxuICpcbiAqIGBgYGpzb25cbiAqIHtcbiAqICAgXCJ1cmxcIjogXCJodHRwczovL215LmJhY2tlbmQueHkvTG9nZ2luZ0JhY2tlbmRcIixcbiAqICAgXCJiYXRjaFNpemVcIjogMTAsXG4gKiAgIFwidGltZXJJbnRlcnZhbFwiOiA2MDAwMCxcbiAqICAgXCJ0aHJlc2hvbGRcIjogXCJJTkZPXCJcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQWpheEFwcGVuZGVyIGV4dGVuZHMgbG9nNGphdmFzY3JpcHQuQXBwZW5kZXIge1xuXG5cdHByaXZhdGUgc3RhdGljIGJhdGNoU2l6ZURlZmF1bHQgPSAxO1xuXHRwcml2YXRlIHN0YXRpYyB0aW1lckludGVydmFsRGVmYXVsdCA9IDA7XG5cdHByaXZhdGUgc3RhdGljIHRocmVzaG9sZERlZmF1bHQgPSBcIldBUk5cIjtcblxuXHQvKipcblx0ICogRXZlbnQgdHJpZ2dlcmVkIHdoZW4gdGhlIGFwcGVuZGVyIGNvdWxkIG5vdCBzZW5kIGxvZyBtZXNzYWdlcyB0byB0aGUgc2VydmVyLlxuXHQgKlxuXHQgKiBAcGFyYW0gbWVzc2FnZSBlcnJvciBtZXNzYWdlXG5cdCAqL1xuXHRwdWJsaWMgYXBwZW5kZXJGYWlsZWQ6IEV2ZW50RW1pdHRlcjxzdHJpbmc+O1xuXG5cdHByaXZhdGUgYWpheEFwcGVuZGVyOiBsb2c0amF2YXNjcmlwdC5BamF4QXBwZW5kZXI7XG5cdHByaXZhdGUgdXJsOiBzdHJpbmc7XG5cdHByaXZhdGUgd2l0aENyZWRlbnRpYWxzOiBib29sZWFuO1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBhcHBlbmRlci5cblx0ICpcblx0ICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiBmb3IgdGhlIGFwcGVuZGVyLlxuXHQgKi9cblx0Y29uc3RydWN0b3IoY29uZmlndXJhdGlvbjogQWpheEFwcGVuZGVyQ29uZmlndXJhdGlvbikge1xuXHRcdHN1cGVyKCk7XG5cblx0XHRpZiAoIWNvbmZpZ3VyYXRpb24pIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcImNvbmZpZ3VyYXRpb24gbXVzdCBiZSBub3QgZW1wdHlcIik7XG5cdFx0fVxuXHRcdGlmICghY29uZmlndXJhdGlvbi51cmwpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcInVybCBtdXN0IGJlIG5vdCBlbXB0eVwiKTtcblx0XHR9XG5cdFx0dGhpcy5hamF4QXBwZW5kZXIgPSBuZXcgbG9nNGphdmFzY3JpcHQuQWpheEFwcGVuZGVyKGNvbmZpZ3VyYXRpb24udXJsLCBjb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyk7XG5cdFx0dGhpcy51cmwgPSBjb25maWd1cmF0aW9uLnVybDtcblx0XHR0aGlzLndpdGhDcmVkZW50aWFscyA9IGNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzO1xuXG5cdFx0dGhpcy5hamF4QXBwZW5kZXIuc2V0TGF5b3V0KG5ldyBKc29uTGF5b3V0KGZhbHNlLCBmYWxzZSkpO1xuXHRcdHRoaXMuYWpheEFwcGVuZGVyLmFkZEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLThcIik7XG5cdFx0dGhpcy5hamF4QXBwZW5kZXIuc2V0U2VuZEFsbE9uVW5sb2FkKHRydWUpO1xuXG5cdFx0dGhpcy5hcHBlbmRlckZhaWxlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXHRcdHRoaXMuYWpheEFwcGVuZGVyLnNldEZhaWxDYWxsYmFjaygobWVzc2FnZTogYW55KSA9PiB7XG5cdFx0XHR0aGlzLmFwcGVuZGVyRmFpbGVkLmVtaXQobWVzc2FnZSk7XG5cdFx0fSk7XG5cblx0XHQvLyBwcm9jZXNzIHJlbWFpbmluZyBjb25maWd1cmF0aW9uXG5cdFx0dGhpcy5jb25maWd1cmUoe1xuXHRcdFx0YmF0Y2hTaXplOiBjb25maWd1cmF0aW9uLmJhdGNoU2l6ZSB8fCBBamF4QXBwZW5kZXIuYmF0Y2hTaXplRGVmYXVsdCxcblx0XHRcdHRocmVzaG9sZDogY29uZmlndXJhdGlvbi50aHJlc2hvbGQgfHwgQWpheEFwcGVuZGVyLnRocmVzaG9sZERlZmF1bHQsXG5cdFx0XHR0aW1lckludGVydmFsOiBjb25maWd1cmF0aW9uLnRpbWVySW50ZXJ2YWwgfHwgQWpheEFwcGVuZGVyLnRpbWVySW50ZXJ2YWxEZWZhdWx0LFxuXHRcdFx0dXJsOiBjb25maWd1cmF0aW9uLnVybCxcblx0XHRcdHdpdGhDcmVkZW50aWFsczogY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHNcblx0XHR9KTtcblxuXHR9XG5cblx0LyoqXG5cdCAqIENvbmZpZ3VyZXMgdGhlIGxvZ2dpbmcgZGVwZW5kaW5nIG9uIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLlxuXHQgKlxuXHQgKiBPbmx5IHRoZSBkZWZpbmVkIHByb3BlcnRpZXMgZ2V0IG92ZXJ3cml0dGVuLlxuXHQgKiBOZWl0aGVyIHVybCBub3Igd2l0aENyZWRlbnRpYWxzIGNhbiBiZSBtb2RpZmllZC5cblx0ICpcblx0ICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiBkYXRhLlxuXHQgKi9cblx0cHVibGljIGNvbmZpZ3VyZShjb25maWd1cmF0aW9uOiBBamF4QXBwZW5kZXJDb25maWd1cmF0aW9uKTogdm9pZCB7XG5cdFx0aWYgKGNvbmZpZ3VyYXRpb24pIHtcblx0XHRcdGlmIChjb25maWd1cmF0aW9uLnVybCAmJiBjb25maWd1cmF0aW9uLnVybCAhPT0gdGhpcy51cmwpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwidXJsIG11c3Qgbm90IGJlIGNoYW5nZWRcIik7XG5cdFx0XHR9XG5cdFx0XHRpZiAoY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMgJiYgY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMgIT09IHRoaXMud2l0aENyZWRlbnRpYWxzKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIndpdGhDcmVkZW50aWFscyBtdXN0IG5vdCBiZSBjaGFuZ2VkXCIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGNvbmZpZ3VyYXRpb24uYmF0Y2hTaXplKSB7XG5cdFx0XHRcdHRoaXMuc2V0QmF0Y2hTaXplKGNvbmZpZ3VyYXRpb24uYmF0Y2hTaXplKTtcblx0XHRcdH1cblx0XHRcdGlmICh0eXBlb2YgY29uZmlndXJhdGlvbi50aW1lckludGVydmFsID09PSBcIm51bWJlclwiKSB7XG5cdFx0XHRcdHRoaXMuc2V0VGltZXJJbnRlcnZhbChjb25maWd1cmF0aW9uLnRpbWVySW50ZXJ2YWwpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGNvbmZpZ3VyYXRpb24udGhyZXNob2xkKSB7XG5cdFx0XHRcdGNvbnN0IGNvbnZlcnRlZFRocmVzaG9sZCA9IExvZ0xldmVsQ29udmVydGVyLmxldmVsVG9Mb2c0SmF2YXNjcmlwdChcblx0XHRcdFx0XHRMb2dMZXZlbENvbnZlcnRlci5sZXZlbEZyb21TdHJpbmcoY29uZmlndXJhdGlvbi50aHJlc2hvbGQpKTtcblx0XHRcdFx0dGhpcy5zZXRUaHJlc2hvbGQoY29udmVydGVkVGhyZXNob2xkKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQXBwZW5kZXItc3BlY2lmaWMgbWV0aG9kIHRvIGFwcGVuZCBhIGxvZyBtZXNzYWdlLlxuXHQgKlxuXHQgKiBAcGFyYW0gbG9nZ2luZ0V2ZW50IGV2ZW50IHRvIGJlIGFwcGVuZGVkLlxuXHQgKi9cblx0cHVibGljIGFwcGVuZChsb2dnaW5nRXZlbnQ6IGxvZzRqYXZhc2NyaXB0LkxvZ2dpbmdFdmVudCk6IHZvaWQge1xuXHRcdHRoaXMuYWpheEFwcGVuZGVyLmFwcGVuZChsb2dnaW5nRXZlbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGFwcGVuZGVyJ3MgbmFtZS5cblx0ICogTWFpbmx5IGZvciB1bml0IHRlc3RpbmcgcHVycG9zZXMuXG5cdCAqXG5cdCAqIEByZXR1cm4gYXBwZW5kZXIncyBuYW1lXG5cdCAqL1xuXHRwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gXCJJb25pYy5Mb2dnaW5nLkFqYXhBcHBlbmRlclwiO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldCB0aGUgaW50ZXJuYWxseSB1c2VkIGFwcGVuZGVyLlxuXHQgKiBNYWlubHkgZm9yIHVuaXQgdGVzdGluZyBwdXJwb3Nlcy5cblx0ICovXG5cdHB1YmxpYyBnZXRJbnRlcm5hbEFwcGVuZGVyKCk6IGxvZzRqYXZhc2NyaXB0LkFqYXhBcHBlbmRlciB7XG5cdFx0cmV0dXJuIHRoaXMuYWpheEFwcGVuZGVyO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIG51bWJlciBvZiBsb2cgbWVzc2FnZXMgc2VudCBpbiBlYWNoIHJlcXVlc3QuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0QmF0Y2hTaXplKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMuYWpheEFwcGVuZGVyLmdldEJhdGNoU2l6ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIG51bWJlciBvZiBsb2cgbWVzc2FnZXMgdG8gc2VuZCBpbiBlYWNoIHJlcXVlc3QuXG5cdCAqXG5cdCAqIEBwYXJhbSBiYXRjaFNpemUgbmV3IGJhdGNoIHNpemVcblx0ICovXG5cdHB1YmxpYyBzZXRCYXRjaFNpemUoYmF0Y2hTaXplOiBudW1iZXIpOiB2b2lkIHtcblx0XHR0aGlzLmFqYXhBcHBlbmRlci5zZXRCYXRjaFNpemUoYmF0Y2hTaXplKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBhcHBlbmRlcidzIGxheW91dC5cblx0ICovXG5cdHB1YmxpYyBnZXRMYXlvdXQoKTogbG9nNGphdmFzY3JpcHQuTGF5b3V0IHtcblx0XHRyZXR1cm4gdGhpcy5hamF4QXBwZW5kZXIuZ2V0TGF5b3V0KCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgYXBwZW5kZXIncyBsYXlvdXQuXG5cdCAqL1xuXHRwdWJsaWMgc2V0TGF5b3V0KGxheW91dDogbG9nNGphdmFzY3JpcHQuTGF5b3V0KTogdm9pZCB7XG5cdFx0dGhpcy5hamF4QXBwZW5kZXIuc2V0TGF5b3V0KGxheW91dCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGJldHdlZW4gZWFjaCBzZW5kaW5nIG9mIHF1ZXVlZCBsb2cgbWVzc2FnZXMuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VGltZXJJbnRlcnZhbCgpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLmFqYXhBcHBlbmRlci5nZXRUaW1lckludGVydmFsKCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgbGVuZ3RoIG9mIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGJldHdlZW4gZWFjaCBzZW5kaW5nIG9mIHF1ZXVlZCBsb2cgbWVzc2FnZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSB0aW1lckludGVydmFsIG5ldyB0aW1lciBpbnRlcnZhbFxuXHQgKi9cblx0cHVibGljIHNldFRpbWVySW50ZXJ2YWwodGltZXJJbnRlcnZhbDogbnVtYmVyKTogdm9pZCB7XG5cdFx0dGhpcy5hamF4QXBwZW5kZXIuc2V0VGltZWQodGltZXJJbnRlcnZhbCA+IDApO1xuXHRcdHRoaXMuYWpheEFwcGVuZGVyLnNldFRpbWVySW50ZXJ2YWwodGltZXJJbnRlcnZhbCk7XG5cdH1cbn1cbiJdfQ==