import { logger } from '@sentry/utils'; import { wrapTransactionWithProfiling } from './hubextensions.js'; import { PROFILE_MAP, findProfiledTransactionsFromEnvelope, createProfilingEvent, addProfilesToEnvelope } from './utils.js'; /** * Browser profiling integration. Stores any event that has contexts["profile"]["profile_id"] * This exists because we do not want to await async profiler.stop calls as transaction.finish is called * in a synchronous context. Instead, we handle sending the profile async from the promise callback and * rely on being able to pull the event from the cache when we need to construct the envelope. This makes the * integration less reliable as we might be dropping profiles when the cache is full. * * @experimental */ class BrowserProfilingIntegration {constructor() { BrowserProfilingIntegration.prototype.__init.call(this);BrowserProfilingIntegration.prototype.__init2.call(this); } __init() {this.name = 'BrowserProfilingIntegration';} __init2() {this.getCurrentHub = undefined;} /** * @inheritDoc */ setupOnce(addGlobalEventProcessor, getCurrentHub) { this.getCurrentHub = getCurrentHub; const client = this.getCurrentHub().getClient() ; if (client && typeof client.on === 'function') { client.on('startTransaction', (transaction) => { wrapTransactionWithProfiling(transaction); }); client.on('beforeEnvelope', (envelope) => { // if not profiles are in queue, there is nothing to add to the envelope. if (!PROFILE_MAP['size']) { return; } const profiledTransactionEvents = findProfiledTransactionsFromEnvelope(envelope); if (!profiledTransactionEvents.length) { return; } const profilesToAddToEnvelope = []; for (const profiledTransaction of profiledTransactionEvents) { const context = profiledTransaction && profiledTransaction.contexts; const profile_id = context && context['profile'] && (context['profile']['profile_id'] ); if (!profile_id) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.log('[Profiling] cannot find profile for a transaction without a profile context'); continue; } // Remove the profile from the transaction context before sending, relay will take care of the rest. if (context && context['profile']) { delete context.profile; } const profile = PROFILE_MAP.get(profile_id); if (!profile) { (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) && logger.log(`[Profiling] Could not retrieve profile for transaction: ${profile_id}`); continue; } PROFILE_MAP.delete(profile_id); const profileEvent = createProfilingEvent(profile_id, profile, profiledTransaction ); if (profileEvent) { profilesToAddToEnvelope.push(profileEvent); } } addProfilesToEnvelope(envelope, profilesToAddToEnvelope); }); } else { logger.warn('[Profiling] Client does not support hooks, profiling will be disabled'); } } } export { BrowserProfilingIntegration }; //# sourceMappingURL=integration.js.map