UNPKG

@sentry/browser

Version:
73 lines (66 loc) 2.47 kB
import { defineIntegration, _INTERNAL_copyFlagsFromScopeToEvent, fill, _INTERNAL_insertFlagToScope, _INTERNAL_addFeatureFlagToActiveSpan, logger } from '@sentry/core'; import { DEBUG_BUILD } from '../../../debug-build.js'; /** * Sentry integration for capturing feature flag evaluations from the Unleash SDK. * * See the [feature flag documentation](https://develop.sentry.dev/sdk/expected-features/#feature-flags) for more information. * * @example * ``` * import { UnleashClient } from 'unleash-proxy-client'; * import * as Sentry from '@sentry/browser'; * * Sentry.init({ * dsn: '___PUBLIC_DSN___', * integrations: [Sentry.unleashIntegration({featureFlagClientClass: UnleashClient})], * }); * * const unleash = new UnleashClient(...); * unleash.start(); * * unleash.isEnabled('my-feature'); * Sentry.captureException(new Error('something went wrong')); * ``` */ const unleashIntegration = defineIntegration( ({ featureFlagClientClass: unleashClientClass }) => { return { name: 'Unleash', setupOnce() { const unleashClientPrototype = unleashClientClass.prototype ; fill(unleashClientPrototype, 'isEnabled', _wrappedIsEnabled); }, processEvent(event, _hint, _client) { return _INTERNAL_copyFlagsFromScopeToEvent(event); }, }; }, ) ; /** * Wraps the UnleashClient.isEnabled method to capture feature flag evaluations. Its only side effect is writing to Sentry scope. * * This wrapper is safe for all isEnabled signatures. If the signature does not match (this: UnleashClient, toggleName: string, ...args: unknown[]) => boolean, * we log an error and return the original result. * * @param original - The original method. * @returns Wrapped method. Results should match the original. */ function _wrappedIsEnabled( original, ) { return function ( ...args) { const toggleName = args[0]; const result = original.apply(this, args); if (typeof toggleName === 'string' && typeof result === 'boolean') { _INTERNAL_insertFlagToScope(toggleName, result); _INTERNAL_addFeatureFlagToActiveSpan(toggleName, result); } else if (DEBUG_BUILD) { logger.error( `[Feature Flags] UnleashClient.isEnabled does not match expected signature. arg0: ${toggleName} (${typeof toggleName}), result: ${result} (${typeof result})`, ); } return result; }; } export { unleashIntegration }; //# sourceMappingURL=integration.js.map