UNPKG

@bugsnag/core-performance

Version:
75 lines (72 loc) 2.5 kB
import { Priority } from './prioritized-set.js'; class PluginContext { constructor(configuration, clock) { this.configuration = configuration; this.clock = clock; this.onSpanStartCallbacks = []; this.onSpanEndCallbacks = []; this.spanControlProviders = []; } addOnSpanStartCallback(callback, priority = Priority.NORMAL) { this.onSpanStartCallbacks.push({ item: callback, priority }); } addOnSpanEndCallback(callback, priority = Priority.NORMAL) { this.onSpanEndCallbacks.push({ item: callback, priority }); } addSpanControlProvider(provider, priority = Priority.NORMAL) { this.spanControlProviders.push({ item: provider, priority }); } mergeFrom(context) { this.onSpanStartCallbacks.push(...context.onSpanStartCallbacks); this.onSpanEndCallbacks.push(...context.onSpanEndCallbacks); this.spanControlProviders.push(...context.spanControlProviders); } } class PluginManager { constructor() { this.plugins = []; this.installedPlugins = new Set(); } addPlugins(plugins) { this.plugins.push(...plugins); } installPlugins(configuration, clock) { this.logger = configuration.logger; const mergedContext = new PluginContext(configuration, clock); for (const plugin of this.plugins) { if (this.installedPlugins.has(plugin)) { continue; } try { const context = new PluginContext(configuration, clock); plugin.install(context); mergedContext.mergeFrom(context); this.installedPlugins.add(plugin); } catch (err) { if (this.logger) this.logger.error(`Plugin ${plugin.constructor.name} failed to install: ${err}`); } } return mergedContext; } startPlugins() { for (const plugin of this.installedPlugins) { try { plugin.start(); } catch (err) { if (this.logger) this.logger.error(`Plugin ${plugin.constructor.name} failed to start: ${err}`); } } } getPlugin(Constructor) { for (const plugin of this.installedPlugins) { if (plugin instanceof Constructor) { return plugin; } } } } export { PluginContext, PluginManager };