UNPKG

new-analytics-test

Version:

The analytics package contains all the utility functions used for tracking user events and sending them to the respective platform such as Rudderstack.

301 lines (300 loc) 22.6 kB
"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (g && (g = 0, op[0] && (_ = 0)), _) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Analytics = exports.createAnalyticsInstance = void 0; var growthbook_1 = require("./growthbook"); var rudderstack_1 = require("./rudderstack"); var js_cookie_1 = __importDefault(require("js-cookie")); var utils_1 = require("@deriv-com/utils"); function createAnalyticsInstance(options) { var _this = this; var _growthbook, _rudderstack, core_data = {}, tracking_config = {}, event_cache = []; var getClientCountry = function () { return __awaiter(_this, void 0, void 0, function () { var countryFromCloudflare, countryFromCookie, websiteStatus, countryFromWebsiteStatus; var _a; return __generator(this, function (_b) { switch (_b.label) { case 0: return [4 /*yield*/, utils_1.CountryUtils.getCountry()]; case 1: countryFromCloudflare = _b.sent(); countryFromCookie = js_cookie_1.default.get('clients_country'); websiteStatus = js_cookie_1.default.get('website_status'); countryFromWebsiteStatus = ''; if (websiteStatus) { try { countryFromWebsiteStatus = ((_a = JSON.parse(websiteStatus)) === null || _a === void 0 ? void 0 : _a.clients_country) || ''; } catch (e) { console.error('Failed to parse cookie: ', e); } } return [2 /*return*/, countryFromCookie || countryFromWebsiteStatus || countryFromCloudflare]; } }); }); }; var initialise = function (_a) { var growthbookKey = _a.growthbookKey, growthbookDecryptionKey = _a.growthbookDecryptionKey, rudderstackKey = _a.rudderstackKey, growthbookOptions = _a.growthbookOptions, _b = _a.disableRudderstackAMD, disableRudderstackAMD = _b === void 0 ? false : _b; return __awaiter(_this, void 0, void 0, function () { var country, _c, interval_1, error_1; var _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z; var _0, _1; return __generator(this, function (_2) { switch (_2.label) { case 0: _2.trys.push([0, 3, , 4]); _c = ((_d = growthbookOptions === null || growthbookOptions === void 0 ? void 0 : growthbookOptions.attributes) === null || _d === void 0 ? void 0 : _d.country); if (_c) return [3 /*break*/, 2]; return [4 /*yield*/, getClientCountry()]; case 1: _c = (_2.sent()); _2.label = 2; case 2: country = _c; _rudderstack = rudderstack_1.RudderStack.getRudderStackInstance(rudderstackKey, disableRudderstackAMD); if ((growthbookOptions === null || growthbookOptions === void 0 ? void 0 : growthbookOptions.attributes) && Object.keys(growthbookOptions.attributes).length > 0) core_data = __assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign({}, core_data), { country: country }), (((_e = growthbookOptions === null || growthbookOptions === void 0 ? void 0 : growthbookOptions.attributes) === null || _e === void 0 ? void 0 : _e.user_language) && { user_language: growthbookOptions === null || growthbookOptions === void 0 ? void 0 : growthbookOptions.attributes.user_language, })), (((_f = growthbookOptions === null || growthbookOptions === void 0 ? void 0 : growthbookOptions.attributes) === null || _f === void 0 ? void 0 : _f.account_type) && { account_type: growthbookOptions === null || growthbookOptions === void 0 ? void 0 : growthbookOptions.attributes.account_type, })), (((_g = growthbookOptions === null || growthbookOptions === void 0 ? void 0 : growthbookOptions.attributes) === null || _g === void 0 ? void 0 : _g.app_id) && { app_id: growthbookOptions === null || growthbookOptions === void 0 ? void 0 : growthbookOptions.attributes.app_id })), (((_h = growthbookOptions === null || growthbookOptions === void 0 ? void 0 : growthbookOptions.attributes) === null || _h === void 0 ? void 0 : _h.residence_country) && { residence_country: (_j = growthbookOptions === null || growthbookOptions === void 0 ? void 0 : growthbookOptions.attributes) === null || _j === void 0 ? void 0 : _j.residence_country, })), (((_k = growthbookOptions === null || growthbookOptions === void 0 ? void 0 : growthbookOptions.attributes) === null || _k === void 0 ? void 0 : _k.device_type) && { device_type: growthbookOptions === null || growthbookOptions === void 0 ? void 0 : growthbookOptions.attributes.device_type, })), (((_l = growthbookOptions === null || growthbookOptions === void 0 ? void 0 : growthbookOptions.attributes) === null || _l === void 0 ? void 0 : _l.url) && { url: growthbookOptions === null || growthbookOptions === void 0 ? void 0 : growthbookOptions.attributes.url })), ((growthbookOptions === null || growthbookOptions === void 0 ? void 0 : growthbookOptions.attributes) && { loggedIn: !!((_m = growthbookOptions === null || growthbookOptions === void 0 ? void 0 : growthbookOptions.attributes) === null || _m === void 0 ? void 0 : _m.loggedIn), })), (((_o = growthbookOptions === null || growthbookOptions === void 0 ? void 0 : growthbookOptions.attributes) === null || _o === void 0 ? void 0 : _o.email_hash) && { email_hash: growthbookOptions === null || growthbookOptions === void 0 ? void 0 : growthbookOptions.attributes.email_hash, })), (((_p = growthbookOptions === null || growthbookOptions === void 0 ? void 0 : growthbookOptions.attributes) === null || _p === void 0 ? void 0 : _p.network_type) && { network_type: growthbookOptions === null || growthbookOptions === void 0 ? void 0 : growthbookOptions.attributes.network_type, })), (((_q = growthbookOptions === null || growthbookOptions === void 0 ? void 0 : growthbookOptions.attributes) === null || _q === void 0 ? void 0 : _q.network_rtt) && { network_rtt: growthbookOptions === null || growthbookOptions === void 0 ? void 0 : growthbookOptions.attributes.network_rtt, })), (((_r = growthbookOptions === null || growthbookOptions === void 0 ? void 0 : growthbookOptions.attributes) === null || _r === void 0 ? void 0 : _r.network_downlink) && { network_downlink: growthbookOptions === null || growthbookOptions === void 0 ? void 0 : growthbookOptions.attributes.network_downlink, })), (((_s = growthbookOptions === null || growthbookOptions === void 0 ? void 0 : growthbookOptions.attributes) === null || _s === void 0 ? void 0 : _s.user_id) && !isUUID((_t = growthbookOptions === null || growthbookOptions === void 0 ? void 0 : growthbookOptions.attributes) === null || _t === void 0 ? void 0 : _t.user_id) && { user_id: (_u = growthbookOptions === null || growthbookOptions === void 0 ? void 0 : growthbookOptions.attributes) === null || _u === void 0 ? void 0 : _u.user_id, })), ((growthbookOptions === null || growthbookOptions === void 0 ? void 0 : growthbookOptions.attributes) && { anonymous_id: _rudderstack.getAnonymousId(), })), (((_v = growthbookOptions === null || growthbookOptions === void 0 ? void 0 : growthbookOptions.attributes) === null || _v === void 0 ? void 0 : _v.account_currency) && { account_currency: growthbookOptions === null || growthbookOptions === void 0 ? void 0 : growthbookOptions.attributes.account_currency, })), (((_w = growthbookOptions === null || growthbookOptions === void 0 ? void 0 : growthbookOptions.attributes) === null || _w === void 0 ? void 0 : _w.account_mode) && { account_mode: growthbookOptions === null || growthbookOptions === void 0 ? void 0 : growthbookOptions.attributes.account_mode, })); growthbookOptions !== null && growthbookOptions !== void 0 ? growthbookOptions : (growthbookOptions = {}); (_x = growthbookOptions.attributes) !== null && _x !== void 0 ? _x : (growthbookOptions.attributes = {}); (_y = (_0 = growthbookOptions.attributes).id) !== null && _y !== void 0 ? _y : (_0.id = _rudderstack.getAnonymousId()); (_z = (_1 = growthbookOptions.attributes).country) !== null && _z !== void 0 ? _z : (_1.country = country); if (growthbookKey) { _growthbook = growthbook_1.Growthbook.getGrowthBookInstance(growthbookKey, growthbookDecryptionKey, growthbookOptions); interval_1 = setInterval(function () { if (Object.keys(tracking_config).length > 0) clearInterval(interval_1); else tracking_config = getFeatureValue('tracking-buttons-config', {}); }, 1000); } return [3 /*break*/, 4]; case 3: error_1 = _2.sent(); console.log('Error in initializing analytics', error_1); return [3 /*break*/, 4]; case 4: return [2 /*return*/]; } }); }); }; var setAttributes = function (_a) { var country = _a.country, user_language = _a.user_language, device_language = _a.device_language, device_type = _a.device_type, account_type = _a.account_type, user_id = _a.user_id, anonymous_id = _a.anonymous_id, app_id = _a.app_id, utm_source = _a.utm_source, utm_medium = _a.utm_medium, utm_campaign = _a.utm_campaign, is_authorised = _a.is_authorised, residence_country = _a.residence_country, url = _a.url, domain = _a.domain, geo_location = _a.geo_location, loggedIn = _a.loggedIn, network_downlink = _a.network_downlink, network_rtt = _a.network_rtt, network_type = _a.network_type, account_currency = _a.account_currency, account_mode = _a.account_mode; if (!_growthbook && !_rudderstack) return; var user_identity = user_id !== null && user_id !== void 0 ? user_id : getId(); // Check if we have Growthbook instance if (_growthbook) { var config = __assign(__assign({ country: country, residence_country: residence_country, user_language: user_language, device_language: device_language, device_type: device_type, utm_source: utm_source, utm_medium: utm_medium, utm_campaign: utm_campaign, is_authorised: is_authorised, url: url, domain: domain, loggedIn: loggedIn }, (user_id && !isUUID(user_id) && { user_id: user_id })), { anonymous_id: anonymous_id }); if (user_identity) { config.id = user_identity; config.user_id = user_identity; } _growthbook.setAttributes(config); } core_data = __assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign({}, core_data), (country !== undefined && { country: country })), (geo_location !== undefined && { geo_location: geo_location })), (user_language !== undefined && { user_language: user_language })), (account_type !== undefined && { account_type: account_type })), (app_id !== undefined && { app_id: app_id })), (residence_country !== undefined && { residence_country: residence_country })), (device_type !== undefined && { device_type: device_type })), (url !== undefined && { url: url })), (loggedIn !== undefined && { loggedIn: loggedIn })), (network_downlink !== undefined && { network_downlink: network_downlink })), (network_rtt !== undefined && { network_rtt: network_rtt })), (network_type !== undefined && { network_type: network_type })), (user_id !== undefined && !isUUID(user_id) && { user_id: user_id })), (anonymous_id !== undefined && { anonymous_id: anonymous_id })), (account_currency !== undefined && { account_currency: account_currency })), (account_mode !== undefined && { account_mode: account_mode })); }; var getFeatureState = function (id) { var _a, _b; return (_b = (_a = _growthbook === null || _growthbook === void 0 ? void 0 : _growthbook.getFeatureState(id)) === null || _a === void 0 ? void 0 : _a.experimentResult) === null || _b === void 0 ? void 0 : _b.name; }; var getFeatureValue = function (id, defaultValue) { return _growthbook === null || _growthbook === void 0 ? void 0 : _growthbook.getFeatureValue(id, defaultValue); }; var getGrowthbookStatus = function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, (_growthbook === null || _growthbook === void 0 ? void 0 : _growthbook.getStatus())]; case 1: return [2 /*return*/, _a.sent()]; } }); }); }; var isFeatureOn = function (key) { return _growthbook === null || _growthbook === void 0 ? void 0 : _growthbook.isOn(key); }; var setUrl = function (href) { return _growthbook === null || _growthbook === void 0 ? void 0 : _growthbook.setUrl(href); }; var getId = function () { var userId = (_rudderstack === null || _rudderstack === void 0 ? void 0 : _rudderstack.getUserId()) || ''; return userId && !isUUID(userId) ? userId : ''; }; /** * Pushes page view event to Rudderstack * * @param curret_page The name or URL of the current page to track the page view event */ var pageView = function (current_page, platform, properties) { if (platform === void 0) { platform = 'Deriv App'; } if (!_rudderstack) return; var userId = getId(); _rudderstack === null || _rudderstack === void 0 ? void 0 : _rudderstack.pageView(current_page, platform, userId, properties); }; var identifyEvent = function (user_id) { return __awaiter(_this, void 0, void 0, function () { var stored_user_id, waitForRudderStack, error_2; return __generator(this, function (_a) { switch (_a.label) { case 0: stored_user_id = user_id || getId(); waitForRudderStack = function (maxAttempts, interval) { if (maxAttempts === void 0) { maxAttempts = 10; } if (interval === void 0) { interval = 50; } return new Promise(function (resolve, reject) { var attempts = 0; var check = function () { if (_rudderstack) { resolve(true); } else if (attempts >= maxAttempts) { reject(new Error('_rudderstack not defined within max attempts')); } else { attempts++; setTimeout(check, interval); } }; check(); }); }; _a.label = 1; case 1: _a.trys.push([1, 3, , 4]); return [4 /*yield*/, waitForRudderStack()]; case 2: _a.sent(); if (_rudderstack && stored_user_id && !isUUID(stored_user_id)) { _rudderstack === null || _rudderstack === void 0 ? void 0 : _rudderstack.identifyEvent(stored_user_id, { language: (core_data === null || core_data === void 0 ? void 0 : core_data.user_language) || 'en' }); } return [3 /*break*/, 4]; case 3: error_2 = _a.sent(); if (error_2 instanceof Error) { console.warn(error_2.message); } else { console.warn('Unknown error in identifyEvent wait:', error_2); } return [3 /*break*/, 4]; case 4: return [2 /*return*/]; } }); }); }; var reset = function () { if (!_rudderstack) return; _rudderstack === null || _rudderstack === void 0 ? void 0 : _rudderstack.reset(); }; var trackEvent = function (event, analytics_data) { if (navigator.onLine && _rudderstack) { if (event_cache.length > 0) { event_cache.forEach(function (cache, index) { _rudderstack.track(cache.event, cache.payload); delete event_cache[index]; }); } var userId = getId(); var payload = __assign(__assign(__assign({}, core_data), analytics_data), (userId && { user_id: userId })); if (event in tracking_config) { tracking_config[event] && (_rudderstack === null || _rudderstack === void 0 ? void 0 : _rudderstack.track(event, payload)); } else { _rudderstack === null || _rudderstack === void 0 ? void 0 : _rudderstack.track(event, payload); } } else { var userId = getId(); var payload = __assign(__assign(__assign({}, core_data), analytics_data), (userId && { user_id: userId })); event_cache.push({ event: event, payload: payload }); } }; var getInstances = function () { return ({ ab: _growthbook, tracking: _rudderstack }); }; var AnalyticsInstance = { initialise: initialise, setAttributes: setAttributes, identifyEvent: identifyEvent, getFeatureState: getFeatureState, getFeatureValue: getFeatureValue, getGrowthbookStatus: getGrowthbookStatus, isFeatureOn: isFeatureOn, setUrl: setUrl, getId: getId, trackEvent: trackEvent, getInstances: getInstances, pageView: pageView, reset: reset, }; if (typeof window !== 'undefined') { window.AnalyticsInstance = AnalyticsInstance; } return AnalyticsInstance; } exports.createAnalyticsInstance = createAnalyticsInstance; exports.Analytics = createAnalyticsInstance(); var isUUID = function (str) { var uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i; return uuidRegex.test(str); };