| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 | /**
 * Abstract implementation of analytics handler
 */
export default class AbstractHandler {
    /**
     * Creates new instance.
     *
     * @param {Object} options - Optional parameters.
     */
    constructor(options = {}) {
        this._enabled = false;
        this._whiteListedEvents = options.whiteListedEvents;
        // FIXME:
        // Keeping the list with the very noisy events so that we don't flood with events whoever hasn't configured
        // white/black lists yet. We need to solve this issue properly by either making these events not so noisy or
        // by removing them completely from the code.
        this._blackListedEvents = [
            ...(options.blackListedEvents || []), // eslint-disable-line no-extra-parens
            'e2e_rtt', 'rtp.stats', 'rtt.by.region', 'available.device', 'stream.switch.delay', 'ice.state.changed',
            'ice.duration'
        ];
    }
    /**
     * Extracts a name for the event from the event properties.
     *
     * @param {Object} event - The analytics event.
     * @returns {string} - The extracted name.
     */
    _extractName(event) {
        // Page events have a single 'name' field.
        if (event.type === 'page') {
            return event.name;
        }
        const {
            action,
            actionSubject,
            source
        } = event;
        // All events have action, actionSubject, and source fields. All
        // three fields are required, and often jitsi-meet and
        // lib-jitsi-meet use the same value when separate values are not
        // necessary (i.e. event.action == event.actionSubject).
        // Here we concatenate these three fields, but avoid adding the same
        // value twice, because it would only make the event's name harder
        // to read.
        let name = action;
        if (actionSubject && actionSubject !== action) {
            name = `${actionSubject}.${action}`;
        }
        if (source && source !== action) {
            name = `${source}.${name}`;
        }
        return name;
    }
    /**
     * Checks if an event should be ignored or not.
     *
     * @param {Object} event - The event.
     * @returns {boolean}
     */
    _shouldIgnore(event) {
        if (!event || !this._enabled) {
            return true;
        }
        const name = this._extractName(event);
        if (Array.isArray(this._whiteListedEvents)) {
            return this._whiteListedEvents.indexOf(name) === -1;
        }
        if (Array.isArray(this._blackListedEvents)) {
            return this._blackListedEvents.indexOf(name) !== -1;
        }
        return false;
    }
}
 |