@trifrost/core
Version:
Blazingly fast, runtime-agnostic server framework for modern edge and node environments
52 lines (51 loc) • 2.26 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Sym_TriFrostSpan = void 0;
exports.span = span;
exports.spanFn = spanFn;
/**
* Symbol attached to methods to prevent duplicate span wraps
*/
exports.Sym_TriFrostSpan = Symbol('trifrost.logger.is_span');
function span(name) {
return function (method, context) {
/* Prevent re-decoration */
if (Reflect.get(method, exports.Sym_TriFrostSpan))
return method;
/* Define span name */
const span_name = typeof name === 'string' && name.length ? name : String(context.name);
const wrapped = function (...fn_args) {
/* Get our logger from the context (as first arg) OR from a potential logger getter on this */
const logger = Array.isArray(fn_args) && fn_args.length
? (fn_args[0]?.logger ?? this?.logger)
: (this?.logger ?? this?.ctx?.logger);
if (typeof logger?.span !== 'function')
return method.call(this, ...fn_args);
return logger.span(span_name, () => method.call(this, ...fn_args));
};
/* Set to prevent re-decoration */
Reflect.set(wrapped, exports.Sym_TriFrostSpan, true);
return wrapped;
};
}
function spanFn(...args) {
const [name_or_fn, maybe_fn] = args;
/* Define function */
const fn = typeof name_or_fn === 'function' ? name_or_fn : maybe_fn;
/* Prevent re-decoration */
if (Reflect.get(fn, exports.Sym_TriFrostSpan))
return fn;
/* Define name */
// eslint-disable-next-line prettier/prettier
const name = typeof name_or_fn === 'string' && name_or_fn.length ? name_or_fn : typeof fn.name === 'string' && fn.name.length ? fn.name : 'anonymous';
/* Span function */
const fn_span = function (...fn_args) {
const logger = Array.isArray(fn_args) && fn_args.length ? (fn_args[0]?.logger ?? this?.logger) : (this?.logger ?? this?.ctx?.logger);
if (typeof logger?.span !== 'function')
return fn.apply(this, fn_args);
return logger.span(name, () => fn.apply(this, fn_args));
};
/* Set to prevent re-decoration */
Reflect.set(fn_span, exports.Sym_TriFrostSpan, true);
return fn_span;
}