react-native-onyx
Version:
State management for React Native
48 lines (47 loc) • 1.84 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const PerformanceProxy_1 = __importDefault(require("./dependencies/PerformanceProxy"));
/**
* Capture a measurement between the start mark and now
*/
function measureMarkToNow(startMark, detail) {
PerformanceProxy_1.default.measure(`${startMark.name} [${startMark.detail.args.toString()}]`, {
start: startMark.startTime,
end: PerformanceProxy_1.default.now(),
detail: Object.assign(Object.assign({}, startMark.detail), detail),
});
}
function isPromiseLike(value) {
return value != null && typeof value === 'object' && 'then' in value;
}
/**
* Wraps a function with metrics capturing logic
*/
function decorateWithMetrics(func, alias = func.name) {
function decorated(...args) {
const mark = PerformanceProxy_1.default.mark(alias, { detail: { args, alias } });
const originalReturnValue = func(...args);
if (isPromiseLike(originalReturnValue)) {
/*
* The handlers added here are not affecting the original promise
* They create a separate chain that's not exposed (returned) to the original caller
*/
originalReturnValue
.then((result) => {
measureMarkToNow(mark, { result });
})
.catch((error) => {
measureMarkToNow(mark, { error });
});
return originalReturnValue;
}
measureMarkToNow(mark, { result: originalReturnValue });
return originalReturnValue;
}
decorated.name = `${alias}_DECORATED`;
return decorated;
}
exports.default = decorateWithMetrics;
;