UNPKG

dynamicsmobile

Version:

Allows development of off-line mobile and web business apps over the Dynamics Mobile platform. More info on https://www.dynamicsmobile.com

129 lines 5.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.profile = exports.resetProfilerActiveCache = exports.isProfilerActive = void 0; const tslib_1 = require("tslib"); const configuration_service_1 = require("../lib-core/configuration-service"); const dms_root_container_1 = require("../ioc/dms-root-container"); // Module-level cache for profiler active state let _profilerActiveCache = null; let _profilerCheckPromise = null; // Function to check if profiler is active function isProfilerActive() { return tslib_1.__awaiter(this, void 0, void 0, function* () { // Return cached value if available if (_profilerActiveCache !== null) { return _profilerActiveCache; } // If we're already checking, reuse that promise if (_profilerCheckPromise) { return _profilerCheckPromise; } // Create new promise to check setting _profilerCheckPromise = new Promise((resolve) => tslib_1.__awaiter(this, void 0, void 0, function* () { try { const profilerActive = yield dms_root_container_1.RootDIContainer.inject(configuration_service_1.ConfigurationService).getSetting('profilerActive'); _profilerActiveCache = profilerActive === 'true'; } catch (error) { console.error('Error checking profiler active status:', error); _profilerActiveCache = false; } // Clear the promise once resolved _profilerCheckPromise = null; resolve(_profilerActiveCache); })); return _profilerCheckPromise; }); } exports.isProfilerActive = isProfilerActive; // Reset cache (useful for testing) function resetProfilerActiveCache() { _profilerActiveCache = null; } exports.resetProfilerActiveCache = resetProfilerActiveCache; function profile(target, propertyKey, descriptor) { // Helper function to log timing information function logExecutionTime(className, methodName, startTime) { return tslib_1.__awaiter(this, void 0, void 0, function* () { // Only log if profiler is active if (!(yield isProfilerActive())) { return; } const endTime = performance.now(); const duration = endTime - startTime; // Format duration based on magnitude //let formattedTime: string; // if (duration < 1) { // formattedTime = `${(duration * 1000).toFixed(2)}μs`; // } else if (duration < 1000) { // formattedTime = `${duration.toFixed(2)}ms`; // } else { // formattedTime = `${(duration / 1000).toFixed(2)}s`; // } console.log(`DMSPRF: ${className}.${methodName}: ${duration}`); }); } // If used as property decorator, descriptor will be undefined if (!descriptor) { // Handle property decoration (like arrow functions assigned to properties) const descriptor = Object.getOwnPropertyDescriptor(target, propertyKey); const originalValue = descriptor ? descriptor.value : undefined; if (typeof originalValue === 'function') { Object.defineProperty(target, propertyKey, { value: function (...args) { const className = this.constructor.name; const startTime = performance.now(); try { const result = originalValue.apply(this, args); // Handle promises/async functions if (result && typeof result.then === 'function') { return result.then((value) => { logExecutionTime(className, propertyKey, startTime); return value; }).catch((error) => { logExecutionTime(className, propertyKey, startTime); throw error; }); } logExecutionTime(className, propertyKey, startTime); return result; } catch (error) { logExecutionTime(className, propertyKey, startTime); throw error; } }, enumerable: true, configurable: true }); } return; } // Method decoration const originalMethod = descriptor.value; descriptor.value = function (...args) { const className = this.constructor.name; const startTime = performance.now(); try { const result = originalMethod.apply(this, args); // Handle promises/async functions if (result && typeof result.then === 'function') { return result.then((value) => { logExecutionTime(className, propertyKey, startTime); return value; }).catch((error) => { logExecutionTime(className, propertyKey, startTime); throw error; }); } logExecutionTime(className, propertyKey, startTime); return result; } catch (error) { logExecutionTime(className, propertyKey, startTime); throw error; } }; } exports.profile = profile; //# sourceMappingURL=code-profiler.js.map