123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200 |
- Object.defineProperty(exports, '__esModule', { value: true });
- const utils = require('@sentry/utils');
- const debugBuild = require('./debug-build.js');
- const eventProcessors = require('./eventProcessors.js');
- const exports$1 = require('./exports.js');
- const hub = require('./hub.js');
- const installedIntegrations = [];
- /** Map of integrations assigned to a client */
- /**
- * Remove duplicates from the given array, preferring the last instance of any duplicate. Not guaranteed to
- * preseve the order of integrations in the array.
- *
- * @private
- */
- function filterDuplicates(integrations) {
- const integrationsByName = {};
- integrations.forEach(currentInstance => {
- const { name } = currentInstance;
- const existingInstance = integrationsByName[name];
- // We want integrations later in the array to overwrite earlier ones of the same type, except that we never want a
- // default instance to overwrite an existing user instance
- if (existingInstance && !existingInstance.isDefaultInstance && currentInstance.isDefaultInstance) {
- return;
- }
- integrationsByName[name] = currentInstance;
- });
- return Object.keys(integrationsByName).map(k => integrationsByName[k]);
- }
- /** Gets integrations to install */
- function getIntegrationsToSetup(options) {
- const defaultIntegrations = options.defaultIntegrations || [];
- const userIntegrations = options.integrations;
- // We flag default instances, so that later we can tell them apart from any user-created instances of the same class
- defaultIntegrations.forEach(integration => {
- integration.isDefaultInstance = true;
- });
- let integrations;
- if (Array.isArray(userIntegrations)) {
- integrations = [...defaultIntegrations, ...userIntegrations];
- } else if (typeof userIntegrations === 'function') {
- integrations = utils.arrayify(userIntegrations(defaultIntegrations));
- } else {
- integrations = defaultIntegrations;
- }
- const finalIntegrations = filterDuplicates(integrations);
- // The `Debug` integration prints copies of the `event` and `hint` which will be passed to `beforeSend` or
- // `beforeSendTransaction`. It therefore has to run after all other integrations, so that the changes of all event
- // processors will be reflected in the printed values. For lack of a more elegant way to guarantee that, we therefore
- // locate it and, assuming it exists, pop it out of its current spot and shove it onto the end of the array.
- const debugIndex = findIndex(finalIntegrations, integration => integration.name === 'Debug');
- if (debugIndex !== -1) {
- const [debugInstance] = finalIntegrations.splice(debugIndex, 1);
- finalIntegrations.push(debugInstance);
- }
- return finalIntegrations;
- }
- /**
- * Given a list of integration instances this installs them all. When `withDefaults` is set to `true` then all default
- * integrations are added unless they were already provided before.
- * @param integrations array of integration instances
- * @param withDefault should enable default integrations
- */
- function setupIntegrations(client, integrations) {
- const integrationIndex = {};
- integrations.forEach(integration => {
- // guard against empty provided integrations
- if (integration) {
- setupIntegration(client, integration, integrationIndex);
- }
- });
- return integrationIndex;
- }
- /**
- * Execute the `afterAllSetup` hooks of the given integrations.
- */
- function afterSetupIntegrations(client, integrations) {
- for (const integration of integrations) {
- // guard against empty provided integrations
- if (integration && integration.afterAllSetup) {
- integration.afterAllSetup(client);
- }
- }
- }
- /** Setup a single integration. */
- function setupIntegration(client, integration, integrationIndex) {
- if (integrationIndex[integration.name]) {
- debugBuild.DEBUG_BUILD && utils.logger.log(`Integration skipped because it was already installed: ${integration.name}`);
- return;
- }
- integrationIndex[integration.name] = integration;
- // `setupOnce` is only called the first time
- if (installedIntegrations.indexOf(integration.name) === -1) {
- // eslint-disable-next-line deprecation/deprecation
- integration.setupOnce(eventProcessors.addGlobalEventProcessor, hub.getCurrentHub);
- installedIntegrations.push(integration.name);
- }
- // `setup` is run for each client
- if (integration.setup && typeof integration.setup === 'function') {
- integration.setup(client);
- }
- if (client.on && typeof integration.preprocessEvent === 'function') {
- const callback = integration.preprocessEvent.bind(integration) ;
- client.on('preprocessEvent', (event, hint) => callback(event, hint, client));
- }
- if (client.addEventProcessor && typeof integration.processEvent === 'function') {
- const callback = integration.processEvent.bind(integration) ;
- const processor = Object.assign((event, hint) => callback(event, hint, client), {
- id: integration.name,
- });
- client.addEventProcessor(processor);
- }
- debugBuild.DEBUG_BUILD && utils.logger.log(`Integration installed: ${integration.name}`);
- }
- /** Add an integration to the current hub's client. */
- function addIntegration(integration) {
- const client = exports$1.getClient();
- if (!client || !client.addIntegration) {
- debugBuild.DEBUG_BUILD && utils.logger.warn(`Cannot add integration "${integration.name}" because no SDK Client is available.`);
- return;
- }
- client.addIntegration(integration);
- }
- // Polyfill for Array.findIndex(), which is not supported in ES5
- function findIndex(arr, callback) {
- for (let i = 0; i < arr.length; i++) {
- if (callback(arr[i]) === true) {
- return i;
- }
- }
- return -1;
- }
- /**
- * Convert a new integration function to the legacy class syntax.
- * In v8, we can remove this and instead export the integration functions directly.
- *
- * @deprecated This will be removed in v8!
- */
- function convertIntegrationFnToClass(
- name,
- fn,
- ) {
- return Object.assign(
- function ConvertedIntegration(...args) {
- return fn(...args);
- },
- { id: name },
- ) ;
- }
- /**
- * Define an integration function that can be used to create an integration instance.
- * Note that this by design hides the implementation details of the integration, as they are considered internal.
- */
- function defineIntegration(fn) {
- return fn;
- }
- exports.addIntegration = addIntegration;
- exports.afterSetupIntegrations = afterSetupIntegrations;
- exports.convertIntegrationFnToClass = convertIntegrationFnToClass;
- exports.defineIntegration = defineIntegration;
- exports.getIntegrationsToSetup = getIntegrationsToSetup;
- exports.installedIntegrations = installedIntegrations;
- exports.setupIntegration = setupIntegration;
- exports.setupIntegrations = setupIntegrations;
- //# sourceMappingURL=integration.js.map
|