performance-monitor-logger
Version:
## Instalação
150 lines • 21.4 kB
JavaScript
// shared/performanceLoggerGlobal.ts
import { createPerformanceLogger } from './log-performatico';
export const GlobalPerformanceLogger = createPerformanceLogger('GLOBAL');
// Implementação unificada
export function PerformanceMonitor(options) {
return function (target, propertyKey, descriptor) {
// --- CASO 1: Class Decorator ---
// Se propertyKey e descriptor forem undefined, estamos decorando uma classe
if (!propertyKey && !descriptor) {
const constructor = target;
const opts = options;
const excludeList = (typeof opts === 'object' && (opts === null || opts === void 0 ? void 0 : opts.exclude)) || [];
const prefix = (typeof opts === 'object' && (opts === null || opts === void 0 ? void 0 : opts.prefix)) || '';
// Itera sobre todas as propriedades do prototype da classe
for (const prop of Object.getOwnPropertyNames(constructor.prototype)) {
// Ignora construtor e itens excluídos
if (prop === 'constructor' || excludeList.includes(prop)) {
continue;
}
const propDesc = Object.getOwnPropertyDescriptor(constructor.prototype, prop);
// Verifica se é método
if (propDesc && typeof propDesc.value === 'function') {
const originalMethod = propDesc.value;
const opName = prefix ? `${prefix}.${prop}` : prop;
// Substitui o método original pelo wrapper
propDesc.value = function (...args) {
const instanceLogger = this
.performanceLogger;
const logger = instanceLogger || GlobalPerformanceLogger;
if (!logger) {
return originalMethod.apply(this, args);
}
logger.startTimer(opName);
let result;
try {
result = originalMethod.apply(this, args);
}
catch (err) {
// Em caso de erro síncrono, finaliza timer e re-lança
logger.endTimer(opName);
throw err;
}
// Verifica se é Promise (assíncrono)
if (result && typeof result.then === 'function') {
return result
.then((res) => {
logger.endTimer(opName);
return res;
})
.catch((err) => {
logger.endTimer(opName);
throw err;
});
}
else {
// Síncrono
logger.endTimer(opName);
return result;
}
};
// Redefine a propriedade no prototype
Object.defineProperty(constructor.prototype, prop, propDesc);
}
}
return; // Retorna void para Class Decorator
}
// --- CASO 2: Method Decorator ---
if (!descriptor)
return; // Segurança
const originalMethod = descriptor.value;
let opName;
let customMethod;
let customThresholds;
let eventLabel;
// Parsing simples para method options
if (typeof options === 'object' &&
options !== null &&
!('exclude' in options) &&
!('prefix' in options)) {
const opts = options;
opName = opts.name || propertyKey;
customMethod = opts.method;
customThresholds = {
ok: opts.ok,
lento: opts.lento,
critico: opts.critico,
};
eventLabel = opts.event;
}
else if (typeof options === 'function') {
opName = options.name || propertyKey;
customMethod = options;
}
else if (typeof options === 'string') {
opName = options;
}
else {
opName = propertyKey;
}
descriptor.value = function (...args) {
const instanceLogger = this
.performanceLogger;
const logger = instanceLogger || GlobalPerformanceLogger;
if (logger) {
if (eventLabel) {
logger.beginEventContext(eventLabel);
}
logger.startTimer(opName);
let result;
try {
const methodToCall = customMethod || originalMethod;
result = methodToCall.apply(this, args);
}
catch (err) {
logger.endTimer(opName, undefined, customThresholds);
if (eventLabel)
logger.endEventContext();
throw err;
}
if (result && typeof result.then === 'function') {
return result
.then((res) => {
logger.endTimer(opName, undefined, customThresholds);
if (eventLabel)
logger.endEventContext();
return res;
})
.catch((err) => {
logger.endTimer(opName, undefined, customThresholds);
if (eventLabel)
logger.endEventContext();
throw err;
});
}
else {
logger.endTimer(opName, undefined, customThresholds);
if (eventLabel)
logger.endEventContext();
return result;
}
}
else {
const methodToCall = customMethod || originalMethod;
return methodToCall.apply(this, args);
}
};
return descriptor;
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyZm9ybWFuY2VMb2dnZXJHbG9iYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9wZXJmb3JtYW5jZS1tb25pdG9yLWxvZ2dlci9zcmMvbGliL3BlcmZvcm1hbmNlTG9nZ2VyR2xvYmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG9DQUFvQztBQUNwQyxPQUFPLEVBQUUsdUJBQXVCLEVBQW9CLE1BQU0sb0JBQW9CLENBQUM7QUFFL0UsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQ2xDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBMEJwQywwQkFBMEI7QUFDMUIsTUFBTSxVQUFVLGtCQUFrQixDQUNoQyxPQUlVO0lBRVYsT0FBTyxVQUNMLE1BQVcsRUFDWCxXQUFvQixFQUNwQixVQUErQjtRQUUvQixrQ0FBa0M7UUFDbEMsNEVBQTRFO1FBQzVFLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDL0IsTUFBTSxXQUFXLEdBQUcsTUFBa0IsQ0FBQztZQUN2QyxNQUFNLElBQUksR0FBRyxPQUF5QyxDQUFDO1lBQ3ZELE1BQU0sV0FBVyxHQUFHLENBQUMsT0FBTyxJQUFJLEtBQUssUUFBUSxLQUFJLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxPQUFPLENBQUEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN0RSxNQUFNLE1BQU0sR0FBRyxDQUFDLE9BQU8sSUFBSSxLQUFLLFFBQVEsS0FBSSxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsTUFBTSxDQUFBLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFaEUsMkRBQTJEO1lBQzNELEtBQUssTUFBTSxJQUFJLElBQUksTUFBTSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsRUFBRTtnQkFDcEUsc0NBQXNDO2dCQUN0QyxJQUFJLElBQUksS0FBSyxhQUFhLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FB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LEVBQUUsQ0FBQztvQkFDekMsTUFBTSxHQUFHLENBQUM7aUJBQ1g7Z0JBRUQsSUFBSSxNQUFNLElBQUksT0FBTyxNQUFNLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRTtvQkFDL0MsT0FBTyxNQUFNO3lCQUNWLElBQUksQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO3dCQUNqQixNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQzt3QkFDckQsSUFBSSxVQUFVOzRCQUFFLE1BQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQzt3QkFDekMsT0FBTyxHQUFHLENBQUM7b0JBQ2IsQ0FBQyxDQUFDO3lCQUNELEtBQUssQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO3dCQUNsQixNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQzt3QkFDckQsSUFBSSxVQUFVOzRCQUFFLE1BQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQzt3QkFDekMsTUFBTSxHQUFHLENBQUM7b0JBQ1osQ0FBQyxDQUFDLENBQUM7aUJBQ047cUJBQU07b0JBQ0wsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixDQUFDLENBQUM7b0JBQ3JELElBQUksVUFBVTt3QkFBRSxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUM7b0JBQ3pDLE9BQU8sTUFBTSxDQUFDO2lCQUNmO2FBQ0Y7aUJBQU07Z0JBQ0wsTUFBTSxZQUFZLEdBQUcsWUFBWSxJQUFJLGNBQWMsQ0FBQztnQkFDcEQsT0FBTyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQzthQUN2QztRQUNILENBQUMsQ0FBQztRQUVGLE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBzaGFyZWQvcGVyZm9ybWFuY2VMb2dnZXJHbG9iYWwudHNcclxuaW1wb3J0IHsgY3JlYXRlUGVyZm9ybWFuY2VMb2dnZXIsIExvZ3NQZXJmb3JtYXRpY28gfSBmcm9tICcuL2xvZy1wZXJmb3JtYXRpY28nO1xyXG5cclxuZXhwb3J0IGNvbnN0IEdsb2JhbFBlcmZvcm1hbmNlTG9nZ2VyOiBMb2dzUGVyZm9ybWF0aWNvID1cclxuICBjcmVhdGVQZXJmb3JtYW5jZUxvZ2dlcignR0xPQkFMJyk7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFBlcmZvcm1hbmNlTW9uaXRvck1ldGhvZE9wdGlvbnMge1xyXG4gIG5hbWU/OiBzdHJpbmc7XHJcbiAgbWV0aG9kPzogRnVuY3Rpb247XHJcbiAgb2s/OiBudW1iZXI7XHJcbiAgbGVudG8/OiBudW1iZXI7XHJcbiAgY3JpdGljbz86IG51bWJlcjtcclxuICBldmVudD86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBQZXJmb3JtYW5jZU1vbml0b3JDbGFzc09wdGlvbnMge1xyXG4gIGV4Y2x1ZGU/OiBzdHJpbmdbXTtcclxuICBwcmVmaXg/OiBzdHJpbmc7XHJcbn1cclxuXHJcbi8vIFNvYnJlY2FyZ2EgcGFyYSBEZWNvcmF0b3IgZGUgTcOpdG9kb1xyXG5leHBvcnQgZnVuY3Rpb24gUGVyZm9ybWFuY2VNb25pdG9yKFxyXG4gIG9wdGlvbnM/OiBQZXJmb3JtYW5jZU1vbml0b3JNZXRob2RPcHRpb25zIHwgRnVuY3Rpb24gfCBzdHJpbmdcclxuKTogTWV0aG9kRGVjb3JhdG9yO1xyXG5cclxuLy8gU29icmVjYXJnYSBwYXJhIERlY29yYXRvciBkZSBDbGFzc2VcclxuZXhwb3J0IGZ1bmN0aW9uIFBlcmZvcm1hbmNlTW9uaXRvcihcclxuICBvcHRpb25zPzogUGVyZm9ybWFuY2VNb25pdG9yQ2xhc3NPcHRpb25zXHJcbik6IENsYXNzRGVjb3JhdG9yO1xyXG5cclxuLy8gSW1wbGVtZW50YcOnw6NvIHVuaWZpY2FkYVxyXG5leHBvcnQgZnVuY3Rpb24gUGVyZm9ybWFuY2VNb25pdG9yKFxyXG4gIG9wdGlvbnM/OlxyXG4gICAgfCBQZXJmb3JtYW5jZU1vbml0b3JNZXRob2RPcHRpb25zXHJcbiAgICB8IFBlcmZvcm1hbmNlTW9uaXRvckNsYXNzT3B0aW9uc1xyXG4gICAgfCBGdW5jdGlvblxyXG4gICAgfCBzdHJpbmdcclxuKSB7XHJcbiAgcmV0dXJuIGZ1bmN0aW9uIChcclxuICAgIHRhcmdldDogYW55LFxyXG4gICAgcHJvcGVydHlLZXk/OiBzdHJpbmcsXHJcbiAgICBkZXNjcmlwdG9yPzogUHJvcGVydHlEZXNjcmlwdG9yXHJcbiAgKSB7XHJcbiAgICAvLyAtLS0gQ0FTTyAxOiBDbGFzcyBEZWNvcmF0b3IgLS0tXHJcbiAgICAvLyBTZSBwcm9wZXJ0eUtleSBlIGRlc2NyaXB0b3IgZm9yZW0gdW5kZWZpbmVkLCBlc3RhbW9zIGRlY29yYW5kbyB1bWEgY2xhc3NlXHJcbiAgICBpZiAoIXByb3BlcnR5S2V5ICYmICFkZXNjcmlwdG9yKSB7XHJcbiAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gdGFyZ2V0IGFzIEZ1bmN0aW9uO1xyXG4gICAgICBjb25zdCBvcHRzID0gb3B0aW9ucyBhcyBQZXJmb3JtYW5jZU1vbml0b3JDbGFzc09wdGlvbnM7XHJcbiAgICAgIGNvbnN0IGV4Y2x1ZGVMaXN0ID0gKHR5cGVvZiBvcHRzID09PSAnb2JqZWN0JyAmJiBvcHRzPy5leGNsdWRlKSB8fCBbXTtcclxuICAgICAgY29uc3QgcHJlZml4ID0gKHR5cGVvZiBvcHRzID09PSAnb2JqZWN0JyAmJiBvcHRzPy5wcmVmaXgpIHx8ICcnO1xyXG5cclxuICAgICAgLy8gSXRlcmEgc29icmUgdG9kYXMgYXMgcHJvcHJpZWRhZGVzIGRvIHByb3RvdHlwZSBkYSBjbGFzc2VcclxuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGNvbnN0cnVjdG9yLnByb3RvdHlwZSkpIHtcclxuICAgICAgICAvLyBJZ25vcmEgY29uc3RydXRvciBlIGl0ZW5zIGV4Y2x1w61kb3NcclxuICAgICAgICBpZiAocHJvcCA9PT0gJ2NvbnN0cnVjdG9yJyB8fCBleGNsdWRlTGlzdC5pbmNsdWRlcyhwcm9wKSkge1xyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBwcm9wRGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXHJcbiAgICAgICAgICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUsXHJcbiAgICAgICAgICBwcm9wXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLy8gVmVyaWZpY2Egc2Ugw6kgbcOpdG9kb1xyXG4gICAgICAgIGlmIChwcm9wRGVzYyAmJiB0eXBlb2YgcHJvcERlc2MudmFsdWUgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgIGNvbnN0IG9yaWdpbmFsTWV0aG9kID0gcHJvcERlc2MudmFsdWU7XHJcbiAgICAgICAgICBjb25zdCBvcE5hbWUgPSBwcmVmaXggPyBgJHtwcmVmaXh9LiR7cHJvcH1gIDogcHJvcDtcclxuXHJcbiAgICAgICAgICAvLyBTdWJzdGl0dWkgbyBtw6l0b2RvIG9yaWdpbmFsIHBlbG8gd3JhcHBlclxyXG4gICAgICAgICAgcHJvcERlc2MudmFsdWUgPSBmdW5jdGlvbiAoLi4uYXJnczogYW55W10pIHtcclxuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2VMb2dnZXIgPSAodGhpcyBhcyBhbnkpXHJcbiAgICAgICAgICAgICAgLnBlcmZvcm1hbmNlTG9nZ2VyIGFzIExvZ3NQZXJmb3JtYXRpY287XHJcbiAgICAgICAgICAgIGNvbnN0IGxvZ2dlciA9IGluc3RhbmNlTG9nZ2VyIHx8IEdsb2JhbFBlcmZvcm1hbmNlTG9nZ2VyO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFsb2dnZXIpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxNZXRob2QuYXBwbHkodGhpcywgYXJncyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxvZ2dlci5zdGFydFRpbWVyKG9wTmFtZSk7XHJcblxyXG4gICAgICAgICAgICBsZXQgcmVzdWx0O1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIHJlc3VsdCA9IG9yaWdpbmFsTWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3MpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAvLyBFbSBjYXNvIGRlIGVycm8gc8OtbmNyb25vLCBmaW5hbGl6YSB0aW1lciBlIHJlLWxhbsOnYVxyXG4gICAgICAgICAgICAgIGxvZ2dlci5lbmRUaW1lcihvcE5hbWUpO1xyXG4gICAgICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gVmVyaWZpY2Egc2Ugw6kgUHJvbWlzZSAoYXNzw61uY3Jvbm8pXHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdC50aGVuID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxyXG4gICAgICAgICAgICAgICAgLnRoZW4oKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGxvZ2dlci5lbmRUaW1lcihvcE5hbWUpO1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVuZFRpbWVyKG9wTmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIC8vIFPDrW5jcm9ub1xyXG4gICAgICAgICAgICAgIGxvZ2dlci5lbmRUaW1lcihvcE5hbWUpO1xyXG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgLy8gUmVkZWZpbmUgYSBwcm9wcmllZGFkZSBubyBwcm90b3R5cGVcclxuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3AsIHByb3BEZXNjKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuOyAvLyBSZXRvcm5hIHZvaWQgcGFyYSBDbGFzcyBEZWNvcmF0b3JcclxuICAgIH1cclxuXHJcbiAgICAvLyAtLS0gQ0FTTyAyOiBNZXRob2QgRGVjb3JhdG9yIC0tLVxyXG4gICAgaWYgKCFkZXNjcmlwdG9yKSByZXR1cm47IC8vIFNlZ3VyYW7Dp2FcclxuXHJcbiAgICBjb25zdCBvcmlnaW5hbE1ldGhvZCA9IGRlc2NyaXB0b3IudmFsdWU7XHJcblxyXG4gICAgbGV0IG9wTmFtZTogc3RyaW5nO1xyXG4gICAgbGV0IGN1c3RvbU1ldGhvZDogRnVuY3Rpb24gfCB1bmRlZmluZWQ7XHJcbiAgICBsZXQgY3VzdG9tVGhyZXNob2xkczpcclxuICAgICAgfCB7IG9rPzogbnVtYmVyOyBsZW50bz86IG51bWJlcjsgY3JpdGljbz86IG51bWJlciB9XHJcbiAgICAgIHwgdW5kZWZpbmVkO1xyXG4gICAgbGV0IGV2ZW50TGFiZWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICAvLyBQYXJzaW5nIHNpbXBsZXMgcGFyYSBtZXRob2Qgb3B0aW9uc1xyXG4gICAgaWYgKFxyXG4gICAgICB0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgJiZcclxuICAgICAgb3B0aW9ucyAhPT0gbnVsbCAmJlxyXG4gICAgICAhKCdleGNsdWRlJyBpbiBvcHRpb25zKSAmJlxyXG4gICAgICAhKCdwcmVmaXgnIGluIG9wdGlvbnMpXHJcbiAgICApIHtcclxuICAgICAgY29uc3Qgb3B0cyA9IG9wdGlvbnMgYXMgUGVyZm9ybWFuY2VNb25pdG9yTWV0aG9kT3B0aW9ucztcclxuICAgICAgb3BOYW1lID0gb3B0cy5uYW1lIHx8IHByb3BlcnR5S2V5ITtcclxuICAgICAgY3VzdG9tTWV0aG9kID0gb3B0cy5tZXRob2Q7XHJcbiAgICAgIGN1c3RvbVRocmVzaG9sZHMgPSB7XHJcbiAgICAgICAgb2s6IG9wdHMub2ssXHJcbiAgICAgICAgbGVudG86IG9wdHMubGVudG8sXHJcbiAgICAgICAgY3JpdGljbzogb3B0cy5jcml0aWNvLFxyXG4gICAgICB9O1xyXG4gICAgICBldmVudExhYmVsID0gb3B0cy5ldmVudDtcclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgb3BOYW1lID0gb3B0aW9ucy5uYW1lIHx8IHByb3BlcnR5S2V5ITtcclxuICAgICAgY3VzdG9tTWV0aG9kID0gb3B0aW9ucztcclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIG9wTmFtZSA9IG9wdGlvbnM7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBvcE5hbWUgPSBwcm9wZXJ0eUtleSE7XHJcbiAgICB9XHJcblxyXG4gICAgZGVzY3JpcHRvci52YWx1ZSA9IGZ1bmN0aW9uICguLi5hcmdzOiBhbnlbXSkge1xyXG4gICAgICBjb25zdCBpbnN0YW5jZUxvZ2dlciA9ICh0aGlzIGFzIGFueSlcclxuICAgICAgICAucGVyZm9ybWFuY2VMb2dnZXIgYXMgTG9nc1BlcmZvcm1hdGljbztcclxuICAgICAgY29uc3QgbG9nZ2VyID0gaW5zdGFuY2VMb2dnZXIgfHwgR2xvYmFsUGVyZm9ybWFuY2VMb2dnZXI7XHJcblxyXG4gICAgICBpZiAobG9nZ2VyKSB7XHJcbiAgICAgICAgaWYgKGV2ZW50TGFiZWwpIHtcclxuICAgICAgICAgIGxvZ2dlci5iZWdpbkV2ZW50Q29udGV4dChldmVudExhYmVsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbG9nZ2VyLnN0YXJ0VGltZXIob3BOYW1lKTtcclxuXHJcbiAgICAgICAgbGV0IHJlc3VsdDtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgY29uc3QgbWV0aG9kVG9DYWxsID0gY3VzdG9tTWV0aG9kIHx8IG9yaWdpbmFsTWV0aG9kO1xyXG4gICAgICAgICAgcmVzdWx0ID0gbWV0aG9kVG9DYWxsLmFwcGx5KHRoaXMsIGFyZ3MpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgbG9nZ2VyLmVuZFRpbWVyKG9wTmFtZSwgdW5kZWZpbmVkLCBjdXN0b21UaHJlc2hvbGRzKTtcclxuICAgICAgICAgIGlmIChldmVudExhYmVsKSBsb2dnZXIuZW5kRXZlbnRDb250ZXh0KCk7XHJcbiAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocmVzdWx0ICYmIHR5cGVvZiByZXN1bHQudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdFxyXG4gICAgICAgICAgICAudGhlbigocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICBsb2dnZXIuZW5kVGltZXIob3BOYW1lLCB1bmRlZmluZWQsIGN1c3RvbVRocmVzaG9sZHMpO1xyXG4gICAgICAgICAgICAgIGlmIChldmVudExhYmVsKSBsb2dnZXIuZW5kRXZlbnRDb250ZXh0KCk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLmNhdGNoKChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIGxvZ2dlci5lbmRUaW1lcihvcE5hbWUsIHVuZGVmaW5lZCwgY3VzdG9tVGhyZXNob2xkcyk7XHJcbiAgICAgICAgICAgICAgaWYgKGV2ZW50TGFiZWwpIGxvZ2dlci5lbmRFdmVudENvbnRleHQoKTtcclxuICAgICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsb2dnZXIuZW5kVGltZXIob3BOYW1lLCB1bmRlZmluZWQsIGN1c3RvbVRocmVzaG9sZHMpO1xyXG4gICAgICAgICAgaWYgKGV2ZW50TGFiZWwpIGxvZ2dlci5lbmRFdmVudENvbnRleHQoKTtcclxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IG1ldGhvZFRvQ2FsbCA9IGN1c3RvbU1ldGhvZCB8fCBvcmlnaW5hbE1ldGhvZDtcclxuICAgICAgICByZXR1cm4gbWV0aG9kVG9DYWxsLmFwcGx5KHRoaXMsIGFyZ3MpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBkZXNjcmlwdG9yO1xyXG4gIH07XHJcbn1cclxuIl19