@bugsnag/core-performance
Version:
Core performance client
75 lines (72 loc) • 2.5 kB
JavaScript
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 };