82 lines
2.2 KiB
JavaScript

'use strict';
const process = require('process');
// Safe load: use getBuiltinModule if available, fallback to require, catch if unavailable
const dc = (() => {
try {
return 'getBuiltinModule' in process
? process.getBuiltinModule('node:diagnostics_channel')
: require('node:diagnostics_channel');
} catch {
return undefined;
}
})();
const hasTracingChannel = typeof dc?.tracingChannel === 'function';
const queryChannel = hasTracingChannel
? dc.tracingChannel('mysql2:query')
: undefined;
const executeChannel = hasTracingChannel
? dc.tracingChannel('mysql2:execute')
: undefined;
const connectChannel = hasTracingChannel
? dc.tracingChannel('mysql2:connect')
: undefined;
const poolConnectChannel = hasTracingChannel
? dc.tracingChannel('mysql2:pool:connect')
: undefined;
function getServerContext(config) {
if (config.socketPath) {
return { serverAddress: config.socketPath, serverPort: undefined };
}
return {
serverAddress: config.host || 'localhost',
serverPort: config.port || 3306,
};
}
// Node 20+: TracingChannel has an aggregated hasSubscribers getter.
// Node 18.x: that getter is missing (undefined), fall back to start sub-channel.
function shouldTrace(channel) {
if (channel === undefined || channel === null) {
return false;
}
return channel.hasSubscribers ?? channel.start?.hasSubscribers ?? false;
}
// Generic traceCallback wrapper — calls fn synchronously, wraps the callback
// at args[position] to emit asyncStart/asyncEnd/error. No promises involved.
function traceCallback(channel, fn, position, context, thisArg, ...args) {
if (shouldTrace(channel)) {
return channel.traceCallback(fn, position, context(), thisArg, ...args);
}
return fn.apply(thisArg, args);
}
// tracePromise for operations that are inherently async (connection handshake)
function tracePromise(channel, fn, contextFactory) {
if (shouldTrace(channel)) {
return channel.tracePromise(fn, contextFactory());
}
return fn();
}
module.exports = {
dc,
hasTracingChannel,
shouldTrace,
queryChannel,
executeChannel,
connectChannel,
poolConnectChannel,
getServerContext,
traceCallback,
tracePromise,
};