@amplitude/analytics-core
Version:
120 lines • 4.46 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.debugWrapper = exports.getClientStates = exports.getValueByStringPath = exports.getClientLogConfig = exports.getStacktrace = void 0;
var tslib_1 = require("tslib");
var loglevel_1 = require("../types/loglevel");
var getStacktrace = function (ignoreDepth) {
if (ignoreDepth === void 0) { ignoreDepth = 0; }
var trace = new Error().stack || '';
return trace
.split('\n')
.slice(2 + ignoreDepth)
.map(function (text) { return text.trim(); });
};
exports.getStacktrace = getStacktrace;
// This hook makes sure we always get the latest logger and logLevel.
var getClientLogConfig = function (client) { return function () {
var _a = tslib_1.__assign({}, client.config), logger = _a.loggerProvider, logLevel = _a.logLevel;
return {
logger: logger,
logLevel: logLevel,
};
}; };
exports.getClientLogConfig = getClientLogConfig;
// This is a convenient function to get the attribute from object with string path, similar to lodash '#get'.
var getValueByStringPath = function (obj, path) {
var e_1, _a;
path = path.replace(/\[(\w+)\]/g, '.$1'); // convert indexes to properties
path = path.replace(/^\./, ''); // strip a leading dot
try {
for (var _b = tslib_1.__values(path.split('.')), _c = _b.next(); !_c.done; _c = _b.next()) {
var attr = _c.value;
if (attr in obj) {
obj = obj[attr];
}
else {
return;
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_1) throw e_1.error; }
}
return obj;
};
exports.getValueByStringPath = getValueByStringPath;
var getClientStates = function (client, paths) { return function () {
var e_2, _a;
var res = {};
try {
for (var paths_1 = tslib_1.__values(paths), paths_1_1 = paths_1.next(); !paths_1_1.done; paths_1_1 = paths_1.next()) {
var path = paths_1_1.value;
res[path] = (0, exports.getValueByStringPath)(client, path);
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (paths_1_1 && !paths_1_1.done && (_a = paths_1.return)) _a.call(paths_1);
}
finally { if (e_2) throw e_2.error; }
}
return res;
}; };
exports.getClientStates = getClientStates;
var debugWrapper = function (fn, fnName, getLogConfig, getStates, fnContext) {
if (fnContext === void 0) { fnContext = null; }
return function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var _a = getLogConfig(), logger = _a.logger, logLevel = _a.logLevel;
// return early if possible to reduce overhead
if ((logLevel && logLevel < loglevel_1.LogLevel.Debug) || !logLevel || !logger) {
return fn.apply(fnContext, args);
}
var debugContext = {
type: 'invoke public method',
name: fnName,
args: args,
stacktrace: (0, exports.getStacktrace)(1),
time: {
start: new Date().toISOString(),
},
states: {},
};
if (getStates && debugContext.states) {
debugContext.states.before = getStates();
}
var result = fn.apply(fnContext, args);
if (result && result.promise) {
// if result is a promise, add the callback
result.promise.then(function () {
if (getStates && debugContext.states) {
debugContext.states.after = getStates();
}
if (debugContext.time) {
debugContext.time.end = new Date().toISOString();
}
logger.debug(JSON.stringify(debugContext, null, 2));
});
}
else {
if (getStates && debugContext.states) {
debugContext.states.after = getStates();
}
if (debugContext.time) {
debugContext.time.end = new Date().toISOString();
}
logger.debug(JSON.stringify(debugContext, null, 2));
}
return result;
};
};
exports.debugWrapper = debugWrapper;
//# sourceMappingURL=debug.js.map
;