All files / src/core PluginManager.ts

100% Statements 87/87
100% Branches 26/26
100% Functions 8/8
100% Lines 87/87

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 881x 1x 1x 1x 1x 1x 1x 58x 58x 1x 1x 32x 1x 1x 31x 31x 31x 32x 2x 2x 32x 1x 1x 5x 5x 4x 2x 2x 2x 1x 1x 2x 4x 4x 5x 1x 1x 2x 2x 1x 1x 8x 8x 1x 1x 5x 5x 8x 7x 7x 7x 1x 1x 5x 7x 1x 1x 7x 8x 4x 5x 1x 1x 3x 5x 4x 4x 4x 1x 1x 4x 5x 3x 1x 1x 37x 8x 4x 4x 4x 1x 1x 4x 8x 37x 37x 1x  
import type { LightPlugin, LightClient, SentryEvent } from '../types';
 
export class PluginManager {
  private plugins: Map<string, LightPlugin> = new Map();
  private client: LightClient;
 
  constructor(client: LightClient) {
    this.client = client;
  }
 
  add(plugin: LightPlugin): void {
    if (this.plugins.has(plugin.name)) {
      return;
    }
    this.plugins.set(plugin.name, plugin);
    try {
      plugin.setup(this.client);
    } catch (e) {
      console.error(`[LightSDK] Plugin "${plugin.name}" setup error:`, e);
    }
  }
 
  remove(name: string): void {
    const plugin = this.plugins.get(name);
    if (plugin) {
      if (plugin.destroy) {
        try {
          plugin.destroy();
        } catch (e) {
          console.error(`[LightSDK] Plugin "${name}" destroy error:`, e);
        }
      }
      this.plugins.delete(name);
    }
  }
 
  get(name: string): LightPlugin | undefined {
    return this.plugins.get(name);
  }
 
  has(name: string): boolean {
    return this.plugins.has(name);
  }
 
  applyBeforeReport(event: SentryEvent): SentryEvent | null {
    let result: SentryEvent | null = event;
    for (const plugin of this.plugins.values()) {
      if (plugin.beforeReport) {
        try {
          const modified = plugin.beforeReport(result);
          if (modified === null) {
            return null;
          }
          result = modified;
        } catch (e) {
          console.error(`[LightSDK] Plugin "${plugin.name}" beforeReport error:`, e);
        }
      }
    }
    return result;
  }
 
  applyAfterReport(event: SentryEvent): void {
    for (const plugin of this.plugins.values()) {
      if (plugin.afterReport) {
        try {
          plugin.afterReport(event);
        } catch (e) {
          console.error(`[LightSDK] Plugin "${plugin.name}" afterReport error:`, e);
        }
      }
    }
  }
 
  destroy(): void {
    for (const plugin of this.plugins.values()) {
      if (plugin.destroy) {
        try {
          plugin.destroy();
        } catch (e) {
          console.error(`[LightSDK] Plugin "${plugin.name}" destroy error:`, e);
        }
      }
    }
    this.plugins.clear();
  }
}