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
JavaScript
;
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