@gauf/tracker
Version:
Browser tracker with perfect customization
48 lines (39 loc) • 1.61 kB
text/typescript
import Emitter, { InterfaceEmitter, InterfaceEmitterConstructor, Listener } from "@gauf/tracker/emitter";
import MetricBehaviorEmitter from "@gauf/tracker/metrics/behavior";
import MetricNavigatorEmitter from "@gauf/tracker/metrics/navigator";
export type Settings = {
emitters?: InterfaceEmitterConstructor[];
settings?: {
[key: string]: object,
};
};
export default class Collector {
public emitters: InterfaceEmitter[];
constructor(listener: Listener, settings: Settings = {}) {
this.emitters = settings.emitters
? this.createCustomEmitters(listener, settings)
: this.createDefaultEmitters(listener, settings);
}
public activate() {
this.emitters.forEach((emmiter) => emmiter.activate());
}
public deactivate() {
this.emitters.forEach((emmiter) => emmiter.deactivate());
}
private extractSettings(settings: Settings, EmitterClass: any): object | undefined {
return settings.settings
? settings.settings[(EmitterClass as typeof Emitter).key]
: undefined;
}
private createCustomEmitters(listener: Listener, settings: Settings): InterfaceEmitter[] {
return settings.emitters!.map((EmitterClass: InterfaceEmitterConstructor) => (
new EmitterClass(listener, this.extractSettings(settings, EmitterClass))
));
}
private createDefaultEmitters(listener: Listener, settings: Settings): Emitter[] {
return [
new MetricNavigatorEmitter(listener, this.extractSettings(settings, MetricNavigatorEmitter)),
new MetricBehaviorEmitter(listener, this.extractSettings(settings, MetricBehaviorEmitter)),
];
}
}