UNPKG

react-native-kochava-measurement

Version:

A lightweight and easy to integrate SDK, providing first-class integration with Kochava’s installation attribution and analytics platform.

473 lines (472 loc) 21.5 kB
/* Authored by Brett Barinaga on 11/17/21. Copyright (c) Kochava, Inc. All rights reserved. */ 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 }; } }; import * as utils from "../utils/utils"; import { getUrlParameter } from "./browser"; import { setCookie, getCookie, deleteCookie } from "./cookies"; import { Log } from "../utils/log"; export var MAX_STORED_IDLINKS = 10; export var PersistKey; (function (PersistKey) { PersistKey["LastKvinit"] = "com.kochava.tracker.LastKvinit"; PersistKey["EventQueue"] = "com.kochava.tracker.EventQueue"; PersistKey["IdLinkQueue"] = "com.kochava.tracker.IdLinkQueue"; PersistKey["DeviceId"] = "com.kochava.tracker.DeviceId"; PersistKey["InstallId"] = "com.kochava.tracker.InstallId"; PersistKey["FirstStartDate"] = "com.kochava.tracker.FirstStartDate"; PersistKey["InstallSentDate"] = "com.kochava.tracker.InstallSentDate"; PersistKey["KvinitSentDate"] = "com.kochava.tracker.KvinitSentDate"; PersistKey["SessionCount"] = "com.kochava.tracker.SessionCount"; PersistKey["IdentityLinks"] = "com.kochava.tracker.IdentityLinks"; PersistKey["OverrideAppId"] = "com.kochava.tracker.OverrideAppId"; PersistKey["OverrideDeviceId"] = "com.kochava.tracker.OverrideDeviceId"; PersistKey["LastInstall"] = "com.kochava.tracker.LastInstall"; PersistKey["InstallCount"] = "com.kochava.tracker.InstallCount"; PersistKey["OldKvid"] = "kv_id"; })(PersistKey || (PersistKey = {})); var storedKeys = [ PersistKey.LastKvinit, PersistKey.EventQueue, PersistKey.IdLinkQueue, PersistKey.DeviceId, PersistKey.InstallId, PersistKey.FirstStartDate, PersistKey.InstallSentDate, PersistKey.KvinitSentDate, PersistKey.SessionCount, PersistKey.IdentityLinks, PersistKey.OverrideAppId, PersistKey.OverrideDeviceId, PersistKey.LastInstall, PersistKey.InstallCount, ]; var storage; export var configureStorage = function (adapter) { storage = adapter; }; export var checkInstallIdChange = function (inputId, useCookies) { return __awaiter(void 0, void 0, void 0, function () { var persistedInstallId; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, readAndUpdatePersistedValue(PersistKey.InstallId, useCookies)]; case 1: persistedInstallId = _a.sent(); // if the input is empty, we don't need to change if (!inputId) return [2 /*return*/, false]; // if the persistedId is empty, we will need to change if (!persistedInstallId) { updatePersistedValue(PersistKey.InstallId, inputId, useCookies); return [2 /*return*/, true]; } // if the inputId and persistedId are the same, we dont need to change if (inputId === persistedInstallId) return [2 /*return*/, false]; // at this point both inputId and persistedInstallId exist and are not equal, // so we must need to change updatePersistedValue(PersistKey.InstallId, inputId, useCookies); return [2 /*return*/, true]; } }); }); }; export var addToPersistedEventQueue = function (job) { return __awaiter(void 0, void 0, void 0, function () { var persistedQueueStr, persistedQueue; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, storage.getItem(PersistKey.EventQueue)]; case 1: persistedQueueStr = _a.sent(); if (persistedQueueStr == null || persistedQueueStr == undefined || persistedQueueStr == '{}') persistedQueueStr = '[]'; persistedQueue = JSON.parse(persistedQueueStr) || []; persistedQueue.push(job); return [4 /*yield*/, storage.setItem(PersistKey.EventQueue, JSON.stringify(persistedQueue))]; case 2: _a.sent(); return [2 /*return*/]; } }); }); }; export var removeFromEventPersistedQueue = function (job) { return __awaiter(void 0, void 0, void 0, function () { var persistedQueueStr, persistedQueue, queueWithJobRemoved; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, storage.getItem(PersistKey.EventQueue)]; case 1: persistedQueueStr = _a.sent(); persistedQueue = JSON.parse(persistedQueueStr) || []; queueWithJobRemoved = persistedQueue.filter(function (persistedJob) { return persistedJob.id !== job.id; }); return [4 /*yield*/, storage.setItem(PersistKey.EventQueue, JSON.stringify(queueWithJobRemoved))]; case 2: _a.sent(); return [2 /*return*/]; } }); }); }; export var updateOrAddPersistedIdLinkQueue = function (job) { return __awaiter(void 0, void 0, void 0, function () { var idLinkKey, persistedQueueStr, persistedQueue, updated, _i, persistedQueue_1, persistedJob, persistedKey; return __generator(this, function (_a) { switch (_a.label) { case 0: idLinkKey = Object.keys(job.idLink)[0]; return [4 /*yield*/, storage.getItem(PersistKey.IdLinkQueue)]; case 1: persistedQueueStr = _a.sent(); persistedQueue = JSON.parse(persistedQueueStr) || []; updated = false; for (_i = 0, persistedQueue_1 = persistedQueue; _i < persistedQueue_1.length; _i++) { persistedJob = persistedQueue_1[_i]; persistedKey = Object.keys(persistedJob.idLink)[0]; // if the key is already there, update it if (idLinkKey === persistedKey) { persistedJob.idLink[idLinkKey] = job.idLink[idLinkKey]; updated = true; } } // if the key is new, add it if (!updated) { persistedQueue.push(job); } return [4 /*yield*/, storage.setItem(PersistKey.IdLinkQueue, JSON.stringify(persistedQueue))]; case 2: _a.sent(); return [2 /*return*/]; } }); }); }; export var removeFromIdLinkPersistedQueue = function (job) { return __awaiter(void 0, void 0, void 0, function () { var persistedQueueStr, persistedQueue, queueWithJobRemoved; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, storage.getItem(PersistKey.IdLinkQueue)]; case 1: persistedQueueStr = _a.sent(); persistedQueue = JSON.parse(persistedQueueStr) || []; queueWithJobRemoved = persistedQueue.filter(function (persistedJob) { return persistedJob.id !== job.id; }); return [4 /*yield*/, storage.setItem(PersistKey.IdLinkQueue, JSON.stringify(queueWithJobRemoved))]; case 2: _a.sent(); return [2 /*return*/]; } }); }); }; export var addPersistedIdLinks = function (key, value, useCookies) { return __awaiter(void 0, void 0, void 0, function () { var persistedIdLinksStr, persistedIdLinks, storedSoFar; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, storage.getItem(PersistKey.IdentityLinks)]; case 1: persistedIdLinksStr = _a.sent(); persistedIdLinks = JSON.parse(persistedIdLinksStr) || {}; storedSoFar = Object.keys(persistedIdLinks); if (storedSoFar.length > MAX_STORED_IDLINKS) { Log.debug("Maximum stored idLinks reached, most recent idLink will not be stored."); return [2 /*return*/]; } persistedIdLinks[key] = value; updatePersistedValue(PersistKey.IdentityLinks, JSON.stringify(persistedIdLinks), useCookies); return [2 /*return*/]; } }); }); }; export var checkDuplicateIdLink = function (key, value) { return __awaiter(void 0, void 0, void 0, function () { var persistedIdLinksStr, persistedIdLinks, persistedKey; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, storage.getItem(PersistKey.IdentityLinks)]; case 1: persistedIdLinksStr = _a.sent(); if (persistedIdLinksStr) { persistedIdLinks = JSON.parse(persistedIdLinksStr) || {}; for (persistedKey in persistedIdLinks) { if (key === persistedKey && persistedIdLinks[persistedKey] === value) { return [2 /*return*/, true]; } } } return [2 /*return*/, false]; } }); }); }; export var getPersistedIdentityLinks = function () { return __awaiter(void 0, void 0, void 0, function () { var persistedIdLinksStr; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, storage.getItem(PersistKey.IdentityLinks)]; case 1: persistedIdLinksStr = _a.sent(); if (persistedIdLinksStr) { return [2 /*return*/, JSON.parse(persistedIdLinksStr)]; } return [2 /*return*/, undefined]; } }); }); }; export var readAndUpdateUTM = function (appGuid, useCookies) { return __awaiter(void 0, void 0, void 0, function () { var storageName, urlValue, storageValue, cookieValue; return __generator(this, function (_a) { switch (_a.label) { case 0: storageName = appGuid + "_click"; urlValue = getUrlParameter("ko_click_id"); return [4 /*yield*/, storage.getItem(storageName)]; case 1: storageValue = _a.sent(); cookieValue = ""; if (useCookies) cookieValue = getCookie(storageName); if (!urlValue) return [3 /*break*/, 3]; return [4 /*yield*/, storage.setItem(storageName, urlValue)]; case 2: _a.sent(); if (useCookies) setCookie(storageName, urlValue); return [3 /*break*/, 4]; case 3: if (storageValue) { if (useCookies) setCookie(storageName, urlValue); } _a.label = 4; case 4: return [2 /*return*/, (urlValue) ? urlValue : (storageValue) ? storageValue : (cookieValue) ? cookieValue : ""]; } }); }); }; export var readAndUpdatePersistedValue = function (key, useCookie) { return __awaiter(void 0, void 0, void 0, function () { var urlValue, storageValue, cookieValue; return __generator(this, function (_a) { switch (_a.label) { case 0: urlValue = getUrlParameter(key); return [4 /*yield*/, storage.getItem(key)]; case 1: storageValue = _a.sent(); cookieValue = ""; if (useCookie) cookieValue = getCookie(key); if (!urlValue) return [3 /*break*/, 3]; return [4 /*yield*/, updatePersistedValue(key, urlValue, useCookie)]; case 2: _a.sent(); return [3 /*break*/, 7]; case 3: if (!storageValue) return [3 /*break*/, 5]; return [4 /*yield*/, updatePersistedValue(key, storageValue, useCookie)]; case 4: _a.sent(); return [3 /*break*/, 7]; case 5: if (!cookieValue) return [3 /*break*/, 7]; return [4 /*yield*/, updatePersistedValue(key, storageValue, useCookie)]; case 6: _a.sent(); _a.label = 7; case 7: return [2 /*return*/, (urlValue) ? urlValue : (storageValue) ? storageValue : (cookieValue) ? cookieValue : ""]; } }); }); }; export var updatePersistedValue = function (key, value, useCookie) { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, storage.setItem(key, value)]; case 1: _a.sent(); if (useCookie) setCookie(key, value); return [2 /*return*/]; } }); }); }; export var deletePersistedValue = function (item) { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, storage.removeItem(item)]; case 1: _a.sent(); deleteCookie(item); return [2 /*return*/]; } }); }); }; export var deleteAllPersisted = function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, Promise.all(storedKeys.map(function (item) { return deletePersistedValue(item); }))]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }; export var readAndUpdateDeviceId = function (useCookie) { return __awaiter(void 0, void 0, void 0, function () { var storedDeviceId, kvId; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, readAndUpdatePersistedValue(PersistKey.DeviceId, useCookie)]; case 1: storedDeviceId = _a.sent(); if (!storedDeviceId) { kvId = "KB".concat(utils.getCurrTimeSec(), "T").concat(utils.uuidv4()); storedDeviceId = kvId.replace(/-/g, ""); } return [4 /*yield*/, updatePersistedValue(PersistKey.DeviceId, storedDeviceId, useCookie)]; case 2: _a.sent(); return [2 /*return*/, storedDeviceId]; } }); }); }; export var readAndUpdateSessionCount = function (useCookie) { return __awaiter(void 0, void 0, void 0, function () { var storedSessionCount, sessionCount; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, readAndUpdatePersistedValue(PersistKey.SessionCount, useCookie)]; case 1: storedSessionCount = _a.sent(); sessionCount = 1; if (storedSessionCount) { sessionCount = parseInt(storedSessionCount); sessionCount++; } return [4 /*yield*/, updatePersistedValue(PersistKey.SessionCount, sessionCount.toString(), useCookie)]; case 2: _a.sent(); return [2 /*return*/, sessionCount]; } }); }); }; export var updateLastInstall = function (lastInstallObject, useCookie) { return __awaiter(void 0, void 0, void 0, function () { var lastInstallStr; return __generator(this, function (_a) { switch (_a.label) { case 0: lastInstallStr = JSON.stringify(lastInstallObject); return [4 /*yield*/, storage.setItem(PersistKey.LastInstall, lastInstallStr)]; case 1: _a.sent(); if (useCookie) setCookie(PersistKey.LastInstall, lastInstallStr); return [2 /*return*/]; } }); }); }; export var getLastInstall = function (useCookie) { return __awaiter(void 0, void 0, void 0, function () { var lastInstallStr, cookieValue; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, storage.getItem(PersistKey.LastInstall)]; case 1: lastInstallStr = _a.sent(); if (lastInstallStr) { return [2 /*return*/, JSON.parse(lastInstallStr)]; } else if (useCookie) { cookieValue = getCookie(PersistKey.LastInstall); if (cookieValue) { return [2 /*return*/, JSON.parse(cookieValue)]; } } return [2 /*return*/, undefined]; } }); }); }; export var updateInstallCount = function (installCount, useCookie) { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, storage.setItem(PersistKey.InstallCount, installCount.toString())]; case 1: _a.sent(); if (useCookie) { setCookie(PersistKey.InstallCount, installCount.toString()); } return [2 /*return*/]; } }); }); }; export var getItem = function (key) { return __awaiter(void 0, void 0, void 0, function () { var value, error_1; return __generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); return [4 /*yield*/, storage.getItem(key)]; case 1: value = _a.sent(); if (value) { return [2 /*return*/, value]; } else { return [2 /*return*/, null]; } return [3 /*break*/, 3]; case 2: error_1 = _a.sent(); Log.error("Error getting item ".concat(key, " from localStorage:"), error_1); return [2 /*return*/, null]; case 3: return [2 /*return*/]; } }); }); }; export var setItem = function (key, value) { return __awaiter(void 0, void 0, void 0, function () { var error_2; return __generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); return [4 /*yield*/, storage.setItem(key, value)]; case 1: _a.sent(); return [3 /*break*/, 3]; case 2: error_2 = _a.sent(); Log.error("Error setting item ".concat(key, " in localStorage:"), error_2); return [3 /*break*/, 3]; case 3: return [2 /*return*/]; } }); }); };