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
JavaScript
/*
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*/];
}
});
}); };