ionic-logging-service
Version:
Logging functionalities for apps built with Ionic framework
149 lines • 16.5 kB
JavaScript
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==