| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 | /* global JitsiMeetJS, config, APP */
/**
 * Load the integration of a third-party analytics API such as Google
 * Analytics. Since we cannot guarantee the quality of the third-party service
 * (e.g. their server may take noticeably long time to respond), it is in our
 * best interest (in the sense that the integration of the analytics API is
 * important to us but not enough to allow it to prevent people from joining
 * a conference) to download the API asynchronously. Additionally, Google
 * Analytics will download its implementation asynchronously anyway so it makes
 * sense to append the loading on our side rather than prepend it.
 * @param {string} url the url to be loaded
 * @returns {Promise} resolved with no arguments when the script is loaded and
 * rejected with the error from JitsiMeetJS.ScriptUtil.loadScript method
 */
function loadScript(url) {
    return new Promise((resolve, reject) =>
        JitsiMeetJS.util.ScriptUtil.loadScript(
            url,
            /* async */ true,
            /* prepend */ false,
            /* relativeURL */ false,
            /* loadCallback */ () => resolve(),
            /* errorCallback */ error => reject(error)));
}
/**
 * Handles the initialization of analytics.
 */
class Analytics {
    constructor() {
        this._scriptURLs = Array.isArray(config.analyticsScriptUrls)
            ? config.analyticsScriptUrls : [];
        this._enabled = !!this._scriptURLs.length
            && !config.disableThirdPartyRequests;
        window.analyticsHandlers = [];
        const machineId = JitsiMeetJS.getMachineId();
        this._handlerConstructorOptions = {
            product: "lib-jitsi-meet",
            version: JitsiMeetJS.version,
            session: machineId,
            user:  "uid-" + machineId
        };
    }
    /**
     * Returns whether analytics is enabled or not.
     * @returns {boolean} whether analytics is enabled or not.
     */
    isEnabled() {
        return this._enabled;
    }
    /**
     * Tries to load the scripts for the analytics handlers.
     * @returns {Promise} resolves with the handlers that have been
     * successfully loaded and rejects if there are no handlers loaded or the
     * analytics is disabled.
     */
    _loadHandlers() {
        if(!this.isEnabled()) {
            return Promise.reject(new Error("Analytics is disabled!"));
        }
        let handlersPromises = [];
        this._scriptURLs.forEach(url =>
            handlersPromises.push(
                loadScript(url).then(
                    () => {
                        return {type: "success"};
                    },
                    error => {
                        return {type: "error", error, url};
                    }))
        );
        return new Promise((resolve, reject) =>
        {
            Promise.all(handlersPromises).then(values => {
                values.forEach(el => {
                    if(el.type === "error") {
                        console.log("Failed to load " + el.url);
                        console.error(el.error);
                    }
                });
                if(window.analyticsHandlers.length === 0) {
                    reject(new Error("No analytics handlers available"));
                } else {
                    let handlerInstances = [];
                    window.analyticsHandlers.forEach(
                        Handler => handlerInstances.push(
                            new Handler(this._handlerConstructorOptions)));
                    resolve(handlerInstances);
                }
            });
        });
    }
    /**
     * Loads the analytics scripts and inits JitsiMeetJS.analytics by setting
     * permanent properties and setting the handlers from the loaded scripts.
     * NOTE: Has to be used after JitsiMeetJS.init. Otherwise analytics will be
     * null.
     */
    init() {
        const { analytics } = JitsiMeetJS;
        if (!this.isEnabled() || !analytics)
            return;
        this._loadHandlers().then(
            handlers => {
                const permanentProperties = {
                    roomName: APP.conference.roomName,
                    userAgent: navigator.userAgent
                };
                const { group, server } = APP.store.getState()['features/jwt'];
                if (server) {
                    permanentProperties.server = server;
                }
                if (group) {
                    permanentProperties.group = group;
                }
                 // optionally include local deployment information based on
                 // the contents of window.config.deploymentInfo
                if (config.deploymentInfo) {
                    for (let key in config.deploymentInfo) {
                        if (config.deploymentInfo.hasOwnProperty(key)) {
                            permanentProperties[key]
                                = config.deploymentInfo[key];
                        }
                    }
                }
                analytics.addPermanentProperties(permanentProperties);
                analytics.setAnalyticsHandlers(handlers);
            },
            error => analytics.dispose() && console.error(error));
    }
}
export default new Analytics();
 |