UNPKG

performance-monitor-logger

Version:

## Instalação

150 lines 21.4 kB
// 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