bifocal/node_modules/@sentry/node/esm/integrations/hapi/index.js

151 lines
4.2 KiB
JavaScript

import { defineIntegration, convertIntegrationFnToClass, SDK_VERSION, getActiveTransaction, captureException, continueTrace, startTransaction, getCurrentScope, spanToTraceHeader, getDynamicSamplingContextFromSpan, setHttpStatus } from '@sentry/core';
import { fill, dynamicSamplingContextToSentryBaggageHeader } from '@sentry/utils';
function isResponseObject(response) {
return response && (response ).statusCode !== undefined;
}
function isErrorEvent(event) {
return event && (event ).error !== undefined;
}
function sendErrorToSentry(errorData) {
captureException(errorData, {
mechanism: {
type: 'hapi',
handled: false,
data: {
function: 'hapiErrorPlugin',
},
},
});
}
const hapiErrorPlugin = {
name: 'SentryHapiErrorPlugin',
version: SDK_VERSION,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
register: async function (serverArg) {
const server = serverArg ;
server.events.on('request', (request, event) => {
// eslint-disable-next-line deprecation/deprecation
const transaction = getActiveTransaction();
if (isErrorEvent(event)) {
sendErrorToSentry(event.error);
}
if (transaction) {
transaction.setStatus('internal_error');
transaction.end();
}
});
},
};
const hapiTracingPlugin = {
name: 'SentryHapiTracingPlugin',
version: SDK_VERSION,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
register: async function (serverArg) {
const server = serverArg ;
server.ext('onPreHandler', (request, h) => {
const transaction = continueTrace(
{
sentryTrace: request.headers['sentry-trace'] || undefined,
baggage: request.headers['baggage'] || undefined,
},
transactionContext => {
// eslint-disable-next-line deprecation/deprecation
return startTransaction({
...transactionContext,
op: 'hapi.request',
name: request.route.path,
description: `${request.route.method} ${request.path}`,
});
},
);
// eslint-disable-next-line deprecation/deprecation
getCurrentScope().setSpan(transaction);
return h.continue;
});
server.ext('onPreResponse', (request, h) => {
// eslint-disable-next-line deprecation/deprecation
const transaction = getActiveTransaction();
if (request.response && isResponseObject(request.response) && transaction) {
const response = request.response ;
response.header('sentry-trace', spanToTraceHeader(transaction));
const dynamicSamplingContext = dynamicSamplingContextToSentryBaggageHeader(
getDynamicSamplingContextFromSpan(transaction),
);
if (dynamicSamplingContext) {
response.header('baggage', dynamicSamplingContext);
}
}
return h.continue;
});
server.ext('onPostHandler', (request, h) => {
// eslint-disable-next-line deprecation/deprecation
const transaction = getActiveTransaction();
if (transaction) {
if (request.response && isResponseObject(request.response)) {
setHttpStatus(transaction, request.response.statusCode);
}
transaction.end();
}
return h.continue;
});
},
};
const INTEGRATION_NAME = 'Hapi';
const _hapiIntegration = ((options = {}) => {
const server = options.server ;
return {
name: INTEGRATION_NAME,
setupOnce() {
if (!server) {
return;
}
fill(server, 'start', (originalStart) => {
return async function () {
await this.register(hapiTracingPlugin);
await this.register(hapiErrorPlugin);
const result = originalStart.apply(this);
return result;
};
});
},
};
}) ;
const hapiIntegration = defineIntegration(_hapiIntegration);
/**
* Hapi Framework Integration.
* @deprecated Use `hapiIntegration()` instead.
*/
// eslint-disable-next-line deprecation/deprecation
const Hapi = convertIntegrationFnToClass(INTEGRATION_NAME, hapiIntegration);
// eslint-disable-next-line deprecation/deprecation
export { Hapi, hapiErrorPlugin, hapiIntegration, hapiTracingPlugin };
//# sourceMappingURL=index.js.map